diff --git a/reactos/Makefile b/reactos/Makefile index 17f8a54e79a..afe3fd49962 100644 --- a/reactos/Makefile +++ b/reactos/Makefile @@ -169,11 +169,7 @@ else endif ifeq ($(ROS_AUTOMAKE),) - ifeq ($(ARCH),i386) - ROS_AUTOMAKE=makefile.auto - else - ROS_AUTOMAKE=makefile-$(ARCH).auto - endif + ROS_AUTOMAKE=makefile-$(ARCH).auto endif all: $(ROS_AUTOMAKE) diff --git a/reactos/ReactOS-generic.rbuild b/reactos/ReactOS-generic.rbuild index c26a318771c..9258f28d842 100644 --- a/reactos/ReactOS-generic.rbuild +++ b/reactos/ReactOS-generic.rbuild @@ -88,6 +88,7 @@ -Wall + -Wno-char-subscripts -Wno-non-virtual-dtor @@ -117,10 +118,9 @@ -fno-strict-aliasing - -Wno-strict-aliasing -Wpointer-arith -Wno-multichar - + -Wno-error=uninitialized diff --git a/reactos/ReactOS-i386.rbuild b/reactos/ReactOS-i386.rbuild index 59f428471f4..c2a720a640e 100644 --- a/reactos/ReactOS-i386.rbuild +++ b/reactos/ReactOS-i386.rbuild @@ -1,6 +1,6 @@ - + @@ -24,6 +24,7 @@ -ftracer -momit-leaf-frame-pointer + -fms-extensions -mpreferred-stack-boundary=2 -m32 --win32 -gstabs+ diff --git a/reactos/base/applications/applications.rbuild b/reactos/base/applications/applications.rbuild index f4adbe4bd5a..d3c202051fb 100644 --- a/reactos/base/applications/applications.rbuild +++ b/reactos/base/applications/applications.rbuild @@ -22,6 +22,9 @@ + + + diff --git a/reactos/base/applications/cacls/resource.h b/reactos/base/applications/cacls/resource.h index 71778353f10..1f195b9de2c 100644 --- a/reactos/base/applications/cacls/resource.h +++ b/reactos/base/applications/cacls/resource.h @@ -1,5 +1,4 @@ -#ifndef _CACLS_RESOURCE_H -#define _CACLS_RESOURCE_H +#pragma once #define IDS_HELP 101 #define IDS_ABBR_CI 102 @@ -40,5 +39,3 @@ #define IDS_READ_CONTROL 137 #define IDS_DELETE 138 #define IDS_STANDARD_RIGHTS_ALL 139 - -#endif /* _CACLS_RESOURCE_H */ diff --git a/reactos/base/applications/calc/calc.h b/reactos/base/applications/calc/calc.h index 72c8edf796a..1e645e75e84 100644 --- a/reactos/base/applications/calc/calc.h +++ b/reactos/base/applications/calc/calc.h @@ -1,5 +1,4 @@ -#ifndef __CALC_H__ -#define __CALC_H__ +#pragma once #include #include @@ -236,5 +235,3 @@ INT_PTR CALLBACK AboutDlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); void ConvExecute(HWND hWnd); void ConvAdjust(HWND hWnd, int n_cat); void ConvInit(HWND hWnd); - -#endif diff --git a/reactos/base/applications/calc/lang/de-DE.rc b/reactos/base/applications/calc/lang/de-DE.rc index ba28b004ccb..f6513aa6dfe 100644 --- a/reactos/base/applications/calc/lang/de-DE.rc +++ b/reactos/base/applications/calc/lang/de-DE.rc @@ -324,7 +324,7 @@ END IDD_DIALOG_STAT DIALOGEX DISCARDABLE 0, 0, 163, 85 STYLE DS_SHELLFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Statistik Box" +CAPTION "Statistikbox" FONT 8, "MS Shell Dlg" BEGIN LISTBOX IDC_LIST_STAT,4,4,156,40,LBS_NOINTEGRALHEIGHT | @@ -465,11 +465,11 @@ END // FLCHENTYPEN STRINGTABLE DISCARDABLE BEGIN - IDS_AREA_ACRES "Acres" - IDS_AREA_ACRES_BRAZIL "Acres (Brasilien)" - IDS_AREA_ACRES_FRANCE "Acres (Frankreich)" - IDS_AREA_ACRES_SCOTS "Acres (Schottland)" - IDS_AREA_ACRES_US "Acres (USA)" + IDS_AREA_ACRES "Acre" + IDS_AREA_ACRES_BRAZIL "Acre (Brasilien)" + IDS_AREA_ACRES_FRANCE "Acre (Frankreich)" + IDS_AREA_ACRES_SCOTS "Acre (Schottland)" + IDS_AREA_ACRES_US "Acre (USA)" IDS_AREA_ARES "Ar" IDS_AREA_CHOU "Chou" IDS_AREA_DANBO "Danbo" @@ -482,21 +482,21 @@ BEGIN IDS_AREA_PYEONGBANGJA "Pyeongbangja" IDS_AREA_RAI "Rai" IDS_AREA_SE "Se" - IDS_AREA_SQUARE_CHR "Qaudratchr" - IDS_AREA_SQUARE_FATHOMS "Qaudratfathom" - IDS_AREA_SQUARE_FATHOMS_HUNGARY "Qaudratfathom (Ungarn)" - IDS_AREA_SQUARE_FEET "Qaudratfu" - IDS_AREA_SQUARE_KILOMETERS "Qaudratkilometer" - IDS_AREA_SQUARE_LAR "Qaudratlar" - IDS_AREA_SQUARE_METER "Qaudratmeter" - IDS_AREA_SQUARE_MILES "Qaudratmeilen" - IDS_AREA_SQUARE_MILLIMETERS "Qaudratmillimeter" - IDS_AREA_SQUARE_SHAKU "Qaudratshaku" - IDS_AREA_SQUARE_TSUEN "Qaudrattsuen" - IDS_AREA_SQUARE_VA "Qaudratva" - IDS_AREA_SQUARE_YARD "Qaudratyard" + IDS_AREA_SQUARE_CHR "Quadratchr" + IDS_AREA_SQUARE_FATHOMS "Quadratfathom" + IDS_AREA_SQUARE_FATHOMS_HUNGARY "Quadratfathom (Ungarn)" + IDS_AREA_SQUARE_FEET "Quadratfu" + IDS_AREA_SQUARE_KILOMETERS "Quadratkilometer" + IDS_AREA_SQUARE_LAR "Quadratlar" + IDS_AREA_SQUARE_METER "Quadratmeter" + IDS_AREA_SQUARE_MILES "Quadratmeilen" + IDS_AREA_SQUARE_MILLIMETERS "Quadratmillimeter" + IDS_AREA_SQUARE_SHAKU "Quadratshaku" + IDS_AREA_SQUARE_TSUEN "Quadrattsuen" + IDS_AREA_SQUARE_VA "Quadratva" + IDS_AREA_SQUARE_YARD "Quadratyard" IDS_AREA_SQUARE_CENTIMETERS "Quadratzentimeter" - IDS_AREA_SQUARE_INCHES "Qaudratzoll" + IDS_AREA_SQUARE_INCHES "Quadratzoll" IDS_AREA_TAN "Tan" IDS_AREA_TSUBO "Tsubo" END @@ -517,7 +517,7 @@ BEGIN IDS_CURRENCY_DEUTSCHE_MARK "Deutsche Mark" IDS_CURRENCY_EURO "Euro" IDS_CURRENCY_FINNISH_MARKKA "Finnische Mark" - IDS_CURRENCY_FRENCH_FRANC "Franzschishe Franc" + IDS_CURRENCY_FRENCH_FRANC "Franzschische Franc" IDS_CURRENCY_GREEK_DRACHMA "Griechische Drachme" IDS_CURRENCY_IRISH_POUND "Irische Pfund" IDS_CURRENCY_ITALIAN_LIRA "Italienische Lire" diff --git a/reactos/base/applications/cmdutils/doskey/doskey.rc b/reactos/base/applications/cmdutils/doskey/doskey.rc index 780ea6ebee2..53772107152 100644 --- a/reactos/base/applications/cmdutils/doskey/doskey.rc +++ b/reactos/base/applications/cmdutils/doskey/doskey.rc @@ -7,5 +7,6 @@ #include "doskey.h" #include "lang/bg-BG.rc" +#include "lang/de-DE.rc" #include "lang/en-US.rc" #include "lang/uk-UA.rc" diff --git a/reactos/base/applications/cmdutils/doskey/lang/de-DE.rc b/reactos/base/applications/cmdutils/doskey/lang/de-DE.rc new file mode 100644 index 00000000000..fc73d5dc365 --- /dev/null +++ b/reactos/base/applications/cmdutils/doskey/lang/de-DE.rc @@ -0,0 +1,28 @@ +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + +IDS_HELP, "Verwaltet Einstellungen, Verlauf und Makros der Kommandozeile.\n\ +\n\ +DOSKEY [/INSERT | /OVERSTRIKE] [/EXENAME=exe] [/HISTORY] [/LISTSIZE=size]\n\ + [/REINSTALL] [/MACROS[:exe | :ALL]] [/MACROFILE=file] [macroname=[text]]\n\ +\n\ + /INSERT Aktiviert den Einfügemodus.\n\ + /OVERSTRIKE Deaktiviert den Einfügemodus.\n\ + /EXENAME=exename Legt den Namen der Anwendung, auf die die Einstel-\n\ + lungen angewendet werden sollen, fest. Der Standard-\n\ + wert ist cmd.exe.\n\ + /HISTORY Zeigt den Befehlsverlauf an.\n\ + /LISTSIZE=size Legt die Anzahl der Befehle per Verlaufspuffer fest.\n\ + /REINSTALL Leert den Befehlsverlauf.\n\ + /MACROS Zeigt Makrodefinitionen an.\n\ + /MACROS:exename Zeigt Makrodefinitionen für eine Anwendung an.\n\ + /MACROS:ALL Zeigt Makrodefinitionen für alle Anwendungen an.\n\ + /MACROFILE=file Lädt Makrodefinitionen aus einer Datei.\n\ + macroname Legt den Namen eines zu erstellenden Makros fest.\n\ + text Legt den ersetzenden Text des Makros fest.\n" + +IDS_INVALID_MACRO_DEF, "Ungültige Makrodefinition: %s\n" + +END diff --git a/reactos/base/applications/cmdutils/doskey/lang/en-US.rc b/reactos/base/applications/cmdutils/doskey/lang/en-US.rc index 1b7028681c6..7adc23750d0 100644 --- a/reactos/base/applications/cmdutils/doskey/lang/en-US.rc +++ b/reactos/base/applications/cmdutils/doskey/lang/en-US.rc @@ -18,7 +18,7 @@ DOSKEY [/INSERT | /OVERSTRIKE] [/EXENAME=exe] [/HISTORY] [/LISTSIZE=size]\n\ /MACROS Displays macro definitions.\n\ /MACROS:exename Displays macro definitions for a specific program.\n\ /MACROS:ALL Displays macro definitions for all programs.\n\ - /MACROFILE=filename Loads macro definitions from a file.\n\ + /MACROFILE=file Loads macro definitions from a file.\n\ macroname Specifies the name of a macro to create.\n\ text Specifies the replacement text for the macro.\n" diff --git a/reactos/base/applications/cmdutils/hostname/hostname.rbuild b/reactos/base/applications/cmdutils/hostname/hostname.rbuild index ed747aac6f7..76a3f4084d7 100644 --- a/reactos/base/applications/cmdutils/hostname/hostname.rbuild +++ b/reactos/base/applications/cmdutils/hostname/hostname.rbuild @@ -1,5 +1,5 @@ - + hostname.c hostname.rc diff --git a/reactos/base/applications/cmdutils/more/resource.h b/reactos/base/applications/cmdutils/more/resource.h index eb430d80b81..08fc79b333b 100644 --- a/reactos/base/applications/cmdutils/more/resource.h +++ b/reactos/base/applications/cmdutils/more/resource.h @@ -1,20 +1,5 @@ -#ifndef RESOURCE_H__ /* resource.h */ -#define RESOURCE_H__ +#pragma once #define IDS_USAGE 100 #define IDS_CONTINUE 101 #define IDS_FILE_ACCESS 102 - - - - - - - - - - - - - -#endif /* EOF of resource.h */ diff --git a/reactos/base/applications/cmdutils/reg/It.rc b/reactos/base/applications/cmdutils/reg/It.rc new file mode 100644 index 00000000000..09d38fd4025 --- /dev/null +++ b/reactos/base/applications/cmdutils/reg/It.rc @@ -0,0 +1,40 @@ +/* + * REG.EXE - Wine-compatible reg program. + * Italian language support + * + * Copyright 2010 Luca Bennati + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "reg.h" + +/*UTF-8*/ +#pragma code_page(65001) + +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +STRINGTABLE +{ + STRING_USAGE, "La sintassi di questo comando è:\n\nREG [ ADD | DELETE | QUERY ]\nREG comando /?\n" + STRING_ADD_USAGE, "REG ADD nome_della_chiave [/v nome_del_valore | /ve] [/t tipo] [/s separatore] [/d dati] [/f]\n" + STRING_DELETE_USAGE, "REG DELETE nome_della_chiave [/v nome_del_valore | /ve | /va] [/f]\n" + STRING_QUERY_USAGE, "REG QUERY nome_della_chiave [/v nome_del_valore | /ve] [/s]\n" + STRING_SUCCESS, "Operazione completata con successo\n" + STRING_INVALID_KEY, "Errore: nome della chiave non valido\n" + STRING_INVALID_CMDLINE, "Errore: parametri della linea di comando non validi\n" + STRING_NO_REMOTE, "Errore: Impossibile aggiungere chiavi alla macchina remota\n" + STRING_CANNOT_FIND, "Errore: Il sistema non è riuscito a trovare la chiave di registro o il valore specificati\n" +} diff --git a/reactos/base/applications/cmdutils/reg/Uk.rc b/reactos/base/applications/cmdutils/reg/Uk.rc new file mode 100644 index 00000000000..70c86f70cb9 --- /dev/null +++ b/reactos/base/applications/cmdutils/reg/Uk.rc @@ -0,0 +1,43 @@ +/* + * REG.EXE - Wine-compatible reg program. + * + * Copyright 2008 Andrew Riedi + * + * Ukrainian language support + * + * Copyright 2010 Igor Paliychuk + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "reg.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +STRINGTABLE +{ + STRING_USAGE, "Синтаксис цієї команди наступний:\n\nREG [ ADD | DELETE | QUERY ]\nREG command /?\n" + STRING_ADD_USAGE, "REG ADD key_name [/v value_name | /ve] [/t type] [/s separator] [/d data] [/f]\n" + STRING_DELETE_USAGE, "REG DELETE key_name [/v value_name | /ve | /va] [/f]\n" + STRING_QUERY_USAGE, "REG QUERY key_name [/v value_name | /ve] [/s]\n" + STRING_SUCCESS, "Операція успішно завершена\n" + STRING_INVALID_KEY, "Помилка: неправильне ім'я ключа\n" + STRING_INVALID_CMDLINE, "Помилка: неправильні параметри командного рядка\n" + STRING_NO_REMOTE, "Помилка: неможливо додати ключі на віддаленій машині\n" + STRING_CANNOT_FIND, "Помилка: не вдалось знайти вказаний ключ реєстру чи значення\n" +} diff --git a/reactos/base/applications/cmdutils/reg/reg.c b/reactos/base/applications/cmdutils/reg/reg.c index 07dbdbff367..f65a3c8bc93 100644 --- a/reactos/base/applications/cmdutils/reg/reg.c +++ b/reactos/base/applications/cmdutils/reg/reg.c @@ -124,6 +124,21 @@ static LPBYTE get_regdata(LPWSTR data, DWORD reg_type, WCHAR separator, DWORD *r lstrcpyW((LPWSTR)out_data,data); break; } + case REG_DWORD: + { + LPWSTR rest; + DWORD val; + val = strtolW(data, &rest, 0); + if (rest == data) { + static const WCHAR nonnumber[] = {'E','r','r','o','r',':',' ','/','d',' ','r','e','q','u','i','r','e','s',' ','n','u','m','b','e','r','.','\n',0}; + reg_printfW(nonnumber); + break; + } + *reg_count = sizeof(DWORD); + out_data = HeapAlloc(GetProcessHeap(),0,*reg_count); + ((LPDWORD)out_data)[0] = val; + break; + } default: { static const WCHAR unhandled[] = {'U','n','h','a','n','d','l','e','d',' ','T','y','p','e',' ','0','x','%','x',' ',' ','d','a','t','a',' ','%','s','\n',0}; diff --git a/reactos/base/applications/cmdutils/reg/rsrc.rc b/reactos/base/applications/cmdutils/reg/rsrc.rc index 1ab7f7f3b97..c145fe91a21 100644 --- a/reactos/base/applications/cmdutils/reg/rsrc.rc +++ b/reactos/base/applications/cmdutils/reg/rsrc.rc @@ -1,13 +1,17 @@ #include "Da.rc" -#include "De.rc" #include "En.rc" -#include "Fr.rc" -#include "Ja.rc" -//#include "Ko.rc" -#include "Lt.rc" +#include "Ko.rc" #include "Nl.rc" +#include "Pl.rc" + +/* UTF-8 */ +#include "De.rc" +#include "Fr.rc" +#include "It.rc" +#include "Ja.rc" +#include "Lt.rc" #include "No.rc" -//#include "Pl.rc" #include "Pt.rc" #include "Ru.rc" #include "Si.rc" +#include "Uk.rc" diff --git a/reactos/base/applications/cmdutils/xcopy/De.rc b/reactos/base/applications/cmdutils/xcopy/De.rc index 3d15e780f6e..cd6e1b91384 100644 --- a/reactos/base/applications/cmdutils/xcopy/De.rc +++ b/reactos/base/applications/cmdutils/xcopy/De.rc @@ -80,4 +80,3 @@ Mit:\n\ \t\tQuelldateien kopiert, die neuer sind als die Zieldatei\n\n" } -#pragma code_page(default) diff --git a/reactos/base/applications/cmdutils/xcopy/Fr.rc b/reactos/base/applications/cmdutils/xcopy/Fr.rc index b4e387eb17c..047b4b3f739 100644 --- a/reactos/base/applications/cmdutils/xcopy/Fr.rc +++ b/reactos/base/applications/cmdutils/xcopy/Fr.rc @@ -81,4 +81,3 @@ où :\n\ \t\tque le fichier source\n\n" } -#pragma code_page(default) diff --git a/reactos/base/applications/cmdutils/xcopy/It.rc b/reactos/base/applications/cmdutils/xcopy/It.rc new file mode 100644 index 00000000000..258cb3f4a7b --- /dev/null +++ b/reactos/base/applications/cmdutils/xcopy/It.rc @@ -0,0 +1,83 @@ +/* + * XCOPY - Wine-compatible xcopy program + * Italian language support + * + * Copyright (C) 2010 Luca Bennati + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "xcopy.h" + +/*UTF-8*/ +#pragma code_page(65001) + +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +STRINGTABLE +{ + STRING_INVPARMS, "Numero non valido di parametri - Digita xcopy /? per l'aiuto\n" + STRING_INVPARM, "Parametro '%s' non valido - Digita xcopy /? per l'aiuto\n" + STRING_PAUSE, "Premi Invio per iniziare a copiare\n" + STRING_SIMCOPY, "%d file(s) sarebbero copiati\n" + STRING_COPY, "%d file(s) copiati\n" + STRING_QISDIR, "'%s' è il nome di un file o una cartella\n" \ + "sull'obiettivo?\n" \ + "(F - File, C - Cartella)\n" + STRING_SRCPROMPT,"%s? (Sì|No)\n" + STRING_OVERWRITE,"Sovrascrivere %s? (Sì|No|Tutti)\n" + STRING_COPYFAIL, "La copia di '%s' in '%s' è fallita con r/c %d\n" + STRING_OPENFAIL, "Impossibile aprire '%s'\n" + STRING_READFAIL, "Errore durante la lettura di '%s'\n" + STRING_YES_CHAR, "S" + STRING_NO_CHAR, "N" + STRING_ALL_CHAR, "T" + STRING_FILE_CHAR,"F" + STRING_DIR_CHAR, "C" + + STRING_HELP, +"XCOPY - Copia file(s) e alberi di cartelle sorgenti in una destinazione\n\ +\n\ +Sintassi:\n\ +XCOPY sorgente [destinazione] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ +\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\ +\n\ +Dove:\n\ +\n\ +[/I] Assumi una cartella se la destinazione non esiste e sono copiati 2 o\n\ +\tpiù files\n\ +[/S] Copia le cartelle e le sottocartelle\n\ +[/E] Copia le cartelle e le sottocartelle, includendo quelle vuote\n\ +[/Q] Non mostrare i nomi durante la copia, modalità silenziosa.\n\ +[/F] Mostra i nomi completi della sorgente e della destinazione durante la copia\n\ +[/L] Simula l'operazione, mostrando i nome che sarebbero copiati\n\ +[/W] Prompts before beginning the copy operation\n\ +[/T] Crea la struttura di cartelle vuote ma non copia i files\n\ +[/Y] Disabilita le conferme quando sono sovrascritti files\n\ +[/-Y] Abilita le conferme quando sono sovrascritti files\n\ +[/P] Chiede conferma per ogni file sorgente prima di copiare\n\ +[/N] Copia usando gli short names\n\ +[/U] Copia solo files che sono già presenti nella destinazione\n\ +[/R] Sovrascrivi ogni file che abbia l'attributo Sola Lettura\n\ +[/H] Includi files nascosti e di sistema nella copia\n\ +[/C] Continua anche se accade un errore durante la copia\n\ +[/A] Copia solo files che abbiano l'attributo Archivio\n\ +[/M] Copia solo files che abbiano l'attributo Archivio, rimuovendo\n\ +\tl'attributo\n\ +[/D | /D:m-g-a] Copia i nuovi files o quelli modificati dopo la data fornita.\n\ +\t\tSe nessuna data è stata fornita, copia solo se la destinazione è più vecchia\n\ +\t\tdella sorgente\n\n" + +} diff --git a/reactos/base/applications/cmdutils/xcopy/Ja.rc b/reactos/base/applications/cmdutils/xcopy/Ja.rc index 1c4fe12b406..38487af8256 100644 --- a/reactos/base/applications/cmdutils/xcopy/Ja.rc +++ b/reactos/base/applications/cmdutils/xcopy/Ja.rc @@ -81,4 +81,3 @@ XCOPY 送り元 [送り先] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ \t\tコピー先がコピー元より古いファイルだけコピーします。\n\n" } -#pragma code_page(default) diff --git a/reactos/base/applications/cmdutils/xcopy/Lt.rc b/reactos/base/applications/cmdutils/xcopy/Lt.rc index f1254b61921..9d431de08fa 100644 --- a/reactos/base/applications/cmdutils/xcopy/Lt.rc +++ b/reactos/base/applications/cmdutils/xcopy/Lt.rc @@ -81,4 +81,3 @@ Kur:\n\ \t\tsenesnis už šaltinio failą\n\n" } -#pragma code_page(default) diff --git a/reactos/base/applications/cmdutils/xcopy/Nl.rc b/reactos/base/applications/cmdutils/xcopy/Nl.rc index 868475e958b..4f5dee58b59 100644 --- a/reactos/base/applications/cmdutils/xcopy/Nl.rc +++ b/reactos/base/applications/cmdutils/xcopy/Nl.rc @@ -79,4 +79,3 @@ Parameters:\n\ \t\tdatum. Als geen detum wordt gegeven, copiëer alleen als bron nieuwer is.\n\n" } -#pragma code_page(default) diff --git a/reactos/base/applications/cmdutils/xcopy/Ru.rc b/reactos/base/applications/cmdutils/xcopy/Ru.rc index 4339e80dc72..154c999d357 100644 --- a/reactos/base/applications/cmdutils/xcopy/Ru.rc +++ b/reactos/base/applications/cmdutils/xcopy/Ru.rc @@ -84,4 +84,3 @@ XCOPY source [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ после указанной даты. Если дата не указана, копирует только\n\ те файлы, которые новее в исходной папке.\n" } -#pragma code_page(default) diff --git a/reactos/base/applications/cmdutils/xcopy/Si.rc b/reactos/base/applications/cmdutils/xcopy/Si.rc index 8e45d498b99..1013837f402 100644 --- a/reactos/base/applications/cmdutils/xcopy/Si.rc +++ b/reactos/base/applications/cmdutils/xcopy/Si.rc @@ -80,4 +80,3 @@ Where:\n\ \t\tod izvora\n\n" } -#pragma code_page(default) diff --git a/reactos/base/applications/cmdutils/xcopy/Uk.rc b/reactos/base/applications/cmdutils/xcopy/Uk.rc new file mode 100644 index 00000000000..6d59e1bfac6 --- /dev/null +++ b/reactos/base/applications/cmdutils/xcopy/Uk.rc @@ -0,0 +1,84 @@ +/* + * XCOPY - Wine-compatible xcopy program + * Ukrainian language support + * + * Copyright (C) 2007 J. Edmeades + * Copyright (C) 2010 I. Paliychuk + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "xcopy.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +STRINGTABLE +{ + STRING_INVPARMS, "Невірна кількість параметрів - Введіть xcopy /? для довідки\n" + STRING_INVPARM, "Невірний параметр '%s' - Введіть xcopy /? для довідки\n" + STRING_PAUSE, "Натисніть щоб почати копіювання\n" + STRING_SIMCOPY, "%d файл(ів) буде скопійовано\n" + STRING_COPY, "%d файл(ів) скопійовано\n" + STRING_QISDIR, "'%s' є файлом чи директорією\n" \ + "on the target?\n" \ + "(F - Файл, D - Директорія)\n" + STRING_SRCPROMPT,"%s? (Yes|No)\n" + STRING_OVERWRITE,"Переписати %s? (Yes|No|All)\n" + STRING_COPYFAIL, "Під час копіювання '%s' в '%s' сталась помилка r/c %d\n" + STRING_OPENFAIL, "Не вдалось відкрити '%s'\n" + STRING_READFAIL, "Помилка читання '%s'\n" + STRING_YES_CHAR, "Y" + STRING_NO_CHAR, "N" + STRING_ALL_CHAR, "A" + STRING_FILE_CHAR,"F" + STRING_DIR_CHAR, "D" + + STRING_HELP, +"XCOPY - Копіює файли та дерева директорій за призначенням\n\ +\n\ +Syntax:\n\ +XCOPY source [dest] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\ +\t [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]\n\ +\n\ +Where:\n\ +\n\ +[/I] Assume directory if destination does not exist and copying 2 or\n\ +\tmore files\n\ +[/S] Копіює директорії та піддиректорії\n\ +[/E] Копіює директорії та піддиректорії, включно з порожніми\n\ +[/Q] Do not list names during copy, ie quiet.\n\ +[/F] Під час копіювання відображає повні імена початкових і кінцевих файлів\n\ +[/L] Simulate operation, showing names which would be copied\n\ +[/W] Питає підтвердження перед початком копіювання\n\ +[/T] Створює структуру каталогів але не копіює файли\n\ +[/Y] Suppress prompting when overwriting files\n\ +[/-Y] Питає підтвердження на перезапис файлів\n\ +[/P] Prompts on each source file before copying\n\ +[/N] Копіює, використовуючи короткі імена\n\ +[/U] Copy only files which already exist in destination\n\ +[/R] Перезаписує файли, доступні лише для читання\n\ +[/H] Include hidden and system files in the copy\n\ +[/C] Продовжує роботу, навіть якщо при копіюванні виникла помилка\n\ +[/A] Копіює лише файли з властивістю АРХІВНИЙ\n\ +[/M] Копіює лише файли з властивістю АРХІВНИЙ, видаляє\n\ +\властивість АРХІВНИЙ\n\ +[/D | /D:m-d-y] Копіює лише нові файли або ті, які були змінені після вказаної дати.\n\ +\t\tЯкщо дата не вказана, only copy if destination is older\n\ +\t\tthan source\n\n" + +} diff --git a/reactos/base/applications/cmdutils/xcopy/rsrc.rc b/reactos/base/applications/cmdutils/xcopy/rsrc.rc index 13cd86fcd57..b82341cda08 100644 --- a/reactos/base/applications/cmdutils/xcopy/rsrc.rc +++ b/reactos/base/applications/cmdutils/xcopy/rsrc.rc @@ -27,15 +27,19 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include #include "Da.rc" -#include "De.rc" #include "En.rc" -#include "Fr.rc" -#include "Ja.rc" #include "Ko.rc" -#include "Lt.rc" -#include "Nl.rc" #include "No.rc" #include "Pl.rc" #include "Pt.rc" + +/* UTF-8 */ +#include "De.rc" +#include "Fr.rc" +#include "It.rc" +#include "Ja.rc" +#include "Lt.rc" +#include "Nl.rc" #include "Ru.rc" #include "Si.rc" +#include "Uk.rc" diff --git a/reactos/base/applications/cmdutils/xcopy/xcopy.rbuild b/reactos/base/applications/cmdutils/xcopy/xcopy.rbuild index 2e3e1a9809d..437fa46bf63 100644 --- a/reactos/base/applications/cmdutils/xcopy/xcopy.rbuild +++ b/reactos/base/applications/cmdutils/xcopy/xcopy.rbuild @@ -1,5 +1,5 @@ - + . wine diff --git a/reactos/base/applications/downloader/lang/de-DE.rc b/reactos/base/applications/downloader/lang/de-DE.rc index 087a14c6325..0b29796491c 100644 --- a/reactos/base/applications/downloader/lang/de-DE.rc +++ b/reactos/base/applications/downloader/lang/de-DE.rc @@ -15,11 +15,11 @@ STYLE DS_SHELLFONT | DS_CENTER | WS_BORDER | WS_CAPTION | WS_POPUP | WS_SYSMENU CAPTION "Einstellungen" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Download Ordner:", -1, 6, 10, 140, 8 + LTEXT "Downloadordner:", -1, 6, 10, 140, 8 EDITTEXT IDC_DOWNLOAD_FOLDER_EDIT, 6, 20, 205, 14, WS_VISIBLE | WS_TABSTOP PUSHBUTTON "W&hle...", IDC_CHOOSE_BUTTON, 216, 20, 45, 14 AUTOCHECKBOX "&Installationsdateien nach dem Setup lschen", IDC_DELINST_FILES_CHECKBOX, 8, 40, 210, 10, WS_GROUP - LTEXT "Update Server:", -1, 6, 55, 140, 8 + LTEXT "Updateserver:", -1, 6, 55, 140, 8 EDITTEXT IDC_UPDATE_SERVER_EDIT, 6, 65, 255, 14, WS_VISIBLE | WS_TABSTOP DEFPUSHBUTTON "&OK", IDOK, 147, 90, 54, 15 PUSHBUTTON "&Abbrechen", IDCANCEL, 207, 90, 54, 15 @@ -31,7 +31,7 @@ BEGIN IDS_WELCOME_TITLE "Willkommen im ReactOS Downloader" IDS_WELCOME "Bitte whlen Sie links eine Kategorie. Dies ist Version 1.1." IDS_NO_APP_TITLE "Keine Anwendung ausgewhlt" - IDS_NO_APP "Bitte whlen Sie eine Anwendung, bevor Sie die Download-Schaltflche bettigen. Wenn Sie Hilfe bentigen, drcken Sie die Hilfe-Schaltflche in der oberen rechten Ecke." + IDS_NO_APP "Bitte whlen Sie eine Anwendung aus, bevor Sie die Download-Schaltflche bettigen. Wenn Sie Hilfe bentigen, drcken Sie die Hilfe-Schaltflche in der oberen rechten Ecke." IDS_UPDATE_TITLE "Update" IDS_UPDATE "Diese Funktion wurde noch nicht implementiert." IDS_HELP_TITLE "Hilfe" @@ -41,20 +41,20 @@ BEGIN IDS_CHOOSE_SUB "Bitte whlen Sie eine Unterkategorie." IDS_CHOOSE_CATEGORY "Bitte whlen Sie eine Kategorie." IDS_CHOOSE_BOTH "Bitte whlen Sie eine Unterkategorie oder eine Anwendung." - IDS_XMLERROR_1 "XML Datei nicht gefunden!" - IDS_XMLERROR_2 "XML Datei kann nicht verarbeitet werden!" + IDS_XMLERROR_1 "XML-Datei nicht gefunden!" + IDS_XMLERROR_2 "XML-Datei kann nicht verarbeitet werden!" IDS_DOWNLOAD_ERROR "Die Datei konnte nicht heruntergeladen werden.\nBitte prfen sie, ob eine Verbindung zum Internet besteht." IDS_VERSION "Version: " IDS_LICENCE "Lizenz: " IDS_MAINTAINER "Maintainer: " IDS_APPS_TITLE "Anwendungen" IDS_CATS_TITLE "Kategorien" - IDS_CHOOSE_FOLDER "Bitte whlen Sie den Ordner..." + IDS_CHOOSE_FOLDER "Bitte whlen Sie den Ordner aus..." IDS_NOTCREATE_REGKEY "Registryschlssel knnte nicht erstellt werden." IDS_DOWNLOAD_FOLDER "Downloader" IDS_UNABLECREATE_FOLDER "Es konnte kein Ordner mit diesem Namen erstellt werden!" IDS_UPDATE_URL "http://svn.reactos.org" - IDS_INSTALL_DEP "%s wird bentigt um %s ausfhren zu knnen. Soll %s jetzt installiert werden?" + IDS_INSTALL_DEP "%s wird bentigt, um %s ausfhren zu knnen. Soll %s jetzt installiert werden?" TTT_HELPBUTTON "Hilfe ber den Downloader" TTT_UPDATEBUTTON "Noch nicht vorhanden" TTT_PROFBUTTON "Konfiguriert den Downloader" diff --git a/reactos/base/applications/dxdiag/dxdiag.c b/reactos/base/applications/dxdiag/dxdiag.c index 3985fae208d..2c9bc701baf 100644 --- a/reactos/base/applications/dxdiag/dxdiag.c +++ b/reactos/base/applications/dxdiag/dxdiag.c @@ -126,7 +126,6 @@ InitializeTabCtrl(HWND hwndDlg, PDXDIAG_CONTEXT pContext) pContext->hDialogs[4] = CreateDialogParamW(hInst, MAKEINTRESOURCEW(IDD_HELP_DIALOG), hTabCtrlWnd, HelpPageWndProc, (LPARAM)pContext); /* insert tab ctrl items */ - InsertTabCtrlItem(hTabCtrlWnd, 0, MAKEINTRESOURCEW(IDS_SYSTEM_DIALOG)); InitializeDisplayAdapters(pContext); InitializeDirectSoundPage(pContext); @@ -188,8 +187,19 @@ DxDiagWndProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) if (LOWORD(wParam) == IDC_BUTTON_NEXT) { - //TODO - /* handle next button */ + INT CurSel; + + /* retrieve current page */ + CurSel = TabCtrl_GetCurSel(hTabCtrlWnd); + CurSel++; + + /* enable/disable next button */ + EnableWindow(GetDlgItem(hwndDlg, IDC_BUTTON_NEXT), + (CurSel != TabCtrl_GetItemCount(hTabCtrlWnd) - 1)); + + /* switch to next page */ + SendMessageW(hTabCtrlWnd, TCM_SETCURSEL, CurSel, 0L); + return TRUE; } @@ -210,6 +220,12 @@ DxDiagWndProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) pnmh = (LPNMHDR)lParam; if ((pnmh->hwndFrom == hTabCtrlWnd) && (pnmh->idFrom == IDC_TAB_CONTROL) && (pnmh->code == TCN_SELCHANGE)) { + INT CurSel = TabCtrl_GetCurSel(hTabCtrlWnd); + + /* enable/disable next button */ + EnableWindow(GetDlgItem(hwndDlg, IDC_BUTTON_NEXT), + (CurSel != TabCtrl_GetItemCount(hTabCtrlWnd) - 1)); + TabCtrl_OnSelChange(pContext); } break; diff --git a/reactos/base/applications/dxdiag/lang/de-DE.rc b/reactos/base/applications/dxdiag/lang/de-DE.rc index 8a572b65576..e79530d5bed 100644 --- a/reactos/base/applications/dxdiag/lang/de-DE.rc +++ b/reactos/base/applications/dxdiag/lang/de-DE.rc @@ -148,9 +148,9 @@ IDD_INPUT_DIALOG DIALOGEX DISCARDABLE 0, 0, 462, 220 STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "DirectInput Gerte", -1, 10, 10, 452, 80 + GROUPBOX "DirectInput-Gerte", -1, 10, 10, 452, 80 CONTROL "", IDC_LIST_DEVICE, "SysListView32", LVS_REPORT | WS_CHILD | WS_BORDER | WS_TABSTOP, 20, 22, 432, 60 - GROUPBOX "Eingabebezogene Gerte", -1, 10, 100, 452, 60 + GROUPBOX "Eingabegerte", -1, 10, 100, 452, 60 CONTROL "", IDC_TREE_PORT, "SysTreeView32", TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_SHOWSELALWAYS | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 20, 112, 432, 40, 0x00000200 GROUPBOX "Hinweis", -1, 10, 170, 452, 50 EDITTEXT IDC_RICH_INFO, 20, 182, 432, 30, WS_DISABLED | WS_TABSTOP @@ -172,7 +172,7 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_MAIN_DIALOG "ReactX Diagnoseprogramm" + IDS_MAIN_DIALOG "ReactX-Diagnoseprogramm" IDS_SYSTEM_DIALOG "System" IDS_DISPLAY_DIALOG "Anzeige" IDS_SOUND_DIALOG "Sound" @@ -193,7 +193,7 @@ BEGIN IDS_DEVICE_CONTROLLER "Controllererkennung" IDS_DEVICE_MANUFACTURER "Herstellererkennung" IDS_DEVICE_PRODUCT "Produkterkennung" - IDS_DEVICE_FORCEFEEDBACK "Force Feedback-Treiber" + IDS_DEVICE_FORCEFEEDBACK "Force-Feedback-Treiber" IDS_NOT_APPLICABLE "Nicht zutreffend" IDS_OPTION_YES "Ja" IDS_DIRECTPLAY_COL_NAME1 "Name" @@ -204,20 +204,20 @@ BEGIN IDS_DIRECTPLAY8_SERIALSP "DirectPlay8 serieller Dienstanbieter" IDS_DIRECTPLAY8_IPXSP "DirectPlay8-IPX-Dienstanbieter" IDS_DIRECTPLAY8_TCPSP "DirectPlay8-TCP/IP-Dienstanbieter" - IDS_DIRECTPLAY_TCPCONN "TCP/IP Verbindung fr DirectPlay" - IDS_DIRECTPLAY_IPXCONN "IPX Verbindung fr DirectPlay" + IDS_DIRECTPLAY_TCPCONN "TCP/IP-Verbindung fr DirectPlay" + IDS_DIRECTPLAY_IPXCONN "IPX-Verbindung fr DirectPlay" IDS_DIRECTPLAY_MODEMCONN "Modemverbindung fr DirectPlay" IDS_DIRECTPLAY_SERIALCONN "Serielle Verbindung fr DirectPlay" IDS_REG_SUCCESS "OK" IDS_REG_FAIL "Fehler" - IDS_DDTEST_ERROR "Test failed!" - IDS_DDTEST_DESCRIPTION "This will start DirecDraw interface test. Continue?" - IDS_DDPRIMARY_DESCRIPTION "This test will use DirectDraw to draw on primary surface. Black and white rectangles should be drawn. Continue?" - IDS_DDPRIMARY_RESULT "Did you see black and white rectangles?" - IDS_DDOFFSCREEN_DESCRIPTION "This test will use DirectDraw to draw in an offscreen buffer. Moving white rectangle should be drawn. Continue?" - IDS_DDOFFSCREEN_RESULT "Did you see white moving reactangle?" - IDS_DDFULLSCREEN_DESCRIPTION "This test will use DirectDraw to draw in a fullscreen mode. Moving white rectangle should be drawn. Continue?" - IDS_DDFULLSCREEN_RESULT "Did you see white moving reactangle in a fullscreen mode?" + IDS_DDTEST_ERROR "Test fehlgeschlagen!" + IDS_DDTEST_DESCRIPTION "Dies wird den DirectDraw-Interfacetest starten. Fortfahren?" + IDS_DDPRIMARY_DESCRIPTION "Dieser Test wird DirectDraw benutzen, um auf Ihrem primren Bildschirm etwas darzustellen. Schwarze und weie Rechtecke sollten zu sehen sein. Fortfahren?" + IDS_DDPRIMARY_RESULT "Haben Sie schwarze und weie Rechtecke gesehen?" + IDS_DDOFFSCREEN_DESCRIPTION "Dieser Test wird DirectDraw benutzen, um im Offscreen-Buffer zu zeichnen. Ein bewegtes weies Rechteck sollte zu sehen sein. Fortfahren?" + IDS_DDOFFSCREEN_RESULT "Haben Sie das bewegte weie Rechteck gesehen?" + IDS_DDFULLSCREEN_DESCRIPTION "Dieser Test wird DirectDraw benutzen, um im Vollbildmodus zu zeichnen. Ein bewegtes weies Rechteck sollte zu sehen sein. Fortfahren?" + IDS_DDFULLSCREEN_RESULT "Haben Sie das bewegte weie Rechteck im Vollbildmodus gesehen?" IDS_FORMAT_ADAPTER_MEM "%u MB" IDS_FORMAT_ADAPTER_MODE "%04u x %04u (%u bit)(%uHz)" IDS_OPTION_NO "Nein" diff --git a/reactos/base/applications/dxdiag/resource.h b/reactos/base/applications/dxdiag/resource.h index 03917dbc5e5..e9118d13570 100644 --- a/reactos/base/applications/dxdiag/resource.h +++ b/reactos/base/applications/dxdiag/resource.h @@ -1,5 +1,4 @@ -#ifndef RESOURCE_H__ -#define RESOURCE_H__ +#pragma once /* dialog constants */ #define IDD_MAIN_DIALOG 100 @@ -142,6 +141,3 @@ /* icon resource constants */ #define IDI_APPICON 20000 - - -#endif diff --git a/reactos/base/applications/dxdiag/system.c b/reactos/base/applications/dxdiag/system.c index 33c1f9d5bde..311fc03cdf7 100644 --- a/reactos/base/applications/dxdiag/system.c +++ b/reactos/base/applications/dxdiag/system.c @@ -17,7 +17,6 @@ GetRegValue(HKEY hBaseKey, LPWSTR SubKey, LPWSTR ValueName, DWORD Type, LPWSTR R DWORD dwType; DWORD dwSize; - if (RegOpenKeyExW(hBaseKey, SubKey, 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) return FALSE; @@ -25,10 +24,10 @@ GetRegValue(HKEY hBaseKey, LPWSTR SubKey, LPWSTR ValueName, DWORD Type, LPWSTR R res = RegQueryValueExW(hKey, ValueName, NULL, &dwType, (LPBYTE)Result, &dwSize); RegCloseKey(hKey); - if (dwType != Type) + if (res != ERROR_SUCCESS) return FALSE; - if (res != ERROR_SUCCESS) + if (dwType != Type) return FALSE; if (Size == sizeof(DWORD)) diff --git a/reactos/base/applications/extrac32/extrac32.c b/reactos/base/applications/extrac32/extrac32.c new file mode 100644 index 00000000000..fc1ae1c94ae --- /dev/null +++ b/reactos/base/applications/extrac32/extrac32.c @@ -0,0 +1,179 @@ +/* + * Extract - Wine-compatible program for extract *.cab files. + * + * Copyright 2007 Etersoft (Lyutin Anatoly) + * Copyright 2009 Ilya Shpigor + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include + +#include "wine/unicode.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(extrac32); + +static BOOL force_mode; + +static UINT WINAPI ExtCabCallback(PVOID Context, UINT Notification, UINT_PTR Param1, UINT_PTR Param2) +{ + FILE_IN_CABINET_INFO_W *pInfo; + FILEPATHS_W *pFilePaths; + + switch(Notification) + { + case SPFILENOTIFY_FILEINCABINET: + pInfo = (FILE_IN_CABINET_INFO_W*)Param1; + lstrcpyW(pInfo->FullTargetName, (LPCWSTR)Context); + lstrcatW(pInfo->FullTargetName, pInfo->NameInCabinet); + return FILEOP_DOIT; + case SPFILENOTIFY_FILEEXTRACTED: + pFilePaths = (FILEPATHS_W*)Param1; + WINE_TRACE("Extracted %s\n", wine_dbgstr_w(pFilePaths->Target)); + return NO_ERROR; + } + return NO_ERROR; +} + +static void extract(LPCWSTR cabfile, LPWSTR destdir) +{ + if (!SetupIterateCabinetW(cabfile, 0, ExtCabCallback, destdir)) + WINE_ERR("Could not extract cab file %s\n", wine_dbgstr_w(cabfile)); +} + +static void copy_file(LPCWSTR source, LPCWSTR destination) +{ + WCHAR destfile[MAX_PATH]; + + /* append source filename if destination is a directory */ + if (PathIsDirectoryW(destination)) + { + PathCombineW(destfile, destination, PathFindFileNameW(source)); + destination = destfile; + } + + if (PathFileExistsW(destination) && !force_mode) + { + static const WCHAR overwriteMsg[] = {'O','v','e','r','w','r','i','t','e',' ','"','%','s','"','?',0}; + static const WCHAR titleMsg[] = {'E','x','t','r','a','c','t',0}; + WCHAR msg[MAX_PATH+100]; + snprintfW(msg, sizeof(msg)/sizeof(msg[0]), overwriteMsg, destination); + if (MessageBoxW(NULL, msg, titleMsg, MB_YESNO | MB_ICONWARNING) != IDYES) + return; + } + + WINE_TRACE("copying %s to %s\n", wine_dbgstr_w(source), wine_dbgstr_w(destination)); + CopyFileW(source, destination, FALSE); +} + +int PASCAL wWinMain(HINSTANCE hInstance, HINSTANCE prev, LPWSTR cmdline, int show) +{ + LPWSTR *argv; + int argc; + int i; + WCHAR check, cmd = 0; + WCHAR path[MAX_PATH]; + WCHAR backslash[] = {'\\',0}; + LPCWSTR cabfile = NULL; + + path[0] = 0; + argv = CommandLineToArgvW(cmdline, &argc); + + if(!argv) + { + WINE_ERR("Bad command line arguments\n"); + return 0; + } + + /* Parse arguments */ + for(i = 0; i < argc; i++) + { + /* Get cabfile */ + if (argv[i][0] != '/') + { + if (!cabfile) + { + cabfile = argv[i]; + continue; + } else + break; + } + /* Get parameters for commands */ + check = toupperW( argv[i][1] ); + switch(check) + { + case 'A': + WINE_FIXME("/A not implemented\n"); + break; + case 'Y': + force_mode = TRUE; + break; + case 'L': + if ((i + 1) >= argc) return 0; + if (!GetFullPathNameW(argv[++i], MAX_PATH, path, NULL)) + return 0; + break; + case 'C': + if (cmd) return 0; + cmd = check; + break; + case 'E': + case 'D': + if (cmd) return 0; + cmd = check; + break; + default: + return 0; + } + } + + if (!cabfile) + return 0; + + if (cmd == 'C') + { + if ((i + 1) != argc) return 0; + if (!GetFullPathNameW(argv[i], MAX_PATH, path, NULL)) + return 0; + } + + if (!path[0]) + GetCurrentDirectoryW(MAX_PATH, path); + + lstrcatW(path, backslash); + + /* Execute the specified command */ + switch(cmd) + { + case 'C': + /* Copy file */ + copy_file(cabfile, path); + break; + case 'E': + /* Extract CAB archive */ + extract(cabfile, path); + break; + case 0: + case 'D': + /* Display CAB archive */ + WINE_FIXME("/D not implemented\n"); + break; + } + return 0; +} diff --git a/reactos/base/applications/extrac32/extrac32.rbuild b/reactos/base/applications/extrac32/extrac32.rbuild new file mode 100644 index 00000000000..24532ddfd3d --- /dev/null +++ b/reactos/base/applications/extrac32/extrac32.rbuild @@ -0,0 +1,9 @@ + + . + wine + shell32 + setupapi + shlwapi + user32 + extrac32.c + diff --git a/reactos/base/applications/fontview/display.h b/reactos/base/applications/fontview/display.h index aafdea8e68c..9d36e6caddf 100644 --- a/reactos/base/applications/fontview/display.h +++ b/reactos/base/applications/fontview/display.h @@ -1,5 +1,4 @@ -#ifndef _DISPLAY_H -#define _DISPLAY_H +#pragma once /* Messages for the display class */ #define FVM_SETTYPEFACE WM_USER @@ -14,5 +13,3 @@ extern const WCHAR g_szFontDisplayClassName[]; /* Public function */ BOOL Display_InitClass(HINSTANCE hInstance); - -#endif // _DISPLAY_H diff --git a/reactos/base/applications/fontview/lang/de-DE.rc b/reactos/base/applications/fontview/lang/de-DE.rc index 2197a7ffaec..28cc675ec79 100644 --- a/reactos/base/applications/fontview/lang/de-DE.rc +++ b/reactos/base/applications/fontview/lang/de-DE.rc @@ -8,7 +8,7 @@ BEGIN IDS_ERROR, "Fehler" IDS_ERROR_NOMEM, "Es steht nicht gengend Speicher zur Verfgung." IDS_ERROR_NOFONT, "Die angegebene Datei %1 ist keine gltige Schriftartendatei." - IDS_ERROR_NOCLASS, "Fehler beim initialisieren der Fensterklasse." + IDS_ERROR_NOCLASS, "Fehler beim Initialisieren der Fensterklasse." IDS_ERROR_BADCMD, "Keine Schriftartendatei angegeben.\nSyntax:\n fontview.exe " END diff --git a/reactos/base/applications/games/solitaire/lang/de-DE.rc b/reactos/base/applications/games/solitaire/lang/de-DE.rc index 5e8f44457f4..9ecc79e5c37 100644 --- a/reactos/base/applications/games/solitaire/lang/de-DE.rc +++ b/reactos/base/applications/games/solitaire/lang/de-DE.rc @@ -57,7 +57,7 @@ BEGIN IDS_SOL_NAME "Solitr" IDS_SOL_ABOUT "Solitr von J Brown\n\nCardLib version 1.0." IDS_SOL_QUIT "Laufendes Spiel beenden?" - IDS_SOL_WIN "Glckwunsch, Sie haben Gewonnen!" + IDS_SOL_WIN "Glckwunsch, Sie haben gewonnen!" IDS_SOL_DEAL "Neu geben?" END diff --git a/reactos/base/applications/games/solitaire/solitaire.h b/reactos/base/applications/games/solitaire/solitaire.h index 14eaebce099..3b1e1bbe1e8 100644 --- a/reactos/base/applications/games/solitaire/solitaire.h +++ b/reactos/base/applications/games/solitaire/solitaire.h @@ -1,5 +1,4 @@ -#ifndef SOLITAIRE_INCLUDED -#define SOLITAIRE_INCLUDED +#pragma once extern CardWindow SolWnd; extern TCHAR szAppName[]; @@ -54,5 +53,3 @@ void CARDLIBPROC DeckClickProc(CardRegion &stackobj, int iNumClicked); void CARDLIBPROC PileDblClickProc(CardRegion &stackobj, int iNumClicked); void CARDLIBPROC PileRemoveProc(CardRegion &stackobj, int iRemoved); - -#endif diff --git a/reactos/base/applications/games/spider/lang/de-DE.rc b/reactos/base/applications/games/spider/lang/de-DE.rc index b2bc790b06c..5b353b17263 100644 --- a/reactos/base/applications/games/spider/lang/de-DE.rc +++ b/reactos/base/applications/games/spider/lang/de-DE.rc @@ -54,7 +54,7 @@ BEGIN IDS_SPI_NAME "Spider" IDS_SPI_ABOUT "Spider Solitaire von Gregor Schneider\n\nCardLib Version 1.0" IDS_SPI_QUIT "Laufendes Spiel beenden?" - IDS_SPI_WIN "Gratulation, Sie haben gewonnen!" + IDS_SPI_WIN "Glckwunsch, Sie haben gewonnen!" IDS_SPI_DEAL "Neu geben?" END diff --git a/reactos/base/applications/games/spider/spider.h b/reactos/base/applications/games/spider/spider.h index 89b64ae98c2..caff04abead 100644 --- a/reactos/base/applications/games/spider/spider.h +++ b/reactos/base/applications/games/spider/spider.h @@ -1,5 +1,4 @@ -#ifndef SOLITAIRE_INCLUDED -#define SOLITAIRE_INCLUDED +#pragma once #define DIFFICULTY_ONE_COLOR 1 #define DIFFICULTY_TWO_COLORS 2 @@ -38,5 +37,3 @@ void CARDLIBPROC DeckClickProc(CardRegion &stackobj, int iNumClicked); void CARDLIBPROC PileDblClickProc(CardRegion &stackobj, int iNumClicked); void CARDLIBPROC PileRemoveProc(CardRegion &stackobj, int iRemoved); - -#endif diff --git a/reactos/base/applications/games/winemine/lang/de-DE.rc b/reactos/base/applications/games/winemine/lang/de-DE.rc index 4c4e59d1457..69676c41f56 100644 --- a/reactos/base/applications/games/winemine/lang/de-DE.rc +++ b/reactos/base/applications/games/winemine/lang/de-DE.rc @@ -56,7 +56,7 @@ STYLE DS_MODALFRAME | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP | DS_SHEL CAPTION "Glckwunsch!" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Bitte geben Sie ihren Namen ein", IDIGNORE, 25, 10, 150, 10 + LTEXT "Bitte geben Sie Ihren Namen ein", IDIGNORE, 25, 10, 150, 10 EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 END diff --git a/reactos/base/applications/magnify/magnify.rbuild b/reactos/base/applications/magnify/magnify.rbuild index c891a1e14d1..995437d3826 100644 --- a/reactos/base/applications/magnify/magnify.rbuild +++ b/reactos/base/applications/magnify/magnify.rbuild @@ -1,5 +1,5 @@ - + . user32 diff --git a/reactos/base/applications/mmc/precomp.h b/reactos/base/applications/mmc/precomp.h index 460b8aef130..ad39a6ff1c9 100644 --- a/reactos/base/applications/mmc/precomp.h +++ b/reactos/base/applications/mmc/precomp.h @@ -1,5 +1,4 @@ -#ifndef __PRECOMP_H -#define __PRECOMP_H +#pragma once #include #include @@ -34,5 +33,3 @@ LoadAndFormatString(IN HINSTANCE hInstance, extern HINSTANCE hAppInstance; extern HANDLE hAppHeap; - -#endif /* __PRECOMP_H */ diff --git a/reactos/base/applications/mmc/resource.h b/reactos/base/applications/mmc/resource.h index 37f42f5af71..65fbe6eac65 100644 --- a/reactos/base/applications/mmc/resource.h +++ b/reactos/base/applications/mmc/resource.h @@ -1,5 +1,4 @@ -#ifndef __RESOURCE_H -#define __RESOURCE_H +#pragma once #define IDS_APPTITLE 101 #define IDS_CONSOLETITLE 102 @@ -10,5 +9,3 @@ #define ID_FILE_EXIT 1001 #define ID_HELP_ABOUT 9001 - -#endif /* __RESOURCE_H */ diff --git a/reactos/base/applications/mplay32/lang/de-DE.rc b/reactos/base/applications/mplay32/lang/de-DE.rc index 622fdf6f10f..470413c555e 100644 --- a/reactos/base/applications/mplay32/lang/de-DE.rc +++ b/reactos/base/applications/mplay32/lang/de-DE.rc @@ -17,8 +17,8 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_ALL_TYPES_FILTER "Alle Untersttzten (*.wav, *.cda, *.midi, *.mid, *.avi)\0*.wav;*.cda;*.midi;*.mid;*.avi\0" - IDS_TOOLTIP_PLAY "wiedergabe" + IDS_ALL_TYPES_FILTER "Alle untersttzten (*.wav, *.cda, *.midi, *.mid, *.avi)\0*.wav;*.cda;*.midi;*.mid;*.avi\0" + IDS_TOOLTIP_PLAY "Wiedergabe" IDS_TOOLTIP_STOP "Stopp" IDS_TOOLTIP_EJECT "Auswerfen" IDS_TOOLTIP_BACKWARD "Zurck" diff --git a/reactos/base/applications/mplay32/resource.h b/reactos/base/applications/mplay32/resource.h index f4dfddf95e4..77100332800 100644 --- a/reactos/base/applications/mplay32/resource.h +++ b/reactos/base/applications/mplay32/resource.h @@ -1,5 +1,4 @@ -#ifndef __RESOURCE_H_ -#define __RESOURCE_H_ +#pragma once /* Icons */ #define IDI_MAIN 10 @@ -51,5 +50,3 @@ #define IDC_SEEKBACK 1504 #define IDC_SEEKFORW 1505 #define IDC_FORWARD 1506 - -#endif /* __RESOURCE_H_ */ diff --git a/reactos/base/applications/msconfig/lang/de-DE.rc b/reactos/base/applications/msconfig/lang/de-DE.rc index b7dd1ed5b9b..96cb09fd864 100644 --- a/reactos/base/applications/msconfig/lang/de-DE.rc +++ b/reactos/base/applications/msconfig/lang/de-DE.rc @@ -83,7 +83,7 @@ BEGIN PUSHBUTTON "A&ls Standard", IDC_BTN_SET_DEFAULT_BOOT, 120, 65, 63, 12 PUSHBUTTON "Nach &oben", IDC_BTN_MOVE_UP_BOOT_OPTION, 203, 65, 63, 12 PUSHBUTTON "Nach &unten", IDC_BTN_MOVE_DOWN_BOOT_OPTION, 286, 65, 63, 12 - GROUPBOX "Boot Optionen", -1, 10, 80, 250, 90,0,WS_EX_TRANSPARENT + GROUPBOX "Bootoptionen", -1, 10, 80, 250, 90,0,WS_EX_TRANSPARENT CHECKBOX "/SA&FEBOOT", IDC_CBX_SAFE_BOOT, 15, 90, 55, 10 CHECKBOX "/&NOGUIBOOT", IDC_CBX_NO_GUI_BOOT, 15, 105, 60, 10 CHECKBOX "/&BOOTLOG", IDC_CBX_BOOT_LOG, 15, 120, 50, 10 @@ -149,7 +149,7 @@ BEGIN IDS_TOOLS_CMD_CMD "cmd.exe" IDS_TOOLS_INFO_NAME "Version" - IDS_TOOLS_INFO_DESCR "Zeigt die installierte ReactOS Version an." + IDS_TOOLS_INFO_DESCR "Zeigt die installierte ReactOS-Version an." IDS_TOOLS_INFO_CMD "winver.exe" IDS_TOOLS_REGEDIT_NAME "Registrierungs-Editor" diff --git a/reactos/base/applications/mscutils/devmgmt/lang/de-DE.rc b/reactos/base/applications/mscutils/devmgmt/lang/de-DE.rc index a3706603fcf..6e5f6fb4900 100644 --- a/reactos/base/applications/mscutils/devmgmt/lang/de-DE.rc +++ b/reactos/base/applications/mscutils/devmgmt/lang/de-DE.rc @@ -51,7 +51,7 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_LICENSE "Dieses Programm ist kostenlos; Sie knnen es frei verteilen mit od. ohne nderungen unter der GNU Lesser General Public License wie es von der Free Software Foundation verffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine sptere Version (ihrer Wahl).\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." + IDS_LICENSE "Dieses Programm ist kostenlos; Sie knnen es frei verteilen mit od. ohne nderungen unter der GNU Lesser General Public License, wie es von der Free Software Foundation verffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine sptere Version (ihrer Wahl).\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." END STRINGTABLE DISCARDABLE diff --git a/reactos/base/applications/mscutils/servman/lang/de-DE.rc b/reactos/base/applications/mscutils/servman/lang/de-DE.rc index 7a978d1b3e0..d291a48463d 100644 --- a/reactos/base/applications/mscutils/servman/lang/de-DE.rc +++ b/reactos/base/applications/mscutils/servman/lang/de-DE.rc @@ -193,7 +193,7 @@ BEGIN IDS_NUM_SERVICES "Anzahl der Dienste: %d" IDS_STOP_DEPENDS "When %s stops, these other services will also stop" IDS_NO_DEPENDS "" - IDS_LICENSE "Dieses Programm ist kostenlos; Sie knnen es frei verteilen mit od. ohne nderungen unter der GNU Lesser General Public License wie es von der Free Software Foundation verffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine sptere Version (ihrer Wahl).\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." + IDS_LICENSE "Dieses Programm ist kostenlos; Sie knnen es frei verteilen mit od. ohne nderungen unter der GNU Lesser General Public License, wie es von der Free Software Foundation verffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine sptere Version (ihrer Wahl).\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." END STRINGTABLE DISCARDABLE diff --git a/reactos/base/applications/mstsc/bsops.h b/reactos/base/applications/mstsc/bsops.h index 6785c46d1e9..6b596f6cd01 100644 --- a/reactos/base/applications/mstsc/bsops.h +++ b/reactos/base/applications/mstsc/bsops.h @@ -18,8 +18,7 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __BSOPS_MSTSC_H -#define __BSOPS_MSTSC_H +#pragma once int bs_get_pixel(int x, int y); void bs_set_pixel(int x, int y, int pixel, int rop, int use_clip); @@ -50,5 +49,3 @@ void bs_patblt(int opcode, int x, int y, int cx, int cy, int brush_style, char * brush_pattern, int brush_x_org, int brush_y_org, int bgcolour, int fgcolour); - -#endif /* __BSOPS_MSTSC_H */ diff --git a/reactos/base/applications/mstsc/lang/de-DE.rc b/reactos/base/applications/mstsc/lang/de-DE.rc index 15508777749..ebfae96f32e 100644 --- a/reactos/base/applications/mstsc/lang/de-DE.rc +++ b/reactos/base/applications/mstsc/lang/de-DE.rc @@ -15,18 +15,18 @@ BEGIN PUSHBUTTON "Speichern unter",IDC_SAVEAS,120,139,55,14 PUSHBUTTON "ffnen...",IDC_OPEN,177,139,50,14 ICON "", IDC_CONNICON, 16,114,20,20 - LTEXT "Die derzeitigen Verbindungseinstellungen speichern oder vohandene Einstellungen laden.",IDC_STATIC,50,115,172,20 + LTEXT "Die derzeitigen Verbindungseinstellungen speichern oder vorhandene Einstellungen laden.",IDC_STATIC,50,115,172,20 END IDD_DISPLAY DIALOGEX 0, 0, 242, 175 STYLE DS_SHELLFONT | WS_CHILD FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - GROUPBOX "Remotedesktop Gre",IDC_STATIC,7,7,228,68 + GROUPBOX "Remotedesktop-Gre",IDC_STATIC,7,7,228,68 GROUPBOX "Farben",IDC_STATIC,7,83,228,85 ICON "", IDC_REMICON, 15,19,20,20 ICON "", IDC_COLORSICON, 15,98,20,20 - LTEXT "Whlen Sie die Bildschirmgre von Ihrem Remote- desktop. Stellen Sie den Regler fr Vollbild nach rechts",IDC_STATIC,53,22,175,21 + LTEXT "Whlen Sie die Bildschirmgre Ihres Remotedesktops. Stellen Sie den Regler fr Vollbild nach rechts",IDC_STATIC,53,22,175,21 CONTROL "", IDC_GEOSLIDER, "msctls_trackbar32", TBS_AUTOTICKS | WS_TABSTOP, 56, 42, 124, 17 COMBOBOX IDC_BPPCOMBO,56,102,128,80, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP CONTROL "",IDC_COLORIMAGE,"Static",SS_OWNERDRAW | SS_SUNKEN, 56,121,127,10 @@ -38,7 +38,7 @@ END IDD_CONNECTDIALOG DIALOGEX 0, 0, 260, 262 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Remotedesktop Verbindung" +CAPTION "Remotedesktop-Verbindung" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "Verbinden",IDOK,147,245,50,14 @@ -58,6 +58,6 @@ BEGIN IDS_PIXEL "%lux%lu Pixel" IDS_FULLSCREEN "Vollbild" IDS_BROWSESERVER "" - IDS_HEADERTEXT1 "Remote Desktop" + IDS_HEADERTEXT1 "Remotedesktop" IDS_HEADERTEXT2 "Verbindung" END diff --git a/reactos/base/applications/mstsc/mstsc.rbuild b/reactos/base/applications/mstsc/mstsc.rbuild index e2000ef0951..c8ed8e3e571 100644 --- a/reactos/base/applications/mstsc/mstsc.rbuild +++ b/reactos/base/applications/mstsc/mstsc.rbuild @@ -1,5 +1,5 @@ - + . user32 diff --git a/reactos/base/applications/mstsc/orders.h b/reactos/base/applications/mstsc/orders.h index 70a387168e1..2c8f919cfd8 100644 --- a/reactos/base/applications/mstsc/orders.h +++ b/reactos/base/applications/mstsc/orders.h @@ -18,8 +18,7 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __ORDERS_MSTSC_H -#define __ORDERS_MSTSC_H +#pragma once #define RDP_ORDER_STANDARD 0x01 #define RDP_ORDER_SECONDARY 0x02 @@ -369,5 +368,3 @@ typedef struct _RDP_COLCACHE_ORDER } RDP_COLCACHE_ORDER; - -#endif /* __ORDERS_MSTSC_H */ diff --git a/reactos/base/applications/mstsc/proto.h b/reactos/base/applications/mstsc/proto.h index e75e588af71..57f6a9ef4d4 100644 --- a/reactos/base/applications/mstsc/proto.h +++ b/reactos/base/applications/mstsc/proto.h @@ -17,8 +17,7 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef RDESKTOP_PROTO_H -#define RDESKTOP_PROTO_H +#pragma once /* *INDENT-OFF* */ #ifdef __cplusplus @@ -306,5 +305,3 @@ unsigned int seamless_send_focus(unsigned long id, unsigned long flags); } #endif /* *INDENT-ON* */ - -#endif diff --git a/reactos/base/applications/mstsc/rdesktop.h b/reactos/base/applications/mstsc/rdesktop.h index c9f97b3d4b9..f61a94b14df 100644 --- a/reactos/base/applications/mstsc/rdesktop.h +++ b/reactos/base/applications/mstsc/rdesktop.h @@ -18,8 +18,7 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __RDESKTOP_MSTSC_H -#define __RDESKTOP_MSTSC_H +#pragma once #include #include @@ -127,5 +126,3 @@ #ifndef MAKE_PROTO #include "proto.h" #endif - -#endif /* __RDESKTOP_MSTSC_H */ diff --git a/reactos/base/applications/mstsc/uimain.h b/reactos/base/applications/mstsc/uimain.h index c03a0796fce..b9972ef3bbf 100644 --- a/reactos/base/applications/mstsc/uimain.h +++ b/reactos/base/applications/mstsc/uimain.h @@ -18,8 +18,7 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __UIMAIN_MSTSC_H -#define __UIMAIN_MSTSC_H +#pragma once /* in uimain.c */ int @@ -77,5 +76,3 @@ ui_set_modifier_state(int code); #define UI_MAX(a, b) (((a) > (b)) ? (a) : (b)) #undef UI_MIN #define UI_MIN(a, b) (((a) < (b)) ? (a) : (b)) - -#endif /* __UIMAIN_MSTSC_H */ diff --git a/reactos/base/applications/network/finger/err.h b/reactos/base/applications/network/finger/err.h index bbc7397f852..bab0285d7e3 100644 --- a/reactos/base/applications/network/finger/err.h +++ b/reactos/base/applications/network/finger/err.h @@ -33,8 +33,7 @@ * @(#)err.h 8.1 (Berkeley) 6/2/93 */ -#ifndef _ERR_H_ -#define _ERR_H_ +#pragma once /* * Don't use va_list in the err/warn prototypes. Va_list is typedef'd in two @@ -56,5 +55,3 @@ void warn __P((const char *, ...)); void vwarn __P((const char *, va_list)); void warnx __P((const char *, ...)); void vwarnx __P((const char *, va_list)); - -#endif /* !_ERR_H_ */ diff --git a/reactos/base/applications/network/finger/various.h b/reactos/base/applications/network/finger/various.h index cb7572ee5b3..03c277b8b44 100644 --- a/reactos/base/applications/network/finger/various.h +++ b/reactos/base/applications/network/finger/various.h @@ -1,9 +1,7 @@ // Various things you need when porting BSD and GNU utilities to // Win32. -#ifndef VARIOUS_H -#define VARIOUS_H - +#pragma once typedef float f4byte_t; typedef double f8byte_t; @@ -32,5 +30,3 @@ typedef long uid_t; // SunOS 5.5 #define rindex(s, c) strrchr(s, c) void netfinger(char *); - -#endif diff --git a/reactos/base/applications/network/ipconfig/ipconfig.c b/reactos/base/applications/network/ipconfig/ipconfig.c index 8f6ca9a9e6b..5bb2d95fc25 100644 --- a/reactos/base/applications/network/ipconfig/ipconfig.c +++ b/reactos/base/applications/network/ipconfig/ipconfig.c @@ -183,17 +183,21 @@ LPTSTR GetConnectionType(LPTSTR lpClass) ConType = (LPTSTR)HeapAlloc(ProcessHeap, 0, dwDataSize); - if (ConType == NULL) - return NULL; - - if(RegQueryValueEx(hKey, - _T("Name"), - NULL, - &dwType, - (PBYTE)ConType, - &dwDataSize) != ERROR_SUCCESS) + if (ConType) { - ConType = NULL; + if(RegQueryValueEx(hKey, + _T("Name"), + NULL, + &dwType, + (PBYTE)ConType, + &dwDataSize) != ERROR_SUCCESS) + { + HeapFree(ProcessHeap, + 0, + ConType); + + ConType = NULL; + } } } } @@ -456,7 +460,9 @@ VOID ShowInfo(BOOL bAll) if (bAll) { - _tprintf(_T("\tDescription . . . . . . . . . . . : %s\n"), GetConnectionDescription(pAdapter->AdapterName)); + LPTSTR lpDesc = GetConnectionDescription(pAdapter->AdapterName); + _tprintf(_T("\tDescription . . . . . . . . . . . : %s\n"), lpDesc); + HeapFree(ProcessHeap, 0, lpDesc); _tprintf(_T("\tPhysical Address. . . . . . . . . : %s\n"), PrintMacAddr(pAdapter->Address)); if (pAdapter->DhcpEnabled) _tprintf(_T("\tDHCP Enabled. . . . . . . . . . . : Yes\n")); diff --git a/reactos/base/applications/network/ipconfig/lang/de-DE.rc b/reactos/base/applications/network/ipconfig/lang/de-DE.rc index e6d934d9db2..89c23c1bc31 100644 --- a/reactos/base/applications/network/ipconfig/lang/de-DE.rc +++ b/reactos/base/applications/network/ipconfig/lang/de-DE.rc @@ -12,12 +12,12 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_OTHER "Anderer Adapter" - IDS_ETH "Ethernet Adapter" - IDS_TOKEN "Token Ring Adapter" - IDS_FDDI "FDDI Adapter" - IDS_PPP "PPP Adapter" - IDS_LOOP "Loopback Adapter" - IDS_SLIP "SLIP Adapter" + IDS_ETH "Ethernet-Adapter" + IDS_TOKEN "Token-Ring-Adapter" + IDS_FDDI "FDDI-Adapter" + IDS_PPP "PPP-Adapter" + IDS_LOOP "Loopback-Adapter" + IDS_SLIP "SLIP-Adapter" END STRINGTABLE DISCARDABLE @@ -31,7 +31,7 @@ BEGIN \n \ wobei\n \ Adapter Verbindungsname\n \ - (wildcards * und ? sind mglich, siehe Beispiele)\n \ + (Wildcards * und ? sind mglich, siehe Beispiele)\n \ \n \ Optionen:\n \ /? Zeigt die Hilfe an.\n \ @@ -61,6 +61,6 @@ BEGIN > ipconfig /renew EL* ... Erneuert alle Verbindungen, deren Name\n \ mit EL beginnt.\n \ > ipconfig /release *Ver* ... Gibt alle passenden Verbindungen frei,\n \ - z.B. ""Lokale Vebindung 1"" oder\n \ - ""Lokale Vebindung 2""\n" + z.B. ""Lokale Verbindung 1"" oder\n \ + ""Lokale Verbindung 2""\n" END diff --git a/reactos/base/applications/network/telnet/src/ansiprsr.h b/reactos/base/applications/network/telnet/src/ansiprsr.h index a8396d29212..bd2ccc4dd19 100644 --- a/reactos/base/applications/network/telnet/src/ansiprsr.h +++ b/reactos/base/applications/network/telnet/src/ansiprsr.h @@ -1,5 +1,4 @@ -#ifndef __ANSIPRSR_H -#define __ANSIPRSR_H +#pragma once #include #include @@ -81,5 +80,3 @@ public: char* ParseBuffer(char* pszBuffer, char* pszBufferEnd); static int StripBuffer(char* pszBuffer, char* pszBufferEnd, int width); }; - -#endif diff --git a/reactos/base/applications/network/telnet/src/keytrans.h b/reactos/base/applications/network/telnet/src/keytrans.h index 21bb85afa0a..c4a49c12033 100644 --- a/reactos/base/applications/network/telnet/src/keytrans.h +++ b/reactos/base/applications/network/telnet/src/keytrans.h @@ -18,8 +18,7 @@ // DeleteKeyDef : Deletes a key def from the list // /////////////////////////////////////////////////////////////////// -#ifndef __KEYTRANS_H -#define __KEYTRANS_H +#pragma once #include "tkeydef.h" #include "tkeymap.h" @@ -93,5 +92,3 @@ private: int currentKeyMap, mainKeyMap; // AVS }; - -#endif // __KEYTRANS_H diff --git a/reactos/base/applications/network/telnet/src/stl_bids.h b/reactos/base/applications/network/telnet/src/stl_bids.h index 5d70f7fab07..59470ed8734 100644 --- a/reactos/base/applications/network/telnet/src/stl_bids.h +++ b/reactos/base/applications/network/telnet/src/stl_bids.h @@ -1,8 +1,7 @@ // This is the STL wrapper for classlib/arrays.h from Borland's web site // It has been modified to be compatible with vc++ (Paul Branann 5/7/98) -#ifndef STL_ARRAY_AS_VECTOR -#define STL_ARRAY_AS_VECTOR +#pragma once #ifdef _MSC_VER #pragma warning(disable: 4786) @@ -156,5 +155,3 @@ public: } }; - -#endif diff --git a/reactos/base/applications/network/telnet/src/tcharmap.h b/reactos/base/applications/network/telnet/src/tcharmap.h index cbc97e3dea6..caf6dee5f2f 100644 --- a/reactos/base/applications/network/telnet/src/tcharmap.h +++ b/reactos/base/applications/network/telnet/src/tcharmap.h @@ -1,8 +1,7 @@ // This is a simple class to handle character maps // (Paul Brannan 6/25/98) -#ifndef __TCHARMAP_H -#define __TCHARMAP_H +#pragma once class TCharmap { private: @@ -37,5 +36,3 @@ public: int enabled; }; - -#endif diff --git a/reactos/base/applications/network/telnet/src/tconsole.h b/reactos/base/applications/network/telnet/src/tconsole.h index 81e59894b69..b90cb304aa8 100644 --- a/reactos/base/applications/network/telnet/src/tconsole.h +++ b/reactos/base/applications/network/telnet/src/tconsole.h @@ -1,5 +1,4 @@ -#ifndef __TNPARSER_H -#define __TNPARSER_H +#pragma once #include "tnconfig.h" @@ -168,5 +167,3 @@ void saveScreen(CHAR_INFO* chiBuffer); void restoreScreen(CHAR_INFO* chiBuffer); CHAR_INFO* newBuffer(); void deleteBuffer(CHAR_INFO* chiBuffer); - -#endif diff --git a/reactos/base/applications/network/telnet/src/telnet.h b/reactos/base/applications/network/telnet/src/telnet.h index dbb2cdedc3b..3fd11f2ebc8 100644 --- a/reactos/base/applications/network/telnet/src/telnet.h +++ b/reactos/base/applications/network/telnet/src/telnet.h @@ -1,5 +1,4 @@ -#ifndef ___TELNET_H -#define ___TELNET_H +#pragma once /* * Copyright (c) 1983 Regents of the University of California. @@ -298,8 +297,3 @@ extern char *enctype_names[]; #define ENCTYPE_NAME(x) enctype_names[x] ////////////////////////////////////////////////////// ////////////////////////////////////////////////////// - - - -#endif - diff --git a/reactos/base/applications/network/telnet/src/tkeydef.h b/reactos/base/applications/network/telnet/src/tkeydef.h index c44a5bca164..49f7648e1f6 100644 --- a/reactos/base/applications/network/telnet/src/tkeydef.h +++ b/reactos/base/applications/network/telnet/src/tkeydef.h @@ -3,8 +3,7 @@ // - keeped in an array container // ///////////////////////////////////////////////////////// -#ifndef __TKEYDEF_H -#define __TKEYDEF_H +#pragma once #include @@ -67,5 +66,3 @@ public: DWORD GetCodeKey() { return vk_code; } }; - -#endif diff --git a/reactos/base/applications/network/telnet/src/tkeymap.h b/reactos/base/applications/network/telnet/src/tkeymap.h index 0501c20fbb9..82b70c9b898 100644 --- a/reactos/base/applications/network/telnet/src/tkeymap.h +++ b/reactos/base/applications/network/telnet/src/tkeymap.h @@ -1,5 +1,4 @@ -#ifndef __TKEYMAP_H -#define __TKEYMAP_H +#pragma once #include "tkeydef.h" @@ -35,5 +34,3 @@ struct KeyMap { ~KeyMap(); }; - -#endif diff --git a/reactos/base/applications/network/telnet/src/tmapldr.h b/reactos/base/applications/network/telnet/src/tmapldr.h index 4a80966f0cd..03b650da7ec 100644 --- a/reactos/base/applications/network/telnet/src/tmapldr.h +++ b/reactos/base/applications/network/telnet/src/tmapldr.h @@ -68,8 +68,7 @@ // // /////////////////////////////////////////////////////////////////// -#ifndef __TLOADMAP_H -#define __TLOADMAP_H +#pragma once #include "keytrans.h" #include "tcharmap.h" @@ -101,5 +100,3 @@ private: int LoadCharMap(string buf); }; - -#endif diff --git a/reactos/base/applications/network/telnet/src/tmouse.h b/reactos/base/applications/network/telnet/src/tmouse.h index fde6ec71828..3bb9d1f7981 100644 --- a/reactos/base/applications/network/telnet/src/tmouse.h +++ b/reactos/base/applications/network/telnet/src/tmouse.h @@ -1,5 +1,4 @@ -#ifndef __TMOUSE_H -#define __TMOUSE_H +#pragma once #include "tnclip.h" #include @@ -25,5 +24,3 @@ public: TMouse(Tnclip &RefClipboard); ~TMouse(); }; - -#endif diff --git a/reactos/base/applications/network/telnet/src/tnclass.h b/reactos/base/applications/network/telnet/src/tnclass.h index f29dfa3e87f..da204acd19f 100644 --- a/reactos/base/applications/network/telnet/src/tnclass.h +++ b/reactos/base/applications/network/telnet/src/tnclass.h @@ -1,5 +1,4 @@ -#ifndef __TNCLASS_H_ -#define __TNCLASS_H_ +#pragma once #include #include "tnconfig.h" @@ -69,6 +68,3 @@ private: void NewProcess(); // Paul Brannan 9/13/98 void SetLocalAddress(SOCKET s); }; - -#endif - diff --git a/reactos/base/applications/network/telnet/src/tnclip.h b/reactos/base/applications/network/telnet/src/tnclip.h index cd20c30e6ec..bca147f2b59 100644 --- a/reactos/base/applications/network/telnet/src/tnclip.h +++ b/reactos/base/applications/network/telnet/src/tnclip.h @@ -1,5 +1,4 @@ -#ifndef __TNCLIP_H -#define __TNCLIP_H +#pragma once #include #include "tnetwork.h" @@ -16,5 +15,3 @@ public: void Copy(HGLOBAL clipboard_data); void Paste(); }; - -#endif diff --git a/reactos/base/applications/network/telnet/src/tncon.h b/reactos/base/applications/network/telnet/src/tncon.h index d8b94142e1d..42d75db5dbc 100644 --- a/reactos/base/applications/network/telnet/src/tncon.h +++ b/reactos/base/applications/network/telnet/src/tncon.h @@ -1,5 +1,4 @@ -#ifndef __TNCON_H -#define __TNCON_H +#pragma once #include "tparams.h" #include "tnclip.h" @@ -30,5 +29,3 @@ BOOL WINAPI ControlEventHandler(DWORD); // Bryan Montgomery 10/14/98 void setTNetwork(TNetwork); - -#endif diff --git a/reactos/base/applications/network/telnet/src/tnconfig.h b/reactos/base/applications/network/telnet/src/tnconfig.h index c0d41ee2d5e..8a55627b5c8 100644 --- a/reactos/base/applications/network/telnet/src/tnconfig.h +++ b/reactos/base/applications/network/telnet/src/tnconfig.h @@ -6,8 +6,7 @@ // It does not store any information about the current settings, only default // or recommended settings. -#ifndef __TNCONFIG_H -#define __TNCONFIG_H +#pragma once // Ioannou 2 June 98: Borland needs them - quick hack #ifdef __BORLANDC__ @@ -207,5 +206,3 @@ private: }; extern TConfig ini; - -#endif diff --git a/reactos/base/applications/network/telnet/src/tnerror.h b/reactos/base/applications/network/telnet/src/tnerror.h index a7ada284c58..1432df5db89 100644 --- a/reactos/base/applications/network/telnet/src/tnerror.h +++ b/reactos/base/applications/network/telnet/src/tnerror.h @@ -1,5 +1,4 @@ -#ifndef __TNERROR_H -#define __TNERROR_H +#pragma once #ifndef __WINDOWS_H #include @@ -12,5 +11,3 @@ extern int Telnet_Redir; int printm(LPTSTR szModule, BOOL fSystem, DWORD dwMessageId, ...); void LogErrorConsole(LPTSTR szError); int printit(const char * it); - -#endif diff --git a/reactos/base/applications/network/telnet/src/tnetwork.h b/reactos/base/applications/network/telnet/src/tnetwork.h index bcc78c7012f..317ec2d11b9 100644 --- a/reactos/base/applications/network/telnet/src/tnetwork.h +++ b/reactos/base/applications/network/telnet/src/tnetwork.h @@ -1,8 +1,7 @@ // This is a simple class to handle socket connections // (Paul Brannan 6/15/98) -#ifndef __TNETWORK_H -#define __TNETWORK_H +#pragma once #include @@ -46,5 +45,3 @@ public: void do_naws(int width, int height); }; - -#endif diff --git a/reactos/base/applications/network/telnet/src/tnmain.h b/reactos/base/applications/network/telnet/src/tnmain.h index 526742c56b6..930b9b123ad 100644 --- a/reactos/base/applications/network/telnet/src/tnmain.h +++ b/reactos/base/applications/network/telnet/src/tnmain.h @@ -1,5 +1,4 @@ -#ifndef __TNMAIN_H -#define __TNMAIN_H +#pragma once #include #include @@ -15,5 +14,3 @@ struct cmdHistory { struct cmdHistory *next; struct cmdHistory *prev; }; - -#endif diff --git a/reactos/base/applications/network/telnet/src/tnmisc.h b/reactos/base/applications/network/telnet/src/tnmisc.h index 8216a864576..22bd2cda4fa 100644 --- a/reactos/base/applications/network/telnet/src/tnmisc.h +++ b/reactos/base/applications/network/telnet/src/tnmisc.h @@ -1,5 +1,4 @@ -#ifndef __TNMISC_H -#define __TNMISC_H +#pragma once // Process-related functions BOOL CreateHiddenConsoleProcess(LPCTSTR szChildName, PROCESS_INFORMATION* ppi, @@ -14,5 +13,3 @@ HWND TelnetGetConsoleWindow(void); bool SetIcon(HWND hConsoleWindow, HANDLE hIcon, LPARAM *pOldBIcon, LPARAM *pOldSIcon, const char *icondir); void ResetIcon(HWND hConsoleWindow, LPARAM oldBIcon, LPARAM oldSIcon); - -#endif diff --git a/reactos/base/applications/network/telnet/src/tparams.h b/reactos/base/applications/network/telnet/src/tparams.h index ffd4f8cbad9..efa088599ba 100644 --- a/reactos/base/applications/network/telnet/src/tparams.h +++ b/reactos/base/applications/network/telnet/src/tparams.h @@ -1,5 +1,4 @@ -#ifndef __THREADPARAMS -#define __THREADPARAMS +#pragma once #include "ttelhndl.h" @@ -20,5 +19,3 @@ public: NetParams p; TTelnetHandler &TelHandler; }; - -#endif diff --git a/reactos/base/applications/network/telnet/src/tparser.h b/reactos/base/applications/network/telnet/src/tparser.h index 143649f5687..7356d4b198c 100644 --- a/reactos/base/applications/network/telnet/src/tparser.h +++ b/reactos/base/applications/network/telnet/src/tparser.h @@ -10,8 +10,7 @@ // - An Init() function, which will re-initialize the parser when // necessary. -#ifndef __TPARSER_H -#define __TPARSER_H +#pragma once #include "tconsole.h" #include "keytrans.h" @@ -45,5 +44,3 @@ protected: TNetwork &Network; TCharmap &Charmap; }; - -#endif diff --git a/reactos/base/applications/network/telnet/src/tscript.h b/reactos/base/applications/network/telnet/src/tscript.h index f9626bf7059..1015b1f3ad8 100644 --- a/reactos/base/applications/network/telnet/src/tscript.h +++ b/reactos/base/applications/network/telnet/src/tscript.h @@ -1,5 +1,4 @@ -#ifndef __TSCRIPT_H -#define __TSCRIPT_H +#pragma once #include #include @@ -16,5 +15,3 @@ private: char *script; TNetwork &Network; }; - -#endif diff --git a/reactos/base/applications/network/telnet/src/tscroll.h b/reactos/base/applications/network/telnet/src/tscroll.h index 4261ca0f94c..8a982b29da6 100644 --- a/reactos/base/applications/network/telnet/src/tscroll.h +++ b/reactos/base/applications/network/telnet/src/tscroll.h @@ -1,5 +1,4 @@ -#ifndef __TSCROLL_H -#define __TSCROLL_H +#pragma once #include "tconsole.h" #include "tmouse.h" @@ -22,5 +21,3 @@ public: TScroller(TMouse &M, int size=20000); ~TScroller(); }; - -#endif diff --git a/reactos/base/applications/network/telnet/src/ttelhndl.h b/reactos/base/applications/network/telnet/src/ttelhndl.h index ad4ec627ebc..9879435f01e 100644 --- a/reactos/base/applications/network/telnet/src/ttelhndl.h +++ b/reactos/base/applications/network/telnet/src/ttelhndl.h @@ -1,5 +1,4 @@ -#ifndef __TTELHNDL_H -#define __TTELHNDL_H +#pragma once #include "tparser.h" #include "tnetwork.h" @@ -47,5 +46,3 @@ public: int get_term() {return iTermSet;} }; - -#endif diff --git a/reactos/base/applications/notepad/lang/de-DE.rc b/reactos/base/applications/notepad/lang/de-DE.rc index 2844639f8d9..eeb89058298 100644 --- a/reactos/base/applications/notepad/lang/de-DE.rc +++ b/reactos/base/applications/notepad/lang/de-DE.rc @@ -127,7 +127,7 @@ FONT 8, "MS Shell Dlg" CAPTION "Enkodierung" BEGIN COMBOBOX ID_ENCODING,54,0,156,80,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP -LTEXT "Enkodierung:",0x155,5,2,41,12 +LTEXT "Kodierung:",0x155,5,2,41,12 COMBOBOX ID_EOLN,54,18,156,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "Zeilenenden:",0x156,5,20,41,12 END @@ -161,7 +161,7 @@ END STRINGTABLE DISCARDABLE BEGIN - STRING_LICENSE, "Dieses Programm ist kostenlos; Sie knnen es frei verteilen mit od. ohne nderungen unter der GNU Lesser General Public License wie es von der Free Software Foundation verffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine sptere Version (ihrer Wahl).\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." + STRING_LICENSE, "Dieses Programm ist kostenlos; Sie knnen es frei verteilen mit od. ohne nderungen unter der GNU Lesser General Public License, wie es von der Free Software Foundation verffentlicht wurde; entweder Version 2.1 der Lizenz, oder eine sptere Version (ihrer Wahl).\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA." END STRINGTABLE DISCARDABLE @@ -183,7 +183,7 @@ STRING_UNTITLED, "(unbenannt)" STRING_ALL_FILES, "Alle Dateien (*.*)" STRING_TEXT_FILES_TXT, "Textdateien (*.txt)" -STRING_TOOLARGE, "Die Datei '%s' ist zu gro fr den Editor\n \ +STRING_TOOLARGE, "Die Datei '%s' ist zu gro fr den Editor.\n \ Benutzen Sie bitte einen anderen Editor, um diese Datei zu bearbeiten." STRING_NOTEXT, "Sie haben keinen Text eingegeben, der \ gespeichert\n werden knnte. Geben Sie Text ein, und versuchen Sie es \ diff --git a/reactos/base/applications/paint/lang/de-DE.rc b/reactos/base/applications/paint/lang/de-DE.rc index d4a31e475b1..7c56d03cb51 100644 --- a/reactos/base/applications/paint/lang/de-DE.rc +++ b/reactos/base/applications/paint/lang/de-DE.rc @@ -193,7 +193,7 @@ BEGIN IDS_TOOLTIP9, "Sprhdose" IDS_TOOLTIP10, "Text" IDS_TOOLTIP11, "Linie" - IDS_TOOLTIP12, "Bezier-Kurve" + IDS_TOOLTIP12, "Bzier-Kurve" IDS_TOOLTIP13, "Rechteck" IDS_TOOLTIP14, "Polygon" IDS_TOOLTIP15, "Ellipse" diff --git a/reactos/base/applications/paint/lang/pl-PL.rc b/reactos/base/applications/paint/lang/pl-PL.rc index 3449a3add71..b37039a4def 100644 --- a/reactos/base/applications/paint/lang/pl-PL.rc +++ b/reactos/base/applications/paint/lang/pl-PL.rc @@ -49,7 +49,7 @@ BEGIN MENUITEM SEPARATOR POPUP "Powikszenie" BEGIN - POPUP "User defined" + POPUP "Zdefiniowane przez uytkownika" BEGIN MENUITEM "12,5%", IDM_VIEWZOOM125 MENUITEM "25%", IDM_VIEWZOOM25 @@ -60,8 +60,8 @@ BEGIN MENUITEM "800%", IDM_VIEWZOOM800 END MENUITEM SEPARATOR - MENUITEM "Show grid", IDM_VIEWSHOWGRID - MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE + MENUITEM "Poka siatk", IDM_VIEWSHOWGRID + MENUITEM "Poka miniatur", IDM_VIEWSHOWMINIATURE END MENUITEM "Peny ekran\tCtrl+F", IDM_VIEWFULLSCREEN END @@ -181,7 +181,7 @@ BEGIN IDS_INFOTEXT, "Paint dla ReactOS jest dostpny na licencji GNU Lesser General Public License (LGPL) wersja 3 (www.gnu.org)" IDS_SAVEPROMPTTEXT, "Czy chcesz zapisa zmiany do %s?" IDS_DEFAULTFILENAME, "Nienazwany.bmp" - IDS_MINIATURETITLE, "Miniature" + IDS_MINIATURETITLE, "Miniatura" IDS_TOOLTIP1, "Zaznaczenie dowolne" IDS_TOOLTIP2, "Zaznaczenie" IDS_TOOLTIP3, "Gumka" @@ -190,16 +190,16 @@ BEGIN IDS_TOOLTIP6, "Przyblienie" IDS_TOOLTIP7, "Owek" IDS_TOOLTIP8, "Pdzel" - IDS_TOOLTIP9, "Spray" + IDS_TOOLTIP9, "Aerograf" IDS_TOOLTIP10, "Tekst" IDS_TOOLTIP11, "Linia" IDS_TOOLTIP12, "Krzywa Beziera" IDS_TOOLTIP13, "Prostokt" - IDS_TOOLTIP14, "Polygon" + IDS_TOOLTIP14, "Wielokt" IDS_TOOLTIP15, "Elipsa" IDS_TOOLTIP16, "Zaokrglony Prostokt" IDS_OPENFILTER, "Pliki Bitmapy (*.bmp;*.dib)\1*.bmp;*.dib\1Wszystkie pliki (*.*)\1*.*\1" IDS_SAVEFILTER, "Bitmapa 24 bit (*.bmp;*.dib)\1*.bmp;*.dib\1" - IDS_FILESIZE, "%d bytes" - IDS_PRINTRES, "%d x %d pixels per meter" + IDS_FILESIZE, "%d bajtw" + IDS_PRINTRES, "%d x %d pikseli na metr" END diff --git a/reactos/base/applications/paint/mouse.c b/reactos/base/applications/paint/mouse.c index 383d5d9016e..4f5c13031fd 100644 --- a/reactos/base/applications/paint/mouse.c +++ b/reactos/base/applications/paint/mouse.c @@ -251,15 +251,18 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg) resetToU1(); if ((rectSel_src[2] != 0) && (rectSel_src[3] != 0)) { - DeleteObject(SelectObject - (hSelDC, hSelBm = - (HBITMAP) CreateDIBWithProperties(rectSel_src[2], rectSel_src[3]))); DeleteObject(hSelMask); + hSelMask = CreateBitmap(rectSel_src[2], rectSel_src[3], 1, 1, NULL); + DeleteObject(SelectObject(hSelDC, hSelMask)); + Rect(hSelDC, 0, 0, rectSel_src[2], rectSel_src[3], 0x00ffffff, 0x00ffffff, 1, 2); + SelectObject(hSelDC, hSelBm = CreateDIBWithProperties(rectSel_src[2], rectSel_src[3])); + resetToU1(); BitBlt(hSelDC, 0, 0, rectSel_src[2], rectSel_src[3], hDrawingDC, rectSel_src[0], rectSel_src[1], SRCCOPY); Rect(hdc, rectSel_src[0], rectSel_src[1], rectSel_src[0] + rectSel_src[2], rectSel_src[1] + rectSel_src[3], bgColor, bgColor, 0, TRUE); newReversible(); + placeSelWin(); ShowWindow(hSelection, SW_SHOW); } diff --git a/reactos/base/applications/rapps/CreateCabFile.bat b/reactos/base/applications/rapps/CreateCabFile.bat index b53f1c09593..f7cf48e07e6 100644 --- a/reactos/base/applications/rapps/CreateCabFile.bat +++ b/reactos/base/applications/rapps/CreateCabFile.bat @@ -1 +1 @@ -c:\cabman.exe -M raw -S rappmgr.cab \rapps\*.txt +..\..\..\output-i386\tools\cabman\cabman.exe -M raw -S rappmgr.cab rapps\*.txt diff --git a/reactos/base/applications/rapps/lang/de-DE.rc b/reactos/base/applications/rapps/lang/de-DE.rc index 1ead4abf906..b48f0ea2229 100644 --- a/reactos/base/applications/rapps/lang/de-DE.rc +++ b/reactos/base/applications/rapps/lang/de-DE.rc @@ -42,7 +42,7 @@ BEGIN MENUITEM "&Deinstallieren", ID_UNINSTALL MENUITEM "&ndern", ID_MODIFY MENUITEM SEPARATOR - MENUITEM "&Remove from Registry", ID_REGREMOVE + MENUITEM "Aus &Registry entfernen", ID_REGREMOVE MENUITEM SEPARATOR MENUITEM "&Aktualisieren", ID_REFRESH END @@ -71,16 +71,16 @@ END IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE 0, 0, 216, 97 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Program installation" +CAPTION "Programminstallation" FONT 8, "MS Shell Dlg" BEGIN LTEXT "...", IDC_INSTALL_TEXT, 4, 5, 209, 35 - AUTORADIOBUTTON "&Install from a disk (CD or DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP - AUTORADIOBUTTON "&Download and install", IDC_DOWNLOAD_INSTALL, 10, 59, 197, 11, NOT WS_TABSTOP + AUTORADIOBUTTON "&Installation von einem Datentrger (CD oder DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP + AUTORADIOBUTTON "Herunterla&den und installieren", IDC_DOWNLOAD_INSTALL, 10, 59, 197, 11, NOT WS_TABSTOP PUSHBUTTON "OK", IDOK, 86, 78, 60, 14 - PUSHBUTTON "Cancel", IDCANCEL, 150, 78, 60, 14 + PUSHBUTTON "Abbrechen", IDCANCEL, 150, 78, 60, 14 END IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76 @@ -98,7 +98,7 @@ STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME CAPTION "ber" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "ReactOS Anwendungsmanager\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39 + LTEXT "ReactOS-Anwendungsmanager\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39 PUSHBUTTON "Schlieen", IDOK, 133, 46, 50, 14 ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30 END @@ -124,14 +124,14 @@ STRINGTABLE DISCARDABLE BEGIN IDS_INFO_VERSION "\nVersion: " IDS_INFO_DESCRIPTION "\nBeschreibung: " - IDS_INFO_PUBLISHER "\nPublisher: " + IDS_INFO_PUBLISHER "\nVertrieb: " IDS_INFO_HELPLINK "\nHilfe-Link: " IDS_INFO_HELPPHONE "\nHilfe-Telefonnr.: " IDS_INFO_README "\nReadme: " IDS_INFO_REGOWNER "\nregistrierter Eigentmer: " IDS_INFO_PRODUCTID "\nProdukt-ID: " - IDS_INFO_CONTACT "\nKontaktt: " - IDS_INFO_UPDATEINFO "\nUpdate Information: " + IDS_INFO_CONTACT "\nKontakt: " + IDS_INFO_UPDATEINFO "\nUpdate-Informationen: " IDS_INFO_INFOABOUT "\nInformation ber: " IDS_INFO_COMMENTS "\nKommentare: " IDS_INFO_INSTLOCATION "\nInstallationsort: " @@ -171,23 +171,23 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_APPTITLE "ReactOS Anwendungsmanager" + IDS_APPTITLE "ReactOS-Anwendungsmanager" IDS_SEARCH_TEXT "Suche..." IDS_INSTALL "Installieren" IDS_UNINSTALL "Deinstallieren" IDS_MODIFY "ndern" IDS_APPS_COUNT "Anzahl der Anwendungen: %d" - IDS_WELCOME_TITLE "Willkommen im ReactOS Anwendungsmanager!\n\n" - IDS_WELCOME_TEXT "Whlen Sie links eine Kategorie und dann eine Anwendung um sie zu installieren oder zu deinstallieren.\nReactOS Webseite: " + IDS_WELCOME_TITLE "Willkommen im ReactOS-Anwendungsmanager!\n\n" + IDS_WELCOME_TEXT "Whlen Sie links eine Kategorie und dann eine Anwendung um sie zu installieren oder zu deinstallieren.\nReactOS-Webseite: " IDS_WELCOME_URL "http://www.reactos.org" IDS_INSTALLED "Installiert" IDS_AVAILABLEFORINST "Zur Installation verfgbar" - IDS_UPDATES "Updates" + IDS_UPDATES "Aktualisierungen" IDS_APPLICATIONS "Anwendungen" - IDS_CHOOSE_FOLDER_TEXT "Choose a folder which will be used for downloading of programs:" - IDS_CHOOSE_FOLDER_ERROR "You have specified a nonexistent folder!" - IDS_USER_NOT_ADMIN "You should be administrator for start ""ReactOS Applications Manager""!" - IDS_APP_REG_REMOVE "Are you sure you want to delete the data on the installed program from the registry?" - IDS_INFORMATION "Information" - IDS_UNABLE_TO_REMOVE "Unable to remove data on the program from the registry!" + IDS_CHOOSE_FOLDER_TEXT "Whlen Sie ein Verzeichnis aus, das zum Herunterladen verwendet werden soll:" + IDS_CHOOSE_FOLDER_ERROR "Sie haben ein nicht existentes Verzeichnis angegeben!" + IDS_USER_NOT_ADMIN "Sie mssen als Administrator angemeldet sein, um den Anwendungsmanager zu starten!" + IDS_APP_REG_REMOVE "Sind Sie sich sicher, dass Sie die Daten dieses Programms aus der Registry entfernen mchten?" + IDS_INFORMATION "Informationen" + IDS_UNABLE_TO_REMOVE "Konnte die Daten nicht aus der Registry lschen!" END diff --git a/reactos/base/applications/rapps/lang/pl-PL.rc b/reactos/base/applications/rapps/lang/pl-PL.rc index fc79e8a205b..60fd20b7530 100644 --- a/reactos/base/applications/rapps/lang/pl-PL.rc +++ b/reactos/base/applications/rapps/lang/pl-PL.rc @@ -16,7 +16,7 @@ BEGIN MENUITEM "&Odinstaluj",ID_UNINSTALL MENUITEM "&Modyfikuj", ID_MODIFY MENUITEM SEPARATOR - MENUITEM "&Remove from Registry", ID_REGREMOVE + MENUITEM "&Usu z rejestru", ID_REGREMOVE MENUITEM SEPARATOR MENUITEM "O&dwie", ID_REFRESH END @@ -44,7 +44,7 @@ BEGIN MENUITEM "&odinstaluj", ID_UNINSTALL MENUITEM "&Modyfikuj", ID_MODIFY MENUITEM SEPARATOR - MENUITEM "&Remove from Registry", ID_REGREMOVE + MENUITEM "&Usu z rejestru", ID_REGREMOVE MENUITEM SEPARATOR MENUITEM "&Odwie", ID_REFRESH END @@ -52,37 +52,37 @@ END IDD_SETTINGS_DIALOG DIALOGEX DISCARDABLE 0, 0, 250, 144 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Settings" +CAPTION "Ustawienia" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "General", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Save window position", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Update the list of accessible programs at start", IDC_UPDATE_AVLIST, 15, 29, 219, 12 - AUTOCHECKBOX "&Log of installation and removal of programs", IDC_LOG_ENABLED, 15, 46, 219, 12 + GROUPBOX "Oglne", -1, 4, 2, 240, 61 + AUTOCHECKBOX "&Zapisz pozycj okna", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 + AUTOCHECKBOX "&Aktualizuj list dostpnych programw przy kadym uruchomieniu", IDC_UPDATE_AVLIST, 15, 29, 219, 12 + AUTOCHECKBOX "Zap&isuj dziennik instalacji i usuwania programw", IDC_LOG_ENABLED, 15, 46, 219, 12 - GROUPBOX "Downloading", -1, 4, 65, 240, 51 - LTEXT "Folder for downloadings:", -1, 16, 75, 100, 9 + GROUPBOX "Pobieranie", -1, 4, 65, 240, 51 + LTEXT "Katalog dla pobranych plikw:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP - PUSHBUTTON "&Choose", IDC_CHOOSE, 187, 85, 50, 14 - AUTOCHECKBOX "&Delete installers of programs after installation", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12 + PUSHBUTTON "&Wybierz", IDC_CHOOSE, 187, 85, 50, 14 + AUTOCHECKBOX "&Usu instalatory programw po ich zainstalowaniu", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12 - PUSHBUTTON "Default", IDC_DEFAULT_SETTINGS, 8, 124, 60, 14 + PUSHBUTTON "Domylne", IDC_DEFAULT_SETTINGS, 8, 124, 60, 14 PUSHBUTTON "OK", IDOK, 116, 124, 60, 14 - PUSHBUTTON "Cancel", IDCANCEL, 181, 124, 60, 14 + PUSHBUTTON "Anuluj", IDCANCEL, 181, 124, 60, 14 END IDD_INSTALL_DIALOG DIALOGEX DISCARDABLE 0, 0, 216, 97 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Program installation" +CAPTION "Instalacja programu" FONT 8, "MS Shell Dlg" BEGIN LTEXT "...", IDC_INSTALL_TEXT, 4, 5, 209, 35 - AUTORADIOBUTTON "&Install from a disk (CD or DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP - AUTORADIOBUTTON "&Download and install", IDC_DOWNLOAD_INSTALL, 10, 59, 197, 11, NOT WS_TABSTOP + AUTORADIOBUTTON "&Zainstaluj z dysku (CD or DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP + AUTORADIOBUTTON "&Pobierz i zainstaluj", IDC_DOWNLOAD_INSTALL, 10, 59, 197, 11, NOT WS_TABSTOP PUSHBUTTON "OK", IDOK, 86, 78, 60, 14 - PUSHBUTTON "Cancel", IDCANCEL, 150, 78, 60, 14 + PUSHBUTTON "Anuluj", IDCANCEL, 150, 78, 60, 14 END IDD_DOWNLOAD_DIALOG DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 0, 0, 220, 76 @@ -101,7 +101,7 @@ CAPTION "O programie" FONT 8, "MS Shell Dlg" BEGIN LTEXT "ReactOS Applications Manager\nCopyright (C) 2009\nby Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39 - PUSHBUTTON "Close", IDOK, 133, 46, 50, 14 + PUSHBUTTON "Zamknij", IDOK, 133, 46, 50, 14 ICON IDI_MAIN, IDC_STATIC, 10, 10, 7, 30 END @@ -139,7 +139,7 @@ BEGIN IDS_INFO_INSTLOCATION "\nScieka instalacji: " IDS_INFO_INSTALLSRC "\nrdo instalacji: " IDS_INFO_UNINSTALLSTR "\nKomenda deinstalacji: " - IDS_INFO_MODIFYPATH "\nModify Path: " + IDS_INFO_MODIFYPATH "\nModyfikacja cieki instalacji: " IDS_INFO_INSTALLDATE "\nData instalacji: " END @@ -186,10 +186,10 @@ BEGIN IDS_AVAILABLEFORINST "Dostpne" IDS_UPDATES "Uaktualnienia" IDS_APPLICATIONS "Aplikacje" - IDS_CHOOSE_FOLDER_TEXT "Choose a folder which will be used for downloading of programs:" - IDS_CHOOSE_FOLDER_ERROR "You have specified a nonexistent folder!" - IDS_USER_NOT_ADMIN "You should be administrator for start ""ReactOS Applications Manager""!" - IDS_APP_REG_REMOVE "Are you sure you want to delete the data on the installed program from the registry?" - IDS_INFORMATION "Information" - IDS_UNABLE_TO_REMOVE "Unable to remove data on the program from the registry!" + IDS_CHOOSE_FOLDER_TEXT "Wybierz katalog w ktrym bda zapisywane pobrane programy:" + IDS_CHOOSE_FOLDER_ERROR "Wybrae nieistniejcy katalog!" + IDS_USER_NOT_ADMIN "Musisz mie uprawnienia administratora aby uruchomi ""ReactOS Applications Manager""!" + IDS_APP_REG_REMOVE "Czy na pewno chcesz usun wpis tego programu z rejestru?" + IDS_INFORMATION "Informacja" + IDS_UNABLE_TO_REMOVE "Nie mona byo usun wpisu z rejestru!" END diff --git a/reactos/base/applications/rapps/rapps.h b/reactos/base/applications/rapps/rapps.h index 09a64c273a6..cba76db823a 100644 --- a/reactos/base/applications/rapps/rapps.h +++ b/reactos/base/applications/rapps/rapps.h @@ -1,5 +1,4 @@ -#ifndef _RAPPS_H__ -#define _RAPPS_H__ +#pragma once #include #include @@ -12,7 +11,7 @@ #include "resource.h" -#define APPLICATION_DATEBASE_URL L"http://opendn.org/rappmgr.cab" +#define APPLICATION_DATEBASE_URL L"http://svn.reactos.org/packages/rappmgr.cab" #define SPLIT_WIDTH 4 #define MAX_STR_LEN 256 @@ -185,5 +184,3 @@ VOID ToolBarOnGetDispInfo(LPTOOLTIPTEXT lpttt); extern HWND hTreeView; BOOL CreateTreeView(HWND hwnd); HTREEITEM TreeViewAddItem(HTREEITEM hParent, LPWSTR lpText, INT Image, INT SelectedImage, LPARAM lParam); - -#endif /* _RAPPS_H__ */ diff --git a/reactos/base/applications/rapps/rapps/firefox3.txt b/reactos/base/applications/rapps/rapps/firefox3.txt index d4d2272179a..e6051802e00 100644 --- a/reactos/base/applications/rapps/rapps/firefox3.txt +++ b/reactos/base/applications/rapps/rapps/firefox3.txt @@ -2,41 +2,41 @@ [Section] Name = Mozilla Firefox 3.0 -Version = 3.0.17 +Version = 3.0.18 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Web Browsers out there. -Size = 7.1M +Size = 7.2M Category = 5 URLSite = http://www.mozilla.com/en-US/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/en-US/Firefox%20Setup%203.0.17.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/en-US/Firefox%20Setup%203.0.18.exe CDPath = none [Section.0407] Description = Der populärste und einer der besten freien Webbrowser. -Size = 6.9M +Size = 7.0M URLSite = http://www.mozilla-europe.org/de/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/de/Firefox%20Setup%203.0.17.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/de/Firefox%20Setup%203.0.18.exe [Section.040a] Description = El más popular y uno de los mejores navegadores web gratuitos que hay. Size = 7.0M URLSite = http://www.mozilla-europe.org/es/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/es-ES/Firefox%20Setup%203.0.17.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/es-ES/Firefox%20Setup%203.0.18.exe [Section.0414] Description = Mest populære og best også gratis nettleserene der ute. Size = 6.9M URLSite = http://www.mozilla-europe.org/no/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/nb-NO/Firefox%20Setup%203.0.17.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/nb-NO/Firefox%20Setup%203.0.18.exe [Section.0415] Description = Najpopularniejsza i jedna z najlepszych darmowych przeglądarek internetowych. Size = 7.8M URLSite = http://www.mozilla-europe.org/pl/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/pl/Firefox%20Setup%203.0.17.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/pl/Firefox%20Setup%203.0.18.exe [Section.0419] Description = Один из самых популярных и лучших бесплатных браузеров. Size = 7.4M URLSite = http://www.mozilla-europe.org/ru/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/ru/Firefox%20Setup%203.0.17.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/ru/Firefox%20Setup%203.0.18.exe diff --git a/reactos/base/applications/rapps/rapps/mirandaim.txt b/reactos/base/applications/rapps/rapps/mirandaim.txt index a447fcecab9..0fff6a4ea04 100644 --- a/reactos/base/applications/rapps/rapps/mirandaim.txt +++ b/reactos/base/applications/rapps/rapps/mirandaim.txt @@ -2,13 +2,13 @@ [Section] Name = Miranda IM -Version = 0.8.12 +Version = 0.8.18 Licence = GPL Description = Open source multiprotocol instant messaging application - May not work completely. Size = 1.6MB Category = 5 URLSite = http://www.miranda-im.org/ -URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.12-unicode.exe +URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.18-unicode.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/openoffice2.4.txt b/reactos/base/applications/rapps/rapps/openoffice2.4.txt index 81cae28edf9..d68f92e3418 100644 --- a/reactos/base/applications/rapps/rapps/openoffice2.4.txt +++ b/reactos/base/applications/rapps/rapps/openoffice2.4.txt @@ -8,23 +8,23 @@ Description = THE Open Source Office Suite. Size = 127MB Category = 6 URLSite = http://www.openoffice.org/ -URLDownload = http://ftp.plusline.de/OpenOffice/stable/2.4.3/OOo_2.4.3_Win32Intel_install_en-US.exe +URLDownload = ftp://archive.services.openoffice.org/pub/openoffice-archive/stable/2.4.3/OOo_2.4.3_Win32Intel_install_en-US.exe CDPath = none [Section.0407] Description = DIE Open Source Office Suite. URLSite = http://de.openoffice.org/ Size = 114.2MB -URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/de/2.4.3/OOo_2.4.3_Win32Intel_install_de.exe +URLDownload = ftp://archive.services.openoffice.org/pub/openoffice-archive/localized/de/2.4.3/OOo_2.4.3_Win32Intel_install_de.exe [Section.040a] Description = La suite de ofimática de código abierto. URLSite = http://es.openoffice.org/ Size = 113.9MB -URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/es/2.4.3/OOo_2.4.3_Win32Intel_install_es.exe +URLDownload = ftp://archive.services.openoffice.org/pub/openoffice-archive/localized/es/2.4.3/OOo_2.4.3_Win32Intel_install_es.exe [Section.0415] URLSite = http://pl.openoffice.org/ Description = Otwarty pakiet biurowy. -URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/pl/2.4.2/OOo_2.4.2_Win32Intel_install_pl.exe +URLDownload = ftp://archive.services.openoffice.org/pub/openoffice-archive/localized/pl/2.4.2/OOo_2.4.2_Win32Intel_install_pl.exe Size = 113.9M diff --git a/reactos/base/applications/rapps/rapps/openoffice3.0.txt b/reactos/base/applications/rapps/rapps/openoffice3.0.txt index ebfc63ede1c..b9ee71bd025 100644 --- a/reactos/base/applications/rapps/rapps/openoffice3.0.txt +++ b/reactos/base/applications/rapps/rapps/openoffice3.0.txt @@ -2,30 +2,30 @@ [Section] Name = OpenOffice 3.0 -Version = 3.1.1 +Version = 3.2.0 Licence = LGPL Description = THE Open Source Office Suite. -Size = 134.3MB +Size = 135.4MB Category = 6 URLSite = http://www.openoffice.org/ -URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/stable/3.1.1/OOo_3.1.1_Win32Intel_install_en-US.exe +URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/stable/3.2.0/OOo_3.2.0_Win32Intel_install_en-US.exe CDPath = none [Section.0407] Description = DIE Open Source Office Suite. URLSite = http://de.openoffice.org/ -Size = 142.9MB -URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/de/3.1.1/OOo_3.1.1_Win32Intel_install_de.exe +Size = 145.8MB +URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/de/3.2.0/OOo_3.2.0_Win32Intel_install_de.exe [Section.040a] Description = La suite de ofimática de código abierto. URLSite = http://es.openoffice.org/ Version = 3.1.0 -Size = 130.0MB -URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/es/3.1.0/OOo_3.1.0_Win32Intel_install_es.exe +Size = 119.4MB +URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/es/3.2.0/OOo_3.2.0_Win32Intel_install_es.exe [Section.0415] Description = Otwarty pakiet biurowy. URLSite = http://pl.openoffice.org/ -Size = 147.1MB -URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/pl/3.1.1/OOo_3.1.1_Win32Intel_install_pl.exe +Size = 133.2MB +URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/pl/3.2.0/OOo_3.2.0_Win32Intel_install_pl.exe diff --git a/reactos/base/applications/rapps/rapps/openttd.txt b/reactos/base/applications/rapps/rapps/openttd.txt index 6220e8ada93..dfc94a95e43 100644 --- a/reactos/base/applications/rapps/rapps/openttd.txt +++ b/reactos/base/applications/rapps/rapps/openttd.txt @@ -2,13 +2,13 @@ [Section] Name = OpenTTD -Version = 0.7.3 +Version = 0.7.5 Licence = GPL v2 Description = Open Source clone of the "Transport Tycoon Deluxe" game engine. You need a copy of Transport Tycoon. Size = 2.9MB Category = 4 URLSite = http://www.openttd.org/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/openttd/openttd-0.7.3-windows-win32.exe +URLDownload = http://binaries.openttd.org/releases/0.7.5/openttd-0.7.5-windows-win32.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/opera.txt b/reactos/base/applications/rapps/rapps/opera.txt index 148e79bc9e4..44e49cc61ac 100644 --- a/reactos/base/applications/rapps/rapps/opera.txt +++ b/reactos/base/applications/rapps/rapps/opera.txt @@ -2,13 +2,13 @@ [Section] Name = Opera -Version = 10.10 +Version = 10.51 Licence = Freeware Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client. Size = 11.0M Category = 5 URLSite = http://www.opera.com/ -URLDownload = http://ftp.opera.com/pub/opera/win/1010/int/Opera_1010_in_Setup.exe +URLDownload = http://get4.opera.com/pub/opera/win/1051/int/Opera_1051_int_Setup.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/rosbe.txt b/reactos/base/applications/rapps/rapps/rosbe.txt index 843f75df7e6..7d7918b5c78 100644 --- a/reactos/base/applications/rapps/rapps/rosbe.txt +++ b/reactos/base/applications/rapps/rapps/rosbe.txt @@ -2,17 +2,17 @@ [Section] Name = ReactOS Build Environment -Version = 1.4.5 +Version = 1.5 Licence = GPL Description = Allows you to build the ReactOS Source. For more instructions see ReactOS wiki. -Size = 14.9MB +Size = 13.5MB Category = 7 URLSite = http://reactos.org/wiki/Build_Environment/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-1.4.5.exe +URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-1.5.exe CDPath = none [Section.0407] -Description = Erlaubt es Ihnen ReactOS aus den Quellen zu bauen. Im ReactOS-Wiki finden Sie dazu nähere Anweisungen. +Description = Erlaubt es Ihnen den ReactOS Source Code zu kompilieren. Im ReactOS-Wiki finden Sie dazu nähere Anweisungen. [Section.040a] Description = Te permite compilar el código de ReactOS. Para más instrucciones consulta la wiki de ReactOS. diff --git a/reactos/base/applications/rapps/rapps/rosbeamd64.txt b/reactos/base/applications/rapps/rapps/rosbeamd64.txt new file mode 100644 index 00000000000..c68b47af04f --- /dev/null +++ b/reactos/base/applications/rapps/rapps/rosbeamd64.txt @@ -0,0 +1,21 @@ +; UTF-8 + +[Section] +Name = ReactOS Build Environment AMD64 Addon +Version = 1.3 +Licence = GPL +Description = Allows you to build the ReactOS AMD64 Source. For more instructions see ReactOS wiki. +Size = 15.8MB +Category = 7 +URLSite = http://reactos.org/wiki/Build_Environment/ +URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE64-1.3.exe +CDPath = none + +[Section.0407] +Description = Erlaubt es Ihnen den ReactOS AMD64 Source Code zu kompilieren. Im ReactOS-Wiki finden Sie dazu nähere Anweisungen. + +[Section.040a] +Description = Te permite compilar el código de ReactOS AMD64. Para más instrucciones consulta la wiki de ReactOS. + +[Section.0415] +Description = Pozwala zbudować obraz płyty ReactOS AMD64 ze źródeł. Więcej informacji na Wiki ReactOS. diff --git a/reactos/base/applications/rapps/rapps/rosbearm.txt b/reactos/base/applications/rapps/rapps/rosbearm.txt new file mode 100644 index 00000000000..61596d78dee --- /dev/null +++ b/reactos/base/applications/rapps/rapps/rosbearm.txt @@ -0,0 +1,21 @@ +; UTF-8 + +[Section] +Name = ReactOS Build Environment ARM Addon +Version = 1.0 +Licence = GPL +Description = Allows you to build the ReactOS ARM Source. For more instructions see ReactOS wiki. +Size = 11.1MB +Category = 7 +URLSite = http://reactos.org/wiki/Build_Environment/ +URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-ARM-1.0.exe +CDPath = none + +[Section.0407] +Description = Erlaubt es Ihnen den ReactOS ARM Source Code zu kompilieren. Im ReactOS-Wiki finden Sie dazu nähere Anweisungen. + +[Section.040a] +Description = Te permite compilar el código de ReactOS ARM. Para más instrucciones consulta la wiki de ReactOS. + +[Section.0415] +Description = Pozwala zbudować obraz płyty ReactOS ARM ze źródeł. Więcej informacji na Wiki ReactOS. diff --git a/reactos/base/applications/rapps/rapps/sambatng.txt b/reactos/base/applications/rapps/rapps/sambatng.txt index 4377863c7ac..6cf579a9372 100644 --- a/reactos/base/applications/rapps/rapps/sambatng.txt +++ b/reactos/base/applications/rapps/rapps/sambatng.txt @@ -2,10 +2,10 @@ [Section] Name = Samba TNG -Version = 0.4.99cvs +Version = 0.5-RC1 Licence = GPL Description = This tool allows you to access your Windows shared folders/printers with ReactOS. -Size = 1MB +Size = 2.1MB Category = 5 URLSite = http://samba-tng.org/ URLDownload = http://svn.reactos.org/packages/samba-tng.exe diff --git a/reactos/base/applications/rapps/rapps/scite.txt b/reactos/base/applications/rapps/rapps/scite.txt index 0ec430fe396..fc3d9d50cca 100644 --- a/reactos/base/applications/rapps/rapps/scite.txt +++ b/reactos/base/applications/rapps/rapps/scite.txt @@ -2,13 +2,13 @@ [Section] Name = SciTE -Version = 2.01 +Version = 2.03 Licence = Freeware Description = SciTE is a SCIntilla based Text Editor. Originally built to demonstrate Scintilla, it has grown to be a generally useful editor with facilities for building and running programs. Size = 0.6M Category = 7 URLSite = http://www.scintilla.org/ -URLDownload = http://fastbull.dl.sourceforge.net/sourceforge/scintilla/Sc201.exe +URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc203.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/seamonkey.txt b/reactos/base/applications/rapps/rapps/seamonkey.txt index 69a43d51e90..9c980d30b65 100644 --- a/reactos/base/applications/rapps/rapps/seamonkey.txt +++ b/reactos/base/applications/rapps/rapps/seamonkey.txt @@ -2,31 +2,31 @@ [Section] Name = Mozilla SeaMonkey -Version = 2.0.2 +Version = 2.0.3 Licence = MPL/GPL/LGPL Description = Mozilla Suite is alive. This is the one and only Browser, Mail, Chat, and Composer bundle you will ever need. -Size = 10.1MB +Size = 10.0MB Category = 5 URLSite = http://www.seamonkey-project.org/ -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.2/win32/en-US/SeaMonkey%20Setup%202.0.2.exe +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/en-US/SeaMonkey%20Setup%202.0.3.exe CDPath = none [Section.0407] Description = Mozilla Suite lebt. Dies ist das einzige Browser-, Mail-, Chat- and Composerwerkzeug-Bundle welches Sie benötigen. -Size = 10.0MB -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.2/win32/de/SeaMonkey%20Setup%202.0.2.exe +Size = 10.1MB +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/de/SeaMonkey%20Setup%202.0.3.exe [Section.040a] Description = La suite de Mozilla está viva. Es el primero y único navegador web, gestor de correo, lector de noticias, Chat y editor HTML que necesitarás. Size = 10.0MB -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.2/win32/es-ES/SeaMonkey%20Setup%202.0.2.exe +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/es-ES/SeaMonkey%20Setup%202.0.3.exe [Section.0415] Description = Pakiet Mozilla żyje. W zestawie: przeglądarka, klient poczty, IRC oraz Edytor HTML - wszystko, czego potrzebujesz. Size = 10.8MB -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.2/win32/pl/SeaMonkey%20Setup%202.0.2.exe +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/pl/SeaMonkey%20Setup%202.0.3.exe [Section.0419] Description = Продолжение Mozilla Suite. Включает браузер, почтовый клиент, IRC-клиент и HTML-редактор. Size = 10.4MB -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.2/win32/ru/SeaMonkey%20Setup%202.0.2.exe +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/ru/SeaMonkey%20Setup%202.0.3.exe diff --git a/reactos/base/applications/rapps/rapps/smplayer.txt b/reactos/base/applications/rapps/rapps/smplayer.txt index b3071703a1e..a2e47d3acff 100644 --- a/reactos/base/applications/rapps/rapps/smplayer.txt +++ b/reactos/base/applications/rapps/rapps/smplayer.txt @@ -2,13 +2,13 @@ [Section] Name = SMPlayer -Version = 0.6.8 +Version = 0.6.9 Licence = GPL Description = SMPlayer. -Size = 13.38MB +Size = 14.2MB Category = 1 URLSite = http://smplayer.sourceforge.net/ -URLDownload = http://downloads.sourceforge.net/project/smplayer/SMPlayer/0.6.8/smplayer-0.6.8-win32.exe +URLDownload = http://downloads.sourceforge.net/project/smplayer/SMPlayer/0.6.9/smplayer-0.6.9-win32.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/thunderbird.txt b/reactos/base/applications/rapps/rapps/thunderbird.txt index fa47d4bc1bc..9f0cd328d89 100644 --- a/reactos/base/applications/rapps/rapps/thunderbird.txt +++ b/reactos/base/applications/rapps/rapps/thunderbird.txt @@ -2,35 +2,35 @@ [Section] Name = Mozilla Thunderbird -Version = 3.0 +Version = 3.0.3 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Mail Clients out there. Size = 8.6M Category = 5 URLSite = http://www.mozilla-europe.org/en/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/latest-3.0/win32/en-US/Thunderbird%20Setup%203.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/en-US/Thunderbird%20Setup%203.0.3.exe CDPath = none [Section.0407] Description = Der populärste und einer der besten freien Mail-Clients. Size = 8.4M URLSite = http://www.mozilla-europe.org/de/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/latest-3.0/win32/de/Thunderbird%20Setup%203.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/de/Thunderbird%20Setup%203.0.3.exe [Section.040a] Description = El más popular y uno de los mejores clientes mail que hay. Size = 8.4M URLSite = http://www.mozilla-europe.org/es/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/latest-3.0/win32/es-ES/Thunderbird%20Setup%203.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/es-ES/Thunderbird%20Setup%203.0.3.exe [Section.0415] Description = Najpopularniejszy i jeden z najlepszych darmowych klientów poczty. -Size = 9.2M +Size = 9.3M URLSite = http://www.mozilla-europe.org/pl/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/latest-3.0/win32/pl/Thunderbird%20Setup%203.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/pl/Thunderbird%20Setup%203.0.3.exe [Section.0419] Description = Один из самых популярных и лучших бесплатных почтовых клиентов. Size = 8.8M URLSite = http://www.mozilla-europe.org/ru/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/latest-3.0/win32/ru/Thunderbird%20Setup%203.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/ru/Thunderbird%20Setup%203.0.3.exe diff --git a/reactos/base/applications/rapps/rapps/utorrent.txt b/reactos/base/applications/rapps/rapps/utorrent.txt index 41a5f004f68..988263777c5 100644 --- a/reactos/base/applications/rapps/rapps/utorrent.txt +++ b/reactos/base/applications/rapps/rapps/utorrent.txt @@ -2,13 +2,13 @@ [Section] Name = µTorrent -Version = 1.8.5 +Version = 2.0 Licence = Freeware for non-commercial uses Description = Small and fast BitTorrent Client. -Size = 282K +Size = 312K Category = 5 URLSite = http://www.utorrent.com/ -URLDownload = http://download.utorrent.com/1.8.5/utorrent.exe +URLDownload = http://download.utorrent.com/2.0/utorrent.exe CDPath = none diff --git a/reactos/base/applications/rapps/rapps/vlc.txt b/reactos/base/applications/rapps/rapps/vlc.txt index 3a0d4e69777..d3d11d2fb76 100644 --- a/reactos/base/applications/rapps/rapps/vlc.txt +++ b/reactos/base/applications/rapps/rapps/vlc.txt @@ -2,13 +2,13 @@ [Section] Name = VLC media player -Version = 1.0.3 +Version = 1.0.5 Licence = GPL Description = A media player. Size = 17.2MB Category = 1 URLSite = http://www.videolan.org/vlc/ -URLDownload = http://mirror.services.wisc.edu/mirrors/videolan/vlc/1.0.3/win32/vlc-1.0.3-win32.exe +URLDownload = http://mirror.services.wisc.edu/mirrors/videolan/vlc/1.0.5/win32/vlc-1.0.5-win32.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/resource.h b/reactos/base/applications/rapps/resource.h index a4faeae3203..a3b907557d0 100644 --- a/reactos/base/applications/rapps/resource.h +++ b/reactos/base/applications/rapps/resource.h @@ -1,5 +1,4 @@ -#ifndef _RESOURCE_H__ -#define _RESOURCE_H__ +#pragma once /* Icons */ #define IDI_MAIN 10 @@ -152,5 +151,3 @@ #ifndef IDC_STATIC #define IDC_STATIC -1 #endif - -#endif /* _RESOURCE_H__ */ diff --git a/reactos/base/applications/regedit/clb/clbdll.h b/reactos/base/applications/regedit/clb/clbdll.h index bc148d18db1..2680976bb73 100644 --- a/reactos/base/applications/regedit/clb/clbdll.h +++ b/reactos/base/applications/regedit/clb/clbdll.h @@ -1,5 +1,4 @@ -#ifndef __CLBDLL_H -#define __CLBDLL_H +#pragma once #define CLBS_NOTIFY 0x1 #define CLBS_SORT 0x2 @@ -39,5 +38,3 @@ typedef struct _CUSTOM_CONTROL_INFO LRESULT CALLBACK ClbWndProc(HWND,UINT,WPARAM,LPARAM); INT_PTR WINAPI ClbStyleW(HWND,LPARAM); BOOL WINAPI CustomControlInfoW(LPCUSTOM_CONTROL_INFO); - -#endif /* __CLBDLL_H */ diff --git a/reactos/base/applications/regedit/clb/resource.h b/reactos/base/applications/regedit/clb/resource.h index f0d51c721f1..8cfc463c378 100644 --- a/reactos/base/applications/regedit/clb/resource.h +++ b/reactos/base/applications/regedit/clb/resource.h @@ -1,6 +1,3 @@ -#ifndef __CLB_RESOURCE_H -#define __CLB_RESOURCE_H +#pragma once #define IDD_COLUMNLISTBOXSTYLES 1700 - -#endif /* __CLB_RESOURCE_H */ diff --git a/reactos/base/applications/regedit/hexedit.h b/reactos/base/applications/regedit/hexedit.h index d692d38a927..5ee5e22992d 100644 --- a/reactos/base/applications/regedit/hexedit.h +++ b/reactos/base/applications/regedit/hexedit.h @@ -1,5 +1,4 @@ -#ifndef __HEXEDIT_H -#define __HEXEDIT_H +#pragma once #define HEX_EDIT_CLASS_NAME _T("HexEdit32") @@ -36,5 +35,3 @@ UnregisterHexEditorClass(HINSTANCE hInstance); #define HexEdit_SetMaxBufferSize(hWnd, Size) \ SendMessage((hWnd), HEM_SETMAXBUFFERSIZE, 0, (LPARAM)(Size)) - -#endif /* __HEXEDIT_H */ diff --git a/reactos/base/applications/regedit/lang/de-DE.rc b/reactos/base/applications/regedit/lang/de-DE.rc index 6e456a541ba..2b0a22cd2af 100644 --- a/reactos/base/applications/regedit/lang/de-DE.rc +++ b/reactos/base/applications/regedit/lang/de-DE.rc @@ -54,8 +54,8 @@ BEGIN MENUITEM "&Exportieren...", ID_REGISTRY_EXPORTREGISTRYFILE MENUITEM SEPARATOR - MENUITEM "Hive laden...", ID_REGISTRY_LOADHIVE, GRAYED - MENUITEM "Hive entladen...", ID_REGISTRY_UNLOADHIVE, GRAYED + MENUITEM "Zweig laden...", ID_REGISTRY_LOADHIVE, GRAYED + MENUITEM "Zweig entladen...", ID_REGISTRY_UNLOADHIVE, GRAYED MENUITEM SEPARATOR MENUITEM "&Mit Netzwerkregistrierung verbinden...", ID_REGISTRY_CONNECTNETWORKREGISTRY @@ -78,7 +78,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Zeichenkette", ID_EDIT_NEW_STRINGVALUE MENUITEM "&Binrwert", ID_EDIT_NEW_BINARYVALUE - MENUITEM "&DWORD Wert", ID_EDIT_NEW_DWORDVALUE + MENUITEM "&DWORD-Wert", ID_EDIT_NEW_DWORDVALUE MENUITEM "&Mehrteilige Zeichenkette", ID_EDIT_NEW_MULTISTRINGVALUE MENUITEM "&Erweiterbare Zeichenkette", ID_EDIT_NEW_EXPANDABLESTRINGVALUE END @@ -134,14 +134,14 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Zeichenkette", ID_EDIT_NEW_STRINGVALUE MENUITEM "&Binrwert", ID_EDIT_NEW_BINARYVALUE - MENUITEM "&DWORD Wert", ID_EDIT_NEW_DWORDVALUE + MENUITEM "&DWORD-Wert", ID_EDIT_NEW_DWORDVALUE MENUITEM "&Mehrteilige Zeichenkette", ID_EDIT_NEW_MULTISTRINGVALUE MENUITEM "&Erweiterbare Zeichenkette", ID_EDIT_NEW_EXPANDABLESTRINGVALUE END END POPUP "" BEGIN - MENUITEM "Expandieren/Schliessen", ID_TREE_EXPANDBRANCH + MENUITEM "Erweitern/Schlieen", ID_TREE_EXPANDBRANCH POPUP "&Neu" BEGIN MENUITEM "&Schlssel", ID_EDIT_NEW_KEY @@ -160,7 +160,7 @@ BEGIN MENUITEM "&Exportieren", ID_TREE_EXPORT MENUITEM "&Berechtigungen...", ID_TREE_PERMISSIONS, GRAYED MENUITEM SEPARATOR - MENUITEM "S&chlsselname kopieren", ID_EDIT_COPYKEYNAME + MENUITEM "S&chlsselnamen kopieren", ID_EDIT_COPYKEYNAME END END @@ -215,7 +215,7 @@ END IDD_EDIT_DWORD DIALOGEX 32, 24, 252, 104 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "DWORD Wert editieren" +CAPTION "DWORD-Wert editieren" FONT 8, "MS Shell Dlg" BEGIN LTEXT "&Name:",IDC_STATIC,6,6,134,8 @@ -242,7 +242,7 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_APP_TITLE "Registry Editor" + IDS_APP_TITLE "Registry-Editor" IDC_REGEDIT "REGEDIT" IDC_REGEDIT_FRAME "REGEDIT_FRAME" END @@ -253,7 +253,7 @@ BEGIN ID_EDIT_MENU "Enthlt Befehle fr das ndern von Schlsseln oder Werten" ID_VIEW_MENU "Enthlt Befehle fr das Anpassen des Registry Editor Fensters" ID_FAVOURITES_MENU "Enthlt Befehle um auf oft genutzte Schlssel zuzugreifen" - ID_HELP_MENU "Enthlt Befehle um Hilfe und Informationen ber den Registry Editor anzuzeigen" + ID_HELP_MENU "Enthlt Befehle um Hilfe und Informationen ber den Registry-Editor anzuzeigen" ID_EDIT_NEW_MENU "Enthlt Befehle fr das Erstellen von neuen Schlsseln oder Werten" END @@ -263,7 +263,7 @@ BEGIN ID_EDIT_NEW_KEY "Fgt einen neuen Schlssel hinzu" ID_EDIT_NEW_STRINGVALUE "Fgt eine neue Zeichenkette hinzu " ID_EDIT_NEW_BINARYVALUE "Fgt einen neuen Binrwrt hinzu" - ID_EDIT_NEW_DWORDVALUE "Fgt einen neuen DWORD Wert hinzu" + ID_EDIT_NEW_DWORDVALUE "Fgt einen neuen DWORD-Wert hinzu" ID_REGISTRY_IMPORTREGISTRYFILE "Importiert eine Textddatei in die Registry" ID_REGISTRY_EXPORTREGISTRYFILE "Exportiert Teile oder die ganze Registry in eine Textdatei" @@ -278,7 +278,7 @@ END STRINGTABLE DISCARDABLE BEGIN - ID_REGISTRY_EXIT "Beendet den Registry Editor" + ID_REGISTRY_EXIT "Beendet den Registry-Editor" ID_FAVOURITES_ADDTOFAVOURITES "Fgt Schlssel zu den Favoriten hinzu" ID_FAVOURITES_REMOVEFAVOURITE "Lscht Schlssel aus den Favoriten" ID_VIEW_STATUSBAR "Zeigt oder versteckt die Statusleiste" @@ -297,7 +297,7 @@ BEGIN IDS_WARNING "Warnung" IDS_BAD_KEY "Kann den Schlssel '%s' nicht lesen" IDS_BAD_VALUE "Kann den Wert '%s' nicht lesen" - IDS_UNSUPPORTED_TYPE "Kann den Schlssel des Typen (%ld) nicht ndern" + IDS_UNSUPPORTED_TYPE "Kann den Schlssel des Typs (%ld) nicht ndern" IDS_TOO_BIG_VALUE "Der Wert (%ld) ist zu gro" IDS_MULTI_SZ_EMPTY_STRING "Daten vom Typ REG_MULTI_SZ knnen keine leere Zeichenkette enthalten.\nDie leere Zeichenkette wurde aus der Liste gelscht." IDS_QUERY_DELETE_KEY_ONE "Diesen Schlssel wirklich lschen?" @@ -323,7 +323,7 @@ BEGIN IDS_MY_COMPUTER "Arbeitsplatz" IDS_IMPORT_REG_FILE "Registry importieren" IDS_EXPORT_REG_FILE "Registry exportieren" - IDS_INVALID_DWORD "(ungltiger DWORD Wert)" + IDS_INVALID_DWORD "(ungltiger DWORD-Wert)" END STRINGTABLE DISCARDABLE @@ -331,7 +331,7 @@ BEGIN IDS_FLT_REGFILE "Registrierungsdatei" IDS_FLT_REGFILES "Registrierungsdateien" IDS_FLT_REGFILES_FLT "*.reg" - IDS_FLT_REGEDIT4 "Win9x/NT4 Registrierungsdateien (REGEDIT4)" + IDS_FLT_REGEDIT4 "Win9x/NT4-Registrierungsdateien (REGEDIT4)" IDS_FLT_REGEDIT4_FLT "*.reg" IDS_FLT_ALLFILES "Alle Dateien (*.*)" IDS_FLT_ALLFILES_FLT "*.*" diff --git a/reactos/base/applications/regedit/main.h b/reactos/base/applications/regedit/main.h index 6e22e3e7ae2..ea16ceec7cb 100644 --- a/reactos/base/applications/regedit/main.h +++ b/reactos/base/applications/regedit/main.h @@ -18,8 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __MAIN_H__ -#define __MAIN_H__ +#pragma once #include "resource.h" @@ -124,5 +123,3 @@ extern void DestroyMainMenu( void ); /* edit.c */ extern BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin); extern BOOL DeleteKey(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath); - -#endif /* __MAIN_H__ */ diff --git a/reactos/base/applications/regedit/security.h b/reactos/base/applications/regedit/security.h index 743cca51717..4f6d70dd5ef 100644 --- a/reactos/base/applications/regedit/security.h +++ b/reactos/base/applications/regedit/security.h @@ -1,5 +1,4 @@ -#ifndef _REGEXP_SECURITY_H -#define _REGEXP_SECURITY_H +#pragma once BOOL InitializeAclUiDll(VOID); @@ -154,6 +153,4 @@ typedef struct _CRegKeySecurity TCHAR szRegKey[1]; } CRegKeySecurity, *PCRegKeySecurity; -#endif /* _REGEXP_SECURITY_H */ - /* EOF */ diff --git a/reactos/base/applications/screensavers/3dtext/lang/de-DE.rc b/reactos/base/applications/screensavers/3dtext/lang/de-DE.rc index d6df75d4ba7..0fb89e80ef2 100644 --- a/reactos/base/applications/screensavers/3dtext/lang/de-DE.rc +++ b/reactos/base/applications/screensavers/3dtext/lang/de-DE.rc @@ -2,7 +2,7 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL DLG_SCRNSAVECONFIGURE DIALOGEX 0, 0, 273, 178 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "3D-Text Bildschirmschoner-Einstellungen" +CAPTION "3D-Text-Bildschirmschoner-Einstellungen" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN DEFPUSHBUTTON "OK",IDOK,216,7,50,14 @@ -13,5 +13,5 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_DESCRIPTION "3D Text Bildschirmschoner" + IDS_DESCRIPTION "3D-Text-Bildschirmschoner" END diff --git a/reactos/base/applications/screensavers/logon/lang/de-DE.rc b/reactos/base/applications/screensavers/logon/lang/de-DE.rc index 10fc8483229..b740bedea3e 100644 --- a/reactos/base/applications/screensavers/logon/lang/de-DE.rc +++ b/reactos/base/applications/screensavers/logon/lang/de-DE.rc @@ -2,6 +2,6 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL STRINGTABLE DISCARDABLE BEGIN - IDS_DESCRIPTION "Logon Bildschirmschoner" + IDS_DESCRIPTION "Logon-Bildschirmschoner" IDS_TEXT "Keinerlei Einstellungen notwendig." END diff --git a/reactos/base/applications/sndvol32/lang/de-DE.rc b/reactos/base/applications/sndvol32/lang/de-DE.rc index abcab15673e..6ea135d5a0a 100644 --- a/reactos/base/applications/sndvol32/lang/de-DE.rc +++ b/reactos/base/applications/sndvol32/lang/de-DE.rc @@ -19,7 +19,7 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_SNDVOL32 "Lautstrke Einstellungen" + IDS_SNDVOL32 "Lautstrke-Einstellungen" IDS_NOMIXERDEVICES "Es sind keine aktiven Mixer vorhanden! Die Anwendung wird jetzt beendet." END diff --git a/reactos/base/applications/sndvol32/resources.h b/reactos/base/applications/sndvol32/resources.h index 35d525345d2..0272ffecd1c 100644 --- a/reactos/base/applications/sndvol32/resources.h +++ b/reactos/base/applications/sndvol32/resources.h @@ -1,5 +1,4 @@ -#ifndef __SNDVOL_RESOURCES_H -#define __SNDVOL_RESOURCES_H +#pragma once #define IDM_MAINMENU 101 @@ -22,5 +21,3 @@ #define IDS_SNDVOL32 100 #define IDS_NOMIXERDEVICES 101 - -#endif /* __SNDVOL_RESOURCES_H */ diff --git a/reactos/base/applications/taskmgr/about.h b/reactos/base/applications/taskmgr/about.h index 4c62a2f65ef..07269a8f7c7 100644 --- a/reactos/base/applications/taskmgr/about.h +++ b/reactos/base/applications/taskmgr/about.h @@ -20,9 +20,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __ABOUT_H -#define __ABOUT_H +#pragma once void OnAbout(void); - -#endif /* __ABOUT_H */ diff --git a/reactos/base/applications/taskmgr/affinity.h b/reactos/base/applications/taskmgr/affinity.h index db0b15273f5..7c93801d507 100644 --- a/reactos/base/applications/taskmgr/affinity.h +++ b/reactos/base/applications/taskmgr/affinity.h @@ -20,9 +20,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __AFFINITY_H -#define __AFFINITY_H +#pragma once void ProcessPage_OnSetAffinity(void); - -#endif /* __AFFINITY_H */ diff --git a/reactos/base/applications/taskmgr/applpage.h b/reactos/base/applications/taskmgr/applpage.h index 82bb4cfb6ba..f75a76ad2a3 100644 --- a/reactos/base/applications/taskmgr/applpage.h +++ b/reactos/base/applications/taskmgr/applpage.h @@ -20,8 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __APPLICATIONPAGE_H -#define __APPLICATIONPAGE_H +#pragma once extern HWND hApplicationPage; /* Application List Property Page */ @@ -43,5 +42,3 @@ void ApplicationPage_OnWindowsBringToFront(void); void ApplicationPage_OnSwitchTo(void); void ApplicationPage_OnEndTask(void); void ApplicationPage_OnGotoProcess(void); - -#endif /* __APPLICATIONPAGE_H */ diff --git a/reactos/base/applications/taskmgr/column.h b/reactos/base/applications/taskmgr/column.h index 90dc6c42ecb..9aeb3ec4cfd 100644 --- a/reactos/base/applications/taskmgr/column.h +++ b/reactos/base/applications/taskmgr/column.h @@ -20,8 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __COLUMN_H -#define __COLUMN_H +#pragma once #define COLUMN_IMAGENAME 0 #define COLUMN_PID 1 @@ -110,5 +109,3 @@ void ProcessPage_OnViewSelectColumns(void); void AddColumns(void); void SaveColumnSettings(void); void UpdateColumnDataHints(void); - -#endif /* __COLUMN_H */ diff --git a/reactos/base/applications/taskmgr/debug.h b/reactos/base/applications/taskmgr/debug.h index d4ee7adbb24..85041340431 100644 --- a/reactos/base/applications/taskmgr/debug.h +++ b/reactos/base/applications/taskmgr/debug.h @@ -20,9 +20,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __DEBUG_H -#define __DEBUG_H +#pragma once void ProcessPage_OnDebug(void); - -#endif /* __DEBUG_H */ diff --git a/reactos/base/applications/taskmgr/endproc.h b/reactos/base/applications/taskmgr/endproc.h index 1238177ee8e..934a4c122be 100644 --- a/reactos/base/applications/taskmgr/endproc.h +++ b/reactos/base/applications/taskmgr/endproc.h @@ -20,10 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __ENDPROC_H -#define __ENDPROC_H +#pragma once void ProcessPage_OnEndProcess(void); void ProcessPage_OnEndProcessTree(void); - -#endif /* __ENDPROC_H */ diff --git a/reactos/base/applications/taskmgr/graph.h b/reactos/base/applications/taskmgr/graph.h index 3dd1ea5947f..d990f51f155 100644 --- a/reactos/base/applications/taskmgr/graph.h +++ b/reactos/base/applications/taskmgr/graph.h @@ -20,8 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __GRAPH_H -#define __GRAPH_H +#pragma once #ifdef __cplusplus extern "C" { @@ -41,5 +40,3 @@ INT_PTR CALLBACK Graph_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lP #ifdef __cplusplus }; #endif - -#endif /* __GRAPH_H */ diff --git a/reactos/base/applications/taskmgr/graphctl.h b/reactos/base/applications/taskmgr/graphctl.h index 2d315a31ef9..e924716e3e9 100644 --- a/reactos/base/applications/taskmgr/graphctl.h +++ b/reactos/base/applications/taskmgr/graphctl.h @@ -20,8 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __GRAPH_CTRL_H__ -#define __GRAPH_CTRL_H__ +#pragma once #define MAX_PLOTS 4 #define MAX_CTRLS 4 @@ -110,5 +109,3 @@ INT_PTR CALLBACK GraphCtrl_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA #ifdef __cplusplus } #endif - -#endif /* __GRAPH_CTRL_H__ */ diff --git a/reactos/base/applications/taskmgr/lang/de-DE.rc b/reactos/base/applications/taskmgr/lang/de-DE.rc index 97a3f79e0b3..53b93098ca0 100644 --- a/reactos/base/applications/taskmgr/lang/de-DE.rc +++ b/reactos/base/applications/taskmgr/lang/de-DE.rc @@ -573,7 +573,7 @@ BEGIN ID_FILE_NEW "Fhrt ein neues Programm aus." ID_OPTIONS_ALWAYSONTOP "Task-Manager bleibt im Vordergrund, wenn nicht minimiert." ID_OPTIONS_MINIMIZEONUSE - "Task-Manager wird minimiert wenn ein SwitchTo-Vorgang durchgefhrt wird." + "Task-Manager wird minimiert, wenn ein SwitchTo-Vorgang durchgefhrt wird." ID_OPTIONS_HIDEWHENMINIMIZED "Blendet den Task-Manager aus, wenn er minimiert ist." ID_VIEW_REFRESH "Veranlasst den Task-Manager zur sofortigen Aktualisierung, unabhngig von der Geschwindigkeitseinstellung." ID_VIEW_LARGE "Zeigt Tasks als groe Symbole an." @@ -596,9 +596,9 @@ BEGIN ID_WINDOWS_BRINGTOFRONT "Zeigt das Fenster im Vordergrund an, aber wechselt nicht zu diesem." ID_HELP_TOPICS "Zeigt die Hilfethemen des Taskmanagers an." ID_HELP_ABOUT "Zeigt Programminformationen, Versionsnummer und Copyright an." - ID_FILE_EXIT "Beendet den Task-Manager." + ID_FILE_EXIT "Beendet den Taskmanager." ID_OPTIONS_SHOW16BITTASKS - "Zeigt die 16-Bit Tasks unter der zugehrigen ntvdm.exe an." + "Zeigt die 16-Bit-Tasks unter der zugehrigen ntvdm.exe an." ID_VIEW_SELECTCOLUMNS "Legt fest welche Spalten auf der Registerkarte Prozesse angezeigt werden." ID_VIEW_SHOWKERNELTIMES "Zeigt die Kernel-Zeiten in den Systemmonitordiagrammen an." ID_VIEW_CPUHISTORY_ONEGRAPHALL @@ -675,7 +675,7 @@ BEGIN IDS_MENU_SHOWKERNELTIMES "&Kernel-Zeiten anzeigen" IDS_CREATENEWTASK "Neuen Task erstellen" IDS_CREATENEWTASK_DESC "Geben Sie Programme, Ordner, Dokumente oder Internetressourcen an, die geffnet werden sollen." - IDS_MSG_ACCESSPROCESSAFF "Zugriff auf die / nderung der Prozess Affinitt nicht mglich" + IDS_MSG_ACCESSPROCESSAFF "Zugriff auf die / nderung der Prozessaffinitt nicht mglich" IDS_MSG_PROCESSONEPRO "Der Prozess muss eine Zugehrigkeit zu mindestens einem Prozessor aufweisen." IDS_MSG_INVALIDOPTION "Ungltige Auswahl" IDS_MSG_UNABLEDEBUGPROCESS "Kann Prozess nicht debuggen" diff --git a/reactos/base/applications/taskmgr/optnmenu.h b/reactos/base/applications/taskmgr/optnmenu.h index 9312d38ee2d..50a8251fa42 100644 --- a/reactos/base/applications/taskmgr/optnmenu.h +++ b/reactos/base/applications/taskmgr/optnmenu.h @@ -24,8 +24,7 @@ * Menu item handlers for the options menu. */ -#ifndef __OPTNMENU_H -#define __OPTNMENU_H +#pragma once #define OPTIONS_MENU_INDEX 1 @@ -33,5 +32,3 @@ void TaskManager_OnOptionsAlwaysOnTop(void); void TaskManager_OnOptionsMinimizeOnUse(void); void TaskManager_OnOptionsHideWhenMinimized(void); void TaskManager_OnOptionsShow16BitTasks(void); - -#endif /* __OPTNMENU_H */ diff --git a/reactos/base/applications/taskmgr/perfdata.h b/reactos/base/applications/taskmgr/perfdata.h index 68661f5f5e7..00c2d6dc21a 100644 --- a/reactos/base/applications/taskmgr/perfdata.h +++ b/reactos/base/applications/taskmgr/perfdata.h @@ -20,8 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __PERFDATA_H -#define __PERFDATA_H +#pragma once #ifdef __cplusplus extern "C" { @@ -106,5 +105,3 @@ ULONG PerfDataGetTotalThreadCount(void); #ifdef __cplusplus }; #endif - -#endif /* __PERFDATA_H */ diff --git a/reactos/base/applications/taskmgr/perfpage.h b/reactos/base/applications/taskmgr/perfpage.h index e6ce095be89..f1e4403f37c 100644 --- a/reactos/base/applications/taskmgr/perfpage.h +++ b/reactos/base/applications/taskmgr/perfpage.h @@ -20,8 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __PERFORMANCEPAGE_H -#define __PERFORMANCEPAGE_H +#pragma once #ifdef __cplusplus extern "C" { @@ -37,5 +36,3 @@ void PerformancePage_OnViewCPUHistoryOneGraphPerCPU(void); #ifdef __cplusplus }; #endif - -#endif /* __PERFORMANCEPAGE_H */ diff --git a/reactos/base/applications/taskmgr/priority.h b/reactos/base/applications/taskmgr/priority.h index 04bf2b6f901..5d8f18cc468 100644 --- a/reactos/base/applications/taskmgr/priority.h +++ b/reactos/base/applications/taskmgr/priority.h @@ -20,9 +20,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __PRIORITY_H -#define __PRIORITY_H +#pragma once void DoSetPriority(DWORD priority); - -#endif /* __PRIORITY_H */ diff --git a/reactos/base/applications/taskmgr/proclist.h b/reactos/base/applications/taskmgr/proclist.h index 1099f1b4a3f..1df2753384b 100644 --- a/reactos/base/applications/taskmgr/proclist.h +++ b/reactos/base/applications/taskmgr/proclist.h @@ -20,11 +20,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __PROCLIST_H -#define __PROCLIST_H +#pragma once INT_PTR CALLBACK ProcessListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); extern WNDPROC OldProcessListWndProc; - -#endif /* __PROCLIST_H */ diff --git a/reactos/base/applications/taskmgr/procpage.h b/reactos/base/applications/taskmgr/procpage.h index ac9a57a9151..ff244a9ab6a 100644 --- a/reactos/base/applications/taskmgr/procpage.h +++ b/reactos/base/applications/taskmgr/procpage.h @@ -20,8 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __PROCESSPAGE_H -#define __PROCESSPAGE_H +#pragma once extern HWND hProcessPage; /* Process List Property Page */ extern HWND hProcessPageListCtrl; /* Process ListCtrl Window */ @@ -32,5 +31,3 @@ extern HWND hProcessPageShowAllProcessesButton; /* Process Show All Processes c INT_PTR CALLBACK ProcessPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); void RefreshProcessPage(void); DWORD GetSelectedProcessId(void); - -#endif /* __PROCESSPAGE_H */ diff --git a/reactos/base/applications/taskmgr/run.h b/reactos/base/applications/taskmgr/run.h index b71036468c9..ef972ff6ecb 100644 --- a/reactos/base/applications/taskmgr/run.h +++ b/reactos/base/applications/taskmgr/run.h @@ -28,8 +28,7 @@ * jholderness@geocities.com */ -#ifndef __RUN_H -#define __RUN_H +#pragma once void TaskManager_OnFileNew(void); @@ -50,5 +49,3 @@ UINT uFlags); #define RFF_CALCDIRECTORY 0x04 /* Calculates the working directory from the file name. */ #define RFF_NOLABEL 0x08 /* Removes the edit box label. */ #define RFF_NOSEPARATEMEM 0x20 /* Removes the Separate Memory Space check box (Windows NT only). */ - -#endif /* __RUN_H */ diff --git a/reactos/base/applications/taskmgr/taskmgr.h b/reactos/base/applications/taskmgr/taskmgr.h index 22c0b89fa9d..16eaad8224a 100644 --- a/reactos/base/applications/taskmgr/taskmgr.h +++ b/reactos/base/applications/taskmgr/taskmgr.h @@ -20,8 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __TASKMGR_H__ -#define __TASKMGR_H__ +#pragma once #ifdef __cplusplus extern "C" { @@ -124,5 +123,3 @@ LPTSTR GetLastErrorText( LPTSTR lpszBuf, DWORD dwSize ); #ifdef __cplusplus } #endif - -#endif /* __TASKMGR_H__ */ diff --git a/reactos/base/applications/taskmgr/trayicon.h b/reactos/base/applications/taskmgr/trayicon.h index f9d4bc5293b..1b51c5571b8 100644 --- a/reactos/base/applications/taskmgr/trayicon.h +++ b/reactos/base/applications/taskmgr/trayicon.h @@ -20,8 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef __TRAYICON_H -#define __TRAYICON_H +#pragma once #define WM_ONTRAYICON WM_USER + 5 @@ -29,5 +28,3 @@ HICON TrayIcon_GetProcessorUsageIcon(void); BOOL TrayIcon_ShellAddTrayIcon(void); BOOL TrayIcon_ShellRemoveTrayIcon(void); BOOL TrayIcon_ShellUpdateTrayIcon(void); - -#endif /* __TRAYICON_H */ diff --git a/reactos/base/applications/winhlp32/De.rc b/reactos/base/applications/winhlp32/De.rc index 0ec40add40f..2e14f70ad84 100644 --- a/reactos/base/applications/winhlp32/De.rc +++ b/reactos/base/applications/winhlp32/De.rc @@ -128,4 +128,3 @@ END MENUITEM "Systemfarben verwenden", MNID_CTXT_SYSTEM_COLORS END END -#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/Fr.rc b/reactos/base/applications/winhlp32/Fr.rc index 2199e37ab9e..cedb0f694b7 100644 --- a/reactos/base/applications/winhlp32/Fr.rc +++ b/reactos/base/applications/winhlp32/Fr.rc @@ -131,4 +131,3 @@ BEGIN MENUITEM "Utiliser les couleurs système", MNID_CTXT_SYSTEM_COLORS END END -#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/It.rc b/reactos/base/applications/winhlp32/It.rc index cd16e4058bf..b5c53929bf4 100644 --- a/reactos/base/applications/winhlp32/It.rc +++ b/reactos/base/applications/winhlp32/It.rc @@ -89,4 +89,3 @@ STID_FILE_NOT_FOUND_s "Non è stato possibile trovare '%s'. Vuoi cercare questo STID_NO_RICHEDIT "Non è stato possibile trovare un'implementazione richedit... Annullando" STID_PSH_INDEX, "Argomenti di aiuto: " } -#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/Ja.rc b/reactos/base/applications/winhlp32/Ja.rc index a06b5f1df65..b73d18dd192 100644 --- a/reactos/base/applications/winhlp32/Ja.rc +++ b/reactos/base/applications/winhlp32/Ja.rc @@ -128,4 +128,3 @@ BEGIN MENUITEM "システム カラーを使う", MNID_CTXT_SYSTEM_COLORS END END -#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/Lt.rc b/reactos/base/applications/winhlp32/Lt.rc index 5ee53f8aa16..f8e78681aae 100644 --- a/reactos/base/applications/winhlp32/Lt.rc +++ b/reactos/base/applications/winhlp32/Lt.rc @@ -129,4 +129,3 @@ BEGIN MENUITEM "Naudoti sistemos spalvas", MNID_CTXT_SYSTEM_COLORS END END -#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/Nl.rc b/reactos/base/applications/winhlp32/Nl.rc index a7938406b65..029d58265b9 100644 --- a/reactos/base/applications/winhlp32/Nl.rc +++ b/reactos/base/applications/winhlp32/Nl.rc @@ -127,4 +127,3 @@ BEGIN MENUITEM "Gebruik systeem kleuren", MNID_CTXT_SYSTEM_COLORS END END -#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/Pt.rc b/reactos/base/applications/winhlp32/Pt.rc index 5598bd77cd6..28933a22a6f 100644 --- a/reactos/base/applications/winhlp32/Pt.rc +++ b/reactos/base/applications/winhlp32/Pt.rc @@ -204,4 +204,3 @@ BEGIN MENUITEM "Usar cores do sistema", MNID_CTXT_SYSTEM_COLORS END END -#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/Rm.rc b/reactos/base/applications/winhlp32/Rm.rc index 17293875f99..3b2a1fa9403 100644 --- a/reactos/base/applications/winhlp32/Rm.rc +++ b/reactos/base/applications/winhlp32/Rm.rc @@ -92,4 +92,3 @@ STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yoursel STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting" STID_PSH_INDEX, "Help topics: " } -#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/Ro.rc b/reactos/base/applications/winhlp32/Ro.rc index eaa530bc5bb..1f916ac21d5 100644 --- a/reactos/base/applications/winhlp32/Ro.rc +++ b/reactos/base/applications/winhlp32/Ro.rc @@ -130,4 +130,3 @@ BEGIN MENUITEM "Utilizează culorile sistemului", MNID_CTXT_SYSTEM_COLORS END END -#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/Ru.rc b/reactos/base/applications/winhlp32/Ru.rc index a476b344c6c..165094f4720 100644 --- a/reactos/base/applications/winhlp32/Ru.rc +++ b/reactos/base/applications/winhlp32/Ru.rc @@ -121,4 +121,3 @@ BEGIN MENUITEM "Использовать системные цвета", MNID_CTXT_SYSTEM_COLORS END END -#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/Si.rc b/reactos/base/applications/winhlp32/Si.rc index 310ef45a8f7..527b45431ee 100644 --- a/reactos/base/applications/winhlp32/Si.rc +++ b/reactos/base/applications/winhlp32/Si.rc @@ -126,4 +126,3 @@ BEGIN MENUITEM "Uporabi sistemske barve", MNID_CTXT_SYSTEM_COLORS END END -#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/Zh.rc b/reactos/base/applications/winhlp32/Zh.rc index a68b699c44f..ed20356cf47 100644 --- a/reactos/base/applications/winhlp32/Zh.rc +++ b/reactos/base/applications/winhlp32/Zh.rc @@ -160,4 +160,3 @@ STID_FILE_NOT_FOUND_s "不能開啟檔案 '%s'. 你想要自己找這個檔案 STID_NO_RICHEDIT "找不到 richedit... 終止" STID_PSH_INDEX, "幫助內容: " } -#pragma code_page(default) diff --git a/reactos/base/applications/winhlp32/rsrc.rc b/reactos/base/applications/winhlp32/rsrc.rc index e45fc8a7ce5..28d8de35fe3 100644 --- a/reactos/base/applications/winhlp32/rsrc.rc +++ b/reactos/base/applications/winhlp32/rsrc.rc @@ -27,25 +27,27 @@ IDI_WINHELP ICON DISCARDABLE winhelp.ico #include "Bg.rc" #include "Cs.rc" #include "Da.rc" -#include "De.rc" #include "En.rc" #include "Es.rc" #include "Fi.rc" -#include "Fr.rc" #include "Hu.rc" -#include "It.rc" -#include "Ja.rc" #include "Ko.rc" -#include "Lt.rc" -#include "Nl.rc" #include "No.rc" #include "Pl.rc" +#include "Sk.rc" +#include "Sv.rc" +#include "Tr.rc" + +/* UTF-8 */ +#include "De.rc" +#include "Fr.rc" +#include "It.rc" +#include "Ja.rc" +#include "Lt.rc" +#include "Nl.rc" #include "Pt.rc" #include "Rm.rc" #include "Ro.rc" #include "Ru.rc" #include "Si.rc" -#include "Sk.rc" -#include "Sv.rc" -#include "Tr.rc" #include "Zh.rc" diff --git a/reactos/base/applications/wordpad/Da.rc b/reactos/base/applications/wordpad/Da.rc index 34789469e5e..882cca7e8d8 100644 --- a/reactos/base/applications/wordpad/Da.rc +++ b/reactos/base/applications/wordpad/Da.rc @@ -46,7 +46,7 @@ BEGIN MENUITEM "&Fjern\tDEL", ID_EDIT_CLEAR MENUITEM "&Marker alt\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Sg efter...\tCrtl+F", ID_FIND + MENUITEM "&Sg efter...\tCtrl+F", ID_FIND MENUITEM "Sg efter &nste\tF3", ID_FIND_NEXT MENUITEM "E&rstat...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -106,6 +106,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Sort", ID_COLOR_BLACK + MENUITEM "Mrkerd", ID_COLOR_MAROON + MENUITEM "Grn", ID_COLOR_GREEN + MENUITEM "Oliven" ID_COLOR_OLIVE + MENUITEM "Navy" ID_COLOR_NAVY + MENUITEM "Lilla" ID_COLOR_PURPLE + MENUITEM "Teal" ID_COLOR_TEAL + MENUITEM "Gr" ID_COLOR_GRAY + MENUITEM "Slv" ID_COLOR_SILVER + MENUITEM "Rd" ID_COLOR_RED + MENUITEM "Lime" ID_COLOR_LIME + MENUITEM "Gul" ID_COLOR_YELLOW + MENUITEM "Bl" ID_COLOR_BLUE + MENUITEM "Violet" ID_COLOR_FUCHSIA + MENUITEM "Cyan" ID_COLOR_AQUA + MENUITEM "Hvid" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Dato og tid" @@ -218,7 +242,11 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Forrige side" STRING_PREVIEW_TWOPAGES, "To sider" STRING_PREVIEW_ONEPAGE, "n side" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Luk" + STRING_PREVIEW_PAGE, "Page" + STRING_PREVIEW_PAGES, "Pages" END STRINGTABLE DISCARDABLE diff --git a/reactos/base/applications/wordpad/De.rc b/reactos/base/applications/wordpad/De.rc index d552d9c21a5..ca11edd8bea 100644 --- a/reactos/base/applications/wordpad/De.rc +++ b/reactos/base/applications/wordpad/De.rc @@ -108,6 +108,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Schwarz" ID_COLOR_BLACK + MENUITEM "Kastanienbraun" ID_COLOR_MAROON + MENUITEM "Grün" ID_COLOR_GREEN + MENUITEM "Olivgrün" ID_COLOR_OLIVE + MENUITEM "Dunkelblau" ID_COLOR_NAVY + MENUITEM "Lila" ID_COLOR_PURPLE + MENUITEM "Blaugrün" ID_COLOR_TEAL + MENUITEM "Grau" ID_COLOR_GRAY + MENUITEM "Silber" ID_COLOR_SILVER + MENUITEM "Rot" ID_COLOR_RED + MENUITEM "Hellgrün" ID_COLOR_LIME + MENUITEM "Gelb" ID_COLOR_YELLOW + MENUITEM "Blau" ID_COLOR_BLUE + MENUITEM "Pink" ID_COLOR_FUCHSIA + MENUITEM "Aquamarin" ID_COLOR_AQUA + MENUITEM "Weiß" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Datum und Uhrzeit" @@ -218,9 +242,13 @@ BEGIN STRING_PREVIEW_PRINT, "&Drucken" STRING_PREVIEW_NEXTPAGE, "&Nächste" STRING_PREVIEW_PREVPAGE, "&Vorherige" - STRING_PREVIEW_TWOPAGES, "Zwei Seiten" - STRING_PREVIEW_ONEPAGE, "Eine Seite" + STRING_PREVIEW_TWOPAGES, "&Zwei Seiten" + STRING_PREVIEW_ONEPAGE, "&Eine Seite" + STRING_PREVIEW_ZOOMIN, "Ver&größern" + STRING_PREVIEW_ZOOMOUT, "Ver&kleinern" STRING_PREVIEW_CLOSE, "&Schließen" + STRING_PREVIEW_PAGE, "Seite" + STRING_PREVIEW_PAGES, "Seiten" END STRINGTABLE DISCARDABLE @@ -246,4 +274,3 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "Drucken ist nicht implementiert" STRING_MAX_TAB_STOPS, "Es können nur maximal 32 Tabstopps definiert werden." END -#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/En.rc b/reactos/base/applications/wordpad/En.rc index b6ade3aaf3d..0dec19bc650 100644 --- a/reactos/base/applications/wordpad/En.rc +++ b/reactos/base/applications/wordpad/En.rc @@ -46,7 +46,7 @@ BEGIN MENUITEM "&Clear\tDEL", ID_EDIT_CLEAR MENUITEM "&Select all\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Find...\tCrtl+F", ID_FIND + MENUITEM "&Find...\tCtrl+F", ID_FIND MENUITEM "Find &next\tF3", ID_FIND_NEXT MENUITEM "&Replace...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -106,6 +106,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Black", ID_COLOR_BLACK + MENUITEM "Maroon", ID_COLOR_MAROON + MENUITEM "Green", ID_COLOR_GREEN + MENUITEM "Olive" ID_COLOR_OLIVE + MENUITEM "Navy" ID_COLOR_NAVY + MENUITEM "Purple" ID_COLOR_PURPLE + MENUITEM "Teal" ID_COLOR_TEAL + MENUITEM "Gray" ID_COLOR_GRAY + MENUITEM "Silver" ID_COLOR_SILVER + MENUITEM "Red" ID_COLOR_RED + MENUITEM "Lime" ID_COLOR_LIME + MENUITEM "Yellow" ID_COLOR_YELLOW + MENUITEM "Blue" ID_COLOR_BLUE + MENUITEM "Fuchsia" ID_COLOR_FUCHSIA + MENUITEM "Aqua" ID_COLOR_AQUA + MENUITEM "White" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Date and time" @@ -210,7 +234,11 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Previous page" STRING_PREVIEW_TWOPAGES, "Two pages" STRING_PREVIEW_ONEPAGE, "One page" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Close" + STRING_PREVIEW_PAGE, "Page" + STRING_PREVIEW_PAGES, "Pages" STRING_UNITS_CM, "cm" END diff --git a/reactos/base/applications/wordpad/Fr.rc b/reactos/base/applications/wordpad/Fr.rc index 3b518288639..54ae0b992b8 100644 --- a/reactos/base/applications/wordpad/Fr.rc +++ b/reactos/base/applications/wordpad/Fr.rc @@ -49,7 +49,7 @@ BEGIN MENUITEM "&Effacer\tDel", ID_EDIT_CLEAR MENUITEM "&Sélectionner tout\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Rechercher...\tCrtl+F", ID_FIND + MENUITEM "&Rechercher...\tCtrl+F", ID_FIND MENUITEM "Rechercher le &suivant\tF3", ID_FIND_NEXT MENUITEM "&Remplacer...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -109,6 +109,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Noir" ID_COLOR_BLACK + MENUITEM "Marron" ID_COLOR_MAROON + MENUITEM "Vert" ID_COLOR_GREEN + MENUITEM "Olive" ID_COLOR_OLIVE + MENUITEM "Bleu marine" ID_COLOR_NAVY + MENUITEM "Pourpre" ID_COLOR_PURPLE + MENUITEM "Sarcelle" ID_COLOR_TEAL + MENUITEM "Gris" ID_COLOR_GRAY + MENUITEM "Argent" ID_COLOR_SILVER + MENUITEM "Rouge" ID_COLOR_RED + MENUITEM "Citron vert" ID_COLOR_LIME + MENUITEM "Jaune" ID_COLOR_YELLOW + MENUITEM "Bleu" ID_COLOR_BLUE + MENUITEM "Fuchsia" ID_COLOR_FUCHSIA + MENUITEM "Eau" ID_COLOR_AQUA + MENUITEM "Blanc" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Date et heure" @@ -221,7 +245,11 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Page précédente" STRING_PREVIEW_TWOPAGES, "Deux pages" STRING_PREVIEW_ONEPAGE, "Une page" + STRING_PREVIEW_ZOOMIN, "Zoom avant" + STRING_PREVIEW_ZOOMOUT, "Zoom arrière" STRING_PREVIEW_CLOSE, "Fermer" + STRING_PREVIEW_PAGE, "Page" + STRING_PREVIEW_PAGES, "Pages" END STRINGTABLE DISCARDABLE @@ -247,4 +275,3 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "L'impression n'est pas implémentée" STRING_MAX_TAB_STOPS, "Impossible d'ajouter plus de 32 taquets de tabulation." END -#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Hu.rc b/reactos/base/applications/wordpad/Hu.rc index 74926e1e597..3694062e355 100644 --- a/reactos/base/applications/wordpad/Hu.rc +++ b/reactos/base/applications/wordpad/Hu.rc @@ -46,7 +46,7 @@ BEGIN MENUITEM "Tr&ls\tDel", ID_EDIT_CLEAR MENUITEM "M&indet kijelli\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Find...\tCrtl+F", ID_FIND + MENUITEM "&Find...\tCtrl+F", ID_FIND MENUITEM "Find &next\tF3", ID_FIND_NEXT MENUITEM "&Replace...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -106,6 +106,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Black", ID_COLOR_BLACK + MENUITEM "Maroon", ID_COLOR_MAROON + MENUITEM "Green", ID_COLOR_GREEN + MENUITEM "Olive" ID_COLOR_OLIVE + MENUITEM "Navy" ID_COLOR_NAVY + MENUITEM "Purple" ID_COLOR_PURPLE + MENUITEM "Teal" ID_COLOR_TEAL + MENUITEM "Gray" ID_COLOR_GRAY + MENUITEM "Silver" ID_COLOR_SILVER + MENUITEM "Red" ID_COLOR_RED + MENUITEM "Lime" ID_COLOR_LIME + MENUITEM "Yellow" ID_COLOR_YELLOW + MENUITEM "Blue" ID_COLOR_BLUE + MENUITEM "Fuchsia" ID_COLOR_FUCHSIA + MENUITEM "Aqua" ID_COLOR_AQUA + MENUITEM "White" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Date and time" @@ -218,7 +242,11 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Previous page" STRING_PREVIEW_TWOPAGES, "Two pages" STRING_PREVIEW_ONEPAGE, "One page" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Close" + STRING_PREVIEW_PAGE, "Page" + STRING_PREVIEW_PAGES, "Pages" END STRINGTABLE DISCARDABLE diff --git a/reactos/base/applications/wordpad/It.rc b/reactos/base/applications/wordpad/It.rc new file mode 100644 index 00000000000..99968411776 --- /dev/null +++ b/reactos/base/applications/wordpad/It.rc @@ -0,0 +1,266 @@ +/* Italian resource for Wine WordPad + * + * Copyright 2010 by Luca Bennati + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wordpad.h" + +/*UTF-8*/ +#pragma code_page(65001) + +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +IDM_MAINMENU MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Nuovo...\tCtrl+N", ID_FILE_NEW + MENUITEM "&Apri...\tCtrl+O", ID_FILE_OPEN + MENUITEM "&Salva\tCtrl+S", ID_FILE_SAVE + MENUITEM "Salva &come...", ID_FILE_SAVEAS + MENUITEM SEPARATOR + MENUITEM "&Stampa...\tCtrl+P", ID_PRINT + MENUITEM "An&teprima di stampa...", ID_PREVIEW + MENUITEM "&Impostazioni di stampa...", ID_PRINTSETUP + MENUITEM SEPARATOR + MENUITEM "E&sci", ID_FILE_EXIT + END + POPUP "&Modifica" + BEGIN + MENUITEM "&Annulla\tCtrl+Z", ID_EDIT_UNDO + MENUITEM "&Rifai\tCtrl+Y", ID_EDIT_REDO + MENUITEM SEPARATOR + MENUITEM "&Taglia\tCtrl+X", ID_EDIT_CUT + MENUITEM "&Copia\tCtrl+C", ID_EDIT_COPY + MENUITEM "&Incolla\tCtrl+V", ID_EDIT_PASTE + MENUITEM "Ca&ncella\tDEL", ID_EDIT_CLEAR + MENUITEM "&Seleziona tutto\tCtrl+A", ID_EDIT_SELECTALL + MENUITEM SEPARATOR + MENUITEM "T&rova...\tCtrl+F", ID_FIND + MENUITEM "Trova s&uccessivo\tF3", ID_FIND_NEXT + MENUITEM "S&ostituisci...\tCtrl+H", ID_REPLACE + MENUITEM SEPARATOR + MENUITEM "Sola &Lettura", ID_EDIT_READONLY + MENUITEM "&Modificato", ID_EDIT_MODIFIED + MENUITEM SEPARATOR + POPUP "E&xtra" + BEGIN + MENUITEM "&Informazioni sulla selezione", ID_EDIT_SELECTIONINFO + MENUITEM "&Formato del carattere", ID_EDIT_CHARFORMAT + MENUITEM "Formato del &def. char", ID_EDIT_DEFCHARFORMAT + MENUITEM "Formato del ¶grafo", ID_EDIT_PARAFORMAT + MENUITEM "&Ricava il testo", ID_EDIT_GETTEXT + END + END + POPUP "&Visualizza" + BEGIN + MENUITEM "Barra degli &strumenti", ID_TOGGLE_TOOLBAR + MENUITEM "Barra del &formato", ID_TOGGLE_FORMATBAR + MENUITEM "&Righello", ID_TOGGLE_RULER + MENUITEM "Barra dello s&tato", ID_TOGGLE_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Opzioni...", ID_VIEWPROPERTIES + END + POPUP "&Inserisci" + BEGIN + MENUITEM "&Data e ora...", ID_DATETIME + END + POPUP "F&ormato" + BEGIN + MENUITEM "&Font...", ID_FONTSETTINGS + MENUITEM "&Elenco" ID_BULLET + MENUITEM "&Paragrafo..." ID_PARAFORMAT + MENUITEM "&Tabulazioni..." ID_TABSTOPS + POPUP "Sfon&do" + BEGIN + MENUITEM "Di &sistema\tCtrl+1", ID_BACK_1 + MENUITEM "&Giallo di PostThat\tCtrl+2", ID_BACK_2 + END + END + POPUP "&Aiuto" + BEGIN + MENUITEM "&Su Wine Wordpad" ID_ABOUT + END +END + +IDM_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Taglia", ID_EDIT_CUT + MENUITEM "&Copia", ID_EDIT_COPY + MENUITEM "&Incolla", ID_EDIT_PASTE + MENUITEM SEPARATOR + MENUITEM "&Elenco" ID_BULLET + MENUITEM "&Paragrafo..." ID_PARAFORMAT + END +END + +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Nero" ID_COLOR_BLACK + MENUITEM "Marrone rossiccio" ID_COLOR_MAROON + MENUITEM "Verde" ID_COLOR_GREEN + MENUITEM "Verde oliva" ID_COLOR_OLIVE + MENUITEM "Blu oltremare" ID_COLOR_NAVY + MENUITEM "Propora" ID_COLOR_PURPLE + MENUITEM "Teal" ID_COLOR_TEAL + MENUITEM "Grigio" ID_COLOR_GRAY + MENUITEM "Argento" ID_COLOR_SILVER + MENUITEM "Rosso" ID_COLOR_RED + MENUITEM "Verde cedro" ID_COLOR_LIME + MENUITEM "Giallo" ID_COLOR_YELLOW + MENUITEM "Blu" ID_COLOR_BLUE + MENUITEM "Fucsia" ID_COLOR_FUCHSIA + MENUITEM "Aqua" ID_COLOR_AQUA + MENUITEM "Bianco" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + +IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Data e ora" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Formati disponibili",-1,3,2,100,15 + LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY + PUSHBUTTON "&OK",IDOK,87,12,40,12 + PUSHBUTTON "&Annulla",IDCANCEL,87,26,40,12 +END + +IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Nuovo" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Nuovo tipo di documento",-1,3,2,100,15 + LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT + PUSHBUTTON "&OK",IDOK,97,12,40,12 + PUSHBUTTON "&Annulla",IDCANCEL,97,26,40,12 +END + +IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "Formato del paragrafo" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Indentazione", -1, 10, 10, 120, 68 + LTEXT "Sinistra", -1, 15, 22, 40, 13 + EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 + LTEXT "Destra", -1, 15, 40, 40, 13 + EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13 + LTEXT "Prima riga", -1, 15, 58, 40, 13 + EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13 + LTEXT "Allineamento", -1, 15, 87, 45, 13 + COMBOBOX IDC_PARA_ALIGN, 60, 85, 60, 60, CBS_DROPDOWNLIST + PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&Annulla", IDCANCEL, 137, 33, 50, 15 +END + +IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "Tabulazioni" +FONT 8, "MS SHell DLg" +BEGIN + GROUPBOX "Punti di fermata delle tabulazioni", -1, 10, 10, 120, 90 + COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE + DEFPUSHBUTTON "&Aggiungi", ID_TAB_ADD, 20, 80, 45, 15 + PUSHBUTTON "&Rimuovi", ID_TAB_DEL, 72, 80, 45, 15 + PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&Annulla", IDCANCEL, 137, 33, 50, 15 + PUSHBUTTON "Rimuovi &tutti", ID_TAB_EMPTY, 137, 51, 50, 15 +END + +IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 310, 110 +STYLE DS_SYSMODAL +Caption "" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Linea di margine", -1, 10, 10, 150, 85 + RADIOBUTTON "&Nessuna linea di margine", IDC_PAGEFMT_WN, 18, 25, 140, 15 + RADIOBUTTON "Confina il testo nel &bordo della finestra", IDC_PAGEFMT_WW, 18, 45, 140, 15 + RADIOBUTTON "Confina il testo nel &margine", IDC_PAGEFMT_WM, 18, 65, 140, 15 + GROUPBOX "Barre", -1, 170, 10, 120, 85 + CHECKBOX "Barra degli &strumenti", IDC_PAGEFMT_TB, 180, 20, 80, 15 + CHECKBOX "Barra del &formato", IDC_PAGEFMT_FB, 180, 38, 80, 15 + CHECKBOX "&Righello", IDC_PAGEFMT_RU, 180, 56, 80, 15 + CHECKBOX "Barra dello s&tato", IDC_PAGEFMT_SB, 180, 74, 80, 15 + LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_ALL_FILES, "Tutti i files (*.*)" + STRING_TEXT_FILES_TXT, "Files di testo (*.txt)" + STRING_TEXT_FILES_UNICODE_TXT, "Files di testo Unicode (*.txt)" + STRING_RICHTEXT_FILES_RTF, "Rich text format (*.rtf)" + STRING_NEWFILE_RICHTEXT, "Documento Rich text" + STRING_NEWFILE_TXT, "Documento di testo" + STRING_NEWFILE_TXT_UNICODE, "Documento di testo Unicode" + STRING_PRINTER_FILES_PRN, "File di stampa (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_ALIGN_LEFT, "Sinistra" + STRING_ALIGN_RIGHT, "Destra" + STRING_ALIGN_CENTER, "Centro" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_VIEWPROPS_TITLE, "Opzioni" + STRING_VIEWPROPS_TEXT, "Testo" + STRING_VIEWPROPS_RICHTEXT, "Rich text" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_PREVIEW_PRINT, "Stampa" + STRING_PREVIEW_NEXTPAGE, "Prossima pagina" + STRING_PREVIEW_PREVPAGE, "Pagina precedente" + STRING_PREVIEW_TWOPAGES, "Due pagine" + STRING_PREVIEW_ONEPAGE, "Una pagina" + STRING_PREVIEW_ZOOMIN, "Ingrandisci" + STRING_PREVIEW_ZOOMOUT, "Rimpicciolisci" + STRING_PREVIEW_CLOSE, "Chiudi" + STRING_PREVIEW_PAGE, "Page" + STRING_PREVIEW_PAGES, "Pages" + STRING_UNITS_CM, "cm" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_DEFAULT_FILENAME, "Documento" + STRING_PROMPT_SAVE_CHANGES, "Salva i cambiamenti su '%s'?" + STRING_SEARCH_FINISHED, "Finita la ricerca sul documento." + STRING_LOAD_RICHED_FAILED, "Impossibile caricare la libreria RichEdit." + STRING_SAVE_LOSEFORMATTING, "Hai scelto di salvare nel formato Testo semplice, " \ + "che causerà la perdita di tutta la formattazione. " \ + "Sei sicuro?" + STRING_INVALID_NUMBER, "Numero di formato non valido" + STRING_OLE_STORAGE_NOT_SUPPORTED, "I documenti di storage OLE non sono supportati" + STRING_WRITE_FAILED, "Impossibile salvare il file." + STRING_WRITE_ACCESS_DENIED, "Non hai i diritti di accesso per salvare il file." + STRING_OPEN_FAILED, "Impossibile aprire il file." + STRING_OPEN_ACCESS_DENIED, "Non hai i diritti di accesso per aprire il file." + STRING_PRINTING_NOT_IMPLEMENTED, "Stampa non implementata" + STRING_MAX_TAB_STOPS, "Non si possono aggiungere più di 32 punti di fermata delle tabulazioni." +END diff --git a/reactos/base/applications/wordpad/Ja.rc b/reactos/base/applications/wordpad/Ja.rc index 6e08b569c60..bd5e4c9ea94 100644 --- a/reactos/base/applications/wordpad/Ja.rc +++ b/reactos/base/applications/wordpad/Ja.rc @@ -49,7 +49,7 @@ BEGIN MENUITEM "クリア(&C)\tDEL", ID_EDIT_CLEAR MENUITEM "すべて選択(&S)\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "検索(&F)...\tCrtl+F", ID_FIND + MENUITEM "検索(&F)...\tCtrl+F", ID_FIND MENUITEM "次を検索(&N)\tF3", ID_FIND_NEXT MENUITEM "置換(&R)...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -109,6 +109,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "黒" ID_COLOR_BLACK + MENUITEM "茶色" ID_COLOR_MAROON + MENUITEM "緑" ID_COLOR_GREEN + MENUITEM "オリーブ" ID_COLOR_OLIVE + MENUITEM "紺" ID_COLOR_NAVY + MENUITEM "紫" ID_COLOR_PURPLE + MENUITEM "青緑" ID_COLOR_TEAL + MENUITEM "灰色" ID_COLOR_GRAY + MENUITEM "銀色" ID_COLOR_SILVER + MENUITEM "赤" ID_COLOR_RED + MENUITEM "黄緑" ID_COLOR_LIME + MENUITEM "黄" ID_COLOR_YELLOW + MENUITEM "青" ID_COLOR_BLUE + MENUITEM "赤紫" ID_COLOR_FUCHSIA + MENUITEM "水色" ID_COLOR_AQUA + MENUITEM "白" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "日付と時刻" @@ -221,7 +245,11 @@ BEGIN STRING_PREVIEW_PREVPAGE, "前のページ" STRING_PREVIEW_TWOPAGES, "2ページ" STRING_PREVIEW_ONEPAGE, "1ページ" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "閉じる" + STRING_PREVIEW_PAGE, "Page" + STRING_PREVIEW_PAGES, "Pages" END STRINGTABLE DISCARDABLE @@ -247,4 +275,3 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "プリントが実装されていません。" STRING_MAX_TAB_STOPS, "32以上なタブを追加できません。" END -#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Ko.rc b/reactos/base/applications/wordpad/Ko.rc index 2e460afdae9..81110831b75 100644 --- a/reactos/base/applications/wordpad/Ko.rc +++ b/reactos/base/applications/wordpad/Ko.rc @@ -47,7 +47,7 @@ BEGIN MENUITEM "(&C)\tDEL", ID_EDIT_CLEAR MENUITEM " (&S)\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "ã(&F)...\tCrtl+F", ID_FIND + MENUITEM "ã(&F)...\tCtrl+F", ID_FIND MENUITEM " ã(&N)\tF3", ID_FIND_NEXT MENUITEM " ٲٱ(&R)...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -107,6 +107,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "" ID_COLOR_BLACK + MENUITEM "" ID_COLOR_MAROON + MENUITEM "" ID_COLOR_GREEN + MENUITEM "ø" ID_COLOR_OLIVE + MENUITEM "£ " ID_COLOR_NAVY + MENUITEM "ȫ" ID_COLOR_PURPLE + MENUITEM " " ID_COLOR_TEAL + MENUITEM "ȸ" ID_COLOR_GRAY + MENUITEM "" ID_COLOR_SILVER + MENUITEM "" ID_COLOR_RED + MENUITEM "ӻ" ID_COLOR_LIME + MENUITEM "" ID_COLOR_YELLOW + MENUITEM "Ķ" ID_COLOR_BLUE + MENUITEM "ȫ" ID_COLOR_FUCHSIA + MENUITEM "" ID_COLOR_AQUA + MENUITEM "Ͼ" ID_COLOR_WHITE + MENUITEM "ڵ" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "¥ ð" @@ -212,8 +236,12 @@ BEGIN STRING_PREVIEW_PREVPAGE, " " STRING_PREVIEW_TWOPAGES, " " STRING_PREVIEW_ONEPAGE, " " + STRING_PREVIEW_ZOOMIN, "Ȯ" + STRING_PREVIEW_ZOOMOUT, "" STRING_PREVIEW_CLOSE, "ݱ" - STRING_UNITS_CM, "cm" + STRING_PREVIEW_PAGE, "" + STRING_PREVIEW_PAGES, "" + STRING_UNITS_CM, "cm" END STRINGTABLE DISCARDABLE diff --git a/reactos/base/applications/wordpad/Lt.rc b/reactos/base/applications/wordpad/Lt.rc index e1781ebf90d..c9f2571ccc1 100644 --- a/reactos/base/applications/wordpad/Lt.rc +++ b/reactos/base/applications/wordpad/Lt.rc @@ -49,7 +49,7 @@ BEGIN MENUITEM "&Šalinti\tDEL", ID_EDIT_CLEAR MENUITEM "&Pažymėti viską\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "I&eškoti...\tCrtl+F", ID_FIND + MENUITEM "I&eškoti...\tCtrl+F", ID_FIND MENUITEM "Iešk&oti kito\tF3", ID_FIND_NEXT MENUITEM "Pa&keisti...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -109,6 +109,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Juoda" ID_COLOR_BLACK + MENUITEM "Kaštoninė" ID_COLOR_MAROON + MENUITEM "Žalia" ID_COLOR_GREEN + MENUITEM "Alyvinė" ID_COLOR_OLIVE + MENUITEM "Ultramarinas" ID_COLOR_NAVY + MENUITEM "Purpurinė" ID_COLOR_PURPLE + MENUITEM "Neutrali ciano" ID_COLOR_TEAL + MENUITEM "Pilka" ID_COLOR_GRAY + MENUITEM "Sidabrinė" ID_COLOR_SILVER + MENUITEM "Raudona" ID_COLOR_RED + MENUITEM "Gelsvai žalsva" ID_COLOR_LIME + MENUITEM "Geltona" ID_COLOR_YELLOW + MENUITEM "Mėlyna" ID_COLOR_BLUE + MENUITEM "Fuksija" ID_COLOR_FUCHSIA + MENUITEM "Žydra" ID_COLOR_AQUA + MENUITEM "Balta" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Data ir laikas" @@ -221,7 +245,11 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Ankstesnis puslapis" STRING_PREVIEW_TWOPAGES, "Du puslapiai" STRING_PREVIEW_ONEPAGE, "Vienas puslapis" + STRING_PREVIEW_ZOOMIN, "Didinti" + STRING_PREVIEW_ZOOMOUT, "Mažinti" STRING_PREVIEW_CLOSE, "Užverti" + STRING_PREVIEW_PAGE, "Puslapis" + STRING_PREVIEW_PAGES, "Puslapiai" END STRINGTABLE DISCARDABLE @@ -247,4 +275,3 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "Spausdinimas nerealizuotas" STRING_MAX_TAB_STOPS, "Negalima pridėti daugiau negu 32-jų tabuliavimo pozicijų." END -#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Nl.rc b/reactos/base/applications/wordpad/Nl.rc index 10729e41df5..5741dbea9b7 100644 --- a/reactos/base/applications/wordpad/Nl.rc +++ b/reactos/base/applications/wordpad/Nl.rc @@ -47,7 +47,7 @@ BEGIN MENUITEM "&Verwijderen\tDel", ID_EDIT_CLEAR MENUITEM "&Alles selecteren\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Zoeken...\tCrtl+F", ID_FIND + MENUITEM "&Zoeken...\tCtrl+F", ID_FIND MENUITEM "Zoek vo&lgende\tF3", ID_FIND_NEXT MENUITEM "Ve&rvang...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -107,6 +107,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Zwart" ID_COLOR_BLACK + MENUITEM "Kastanjebruin" ID_COLOR_MAROON + MENUITEM "Groen" ID_COLOR_GREEN + MENUITEM "Olijfgroen" ID_COLOR_OLIVE + MENUITEM "Marineblauw" ID_COLOR_NAVY + MENUITEM "Paars" ID_COLOR_PURPLE + MENUITEM "Groenblauw" ID_COLOR_TEAL + MENUITEM "Grijs" ID_COLOR_GRAY + MENUITEM "Zilver" ID_COLOR_SILVER + MENUITEM "Rood" ID_COLOR_RED + MENUITEM "Lichtgroen" ID_COLOR_LIME + MENUITEM "Geel" ID_COLOR_YELLOW + MENUITEM "Blauw" ID_COLOR_BLUE + MENUITEM "Fuchsiapaars" ID_COLOR_FUCHSIA + MENUITEM "Zeeblauw" ID_COLOR_AQUA + MENUITEM "Wit" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Datum en tijd" @@ -211,7 +235,11 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Vorige pagina" STRING_PREVIEW_TWOPAGES, "Twee pagina's" STRING_PREVIEW_ONEPAGE, "Een pagina" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Sluiten" + STRING_PREVIEW_PAGE, "Page" + STRING_PREVIEW_PAGES, "Pages" END STRINGTABLE DISCARDABLE diff --git a/reactos/base/applications/wordpad/No.rc b/reactos/base/applications/wordpad/No.rc index 4409c30e9c6..fbca2a09bee 100644 --- a/reactos/base/applications/wordpad/No.rc +++ b/reactos/base/applications/wordpad/No.rc @@ -48,7 +48,7 @@ BEGIN MENUITEM "&Fjern\tDEL", ID_EDIT_CLEAR MENUITEM "&Merk alt\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Søk etter...\tCrtl+F", ID_FIND + MENUITEM "&Søk etter...\tCtrl+F", ID_FIND MENUITEM "Søk etter &neste\tF3", ID_FIND_NEXT MENUITEM "E&rstatt...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -108,6 +108,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Svart" ID_COLOR_BLACK + MENUITEM "Rødbrun" ID_COLOR_MAROON + MENUITEM "Grønn" ID_COLOR_GREEN + MENUITEM "Oliven" ID_COLOR_OLIVE + MENUITEM "Marineblå" ID_COLOR_NAVY + MENUITEM "Purpur" ID_COLOR_PURPLE + MENUITEM "Teal" ID_COLOR_TEAL + MENUITEM "Grå" ID_COLOR_GRAY + MENUITEM "Sølv" ID_COLOR_SILVER + MENUITEM "Rød" ID_COLOR_RED + MENUITEM "Lime-grønn" ID_COLOR_LIME + MENUITEM "Gul" ID_COLOR_YELLOW + MENUITEM "Blå" ID_COLOR_BLUE + MENUITEM "Fuchsia" ID_COLOR_FUCHSIA + MENUITEM "Aqua" ID_COLOR_AQUA + MENUITEM "Hvit" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Dato og klokkeslett" @@ -220,7 +244,11 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Forrige side" STRING_PREVIEW_TWOPAGES, "To sider" STRING_PREVIEW_ONEPAGE, "Én side" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Lukk" + STRING_PREVIEW_PAGE, "Page" + STRING_PREVIEW_PAGES, "Pages" END STRINGTABLE DISCARDABLE @@ -246,4 +274,3 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "Utskriftfunksjonen er ikke laget ennå." STRING_MAX_TAB_STOPS, "Kan ikke legge til mer enn 32 tabulatorstopp." END -#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Pl.rc b/reactos/base/applications/wordpad/Pl.rc index ab72104e5d0..4d403041858 100644 --- a/reactos/base/applications/wordpad/Pl.rc +++ b/reactos/base/applications/wordpad/Pl.rc @@ -47,7 +47,7 @@ BEGIN MENUITEM "&Usu\tDel", ID_EDIT_CLEAR MENUITEM "&Zaznacz wszystko\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "Znaj&d...\tCrtl+F", ID_FIND + MENUITEM "Znaj&d...\tCtrl+F", ID_FIND MENUITEM "Z&najd nastpny\tF3", ID_FIND_NEXT MENUITEM "Za&mie...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -107,6 +107,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Czarny" ID_COLOR_BLACK + MENUITEM "Kasztanowy" ID_COLOR_MAROON + MENUITEM "Zielony" ID_COLOR_GREEN + MENUITEM "Oliwkowy" ID_COLOR_OLIVE + MENUITEM "Granatowy" ID_COLOR_NAVY + MENUITEM "Purpurowy" ID_COLOR_PURPLE + MENUITEM "Zielonomodry" ID_COLOR_TEAL + MENUITEM "Szary" ID_COLOR_GRAY + MENUITEM "Srebrny" ID_COLOR_SILVER + MENUITEM "Czerwony" ID_COLOR_RED + MENUITEM "Limonowy" ID_COLOR_LIME + MENUITEM "ty" ID_COLOR_YELLOW + MENUITEM "Niebieski" ID_COLOR_BLUE + MENUITEM "Fuksja" ID_COLOR_FUCHSIA + MENUITEM "Akwamaryna" ID_COLOR_AQUA + MENUITEM "Biay" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Data i godzina" @@ -219,7 +243,11 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Poprz. strona" STRING_PREVIEW_TWOPAGES, "Two pages" STRING_PREVIEW_ONEPAGE, "One page" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Zamknij" + STRING_PREVIEW_PAGE, "Page" + STRING_PREVIEW_PAGES, "Pages" END STRINGTABLE DISCARDABLE diff --git a/reactos/base/applications/wordpad/Pt.rc b/reactos/base/applications/wordpad/Pt.rc index b93237202e8..2a2ae4b749b 100644 --- a/reactos/base/applications/wordpad/Pt.rc +++ b/reactos/base/applications/wordpad/Pt.rc @@ -50,7 +50,7 @@ BEGIN MENUITEM "&Limpar\tDEL", ID_EDIT_CLEAR MENUITEM "&Seleccionar tudo\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "Local&izar...\tCrtl+F", ID_FIND + MENUITEM "Local&izar...\tCtrl+F", ID_FIND MENUITEM "&Encontrar Seguinte\tF3", ID_FIND_NEXT MENUITEM "&Substituir...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -110,6 +110,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Preto" ID_COLOR_BLACK + MENUITEM "Castanho" ID_COLOR_MAROON + MENUITEM "Verde" ID_COLOR_GREEN + MENUITEM "Verde-oliva" ID_COLOR_OLIVE + MENUITEM "Azul-marinho" ID_COLOR_NAVY + MENUITEM "Roxo" ID_COLOR_PURPLE + MENUITEM "Azul-petróleo" ID_COLOR_TEAL + MENUITEM "Cinza" ID_COLOR_GRAY + MENUITEM "Prateado" ID_COLOR_SILVER + MENUITEM "Vermelho" ID_COLOR_RED + MENUITEM "Verde-limão" ID_COLOR_LIME + MENUITEM "Amarelo" ID_COLOR_YELLOW + MENUITEM "Azul" ID_COLOR_BLUE + MENUITEM "Fúcsia" ID_COLOR_FUCHSIA + MENUITEM "Azul-piscina" ID_COLOR_AQUA + MENUITEM "Branco" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Data e hora" @@ -222,7 +246,11 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Página anterior" STRING_PREVIEW_TWOPAGES, "Duas páginas" STRING_PREVIEW_ONEPAGE, "Uma página" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Fechar" + STRING_PREVIEW_PAGE, "Page" + STRING_PREVIEW_PAGES, "Pages" END STRINGTABLE DISCARDABLE @@ -248,4 +276,3 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "Impressão não implementada" STRING_MAX_TAB_STOPS, "Não pode adicionar mais de 32 tabs." END -#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Ru.rc b/reactos/base/applications/wordpad/Ru.rc index 3aeaf66a9d0..230003b3c61 100644 --- a/reactos/base/applications/wordpad/Ru.rc +++ b/reactos/base/applications/wordpad/Ru.rc @@ -49,7 +49,7 @@ BEGIN MENUITEM "&Удалить\tDEL", ID_EDIT_CLEAR MENUITEM "Выделить в&се\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Найти...\tCrtl+F", ID_FIND + MENUITEM "&Найти...\tCtrl+F", ID_FIND MENUITEM "На&йти далее\tF3", ID_FIND_NEXT MENUITEM "&Заменить...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -109,6 +109,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Чёрный" ID_COLOR_BLACK + MENUITEM "Тёмно-бордовый" ID_COLOR_MAROON + MENUITEM "Зелёный" ID_COLOR_GREEN + MENUITEM "Оливковый" ID_COLOR_OLIVE + MENUITEM "Тёмно-синий" ID_COLOR_NAVY + MENUITEM "Пурпурный" ID_COLOR_PURPLE + MENUITEM "Морской волны" ID_COLOR_TEAL + MENUITEM "Серый" ID_COLOR_GRAY + MENUITEM "Серебряный" ID_COLOR_SILVER + MENUITEM "Красный" ID_COLOR_RED + MENUITEM "Лимонный" ID_COLOR_LIME + MENUITEM "Жёлтый" ID_COLOR_YELLOW + MENUITEM "Синий" ID_COLOR_BLUE + MENUITEM "Ярко-розовый" ID_COLOR_FUCHSIA + MENUITEM "Голубой" ID_COLOR_AQUA + MENUITEM "Белый" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Дата и время" @@ -221,7 +245,11 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Предыдущая страница" STRING_PREVIEW_TWOPAGES, "Две страницы" STRING_PREVIEW_ONEPAGE, "Одна страница" + STRING_PREVIEW_ZOOMIN, "Приблизить" + STRING_PREVIEW_ZOOMOUT, "Отдалить" STRING_PREVIEW_CLOSE, "Закрыть" + STRING_PREVIEW_PAGE, "Page" + STRING_PREVIEW_PAGES, "Pages" END STRINGTABLE DISCARDABLE @@ -247,4 +275,3 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "Печать не поддерживается" STRING_MAX_TAB_STOPS, "Нельзя добавить более 32 позиций табуляции." END -#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Si.rc b/reactos/base/applications/wordpad/Si.rc index 4fa9cfe08c2..f7e0c722b46 100644 --- a/reactos/base/applications/wordpad/Si.rc +++ b/reactos/base/applications/wordpad/Si.rc @@ -48,7 +48,7 @@ BEGIN MENUITEM "Po&briši\tDEL", ID_EDIT_CLEAR MENUITEM "Izberi &vse\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "Na&jdi ...\tCrtl+F", ID_FIND + MENUITEM "Na&jdi ...\tCtrl+F", ID_FIND MENUITEM "Najdi n&aslednje\tF3", ID_FIND_NEXT MENUITEM "Za&menjaj ...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -108,6 +108,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Črna" ID_COLOR_BLACK + MENUITEM "Kostanjeva" ID_COLOR_MAROON + MENUITEM "Zelena" ID_COLOR_GREEN + MENUITEM "Olivna" ID_COLOR_OLIVE + MENUITEM "Mornariška" ID_COLOR_NAVY + MENUITEM "Vijolična" ID_COLOR_PURPLE + MENUITEM "Zelenomodra" ID_COLOR_TEAL + MENUITEM "Siva" ID_COLOR_GRAY + MENUITEM "Srebrna" ID_COLOR_SILVER + MENUITEM "Rdeča" ID_COLOR_RED + MENUITEM "Citronska" ID_COLOR_LIME + MENUITEM "Rumena" ID_COLOR_YELLOW + MENUITEM "Modra" ID_COLOR_BLUE + MENUITEM "Roza" ID_COLOR_FUCHSIA + MENUITEM "Akvamarin" ID_COLOR_AQUA + MENUITEM "Bela" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Datum in čas" @@ -220,7 +244,11 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Prejšnja" STRING_PREVIEW_TWOPAGES, "Dve strani" STRING_PREVIEW_ONEPAGE, "Ena stran" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Zapri" + STRING_PREVIEW_PAGE, "Page" + STRING_PREVIEW_PAGES, "Pages" END STRINGTABLE DISCARDABLE @@ -247,4 +275,3 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "Tiskanje (še) ni na voljo" STRING_MAX_TAB_STOPS, "Ne morem vstaviti več kot 32 položajev tabulatorja." END -#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Sv.rc b/reactos/base/applications/wordpad/Sv.rc index f8ac17f77c6..edc35a9b24a 100644 --- a/reactos/base/applications/wordpad/Sv.rc +++ b/reactos/base/applications/wordpad/Sv.rc @@ -48,7 +48,7 @@ BEGIN MENUITEM "Ta &bort\tDEL", ID_EDIT_CLEAR MENUITEM "&Markera allt\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Sök...\tCrtl+F", ID_FIND + MENUITEM "&Sök...\tCtrl+F", ID_FIND MENUITEM "Sök &nästa\tF3", ID_FIND_NEXT MENUITEM "&Ersätt...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -108,6 +108,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Svart" ID_COLOR_BLACK + MENUITEM "Rödbrun" ID_COLOR_MAROON + MENUITEM "Grön" ID_COLOR_GREEN + MENUITEM "Oliv" ID_COLOR_OLIVE + MENUITEM "Navy" ID_COLOR_NAVY + MENUITEM "Lila" ID_COLOR_PURPLE + MENUITEM "Teal" ID_COLOR_TEAL + MENUITEM "Grå" ID_COLOR_GRAY + MENUITEM "Silver" ID_COLOR_SILVER + MENUITEM "Röd" ID_COLOR_RED + MENUITEM "Lime" ID_COLOR_LIME + MENUITEM "Gul" ID_COLOR_YELLOW + MENUITEM "Blå" ID_COLOR_BLUE + MENUITEM "Fuchsia" ID_COLOR_FUCHSIA + MENUITEM "Aqua" ID_COLOR_AQUA + MENUITEM "Vit" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Datum och tid" @@ -220,7 +244,11 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Föregående sida" STRING_PREVIEW_TWOPAGES, "Två sidor" STRING_PREVIEW_ONEPAGE, "En sida" + STRING_PREVIEW_ZOOMIN, "Zooma in" + STRING_PREVIEW_ZOOMOUT, "Zooma ut" STRING_PREVIEW_CLOSE, "Stäng" + STRING_PREVIEW_PAGE, "Sida" + STRING_PREVIEW_PAGES, "Sidor" END STRINGTABLE DISCARDABLE @@ -246,4 +274,3 @@ BEGIN STRING_PRINTING_NOT_IMPLEMENTED, "Utskrift ej implementerat." STRING_MAX_TAB_STOPS, "Kan ej lägga till mer än 32 tabbstopp." END -#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/Tr.rc b/reactos/base/applications/wordpad/Tr.rc index 92290371d37..ef66aa40ad8 100644 --- a/reactos/base/applications/wordpad/Tr.rc +++ b/reactos/base/applications/wordpad/Tr.rc @@ -48,7 +48,7 @@ BEGIN MENUITEM "&Sil\tDel", ID_EDIT_CLEAR MENUITEM "&Tmn se\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "&Find...\tCrtl+F", ID_FIND + MENUITEM "&Find...\tCtrl+F", ID_FIND MENUITEM "Find &next\tF3", ID_FIND_NEXT MENUITEM "&Replace...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -108,6 +108,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Siyah" ID_COLOR_BLACK + MENUITEM "Koyu Krmz" ID_COLOR_MAROON + MENUITEM "Yeil" ID_COLOR_GREEN + MENUITEM "Koyu Sar" ID_COLOR_OLIVE + MENUITEM "Koyu Mavi" ID_COLOR_NAVY + MENUITEM "Mor" ID_COLOR_PURPLE + MENUITEM "Deniz Mavisi" ID_COLOR_TEAL + MENUITEM "Gri" ID_COLOR_GRAY + MENUITEM "Gm" ID_COLOR_SILVER + MENUITEM "Krmz" ID_COLOR_RED + MENUITEM "Parlak Yeil" ID_COLOR_LIME + MENUITEM "Sar" ID_COLOR_YELLOW + MENUITEM "Mavi" ID_COLOR_BLUE + MENUITEM "Pembe" ID_COLOR_FUCHSIA + MENUITEM "Turkuaz" ID_COLOR_AQUA + MENUITEM "Beyaz" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "Date and time" @@ -220,7 +244,11 @@ BEGIN STRING_PREVIEW_PREVPAGE, "Previous page" STRING_PREVIEW_TWOPAGES, "Two pages" STRING_PREVIEW_ONEPAGE, "One page" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "Close" + STRING_PREVIEW_PAGE, "Page" + STRING_PREVIEW_PAGES, "Pages" END STRINGTABLE DISCARDABLE diff --git a/reactos/base/applications/wordpad/Uk.rc b/reactos/base/applications/wordpad/Uk.rc new file mode 100644 index 00000000000..35e35977e59 --- /dev/null +++ b/reactos/base/applications/wordpad/Uk.rc @@ -0,0 +1,278 @@ +/* + * Copyright 2004 by Krzysztof Foltman + * + * Ukrainian language support + * + * Copyright (C) 2010 Igor Paliychuk + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wordpad.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +IDM_MAINMENU MENU DISCARDABLE +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Новий...\tCtrl+N", ID_FILE_NEW + MENUITEM "&Відкрити...\tCtrl+O", ID_FILE_OPEN + MENUITEM "&Зберегти\tCtrl+S", ID_FILE_SAVE + MENUITEM "Зберегти &як...", ID_FILE_SAVEAS + MENUITEM SEPARATOR + MENUITEM "&Друк...\tCtrl+P", ID_PRINT + MENUITEM "Попередній перег&ляд...", ID_PREVIEW + MENUITEM "Налаштування &сторінки...", ID_PRINTSETUP + MENUITEM SEPARATOR + MENUITEM "В&ихід", ID_FILE_EXIT + END + POPUP "&Правка" + BEGIN + MENUITEM "&Відмінити\tCtrl+Z", ID_EDIT_UNDO + MENUITEM "Повт&орити\tCtrl+Y", ID_EDIT_REDO + MENUITEM SEPARATOR + MENUITEM "Виріза&ти\tCtrl+X", ID_EDIT_CUT + MENUITEM "&Копіювати\tCtrl+C", ID_EDIT_COPY + MENUITEM "В&ставити\tCtrl+V", ID_EDIT_PASTE + MENUITEM "О&чистити\tDEL", ID_EDIT_CLEAR + MENUITEM "Виб&рати все\tCtrl+A", ID_EDIT_SELECTALL + MENUITEM SEPARATOR + MENUITEM "&Знайти...\tCtrl+F", ID_FIND + MENUITEM "Знайти д&алі\tF3", ID_FIND_NEXT + MENUITEM "За&мінтити...\tCtrl+H", ID_REPLACE + MENUITEM SEPARATOR + MENUITEM "Лише д&ля читання", ID_EDIT_READONLY + MENUITEM "Зм&інений", ID_EDIT_MODIFIED + MENUITEM SEPARATOR + POPUP "Д&одатково" + BEGIN + MENUITEM "&Інформація про виділення", ID_EDIT_SELECTIONINFO + MENUITEM "&Формат символів", ID_EDIT_CHARFORMAT + MENUITEM "Формат символів &по замовчуванні", ID_EDIT_DEFCHARFORMAT + MENUITEM "Paragrap&h format", ID_EDIT_PARAFORMAT + MENUITEM "&Взяти текст", ID_EDIT_GETTEXT + END + END + POPUP "&Вигляд" + BEGIN + MENUITEM "Панель інс&трументів", ID_TOGGLE_TOOLBAR + MENUITEM "Панель &форматування", ID_TOGGLE_FORMATBAR + MENUITEM "&Лінійка", ID_TOGGLE_RULER + MENUITEM "&Рядок стану", ID_TOGGLE_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "&Параметри...", ID_VIEWPROPERTIES + END + POPUP "&Вставка" + BEGIN + MENUITEM "&Дата та час...", ID_DATETIME + END + POPUP "Ф&ормат" + BEGIN + MENUITEM "&Шрифт...", ID_FONTSETTINGS + MENUITEM "&Bullet points" ID_BULLET + MENUITEM "&Абзац..." ID_PARAFORMAT + MENUITEM "&Табуляція..." ID_TABSTOPS + POPUP "&Фон" + BEGIN + MENUITEM "&Ситсемний\tCtrl+1", ID_BACK_1 + MENUITEM "&Жовтуватий PostThat\tCtrl+2", ID_BACK_2 + END + END + POPUP "&Довідка" + BEGIN + MENUITEM "&Про Wine Wordpad" ID_ABOUT + END +END + +IDM_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Вир&ізати", ID_EDIT_CUT + MENUITEM "&Копіювати", ID_EDIT_COPY + MENUITEM "&Вставити", ID_EDIT_PASTE + MENUITEM SEPARATOR + MENUITEM "&Bullet points" ID_BULLET + MENUITEM "&Абзац..." ID_PARAFORMAT + END +END + +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "×îðíèé" ID_COLOR_BLACK + MENUITEM "Áðóíàòíèé" ID_COLOR_MAROON + MENUITEM "Çåëåíèé" ID_COLOR_GREEN + MENUITEM "Îëèâêîâèé" ID_COLOR_OLIVE + MENUITEM "Ñèí³é" ID_COLOR_NAVY + MENUITEM "Ïóðïóðíèé" ID_COLOR_PURPLE + MENUITEM "Çåëåíî-ñèí³é" ID_COLOR_TEAL + MENUITEM "ѳðèé" ID_COLOR_GRAY + MENUITEM "Ñð³áíèé" ID_COLOR_SILVER + MENUITEM "×åðâîíèé" ID_COLOR_RED + MENUITEM "Ñàëàòîâèé" ID_COLOR_LIME + MENUITEM "Æîâòèé" ID_COLOR_YELLOW + MENUITEM "Ãîëóáèé" ID_COLOR_BLUE + MENUITEM "Ô³îëåòîâèé" ID_COLOR_FUCHSIA + MENUITEM "Àêâàìàðèí" ID_COLOR_AQUA + MENUITEM "Á³ëèé" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + +IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Дата та час" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Доступні формати",-1,3,2,100,15 + LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY + PUSHBUTTON "&OK",IDOK,87,12,40,12 + PUSHBUTTON "&Скасувати",IDCANCEL,87,26,40,12 +END + +IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Новий" +FONT 10, "MS Sans Serif" +BEGIN + LTEXT "Тип нового документу",-1,3,2,100,15 + LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT + PUSHBUTTON "&OK",IDOK,97,12,40,12 + PUSHBUTTON "&Скасувати",IDCANCEL,97,26,40,12 +END + +IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "Абзац" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Відступ", -1, 10, 10, 120, 68 + LTEXT "Зліва", -1, 15, 22, 40, 13 + EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 + LTEXT "Справа", -1, 15, 40, 40, 13 + EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13 + LTEXT "Перший рядок", -1, 15, 58, 40, 13 + EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13 + LTEXT "Вирівнювання", -1, 15, 87, 40, 13 + COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST + PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&Скасувати", IDCANCEL, 137, 33, 50, 15 +END + +IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "Табуляція" +FONT 8, "MS SHell DLg" +BEGIN + GROUPBOX "Tab stops", -1, 10, 10, 120, 90 + COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE + DEFPUSHBUTTON "&Додати", ID_TAB_ADD, 20, 80, 45, 15 + PUSHBUTTON "&Видалити", ID_TAB_DEL, 72, 80, 45, 15 + PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15 + PUSHBUTTON "&Скасувати", IDCANCEL, 137, 33, 50, 15 + PUSHBUTTON "Видалити в&се", ID_TAB_EMPTY, 137, 51, 50, 15 +END + +IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +STYLE DS_SYSMODAL +Caption "" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Line wrapping", -1, 10, 10, 130, 85 + RADIOBUTTON "&No line wrapping", IDC_PAGEFMT_WN, 18, 25, 117, 15 + RADIOBUTTON "Wrap text by the &window border", IDC_PAGEFMT_WW, 18, 45, 117, 15 + RADIOBUTTON "Wrap text by the &margin", IDC_PAGEFMT_WM, 18, 65, 117, 15 + GROUPBOX "Toolbars", -1, 150, 10, 120, 85 + CHECKBOX "&Toolbar", IDC_PAGEFMT_TB, 160, 20, 80, 15 + CHECKBOX "&Formatbar", IDC_PAGEFMT_FB, 160, 38, 80, 15 + CHECKBOX "&Лінійка", IDC_PAGEFMT_RU, 160, 56, 80, 15 + CHECKBOX "&Рядоу стану", IDC_PAGEFMT_SB, 160, 74, 80, 15 + LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_ALL_FILES, "Всі документи (*.*)" + STRING_TEXT_FILES_TXT, "Текстові документи (*.txt)" + STRING_TEXT_FILES_UNICODE_TXT, "Текстовий документ Unicode (*.txt)" + STRING_RICHTEXT_FILES_RTF, "Rich text format (*.rtf)" + STRING_NEWFILE_RICHTEXT, "Rich text документ" + STRING_NEWFILE_TXT, "Текстовий документ" + STRING_NEWFILE_TXT_UNICODE, "Текстовий документ Unicode" + STRING_PRINTER_FILES_PRN, "Printer files (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_ALIGN_LEFT, "По Лівому Краю" + STRING_ALIGN_RIGHT, "По Правому Краю" + STRING_ALIGN_CENTER, "По Центру" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_VIEWPROPS_TITLE, "Налаштування" + STRING_VIEWPROPS_TEXT, "Текст" + STRING_VIEWPROPS_RICHTEXT, "Rich text" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_PREVIEW_PRINT, "Друк" + STRING_PREVIEW_NEXTPAGE, "Наступна сторінка" + STRING_PREVIEW_PREVPAGE, "Попередня сторінка" + STRING_PREVIEW_TWOPAGES, "Дві сторінки" + STRING_PREVIEW_ONEPAGE, "Одна сторінка" + STRING_PREVIEW_ZOOMIN, "Збільшити" + STRING_PREVIEW_ZOOMOUT, "Зменшити" + STRING_PREVIEW_CLOSE, "Закрити" + STRING_PREVIEW_PAGE, "Page" + STRING_PREVIEW_PAGES, "Pages" + STRING_UNITS_CM, "cm" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_DEFAULT_FILENAME, "Документ" + STRING_PROMPT_SAVE_CHANGES, "Зберегти зміни в '%s'?" + STRING_SEARCH_FINISHED, "Покуш документу завершено." + STRING_LOAD_RICHED_FAILED, "Не вдалось завантажити бібліотеку RichEdit." + STRING_SAVE_LOSEFORMATTING, "Ви вибрали збереження в форматі простого тексту, " \ + "що призведе до втрати форматування. " \ + "Ви справді цього хочете?" + STRING_INVALID_NUMBER, "Невірний числовий формат" + STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE storage документи не підтримуються" + STRING_WRITE_FAILED, "Неможливо зберегти файл." + STRING_WRITE_ACCESS_DENIED, "Недостатньо прав для збереження файлу." + STRING_OPEN_FAILED, "Не вдалось відкрити файл." + STRING_OPEN_ACCESS_DENIED, "Недостатньо прав для відкриття файлу." + STRING_PRINTING_NOT_IMPLEMENTED, "Друк не впроваджено" + STRING_MAX_TAB_STOPS, "Неможливо додати більше 32 позицій табуляції." +END + +LANGUAGE LANG_UKRAINIAN, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +BEGIN + STRING_ALIGN_LEFT, "По Лівому Краю" + STRING_ALIGN_RIGHT, "По правому Краю" + STRING_ALIGN_CENTER, "По Центру" +END diff --git a/reactos/base/applications/wordpad/Zh.rc b/reactos/base/applications/wordpad/Zh.rc index 69531055234..6adb30af43b 100644 --- a/reactos/base/applications/wordpad/Zh.rc +++ b/reactos/base/applications/wordpad/Zh.rc @@ -51,7 +51,7 @@ BEGIN MENUITEM "删除(&D)\tDEL", ID_EDIT_CLEAR MENUITEM "全选(&S)\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "查找(&F)...\tCrtl+F", ID_FIND + MENUITEM "查找(&F)...\tCtrl+F", ID_FIND MENUITEM "找下一个(&N)\tF3", ID_FIND_NEXT MENUITEM "替换(&R)...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -111,6 +111,30 @@ BEGIN END END +IDM_COLOR_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Black", ID_COLOR_BLACK + MENUITEM "Maroon", ID_COLOR_MAROON + MENUITEM "Green", ID_COLOR_GREEN + MENUITEM "Olive" ID_COLOR_OLIVE + MENUITEM "Navy" ID_COLOR_NAVY + MENUITEM "Purple" ID_COLOR_PURPLE + MENUITEM "Teal" ID_COLOR_TEAL + MENUITEM "Gray" ID_COLOR_GRAY + MENUITEM "Silver" ID_COLOR_SILVER + MENUITEM "Red" ID_COLOR_RED + MENUITEM "Lime" ID_COLOR_LIME + MENUITEM "Yellow" ID_COLOR_YELLOW + MENUITEM "Blue" ID_COLOR_BLUE + MENUITEM "Fuchsia" ID_COLOR_FUCHSIA + MENUITEM "Aqua" ID_COLOR_AQUA + MENUITEM "White" ID_COLOR_WHITE + MENUITEM "Automatic" ID_COLOR_AUTOMATIC + END +END + IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "日期和时间" @@ -223,7 +247,11 @@ BEGIN STRING_PREVIEW_PREVPAGE, "上一页" STRING_PREVIEW_TWOPAGES, "双页" STRING_PREVIEW_ONEPAGE, "单页" + STRING_PREVIEW_ZOOMIN, "Zoom in" + STRING_PREVIEW_ZOOMOUT, "Zoom out" STRING_PREVIEW_CLOSE, "关闭" + STRING_PREVIEW_PAGE, "Page" + STRING_PREVIEW_PAGES, "Pages" END STRINGTABLE DISCARDABLE @@ -276,7 +304,7 @@ BEGIN MENUITEM "刪除(&D)\tDEL", ID_EDIT_CLEAR MENUITEM "全選(&S)\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR - MENUITEM "查找(&F)...\tCrtl+F", ID_FIND + MENUITEM "查找(&F)...\tCtrl+F", ID_FIND MENUITEM "找下一個(&N)\tF3", ID_FIND_NEXT MENUITEM "替換(&R)...\tCtrl+H", ID_REPLACE MENUITEM SEPARATOR @@ -471,4 +499,3 @@ BEGIN STRING_OPEN_FAILED, "不能開啟檔案." STRING_OPEN_ACCESS_DENIED, "你沒有開啟檔案的權力." END -#pragma code_page(default) diff --git a/reactos/base/applications/wordpad/formatbar.bmp b/reactos/base/applications/wordpad/formatbar.bmp index 9c643b11b97..310b596d92a 100644 Binary files a/reactos/base/applications/wordpad/formatbar.bmp and b/reactos/base/applications/wordpad/formatbar.bmp differ diff --git a/reactos/base/applications/wordpad/print.c b/reactos/base/applications/wordpad/print.c index 0a1343fbe05..71c06273fdb 100644 --- a/reactos/base/applications/wordpad/print.c +++ b/reactos/base/applications/wordpad/print.c @@ -27,12 +27,21 @@ typedef struct _previewinfo { int page; - int pages; + int pages_shown; + int saved_pages_shown; + int *pageEnds, pageCapacity; + int textlength; HDC hdc; HDC hdc2; HDC hdcSized; HDC hdcSized2; RECT window; + RECT rcPage; + SIZE bmSize; + SIZE bmScaledSize; + SIZE spacing; + float zoomratio; + int zoomlevel; LPWSTR wszFileName; } previewinfo, *ppreviewinfo; @@ -42,7 +51,10 @@ static HGLOBAL devNames; static RECT margins; static previewinfo preview; +extern const WCHAR wszPreviewWndClass[]; + static const WCHAR var_pagemargin[] = {'P','a','g','e','M','a','r','g','i','n',0}; +static const WCHAR var_previewpages[] = {'P','r','e','v','i','e','w','P','a','g','e','s',0}; static LPWSTR get_print_file_filter(HWND hMainWnd) { @@ -50,7 +62,7 @@ static LPWSTR get_print_file_filter(HWND hMainWnd) const WCHAR files_prn[] = {'*','.','P','R','N',0}; const WCHAR files_all[] = {'*','.','*','\0'}; LPWSTR p; - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); p = wszPrintFilter; LoadStringW(hInstance, STRING_PRINTER_FILES_PRN, p, MAX_STRING_LEN); @@ -85,10 +97,32 @@ void registry_read_pagemargins(HKEY hKey) } } +void registry_set_previewpages(HKEY hKey) +{ + RegSetValueExW(hKey, var_previewpages, 0, REG_DWORD, + (LPBYTE)&preview.pages_shown, sizeof(DWORD)); +} + +void registry_read_previewpages(HKEY hKey) +{ + DWORD size = sizeof(DWORD); + if(!hKey || + RegQueryValueExW(hKey, var_previewpages, 0, NULL, + (LPBYTE)&preview.pages_shown, &size) != ERROR_SUCCESS || + size != sizeof(DWORD)) + { + preview.pages_shown = 1; + } else { + if (preview.pages_shown < 1) preview.pages_shown = 1; + else if (preview.pages_shown > 2) preview.pages_shown = 2; + } +} + + static void AddTextButton(HWND hRebarWnd, UINT string, UINT command, UINT id) { REBARBANDINFOW rb; - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hRebarWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); WCHAR text[MAX_STRING_LEN]; HWND hButton; @@ -236,22 +270,6 @@ static LPWSTR dialog_print_to_file(HWND hMainWnd) return FALSE; } -static int get_num_pages(HWND hEditorWnd, FORMATRANGE fr) -{ - int page = 0; - fr.chrg.cpMin = 0; - - do - { - page++; - fr.chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, - (LPARAM)&fr); - } - while(fr.chrg.cpMin && fr.chrg.cpMin < fr.chrg.cpMax); - - return page; -} - static void char_from_pagenum(HWND hEditorWnd, FORMATRANGE *fr, int page) { int i; @@ -260,7 +278,9 @@ static void char_from_pagenum(HWND hEditorWnd, FORMATRANGE *fr, int page) for(i = 1; i < page; i++) { - fr->chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)fr); + int bottom = fr->rc.bottom; + fr->chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, (LPARAM)fr); + fr->rc.bottom = bottom; } } @@ -283,212 +303,6 @@ static void update_ruler(HWND hRulerWnd) redraw_ruler(hRulerWnd); } -static void print(LPPRINTDLGW pd, LPWSTR wszFileName) -{ - FORMATRANGE fr; - DOCINFOW di; - HWND hEditorWnd = GetDlgItem(pd->hwndOwner, IDC_EDITOR); - int printedPages = 0; - - fr.hdc = pd->hDC; - fr.hdcTarget = pd->hDC; - - fr.rc = get_print_rect(fr.hdc); - fr.rcPage.left = 0; - fr.rcPage.right = fr.rc.right + margins.right; - fr.rcPage.top = 0; - fr.rcPage.bottom = fr.rc.bottom + margins.bottom; - - ZeroMemory(&di, sizeof(di)); - di.cbSize = sizeof(di); - di.lpszDocName = wszFileName; - - if(pd->Flags & PD_PRINTTOFILE) - { - di.lpszOutput = dialog_print_to_file(pd->hwndOwner); - if(!di.lpszOutput) - return; - } - - if(pd->Flags & PD_SELECTION) - { - SendMessageW(hEditorWnd, EM_EXGETSEL, 0, (LPARAM)&fr.chrg); - } else - { - GETTEXTLENGTHEX gt; - gt.flags = GTL_DEFAULT; - gt.codepage = 1200; - fr.chrg.cpMin = 0; - fr.chrg.cpMax = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0); - - if(pd->Flags & PD_PAGENUMS) - char_from_pagenum(hEditorWnd, &fr, pd->nToPage); - } - - StartDocW(fr.hdc, &di); - do - { - if(StartPage(fr.hdc) <= 0) - break; - - fr.chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)&fr); - - if(EndPage(fr.hdc) <= 0) - break; - - printedPages++; - if((pd->Flags & PD_PAGENUMS) && (printedPages > (pd->nToPage - pd->nFromPage))) - break; - } - while(fr.chrg.cpMin && fr.chrg.cpMin < fr.chrg.cpMax); - - EndDoc(fr.hdc); - SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, 0); -} - -void dialog_printsetup(HWND hMainWnd) -{ - PAGESETUPDLGW ps; - - ZeroMemory(&ps, sizeof(ps)); - ps.lStructSize = sizeof(ps); - ps.hwndOwner = hMainWnd; - ps.Flags = PSD_INHUNDREDTHSOFMILLIMETERS | PSD_MARGINS; - ps.rtMargin.left = twips_to_centmm(margins.left); - ps.rtMargin.right = twips_to_centmm(margins.right); - ps.rtMargin.top = twips_to_centmm(margins.top); - ps.rtMargin.bottom = twips_to_centmm(margins.bottom); - ps.hDevMode = devMode; - ps.hDevNames = devNames; - - if(PageSetupDlgW(&ps)) - { - margins.left = centmm_to_twips(ps.rtMargin.left); - margins.right = centmm_to_twips(ps.rtMargin.right); - margins.top = centmm_to_twips(ps.rtMargin.top); - margins.bottom = centmm_to_twips(ps.rtMargin.bottom); - devMode = ps.hDevMode; - devNames = ps.hDevNames; - update_ruler(get_ruler_wnd(hMainWnd)); - } -} - -void get_default_printer_opts(void) -{ - PRINTDLGW pd; - ZeroMemory(&pd, sizeof(pd)); - - ZeroMemory(&pd, sizeof(pd)); - pd.lStructSize = sizeof(pd); - pd.Flags = PD_RETURNDC | PD_RETURNDEFAULT; - pd.hDevMode = devMode; - - PrintDlgW(&pd); - - devMode = pd.hDevMode; - devNames = pd.hDevNames; -} - -void print_quick(LPWSTR wszFileName) -{ - PRINTDLGW pd; - - ZeroMemory(&pd, sizeof(pd)); - pd.hDC = make_dc(); - - print(&pd, wszFileName); -} - -void dialog_print(HWND hMainWnd, LPWSTR wszFileName) -{ - PRINTDLGW pd; - HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR); - int from = 0; - int to = 0; - - ZeroMemory(&pd, sizeof(pd)); - pd.lStructSize = sizeof(pd); - pd.hwndOwner = hMainWnd; - pd.Flags = PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE; - pd.nMinPage = 1; - pd.nMaxPage = -1; - pd.hDevMode = devMode; - pd.hDevNames = devNames; - - SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&from, (LPARAM)&to); - if(from == to) - pd.Flags |= PD_NOSELECTION; - - if(PrintDlgW(&pd)) - { - devMode = pd.hDevMode; - devNames = pd.hDevNames; - print(&pd, wszFileName); - update_ruler(get_ruler_wnd(hMainWnd)); - } -} - -static void preview_bar_show(HWND hMainWnd, BOOL show) -{ - HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR); - int i; - - if(show) - { - REBARBANDINFOW rb; - HWND hStatic; - - AddTextButton(hReBar, STRING_PREVIEW_PRINT, ID_PRINT, BANDID_PREVIEW_BTN1); - AddTextButton(hReBar, STRING_PREVIEW_NEXTPAGE, ID_PREVIEW_NEXTPAGE, BANDID_PREVIEW_BTN2); - AddTextButton(hReBar, STRING_PREVIEW_PREVPAGE, ID_PREVIEW_PREVPAGE, BANDID_PREVIEW_BTN3); - AddTextButton(hReBar, STRING_PREVIEW_TWOPAGES, ID_PREVIEW_NUMPAGES, BANDID_PREVIEW_BTN4); - AddTextButton(hReBar, STRING_PREVIEW_CLOSE, ID_FILE_EXIT, BANDID_PREVIEW_BTN5); - - hStatic = CreateWindowW(WC_STATICW, NULL, - WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, - hReBar, NULL, NULL, NULL); - - rb.cbSize = REBARBANDINFOW_V6_SIZE; - rb.fMask = RBBIM_SIZE | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_CHILD | RBBIM_IDEALSIZE | RBBIM_ID; - rb.fStyle = RBBS_NOGRIPPER | RBBS_VARIABLEHEIGHT; - rb.hwndChild = hStatic; - rb.cyChild = rb.cyMinChild = 22; - rb.cx = rb.cxMinChild = 90; - rb.cxIdeal = 100; - rb.wID = BANDID_PREVIEW_BUFFER; - - SendMessageW(hReBar, RB_INSERTBAND, -1, (LPARAM)&rb); - } else - { - for(i = 0; i <= PREVIEW_BUTTONS; i++) - SendMessageW(hReBar, RB_DELETEBAND, SendMessageW(hReBar, RB_IDTOINDEX, BANDID_PREVIEW_BTN1+i, 0), 0); - } -} - -void init_preview(HWND hMainWnd, LPWSTR wszFileName) -{ - preview.page = 1; - preview.hdc = 0; - preview.hdc2 = 0; - preview.wszFileName = wszFileName; - preview_bar_show(hMainWnd, TRUE); -} - -void close_preview(HWND hMainWnd) -{ - preview.window.right = 0; - preview.window.bottom = 0; - preview.page = 0; - preview.pages = 0; - - preview_bar_show(hMainWnd, FALSE); -} - -BOOL preview_isactive(void) -{ - return preview.page != 0; -} - static void add_ruler_units(HDC hdcRuler, RECT* drawRect, BOOL NewMetrics, LONG EditLeftmost) { static HDC hdc; @@ -628,25 +442,296 @@ LRESULT CALLBACK ruler_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) return 0; } -static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float ratio, int bmNewWidth, int bmNewHeight, int bmWidth, int bmHeight) +static void print(LPPRINTDLGW pd, LPWSTR wszFileName) +{ + FORMATRANGE fr; + DOCINFOW di; + HWND hEditorWnd = GetDlgItem(pd->hwndOwner, IDC_EDITOR); + int printedPages = 0; + + fr.hdc = pd->hDC; + fr.hdcTarget = pd->hDC; + + fr.rc = get_print_rect(fr.hdc); + fr.rcPage.left = 0; + fr.rcPage.right = fr.rc.right + margins.right; + fr.rcPage.top = 0; + fr.rcPage.bottom = fr.rc.bottom + margins.bottom; + + ZeroMemory(&di, sizeof(di)); + di.cbSize = sizeof(di); + di.lpszDocName = wszFileName; + + if(pd->Flags & PD_PRINTTOFILE) + { + di.lpszOutput = dialog_print_to_file(pd->hwndOwner); + if(!di.lpszOutput) + return; + } + + if(pd->Flags & PD_SELECTION) + { + SendMessageW(hEditorWnd, EM_EXGETSEL, 0, (LPARAM)&fr.chrg); + } else + { + GETTEXTLENGTHEX gt; + gt.flags = GTL_DEFAULT; + gt.codepage = 1200; + fr.chrg.cpMin = 0; + fr.chrg.cpMax = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0); + + if(pd->Flags & PD_PAGENUMS) + char_from_pagenum(hEditorWnd, &fr, pd->nToPage); + } + + StartDocW(fr.hdc, &di); + do + { + int bottom = fr.rc.bottom; + if(StartPage(fr.hdc) <= 0) + break; + + fr.chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)&fr); + + if(EndPage(fr.hdc) <= 0) + break; + bottom = fr.rc.bottom; + + printedPages++; + if((pd->Flags & PD_PAGENUMS) && (printedPages > (pd->nToPage - pd->nFromPage))) + break; + } + while(fr.chrg.cpMin && fr.chrg.cpMin < fr.chrg.cpMax); + + EndDoc(fr.hdc); + SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, 0); +} + +void dialog_printsetup(HWND hMainWnd) +{ + PAGESETUPDLGW ps; + + ZeroMemory(&ps, sizeof(ps)); + ps.lStructSize = sizeof(ps); + ps.hwndOwner = hMainWnd; + ps.Flags = PSD_INHUNDREDTHSOFMILLIMETERS | PSD_MARGINS; + ps.rtMargin.left = twips_to_centmm(margins.left); + ps.rtMargin.right = twips_to_centmm(margins.right); + ps.rtMargin.top = twips_to_centmm(margins.top); + ps.rtMargin.bottom = twips_to_centmm(margins.bottom); + ps.hDevMode = devMode; + ps.hDevNames = devNames; + + if(PageSetupDlgW(&ps)) + { + margins.left = centmm_to_twips(ps.rtMargin.left); + margins.right = centmm_to_twips(ps.rtMargin.right); + margins.top = centmm_to_twips(ps.rtMargin.top); + margins.bottom = centmm_to_twips(ps.rtMargin.bottom); + devMode = ps.hDevMode; + devNames = ps.hDevNames; + update_ruler(get_ruler_wnd(hMainWnd)); + } +} + +void get_default_printer_opts(void) +{ + PRINTDLGW pd; + ZeroMemory(&pd, sizeof(pd)); + + ZeroMemory(&pd, sizeof(pd)); + pd.lStructSize = sizeof(pd); + pd.Flags = PD_RETURNDC | PD_RETURNDEFAULT; + pd.hDevMode = devMode; + + PrintDlgW(&pd); + + devMode = pd.hDevMode; + devNames = pd.hDevNames; +} + +void print_quick(HWND hMainWnd, LPWSTR wszFileName) +{ + PRINTDLGW pd; + + ZeroMemory(&pd, sizeof(pd)); + pd.hwndOwner = hMainWnd; + pd.hDC = make_dc(); + + print(&pd, wszFileName); + DeleteDC(pd.hDC); +} + +void dialog_print(HWND hMainWnd, LPWSTR wszFileName) +{ + PRINTDLGW pd; + HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR); + int from = 0; + int to = 0; + + ZeroMemory(&pd, sizeof(pd)); + pd.lStructSize = sizeof(pd); + pd.hwndOwner = hMainWnd; + pd.Flags = PD_RETURNDC | PD_USEDEVMODECOPIESANDCOLLATE; + pd.nMinPage = 1; + pd.nMaxPage = -1; + pd.hDevMode = devMode; + pd.hDevNames = devNames; + + SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&from, (LPARAM)&to); + if(from == to) + pd.Flags |= PD_NOSELECTION; + + if(PrintDlgW(&pd)) + { + devMode = pd.hDevMode; + devNames = pd.hDevNames; + print(&pd, wszFileName); + update_ruler(get_ruler_wnd(hMainWnd)); + } +} + +static void preview_bar_show(HWND hMainWnd, BOOL show) +{ + HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR); + int i; + + if(show) + { + REBARBANDINFOW rb; + HWND hStatic; + UINT num_pages_string = preview.pages_shown > 1 ? STRING_PREVIEW_ONEPAGE : + STRING_PREVIEW_TWOPAGES; + + AddTextButton(hReBar, STRING_PREVIEW_PRINT, ID_PRINT, BANDID_PREVIEW_BTN1); + AddTextButton(hReBar, STRING_PREVIEW_NEXTPAGE, ID_PREVIEW_NEXTPAGE, BANDID_PREVIEW_BTN2); + AddTextButton(hReBar, STRING_PREVIEW_PREVPAGE, ID_PREVIEW_PREVPAGE, BANDID_PREVIEW_BTN3); + AddTextButton(hReBar, num_pages_string, ID_PREVIEW_NUMPAGES, BANDID_PREVIEW_BTN4); + AddTextButton(hReBar, STRING_PREVIEW_ZOOMIN, ID_PREVIEW_ZOOMIN, BANDID_PREVIEW_BTN5); + AddTextButton(hReBar, STRING_PREVIEW_ZOOMOUT, ID_PREVIEW_ZOOMOUT, BANDID_PREVIEW_BTN6); + AddTextButton(hReBar, STRING_PREVIEW_CLOSE, ID_FILE_EXIT, BANDID_PREVIEW_BTN7); + + hStatic = CreateWindowW(WC_STATICW, NULL, + WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, + hReBar, NULL, NULL, NULL); + + rb.cbSize = REBARBANDINFOW_V6_SIZE; + rb.fMask = RBBIM_SIZE | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_CHILD | RBBIM_IDEALSIZE | RBBIM_ID; + rb.fStyle = RBBS_NOGRIPPER | RBBS_VARIABLEHEIGHT; + rb.hwndChild = hStatic; + rb.cyChild = rb.cyMinChild = 22; + rb.cx = rb.cxMinChild = 90; + rb.cxIdeal = 100; + rb.wID = BANDID_PREVIEW_BUFFER; + + SendMessageW(hReBar, RB_INSERTBAND, -1, (LPARAM)&rb); + } else + { + for(i = 0; i <= PREVIEW_BUTTONS; i++) + SendMessageW(hReBar, RB_DELETEBAND, SendMessageW(hReBar, RB_IDTOINDEX, BANDID_PREVIEW_BTN1+i, 0), 0); + } +} + +static const int min_spacing = 10; + +static void update_preview_scrollbars(HWND hwndPreview, RECT *window) +{ + SCROLLINFO sbi; + sbi.cbSize = sizeof(sbi); + sbi.fMask = SIF_PAGE|SIF_RANGE; + sbi.nMin = 0; + if (preview.zoomlevel == 0) + { + /* Hide scrollbars when zoomed out. */ + sbi.nMax = 0; + sbi.nPage = window->right; + SetScrollInfo(hwndPreview, SB_HORZ, &sbi, TRUE); + sbi.nPage = window->bottom; + SetScrollInfo(hwndPreview, SB_VERT, &sbi, TRUE); + } else { + sbi.nMax = preview.bmScaledSize.cx * preview.pages_shown + + min_spacing * (preview.pages_shown + 1); + sbi.nPage = window->right; + SetScrollInfo(hwndPreview, SB_HORZ, &sbi, TRUE); + /* Change in the horizontal scrollbar visibility affects the + * client rect, so update the client rect. */ + GetClientRect(hwndPreview, window); + sbi.nMax = preview.bmScaledSize.cy + min_spacing * 2; + sbi.nPage = window->bottom; + SetScrollInfo(hwndPreview, SB_VERT, &sbi, TRUE); + } +} + +static void update_preview_sizes(HWND hwndPreview, BOOL zoomLevelUpdated) +{ + RECT window; + + GetClientRect(hwndPreview, &window); + + /* The zoom ratio isn't updated for partial zoom because of resizing the window. */ + if (zoomLevelUpdated || preview.zoomlevel != 1) + { + float ratio, ratioHeight, ratioWidth; + if (preview.zoomlevel == 2) + { + ratio = 1.0; + } else { + ratioHeight = (window.bottom - min_spacing * 2) / (float)preview.bmSize.cy; + + ratioWidth = (float)(window.right - + min_spacing * (preview.pages_shown + 1)) / + (preview.pages_shown * preview.bmSize.cx); + + if(ratioWidth > ratioHeight) + ratio = ratioHeight; + else + ratio = ratioWidth; + + if (preview.zoomlevel == 1) + ratio += (1.0 - ratio) / 2; + } + preview.zoomratio = ratio; + } + + preview.bmScaledSize.cx = preview.bmSize.cx * preview.zoomratio; + preview.bmScaledSize.cy = preview.bmSize.cy * preview.zoomratio; + + preview.spacing.cy = max(min_spacing, (window.bottom - preview.bmScaledSize.cy) / 2); + + preview.spacing.cx = (window.right - + preview.bmScaledSize.cx * preview.pages_shown) / + (preview.pages_shown + 1); + if (preview.spacing.cx < min_spacing) + preview.spacing.cx = min_spacing; + + update_preview_scrollbars(hwndPreview, &window); +} + +static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float ratio, int bmNewWidth, int bmNewHeight, int bmWidth, int bmHeight, BOOL draw_margins) { HBITMAP hBitmapScaled = CreateCompatibleBitmap(hdc, bmNewWidth, bmNewHeight); - HPEN hPen; + HBITMAP oldbm; + HPEN hPen, oldPen; int TopMargin = (int)((float)twips_to_pixels(lpFr->rc.top, GetDeviceCaps(hdc, LOGPIXELSX)) * ratio); int BottomMargin = (int)((float)twips_to_pixels(lpFr->rc.bottom, GetDeviceCaps(hdc, LOGPIXELSX)) * ratio); int LeftMargin = (int)((float)twips_to_pixels(lpFr->rc.left, GetDeviceCaps(hdc, LOGPIXELSY)) * ratio); int RightMargin = (int)((float)twips_to_pixels(lpFr->rc.right, GetDeviceCaps(hdc, LOGPIXELSY)) * ratio); - if(*hdcSized) - DeleteDC(*hdcSized); - *hdcSized = CreateCompatibleDC(hdc); - SelectObject(*hdcSized, hBitmapScaled); + if(*hdcSized) { + oldbm = SelectObject(*hdcSized, hBitmapScaled); + DeleteObject(oldbm); + } else { + *hdcSized = CreateCompatibleDC(hdc); + SelectObject(*hdcSized, hBitmapScaled); + } StretchBlt(*hdcSized, 0, 0, bmNewWidth, bmNewHeight, hdc, 0, 0, bmWidth, bmHeight, SRCCOPY); + if (!draw_margins) return; + /* Draw margin lines */ hPen = CreatePen(PS_DOT, 1, RGB(0,0,0)); - SelectObject(*hdcSized, hPen); + oldPen = SelectObject(*hdcSized, hPen); MoveToEx(*hdcSized, 0, TopMargin, NULL); LineTo(*hdcSized, bmNewWidth, TopMargin); @@ -658,168 +743,511 @@ static void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float r MoveToEx(*hdcSized, RightMargin, 0, NULL); LineTo(*hdcSized, RightMargin, bmNewHeight); + SelectObject(*hdcSized, oldPen); + DeleteObject(hPen); } -static void draw_preview(HWND hEditorWnd, FORMATRANGE* lpFr, int bmWidth, int bmHeight, RECT* paper, int page) +static BOOL is_last_preview_page(int page) { - HBITMAP hBitmapCapture = CreateCompatibleBitmap(lpFr->hdc, bmWidth, bmHeight); + return preview.pageEnds[page - 1] >= preview.textlength; +} + +/* Update for zoom ratio changes with same page. */ +static void update_scaled_preview(HWND hMainWnd) +{ + FORMATRANGE fr; + HWND hwndPreview; + + /* This may occur on WM_CREATE before update_preview is called + * because a WM_SIZE message is generated from updating the + * scrollbars. */ + if (!preview.hdc) return; + + hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW); + fr.hdcTarget = make_dc(); + fr.rc = fr.rcPage = preview.rcPage; + fr.rc.left += margins.left; + fr.rc.top += margins.top; + fr.rc.bottom -= margins.bottom; + fr.rc.right -= margins.right; + + draw_preview_page(preview.hdc, &preview.hdcSized, &fr, preview.zoomratio, + preview.bmScaledSize.cx, preview.bmScaledSize.cy, + preview.bmSize.cx, preview.bmSize.cy, TRUE); + + if(preview.pages_shown > 1) + { + draw_preview_page(preview.hdc2, &preview.hdcSized2, &fr, preview.zoomratio, + preview.bmScaledSize.cx, preview.bmScaledSize.cy, + preview.bmSize.cx, preview.bmSize.cy, + !is_last_preview_page(preview.page)); + } + + InvalidateRect(hwndPreview, NULL, TRUE); + DeleteDC(fr.hdcTarget); +} + +void init_preview(HWND hMainWnd, LPWSTR wszFileName) +{ + HWND hwndPreview; + HINSTANCE hInstance = GetModuleHandleW(0); + preview.page = 1; + preview.hdc = 0; + preview.hdc2 = 0; + preview.wszFileName = wszFileName; + preview.zoomratio = 0; + preview.zoomlevel = 0; + preview_bar_show(hMainWnd, TRUE); + + hwndPreview = CreateWindowExW(0, wszPreviewWndClass, NULL, + WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL, + 0, 0, 200, 10, hMainWnd, (HMENU)IDC_PREVIEW, hInstance, NULL); +} + +void close_preview(HWND hMainWnd) +{ + HWND hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW); + preview.window.right = 0; + preview.window.bottom = 0; + preview.page = 0; + HeapFree(GetProcessHeap(), 0, preview.pageEnds); + preview.pageEnds = NULL; + preview.pageCapacity = 0; + if (preview.zoomlevel > 0) + preview.pages_shown = preview.saved_pages_shown; + if(preview.hdc) { + HBITMAP oldbm = GetCurrentObject(preview.hdc, OBJ_BITMAP); + DeleteDC(preview.hdc); + DeleteObject(oldbm); + preview.hdc = NULL; + } + if(preview.hdc2) { + HBITMAP oldbm = GetCurrentObject(preview.hdc2, OBJ_BITMAP); + DeleteDC(preview.hdc2); + DeleteObject(oldbm); + preview.hdc2 = NULL; + } + if(preview.hdcSized) { + HBITMAP oldbm = GetCurrentObject(preview.hdcSized, OBJ_BITMAP); + DeleteDC(preview.hdcSized); + DeleteObject(oldbm); + preview.hdcSized = NULL; + } + if(preview.hdcSized2) { + HBITMAP oldbm = GetCurrentObject(preview.hdcSized2, OBJ_BITMAP); + DeleteDC(preview.hdcSized2); + DeleteObject(oldbm); + preview.hdcSized2 = NULL; + } + + preview_bar_show(hMainWnd, FALSE); + DestroyWindow(hwndPreview); +} + +BOOL preview_isactive(void) +{ + return preview.page != 0; +} + +static void draw_preview(HWND hEditorWnd, FORMATRANGE* lpFr, RECT* paper, int page) +{ + int bottom; + + if (!preview.pageEnds) + { + preview.pageCapacity = 32; + preview.pageEnds = HeapAlloc(GetProcessHeap(), 0, + sizeof(int) * preview.pageCapacity); + if (!preview.pageEnds) return; + } else if (page >= preview.pageCapacity) { + int *new_buffer; + new_buffer = HeapReAlloc(GetProcessHeap(), 0, preview.pageEnds, + sizeof(int) * preview.pageCapacity * 2); + if (!new_buffer) return; + preview.pageCapacity *= 2; + preview.pageEnds = new_buffer; + } - char_from_pagenum(hEditorWnd, lpFr, page); - SelectObject(lpFr->hdc, hBitmapCapture); FillRect(lpFr->hdc, paper, GetStockObject(WHITE_BRUSH)); - SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)lpFr); - /* EM_FORMATRANGE sets fr.rc to indicate the area printed in, but we want to - keep the original for drawing margins */ - lpFr->rc = get_print_rect(lpFr->hdcTarget); + if (page > 1 && is_last_preview_page(page - 1)) return; + lpFr->chrg.cpMin = page <= 1 ? 0 : preview.pageEnds[page-2]; + bottom = lpFr->rc.bottom; + preview.pageEnds[page-1] = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)lpFr); + + /* EM_FORMATRANGE sets fr.rc.bottom to indicate the area printed in, + * but we want to keep the original for drawing margins */ + lpFr->rc.bottom = bottom; SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, 0); } -LRESULT print_preview(HWND hMainWnd) +static void update_preview_buttons(HWND hMainWnd) +{ + HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR); + EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_PREVPAGE), preview.page > 1); + EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NEXTPAGE), + !is_last_preview_page(preview.page) && + !is_last_preview_page(preview.page + preview.pages_shown - 1)); + EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), + preview.pages_shown > 1 || + (!is_last_preview_page(1) && preview.zoomlevel == 0)); + EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_ZOOMIN), preview.zoomlevel < 2); + EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_ZOOMOUT), preview.zoomlevel > 0); +} + +LRESULT print_preview(HWND hwndPreview) { - FORMATRANGE fr; - GETTEXTLENGTHEX gt; HDC hdc; RECT window, background; - int bmWidth, bmHeight, bmNewWidth, bmNewHeight; - float ratioWidth, ratioHeight, ratio; - int xOffset, yOffset; - int barheight; - float spacing = 20.0; - HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR); PAINTSTRUCT ps; + POINT scrollpos; - hdc = BeginPaint(hMainWnd, &ps); - GetClientRect(hMainWnd, &window); + hdc = BeginPaint(hwndPreview, &ps); + GetClientRect(hwndPreview, &window); - fr.hdcTarget = make_dc(); - fr.rc = get_print_rect(fr.hdcTarget); - fr.rcPage.left = 0; - fr.rcPage.top = 0; - fr.rcPage.bottom = fr.rc.bottom + margins.bottom; - fr.rcPage.right = fr.rc.right + margins.right; - - bmWidth = twips_to_pixels(fr.rcPage.right, GetDeviceCaps(hdc, LOGPIXELSX)); - bmHeight = twips_to_pixels(fr.rcPage.bottom, GetDeviceCaps(hdc, LOGPIXELSY)); - - if(!preview.hdc) - { - RECT paper; - HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR); - - preview.hdc = CreateCompatibleDC(hdc); - - if(preview.hdc2) - { - if(preview.hdc2 != (HDC)-1) - DeleteDC(preview.hdc2); - preview.hdc2 = CreateCompatibleDC(hdc); - } - - fr.hdc = preview.hdc; - gt.flags = GTL_DEFAULT; - gt.codepage = 1200; - fr.chrg.cpMin = 0; - fr.chrg.cpMax = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0); - - paper.left = 0; - paper.right = bmWidth; - paper.top = 0; - paper.bottom = bmHeight; - - if(!preview.pages) - preview.pages = get_num_pages(hEditorWnd, fr); - - fr.hdc = preview.hdc; - draw_preview(hEditorWnd, &fr, bmWidth, bmHeight, &paper, preview.page); - - if(preview.hdc2) - { - fr.hdc = preview.hdc2; - draw_preview(hEditorWnd, &fr, bmWidth, bmHeight, &paper, preview.page + 1); - } - - EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_PREVPAGE), preview.page > 1); - EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NEXTPAGE), preview.hdc2 ? - (preview.page + 1) < preview.pages : - preview.page < preview.pages); - EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), preview.pages > 1); - } - - barheight = SendMessageW(hReBar, RB_GETBARHEIGHT, 0, 0); - ratioHeight = ((float)window.bottom - spacing - (float)barheight) / (float)bmHeight; - - if(preview.hdc2) - ratioWidth = ((float)window.right / 2.0 - spacing * 2.0) / (float)bmWidth; - else - ratioWidth = ((float)window.right - spacing * 3.0) / (float)bmWidth; - - if(ratioWidth > ratioHeight) - ratio = ratioHeight; - else - ratio = ratioWidth; - - bmNewWidth = (int)((float)bmWidth * ratio); - bmNewHeight = (int)((float)bmHeight * ratio); - - yOffset = ((window.bottom - bmNewHeight + barheight) / 2); - - if(!preview.hdc2) - xOffset = (window.right - bmNewWidth) / 2; - else - xOffset = (window.right - bmNewWidth * 2) / 2; - - window.top = barheight; FillRect(hdc, &window, GetStockObject(GRAY_BRUSH)); - background.left = xOffset - 2; - background.right = xOffset + bmNewWidth + 2; - background.top = yOffset - 2; - background.bottom = yOffset + bmNewHeight + 2; + scrollpos.x = GetScrollPos(hwndPreview, SB_HORZ); + scrollpos.y = GetScrollPos(hwndPreview, SB_VERT); + + background.left = preview.spacing.cx - 2 - scrollpos.x; + background.right = background.left + preview.bmScaledSize.cx + 4; + background.top = preview.spacing.cy - 2 - scrollpos.y; + background.bottom = background.top + preview.bmScaledSize.cy + 4; FillRect(hdc, &background, GetStockObject(BLACK_BRUSH)); - if(window.right != preview.window.right || window.bottom != preview.window.bottom) + if(preview.pages_shown > 1) { - draw_preview_page(preview.hdc, &preview.hdcSized, &fr, ratio, bmNewWidth, bmNewHeight, bmWidth, bmHeight); + background.left += preview.bmScaledSize.cx + preview.spacing.cx; + background.right += preview.bmScaledSize.cx + preview.spacing.cx; - if(preview.hdc2) - { - background.left += bmNewWidth + spacing; - background.right += bmNewWidth + spacing; - - FillRect(hdc, &background, GetStockObject(BLACK_BRUSH)); - - draw_preview_page(preview.hdc2, &preview.hdcSized2, &fr, ratio, bmNewWidth, bmNewHeight, bmWidth, bmHeight); - } + FillRect(hdc, &background, GetStockObject(BLACK_BRUSH)); } - BitBlt(hdc, xOffset, yOffset, bmNewWidth, bmNewHeight, preview.hdcSized, 0, 0, SRCCOPY); + BitBlt(hdc, preview.spacing.cx - scrollpos.x, preview.spacing.cy - scrollpos.y, + preview.bmScaledSize.cx, preview.bmScaledSize.cy, + preview.hdcSized, 0, 0, SRCCOPY); - if(preview.hdc2) + if(preview.pages_shown > 1) { - BitBlt(hdc, xOffset + bmNewWidth + spacing, yOffset, bmNewWidth, bmNewHeight, preview.hdcSized2, 0, 0, SRCCOPY); + BitBlt(hdc, preview.spacing.cx * 2 + preview.bmScaledSize.cx - scrollpos.x, + preview.spacing.cy - scrollpos.y, preview.bmScaledSize.cx, + preview.bmScaledSize.cy, preview.hdcSized2, 0, 0, SRCCOPY); } - DeleteDC(fr.hdcTarget); preview.window = window; - EndPaint(hMainWnd, &ps); + EndPaint(hwndPreview, &ps); return 0; } -static void update_preview(HWND hWnd) +static void update_preview_statusbar(HWND hMainWnd) +{ + HWND hStatusbar = GetDlgItem(hMainWnd, IDC_STATUSBAR); + HINSTANCE hInst = GetModuleHandleW(0); + WCHAR *p; + WCHAR wstr[MAX_STRING_LEN]; + + p = wstr; + if (preview.pages_shown < 2 || is_last_preview_page(preview.page)) + { + static const WCHAR fmt[] = {' ','%','d','\0'}; + p += LoadStringW(hInst, STRING_PREVIEW_PAGE, wstr, MAX_STRING_LEN); + wsprintfW(p, fmt, preview.page); + } else { + static const WCHAR fmt[] = {' ','%','d','-','%','d','\0'}; + p += LoadStringW(hInst, STRING_PREVIEW_PAGES, wstr, MAX_STRING_LEN); + wsprintfW(p, fmt, preview.page, preview.page + 1); + } + SetWindowTextW(hStatusbar, wstr); +} + +/* Update for page changes. */ +static void update_preview(HWND hMainWnd) +{ + RECT paper; + HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR); + HWND hwndPreview = GetDlgItem(hMainWnd, IDC_PREVIEW); + HBITMAP hBitmapCapture; + FORMATRANGE fr; + HDC hdc = GetDC(hwndPreview); + + fr.hdcTarget = make_dc(); + fr.rc = fr.rcPage = preview.rcPage; + fr.rc.left += margins.left; + fr.rc.top += margins.top; + fr.rc.bottom -= margins.bottom; + fr.rc.right -= margins.right; + + fr.chrg.cpMin = 0; + fr.chrg.cpMax = preview.textlength; + + paper.left = 0; + paper.right = preview.bmSize.cx; + paper.top = 0; + paper.bottom = preview.bmSize.cy; + + if (!preview.hdc) { + preview.hdc = CreateCompatibleDC(hdc); + hBitmapCapture = CreateCompatibleBitmap(hdc, preview.bmSize.cx, preview.bmSize.cy); + SelectObject(preview.hdc, hBitmapCapture); + } + + fr.hdc = preview.hdc; + draw_preview(hEditorWnd, &fr, &paper, preview.page); + + if(preview.pages_shown > 1) + { + if (!preview.hdc2) + { + preview.hdc2 = CreateCompatibleDC(hdc); + hBitmapCapture = CreateCompatibleBitmap(hdc, + preview.bmSize.cx, + preview.bmSize.cy); + SelectObject(preview.hdc2, hBitmapCapture); + } + + fr.hdc = preview.hdc2; + draw_preview(hEditorWnd, &fr, &fr.rcPage, preview.page + 1); + } + DeleteDC(fr.hdcTarget); + ReleaseDC(hwndPreview, hdc); + + update_scaled_preview(hMainWnd); + update_preview_buttons(hMainWnd); + update_preview_statusbar(hMainWnd); +} + +static void toggle_num_pages(HWND hMainWnd) +{ + HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR); + WCHAR name[MAX_STRING_LEN]; + HINSTANCE hInst = GetModuleHandleW(0); + int nPreviewPages; + + preview.pages_shown = preview.pages_shown > 1 ? 1 : 2; + + nPreviewPages = preview.zoomlevel > 0 ? preview.saved_pages_shown : + preview.pages_shown; + + LoadStringW(hInst, nPreviewPages > 1 ? STRING_PREVIEW_ONEPAGE : + STRING_PREVIEW_TWOPAGES, + name, MAX_STRING_LEN); + + SetWindowTextW(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), name); + update_preview_sizes(GetDlgItem(hMainWnd, IDC_PREVIEW), TRUE); + update_preview(hMainWnd); +} + +/* Returns the page shown that the point is in (1 or 2) or 0 if the point + * isn't inside either page */ +int preview_page_hittest(POINT pt) { RECT rc; + rc.left = preview.spacing.cx; + rc.right = rc.left + preview.bmScaledSize.cx; + rc.top = preview.spacing.cy; + rc.bottom = rc.top + preview.bmScaledSize.cy; + if (PtInRect(&rc, pt)) + return 1; - DeleteDC(preview.hdc); - preview.hdc = 0; + if (preview.pages_shown <= 1) + return 0; - preview.window.right = 0; + rc.left += preview.bmScaledSize.cx + preview.spacing.cx; + rc.right += preview.bmScaledSize.cx + preview.spacing.cx; + if (PtInRect(&rc, pt)) + return is_last_preview_page(preview.page) ? 1 : 2; - GetClientRect(hWnd, &rc); - rc.top += SendMessageW(GetDlgItem(hWnd, IDC_REBAR), RB_GETBARHEIGHT, 0, 0); - InvalidateRect(hWnd, &rc, TRUE); + return 0; +} + +LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_CREATE: + { + HWND hMainWnd = GetParent(hWnd); + HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR); + FORMATRANGE fr; + GETTEXTLENGTHEX gt = {GTL_DEFAULT, 1200}; + HDC hdc = GetDC(hWnd); + HDC hdcTarget = make_dc(); + + fr.rc = preview.rcPage = get_print_rect(hdcTarget); + preview.rcPage.bottom += margins.bottom; + preview.rcPage.right += margins.right; + preview.rcPage.top = preview.rcPage.left = 0; + fr.rcPage = preview.rcPage; + + preview.bmSize.cx = twips_to_pixels(preview.rcPage.right, GetDeviceCaps(hdc, LOGPIXELSX)); + preview.bmSize.cy = twips_to_pixels(preview.rcPage.bottom, GetDeviceCaps(hdc, LOGPIXELSY)); + + preview.textlength = SendMessageW(hEditorWnd, EM_GETTEXTLENGTHEX, (WPARAM)>, 0); + + fr.hdc = CreateCompatibleDC(hdc); + fr.hdcTarget = hdcTarget; + fr.chrg.cpMin = 0; + fr.chrg.cpMax = preview.textlength; + DeleteDC(fr.hdc); + DeleteDC(hdcTarget); + ReleaseDC(hWnd, hdc); + + update_preview_sizes(hWnd, TRUE); + update_preview(hMainWnd); + break; + } + + case WM_PAINT: + return print_preview(hWnd); + + case WM_SIZE: + { + update_preview_sizes(hWnd, FALSE); + update_scaled_preview(hWnd); + break; + } + + case WM_VSCROLL: + case WM_HSCROLL: + { + SCROLLINFO si; + RECT rc; + int nBar = (msg == WM_VSCROLL) ? SB_VERT : SB_HORZ; + int origPos; + + GetClientRect(hWnd, &rc); + si.cbSize = sizeof(si); + si.fMask = SIF_ALL; + GetScrollInfo(hWnd, nBar, &si); + origPos = si.nPos; + switch(LOWORD(wParam)) + { + case SB_TOP: /* == SB_LEFT */ + si.nPos = si.nMin; + break; + case SB_BOTTOM: /* == SB_RIGHT */ + si.nPos = si.nMax; + break; + case SB_LINEUP: /* == SB_LINELEFT */ + si.nPos -= si.nPage / 10; + break; + case SB_LINEDOWN: /* == SB_LINERIGHT */ + si.nPos += si.nPage / 10; + break; + case SB_PAGEUP: /* == SB_PAGELEFT */ + si.nPos -= si.nPage; + break; + case SB_PAGEDOWN: /* SB_PAGERIGHT */ + si.nPos += si.nPage; + break; + case SB_THUMBTRACK: + si.nPos = si.nTrackPos; + break; + } + si.fMask = SIF_POS; + SetScrollInfo(hWnd, nBar, &si, TRUE); + GetScrollInfo(hWnd, nBar, &si); + if (si.nPos != origPos) + { + int amount = origPos - si.nPos; + if (msg == WM_VSCROLL) + ScrollWindow(hWnd, 0, amount, NULL, NULL); + else + ScrollWindow(hWnd, amount, 0, NULL, NULL); + } + return 0; + } + + case WM_SETCURSOR: + { + POINT pt; + RECT rc; + int bHittest = FALSE; + DWORD messagePos = GetMessagePos(); + pt.x = (short)LOWORD(messagePos); + pt.y = (short)HIWORD(messagePos); + ScreenToClient(hWnd, &pt); + + GetClientRect(hWnd, &rc); + if (PtInRect(&rc, pt)) + { + pt.x += GetScrollPos(hWnd, SB_HORZ); + pt.y += GetScrollPos(hWnd, SB_VERT); + bHittest = preview_page_hittest(pt); + } + + if (bHittest) + SetCursor(LoadCursorW(GetModuleHandleW(0), + MAKEINTRESOURCEW(IDC_ZOOM))); + else + SetCursor(LoadCursorW(NULL, (WCHAR*)IDC_ARROW)); + + return TRUE; + } + + case WM_LBUTTONDOWN: + { + int page; + POINT pt; + pt.x = (short)LOWORD(lParam) + GetScrollPos(hWnd, SB_HORZ); + pt.y = (short)HIWORD(lParam) + GetScrollPos(hWnd, SB_VERT); + if ((page = preview_page_hittest(pt)) > 0) + { + HWND hMainWnd = GetParent(hWnd); + + /* Convert point from client coordinate to unzoomed page + * coordinate. */ + pt.x -= preview.spacing.cx; + if (page > 1) + pt.x -= preview.bmScaledSize.cx + preview.spacing.cx; + pt.y -= preview.spacing.cy; + pt.x /= preview.zoomratio; + pt.y /= preview.zoomratio; + + if (preview.zoomlevel == 0) + preview.saved_pages_shown = preview.pages_shown; + preview.zoomlevel = (preview.zoomlevel + 1) % 3; + preview.zoomratio = 0; + if (preview.zoomlevel == 0 && preview.saved_pages_shown > 1) + { + toggle_num_pages(hMainWnd); + } else if (preview.pages_shown > 1) { + if (page >= 2) preview.page++; + toggle_num_pages(hMainWnd); + } else { + update_preview_sizes(hWnd, TRUE); + update_scaled_preview(hMainWnd); + update_preview_buttons(hMainWnd); + } + + if (preview.zoomlevel > 0) { + SCROLLINFO si; + /* Convert the coordinate back to client coordinate. */ + pt.x *= preview.zoomratio; + pt.y *= preview.zoomratio; + pt.x += preview.spacing.cx; + pt.y += preview.spacing.cy; + /* Scroll to center view at that point on the page */ + si.cbSize = sizeof(si); + si.fMask = SIF_PAGE; + GetScrollInfo(hWnd, SB_HORZ, &si); + pt.x -= si.nPage / 2; + SetScrollPos(hWnd, SB_HORZ, pt.x, TRUE); + GetScrollInfo(hWnd, SB_VERT, &si); + pt.y -= si.nPage / 2; + SetScrollPos(hWnd, SB_VERT, pt.y, TRUE); + } + } + } + + default: + return DefWindowProcW(hWnd, msg, wParam, lParam); + } + + return 0; } LRESULT preview_command(HWND hWnd, WPARAM wParam) @@ -843,29 +1271,44 @@ LRESULT preview_command(HWND hWnd, WPARAM wParam) break; case ID_PREVIEW_NUMPAGES: - { - HWND hReBar = GetDlgItem(hWnd, IDC_REBAR); - WCHAR name[MAX_STRING_LEN]; - HINSTANCE hInst = (HINSTANCE)GetWindowLongPtrW(hWnd, GWLP_HINSTANCE); + toggle_num_pages(hWnd); + break; - if(preview.hdc2) + case ID_PREVIEW_ZOOMIN: + if (preview.zoomlevel < 2) { - DeleteDC(preview.hdc2); - preview.hdc2 = 0; - } else - { - if(preview.page == preview.pages) - preview.page--; - preview.hdc2 = (HDC)-1; + if (preview.zoomlevel == 0) + preview.saved_pages_shown = preview.pages_shown; + preview.zoomlevel++; + preview.zoomratio = 0; + if (preview.pages_shown > 1) + { + /* Forced switch to one page when zooming in. */ + toggle_num_pages(hWnd); + } else { + HWND hwndPreview = GetDlgItem(hWnd, IDC_PREVIEW); + update_preview_sizes(hwndPreview, TRUE); + update_scaled_preview(hWnd); + update_preview_buttons(hWnd); + } } + break; - LoadStringW(hInst, preview.hdc2 ? STRING_PREVIEW_ONEPAGE : STRING_PREVIEW_TWOPAGES, - name, MAX_STRING_LEN); - - SetWindowTextW(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), name); - update_preview(hWnd); - } - break; + case ID_PREVIEW_ZOOMOUT: + if (preview.zoomlevel > 0) + { + HWND hwndPreview = GetDlgItem(hWnd, IDC_PREVIEW); + preview.zoomlevel--; + preview.zoomratio = 0; + if (preview.zoomlevel == 0 && preview.saved_pages_shown > 1) { + toggle_num_pages(hWnd); + } else { + update_preview_sizes(hwndPreview, TRUE); + update_scaled_preview(hWnd); + update_preview_buttons(hWnd); + } + } + break; case ID_PRINT: dialog_print(hWnd, preview.wszFileName); diff --git a/reactos/base/applications/wordpad/registry.c b/reactos/base/applications/wordpad/registry.c index c7edc5b1e50..7311fb68232 100644 --- a/reactos/base/applications/wordpad/registry.c +++ b/reactos/base/applications/wordpad/registry.c @@ -27,6 +27,7 @@ static const WCHAR key_recentfiles[] = {'R','e','c','e','n','t',' ','f','i','l','e', ' ','l','i','s','t',0}; static const WCHAR key_options[] = {'O','p','t','i','o','n','s',0}; +static const WCHAR key_settings[] = {'S','e','t','t','i','n','g','s',0}; static const WCHAR key_rtf[] = {'R','T','F',0}; static const WCHAR key_text[] = {'T','e','x','t',0}; @@ -94,9 +95,14 @@ void registry_set_options(HWND hMainWnd) RegSetValueExW(hKey, var_maximized, 0, REG_DWORD, (LPBYTE)&isMaximized, sizeof(DWORD)); registry_set_pagemargins(hKey); + RegCloseKey(hKey); } - RegCloseKey(hKey); + if(registry_get_handle(&hKey, &action, key_settings) == ERROR_SUCCESS) + { + registry_set_previewpages(hKey); + RegCloseKey(hKey); + } } void registry_read_winrect(RECT* rc) @@ -339,6 +345,13 @@ void registry_read_options(void) registry_read_pagemargins(hKey); RegCloseKey(hKey); } + + if(registry_get_handle(&hKey, 0, key_settings) != ERROR_SUCCESS) { + registry_read_previewpages(NULL); + } else { + registry_read_previewpages(hKey); + RegCloseKey(hKey); + } } static void registry_read_formatopts(int index, LPCWSTR key, DWORD barState[], DWORD wordWrap[]) diff --git a/reactos/base/applications/wordpad/rsrc.rc b/reactos/base/applications/wordpad/rsrc.rc index 4786e66ddcc..a3f66c55e5c 100644 --- a/reactos/base/applications/wordpad/rsrc.rc +++ b/reactos/base/applications/wordpad/rsrc.rc @@ -1,4 +1,4 @@ -/* +/* * Copyright 2004 by Krzysztof Foltman * Copyright 2007 by Alexander N. Sørnes * @@ -61,20 +61,28 @@ IDI_WRI ICON "wri.ico" /* @makedep: txt.ico */ IDI_TXT ICON "txt.ico" +/* @makedep: zoom.cur */ +IDC_ZOOM CURSOR "zoom.cur" + + #include "Da.rc" -#include "De.rc" #include "En.rc" -#include "Fr.rc" #include "Hu.rc" -#include "Ja.rc" #include "Ko.rc" -#include "Lt.rc" #include "Nl.rc" -#include "No.rc" #include "Pl.rc" +#include "Tr.rc" + +/* UTF-8 */ +#include "De.rc" +#include "Fr.rc" +#include "It.rc" +#include "Ja.rc" +#include "Lt.rc" +#include "No.rc" #include "Pt.rc" #include "Ru.rc" #include "Si.rc" #include "Sv.rc" -#include "Tr.rc" +#include "Uk.rc" #include "Zh.rc" diff --git a/reactos/base/applications/wordpad/wordpad.c b/reactos/base/applications/wordpad/wordpad.c index e983c5d74b7..b9e6f3716a2 100644 --- a/reactos/base/applications/wordpad/wordpad.c +++ b/reactos/base/applications/wordpad/wordpad.c @@ -56,10 +56,14 @@ static const WCHAR wszMainWndClass[] = {'W','O','R','D','P','A','D','T','O','P', static const WCHAR stringFormat[] = {'%','2','d','\0'}; +const WCHAR wszPreviewWndClass[] = {'P','r','t','P','r','e','v','i','e','w',0}; +LRESULT CALLBACK preview_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + static HWND hMainWnd; static HWND hEditorWnd; static HWND hFindWnd; static HMENU hPopupMenu; +static HMENU hColorPopupMenu; static UINT ID_FINDMSGSTRING; @@ -85,7 +89,7 @@ static void DoLoadStrings(void) static const WCHAR files_txt[] = {'*','.','t','x','t','\0'}; static const WCHAR files_all[] = {'*','.','*','\0'}; - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); LoadStringW(hInstance, STRING_RICHTEXT_FILES_RTF, p, MAX_STRING_LEN); p += lstrlenW(p) + 1; @@ -683,8 +687,7 @@ static void set_bar_states(void) static void preview_exit(HWND hMainWnd) { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE); - HMENU hMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDM_MAINMENU)); + HMENU hMenu = LoadMenuW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDM_MAINMENU)); HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR); set_bar_states(); @@ -701,7 +704,7 @@ static void preview_exit(HWND hMainWnd) static void set_fileformat(WPARAM format) { HICON hIcon; - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); fileFormat = format; if(format & SF_TEXT) @@ -980,8 +983,7 @@ static void DialogOpenFile(void) static void dialog_about(void) { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE); - HICON icon = LoadImageW(hInstance, MAKEINTRESOURCEW(IDI_WORDPAD), IMAGE_ICON, 48, 48, LR_SHARED); + HICON icon = LoadImageW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDI_WORDPAD), IMAGE_ICON, 48, 48, LR_SHARED); ShellAboutW(hMainWnd, wszAppTitle, 0, icon); } @@ -1088,7 +1090,7 @@ static void dialog_viewproperties(void) PROPSHEETPAGEW psp[2]; PROPSHEETHEADERW psh; size_t i; - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); LPCPROPSHEETPAGEW ppsp = (LPCPROPSHEETPAGEW)&psp; psp[0].dwSize = sizeof(PROPSHEETPAGEW); @@ -1241,7 +1243,7 @@ static LRESULT handle_findmsg(LPFINDREPLACEW pFr) if(pFr->Flags & FR_WHOLEWORD) flags |= FR_WHOLEWORD; - ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, (WPARAM)flags, (LPARAM)&ft); + ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, flags, (LPARAM)&ft); if(ret == -1) { @@ -1250,7 +1252,7 @@ static LRESULT handle_findmsg(LPFINDREPLACEW pFr) ft.chrg.cpMin = cr.cpMin = 0; ft.chrg.cpMax = cr.cpMax = startPos; - ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, (WPARAM)flags, (LPARAM)&ft); + ret = SendMessageW(hEditorWnd, EM_FINDTEXTW, flags, (LPARAM)&ft); } } @@ -1263,7 +1265,7 @@ static LRESULT handle_findmsg(LPFINDREPLACEW pFr) { end = ret + lstrlenW(pFr->lpstrFindWhat); cr.cpMin = end; - SendMessageW(hEditorWnd, EM_SETSEL, (WPARAM)ret, (LPARAM)end); + SendMessageW(hEditorWnd, EM_SETSEL, ret, end); SendMessageW(hEditorWnd, EM_SCROLLCARET, 0, 0); if(pFr->Flags & FR_REPLACE || pFr->Flags & FR_REPLACEALL) @@ -1414,7 +1416,7 @@ static INT_PTR CALLBACK newfile_proc(HWND hWnd, UINT message, WPARAM wParam, LPA { case WM_INITDIALOG: { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); WCHAR buffer[MAX_STRING_LEN]; HWND hListWnd = GetDlgItem(hWnd, IDC_NEWFILE); @@ -1459,8 +1461,7 @@ static INT_PTR CALLBACK paraformat_proc(HWND hWnd, UINT message, WPARAM wParam, { case WM_INITDIALOG: { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hMainWnd, - GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); WCHAR buffer[MAX_STRING_LEN]; HWND hListWnd = GetDlgItem(hWnd, IDC_PARA_ALIGN); HWND hLeftWnd = GetDlgItem(hWnd, IDC_PARA_LEFT); @@ -1737,7 +1738,7 @@ static int context_menu(LPARAM lParam) int from = 0, to = 0; POINTL pt; SendMessageW(hEditorWnd, EM_GETSEL, (WPARAM)&from, (LPARAM)&to); - SendMessageW(hEditorWnd, EM_POSFROMCHAR, (WPARAM)&pt, (LPARAM)to); + SendMessageW(hEditorWnd, EM_POSFROMCHAR, (WPARAM)&pt, to); ClientToScreen(hEditorWnd, (POINT*)&pt); x = pt.x; y = pt.y; @@ -1752,7 +1753,7 @@ static int context_menu(LPARAM lParam) static LRESULT OnCreate( HWND hWnd ) { HWND hToolBarWnd, hFormatBarWnd, hReBarWnd, hFontListWnd, hSizeListWnd, hRulerWnd; - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); HANDLE hDLL; TBADDBITMAP ab; int nStdBitmaps = 0; @@ -1836,17 +1837,18 @@ static LRESULT OnCreate( HWND hWnd ) hFormatBarWnd = CreateToolbarEx(hReBarWnd, CCS_NOPARENTALIGN | CCS_NOMOVEY | WS_VISIBLE | TBSTYLE_TOOLTIPS | TBSTYLE_BUTTON, - IDC_FORMATBAR, 7, hInstance, IDB_FORMATBAR, NULL, 0, 16, 16, 16, 16, sizeof(TBBUTTON)); + IDC_FORMATBAR, 8, hInstance, IDB_FORMATBAR, NULL, 0, 16, 16, 16, 16, sizeof(TBBUTTON)); AddButton(hFormatBarWnd, 0, ID_FORMAT_BOLD); AddButton(hFormatBarWnd, 1, ID_FORMAT_ITALIC); AddButton(hFormatBarWnd, 2, ID_FORMAT_UNDERLINE); + AddButton(hFormatBarWnd, 3, ID_FORMAT_COLOR); AddSeparator(hFormatBarWnd); - AddButton(hFormatBarWnd, 3, ID_ALIGN_LEFT); - AddButton(hFormatBarWnd, 4, ID_ALIGN_CENTER); - AddButton(hFormatBarWnd, 5, ID_ALIGN_RIGHT); + AddButton(hFormatBarWnd, 4, ID_ALIGN_LEFT); + AddButton(hFormatBarWnd, 5, ID_ALIGN_CENTER); + AddButton(hFormatBarWnd, 6, ID_ALIGN_RIGHT); AddSeparator(hFormatBarWnd); - AddButton(hFormatBarWnd, 6, ID_BULLET); + AddButton(hFormatBarWnd, 7, ID_BULLET); SendMessageW(hFormatBarWnd, TB_AUTOSIZE, 0, 0); @@ -2001,6 +2003,15 @@ static LRESULT OnNotify( HWND hWnd, LPARAM lParam) return 0; } +/* Copied from dlls/comdlg32/fontdlg.c */ +static const COLORREF textcolors[]= +{ + 0x00000000L,0x00000080L,0x00008000L,0x00008080L, + 0x00800000L,0x00800080L,0x00808000L,0x00808080L, + 0x00c0c0c0L,0x000000ffL,0x0000ff00L,0x0000ffffL, + 0x00ff0000L,0x00ff00ffL,0x00ffff00L,0x00FFFFFFL +}; + static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam) { HWND hwndEditor = GetDlgItem(hWnd, IDC_EDITOR); @@ -2018,7 +2029,7 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam) case ID_FILE_NEW: { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE); + HINSTANCE hInstance = GetModuleHandleW(0); int ret = DialogBox(hInstance, MAKEINTRESOURCE(IDD_NEWFILE), hWnd, newfile_proc); @@ -2098,7 +2109,7 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam) break; case ID_PRINT_QUICK: - print_quick(wszFileName); + print_quick(hMainWnd, wszFileName); target_device(hMainWnd, wordWrap[reg_formatindex(fileFormat)]); break; @@ -2106,7 +2117,7 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam) { int index = reg_formatindex(fileFormat); DWORD tmp = barState[index]; - barState[index] = 0; + barState[index] = 1 << BANDID_STATUSBAR; set_bar_states(); barState[index] = tmp; ShowWindow(hEditorWnd, FALSE); @@ -2152,6 +2163,46 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam) break; } + case ID_FORMAT_COLOR: + { + HWND hReBarWnd = GetDlgItem(hWnd, IDC_REBAR); + HWND hFormatBarWnd = GetDlgItem(hReBarWnd, IDC_FORMATBAR); + HMENU hPop; + RECT itemrc; + POINT pt; + int mid; + int itemidx = SendMessage(hFormatBarWnd, TB_COMMANDTOINDEX, ID_FORMAT_COLOR, 0); + + SendMessage(hFormatBarWnd, TB_GETITEMRECT, itemidx, (LPARAM)&itemrc); + pt.x = itemrc.left; + pt.y = itemrc.bottom; + ClientToScreen(hFormatBarWnd, &pt); + hPop = GetSubMenu(hColorPopupMenu, 0); + mid = TrackPopupMenu(hPop, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON | + TPM_RETURNCMD | TPM_NONOTIFY, + pt.x, pt.y, 0, hWnd, 0); + if (mid >= ID_COLOR_FIRST && mid <= ID_COLOR_AUTOMATIC) + { + CHARFORMAT2W fmt; + + ZeroMemory(&fmt, sizeof(fmt)); + fmt.cbSize = sizeof(fmt); + SendMessageW(hwndEditor, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM)&fmt); + + fmt.dwMask = CFM_COLOR; + + if (mid < ID_COLOR_AUTOMATIC) { + fmt.crTextColor = textcolors[mid - ID_COLOR_FIRST]; + fmt.dwEffects &= ~CFE_AUTOCOLOR; + } else { + fmt.dwEffects |= CFE_AUTOCOLOR; + } + + SendMessageW(hwndEditor, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&fmt); + } + break; + } + case ID_EDIT_CUT: PostMessageW(hwndEditor, WM_CUT, 0, 0); break; @@ -2334,25 +2385,15 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam) break; case ID_DATETIME: - { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE); - DialogBoxW(hInstance, MAKEINTRESOURCEW(IDD_DATETIME), hWnd, datetime_proc); + DialogBoxW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDD_DATETIME), hWnd, datetime_proc); break; - } case ID_PARAFORMAT: - { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE); - DialogBoxW(hInstance, MAKEINTRESOURCEW(IDD_PARAFORMAT), hWnd, - paraformat_proc); - } + DialogBoxW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDD_PARAFORMAT), hWnd, paraformat_proc); break; case ID_TABSTOPS: - { - HINSTANCE hInstance = (HINSTANCE)GetWindowLongPtr(hWnd, GWLP_HINSTANCE); - DialogBoxW(hInstance, MAKEINTRESOURCEW(IDD_TABSTOPS), hWnd, tabstops_proc); - } + DialogBoxW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDD_PARAFORMAT), hWnd, tabstops_proc); break; case ID_ABOUT: @@ -2460,7 +2501,7 @@ static LRESULT OnSize( HWND hWnd, WPARAM wParam, LPARAM lParam ) { int nStatusSize = 0; RECT rc; - HWND hwndEditor = GetDlgItem(hWnd, IDC_EDITOR); + HWND hwndEditor = preview_isactive() ? GetDlgItem(hWnd, IDC_PREVIEW) : GetDlgItem(hWnd, IDC_EDITOR); HWND hwndStatusBar = GetDlgItem(hWnd, IDC_STATUSBAR); HWND hwndReBar = GetDlgItem(hWnd, IDC_REBAR); HWND hRulerWnd = GetDlgItem(hWnd, IDC_RULER); @@ -2563,9 +2604,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPara } break; case WM_PAINT: - if(preview_isactive()) - return print_preview(hWnd); - else + if(!preview_isactive()) return DefWindowProcW(hWnd, msg, wParam, lParam); default: @@ -2605,6 +2644,18 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar wc.lpszClassName = wszMainWndClass; RegisterClassW(&wc); + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = preview_proc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = hInstance; + wc.hIcon = NULL; + wc.hCursor = LoadCursor(NULL, IDC_IBEAM); + wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW); + wc.lpszMenuName = NULL; + wc.lpszClassName = wszPreviewWndClass; + RegisterClassW(&wc); + registry_read_winrect(&rc); hMainWnd = CreateWindowExW(0, wszMainWndClass, wszAppTitle, WS_CLIPCHILDREN|WS_OVERLAPPEDWINDOW, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, NULL, NULL, hInstance, NULL); @@ -2618,6 +2669,7 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar set_bar_states(); set_fileformat(SF_RTF); hPopupMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDM_POPUP)); + hColorPopupMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(IDM_COLOR_POPUP)); get_default_printer_opts(); target_device(hMainWnd, wordWrap[reg_formatindex(fileFormat)]); diff --git a/reactos/base/applications/wordpad/wordpad.h b/reactos/base/applications/wordpad/wordpad.h index b51bec8fcb0..2f774c3aff0 100644 --- a/reactos/base/applications/wordpad/wordpad.h +++ b/reactos/base/applications/wordpad/wordpad.h @@ -49,6 +49,8 @@ #define ID_PREVIEW_NEXTPAGE 1017 #define ID_PREVIEW_PREVPAGE 1018 #define ID_PREVIEW_NUMPAGES 1019 +#define ID_PREVIEW_ZOOMIN 1020 +#define ID_PREVIEW_ZOOMOUT 1021 #define ID_ALIGN_LEFT 1100 #define ID_ALIGN_CENTER 1101 @@ -78,13 +80,14 @@ #define ID_FORMAT_BOLD 1400 #define ID_FORMAT_ITALIC 1401 #define ID_FORMAT_UNDERLINE 1402 +#define ID_FORMAT_COLOR 1403 #define ID_TOGGLE_TOOLBAR 1500 #define ID_TOGGLE_FORMATBAR 1501 #define ID_TOGGLE_STATUSBAR 1502 #define ID_TOGGLE_RULER 1503 -#define PREVIEW_BUTTONS 5 +#define PREVIEW_BUTTONS 7 #define FILELIST_ENTRIES 4 #define FILELIST_ENTRY_LENGTH 33 @@ -101,7 +104,9 @@ #define BANDID_PREVIEW_BTN3 8 #define BANDID_PREVIEW_BTN4 9 #define BANDID_PREVIEW_BTN5 10 -#define BANDID_PREVIEW_BUFFER 11 +#define BANDID_PREVIEW_BTN6 11 +#define BANDID_PREVIEW_BTN7 12 +#define BANDID_PREVIEW_BUFFER 13 #define ID_WORDWRAP_NONE 0 #define ID_WORDWRAP_WINDOW 1 @@ -129,6 +134,25 @@ #define ID_ABOUT 1603 #define ID_VIEWPROPERTIES 1604 +#define ID_COLOR_FIRST 1800 +#define ID_COLOR_BLACK 1800 +#define ID_COLOR_MAROON 1801 +#define ID_COLOR_GREEN 1802 +#define ID_COLOR_OLIVE 1803 +#define ID_COLOR_NAVY 1804 +#define ID_COLOR_PURPLE 1805 +#define ID_COLOR_TEAL 1806 +#define ID_COLOR_GRAY 1807 +#define ID_COLOR_SILVER 1808 +#define ID_COLOR_RED 1809 +#define ID_COLOR_LIME 1810 +#define ID_COLOR_YELLOW 1811 +#define ID_COLOR_BLUE 1812 +#define ID_COLOR_FUCHSIA 1813 +#define ID_COLOR_AQUA 1814 +#define ID_COLOR_WHITE 1815 +#define ID_COLOR_AUTOMATIC 1816 + #define IDC_STATUSBAR 2000 #define IDC_EDITOR 2001 #define IDC_TOOLBAR 2002 @@ -145,6 +169,7 @@ #define IDC_FONTLIST 2013 #define IDC_SIZELIST 2014 #define IDC_RULER 2015 +#define IDC_PREVIEW 2016 #define IDD_DATETIME 2100 #define IDD_NEWFILE 2101 @@ -154,6 +179,7 @@ #define IDM_MAINMENU 2200 #define IDM_POPUP 2201 +#define IDM_COLOR_POPUP 2202 #define IDB_TOOLBAR 100 #define IDB_FORMATBAR 101 @@ -163,6 +189,8 @@ #define IDI_WRI 104 #define IDI_TXT 105 +#define IDC_ZOOM 106 + #define STRING_ALL_FILES 1400 #define STRING_TEXT_FILES_TXT 1401 #define STRING_TEXT_FILES_UNICODE_TXT 1402 @@ -187,9 +215,13 @@ #define STRING_PREVIEW_PREVPAGE 1450 #define STRING_PREVIEW_TWOPAGES 1451 #define STRING_PREVIEW_ONEPAGE 1452 -#define STRING_PREVIEW_CLOSE 1453 +#define STRING_PREVIEW_ZOOMIN 1453 +#define STRING_PREVIEW_ZOOMOUT 1454 +#define STRING_PREVIEW_CLOSE 1455 +#define STRING_PREVIEW_PAGE 1456 +#define STRING_PREVIEW_PAGES 1457 -#define STRING_UNITS_CM 1454 +#define STRING_UNITS_CM 1458 #define STRING_DEFAULT_FILENAME 1700 #define STRING_PROMPT_SAVE_CHANGES 1701 @@ -210,7 +242,7 @@ LPWSTR file_basename(LPWSTR); void dialog_printsetup(HWND); void dialog_print(HWND, LPWSTR); void target_device(HWND, DWORD); -void print_quick(LPWSTR); +void print_quick(HWND, LPWSTR); LRESULT preview_command(HWND, WPARAM); void init_preview(HWND, LPWSTR); void close_preview(HWND); @@ -219,6 +251,8 @@ LRESULT print_preview(HWND); void get_default_printer_opts(void); void registry_set_pagemargins(HKEY); void registry_read_pagemargins(HKEY); +void registry_set_previewpages(HKEY hKey); +void registry_read_previewpages(HKEY hKey); LRESULT CALLBACK ruler_proc(HWND, UINT, WPARAM, LPARAM); void redraw_ruler(HWND); diff --git a/reactos/base/applications/wordpad/zoom.cur b/reactos/base/applications/wordpad/zoom.cur new file mode 100644 index 00000000000..26d1a8fa157 Binary files /dev/null and b/reactos/base/applications/wordpad/zoom.cur differ diff --git a/reactos/base/applications/write/De.rc b/reactos/base/applications/write/De.rc index 83cb909c318..db175a02d56 100644 --- a/reactos/base/applications/write/De.rc +++ b/reactos/base/applications/write/De.rc @@ -27,4 +27,3 @@ STRINGTABLE { IDS_FAILED, "Der Start von Wordpad ist fehlgeschlagen" } -#pragma code_page(default) diff --git a/reactos/base/applications/write/Fr.rc b/reactos/base/applications/write/Fr.rc index 69105d9a788..a81dffda827 100644 --- a/reactos/base/applications/write/Fr.rc +++ b/reactos/base/applications/write/Fr.rc @@ -28,4 +28,3 @@ STRINGTABLE { IDS_FAILED, "Wordpad n'a pas pu être démarré" } -#pragma code_page(default) diff --git a/reactos/base/system/msiexec/version.rc b/reactos/base/applications/write/It.rc similarity index 64% rename from reactos/base/system/msiexec/version.rc rename to reactos/base/applications/write/It.rc index 077759431e2..b906a7906b8 100644 --- a/reactos/base/system/msiexec/version.rc +++ b/reactos/base/applications/write/It.rc @@ -1,5 +1,7 @@ /* - * Copyright (c) 2004 Mike McCormack + * Italian language support + * + * Copyright (C) 2010 by Luca Bennati * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,13 +18,14 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#define WINE_FILEDESCRIPTION_STR "Wine Installer" -#define WINE_FILENAME_STR "msiexec.exe" -#define WINE_FILETYPE VFT_APP -#define WINE_FILEVERSION 3,1,4000,1823 -#define WINE_FILEVERSION_STR "3.1.4000.1823" -#define WINE_PRODUCTVERSION 3,1,4000,1823 -#define WINE_PRODUCTVERSION_STR "3.1.4000.1823" -#define WINE_PRODUCTNAME_STR "Wine Installer" +#include "resources.h" -#include "wine/wine_common_ver.rc" +/*UTF-8*/ +#pragma code_page(65001) + +LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL + +STRINGTABLE +{ + IDS_FAILED, "Impossibile avviare WordPad" +} diff --git a/reactos/base/applications/write/Ja.rc b/reactos/base/applications/write/Ja.rc index 6b942ce02e0..5c9a8259a97 100644 --- a/reactos/base/applications/write/Ja.rc +++ b/reactos/base/applications/write/Ja.rc @@ -29,4 +29,3 @@ STRINGTABLE { IDS_FAILED, "Wordpad の起動に失敗しました" } -#pragma code_page(default) diff --git a/reactos/base/applications/write/Lt.rc b/reactos/base/applications/write/Lt.rc index 8e3eae38569..5cef934fbc7 100644 --- a/reactos/base/applications/write/Lt.rc +++ b/reactos/base/applications/write/Lt.rc @@ -29,4 +29,3 @@ STRINGTABLE { IDS_FAILED, "Nepavyko paleisti Wordpad" } -#pragma code_page(default) diff --git a/reactos/base/applications/write/Ro.rc b/reactos/base/applications/write/Ro.rc index a871350bfda..f6a7b65665f 100644 --- a/reactos/base/applications/write/Ro.rc +++ b/reactos/base/applications/write/Ro.rc @@ -27,4 +27,3 @@ STRINGTABLE { IDS_FAILED, "Execuția Wordpad a eșuat" } -#pragma code_page(default) diff --git a/reactos/base/applications/write/Ru.rc b/reactos/base/applications/write/Ru.rc index e64003fe566..008011f2720 100644 --- a/reactos/base/applications/write/Ru.rc +++ b/reactos/base/applications/write/Ru.rc @@ -29,4 +29,3 @@ STRINGTABLE { IDS_FAILED, "Не удалось запустить Wordpad" } -#pragma code_page(default) diff --git a/reactos/base/applications/write/Si.rc b/reactos/base/applications/write/Si.rc index 3eaae9ed5ee..9d3e5fe1520 100644 --- a/reactos/base/applications/write/Si.rc +++ b/reactos/base/applications/write/Si.rc @@ -28,4 +28,3 @@ STRINGTABLE { IDS_FAILED, "Zagon programa Wordpad ni uspel" } -#pragma code_page(default) diff --git a/reactos/base/applications/write/Uk.rc b/reactos/base/applications/write/Uk.rc new file mode 100644 index 00000000000..f922210e0e3 --- /dev/null +++ b/reactos/base/applications/write/Uk.rc @@ -0,0 +1,33 @@ +/* + * Ukrainian language support + * + * Copyright (C) 2007 Mikolaj Zalewski + * + * Copyright (C) 2010 Igor Paliychuk + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "resources.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT + +STRINGTABLE +{ + IDS_FAILED, "Не вдалось запустити Wordpad" +} diff --git a/reactos/base/applications/write/rsrc.rc b/reactos/base/applications/write/rsrc.rc index 7c55c3001b4..45c5d308136 100644 --- a/reactos/base/applications/write/rsrc.rc +++ b/reactos/base/applications/write/rsrc.rc @@ -20,15 +20,21 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL -#include "De.rc" #include "En.rc" -#include "Fr.rc" -#include "Ja.rc" #include "Ko.rc" -#include "Lt.rc" #include "Nl.rc" +#include "No.rc" +#include "Pl.rc" #include "Pt.rc" +#include "Sv.rc" + +/* UTF-8 */ +#include "De.rc" +#include "Fr.rc" +#include "It.rc" +#include "Ja.rc" +#include "Lt.rc" #include "Ro.rc" #include "Ru.rc" #include "Si.rc" -#include "Sv.rc" +#include "Uk.rc" diff --git a/reactos/base/services/dhcp/dhclient.c b/reactos/base/services/dhcp/dhclient.c index 8b18010735c..db263bc4ab5 100644 --- a/reactos/base/services/dhcp/dhclient.c +++ b/reactos/base/services/dhcp/dhclient.c @@ -57,6 +57,7 @@ #include #include "dhcpd.h" #include "privsep.h" +#include "debug.h" #define PERIOD 0x2e #define hyphenchar(c) ((c) == 0x2d) @@ -109,22 +110,106 @@ int check_arp( struct interface_info *ip, struct client_lease *lp ) time_t scripttime; + +static VOID CALLBACK ServiceMain(DWORD argc, LPWSTR *argv); +static WCHAR ServiceName[] = L"DHCP"; +static SERVICE_TABLE_ENTRYW ServiceTable[] = +{ + {ServiceName, ServiceMain}, + {NULL, NULL} +}; + +SERVICE_STATUS_HANDLE ServiceStatusHandle; +SERVICE_STATUS ServiceStatus; + + /* XXX Implement me */ int check_arp( struct interface_info *ip, struct client_lease *lp ) { return 1; } -static VOID CALLBACK -DispatchMain(DWORD argc, LPTSTR *argv) + +static VOID +UpdateServiceStatus(DWORD dwState) { - dispatch(); + ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; + ServiceStatus.dwCurrentState = dwState; + + ServiceStatus.dwControlsAccepted = 0; + + ServiceStatus.dwWin32ExitCode = 0; + ServiceStatus.dwServiceSpecificExitCode = 0; + ServiceStatus.dwCheckPoint = 0; + + if (dwState == SERVICE_START_PENDING || + dwState == SERVICE_STOP_PENDING || + dwState == SERVICE_PAUSE_PENDING || + dwState == SERVICE_CONTINUE_PENDING) + ServiceStatus.dwWaitHint = 10000; + else + ServiceStatus.dwWaitHint = 0; + + SetServiceStatus(ServiceStatusHandle, + &ServiceStatus); } -static SERVICE_TABLE_ENTRY ServiceTable[2] = + +static DWORD WINAPI +ServiceControlHandler(DWORD dwControl, + DWORD dwEventType, + LPVOID lpEventData, + LPVOID lpContext) { - {TEXT("DHCP"), DispatchMain}, - {NULL, NULL} -}; + switch (dwControl) + { + case SERVICE_CONTROL_STOP: + UpdateServiceStatus(SERVICE_STOP_PENDING); + UpdateServiceStatus(SERVICE_STOPPED); + return ERROR_SUCCESS; + + case SERVICE_CONTROL_PAUSE: + UpdateServiceStatus(SERVICE_PAUSED); + return ERROR_SUCCESS; + + case SERVICE_CONTROL_CONTINUE: + UpdateServiceStatus(SERVICE_START_PENDING); + UpdateServiceStatus(SERVICE_RUNNING); + return ERROR_SUCCESS; + + case SERVICE_CONTROL_INTERROGATE: + SetServiceStatus(ServiceStatusHandle, + &ServiceStatus); + return ERROR_SUCCESS; + + case SERVICE_CONTROL_SHUTDOWN: + UpdateServiceStatus(SERVICE_STOP_PENDING); + UpdateServiceStatus(SERVICE_STOPPED); + return ERROR_SUCCESS; + + default : + return ERROR_CALL_NOT_IMPLEMENTED; + } +} + + +static VOID CALLBACK +ServiceMain(DWORD argc, LPWSTR *argv) +{ + ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName, + ServiceControlHandler, + NULL); + if (!ServiceStatusHandle) + { + return; + } + + UpdateServiceStatus(SERVICE_START_PENDING); + + UpdateServiceStatus(SERVICE_RUNNING); + + dispatch(); +} + int main(int argc, char *argv[]) @@ -147,7 +232,7 @@ main(int argc, char *argv[]) DH_DbgPrint(MID_TRACE,("Going into dispatch()\n")); - StartServiceCtrlDispatcher(ServiceTable); + StartServiceCtrlDispatcherW(ServiceTable); /* not reached */ return (0); diff --git a/reactos/base/services/dhcp/include/debug.h b/reactos/base/services/dhcp/include/debug.h index 369b8ee049b..de374aaba45 100644 --- a/reactos/base/services/dhcp/include/debug.h +++ b/reactos/base/services/dhcp/include/debug.h @@ -6,8 +6,8 @@ * DEFINES: DBG - Enable debug output * NASSERT - Disable assertions */ -#ifndef __DEBUG_H -#define __DEBUG_H + +#pragma once #define NORMAL_MASK 0x000000FF #define SPECIAL_MASK 0xFFFFFF00 @@ -48,6 +48,4 @@ extern unsigned long debug_trace_level; #endif /* DBG */ -#endif /* __DEBUG_H */ - /* EOF */ diff --git a/reactos/base/services/dhcp/include/dhcpd.h b/reactos/base/services/dhcp/include/dhcpd.h index 44bae6de878..d6a2fa405b8 100644 --- a/reactos/base/services/dhcp/include/dhcpd.h +++ b/reactos/base/services/dhcp/include/dhcpd.h @@ -39,8 +39,7 @@ * Enterprises, see ``http://www.vix.com''. */ -#ifndef DHCPD_H -#define DHCPD_H +#pragma once #include #include @@ -484,5 +483,3 @@ int buf_add(struct buf *, void *, size_t); int buf_close(int, struct buf *); ssize_t buf_read(int, void *, size_t); void dispatch_imsg(int); - -#endif/*DHCPD_H*/ diff --git a/reactos/base/services/dhcp/include/predec.h b/reactos/base/services/dhcp/include/predec.h index 7f2515beb33..59fb94b003c 100644 --- a/reactos/base/services/dhcp/include/predec.h +++ b/reactos/base/services/dhcp/include/predec.h @@ -1,7 +1,4 @@ -#ifndef REACTOS_PREDEC_H -#define REACTOS_PREDEC_H +#pragma once struct iaddr; struct interface_info; - -#endif diff --git a/reactos/base/services/dhcp/include/stdint.h b/reactos/base/services/dhcp/include/stdint.h index 988c30359e9..a45def0e663 100644 --- a/reactos/base/services/dhcp/include/stdint.h +++ b/reactos/base/services/dhcp/include/stdint.h @@ -1,5 +1,4 @@ -#ifndef REACTOS_STDINT_H -#define REACTOS_STDINT_H +#pragma once typedef signed char int8_t; typedef unsigned char u_int8_t; @@ -9,5 +8,3 @@ typedef int int32_t; typedef unsigned int u_int32_t; typedef char *caddr_t; - -#endif diff --git a/reactos/base/services/eventlog/eventlog.c b/reactos/base/services/eventlog/eventlog.c index 9a2ddab82b1..70663351ab5 100644 --- a/reactos/base/services/eventlog/eventlog.c +++ b/reactos/base/services/eventlog/eventlog.c @@ -13,20 +13,89 @@ /* GLOBALS ******************************************************************/ -VOID CALLBACK ServiceMain(DWORD argc, LPTSTR * argv); - -SERVICE_TABLE_ENTRY ServiceTable[2] = +static VOID CALLBACK ServiceMain(DWORD, LPWSTR *); +static WCHAR ServiceName[] = L"EventLog"; +static SERVICE_TABLE_ENTRYW ServiceTable[2] = { - { L"EventLog", (LPSERVICE_MAIN_FUNCTION) ServiceMain }, + { ServiceName, ServiceMain }, { NULL, NULL } }; +SERVICE_STATUS ServiceStatus; +SERVICE_STATUS_HANDLE ServiceStatusHandle; + BOOL onLiveCD = FALSE; // On livecd events will go to debug output only HANDLE MyHeap = NULL; /* FUNCTIONS ****************************************************************/ -VOID CALLBACK ServiceMain(DWORD argc, LPTSTR * argv) +static VOID +UpdateServiceStatus(DWORD dwState) +{ + ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; + ServiceStatus.dwCurrentState = dwState; + ServiceStatus.dwControlsAccepted = 0; + ServiceStatus.dwWin32ExitCode = 0; + ServiceStatus.dwServiceSpecificExitCode = 0; + ServiceStatus.dwCheckPoint = 0; + + if (dwState == SERVICE_START_PENDING || + dwState == SERVICE_STOP_PENDING || + dwState == SERVICE_PAUSE_PENDING || + dwState == SERVICE_CONTINUE_PENDING) + ServiceStatus.dwWaitHint = 10000; + else + ServiceStatus.dwWaitHint = 0; + + SetServiceStatus(ServiceStatusHandle, + &ServiceStatus); +} + +static DWORD WINAPI +ServiceControlHandler(DWORD dwControl, + DWORD dwEventType, + LPVOID lpEventData, + LPVOID lpContext) +{ + DPRINT("ServiceControlHandler() called\n"); + + switch (dwControl) + { + case SERVICE_CONTROL_STOP: + DPRINT(" SERVICE_CONTROL_STOP received\n"); + UpdateServiceStatus(SERVICE_STOPPED); + return ERROR_SUCCESS; + + case SERVICE_CONTROL_PAUSE: + DPRINT(" SERVICE_CONTROL_PAUSE received\n"); + UpdateServiceStatus(SERVICE_PAUSED); + return ERROR_SUCCESS; + + case SERVICE_CONTROL_CONTINUE: + DPRINT(" SERVICE_CONTROL_CONTINUE received\n"); + UpdateServiceStatus(SERVICE_RUNNING); + return ERROR_SUCCESS; + + case SERVICE_CONTROL_INTERROGATE: + DPRINT(" SERVICE_CONTROL_INTERROGATE received\n"); + SetServiceStatus(ServiceStatusHandle, + &ServiceStatus); + return ERROR_SUCCESS; + + case SERVICE_CONTROL_SHUTDOWN: + DPRINT(" SERVICE_CONTROL_SHUTDOWN received\n"); + UpdateServiceStatus(SERVICE_STOPPED); + return ERROR_SUCCESS; + + default : + DPRINT1(" Control %lu received\n"); + return ERROR_CALL_NOT_IMPLEMENTED; + } +} + + +static DWORD +ServiceInit(VOID) { HANDLE hThread; @@ -39,7 +108,10 @@ VOID CALLBACK ServiceMain(DWORD argc, LPTSTR * argv) NULL); if (!hThread) + { DPRINT("Can't create PortThread\n"); + return GetLastError(); + } else CloseHandle(hThread); @@ -52,11 +124,56 @@ VOID CALLBACK ServiceMain(DWORD argc, LPTSTR * argv) NULL); if (!hThread) + { DPRINT("Can't create RpcThread\n"); + return GetLastError(); + } else CloseHandle(hThread); + + return ERROR_SUCCESS; } + +static VOID CALLBACK +ServiceMain(DWORD argc, + LPWSTR *argv) +{ + DWORD dwError; + + UNREFERENCED_PARAMETER(argc); + UNREFERENCED_PARAMETER(argv); + + DPRINT("ServiceMain() called\n"); + + ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName, + ServiceControlHandler, + NULL); + if (!ServiceStatusHandle) + { + dwError = GetLastError(); + DPRINT1("RegisterServiceCtrlHandlerW() failed! (Error %lu)\n", dwError); + return; + } + + UpdateServiceStatus(SERVICE_START_PENDING); + + dwError = ServiceInit(); + if (dwError != ERROR_SUCCESS) + { + DPRINT("Service stopped (dwError: %lu\n", dwError); + UpdateServiceStatus(SERVICE_START_PENDING); + } + else + { + DPRINT("Service started\n"); + UpdateServiceStatus(SERVICE_RUNNING); + } + + DPRINT("ServiceMain() done\n"); +} + + BOOL LoadLogFile(HKEY hKey, WCHAR * LogName) { DWORD MaxValueLen, ValueLen, Type, ExpandedLen; diff --git a/reactos/base/services/eventlog/eventlog.h b/reactos/base/services/eventlog/eventlog.h index 4b9c6a8c341..df0ab151c41 100644 --- a/reactos/base/services/eventlog/eventlog.h +++ b/reactos/base/services/eventlog/eventlog.h @@ -44,7 +44,8 @@ typedef struct _IO_ERROR_LPC #define ELF_LOGFILE_ARCHIVE_SET 8 /* FIXME: MSDN reads that the following two structs are in winnt.h. Are they? */ -typedef struct _EVENTLOGHEADER { +typedef struct _EVENTLOGHEADER +{ ULONG HeaderSize; ULONG Signature; ULONG MajorVersion; @@ -59,7 +60,8 @@ typedef struct _EVENTLOGHEADER { ULONG EndHeaderSize; } EVENTLOGHEADER, *PEVENTLOGHEADER; -typedef struct _EVENTLOGEOF { +typedef struct _EVENTLOGEOF +{ ULONG RecordSizeBeginning; ULONG Ones; ULONG Twos; @@ -72,13 +74,13 @@ typedef struct _EVENTLOGEOF { ULONG RecordSizeEnd; } EVENTLOGEOF, *PEVENTLOGEOF; -typedef struct +typedef struct _EVENT_OFFSET_INFO { ULONG EventNumber; ULONG EventOffset; } EVENT_OFFSET_INFO, *PEVENT_OFFSET_INFO; -typedef struct +typedef struct _LOGFILE { HANDLE hFile; EVENTLOGHEADER Header; diff --git a/reactos/base/services/eventlog/rpc.c b/reactos/base/services/eventlog/rpc.c index e3ef33d1611..d399d1e600f 100644 --- a/reactos/base/services/eventlog/rpc.c +++ b/reactos/base/services/eventlog/rpc.c @@ -480,45 +480,29 @@ NTSTATUS ElfrOpenELA( DWORD MinorVersion, IELF_HANDLE *LogHandle) { - UNICODE_STRING UNCServerNameW = { 0, 0, NULL }; - UNICODE_STRING ModuleNameW = { 0, 0, NULL }; - UNICODE_STRING RegModuleNameW = { 0, 0, NULL }; - NTSTATUS Status; + UNICODE_STRING ModuleNameW; - if (UNCServerName && - !RtlCreateUnicodeStringFromAsciiz(&UNCServerNameW, UNCServerName)) - { - return STATUS_NO_MEMORY; - } + if ((MajorVersion != 1) || (MinorVersion != 1)) + return STATUS_INVALID_PARAMETER; - if (ModuleName && - !RtlAnsiStringToUnicodeString(&ModuleNameW, (PANSI_STRING)ModuleName, TRUE)) - { - RtlFreeUnicodeString(&UNCServerNameW); - return STATUS_NO_MEMORY; - } + /* RegModuleName must be an empty string */ + if (RegModuleName->Length > 0) + return STATUS_INVALID_PARAMETER; - if (RegModuleName && - !RtlAnsiStringToUnicodeString(&RegModuleNameW, (PANSI_STRING)RegModuleName, TRUE)) - { - RtlFreeUnicodeString(&UNCServerNameW); - RtlFreeUnicodeString(&ModuleNameW); - return STATUS_NO_MEMORY; - } + RtlAnsiStringToUnicodeString(&ModuleNameW, (PANSI_STRING)ModuleName, TRUE); - Status = ElfrOpenELW( - UNCServerName ? UNCServerNameW.Buffer : NULL, - ModuleName ? (PRPC_UNICODE_STRING)&ModuleNameW : NULL, - RegModuleName ? (PRPC_UNICODE_STRING)&RegModuleNameW : NULL, - MajorVersion, - MinorVersion, - LogHandle); + /* FIXME: Must verify that caller has read access */ + + *LogHandle = ElfCreateEventLogHandle(ModuleNameW.Buffer, FALSE); - RtlFreeUnicodeString(&UNCServerNameW); RtlFreeUnicodeString(&ModuleNameW); - RtlFreeUnicodeString(&RegModuleNameW); - return Status; + if (*LogHandle == NULL) + { + return STATUS_INVALID_PARAMETER; + } + + return STATUS_SUCCESS; } @@ -531,45 +515,32 @@ NTSTATUS ElfrRegisterEventSourceA( DWORD MinorVersion, IELF_HANDLE *LogHandle) { - UNICODE_STRING UNCServerNameW = { 0, 0, NULL }; UNICODE_STRING ModuleNameW = { 0, 0, NULL }; - if (UNCServerName && - !RtlCreateUnicodeStringFromAsciiz(&UNCServerNameW, UNCServerName)) - { - return STATUS_NO_MEMORY; - } - if (ModuleName && !RtlAnsiStringToUnicodeString(&ModuleNameW, (PANSI_STRING)ModuleName, TRUE)) { - RtlFreeUnicodeString(&UNCServerNameW); return STATUS_NO_MEMORY; } /* RegModuleName must be an empty string */ if (RegModuleName->Length > 0) { - RtlFreeUnicodeString(&UNCServerNameW); RtlFreeUnicodeString(&ModuleNameW); return STATUS_INVALID_PARAMETER; } if ((MajorVersion != 1) || (MinorVersion != 1)) { - RtlFreeUnicodeString(&UNCServerNameW); RtlFreeUnicodeString(&ModuleNameW); return STATUS_INVALID_PARAMETER; } - /*FIXME: UNCServerName must specify the server or empty for local */ - - /*FIXME: Must verify that caller has write access */ + /* FIXME: Must verify that caller has write access */ *LogHandle = ElfCreateEventLogHandle(ModuleNameW.Buffer, TRUE); - RtlFreeUnicodeString(&UNCServerNameW); RtlFreeUnicodeString(&ModuleNameW); return STATUS_SUCCESS; @@ -661,8 +632,32 @@ NTSTATUS ElfrGetLogInformation( DWORD cbBufSize, DWORD *pcbBytesNeeded) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status = STATUS_SUCCESS; + + /* FIXME: check handle first */ + + switch (InfoLevel) + { + case EVENTLOG_FULL_INFO: + { + LPEVENTLOG_FULL_INFORMATION efi = (LPEVENTLOG_FULL_INFORMATION)Buffer; + + *pcbBytesNeeded = sizeof(EVENTLOG_FULL_INFORMATION); + if (cbBufSize < sizeof(EVENTLOG_FULL_INFORMATION)) + { + return STATUS_BUFFER_TOO_SMALL; + } + + efi->dwFull = 0; /* FIXME */ + } + break; + + default: + Status = STATUS_INVALID_LEVEL; + break; + } + + return Status; } diff --git a/reactos/base/services/rpcss/rpcss.rbuild b/reactos/base/services/rpcss/rpcss.rbuild index 5d89e489222..04e42f81de9 100644 --- a/reactos/base/services/rpcss/rpcss.rbuild +++ b/reactos/base/services/rpcss/rpcss.rbuild @@ -1,5 +1,6 @@ + . . @@ -23,3 +24,4 @@ irot.idl + diff --git a/reactos/base/services/rpcss/rpcss_main.c b/reactos/base/services/rpcss/rpcss_main.c index 2df13c7cea1..8e6ec1f3099 100644 --- a/reactos/base/services/rpcss/rpcss_main.c +++ b/reactos/base/services/rpcss/rpcss_main.c @@ -58,7 +58,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole); -static HANDLE exit_event; +HANDLE exit_event; //extern HANDLE __wine_make_process_system(void); diff --git a/reactos/base/services/rpcss/rpcss_ros.diff b/reactos/base/services/rpcss/rpcss_ros.diff index 02d82263cf4..f23583afd7f 100644 --- a/reactos/base/services/rpcss/rpcss_ros.diff +++ b/reactos/base/services/rpcss/rpcss_ros.diff @@ -1,8 +1,13 @@ Index: rpcss_main.c =================================================================== ---- rpcss_main.c (revision 37240) -+++ rpcss_main.c (working copy) -@@ -62,7 +62,7 @@ +--- rpcss_main.c ++++ rpcss_main.c +@@ -58,11 +58,11 @@ + + WINE_DEFAULT_DEBUG_CHANNEL(ole); + +-static HANDLE exit_event; ++HANDLE exit_event; //extern HANDLE __wine_make_process_system(void); diff --git a/reactos/base/services/rpcss/service_main.c b/reactos/base/services/rpcss/service_main.c index 7fe84a57d26..501e2a43e3b 100644 --- a/reactos/base/services/rpcss/service_main.c +++ b/reactos/base/services/rpcss/service_main.c @@ -9,120 +9,90 @@ #include "rpcss.h" -BOOL RPCSS_Initialize(void); -BOOL RPCSS_Shutdown(void); +#define NDEBUG +#include +extern BOOL RPCSS_Initialize(void); +extern BOOL RPCSS_Shutdown(void); +extern HANDLE exit_event; + +static VOID WINAPI ServiceMain(DWORD, LPWSTR *); static WCHAR ServiceName[] = L"RpcSs"; - -typedef struct _ServiceInfo +SERVICE_TABLE_ENTRYW ServiceTable[] = { - SERVICE_STATUS servStatus; - SERVICE_STATUS_HANDLE hStatus; -} SERVICEINFO, *PSERVICEINFO; + { ServiceName, ServiceMain }, + { NULL, NULL } +}; +static SERVICE_STATUS ServiceStatus; +static SERVICE_STATUS_HANDLE ServiceStatusHandle; -static VOID -UpdateStatus(PSERVICEINFO pServInfo, - DWORD NewStatus, - DWORD Check) +DWORD WINAPI +ServiceControlHandler(DWORD dwControl, + DWORD dwEventType, + LPVOID lpEventData, + LPVOID lpContext) { - if (Check > 0) - { - pServInfo->servStatus.dwCheckPoint += Check; - } - else - { - pServInfo->servStatus.dwCheckPoint = Check; - } - - if (NewStatus > 0) - { - pServInfo->servStatus.dwCurrentState = NewStatus; - } - - SetServiceStatus(pServInfo->hStatus, &pServInfo->servStatus); -} - - -static BOOL -RunService(PSERVICEINFO pServInfo) -{ - return RPCSS_Initialize(); -} - -VOID WINAPI -ServerCtrlHandler(DWORD dwControl, - DWORD dwEventType, - LPVOID lpEventData, - LPVOID lpContext) -{ - PSERVICEINFO pServInfo = (PSERVICEINFO)lpContext; - switch (dwControl) { case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_STOP: - RPCSS_Shutdown(); - pServInfo->servStatus.dwWin32ExitCode = 0; - pServInfo->servStatus.dwWaitHint = 0; - UpdateStatus(pServInfo, SERVICE_STOP_PENDING, 1); - break; + SetEvent(exit_event); + return NO_ERROR; + + case SERVICE_CONTROL_INTERROGATE: + return NO_ERROR; default: - break; + return ERROR_CALL_NOT_IMPLEMENTED; } } VOID WINAPI ServiceMain(DWORD argc, LPWSTR argv[]) { - SERVICEINFO servInfo; - HANDLE hThread; - DWORD dwThreadId; + DWORD dwError; - servInfo.servStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; - servInfo.servStatus.dwCurrentState = SERVICE_STOPPED; - servInfo.servStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN; - servInfo.servStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; - servInfo.servStatus.dwServiceSpecificExitCode = 0; - servInfo.servStatus.dwCheckPoint = 0; - servInfo.servStatus.dwWaitHint = 1000; - - servInfo.hStatus = RegisterServiceCtrlHandlerExW(ServiceName, - (LPHANDLER_FUNCTION_EX)ServerCtrlHandler, - &servInfo); - if (!servInfo.hStatus) return; - - UpdateStatus(&servInfo, SERVICE_START_PENDING, 1); - - /* Create worker thread */ - hThread = CreateThread(NULL, - 0, - (LPTHREAD_START_ROUTINE)RunService, - &servInfo, - 0, - &dwThreadId); - if (!hThread) return; - - /* Set service status to running */ - UpdateStatus(&servInfo, SERVICE_RUNNING, 0); - - /* Wait until thread has terminated */ - WaitForSingleObject(hThread, INFINITE); - - CloseHandle(hThread); - - UpdateStatus(&servInfo, SERVICE_STOPPED, 0); -} - - -int wmain(int argc, LPWSTR argv []) -{ - SERVICE_TABLE_ENTRYW ServiceTable[] = + ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName, + ServiceControlHandler, + NULL); + if (!ServiceStatusHandle) { - {ServiceName, ServiceMain}, - {NULL, NULL } - }; + dwError = GetLastError(); + DPRINT1("RegisterServiceCtrlHandlerW() failed! (Error %lu)\n", dwError); + return; + } - return (int)(StartServiceCtrlDispatcherW(ServiceTable) != TRUE); + ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; + ServiceStatus.dwCurrentState = SERVICE_START_PENDING; + ServiceStatus.dwControlsAccepted = 0; + ServiceStatus.dwWin32ExitCode = NO_ERROR; + ServiceStatus.dwServiceSpecificExitCode = 0; + ServiceStatus.dwCheckPoint = 0; + ServiceStatus.dwWaitHint = 1000; + SetServiceStatus(ServiceStatusHandle, &ServiceStatus); + + if (RPCSS_Initialize()) + { + ServiceStatus.dwCurrentState = SERVICE_RUNNING; + ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; + SetServiceStatus(ServiceStatusHandle, &ServiceStatus); + + WaitForSingleObject(exit_event, INFINITE); + + ServiceStatus.dwCurrentState = SERVICE_STOPPED; + SetServiceStatus(ServiceStatusHandle, &ServiceStatus); + RPCSS_Shutdown(); + } +} + +int wmain(int argc, LPWSTR argv[]) +{ + if (!StartServiceCtrlDispatcherW(ServiceTable)) + { + DPRINT1("StartServiceCtrlDispatcherW() failed\n"); + return 1; + } + + return 0; } diff --git a/reactos/base/services/spoolsv/spoolsv.c b/reactos/base/services/spoolsv/spoolsv.c index 98b890d9020..398e565e54a 100644 --- a/reactos/base/services/spoolsv/spoolsv.c +++ b/reactos/base/services/spoolsv/spoolsv.c @@ -18,7 +18,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(spoolsv); /* GLOBALS ******************************************************************/ -#define SERVICE_NAME TEXT("Spooler") +static VOID CALLBACK ServiceMain(DWORD argc, LPWSTR *argv); +static WCHAR ServiceName[] = L"Spooler"; +static SERVICE_TABLE_ENTRYW ServiceTable[] = +{ + {ServiceName, ServiceMain}, + {NULL, NULL} +}; SERVICE_STATUS_HANDLE ServiceStatusHandle; SERVICE_STATUS ServiceStatus; @@ -100,14 +106,14 @@ ServiceControlHandler(DWORD dwControl, static VOID CALLBACK -ServiceMain(DWORD argc, LPTSTR *argv) +ServiceMain(DWORD argc, LPWSTR *argv) { UNREFERENCED_PARAMETER(argc); UNREFERENCED_PARAMETER(argv); TRACE("ServiceMain() called\n"); - ServiceStatusHandle = RegisterServiceCtrlHandlerExW(SERVICE_NAME, + ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName, ServiceControlHandler, NULL); @@ -123,12 +129,6 @@ ServiceMain(DWORD argc, LPTSTR *argv) int wmain(int argc, WCHAR *argv[]) { - SERVICE_TABLE_ENTRY ServiceTable[2] = - { - {SERVICE_NAME, ServiceMain}, - {NULL, NULL} - }; - UNREFERENCED_PARAMETER(argc); UNREFERENCED_PARAMETER(argv); @@ -138,8 +138,6 @@ wmain(int argc, WCHAR *argv[]) TRACE("Spoolsv: main() done\n"); - ExitThread(0); - return 0; } diff --git a/reactos/base/services/svchost/svchost.h b/reactos/base/services/svchost/svchost.h index 390b4d02b0b..539b5772e5f 100644 --- a/reactos/base/services/svchost/svchost.h +++ b/reactos/base/services/svchost/svchost.h @@ -5,8 +5,8 @@ * PURPOSE: Provide dll service loader * PROGRAMMERS: Gregor Brunmar (gregor.brunmar@home.se) */ -#ifndef __SVCHOST_H__ -#define __SVCHOST_H__ + +#pragma once /* INCLUDES ******************************************************************/ @@ -32,7 +32,4 @@ typedef struct _SERVICE { /* FUNCTIONS *****************************************************************/ -#endif /* __SVCHOST_H__ */ - /* EOF */ - diff --git a/reactos/base/services/telnetd/syslog.h b/reactos/base/services/telnetd/syslog.h index 2dbf821961a..ca87a1cb80f 100644 --- a/reactos/base/services/telnetd/syslog.h +++ b/reactos/base/services/telnetd/syslog.h @@ -29,8 +29,7 @@ * @(#)syslog.h 8.1 (Berkeley) 6/2/93 */ -#ifndef _SYS_SYSLOG_H -#define _SYS_SYSLOG_H 1 +#pragma once #include @@ -193,5 +192,3 @@ extern const char* set_syslog_conf_dir( const char* dir ); #ifdef __cplusplus } #endif - -#endif /* syslog.h */ diff --git a/reactos/base/services/telnetd/telnetd.h b/reactos/base/services/telnetd/telnetd.h index afb1199ce05..fe5bd138610 100644 --- a/reactos/base/services/telnetd/telnetd.h +++ b/reactos/base/services/telnetd/telnetd.h @@ -1,5 +1,4 @@ -#ifndef __TELNETD_H -#define __TELNETD_H +#pragma once #define _CRT_SECURE_NO_WARNINGS @@ -82,6 +81,3 @@ static DWORD WINAPI ReadFromPipeThread(LPVOID); static void TerminateShell(client_t *client); static VOID ErrorExit(LPTSTR); int kickoff_telnetd(void); - -#endif /* __TELNETD_H */ - diff --git a/reactos/base/services/umpnpmgr/umpnpmgr.c b/reactos/base/services/umpnpmgr/umpnpmgr.c index 8dc8a16e031..2352efe703f 100644 --- a/reactos/base/services/umpnpmgr/umpnpmgr.c +++ b/reactos/base/services/umpnpmgr/umpnpmgr.c @@ -51,15 +51,17 @@ /* GLOBALS ******************************************************************/ -static VOID CALLBACK -ServiceMain(DWORD argc, LPTSTR *argv); - -static SERVICE_TABLE_ENTRY ServiceTable[2] = +static VOID CALLBACK ServiceMain(DWORD argc, LPWSTR *argv); +static WCHAR ServiceName[] = L"PlugPlay"; +static SERVICE_TABLE_ENTRYW ServiceTable[] = { - {TEXT("PlugPlay"), ServiceMain}, + {ServiceName, ServiceMain}, {NULL, NULL} }; +static SERVICE_STATUS_HANDLE ServiceStatusHandle; +static SERVICE_STATUS ServiceStatus; + static WCHAR szRootDeviceId[] = L"HTREE\\ROOT\\0"; static HKEY hEnumKey = NULL; @@ -2446,6 +2448,72 @@ PnpEventThread(LPVOID lpParameter) } +static VOID +UpdateServiceStatus(DWORD dwState) +{ + ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; + ServiceStatus.dwCurrentState = dwState; + ServiceStatus.dwControlsAccepted = 0; + ServiceStatus.dwWin32ExitCode = 0; + ServiceStatus.dwServiceSpecificExitCode = 0; + ServiceStatus.dwCheckPoint = 0; + + if (dwState == SERVICE_START_PENDING || + dwState == SERVICE_STOP_PENDING || + dwState == SERVICE_PAUSE_PENDING || + dwState == SERVICE_CONTINUE_PENDING) + ServiceStatus.dwWaitHint = 10000; + else + ServiceStatus.dwWaitHint = 0; + + SetServiceStatus(ServiceStatusHandle, + &ServiceStatus); +} + + +static DWORD WINAPI +ServiceControlHandler(DWORD dwControl, + DWORD dwEventType, + LPVOID lpEventData, + LPVOID lpContext) +{ + DPRINT1("ServiceControlHandler() called\n"); + + switch (dwControl) + { + case SERVICE_CONTROL_STOP: + DPRINT1(" SERVICE_CONTROL_STOP received\n"); + UpdateServiceStatus(SERVICE_STOPPED); + return ERROR_SUCCESS; + + case SERVICE_CONTROL_PAUSE: + DPRINT1(" SERVICE_CONTROL_PAUSE received\n"); + UpdateServiceStatus(SERVICE_PAUSED); + return ERROR_SUCCESS; + + case SERVICE_CONTROL_CONTINUE: + DPRINT1(" SERVICE_CONTROL_CONTINUE received\n"); + UpdateServiceStatus(SERVICE_RUNNING); + return ERROR_SUCCESS; + + case SERVICE_CONTROL_INTERROGATE: + DPRINT1(" SERVICE_CONTROL_INTERROGATE received\n"); + SetServiceStatus(ServiceStatusHandle, + &ServiceStatus); + return ERROR_SUCCESS; + + case SERVICE_CONTROL_SHUTDOWN: + DPRINT1(" SERVICE_CONTROL_SHUTDOWN received\n"); + UpdateServiceStatus(SERVICE_STOPPED); + return ERROR_SUCCESS; + + default : + DPRINT1(" Control %lu received\n"); + return ERROR_CALL_NOT_IMPLEMENTED; + } +} + + static VOID CALLBACK ServiceMain(DWORD argc, LPTSTR *argv) { @@ -2457,6 +2525,17 @@ ServiceMain(DWORD argc, LPTSTR *argv) DPRINT("ServiceMain() called\n"); + ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName, + ServiceControlHandler, + NULL); + if (!ServiceStatusHandle) + { + DPRINT1("RegisterServiceCtrlHandlerExW() failed! (Error %lu)\n", GetLastError()); + return; + } + + UpdateServiceStatus(SERVICE_START_PENDING); + hThread = CreateThread(NULL, 0, PnpEventThread, @@ -2484,6 +2563,8 @@ ServiceMain(DWORD argc, LPTSTR *argv) if (hThread != NULL) CloseHandle(hThread); + UpdateServiceStatus(SERVICE_RUNNING); + DPRINT("ServiceMain() done\n"); } diff --git a/reactos/base/services/wlansvc/rpcserver.c b/reactos/base/services/wlansvc/rpcserver.c index b6475257b5e..bb010368669 100644 --- a/reactos/base/services/wlansvc/rpcserver.c +++ b/reactos/base/services/wlansvc/rpcserver.c @@ -14,7 +14,7 @@ #define NDEBUG #include - +//#define GET_IF_ENTRY2_IMPLEMENTED 1 DWORD _RpcOpenHandle( wchar_t *arg_1, diff --git a/reactos/base/services/wlansvc/wlansvc.c b/reactos/base/services/wlansvc/wlansvc.c index 86302f68a9e..5f0e1e6d95e 100644 --- a/reactos/base/services/wlansvc/wlansvc.c +++ b/reactos/base/services/wlansvc/wlansvc.c @@ -21,6 +21,7 @@ SERVICE_STATUS_HANDLE ServiceStatusHandle; SERVICE_STATUS SvcStatus; +static WCHAR ServiceName[] = L"WlanSvc"; /* FUNCTIONS *****************************************************************/ static DWORD WINAPI RpcThreadRoutine(LPVOID lpParameter) @@ -94,13 +95,14 @@ ServiceMain(DWORD argc, LPWSTR *argv) DPRINT("ServiceMain() called\n"); SvcStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; + SvcStatus.dwCurrentState = SERVICE_START_PENDING; SvcStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; SvcStatus.dwCheckPoint = 0; - SvcStatus.dwWin32ExitCode = 0; + SvcStatus.dwWin32ExitCode = NO_ERROR; SvcStatus.dwServiceSpecificExitCode = 0; SvcStatus.dwWaitHint = 4000; - ServiceStatusHandle = RegisterServiceCtrlHandlerExW(SERVICE_NAME, + ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName, ServiceControlHandler, NULL); @@ -115,15 +117,15 @@ ServiceMain(DWORD argc, LPWSTR *argv) NULL); if (!hThread) + { DPRINT("Can't create RpcThread\n"); + UpdateServiceStatus(ServiceStatusHandle, SERVICE_STOPPED, 0); + } else { - WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); } - UpdateServiceStatus(ServiceStatusHandle, SERVICE_STOPPED, 0); - DPRINT("ServiceMain() done\n"); } @@ -132,7 +134,7 @@ wmain(int argc, WCHAR *argv[]) { SERVICE_TABLE_ENTRYW ServiceTable[2] = { - {SERVICE_NAME, ServiceMain}, + {ServiceName, ServiceMain}, {NULL, NULL} }; diff --git a/reactos/base/services/wlansvc/wlansvc.rbuild b/reactos/base/services/wlansvc/wlansvc.rbuild index da8bf8259ff..4f656380d58 100644 --- a/reactos/base/services/wlansvc/wlansvc.rbuild +++ b/reactos/base/services/wlansvc/wlansvc.rbuild @@ -8,6 +8,7 @@ advapi32 rpcrt4 pseh + iphlpapi wlansvc.c rpcserver.c diff --git a/reactos/base/setup/reactos/lang/de-DE.rc b/reactos/base/setup/reactos/lang/de-DE.rc index c37399228b7..4c44f64b83c 100644 --- a/reactos/base/setup/reactos/lang/de-DE.rc +++ b/reactos/base/setup/reactos/lang/de-DE.rc @@ -4,17 +4,17 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL IDD_STARTPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Willkommen beim ReactOS Setup Assistenten.", IDC_STARTTITLE, 115, 8, 195, 24 + LTEXT "Willkommen beim ReactOS-Setup-Assistenten.", IDC_STARTTITLE, 115, 8, 195, 24 LTEXT "ReactOS kann noch nicht direkt von dieser CD installiert werden! Bitte starten Sie Ihren Computer mit dieser CD um ReactOS zu installieren.", IDC_STATIC, 115, 40, 195, 100 LTEXT "Klicken Sie auf Beenden um das Setup zu verlassen.", IDC_STATIC, 115, 169, 195, 17 END IDD_LANGSELPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN CONTROL "IDB_LOGO", IDB_ROSLOGO, "Static", WS_CHILD | WS_VISIBLE | SS_OWNERDRAW, 18, 0, 290, 99 @@ -27,7 +27,7 @@ END IDD_TYPEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN CONTROL "Setuptyp", IDC_STATIC, "Button", BS_GROUPBOX, 10,0,297,172 @@ -38,7 +38,7 @@ END IDD_DEVICEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN CONTROL "Gerteeinstellungen", IDC_STATIC, "Button", BS_GROUPBOX, 10,0,297,172 @@ -53,7 +53,7 @@ END IDD_DRIVEPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN CONTROL "Partition fr die ReactOS-Installation", IDC_STATIC, "Button", BS_GROUPBOX, 10,1,298,176 @@ -99,7 +99,7 @@ END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN CONTROL "Installationszusammenfassung", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172 @@ -108,7 +108,7 @@ END IDD_PROCESSPAGE DIALOGEX 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN CONTROL "Installationsaktion", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172 @@ -121,13 +121,13 @@ END IDD_RESTARTPAGE DIALOGEX DISCARDABLE 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Vervollstndige ReactOS Setup" +CAPTION "Vervollstndige ReactOS-Setup" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "Abschlieen der ersten Stufe des ReactOS Setup", IDC_FINISHTITLE, "Button", BS_GROUPBOX, 10,0,297,172 - LTEXT "Sie haben die erste Stufe des ReactOS Setup erfolgreich abgeschlossen.", IDC_STATIC, 20, 50, 277, 10 + CONTROL "Abschlieen der ersten Stufe der ReactOS-Installation", IDC_FINISHTITLE, "Button", BS_GROUPBOX, 10,0,297,172 + LTEXT "Sie haben die erste Stufe des ReactOS-Setup erfolgreich abgeschlossen.", IDC_STATIC, 20, 50, 277, 10 - LTEXT "Wenn Sie auf Beenden klicken wird der Computer neugestartet.", IDC_STATIC, 20, 80, 277, 10 + LTEXT "Wenn Sie auf Beenden klicken, wird der Computer neu gestartet.", IDC_STATIC, 20, 80, 277, 10 CONTROL "", IDC_RESTART_PROGRESS, "msctls_progress32", PBS_SMOOTH | WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 120, 277, 8 LTEXT "Wenn eine CD im Laufwerk ist, entfernen Sie sie. Klicken Sie zum Neustart auf Beenden.", IDC_STATIC, 10, 180, 297, 20 END @@ -137,7 +137,7 @@ STRINGTABLE BEGIN IDS_LANGTITLE "Sprachauswahl" IDS_LANGSUBTITLE "Whlen Sie eine Sprache fr das Setup und das Endsystem aus." - IDS_TYPETITLE "Willkommen zum ReactOS Setup" + IDS_TYPETITLE "Willkommen zum ReactOS-Setup" IDS_TYPESUBTITLE "Whlen Sie einen Setuptyp." IDS_DEVICETITLE "Einstellen der Basisgerte" IDS_DEVICESUBTITLE "Einstellungen der Anzeigegerte und der Tastatur." @@ -149,7 +149,7 @@ BEGIN IDS_RESTARTSUBTITLE "Die erste Stufe des Setup wurde abgeschlossen, starten Sie den Rechner neu, um mit der zweiten Stufe fortzufahren." IDS_SUMMARYTITLE "Installationszusammenfassung" IDS_SUMMARYSUBTITLE "Liste alle Installationseinstellungen vor Anwendung auf die Gerte auf" - IDS_ABORTSETUP "ReactOS ist nicht vollstndig auf Ihrem Computer installiert. Wenn Sie das Setup verlassen, dann mssen Sie das Setup nochmal ausfhren, um ReactOS zu installieren. Wirklich beenden?" + IDS_ABORTSETUP "ReactOS ist nicht vollstndig auf Ihrem Computer installiert. Wenn Sie das Setup verlassen, dann mssen Sie das Setup nochmals ausfhren, um ReactOS zu installieren. Wirklich beenden?" IDS_ABORTSETUP2 "Installation abbrechen?" END /* EOF */ diff --git a/reactos/base/setup/reactos/lang/pl-PL.rc b/reactos/base/setup/reactos/lang/pl-PL.rc index 97cff875b7d..31c951397cf 100644 --- a/reactos/base/setup/reactos/lang/pl-PL.rc +++ b/reactos/base/setup/reactos/lang/pl-PL.rc @@ -66,25 +66,25 @@ BEGIN LISTBOX IDC_PARTITION, 20,12,278,142,LBS_HASSTRINGS | WS_VSCROLL PUSHBUTTON "&Stwrz", IDC_PARTCREATE, 20,155,50,15 PUSHBUTTON "&Usu", IDC_PARTDELETE, 76,155,50,15 - PUSHBUTTON "D&river", IDC_DEVICEDRIVER, 162,155,50,15, WS_DISABLED + PUSHBUTTON "s&terownik", IDC_DEVICEDRIVER, 162,155,50,15, WS_DISABLED PUSHBUTTON "&Opcje zaawansowane...", IDC_PARTMOREOPTS, 218,155,80,15 LTEXT "Nacinij Dalej aby rozpocz proces instalacji.", IDC_STATIC, 10, 180 ,277, 20 END IDD_PARTITION DIALOGEX DISCARDABLE 0, 0, 145, 90 STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME -CAPTION "Create Partition" +CAPTION "Stwrz partycj" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_UPDOWN1,"msctls_updown32", WS_VISIBLE,104,22,9,13 - CONTROL "Create and format partition",IDC_STATIC,"Button",BS_GROUPBOX,7,5,129,57 - LTEXT "Size:",IDC_STATIC, 13,24,27,9 + CONTROL "Stwrz i sformatuj partycj",IDC_STATIC,"Button",BS_GROUPBOX,7,5,129,57 + LTEXT "Rozmiar:",IDC_STATIC, 13,24,27,9 EDITTEXT IDC_PARTSIZE,52,23,53,13, WS_VISIBLE|WS_TABSTOP LTEXT "GB",IDC_UNIT, 117,24,14,9 - LTEXT "Filesystem:",IDC_STATIC,13,46,35,9 + LTEXT "System plikw:",IDC_STATIC,13,46,35,9 CONTROL "",IDC_FSTYPE,"ComboBox",WS_VISIBLE|WS_TABSTOP|CBS_DROPDOWNLIST,52,42,79,50 PUSHBUTTON "&OK",IDOK,35,68,47,15, WS_VISIBLE|WS_TABSTOP - PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP + PUSHBUTTON "&Anuluj",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP END IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105 @@ -105,11 +105,11 @@ END IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "ReactOS Setup" +CAPTION "Instalator ReactOS" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "Installation summary", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172 - LTEXT "Click Next to start the installation process.", IDC_STATIC, 10, 180 ,277, 20 + CONTROL "Podsumowanie instalacji", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172 + LTEXT "Kliknij Dalej aby rozpocz proces instalacji.", IDC_STATIC, 10, 180 ,277, 20 END IDD_PROCESSPAGE DIALOGEX 0, 0, 317, 193 @@ -151,8 +151,8 @@ BEGIN IDS_PROCESSSUBTITLE "Przygotuj i sformatuj partycj, skopiuj pliki, skopiuj i zainstaluj bootloader" IDS_RESTARTTITLE "Pierwszy etap instalacji zakoczony sukcesem" IDS_RESTARTSUBTITLE "Pierwszy etap instalacji zosta zakoczony, uruchom ponownie komputer aby przej do drugiego etapu" - IDS_SUMMARYTITLE "Installation Summary" - IDS_SUMMARYSUBTITLE "List installation properties to check before apply to the installation device" + IDS_SUMMARYTITLE "Podsumowanie instalacji" + IDS_SUMMARYSUBTITLE "Sprawd ustawienia instalacji przed dokonaniem zmian na dysku" IDS_ABORTSETUP "Instalacja ReactOS nie zostaa ukoczona na tym komputerze. Jeli teraz zakoczysz instalacj, bdziesz musia uruchomi Instalator ponownie, aby zainstalowa Reactos. Na pewno zakoczy?" IDS_ABORTSETUP2 "Przerwa instalacj?" END diff --git a/reactos/base/setup/reactos/resource.h b/reactos/base/setup/reactos/resource.h index f8259b7ce93..f4d6b2210bf 100644 --- a/reactos/base/setup/reactos/resource.h +++ b/reactos/base/setup/reactos/resource.h @@ -1,5 +1,4 @@ -#ifndef RESOURCE_H -#define RESOURCE_H +#pragma once #define IDB_WATERMARK 100 #define IDB_HEADER 101 @@ -61,5 +60,3 @@ #define IDC_DEVICEDRIVER 2051 #define IDI_MAIN 3000 - -#endif diff --git a/reactos/base/setup/usetup/bootsup.h b/reactos/base/setup/usetup/bootsup.h index 1303b5be695..a0b012ed32b 100644 --- a/reactos/base/setup/usetup/bootsup.h +++ b/reactos/base/setup/usetup/bootsup.h @@ -24,8 +24,7 @@ * PROGRAMMER: Eric Kohl */ -#ifndef __BOOTSUP_H__ -#define __BOOTSUP_H__ +#pragma once NTSTATUS CreateFreeLoaderIniForDos(PWCHAR IniPath, @@ -83,6 +82,4 @@ NTSTATUS InstallFatBootcodeToFloppy(PUNICODE_STRING SourceRootPath, PUNICODE_STRING DestinationArcPath); -#endif /* __BOOTSUP_H__ */ - /* EOF */ diff --git a/reactos/base/setup/usetup/cabinet.c b/reactos/base/setup/usetup/cabinet.c index c44521a541a..0f7b0ef7a64 100644 --- a/reactos/base/setup/usetup/cabinet.c +++ b/reactos/base/setup/usetup/cabinet.c @@ -20,19 +20,19 @@ #define SEEK_END 2 #endif -typedef struct __DOSTIME +typedef struct _DOSTIME { - WORD Second:5; - WORD Minute:6; - WORD Hour:5; + WORD Second:5; + WORD Minute:6; + WORD Hour:5; } DOSTIME, *PDOSTIME; -typedef struct __DOSDATE +typedef struct _DOSDATE { - WORD Day:5; - WORD Month:4; - WORD Year:5; + WORD Day:5; + WORD Month:4; + WORD Year:5; } DOSDATE, *PDOSDATE; static WCHAR CabinetName[256]; // Filename of current cabinet @@ -57,7 +57,7 @@ static ULONG DataReserved = 0; static ULONG CodecId; static PCABINET_CODEC_UNCOMPRESS CodecUncompress = NULL; static BOOL CodecSelected = FALSE; -static ULONG LastFileOffset = 0; // Uncompressed offset of last extracted file +static ULONG LastFileOffset = 0; // Uncompressed offset of last extracted file static PCABINET_OVERWRITE OverwriteHandler = NULL; static PCABINET_EXTRACT ExtractHandler = NULL; static PCABINET_DISK_CHANGE DiskChangeHandler = NULL; @@ -66,38 +66,26 @@ static PVOID CabinetReservedArea = NULL; /* Needed by zlib, but we don't want the dependency on msvcrt.dll */ - -/* round to 16 bytes + alloc at minimum 16 bytes */ -#define ROUND_SIZE(size) (max(16, ROUND_UP(size, 16))) - -void* __cdecl malloc(size_t _size) +void *__cdecl +malloc(size_t size) { - size_t nSize = ROUND_SIZE(_size); - - if (nSize<_size) - return NULL; - - return RtlAllocateHeap(ProcessHeap, HEAP_ZERO_MEMORY, nSize); + return RtlAllocateHeap(ProcessHeap, HEAP_ZERO_MEMORY, size); } - -void __cdecl free(void* _ptr) +void __cdecl +free(void *ptr) { - RtlFreeHeap(ProcessHeap, 0, _ptr); + RtlFreeHeap(ProcessHeap, 0, ptr); } -void* __cdecl calloc(size_t _nmemb, size_t _size) +void *__cdecl +calloc(size_t nmemb, size_t size) { - return (void*)RtlAllocateHeap (ProcessHeap, HEAP_ZERO_MEMORY, _size); + return (void *)RtlAllocateHeap(ProcessHeap, HEAP_ZERO_MEMORY, nmemb * size); } /* RAW codec */ -ULONG -RawCodecUncompress(PVOID OutputBuffer, - PVOID InputBuffer, - PLONG InputLength, - PLONG OutputLength) /* * FUNCTION: Uncompresses data in a buffer * ARGUMENTS: @@ -108,21 +96,22 @@ RawCodecUncompress(PVOID OutputBuffer, * OutputLength = Length of output buffer before, amount filled after * Negative to indicate that this is not the end of the block */ +ULONG +RawCodecUncompress(PVOID OutputBuffer, + PVOID InputBuffer, + PLONG InputLength, + PLONG OutputLength) { - LONG In = abs(*InputLength), Out = abs(*OutputLength); - memcpy(OutputBuffer, InputBuffer, In < Out ? In : Out); - *InputLength = *OutputLength = In < Out ? In : Out; - return CS_SUCCESS; -} + LONG Len = min(abs(*InputLength), abs(*OutputLength)); + memcpy(OutputBuffer, InputBuffer, Len); + *InputLength = *OutputLength = Len; + + return CS_SUCCESS; +} /* MSZIP codec */ -ULONG -MSZipCodecUncompress(PVOID OutputBuffer, - PVOID InputBuffer, - PLONG InputLength, - PLONG OutputLength) /* * FUNCTION: Uncompresses data in a buffer * ARGUMENTS: @@ -133,140 +122,146 @@ MSZipCodecUncompress(PVOID OutputBuffer, * OutputLength = Length of output buffer before, amount filled after * Negative to indicate that this is not the end of the block */ +ULONG +MSZipCodecUncompress(PVOID OutputBuffer, + PVOID InputBuffer, + PLONG InputLength, + PLONG OutputLength) { - USHORT Magic; - INT Status; + USHORT Magic; + INT Status; - DPRINT("MSZipCodecUncompress( OutputBuffer = %x, InputBuffer = %x, InputLength = %d, OutputLength = %d.\n", OutputBuffer, InputBuffer, *InputLength, *OutputLength); - if( *InputLength > 0 ) - { - Magic = *((PUSHORT)InputBuffer); + DPRINT("MSZipCodecUncompress(OutputBuffer = %x, InputBuffer = %x, " + "InputLength = %d, OutputLength = %d)\n", OutputBuffer, + InputBuffer, *InputLength, *OutputLength); + if (*InputLength > 0) + { + Magic = *(PUSHORT)InputBuffer; - if (Magic != MSZIP_MAGIC) - { - DPRINT("Bad MSZIP block header magic (0x%X)\n", Magic); - return CS_BADSTREAM; - } + if (Magic != MSZIP_MAGIC) + { + DPRINT("Bad MSZIP block header magic (0x%X)\n", Magic); + return CS_BADSTREAM; + } - ZStream.next_in = ((PUCHAR)InputBuffer )+ 2; - ZStream.avail_in = *InputLength - 2; - ZStream.next_out = (PUCHAR)OutputBuffer; - ZStream.avail_out = abs(*OutputLength); + ZStream.next_in = (PUCHAR)InputBuffer + 2; + ZStream.avail_in = *InputLength - 2; + ZStream.next_out = (PUCHAR)OutputBuffer; + ZStream.avail_out = abs(*OutputLength); - /* WindowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. - */ - Status = inflateInit2(&ZStream, -MAX_WBITS); - if (Status != Z_OK) - { - DPRINT("inflateInit2() returned (%d).\n", Status); - return CS_BADSTREAM; - } - ZStream.total_in = 2; - } - else { - ZStream.avail_in = -*InputLength; - ZStream.next_in = (PUCHAR)InputBuffer; - ZStream.next_out = (PUCHAR)OutputBuffer; - ZStream.avail_out = abs(*OutputLength); - ZStream.total_in = 0; - } - ZStream.total_out = 0; - Status = inflate(&ZStream, Z_SYNC_FLUSH ); - if (Status != Z_OK && Status != Z_STREAM_END) - { - DPRINT("inflate() returned (%d) (%s).\n", Status, ZStream.msg); - if (Status == Z_MEM_ERROR) - return CS_NOMEMORY; - return CS_BADSTREAM; - } + /* WindowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. + */ + Status = inflateInit2(&ZStream, -MAX_WBITS); + if (Status != Z_OK) + { + DPRINT("inflateInit2() returned (%d)\n", Status); + return CS_BADSTREAM; + } + ZStream.total_in = 2; + } + else + { + ZStream.avail_in = -*InputLength; + ZStream.next_in = (PUCHAR)InputBuffer; + ZStream.next_out = (PUCHAR)OutputBuffer; + ZStream.avail_out = abs(*OutputLength); + ZStream.total_in = 0; + } - if( *OutputLength > 0 ) - { - Status = inflateEnd(&ZStream); - if (Status != Z_OK) - { - DPRINT("inflateEnd() returned (%d).\n", Status); - return CS_BADSTREAM; - } - } - *OutputLength = ZStream.total_out; - *InputLength = ZStream.total_in; - return CS_SUCCESS; + ZStream.total_out = 0; + Status = inflate(&ZStream, Z_SYNC_FLUSH); + if (Status != Z_OK && Status != Z_STREAM_END) + { + DPRINT("inflate() returned (%d) (%s)\n", Status, ZStream.msg); + if (Status == Z_MEM_ERROR) + return CS_NOMEMORY; + return CS_BADSTREAM; + } + + if (*OutputLength > 0) + { + Status = inflateEnd(&ZStream); + if (Status != Z_OK) + { + DPRINT("inflateEnd() returned (%d)\n", Status); + return CS_BADSTREAM; + } + } + + *OutputLength = ZStream.total_out; + *InputLength = ZStream.total_in; + + return CS_SUCCESS; } - - /* Memory functions */ -voidpf MSZipAlloc(voidpf opaque, uInt items, uInt size) +voidpf +MSZipAlloc(voidpf opaque, uInt items, uInt size) { - return (voidpf)RtlAllocateHeap (ProcessHeap, 0, items * size); + return (voidpf)RtlAllocateHeap(ProcessHeap, 0, items * size); } -void MSZipFree (voidpf opaque, voidpf address) +void +MSZipFree(voidpf opaque, voidpf address) { - RtlFreeHeap(ProcessHeap, 0, address); + RtlFreeHeap(ProcessHeap, 0, address); } static BOOL -ConvertSystemTimeToFileTime( - CONST SYSTEMTIME * lpSystemTime, - LPFILETIME lpFileTime) +ConvertSystemTimeToFileTime(CONST SYSTEMTIME *lpSystemTime, + LPFILETIME lpFileTime) { - TIME_FIELDS TimeFields; - LARGE_INTEGER liTime; + TIME_FIELDS TimeFields; + LARGE_INTEGER liTime; - TimeFields.Year = lpSystemTime->wYear; - TimeFields.Month = lpSystemTime->wMonth; - TimeFields.Day = lpSystemTime->wDay; - TimeFields.Hour = lpSystemTime->wHour; - TimeFields.Minute = lpSystemTime->wMinute; - TimeFields.Second = lpSystemTime->wSecond; - TimeFields.Milliseconds = lpSystemTime->wMilliseconds; + TimeFields.Year = lpSystemTime->wYear; + TimeFields.Month = lpSystemTime->wMonth; + TimeFields.Day = lpSystemTime->wDay; + TimeFields.Hour = lpSystemTime->wHour; + TimeFields.Minute = lpSystemTime->wMinute; + TimeFields.Second = lpSystemTime->wSecond; + TimeFields.Milliseconds = lpSystemTime->wMilliseconds; - if (RtlTimeFieldsToTime(&TimeFields, &liTime)) + if (RtlTimeFieldsToTime(&TimeFields, &liTime)) { - lpFileTime->dwLowDateTime = liTime.u.LowPart; - lpFileTime->dwHighDateTime = liTime.u.HighPart; - return TRUE; + lpFileTime->dwLowDateTime = liTime.u.LowPart; + lpFileTime->dwHighDateTime = liTime.u.HighPart; + return TRUE; } - return FALSE; -} + return FALSE; +} static BOOL -ConvertDosDateTimeToFileTime( - WORD wFatDate, - WORD wFatTime, - LPFILETIME lpFileTime) +ConvertDosDateTimeToFileTime(WORD wFatDate, + WORD wFatTime, + LPFILETIME lpFileTime) { - PDOSTIME pdtime = (PDOSTIME) &wFatTime; - PDOSDATE pddate = (PDOSDATE) &wFatDate; - SYSTEMTIME SystemTime; + PDOSTIME pdtime = (PDOSTIME)&wFatTime; + PDOSDATE pddate = (PDOSDATE)&wFatDate; + SYSTEMTIME SystemTime; - if (lpFileTime == NULL) - return FALSE; + if (lpFileTime == NULL) + return FALSE; - SystemTime.wMilliseconds = 0; - SystemTime.wSecond = pdtime->Second; - SystemTime.wMinute = pdtime->Minute; - SystemTime.wHour = pdtime->Hour; + SystemTime.wMilliseconds = 0; + SystemTime.wSecond = pdtime->Second; + SystemTime.wMinute = pdtime->Minute; + SystemTime.wHour = pdtime->Hour; - SystemTime.wDay = pddate->Day; - SystemTime.wMonth = pddate->Month; - SystemTime.wYear = 1980 + pddate->Year; + SystemTime.wDay = pddate->Day; + SystemTime.wMonth = pddate->Month; + SystemTime.wYear = 1980 + pddate->Year; - ConvertSystemTimeToFileTime(&SystemTime,lpFileTime); + ConvertSystemTimeToFileTime(&SystemTime, lpFileTime); - return TRUE; + return TRUE; } - -static PWCHAR -GetFileName(PWCHAR Path) /* * FUNCTION: Returns a pointer to file name * ARGUMENTS: @@ -274,43 +269,45 @@ GetFileName(PWCHAR Path) * RETURNS: * Pointer to filename */ +static PWCHAR +GetFileName(PWCHAR Path) { - ULONG i, j; + ULONG i, j; - j = i = 0; + j = i = 0; - while (Path [i++]) + while (Path[i++]) { - if (Path[i - 1] == L'\\') j = i; + if (Path[i - 1] == L'\\') + j = i; } - return Path + j; + + return Path + j; } - -static VOID -RemoveFileName(PWCHAR Path) /* * FUNCTION: Removes a file name from a path * ARGUMENTS: * Path = Pointer to string with path */ +static VOID +RemoveFileName(PWCHAR Path) { - PWCHAR FileName; - DWORD i; + PWCHAR FileName; + DWORD i; - i = 0; - FileName = GetFileName(Path + i); + i = 0; + FileName = GetFileName(Path + i); - if ((FileName != (Path + i)) && (FileName [-1] == L'\\')) - FileName--; - if ((FileName == (Path + i)) && (FileName [0] == L'\\')) - FileName++; - FileName[0] = 0; + if (FileName != Path + i && FileName[-1] == L'\\') + FileName--; + + if (FileName == Path + i && FileName[0] == L'\\') + FileName++; + + FileName[0] = 0; } - -static BOOL -SetAttributesOnFile(PCFFILE File, HANDLE hFile) /* * FUNCTION: Sets attributes on a file * ARGUMENTS: @@ -318,113 +315,110 @@ SetAttributesOnFile(PCFFILE File, HANDLE hFile) * RETURNS: * Status of operation */ +static BOOL +SetAttributesOnFile(PCFFILE File, + HANDLE hFile) { - FILE_BASIC_INFORMATION FileBasic; - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS NtStatus; - ULONG Attributes = 0; + FILE_BASIC_INFORMATION FileBasic; + IO_STATUS_BLOCK IoStatusBlock; + NTSTATUS NtStatus; + ULONG Attributes = 0; - if (File->Attributes & CAB_ATTRIB_READONLY) - Attributes |= FILE_ATTRIBUTE_READONLY; + if (File->Attributes & CAB_ATTRIB_READONLY) + Attributes |= FILE_ATTRIBUTE_READONLY; - if (File->Attributes & CAB_ATTRIB_HIDDEN) - Attributes |= FILE_ATTRIBUTE_HIDDEN; + if (File->Attributes & CAB_ATTRIB_HIDDEN) + Attributes |= FILE_ATTRIBUTE_HIDDEN; - if (File->Attributes & CAB_ATTRIB_SYSTEM) - Attributes |= FILE_ATTRIBUTE_SYSTEM; + if (File->Attributes & CAB_ATTRIB_SYSTEM) + Attributes |= FILE_ATTRIBUTE_SYSTEM; - if (File->Attributes & CAB_ATTRIB_DIRECTORY) - Attributes |= FILE_ATTRIBUTE_DIRECTORY; + if (File->Attributes & CAB_ATTRIB_DIRECTORY) + Attributes |= FILE_ATTRIBUTE_DIRECTORY; - if (File->Attributes & CAB_ATTRIB_ARCHIVE) - Attributes |= FILE_ATTRIBUTE_ARCHIVE; + if (File->Attributes & CAB_ATTRIB_ARCHIVE) + Attributes |= FILE_ATTRIBUTE_ARCHIVE; - NtStatus = NtQueryInformationFile(hFile, - &IoStatusBlock, - &FileBasic, - sizeof(FILE_BASIC_INFORMATION), - FileBasicInformation); - if (!NT_SUCCESS(NtStatus)) + NtStatus = NtQueryInformationFile(hFile, + &IoStatusBlock, + &FileBasic, + sizeof(FILE_BASIC_INFORMATION), + FileBasicInformation); + if (!NT_SUCCESS(NtStatus)) { - DPRINT("NtQueryInformationFile() failed (%x).\n", NtStatus); + DPRINT("NtQueryInformationFile() failed (%x)\n", NtStatus); } - else + else { - FileBasic.FileAttributes = Attributes; + FileBasic.FileAttributes = Attributes; - NtStatus = NtSetInformationFile(hFile, - &IoStatusBlock, - &FileBasic, - sizeof(FILE_BASIC_INFORMATION), - FileBasicInformation); - if (!NT_SUCCESS(NtStatus)) + NtStatus = NtSetInformationFile(hFile, + &IoStatusBlock, + &FileBasic, + sizeof(FILE_BASIC_INFORMATION), + FileBasicInformation); + if (!NT_SUCCESS(NtStatus)) { - DPRINT("NtSetInformationFile() failed (%x).\n", NtStatus); + DPRINT("NtSetInformationFile() failed (%x)\n", NtStatus); } } - return NT_SUCCESS(NtStatus); + return NT_SUCCESS(NtStatus); } -static ULONG -CloseCabinet(VOID) /* * FUNCTION: Closes the current cabinet * RETURNS: * Status of operation */ +static ULONG +CloseCabinet(VOID) { - if (FileBuffer) + if (FileBuffer) { - NtUnmapViewOfSection( NtCurrentProcess(), FileBuffer ); - NtClose( FileSectionHandle ); - NtClose( FileHandle ); - FileBuffer = NULL; + NtUnmapViewOfSection(NtCurrentProcess(), FileBuffer); + NtClose(FileSectionHandle); + NtClose(FileHandle); + FileBuffer = NULL; } - return 0; + return 0; } - -VOID -CabinetInitialize(VOID) /* * FUNCTION: Initialize archiver */ +VOID +CabinetInitialize(VOID) { - ZStream.zalloc = MSZipAlloc; - ZStream.zfree = MSZipFree; - ZStream.opaque = (voidpf)0; + ZStream.zalloc = MSZipAlloc; + ZStream.zfree = MSZipFree; + ZStream.opaque = (voidpf)0; - FileOpen = FALSE; - wcscpy(DestPath, L""); + FileOpen = FALSE; + wcscpy(DestPath, L""); - CodecId = CAB_CODEC_RAW; - CodecSelected = TRUE; + CodecId = CAB_CODEC_RAW; + CodecSelected = TRUE; - FolderUncompSize = 0; - BytesLeftInBlock = 0; - CabinetReserved = 0; - FolderReserved = 0; - DataReserved = 0; - CabinetReservedArea = NULL; - LastFileOffset = 0; + FolderUncompSize = 0; + BytesLeftInBlock = 0; + CabinetReserved = 0; + FolderReserved = 0; + DataReserved = 0; + CabinetReservedArea = NULL; + LastFileOffset = 0; } - -VOID -CabinetCleanup(VOID) /* * FUNCTION: Cleanup archiver */ +VOID +CabinetCleanup(VOID) { - CabinetClose(); + CabinetClose(); } - -BOOL -CabinetNormalizePath(PWCHAR Path, - ULONG Length) /* * FUNCTION: Normalizes a path * ARGUMENTS: @@ -433,254 +427,256 @@ CabinetNormalizePath(PWCHAR Path, * RETURNS: * TRUE if there was enough room in Path, or FALSE */ +BOOL +CabinetNormalizePath(PWCHAR Path, + ULONG Length) { - ULONG n; - BOOL OK = TRUE; + ULONG n; + BOOL Ok; - if ((n = wcslen(Path)) && - (Path[n - 1] != L'\\') && - (OK = ((n + 1) < Length))) + n = wcslen(Path); + Ok = (n + 1) < Length; + + if (n != 0 && Path[n - 1] != L'\\' && Ok) { - Path[n] = L'\\'; - Path[n + 1] = 0; + Path[n] = L'\\'; + Path[n + 1] = 0; } - return OK; + + return Ok; } - -PWCHAR -CabinetGetCabinetName() /* * FUNCTION: Returns pointer to cabinet file name * RETURNS: * Pointer to string with name of cabinet */ +PWCHAR +CabinetGetCabinetName(VOID) { - return CabinetName; + return CabinetName; } - -VOID -CabinetSetCabinetName(PWCHAR FileName) /* * FUNCTION: Sets cabinet file name * ARGUMENTS: * FileName = Pointer to string with name of cabinet */ +VOID +CabinetSetCabinetName(PWCHAR FileName) { - wcscpy(CabinetName, FileName); + wcscpy(CabinetName, FileName); } - -VOID -CabinetSetDestinationPath(PWCHAR DestinationPath) /* * FUNCTION: Sets destination path * ARGUMENTS: * DestinationPath = Pointer to string with name of destination path */ +VOID +CabinetSetDestinationPath(PWCHAR DestinationPath) { - wcscpy(DestPath, DestinationPath); - if (wcslen(DestPath) > 0) - CabinetNormalizePath(DestPath, MAX_PATH); + wcscpy(DestPath, DestinationPath); + + if (wcslen(DestPath) > 0) + CabinetNormalizePath(DestPath, MAX_PATH); } - -PWCHAR -CabinetGetDestinationPath() /* * FUNCTION: Returns destination path * RETURNS: * Pointer to string with name of destination path */ +PWCHAR +CabinetGetDestinationPath(VOID) { - return DestPath; + return DestPath; } - -ULONG -CabinetOpen(VOID) /* * FUNCTION: Opens a cabinet file * RETURNS: * Status of operation */ +ULONG +CabinetOpen(VOID) { - PUCHAR Buffer; - UNICODE_STRING ustring; - ANSI_STRING astring; + PUCHAR Buffer; + UNICODE_STRING ustring; + ANSI_STRING astring; - if (!FileOpen) + if (!FileOpen) { - OBJECT_ATTRIBUTES ObjectAttributes; - IO_STATUS_BLOCK IoStatusBlock; - UNICODE_STRING FileName; - NTSTATUS NtStatus; - ULONG Size; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + UNICODE_STRING FileName; + NTSTATUS NtStatus; + ULONG Size; - RtlInitUnicodeString(&FileName, - CabinetName); + RtlInitUnicodeString(&FileName, CabinetName); - InitializeObjectAttributes(&ObjectAttributes, - &FileName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); + InitializeObjectAttributes(&ObjectAttributes, + &FileName, + OBJ_CASE_INSENSITIVE, + NULL, NULL); - NtStatus = NtOpenFile(&FileHandle, - GENERIC_READ | SYNCHRONIZE, - &ObjectAttributes, - &IoStatusBlock, - FILE_SHARE_READ, - FILE_SYNCHRONOUS_IO_NONALERT); - if (!NT_SUCCESS(NtStatus)) + NtStatus = NtOpenFile(&FileHandle, + GENERIC_READ | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ, + FILE_SYNCHRONOUS_IO_NONALERT); + + if (!NT_SUCCESS(NtStatus)) { - DPRINT("Cannot open file (%S) (%x).\n", CabinetName, NtStatus); - return CAB_STATUS_CANNOT_OPEN; + DPRINT("Cannot open file (%S) (%x)\n", CabinetName, NtStatus); + return CAB_STATUS_CANNOT_OPEN; } - FileOpen = TRUE; - NtStatus = NtCreateSection(&FileSectionHandle, - SECTION_ALL_ACCESS, - 0, - 0, - PAGE_READONLY, - SEC_COMMIT, - FileHandle); - if(!NT_SUCCESS(NtStatus)) - { - DPRINT("NtCreateSection failed: %x\n", NtStatus); - return CAB_STATUS_NOMEMORY; - } - FileBuffer = 0; - FileSize = 0; - NtStatus = NtMapViewOfSection(FileSectionHandle, - NtCurrentProcess(), - (PVOID *)&FileBuffer, - 0, - 0, - 0, - &FileSize, - ViewUnmap, - 0, - PAGE_READONLY); - if(!NT_SUCCESS(NtStatus)) - { - DPRINT("NtMapViewOfSection failed: %x\n", NtStatus); - return CAB_STATUS_NOMEMORY; - } - DPRINT( "Cabinet file %S opened and mapped to %x\n", CabinetName, FileBuffer ); - PCABHeader = (PCFHEADER)FileBuffer; + FileOpen = TRUE; - /* Check header */ - if(FileSize <= sizeof(CFHEADER) || - PCABHeader->Signature != CAB_SIGNATURE || - PCABHeader->Version != CAB_VERSION || - PCABHeader->FolderCount == 0 || - PCABHeader->FileCount == 0 || - PCABHeader->FileTableOffset < sizeof(CFHEADER)) - { - CloseCabinet(); - DPRINT("File has invalid header.\n"); - return CAB_STATUS_INVALID_CAB; - } + NtStatus = NtCreateSection(&FileSectionHandle, + SECTION_ALL_ACCESS, + 0, 0, + PAGE_READONLY, + SEC_COMMIT, + FileHandle); - Size = 0; - Buffer = (PUCHAR)(PCABHeader+1); - /* Read/skip any reserved bytes */ - if (PCABHeader->Flags & CAB_FLAG_RESERVE) + if (!NT_SUCCESS(NtStatus)) { - CabinetReserved = *(PUSHORT)Buffer; - Buffer += 2; - FolderReserved = *Buffer; - Buffer++; - DataReserved = *Buffer; - Buffer++; - if (CabinetReserved > 0) + DPRINT("NtCreateSection failed: %x\n", NtStatus); + return CAB_STATUS_NOMEMORY; + } + + FileBuffer = 0; + FileSize = 0; + + NtStatus = NtMapViewOfSection(FileSectionHandle, + NtCurrentProcess(), + (PVOID *)&FileBuffer, + 0, 0, 0, + &FileSize, + ViewUnmap, + 0, + PAGE_READONLY); + + if (!NT_SUCCESS(NtStatus)) + { + DPRINT("NtMapViewOfSection failed: %x\n", NtStatus); + return CAB_STATUS_NOMEMORY; + } + + DPRINT("Cabinet file %S opened and mapped to %x\n", CabinetName, FileBuffer); + PCABHeader = (PCFHEADER) FileBuffer; + + /* Check header */ + if (FileSize <= sizeof(CFHEADER) || + PCABHeader->Signature != CAB_SIGNATURE || + PCABHeader->Version != CAB_VERSION || + PCABHeader->FolderCount == 0 || + PCABHeader->FileCount == 0 || + PCABHeader->FileTableOffset < sizeof(CFHEADER)) + { + CloseCabinet(); + DPRINT("File has invalid header\n"); + return CAB_STATUS_INVALID_CAB; + } + + Size = 0; + Buffer = (PUCHAR)(PCABHeader + 1); + + /* Read/skip any reserved bytes */ + if (PCABHeader->Flags & CAB_FLAG_RESERVE) + { + CabinetReserved = *(PUSHORT)Buffer; + Buffer += 2; + FolderReserved = *Buffer; + Buffer++; + DataReserved = *Buffer; + Buffer++; + + if (CabinetReserved > 0) { - CabinetReservedArea = Buffer; - Buffer += CabinetReserved; + CabinetReservedArea = Buffer; + Buffer += CabinetReserved; } } - if (PCABHeader->Flags & CAB_FLAG_HASPREV) + if (PCABHeader->Flags & CAB_FLAG_HASPREV) { - /* The previous cabinet file is in the same directory as the current */ - wcscpy(CabinetPrev, CabinetName); - RemoveFileName(CabinetPrev); - CabinetNormalizePath(CabinetPrev, 256); - RtlInitAnsiString( &astring, (LPSTR)Buffer ); - ustring.Length = wcslen( CabinetPrev ); - ustring.Buffer = CabinetPrev + ustring.Length; - ustring.MaximumLength = sizeof( CabinetPrev ) - ustring.Length; - RtlAnsiStringToUnicodeString( &ustring, &astring, FALSE ); - Buffer += astring.Length + 1; + /* The previous cabinet file is in + the same directory as the current */ + wcscpy(CabinetPrev, CabinetName); + RemoveFileName(CabinetPrev); + CabinetNormalizePath(CabinetPrev, 256); + RtlInitAnsiString(&astring, (LPSTR)Buffer); + ustring.Length = wcslen(CabinetPrev); + ustring.Buffer = CabinetPrev + ustring.Length; + ustring.MaximumLength = sizeof(CabinetPrev) - ustring.Length; + RtlAnsiStringToUnicodeString(&ustring, &astring, FALSE); + Buffer += astring.Length + 1; - /* Read label of prev disk */ - RtlInitAnsiString( &astring, (LPSTR)Buffer ); - ustring.Length = 0; - ustring.Buffer = DiskPrev; - ustring.MaximumLength = sizeof( DiskPrev ); - RtlAnsiStringToUnicodeString( &ustring, &astring, FALSE ); - Buffer += astring.Length + 1; + /* Read label of prev disk */ + RtlInitAnsiString(&astring, (LPSTR)Buffer); + ustring.Length = 0; + ustring.Buffer = DiskPrev; + ustring.MaximumLength = sizeof(DiskPrev); + RtlAnsiStringToUnicodeString(&ustring, &astring, FALSE); + Buffer += astring.Length + 1; } - else + else { - wcscpy(CabinetPrev, L""); - wcscpy(DiskPrev, L""); + wcscpy(CabinetPrev, L""); + wcscpy(DiskPrev, L""); } - if (PCABHeader->Flags & CAB_FLAG_HASNEXT) + if (PCABHeader->Flags & CAB_FLAG_HASNEXT) { - /* The next cabinet file is in the same directory as the previous */ - wcscpy(CabinetNext, CabinetName); - RemoveFileName(CabinetNext); - CabinetNormalizePath(CabinetNext, 256); - RtlInitAnsiString( &astring, (LPSTR)Buffer ); - ustring.Length = wcslen( CabinetNext ); - ustring.Buffer = CabinetNext + ustring.Length; - ustring.MaximumLength = sizeof( CabinetNext ) - ustring.Length; - RtlAnsiStringToUnicodeString( &ustring, &astring, FALSE ); - Buffer += astring.Length + 1; + /* The next cabinet file is in + the same directory as the previous */ + wcscpy(CabinetNext, CabinetName); + RemoveFileName(CabinetNext); + CabinetNormalizePath(CabinetNext, 256); + RtlInitAnsiString(&astring, (LPSTR)Buffer); + ustring.Length = wcslen(CabinetNext); + ustring.Buffer = CabinetNext + ustring.Length; + ustring.MaximumLength = sizeof(CabinetNext) - ustring.Length; + RtlAnsiStringToUnicodeString(&ustring, &astring, FALSE); + Buffer += astring.Length + 1; - /* Read label of next disk */ - RtlInitAnsiString( &astring, (LPSTR)Buffer ); - ustring.Length = 0; - ustring.Buffer = DiskNext; - ustring.MaximumLength = sizeof( DiskNext ); - RtlAnsiStringToUnicodeString( &ustring, &astring, FALSE ); - Buffer += astring.Length + 1; + /* Read label of next disk */ + RtlInitAnsiString(&astring, (LPSTR)Buffer); + ustring.Length = 0; + ustring.Buffer = DiskNext; + ustring.MaximumLength = sizeof(DiskNext); + RtlAnsiStringToUnicodeString(&ustring, &astring, FALSE); + Buffer += astring.Length + 1; } - else + else { - wcscpy(CabinetNext, L""); - wcscpy(DiskNext, L""); + wcscpy(CabinetNext, L""); + wcscpy(DiskNext, L""); } - CabinetFolders = (PCFFOLDER)Buffer; + CabinetFolders = (PCFFOLDER)Buffer; } - DPRINT( "CabinetOpen returning SUCCESS\n" ); - return CAB_STATUS_SUCCESS; + + DPRINT("CabinetOpen returning SUCCESS\n"); + return CAB_STATUS_SUCCESS; } - -VOID -CabinetClose(VOID) /* * FUNCTION: Closes the cabinet file */ +VOID +CabinetClose(VOID) { - if (FileOpen) + if (FileOpen) { - CloseCabinet(); - - FileOpen = FALSE; + CloseCabinet(); + FileOpen = FALSE; } } - -ULONG -CabinetFindFirst(PWCHAR FileName, - PCAB_SEARCH Search) /* * FUNCTION: Finds the first file in the cabinet that matches a search criteria * ARGUMENTS: @@ -689,17 +685,17 @@ CabinetFindFirst(PWCHAR FileName, * RETURNS: * Status of operation */ +ULONG +CabinetFindFirst(PWCHAR FileName, + PCAB_SEARCH Search) { - DPRINT( "CabinetFindFirst( FileName = %S )\n", FileName ); - wcsncpy(Search->Search, FileName, MAX_PATH); - wcsncpy(Search->Cabinet, CabinetName, MAX_PATH); - Search->File = 0; - return CabinetFindNext(Search); + DPRINT("CabinetFindFirst( FileName = %S )\n", FileName); + wcsncpy(Search->Search, FileName, MAX_PATH); + wcsncpy(Search->Cabinet, CabinetName, MAX_PATH); + Search->File = 0; + return CabinetFindNext(Search); } - -ULONG -CabinetFindNext(PCAB_SEARCH Search) /* * FUNCTION: Finds next file in the cabinet that matches a search criteria * ARGUMENTS: @@ -707,99 +703,116 @@ CabinetFindNext(PCAB_SEARCH Search) * RETURNS: * Status of operation */ +ULONG +CabinetFindNext(PCAB_SEARCH Search) { - ULONG Status; - PCFFILE Prev; - ANSI_STRING AnsiString; - UNICODE_STRING UnicodeString; - WCHAR FileName[MAX_PATH] = {L'\0'}; + ULONG Status; + PCFFILE Prev; + ANSI_STRING AnsiString; + UNICODE_STRING UnicodeString; + WCHAR FileName[MAX_PATH]; - if( wcscmp( Search->Cabinet, CabinetName ) != 0 ) - Search->File = 0; // restart search of cabinet has changed since last find - if( !Search->File ) - { - // starting new search or cabinet - Search->File = (PCFFILE)(FileBuffer + PCABHeader->FileTableOffset); - Search->Index = 0; - Prev = 0; - } - else Prev = Search->File; - while(1) - { - // look at each file in the archive and see if we found a match - if( Search->File->FolderIndex == 0xFFFD || Search->File->FolderIndex == 0xFFFF ) - { - // skip files continued from previous cab - DPRINT("Skipping file (%s) FileOffset (0x%X) LastFileOffset (0x%X).\n", - (char *)(Search->File + 1), Search->File->FileOffset, LastFileOffset); - } - else { - // FIXME: check for match against search criteria - if( Search->File != Prev ) - { - // don't match the file we started with - if( wcscmp( Search->Search, L"*" ) == 0 ) - { - // take any file - break; - } - else { - // otherwise, try to match the exact file name - RtlInitAnsiString( &AnsiString, Search->File->FileName ); - UnicodeString.Buffer = FileName; - UnicodeString.Length = 0; - UnicodeString.MaximumLength = sizeof( FileName ); - RtlAnsiStringToUnicodeString( &UnicodeString, &AnsiString, FALSE ); - if( wcscmp( Search->Search, UnicodeString.Buffer ) == 0 ) - break; - } - } - } - // if we make it here we found no match, so move to the next file - Search->Index++; - if( Search->Index >= PCABHeader->FileCount ) - { - // we have reached the end of this cabinet, try to open the next - DPRINT( "End of cabinet reached\n" ); - if (wcslen(DiskNext) > 0) - { - CloseCabinet(); + if (wcscmp(Search->Cabinet, CabinetName) != 0) + { + /* restart search of cabinet has changed since last find */ + Search->File = 0; + } - CabinetSetCabinetName(CabinetNext); - wcscpy( Search->Cabinet, CabinetName ); + if (!Search->File) + { + /* starting new search or cabinet */ + Search->File = (PCFFILE)(FileBuffer + PCABHeader->FileTableOffset); + Search->Index = 0; + Prev = 0; + } + else + Prev = Search->File; - if (DiskChangeHandler != NULL) - { - DiskChangeHandler(CabinetNext, DiskNext); - } + while (TRUE) + { + /* look at each file in the archive and see if we found a match */ + if (Search->File->FolderIndex == 0xFFFD || + Search->File->FolderIndex == 0xFFFF) + { + /* skip files continued from previous cab */ + DPRINT("Skipping file (%s): FileOffset (0x%X), " + "LastFileOffset (0x%X)\n", (char *)(Search->File + 1), + Search->File->FileOffset, LastFileOffset); + } + else + { + // FIXME: check for match against search criteria + if (Search->File != Prev) + { + /* don't match the file we started with */ + if (wcscmp(Search->Search, L"*") == 0) + { + /* take any file */ + break; + } + else + { + /* otherwise, try to match the exact file name */ + RtlInitAnsiString(&AnsiString, Search->File->FileName); + UnicodeString.Buffer = FileName; + UnicodeString.Buffer[0] = 0; + UnicodeString.Length = 0; + UnicodeString.MaximumLength = sizeof(FileName); + RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, FALSE); + if (wcscmp(Search->Search, UnicodeString.Buffer) == 0) + break; + } + } + } - Status = CabinetOpen(); - if (Status != CAB_STATUS_SUCCESS) - return Status; + /* if we make it here we found no match, so move to the next file */ + Search->Index++; + if (Search->Index >= PCABHeader->FileCount) + { + /* we have reached the end of this cabinet, try to open the next */ + DPRINT("End of cabinet reached\n"); + if (wcslen(DiskNext) > 0) + { + CloseCabinet(); - } - else - { - return CAB_STATUS_NOFILE; - } - // starting new search or cabinet - Search->File = (PCFFILE)(FileBuffer + PCABHeader->FileTableOffset); - Search->Index = 0; - Prev = 0; - } - else Search->File = (PCFFILE)(strchr( (char *)(Search->File + 1), 0 ) + 1); - } - DPRINT( "Found file %s\n", Search->File->FileName ); - return CAB_STATUS_SUCCESS; + CabinetSetCabinetName(CabinetNext); + wcscpy(Search->Cabinet, CabinetName); + + if (DiskChangeHandler != NULL) + { + DiskChangeHandler(CabinetNext, DiskNext); + } + + Status = CabinetOpen(); + if (Status != CAB_STATUS_SUCCESS) + return Status; + } + else + { + return CAB_STATUS_NOFILE; + } + + /* starting new search or cabinet */ + Search->File = (PCFFILE)(FileBuffer + PCABHeader->FileTableOffset); + Search->Index = 0; + Prev = 0; + } + else + Search->File = (PCFFILE)(strchr((char *)(Search->File + 1), 0) + 1); + } + + DPRINT("Found file %s\n", Search->File->FileName); + return CAB_STATUS_SUCCESS; } - -int Validate() +#if 0 +int +Validate() { - return (int)RtlValidateHeap(ProcessHeap, 0, 0); + return (int)RtlValidateHeap(ProcessHeap, 0, 0); } +#endif -ULONG CabinetExtractFile( PCAB_SEARCH Search ) /* * FUNCTION: Extracts a file from the cabinet * ARGUMENTS: @@ -807,309 +820,339 @@ ULONG CabinetExtractFile( PCAB_SEARCH Search ) * RETURNS * Status of operation */ +ULONG +CabinetExtractFile(PCAB_SEARCH Search) { - ULONG Size; // remaining file bytes to decompress - ULONG CurrentOffset; // current uncompressed offset within the folder - PUCHAR CurrentBuffer; // current pointer to compressed data in the block - LONG RemainingBlock; // remaining comp data in the block - HANDLE DestFile; - HANDLE DestFileSection; - PVOID DestFileBuffer; // mapped view of dest file - PVOID CurrentDestBuffer; // pointer to the current position in the dest view - PCFDATA CFData; // current data block - ULONG Status; - FILETIME FileTime; - WCHAR DestName[MAX_PATH]; - NTSTATUS NtStatus; - UNICODE_STRING UnicodeString; - ANSI_STRING AnsiString; - IO_STATUS_BLOCK IoStatusBlock; - OBJECT_ATTRIBUTES ObjectAttributes; - FILE_BASIC_INFORMATION FileBasic; - PCFFOLDER CurrentFolder; - LARGE_INTEGER MaxDestFileSize; - LONG InputLength, OutputLength; - char Junk[512]; + ULONG Size; // remaining file bytes to decompress + ULONG CurrentOffset; // current uncompressed offset within the folder + PUCHAR CurrentBuffer; // current pointer to compressed data in the block + LONG RemainingBlock; // remaining comp data in the block + HANDLE DestFile; + HANDLE DestFileSection; + PVOID DestFileBuffer; // mapped view of dest file + PVOID CurrentDestBuffer; // pointer to the current position in the dest view + PCFDATA CFData; // current data block + ULONG Status; + FILETIME FileTime; + WCHAR DestName[MAX_PATH]; + NTSTATUS NtStatus; + UNICODE_STRING UnicodeString; + ANSI_STRING AnsiString; + IO_STATUS_BLOCK IoStatusBlock; + OBJECT_ATTRIBUTES ObjectAttributes; + FILE_BASIC_INFORMATION FileBasic; + PCFFOLDER CurrentFolder; + LARGE_INTEGER MaxDestFileSize; + LONG InputLength, OutputLength; + char Junk[512]; - if( wcscmp( Search->Cabinet, CabinetName ) != 0 ) - { - // the file is not in the current cabinet - DPRINT( "File is not in this cabinet ( %S != %S )\n", Search->Cabinet, CabinetName ); - return CAB_STATUS_NOFILE; - } - // look up the folder that the file specifies - if( Search->File->FolderIndex == 0xFFFD || Search->File->FolderIndex == 0xFFFF ) - { - // folder is continued from previous cabinet, that shouldn't happen here - return CAB_STATUS_NOFILE; - } - else if( Search->File->FolderIndex == 0xFFFE ) - { - // folder is the last in this cabinet and continues into next - CurrentFolder = &CabinetFolders[PCABHeader->FolderCount-1]; - } - else { - // folder is completely contained within this cabinet - CurrentFolder = &CabinetFolders[Search->File->FolderIndex]; - } - switch (CurrentFolder->CompressionType & CAB_COMP_MASK) + if (wcscmp(Search->Cabinet, CabinetName) != 0) { - case CAB_COMP_NONE: - CabinetSelectCodec(CAB_CODEC_RAW); - break; - case CAB_COMP_MSZIP: - CabinetSelectCodec(CAB_CODEC_MSZIP); - break; - default: - return CAB_STATUS_UNSUPPCOMP; + /* the file is not in the current cabinet */ + DPRINT("File is not in this cabinet (%S != %S)\n", + Search->Cabinet, CabinetName); + return CAB_STATUS_NOFILE; } - DPRINT("Extracting file at uncompressed offset (0x%X) Size (%d bytes)).\n", - (UINT)Search->File->FileOffset, - (UINT)Search->File->FileSize); - RtlInitAnsiString( &AnsiString, Search->File->FileName ); - wcscpy( DestName, DestPath ); - UnicodeString.MaximumLength = sizeof( DestName ) - wcslen( DestName ); - UnicodeString.Buffer = DestName + wcslen( DestName ); - UnicodeString.Length = 0; - RtlAnsiStringToUnicodeString( &UnicodeString, &AnsiString, FALSE ); - - /* Create destination file, fail if it already exists */ - RtlInitUnicodeString(&UnicodeString, - DestName); - - - InitializeObjectAttributes(&ObjectAttributes, - &UnicodeString, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - - NtStatus = NtCreateFile(&DestFile, - GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, - &ObjectAttributes, - &IoStatusBlock, - NULL, - FILE_ATTRIBUTE_NORMAL, - 0, - FILE_CREATE, - FILE_SYNCHRONOUS_IO_NONALERT, - NULL, - 0); - if (!NT_SUCCESS(NtStatus)) + /* look up the folder that the file specifies */ + if (Search->File->FolderIndex == 0xFFFD || + Search->File->FolderIndex == 0xFFFF) { - DPRINT("NtCreateFile() failed (%S) (%x).\n", DestName, NtStatus); + /* folder is continued from previous cabinet, + that shouldn't happen here */ + return CAB_STATUS_NOFILE; + } + else if (Search->File->FolderIndex == 0xFFFE) + { + /* folder is the last in this cabinet and continues into next */ + CurrentFolder = &CabinetFolders[PCABHeader->FolderCount - 1]; + } + else + { + /* folder is completely contained within this cabinet */ + CurrentFolder = &CabinetFolders[Search->File->FolderIndex]; + } - /* If file exists, ask to overwrite file */ - if (OverwriteHandler == NULL || OverwriteHandler(Search->File, DestName)) + switch (CurrentFolder->CompressionType & CAB_COMP_MASK) + { + case CAB_COMP_NONE: + CabinetSelectCodec(CAB_CODEC_RAW); + break; + case CAB_COMP_MSZIP: + CabinetSelectCodec(CAB_CODEC_MSZIP); + break; + default: + return CAB_STATUS_UNSUPPCOMP; + } + + DPRINT("Extracting file at uncompressed offset (0x%X) Size (%d bytes)\n", + (UINT)Search->File->FileOffset, (UINT)Search->File->FileSize); + + RtlInitAnsiString(&AnsiString, Search->File->FileName); + wcscpy(DestName, DestPath); + UnicodeString.MaximumLength = sizeof(DestName) - wcslen(DestName); + UnicodeString.Buffer = DestName + wcslen(DestName); + UnicodeString.Length = 0; + RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, FALSE); + + /* Create destination file, fail if it already exists */ + RtlInitUnicodeString(&UnicodeString, DestName); + + InitializeObjectAttributes(&ObjectAttributes, + &UnicodeString, + OBJ_CASE_INSENSITIVE, + NULL, NULL); + + NtStatus = NtCreateFile(&DestFile, + GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + NULL, + FILE_ATTRIBUTE_NORMAL, + 0, + FILE_CREATE, + FILE_SYNCHRONOUS_IO_NONALERT, + NULL, 0); + + if (!NT_SUCCESS(NtStatus)) + { + DPRINT("NtCreateFile() failed (%S) (%x)\n", DestName, NtStatus); + + /* If file exists, ask to overwrite file */ + if (OverwriteHandler == NULL || OverwriteHandler(Search->File, DestName)) { - /* Create destination file, overwrite if it already exists */ - NtStatus = NtCreateFile(&DestFile, - GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, - &ObjectAttributes, - &IoStatusBlock, - NULL, - FILE_ATTRIBUTE_NORMAL, - 0, - FILE_OVERWRITE, - FILE_SYNCHRONOUS_IO_ALERT, - NULL, - 0); - if (!NT_SUCCESS(NtStatus)) + /* Create destination file, overwrite if it already exists */ + NtStatus = NtCreateFile(&DestFile, + GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + NULL, + FILE_ATTRIBUTE_NORMAL, + 0, + FILE_OVERWRITE, + FILE_SYNCHRONOUS_IO_ALERT, + NULL, 0); + + if (!NT_SUCCESS(NtStatus)) { - DPRINT("NtCreateFile() failed 2 (%S) (%x).\n", DestName, NtStatus); - return CAB_STATUS_CANNOT_CREATE; + DPRINT("NtCreateFile() failed (%S) (%x)\n", DestName, NtStatus); + return CAB_STATUS_CANNOT_CREATE; } } - else + else { - DPRINT("File (%S) exists.\n", DestName); - return CAB_STATUS_FILE_EXISTS; - } - } - MaxDestFileSize.QuadPart = Search->File->FileSize; - NtStatus = NtCreateSection(&DestFileSection, - SECTION_ALL_ACCESS, - 0, - &MaxDestFileSize, - PAGE_READWRITE, - SEC_COMMIT, - DestFile); - if(!NT_SUCCESS(NtStatus)) - { - DPRINT("NtCreateSection failed: %x\n", NtStatus); - Status = CAB_STATUS_NOMEMORY; - goto CloseDestFile; - } - DestFileBuffer = 0; - DestFileSize = 0; - NtStatus = NtMapViewOfSection(DestFileSection, - NtCurrentProcess(), - &DestFileBuffer, - 0, - 0, - 0, - &DestFileSize, - ViewUnmap, - 0, - PAGE_READWRITE); - if(!NT_SUCCESS(NtStatus)) - { - DPRINT("NtMapViewOfSection failed: %x\n", NtStatus); - Status = CAB_STATUS_NOMEMORY; - goto CloseDestFileSection; - } - CurrentDestBuffer = DestFileBuffer; - if (!ConvertDosDateTimeToFileTime(Search->File->FileDate, Search->File->FileTime, &FileTime)) - { - DPRINT("DosDateTimeToFileTime() failed.\n"); - Status = CAB_STATUS_CANNOT_WRITE; - goto UnmapDestFile; - } - - NtStatus = NtQueryInformationFile(DestFile, - &IoStatusBlock, - &FileBasic, - sizeof(FILE_BASIC_INFORMATION), - FileBasicInformation); - if (!NT_SUCCESS(NtStatus)) - { - DPRINT("NtQueryInformationFile() failed (%x).\n", NtStatus); - } - else - { - memcpy(&FileBasic.LastAccessTime, &FileTime, sizeof(FILETIME)); - - NtStatus = NtSetInformationFile(DestFile, - &IoStatusBlock, - &FileBasic, - sizeof(FILE_BASIC_INFORMATION), - FileBasicInformation); - if (!NT_SUCCESS(NtStatus)) - { - DPRINT("NtSetInformationFile() failed (%x).\n", NtStatus); + DPRINT("File (%S) exists\n", DestName); + return CAB_STATUS_FILE_EXISTS; } } - SetAttributesOnFile(Search->File, DestFile); + MaxDestFileSize.QuadPart = Search->File->FileSize; + NtStatus = NtCreateSection(&DestFileSection, + SECTION_ALL_ACCESS, + 0, + &MaxDestFileSize, + PAGE_READWRITE, + SEC_COMMIT, + DestFile); - /* Call extract event handler */ - if (ExtractHandler != NULL) + if (!NT_SUCCESS(NtStatus)) { - ExtractHandler(Search->File, DestName); + DPRINT("NtCreateSection failed: %x\n", NtStatus); + Status = CAB_STATUS_NOMEMORY; + goto CloseDestFile; } - // find the starting block of the file - // start with the first data block of the folder - CFData = (PCFDATA)(CabinetFolders[Search->File->FolderIndex].DataOffset + FileBuffer); - CurrentOffset = 0; - while( CurrentOffset + CFData->UncompSize <= Search->File->FileOffset ) - { - // walk the data blocks until we reach the one containing the start of the file - CurrentOffset += CFData->UncompSize; - CFData = (PCFDATA)((char *)(CFData+1) + DataReserved + CFData->CompSize); - } - // now decompress and discard any data in the block before the start of the file - CurrentBuffer = ((unsigned char *)(CFData+1)) + DataReserved; // start of comp data - RemainingBlock = CFData->CompSize; - InputLength = RemainingBlock; - while( CurrentOffset < Search->File->FileOffset ) - { - // compute remaining uncomp bytes to start of file, bounded by sizeof junk - OutputLength = Search->File->FileOffset - CurrentOffset; - if( OutputLength > (LONG)sizeof( Junk ) ) - OutputLength = sizeof( Junk ); - OutputLength = -OutputLength; // negate to signal NOT end of block - CodecUncompress( Junk, - CurrentBuffer, - &InputLength, - &OutputLength ); - CurrentOffset += OutputLength; // add the uncomp bytes extracted to current folder offset - CurrentBuffer += InputLength; // add comp bytes consumed to CurrentBuffer - RemainingBlock -= InputLength; // subtract bytes consumed from bytes remaining in block - InputLength = -RemainingBlock; // neg for resume decompression of the same block - } - // now CurrentBuffer points to the first comp byte of the file, so we can begin decompressing - Size = Search->File->FileSize; // Size = remaining uncomp bytes of the file to decompress - while(Size > 0) + DestFileBuffer = 0; + DestFileSize = 0; + NtStatus = NtMapViewOfSection(DestFileSection, + NtCurrentProcess(), + &DestFileBuffer, + 0, 0, 0, + &DestFileSize, + ViewUnmap, + 0, + PAGE_READWRITE); + + if (!NT_SUCCESS(NtStatus)) { - OutputLength = Size; - DPRINT( "Decompressing block at %x with RemainingBlock = %d, Size = %d\n", CurrentBuffer, RemainingBlock, Size ); - Status = CodecUncompress(CurrentDestBuffer, - CurrentBuffer, - &InputLength, - &OutputLength); - if (Status != CS_SUCCESS) - { - DPRINT("Cannot uncompress block.\n"); - if(Status == CS_NOMEMORY) - Status = CAB_STATUS_NOMEMORY; - Status = CAB_STATUS_INVALID_CAB; - goto UnmapDestFile; - } - CurrentDestBuffer = (PVOID)((ULONG_PTR)CurrentDestBuffer + OutputLength); // advance dest buffer by bytes produced - CurrentBuffer += InputLength; // advance src buffer by bytes consumed - Size -= OutputLength; // reduce remaining file bytes by bytes produced - RemainingBlock -= InputLength; // reduce remaining block size by bytes consumed - if( RemainingBlock == 0 ) - { - // used up this block, move on to the next - DPRINT( "Out of block data\n" ); - CFData = (PCFDATA)CurrentBuffer; - RemainingBlock = CFData->CompSize; - CurrentBuffer = ((unsigned char *)(CFData+1) + DataReserved); - InputLength = RemainingBlock; - } - } - Status = CAB_STATUS_SUCCESS; - UnmapDestFile: - NtUnmapViewOfSection(NtCurrentProcess(), DestFileBuffer); - CloseDestFileSection: - NtClose(DestFileSection); - CloseDestFile: - NtClose(DestFile); + DPRINT("NtMapViewOfSection failed: %x\n", NtStatus); + Status = CAB_STATUS_NOMEMORY; + goto CloseDestFileSection; + } - return Status; + CurrentDestBuffer = DestFileBuffer; + if (!ConvertDosDateTimeToFileTime(Search->File->FileDate, + Search->File->FileTime, + &FileTime)) + { + DPRINT("DosDateTimeToFileTime() failed\n"); + Status = CAB_STATUS_CANNOT_WRITE; + goto UnmapDestFile; + } + + NtStatus = NtQueryInformationFile(DestFile, + &IoStatusBlock, + &FileBasic, + sizeof(FILE_BASIC_INFORMATION), + FileBasicInformation); + if (!NT_SUCCESS(NtStatus)) + { + DPRINT("NtQueryInformationFile() failed (%x)\n", NtStatus); + } + else + { + memcpy(&FileBasic.LastAccessTime, &FileTime, sizeof(FILETIME)); + + NtStatus = NtSetInformationFile(DestFile, + &IoStatusBlock, + &FileBasic, + sizeof(FILE_BASIC_INFORMATION), + FileBasicInformation); + if (!NT_SUCCESS(NtStatus)) + { + DPRINT("NtSetInformationFile() failed (%x)\n", NtStatus); + } + } + + SetAttributesOnFile(Search->File, DestFile); + + /* Call extract event handler */ + if (ExtractHandler != NULL) + { + ExtractHandler(Search->File, DestName); + } + + /* find the starting block of the file + start with the first data block of the folder */ + CFData = (PCFDATA)(CabinetFolders[Search->File->FolderIndex].DataOffset + FileBuffer); + CurrentOffset = 0; + while (CurrentOffset + CFData->UncompSize <= Search->File->FileOffset) + { + /* walk the data blocks until we reach + the one containing the start of the file */ + CurrentOffset += CFData->UncompSize; + CFData = (PCFDATA)((char *)(CFData + 1) + DataReserved + CFData->CompSize); + } + + /* now decompress and discard any data in + the block before the start of the file */ + + /* start of comp data */ + CurrentBuffer = ((unsigned char *)(CFData + 1)) + DataReserved; + RemainingBlock = CFData->CompSize; + InputLength = RemainingBlock; + + while (CurrentOffset < Search->File->FileOffset) + { + /* compute remaining uncomp bytes to start + of file, bounded by sizeof junk */ + OutputLength = Search->File->FileOffset - CurrentOffset; + if (OutputLength > (LONG)sizeof(Junk)) + OutputLength = sizeof (Junk); + + /* negate to signal NOT end of block */ + OutputLength = -OutputLength; + CodecUncompress(Junk, CurrentBuffer, &InputLength, &OutputLength); + /* add the uncomp bytes extracted to current folder offset */ + CurrentOffset += OutputLength; + /* add comp bytes consumed to CurrentBuffer */ + CurrentBuffer += InputLength; + /* subtract bytes consumed from bytes remaining in block */ + RemainingBlock -= InputLength; + /* neg for resume decompression of the same block */ + InputLength = -RemainingBlock; + } + + /* now CurrentBuffer points to the first comp byte + of the file, so we can begin decompressing */ + + /* Size = remaining uncomp bytes of the file to decompress */ + Size = Search->File->FileSize; + while (Size > 0) + { + OutputLength = Size; + DPRINT("Decompressing block at %x with RemainingBlock = %d, Size = %d\n", + CurrentBuffer, RemainingBlock, Size); + + Status = CodecUncompress(CurrentDestBuffer, + CurrentBuffer, + &InputLength, + &OutputLength); + + if (Status != CS_SUCCESS) + { + DPRINT("Cannot uncompress block\n"); + if (Status == CS_NOMEMORY) + Status = CAB_STATUS_NOMEMORY; + Status = CAB_STATUS_INVALID_CAB; + goto UnmapDestFile; + } + + /* advance dest buffer by bytes produced */ + CurrentDestBuffer = (PVOID)((ULONG_PTR)CurrentDestBuffer + OutputLength); + /* advance src buffer by bytes consumed */ + CurrentBuffer += InputLength; + /* reduce remaining file bytes by bytes produced */ + Size -= OutputLength; + /* reduce remaining block size by bytes consumed */ + RemainingBlock -= InputLength; + if (RemainingBlock == 0) + { + /* used up this block, move on to the next */ + DPRINT("Out of block data\n"); + CFData = (PCFDATA)CurrentBuffer; + RemainingBlock = CFData->CompSize; + CurrentBuffer = (unsigned char *)(CFData + 1) + DataReserved; + InputLength = RemainingBlock; + } + } + + Status = CAB_STATUS_SUCCESS; + +UnmapDestFile: + NtUnmapViewOfSection(NtCurrentProcess(), DestFileBuffer); + +CloseDestFileSection: + NtClose(DestFileSection); + +CloseDestFile: + NtClose(DestFile); + + return Status; } - -VOID -CabinetSelectCodec(ULONG Id) /* * FUNCTION: Selects codec engine to use * ARGUMENTS: * Id = Codec identifier */ +VOID +CabinetSelectCodec(ULONG Id) { - if (CodecSelected) + if (CodecSelected) { - if (Id == CodecId) - return; + if (Id == CodecId) + return; - CodecSelected = FALSE; + CodecSelected = FALSE; } - switch (Id) + switch (Id) { - case CAB_CODEC_RAW: - CodecUncompress = RawCodecUncompress; - break; - case CAB_CODEC_MSZIP: - CodecUncompress = MSZipCodecUncompress; - break; - default: - return; + case CAB_CODEC_RAW: + CodecUncompress = RawCodecUncompress; + break; + case CAB_CODEC_MSZIP: + CodecUncompress = MSZipCodecUncompress; + break; + default: + return; } - CodecId = Id; - CodecSelected = TRUE; + CodecId = Id; + CodecSelected = TRUE; } - -VOID -CabinetSetEventHandlers(PCABINET_OVERWRITE Overwrite, - PCABINET_EXTRACT Extract, - PCABINET_DISK_CHANGE DiskChange) /* * FUNCTION: Set event handlers * ARGUMENTS: @@ -1117,33 +1160,38 @@ CabinetSetEventHandlers(PCABINET_OVERWRITE Overwrite, * Extract = Handler called when a file is to be extracted * DiskChange = Handler called when changing the disk */ +VOID +CabinetSetEventHandlers(PCABINET_OVERWRITE Overwrite, + PCABINET_EXTRACT Extract, + PCABINET_DISK_CHANGE DiskChange) { - OverwriteHandler = Overwrite; - ExtractHandler = Extract; - DiskChangeHandler = DiskChange; + OverwriteHandler = Overwrite; + ExtractHandler = Extract; + DiskChangeHandler = DiskChange; } - -PVOID -CabinetGetCabinetReservedArea(PULONG Size) /* * FUNCTION: Get pointer to cabinet reserved area. NULL if none */ +PVOID +CabinetGetCabinetReservedArea(PULONG Size) { - if (CabinetReservedArea != NULL) + if (CabinetReservedArea != NULL) { - if (Size != NULL) + if (Size != NULL) { - *Size = CabinetReserved; + *Size = CabinetReserved; } - return CabinetReservedArea; + + return CabinetReservedArea; } - else + else { - if (Size != NULL) + if (Size != NULL) { - *Size = 0; + *Size = 0; } - return NULL; + + return NULL; } } diff --git a/reactos/base/setup/usetup/cabinet.h b/reactos/base/setup/usetup/cabinet.h index 1a7884fd924..711a07f6ac2 100644 --- a/reactos/base/setup/usetup/cabinet.h +++ b/reactos/base/setup/usetup/cabinet.h @@ -4,8 +4,7 @@ * FILE: apps/cabman/cabinet.h * PURPOSE: Cabinet definitions */ -#ifndef __CABINET_H -#define __CABINET_H +#pragma once #include @@ -204,5 +203,3 @@ VOID CabinetSetEventHandlers(PCABINET_OVERWRITE Overwrite, PCABINET_DISK_CHANGE DiskChange); /* Get pointer to cabinet reserved area. NULL if none */ PVOID CabinetGetCabinetReservedArea(PULONG Size); - -#endif /* __CABINET_H */ diff --git a/reactos/base/setup/usetup/chkdsk.h b/reactos/base/setup/usetup/chkdsk.h index 79e21bdbfce..e21196b717d 100644 --- a/reactos/base/setup/usetup/chkdsk.h +++ b/reactos/base/setup/usetup/chkdsk.h @@ -23,14 +23,11 @@ * PROGRAMMER: Herv Poussineau (hpoussin@reactos.org) */ -#ifndef __CHKDSK_H__ -#define __CHKDSK_H__ +#pragma once NTSTATUS ChkdskPartition( IN PUNICODE_STRING DriveRoot, IN PFILE_SYSTEM_ITEM FileSystem); -#endif /* __CHKDSK_H__ */ - /* EOF */ diff --git a/reactos/base/setup/usetup/drivesup.h b/reactos/base/setup/usetup/drivesup.h index dd4b4192736..287b5a54e60 100644 --- a/reactos/base/setup/usetup/drivesup.h +++ b/reactos/base/setup/usetup/drivesup.h @@ -24,14 +24,11 @@ * PROGRAMMER: Eric Kohl */ -#ifndef __DRIVESUP_H__ -#define __DRIVESUP_H__ +#pragma once NTSTATUS GetSourcePaths(PUNICODE_STRING SourcePath, PUNICODE_STRING SourceRootPath, PUNICODE_STRING SourceRootDir); -#endif /* __DRIVESUP_H__ */ - /* EOF */ diff --git a/reactos/base/setup/usetup/errorcode.h b/reactos/base/setup/usetup/errorcode.h index 90ce8ed6ffb..4ecc11d35d2 100644 --- a/reactos/base/setup/usetup/errorcode.h +++ b/reactos/base/setup/usetup/errorcode.h @@ -24,8 +24,7 @@ * PROGRAMMER: */ -#ifndef __ERROR_CODE_H__ -#define __ERROR_CODE_H__ +#pragma once typedef enum { @@ -70,7 +69,4 @@ typedef enum ERROR_LAST_ERROR_CODE }ERROR_NUMBER; -#endif /* __ERROR_CODE_H__ */ - /* EOF */ - diff --git a/reactos/base/setup/usetup/filequeue.h b/reactos/base/setup/usetup/filequeue.h index 10eec8be767..28829a45fea 100644 --- a/reactos/base/setup/usetup/filequeue.h +++ b/reactos/base/setup/usetup/filequeue.h @@ -24,9 +24,7 @@ * PROGRAMMER: Eric Kohl */ -#ifndef __FILEQUEUE_H__ -#define __FILEQUEUE_H__ - +#pragma once #define SPFILENOTIFY_STARTQUEUE 0x1 #define SPFILENOTIFY_ENDQUEUE 0x2 @@ -104,6 +102,4 @@ SetupCommitFileQueueW(HWND Owner, PSP_FILE_CALLBACK_W MsgHandler, PVOID Context); -#endif /* __FILEQUEUE_H__ */ - /* EOF */ diff --git a/reactos/base/setup/usetup/filesup.h b/reactos/base/setup/usetup/filesup.h index 3ede70976e4..b7aecd8e622 100644 --- a/reactos/base/setup/usetup/filesup.h +++ b/reactos/base/setup/usetup/filesup.h @@ -24,8 +24,7 @@ * PROGRAMMER: Eric Kohl */ -#ifndef __FILESUP_H__ -#define __FILESUP_H__ +#pragma once NTSTATUS SetupCreateDirectory(PWCHAR DirectoryName); @@ -43,7 +42,4 @@ BOOLEAN DoesFileExist(PWSTR PathName, PWSTR FileName); - -#endif /* __FILESUP_H__ */ - /* EOF */ diff --git a/reactos/base/setup/usetup/format.h b/reactos/base/setup/usetup/format.h index 4e58c97ba93..d2784c16e61 100644 --- a/reactos/base/setup/usetup/format.h +++ b/reactos/base/setup/usetup/format.h @@ -24,14 +24,11 @@ * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net) */ -#ifndef __FORMAT_H__ -#define __FORMAT_H__ +#pragma once NTSTATUS FormatPartition( IN PUNICODE_STRING DriveRoot, IN PFILE_SYSTEM_ITEM FileSystem); -#endif /* __FILESUP_H__ */ - /* EOF */ diff --git a/reactos/base/setup/usetup/fslist.h b/reactos/base/setup/usetup/fslist.h index 5ae59cd460b..1c84024eeec 100644 --- a/reactos/base/setup/usetup/fslist.h +++ b/reactos/base/setup/usetup/fslist.h @@ -24,8 +24,7 @@ * Casper S. Hornstrup (chorns@users.sourceforge.net) */ -#ifndef __FSLIST_H__ -#define __FSLIST_H__ +#pragma once #include @@ -76,6 +75,4 @@ VOID ScrollUpFileSystemList( IN PFILE_SYSTEM_LIST List); -#endif /* __FSLIST_H__ */ - /* EOF */ diff --git a/reactos/base/setup/usetup/genlist.h b/reactos/base/setup/usetup/genlist.h index 5d30d75d84c..fd5682c9819 100644 --- a/reactos/base/setup/usetup/genlist.h +++ b/reactos/base/setup/usetup/genlist.h @@ -24,8 +24,7 @@ * PROGRAMMER: Eric Kohl */ -#ifndef __GENLIST_H__ -#define __GENLIST_H__ +#pragma once struct _GENERIC_LIST_ENTRY; typedef struct _GENERIC_LIST_ENTRY *PGENERIC_LIST_ENTRY; @@ -97,6 +96,4 @@ RestoreGenericListState(PGENERIC_LIST List); VOID GenericListKeyPress (PGENERIC_LIST List, CHAR AsciChar); -#endif /* __GENLIST_H__ */ - /* EOF */ diff --git a/reactos/base/setup/usetup/inffile.h b/reactos/base/setup/usetup/inffile.h index be4aabeb6e4..36c3bafeed4 100644 --- a/reactos/base/setup/usetup/inffile.h +++ b/reactos/base/setup/usetup/inffile.h @@ -24,8 +24,7 @@ * PROGRAMMER: Herv Poussineau */ -#ifndef __INFFILE_H__ -#define __INFFILE_H__ +#pragma once #ifndef __REACTOS__ @@ -115,6 +114,4 @@ INF_OpenBufferedFileA( VOID INF_SetHeap( IN PVOID Heap); -#endif /* __INFFILE_H__*/ - /* EOF */ diff --git a/reactos/base/setup/usetup/inicache.h b/reactos/base/setup/usetup/inicache.h index 2596324b8ad..bd7dd33510c 100644 --- a/reactos/base/setup/usetup/inicache.h +++ b/reactos/base/setup/usetup/inicache.h @@ -25,9 +25,7 @@ * Eric Kohl */ -#ifndef __INICACHE_H__ -#define __INICACHE_H__ - +#pragma once typedef struct _INICACHEKEY { @@ -126,7 +124,4 @@ PINICACHESECTION IniCacheAppendSection(PINICACHE Cache, PWCHAR Name); - -#endif /* __INICACHE_H__ */ - /* EOF */ diff --git a/reactos/base/setup/usetup/interface/consup.h b/reactos/base/setup/usetup/interface/consup.h index 7dc7d77531f..98be6dbf435 100644 --- a/reactos/base/setup/usetup/interface/consup.h +++ b/reactos/base/setup/usetup/interface/consup.h @@ -24,8 +24,7 @@ * PROGRAMMER: Eric Kohl */ -#ifndef __CONSUP_H__ -#define __CONSUP_H__ +#pragma once #define FOREGROUND_WHITE (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE) #define FOREGROUND_YELLOW (FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN) @@ -187,6 +186,4 @@ CONSOLE_SetStyledText( IN INT Flags, IN LPCSTR Text); -#endif /* __CONSOLE_H__*/ - /* EOF */ diff --git a/reactos/base/setup/usetup/interface/usetup.c b/reactos/base/setup/usetup/interface/usetup.c index 0e0d2166a92..87df41628f9 100644 --- a/reactos/base/setup/usetup/interface/usetup.c +++ b/reactos/base/setup/usetup/interface/usetup.c @@ -1786,8 +1786,8 @@ CreatePartitionPage (PINPUT_RECORD Ir) else { /* Round-up by cylinder size */ - PartSize = ROUND_UP (PartSize * 1024 * 1024, - DiskEntry->CylinderSize); + PartSize = (PartSize * 1024 * 1024 + DiskEntry->CylinderSize - 1) / + DiskEntry->CylinderSize * DiskEntry->CylinderSize; /* But never get larger than the unpartitioned disk space */ if (PartSize > PartEntry->UnpartitionedLength) diff --git a/reactos/base/setup/usetup/lang/af-ZA.h b/reactos/base/setup/usetup/lang/af-ZA.h index 7d706c9bf0b..53d9a03c96c 100644 --- a/reactos/base/setup/usetup/lang/af-ZA.h +++ b/reactos/base/setup/usetup/lang/af-ZA.h @@ -1,5 +1,4 @@ -#ifndef LANG_AF_ZA_H__ -#define LANG_AF_ZA_H__ +#pragma once MUI_LAYOUTS afZALayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS afZALayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-AE.h b/reactos/base/setup/usetup/lang/ar-AE.h index 006db05635e..82de046736a 100644 --- a/reactos/base/setup/usetup/lang/ar-AE.h +++ b/reactos/base/setup/usetup/lang/ar-AE.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_AE_H__ -#define LANG_AR_AE_H__ +#pragma once MUI_LAYOUTS arAELayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arAELayouts[] = { L"3801", L"00000401" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-BH.h b/reactos/base/setup/usetup/lang/ar-BH.h index 077483ffc15..4672e1fa81f 100644 --- a/reactos/base/setup/usetup/lang/ar-BH.h +++ b/reactos/base/setup/usetup/lang/ar-BH.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_BH_H__ -#define LANG_AR_BH_H__ +#pragma once MUI_LAYOUTS arBHLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arBHLayouts[] = { L"3C01", L"00000401" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-DZ.h b/reactos/base/setup/usetup/lang/ar-DZ.h index 35b789a0904..b0e8ec96983 100644 --- a/reactos/base/setup/usetup/lang/ar-DZ.h +++ b/reactos/base/setup/usetup/lang/ar-DZ.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_DZ_H__ -#define LANG_AR_DZ_H__ +#pragma once MUI_LAYOUTS arDZLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arDZLayouts[] = { L"1401", L"00020401" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-EG.h b/reactos/base/setup/usetup/lang/ar-EG.h index 00a0afb448c..23488ed7cbe 100644 --- a/reactos/base/setup/usetup/lang/ar-EG.h +++ b/reactos/base/setup/usetup/lang/ar-EG.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_EG_H__ -#define LANG_AR_EG_H__ +#pragma once MUI_LAYOUTS arEGLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arEGLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-IQ.h b/reactos/base/setup/usetup/lang/ar-IQ.h index 7640fe422b4..d0fb958c734 100644 --- a/reactos/base/setup/usetup/lang/ar-IQ.h +++ b/reactos/base/setup/usetup/lang/ar-IQ.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_IQ_H__ -#define LANG_AR_IQ_H__ +#pragma once MUI_LAYOUTS arIQLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arIQLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-JO.h b/reactos/base/setup/usetup/lang/ar-JO.h index 997f64d6deb..cc5a4a1cb56 100644 --- a/reactos/base/setup/usetup/lang/ar-JO.h +++ b/reactos/base/setup/usetup/lang/ar-JO.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_JO_H__ -#define LANG_AR_JO_H__ +#pragma once MUI_LAYOUTS arJOLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arJOLayouts[] = { L"2C01", L"00000401" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-KW.h b/reactos/base/setup/usetup/lang/ar-KW.h index 58f1823e107..d61d382decd 100644 --- a/reactos/base/setup/usetup/lang/ar-KW.h +++ b/reactos/base/setup/usetup/lang/ar-KW.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_KW_H__ -#define LANG_AR_KW_H__ +#pragma once MUI_LAYOUTS arKWLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arKWLayouts[] = { L"3401", L"00000401" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-LB.h b/reactos/base/setup/usetup/lang/ar-LB.h index c4ae8956548..f43c6a66225 100644 --- a/reactos/base/setup/usetup/lang/ar-LB.h +++ b/reactos/base/setup/usetup/lang/ar-LB.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_LB_H__ -#define LANG_AR_LB_H__ +#pragma once MUI_LAYOUTS arLBLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arLBLayouts[] = { L"3001", L"00000401" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-LY.h b/reactos/base/setup/usetup/lang/ar-LY.h index d06eebf0a89..8fdc9770889 100644 --- a/reactos/base/setup/usetup/lang/ar-LY.h +++ b/reactos/base/setup/usetup/lang/ar-LY.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_LY_H__ -#define LANG_AR_LY_H__ +#pragma once MUI_LAYOUTS arLYLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arLYLayouts[] = { L"1001", L"00020401" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-MA.h b/reactos/base/setup/usetup/lang/ar-MA.h index 47b8637f3b2..d6e056b9f5f 100644 --- a/reactos/base/setup/usetup/lang/ar-MA.h +++ b/reactos/base/setup/usetup/lang/ar-MA.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_MA_H__ -#define LANG_AR_MA_H__ +#pragma once MUI_LAYOUTS arMALayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arMALayouts[] = { L"1801", L"00020401" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-OM.h b/reactos/base/setup/usetup/lang/ar-OM.h index ff49fc25127..183b32ee77b 100644 --- a/reactos/base/setup/usetup/lang/ar-OM.h +++ b/reactos/base/setup/usetup/lang/ar-OM.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_OM_H__ -#define LANG_AR_OM_H__ +#pragma once MUI_LAYOUTS arOMLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arOMLayouts[] = { L"2001", L"00000401" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-QA.h b/reactos/base/setup/usetup/lang/ar-QA.h index c9e27ca5f70..bf6cb20f269 100644 --- a/reactos/base/setup/usetup/lang/ar-QA.h +++ b/reactos/base/setup/usetup/lang/ar-QA.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_QA_H__ -#define LANG_AR_QA_H__ +#pragma once MUI_LAYOUTS arQALayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arQALayouts[] = { L"4001", L"00000401" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-SA.h b/reactos/base/setup/usetup/lang/ar-SA.h index 541d9d713b6..403d2a008af 100644 --- a/reactos/base/setup/usetup/lang/ar-SA.h +++ b/reactos/base/setup/usetup/lang/ar-SA.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_SA_H__ -#define LANG_AR_SA_H__ +#pragma once MUI_LAYOUTS arSALayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arSALayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-SY.h b/reactos/base/setup/usetup/lang/ar-SY.h index 93dbe9b8583..8f4b9bb710e 100644 --- a/reactos/base/setup/usetup/lang/ar-SY.h +++ b/reactos/base/setup/usetup/lang/ar-SY.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_SY_H__ -#define LANG_AR_SY_H__ +#pragma once MUI_LAYOUTS arSYLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arSYLayouts[] = { L"2801", L"00000401" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-TN.h b/reactos/base/setup/usetup/lang/ar-TN.h index 2d70266f965..051164872be 100644 --- a/reactos/base/setup/usetup/lang/ar-TN.h +++ b/reactos/base/setup/usetup/lang/ar-TN.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_TN_H__ -#define LANG_AR_TN_H__ +#pragma once MUI_LAYOUTS arTNLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arTNLayouts[] = { L"1C01", L"00020401" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ar-YE.h b/reactos/base/setup/usetup/lang/ar-YE.h index eea30b10da3..19d029ee311 100644 --- a/reactos/base/setup/usetup/lang/ar-YE.h +++ b/reactos/base/setup/usetup/lang/ar-YE.h @@ -1,5 +1,4 @@ -#ifndef LANG_AR_YE_H__ -#define LANG_AR_YE_H__ +#pragma once MUI_LAYOUTS arYELayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS arYELayouts[] = { L"2401", L"00000401" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/az-AZ.h b/reactos/base/setup/usetup/lang/az-AZ.h index 8bee21d93a6..f2056baafe4 100644 --- a/reactos/base/setup/usetup/lang/az-AZ.h +++ b/reactos/base/setup/usetup/lang/az-AZ.h @@ -1,5 +1,4 @@ -#ifndef LANG_AZ_AZ_H__ -#define LANG_AZ_AZ_H__ +#pragma once MUI_LAYOUTS azAZLayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS azAZLayouts[] = { L"0419", L"00000419" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/be-BY.h b/reactos/base/setup/usetup/lang/be-BY.h index f42248012b4..de08d3e0c15 100644 --- a/reactos/base/setup/usetup/lang/be-BY.h +++ b/reactos/base/setup/usetup/lang/be-BY.h @@ -1,5 +1,4 @@ -#ifndef LANG_BE_BY_H__ -#define LANG_BE_BY_H__ +#pragma once MUI_LAYOUTS beBYLayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS beBYLayouts[] = { L"0419", L"00000419" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/bg-BG.h b/reactos/base/setup/usetup/lang/bg-BG.h index 612ccd99181..23bd1f4ebf3 100644 --- a/reactos/base/setup/usetup/lang/bg-BG.h +++ b/reactos/base/setup/usetup/lang/bg-BG.h @@ -1,5 +1,4 @@ -#ifndef LANG_BG_BG_H__ -#define LANG_BG_BG_H__ +#pragma once MUI_LAYOUTS bgBGLayouts[] = { @@ -1706,5 +1705,3 @@ MUI_STRING bgBGStrings[] = "ﭥ ୨ ।"}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ca-ES.h b/reactos/base/setup/usetup/lang/ca-ES.h index f8c006876c8..f2f6234ba0e 100644 --- a/reactos/base/setup/usetup/lang/ca-ES.h +++ b/reactos/base/setup/usetup/lang/ca-ES.h @@ -1,5 +1,4 @@ -#ifndef LANG_CA_ES_H__ -#define LANG_CA_ES_H__ +#pragma once MUI_LAYOUTS caESLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS caESLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/cs-CZ.h b/reactos/base/setup/usetup/lang/cs-CZ.h index d4521e253d0..b3397e14751 100644 --- a/reactos/base/setup/usetup/lang/cs-CZ.h +++ b/reactos/base/setup/usetup/lang/cs-CZ.h @@ -4,8 +4,7 @@ * UPDATED: 2008-06-05 */ -#ifndef LANG_CS_CZ_H__ -#define LANG_CS_CZ_H__ +#pragma once MUI_LAYOUTS csCZLayouts[] = { @@ -1702,5 +1701,3 @@ MUI_STRING csCZStrings[] = "Pidvm rozloen klves"}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/da-DK.h b/reactos/base/setup/usetup/lang/da-DK.h index a160ad71cd1..627064a4992 100644 --- a/reactos/base/setup/usetup/lang/da-DK.h +++ b/reactos/base/setup/usetup/lang/da-DK.h @@ -1,5 +1,4 @@ -#ifndef LANG_DA_DK_H__ -#define LANG_DA_DK_H__ +#pragma once MUI_LAYOUTS daDKLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS daDKLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/de-AT.h b/reactos/base/setup/usetup/lang/de-AT.h index 3c86dfc0092..289c2080fcc 100644 --- a/reactos/base/setup/usetup/lang/de-AT.h +++ b/reactos/base/setup/usetup/lang/de-AT.h @@ -1,5 +1,4 @@ -#ifndef LANG_DE_AT_H__ -#define LANG_DE_AT_H__ +#pragma once MUI_LAYOUTS deATLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS deATLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/de-CH.h b/reactos/base/setup/usetup/lang/de-CH.h index a217cd86b9c..de472e6c532 100644 --- a/reactos/base/setup/usetup/lang/de-CH.h +++ b/reactos/base/setup/usetup/lang/de-CH.h @@ -1,5 +1,4 @@ -#ifndef LANG_DE_CH_H__ -#define LANG_DE_CH_H__ +#pragma once MUI_LAYOUTS deCHLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS deCHLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/de-DE.h b/reactos/base/setup/usetup/lang/de-DE.h index 570f2147761..e21b2ffc001 100644 --- a/reactos/base/setup/usetup/lang/de-DE.h +++ b/reactos/base/setup/usetup/lang/de-DE.h @@ -1,5 +1,4 @@ -#ifndef LANG_DE_DE_H__ -#define LANG_DE_DE_H__ +#pragma once MUI_LAYOUTS deDELayouts[] = { @@ -65,13 +64,13 @@ static MUI_ENTRY deDEWelcomePageEntries[] = { 6, 8, - "Willkommen zum ReactOS Setup", + "Willkommen zum ReactOS-Setup", TEXT_STYLE_HIGHLIGHT }, { 6, 11, - "Dieser Teil des Setups kopiert das ReactOS Betriebssystem auf Ihren", + "Dieser Teil des Setups kopiert das ReactOS-Betriebssystem auf Ihren", TEXT_STYLE_NORMAL }, { @@ -107,7 +106,7 @@ static MUI_ENTRY deDEWelcomePageEntries[] = { 6, 23, - "Fr weitere Informationen, besuchen Sie bitte:", + "Fr weitere Informationen besuchen Sie bitte:", TEXT_STYLE_NORMAL }, { @@ -141,7 +140,7 @@ static MUI_ENTRY deDEIntroPageEntries[] = { 6, 8, - "Das ReactOS Setup ist noch in einer frhen Entwicklungsphase. Es unter-", + "Das ReactOS-Setup ist noch in einer frhen Entwicklungsphase. Es unter-", TEXT_STYLE_NORMAL }, { @@ -165,7 +164,7 @@ static MUI_ENTRY deDEIntroPageEntries[] = { 8, 14, - "- Setup kann keine primre Partition von einer HDD lschen", + "- Setup kann keine primre Partition von einer HDD lschen,", TEXT_STYLE_NORMAL }, { @@ -177,7 +176,7 @@ static MUI_ENTRY deDEIntroPageEntries[] = { 8, 16, - "- Setup kann die erste erweiterte Partition nicht von der HDD lschen", + "- Setup kann die erste erweiterte Partition nicht von der HDD lschen,", TEXT_STYLE_NORMAL }, { @@ -189,7 +188,7 @@ static MUI_ENTRY deDEIntroPageEntries[] = { 8, 18, - "- Setup untersttzt nur FAT Dateisysteme.", + "- Setup untersttzt nur FAT-Dateisysteme.", TEXT_STYLE_NORMAL }, { @@ -406,7 +405,7 @@ static MUI_ENTRY deDEDevicePageEntries[] = { 6, 20, - "Dann drcken Sie die Eingabetaste, um eine Einstellung abzundern.", + "Dann drcken Sie die Eingabetaste, um eine Einstellung zu ndern.", TEXT_STYLE_NORMAL }, { @@ -452,7 +451,7 @@ static MUI_ENTRY deDERepairPageEntries[] = { 6, 8, - "Das ReactOS Setup ist noch in einer frhen Entwicklungsphase. Es unter-", + "Das ReactOS-Setup ist noch in einer frhen Entwicklungsphase. Es unter-", TEXT_STYLE_NORMAL }, { @@ -488,7 +487,7 @@ static MUI_ENTRY deDERepairPageEntries[] = { 8, 21, - "\x07 Drcken Sie ENTER, um den Computer neuzustarten.", + "\x07 Drcken Sie ENTER, um den Computer neu zu starten.", TEXT_STYLE_NORMAL }, { @@ -579,7 +578,7 @@ static MUI_ENTRY deDEFlushPageEntries[] = { 10, 9, - "Der PC wird automatisch neustarten, wenn der Vorgang beendet ist.", + "Der PC wird automatisch neunstarten, wenn der Vorgang beendet ist.", TEXT_STYLE_NORMAL }, { @@ -895,7 +894,7 @@ static MUI_ENTRY deDEInstallDirectoryEntries[] = { 6, 8, - "Setup installiert die ReactOS Installationsdateien in die ausgewhlte", + "Setup installiert die ReactOS-Installationsdateien in die ausgewhlte", TEXT_STYLE_NORMAL }, { @@ -907,13 +906,13 @@ static MUI_ENTRY deDEInstallDirectoryEntries[] = { 6, 14, - "Um den Vorschlag zu ndern drcken sie die 'Entf' Taste um", + "Um den Vorschlag zu ndern drcken sie die 'Entf'-Taste, um", TEXT_STYLE_NORMAL }, { 6, 15, - "Zeichen zu lschen und gegeben sie dann den Namen des Verzeichnis ein", + "Zeichen zu lschen, und geben sie dann den Namen des Verzeichnis ein", TEXT_STYLE_NORMAL }, { @@ -941,7 +940,7 @@ static MUI_ENTRY deDEFileCopyEntries[] = { 0, 12, - "Bitte warten Sie whrend ReactOS Setup die ReactOS Dateien", + "Bitte warten Sie, whrend das ReactOS-Setup die ReactOS-Dateien", TEXT_STYLE_NORMAL | TEXT_ALIGN_CENTER }, { @@ -987,7 +986,7 @@ static MUI_ENTRY deDEBootLoaderEntries[] = { 8, 12, - "Boot-Loader auf der Festplatte installieren (Boot-Sektor).", + "Boot-Loader auf der Festplatte installieren (Bootsektor).", TEXT_STYLE_NORMAL }, { @@ -1079,7 +1078,7 @@ static MUI_ENTRY deDELayoutSettingsEntries[] = { 6, 8, - "Bitte whlen Sie ein zu installierendes Standard Layout.", + "Bitte whlen Sie ein zu installierendes Standardlayout aus.", TEXT_STYLE_NORMAL }, { @@ -1161,7 +1160,7 @@ static MUI_ENTRY deDESelectFSEntries[] = { 6, 17, - "Whlen Sie ein Dateisystem von der folgenden Liste.", + "Whlen Sie ein Dateisystem aus der folgenden Liste aus.", 0 }, { @@ -1208,7 +1207,7 @@ static MUI_ENTRY deDEDeletePartitionEntries[] = { 6, 8, - "Sie haben sich entschieden diese Partition zu lschen", + "Sie haben sich entschieden, diese Partition zu lschen", TEXT_STYLE_NORMAL }, { @@ -1260,7 +1259,7 @@ static MUI_ENTRY deDERegistryEntries[] = { 0, 0, - "Registry Hives erstellen...", + "Registryzweige erstellen...", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -1287,62 +1286,62 @@ MUI_ERROR deDEErrorEntries[] = { //ERROR_NO_HDD "Setup konnte keine Festplatte finden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_NO_SOURCE_DRIVE "Setup konnte das Quelllaufwerk nicht finden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_LOAD_TXTSETUPSIF "Setup konnte TXTSETUP.SIF nicht finden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_CORRUPT_TXTSETUPSIF - "Setup fand eine korrupte TXTSETUP.SIF.\n", - "ENTER = Computer neustarten" + "Setup fand eine defekte TXTSETUP.SIF.\n", + "ENTER = Computer neu starten" }, { //ERROR_SIGNATURE_TXTSETUPSIF, "Setup fand eine ungltige Signatur in TXTSETUP.SIF.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_DRIVE_INFORMATION "Setup konnte keine Laufwerksinformationen abfragen.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_WRITE_BOOT, - "Setup konnte den FAT Bootcode nicht auf der Partition installieren.", - "ENTER = Computer neustarten" + "Setup konnte den FAT-Bootcode nicht auf der Partition installieren.", + "ENTER = Computer neu starten" }, { //ERROR_LOAD_COMPUTER, "Setup konnte die Computertypenliste nicht laden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_LOAD_DISPLAY, "Setup konnte die Displayeinstellungsliste nicht laden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_LOAD_KEYBOARD, "Setup konnte die Tastaturtypenliste nicht laden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_LOAD_KBLAYOUT, "Setup konnte die Tastaturlayoutliste nicht laden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_WARN_PARTITION, "Setup hat mindestens eine Festplatte mit einer inkompatiblen Partitionstabelle\n" - "welche nicht richtig verwendet werden knnen!\n" + "gefunden, die nicht richtig verwendet werden kann!\n" "\n" "Partitionen zu erstellen/lschen kann die Partitionstabelle zerstren.\n" "\n" @@ -1367,8 +1366,8 @@ MUI_ERROR deDEErrorEntries[] = }, { //ERROR_INSTALL_BOOTCODE, - "Setup konnte den FAT Bootcode nicht auf der Partition installieren.", - "ENTER = Computer neustarten" + "Setup konnte den FAT-Bootcode nicht auf der Partition installieren.", + "ENTER = Computer neu starten" }, { //ERROR_NO_FLOPPY, @@ -1378,105 +1377,105 @@ MUI_ERROR deDEErrorEntries[] = { //ERROR_UPDATE_KBSETTINGS, "Setup konnte das Tastaturlayout nicht aktualisieren.", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_UPDATE_DISPLAY_SETTINGS, "Setup konnte die Display-Registrywerte nicht aktualisieren.", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_IMPORT_HIVE, - "Setup konnte keine Hive Datei importieren.", - "ENTER = Computer neustarten" + "Setup konnte keine Hive-Datei importieren.", + "ENTER = Computer neu starten" }, { //ERROR_FIND_REGISTRY "Setup konnte die Registrydateien nicht finden.", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_CREATE_HIVE, - "Setup konnte die Registry-Hives nicht erstellen.", - "ENTER = Computer neustarten" + "Setup konnte die Registryzweige nicht erstellen.", + "ENTER = Computer neu starten" }, { //ERROR_INITIALIZE_REGISTRY, "Setup konnte die Registry nicht initialisieren.", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_INVALID_CABINET_INF, - "Cabinet hat keine gltige .inf Datei.\n", - "ENTER = Computer neustarten" + "Cabinet hat keine gltige .inf-Datei.\n", + "ENTER = Computer neu starten" }, { //ERROR_CABINET_MISSING, "Cabinet nicht gefunden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_CABINET_SCRIPT, - "Cabinet enthlt kein Setup Skript.\n", - "ENTER = Computer neustarten" + "Cabinet enthlt kein Setup-Skript.\n", + "ENTER = Computer neu starten" }, { //ERROR_COPY_QUEUE, "Setup konnte die Liste mit zu kopierenden Dateien nicht finden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_CREATE_DIR, "Setup konnte die Installationspfade nicht erstellen.", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_TXTSETUP_SECTION, - "Setup konnte die 'Ordner' Sektion in\n" + "Setup konnte die 'Ordner'-Sektion in\n" "TXTSETUP.SIF nicht finden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_CABINET_SECTION, - "Setup konnte die 'Ordner' Sektion im\n" + "Setup konnte die 'Ordner'-Sektion im\n" "Cabinet nicht finden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_CREATE_INSTALL_DIR "Setup konnte den Installationspfad nicht erstellen.", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_FIND_SETUPDATA, - "Setup konnte die 'SetupData' Sektion in\n" + "Setup konnte die 'SetupData'-Sektion in\n" "TXTSETUP.SIF nicht finden.\n", - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_WRITE_PTABLE, "Setup konnte die Partitionstabellen nicht schreiben.\n" - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_ADDING_CODEPAGE, - "Setup konnte den CodePage-Eintrag nicht hinzufgen.\n" - "ENTER = Computer neustarten" + "Setup konnte den Codepage-Eintrag nicht hinzufgen.\n" + "ENTER = Computer neu starten" }, { //ERROR_UPDATE_LOCALESETTINGS, "Setup konnte die Systemsprache nicht einstellen.\n" - "ENTER = Computer neustarten" + "ENTER = Computer neu starten" }, { //ERROR_ADDING_KBLAYOUTS, - "Setup konnte die Tastaturlayouts nicht in Registry eintragen.\n" - "ENTER = Computer neustarten" + "Setup konnte die Tastaturlayouts nicht in der Registry eintragen.\n" + "ENTER = Computer neu starten" }, { //ERROR_UPDATE_GEOID, - "Setup konnte den geographischen Standort nicht einstellen.\n" - "ENTER = Computer neustarten" + "Setup konnte den geografischen Standort nicht einstellen.\n" + "ENTER = Computer neu starten" }, { NULL, @@ -1596,7 +1595,7 @@ MUI_STRING deDEStrings[] = {STRING_PARTITIONSIZE, "Gre der neuen Partition:"}, {STRING_CHOOSENEWPARTITION, - "Sie haben beschlossen eine neue Partition zu erstellen auf"}, + "Sie haben beschlossen, eine neue Partition zu erstellen auf"}, {STRING_HDDSIZE, "Bitte geben Sie die Gre der neuen Partition in Megabyte ein."}, {STRING_CREATEPARTITION, @@ -1606,21 +1605,21 @@ MUI_STRING deDEStrings[] = {STRING_NONFORMATTEDPART, "Sie wollen ReactOS auf einer neuen/unformatieren Partition installieren."}, {STRING_INSTALLONPART, - "Setup installiert ReactOS auf diese Partition"}, + "Setup installiert ReactOS auf dieser Partition"}, {STRING_CHECKINGPART, "Setup berprft die ausgewhlte Partition."}, {STRING_QUITCONTINUE, "F3 = Beenden ENTER = Fortsetzen"}, {STRING_REBOOTCOMPUTER, - "ENTER = Computer neustarten"}, + "ENTER = Computer neu starten"}, {STRING_TXTSETUPFAILED, - "Setup konnte die '%S' Sektion\nin TXTSETUP.SIF nicht finden.\n"}, + "Setup konnte die '%S'-Sektion\nin TXTSETUP.SIF nicht finden.\n"}, {STRING_COPYING, "\xB3 Kopiere Datei: %S"}, {STRING_SETUPCOPYINGFILES, "Setup kopiert Dateien..."}, {STRING_REGHIVEUPDATE, - " Registry hives werden aktualisiert..."}, + " Registryzweige werden aktualisiert..."}, {STRING_IMPORTFILE, " Importiere %S..."}, {STRING_DISPLAYETTINGSUPDATE, @@ -1628,27 +1627,27 @@ MUI_STRING deDEStrings[] = {STRING_LOCALESETTINGSUPDATE, " Lokalisierungseinstellungen werden aktualisiert..."}, {STRING_KEYBOARDSETTINGSUPDATE, - " Tastaturlayout Einstellungen werden aktualisiert..."}, + " Tastaturlayouteinstellungen werden aktualisiert..."}, {STRING_CODEPAGEINFOUPDATE, - " Codepage Informationen werden hinzugefgt..."}, + " Codepage-Informationen werden hinzugefgt..."}, {STRING_DONE, " Fertig..."}, {STRING_REBOOTCOMPUTER2, - " ENTER = Computer neustarten"}, + " ENTER = Computer neu starten"}, {STRING_CONSOLEFAIL1, "Konsole konnte nicht geffnet werden\n\n"}, {STRING_CONSOLEFAIL2, - "Der hufigste Grund hierfr ist die Verwendung einer USB Tastautur\n"}, + "Der hufigste Grund hierfr ist die Verwendung einer USB-Tastatur\n"}, {STRING_CONSOLEFAIL3, - "USB Tastaturen werden noch nicht vollstndig untersttzt\n"}, + "USB-Tastaturen werden noch nicht vollstndig untersttzt\n"}, {STRING_FORMATTINGDISK, "Setup formatiert Ihre Festplatte"}, {STRING_CHECKINGDISK, "Setup berprft Ihre Festplatte"}, {STRING_FORMATDISK1, - " Formatiere Partition als %S Dateisystem (Schnell) "}, + " Formatiere Partition als %S-Dateisystem (Schnell) "}, {STRING_FORMATDISK2, - " Formatiere Partition als %S Dateisystem "}, + " Formatiere Partition als %S-Dateisystem "}, {STRING_KEEPFORMAT, " Dateisystem beibehalten (Keine Vernderungen) "}, {STRING_HDINFOPARTCREATE, @@ -1695,5 +1694,3 @@ MUI_STRING deDEStrings[] = "Tastaturlayout hinzufgen"}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/de-LI.h b/reactos/base/setup/usetup/lang/de-LI.h index b34c6834287..425688ee1c0 100644 --- a/reactos/base/setup/usetup/lang/de-LI.h +++ b/reactos/base/setup/usetup/lang/de-LI.h @@ -1,5 +1,4 @@ -#ifndef LANG_DE_LI_H__ -#define LANG_DE_LI_H__ +#pragma once MUI_LAYOUTS deLILayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS deLILayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/de-LU.h b/reactos/base/setup/usetup/lang/de-LU.h index 2c7f683b575..21956e9ff24 100644 --- a/reactos/base/setup/usetup/lang/de-LU.h +++ b/reactos/base/setup/usetup/lang/de-LU.h @@ -1,5 +1,4 @@ -#ifndef LANG_DE_LU_H__ -#define LANG_DE_LU_H__ +#pragma once MUI_LAYOUTS deLULayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS deLULayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/dv-MV.h b/reactos/base/setup/usetup/lang/dv-MV.h index 90f33c4c490..b96b1e2fda2 100644 --- a/reactos/base/setup/usetup/lang/dv-MV.h +++ b/reactos/base/setup/usetup/lang/dv-MV.h @@ -1,5 +1,4 @@ -#ifndef LANG_DV_MV_H__ -#define LANG_DV_MV_H__ +#pragma once MUI_LAYOUTS dvMVLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS dvMVLayouts[] = { L"0465", L"00000465" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/el-GR.h b/reactos/base/setup/usetup/lang/el-GR.h index 861bae50902..e04f530f674 100644 --- a/reactos/base/setup/usetup/lang/el-GR.h +++ b/reactos/base/setup/usetup/lang/el-GR.h @@ -1,5 +1,4 @@ -#ifndef LANG_EL_GR_H__ -#define LANG_EL_GR_H__ +#pragma once MUI_LAYOUTS elGRLayouts[] = { @@ -1724,5 +1723,3 @@ MUI_STRING elGRStrings[] = "夜 㡞 ᥜ 妬"}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/en-AU.h b/reactos/base/setup/usetup/lang/en-AU.h index 2e50aa9ff68..ffa3b865e83 100644 --- a/reactos/base/setup/usetup/lang/en-AU.h +++ b/reactos/base/setup/usetup/lang/en-AU.h @@ -1,10 +1,7 @@ -#ifndef LANG_EN_AU_H__ -#define LANG_EN_AU_H__ +#pragma once MUI_LAYOUTS enAULayouts[] = { { L"0C09", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/en-BZ.h b/reactos/base/setup/usetup/lang/en-BZ.h index 09c3d52aa85..4c34df80e4e 100644 --- a/reactos/base/setup/usetup/lang/en-BZ.h +++ b/reactos/base/setup/usetup/lang/en-BZ.h @@ -1,10 +1,7 @@ -#ifndef LANG_EN_BZ_H__ -#define LANG_EN_BZ_H__ +#pragma once MUI_LAYOUTS enBZLayouts[] = { { L"2809", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/en-CA.h b/reactos/base/setup/usetup/lang/en-CA.h index 3c50f83d03a..98000aed71a 100644 --- a/reactos/base/setup/usetup/lang/en-CA.h +++ b/reactos/base/setup/usetup/lang/en-CA.h @@ -1,5 +1,4 @@ -#ifndef LANG_EN_CA_H__ -#define LANG_EN_CA_H__ +#pragma once MUI_LAYOUTS enCALayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS enCALayouts[] = { L"1009", L"00001009" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/en-CB.h b/reactos/base/setup/usetup/lang/en-CB.h index 6dd41f4359d..e014b335b87 100644 --- a/reactos/base/setup/usetup/lang/en-CB.h +++ b/reactos/base/setup/usetup/lang/en-CB.h @@ -1,10 +1,7 @@ -#ifndef LANG_EN_CB_H__ -#define LANG_EN_CB_H__ +#pragma once MUI_LAYOUTS enCBLayouts[] = { { L"2409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/en-GB.h b/reactos/base/setup/usetup/lang/en-GB.h index e147fb794c1..58fe5034d9e 100644 --- a/reactos/base/setup/usetup/lang/en-GB.h +++ b/reactos/base/setup/usetup/lang/en-GB.h @@ -1,10 +1,7 @@ -#ifndef LANG_EN_GB_H__ -#define LANG_EN_GB_H__ +#pragma once MUI_LAYOUTS enGBLayouts[] = { { L"0809", L"00000809" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/en-IE.h b/reactos/base/setup/usetup/lang/en-IE.h index db9ee2462e8..e41db1e4184 100644 --- a/reactos/base/setup/usetup/lang/en-IE.h +++ b/reactos/base/setup/usetup/lang/en-IE.h @@ -1,5 +1,4 @@ -#ifndef LANG_EN_IE_H__ -#define LANG_EN_IE_H__ +#pragma once MUI_LAYOUTS enIELayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS enIELayouts[] = { L"1809", L"00011809" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/en-JM.h b/reactos/base/setup/usetup/lang/en-JM.h index a7122f4403e..0b9567609ae 100644 --- a/reactos/base/setup/usetup/lang/en-JM.h +++ b/reactos/base/setup/usetup/lang/en-JM.h @@ -1,10 +1,7 @@ -#ifndef LANG_EN_JM_H__ -#define LANG_EN_JM_H__ +#pragma once MUI_LAYOUTS enJMLayouts[] = { { L"2009", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/en-NZ.h b/reactos/base/setup/usetup/lang/en-NZ.h index 241d8ef732a..33eb865810a 100644 --- a/reactos/base/setup/usetup/lang/en-NZ.h +++ b/reactos/base/setup/usetup/lang/en-NZ.h @@ -1,10 +1,7 @@ -#ifndef LANG_EN_NZ_H__ -#define LANG_EN_NZ_H__ +#pragma once MUI_LAYOUTS enNZLayouts[] = { { L"1409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/en-PH.h b/reactos/base/setup/usetup/lang/en-PH.h index b525130dd0e..88273d280ad 100644 --- a/reactos/base/setup/usetup/lang/en-PH.h +++ b/reactos/base/setup/usetup/lang/en-PH.h @@ -1,10 +1,7 @@ -#ifndef LANG_EN_PH_H__ -#define LANG_EN_PH_H__ +#pragma once MUI_LAYOUTS enPHLayouts[] = { { L"3409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/en-TT.h b/reactos/base/setup/usetup/lang/en-TT.h index e6866273f54..e167cfc103a 100644 --- a/reactos/base/setup/usetup/lang/en-TT.h +++ b/reactos/base/setup/usetup/lang/en-TT.h @@ -1,10 +1,7 @@ -#ifndef LANG_EN_TT_H__ -#define LANG_EN_TT_H__ +#pragma once MUI_LAYOUTS enTTLayouts[] = { { L"2C09", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/en-US.h b/reactos/base/setup/usetup/lang/en-US.h index 34d9d892b4f..ac694c98c54 100644 --- a/reactos/base/setup/usetup/lang/en-US.h +++ b/reactos/base/setup/usetup/lang/en-US.h @@ -1,5 +1,4 @@ -#ifndef LANG_EN_US_H__ -#define LANG_EN_US_H__ +#pragma once MUI_LAYOUTS enUSLayouts[] = { @@ -1693,5 +1692,3 @@ MUI_STRING enUSStrings[] = "Adding keyboard layouts"}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/en-ZA.h b/reactos/base/setup/usetup/lang/en-ZA.h index cf5d1f3e1c5..59ceabf5019 100644 --- a/reactos/base/setup/usetup/lang/en-ZA.h +++ b/reactos/base/setup/usetup/lang/en-ZA.h @@ -1,10 +1,7 @@ -#ifndef LANG_EN_ZA_H__ -#define LANG_EN_ZA_H__ +#pragma once MUI_LAYOUTS enZALayouts[] = { { L"1C09", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/en-ZW.h b/reactos/base/setup/usetup/lang/en-ZW.h index 23dabb7db62..917bd6c9e91 100644 --- a/reactos/base/setup/usetup/lang/en-ZW.h +++ b/reactos/base/setup/usetup/lang/en-ZW.h @@ -1,10 +1,7 @@ -#ifndef LANG_EN_ZW_H__ -#define LANG_EN_ZW_H__ +#pragma once MUI_LAYOUTS enZWLayouts[] = { { L"3009", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/eo-AA.h b/reactos/base/setup/usetup/lang/eo-AA.h index 15c7c992c67..3b72dcf961d 100644 --- a/reactos/base/setup/usetup/lang/eo-AA.h +++ b/reactos/base/setup/usetup/lang/eo-AA.h @@ -1,5 +1,4 @@ -#ifndef LANG_EO_AA_H__ -#define LANG_EO_AA_H__ +#pragma once MUI_LAYOUTS eoAALayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS eoAALayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-AR.h b/reactos/base/setup/usetup/lang/es-AR.h index c427b8d4065..4e36f4aa278 100644 --- a/reactos/base/setup/usetup/lang/es-AR.h +++ b/reactos/base/setup/usetup/lang/es-AR.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_AR_H__ -#define LANG_ES_AR_H__ +#pragma once MUI_LAYOUTS esARLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esARLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-BO.h b/reactos/base/setup/usetup/lang/es-BO.h index 69e4957b56a..f7e210d1283 100644 --- a/reactos/base/setup/usetup/lang/es-BO.h +++ b/reactos/base/setup/usetup/lang/es-BO.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_BO_H__ -#define LANG_ES_BO_H__ +#pragma once MUI_LAYOUTS esBOLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esBOLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-CL.h b/reactos/base/setup/usetup/lang/es-CL.h index 1222675ed71..88704431994 100644 --- a/reactos/base/setup/usetup/lang/es-CL.h +++ b/reactos/base/setup/usetup/lang/es-CL.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_CL_H__ -#define LANG_ES_CL_H__ +#pragma once MUI_LAYOUTS esCLLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esCLLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-CO.h b/reactos/base/setup/usetup/lang/es-CO.h index 9e6e569f39f..3b36be43327 100644 --- a/reactos/base/setup/usetup/lang/es-CO.h +++ b/reactos/base/setup/usetup/lang/es-CO.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_CO_H__ -#define LANG_ES_CO_H__ +#pragma once MUI_LAYOUTS esCOLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esCOLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-CR.h b/reactos/base/setup/usetup/lang/es-CR.h index d66e39f29cc..eff1db06fba 100644 --- a/reactos/base/setup/usetup/lang/es-CR.h +++ b/reactos/base/setup/usetup/lang/es-CR.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_CR_H__ -#define LANG_ES_CR_H__ +#pragma once MUI_LAYOUTS esCRLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esCRLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-DO.h b/reactos/base/setup/usetup/lang/es-DO.h index 5a474dc34ae..3987c8c7317 100644 --- a/reactos/base/setup/usetup/lang/es-DO.h +++ b/reactos/base/setup/usetup/lang/es-DO.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_DO_H__ -#define LANG_ES_DO_H__ +#pragma once MUI_LAYOUTS esDOLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esDOLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-EC.h b/reactos/base/setup/usetup/lang/es-EC.h index 9627211c702..ea54ab71312 100644 --- a/reactos/base/setup/usetup/lang/es-EC.h +++ b/reactos/base/setup/usetup/lang/es-EC.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_EC_H__ -#define LANG_ES_EC_H__ +#pragma once MUI_LAYOUTS esECLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esECLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-ES.h b/reactos/base/setup/usetup/lang/es-ES.h index ef516888c13..d951d6b564f 100644 --- a/reactos/base/setup/usetup/lang/es-ES.h +++ b/reactos/base/setup/usetup/lang/es-ES.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_ES_H__ -#define LANG_ES_ES_H__ +#pragma once MUI_LAYOUTS esESLayouts[] = { @@ -1694,5 +1693,3 @@ MUI_STRING esESStrings[] = "Adding keyboard layouts"}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-GT.h b/reactos/base/setup/usetup/lang/es-GT.h index 184f57a53ea..5d99a5de347 100644 --- a/reactos/base/setup/usetup/lang/es-GT.h +++ b/reactos/base/setup/usetup/lang/es-GT.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_GT_H__ -#define LANG_ES_GT_H__ +#pragma once MUI_LAYOUTS esGTLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esGTLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-HN.h b/reactos/base/setup/usetup/lang/es-HN.h index 7564bc6a701..14d5ab9f6af 100644 --- a/reactos/base/setup/usetup/lang/es-HN.h +++ b/reactos/base/setup/usetup/lang/es-HN.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_HN_H__ -#define LANG_ES_HN_H__ +#pragma once MUI_LAYOUTS esHNLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esHNLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-MX.h b/reactos/base/setup/usetup/lang/es-MX.h index 0ebe7fc9463..da0bd621d22 100644 --- a/reactos/base/setup/usetup/lang/es-MX.h +++ b/reactos/base/setup/usetup/lang/es-MX.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_MX_H__ -#define LANG_ES_MX_H__ +#pragma once MUI_LAYOUTS esMXLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esMXLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-NI.h b/reactos/base/setup/usetup/lang/es-NI.h index cf9142a00b6..c570367d9b1 100644 --- a/reactos/base/setup/usetup/lang/es-NI.h +++ b/reactos/base/setup/usetup/lang/es-NI.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_NI_H__ -#define LANG_ES_NI_H__ +#pragma once MUI_LAYOUTS esNILayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esNILayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-PA.h b/reactos/base/setup/usetup/lang/es-PA.h index 38693e8bfe3..81bf70c1c98 100644 --- a/reactos/base/setup/usetup/lang/es-PA.h +++ b/reactos/base/setup/usetup/lang/es-PA.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_PA_H__ -#define LANG_ES_PA_H__ +#pragma once MUI_LAYOUTS esPALayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esPALayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-PE.h b/reactos/base/setup/usetup/lang/es-PE.h index 97090ac930d..970402bcf96 100644 --- a/reactos/base/setup/usetup/lang/es-PE.h +++ b/reactos/base/setup/usetup/lang/es-PE.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_PE_H__ -#define LANG_ES_PE_H__ +#pragma once MUI_LAYOUTS esPELayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esPELayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-PR.h b/reactos/base/setup/usetup/lang/es-PR.h index 02492dc3ae3..e9acb60cac3 100644 --- a/reactos/base/setup/usetup/lang/es-PR.h +++ b/reactos/base/setup/usetup/lang/es-PR.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_PR_H__ -#define LANG_ES_PR_H__ +#pragma once MUI_LAYOUTS esPRLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esPRLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-PY.h b/reactos/base/setup/usetup/lang/es-PY.h index f5c476e8482..640d700b70c 100644 --- a/reactos/base/setup/usetup/lang/es-PY.h +++ b/reactos/base/setup/usetup/lang/es-PY.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_PY_H__ -#define LANG_ES_PY_H__ +#pragma once MUI_LAYOUTS esPYLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esPYLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-SV.h b/reactos/base/setup/usetup/lang/es-SV.h index d2f96b73715..18a8c9c4f93 100644 --- a/reactos/base/setup/usetup/lang/es-SV.h +++ b/reactos/base/setup/usetup/lang/es-SV.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_SV_H__ -#define LANG_ES_SV_H__ +#pragma once MUI_LAYOUTS esSVLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esSVLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-UY.h b/reactos/base/setup/usetup/lang/es-UY.h index b8ae8d1780c..a007b24c39f 100644 --- a/reactos/base/setup/usetup/lang/es-UY.h +++ b/reactos/base/setup/usetup/lang/es-UY.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_UY_H__ -#define LANG_ES_UY_H__ +#pragma once MUI_LAYOUTS esUYLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esUYLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/es-VE.h b/reactos/base/setup/usetup/lang/es-VE.h index 57cca1d66bb..46baa1c6f0b 100644 --- a/reactos/base/setup/usetup/lang/es-VE.h +++ b/reactos/base/setup/usetup/lang/es-VE.h @@ -1,5 +1,4 @@ -#ifndef LANG_ES_VE_H__ -#define LANG_ES_VE_H__ +#pragma once MUI_LAYOUTS esVELayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS esVELayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/et-EE.h b/reactos/base/setup/usetup/lang/et-EE.h index 29bbd51ca6e..4a1f7bda62b 100644 --- a/reactos/base/setup/usetup/lang/et-EE.h +++ b/reactos/base/setup/usetup/lang/et-EE.h @@ -1,5 +1,4 @@ -#ifndef LANG_ET_EE_H__ -#define LANG_ET_EE_H__ +#pragma once MUI_LAYOUTS etEELayouts[] = { @@ -1691,5 +1690,3 @@ MUI_STRING etEEStrings[] = "Klaviatuuriasetuste lisamine"}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/eu-ES.h b/reactos/base/setup/usetup/lang/eu-ES.h index ae9dd39a540..1bc40cf3f96 100644 --- a/reactos/base/setup/usetup/lang/eu-ES.h +++ b/reactos/base/setup/usetup/lang/eu-ES.h @@ -1,5 +1,4 @@ -#ifndef LANG_EU_ES_H__ -#define LANG_EU_ES_H__ +#pragma once MUI_LAYOUTS euESLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS euESLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/fa-IR.h b/reactos/base/setup/usetup/lang/fa-IR.h index 219ae1c4db8..626f2bf969e 100644 --- a/reactos/base/setup/usetup/lang/fa-IR.h +++ b/reactos/base/setup/usetup/lang/fa-IR.h @@ -1,5 +1,4 @@ -#ifndef LANG_FA_IR_H__ -#define LANG_FA_IR_H__ +#pragma once MUI_LAYOUTS faIRLayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS faIRLayouts[] = { L"0429", L"00000401" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/fi-FI.h b/reactos/base/setup/usetup/lang/fi-FI.h index db363d7b1e1..096db150de0 100644 --- a/reactos/base/setup/usetup/lang/fi-FI.h +++ b/reactos/base/setup/usetup/lang/fi-FI.h @@ -1,5 +1,4 @@ -#ifndef LANG_FI_FI_H__ -#define LANG_FI_FI_H__ +#pragma once MUI_LAYOUTS fiFILayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS fiFILayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/fo-FO.h b/reactos/base/setup/usetup/lang/fo-FO.h index cede112ea52..01b190b0d17 100644 --- a/reactos/base/setup/usetup/lang/fo-FO.h +++ b/reactos/base/setup/usetup/lang/fo-FO.h @@ -1,5 +1,4 @@ -#ifndef LANG_FO_FO_H__ -#define LANG_FO_FO_H__ +#pragma once MUI_LAYOUTS foFOLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS foFOLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/fr-BE.h b/reactos/base/setup/usetup/lang/fr-BE.h index cee512f6fbb..994e4dd75bd 100644 --- a/reactos/base/setup/usetup/lang/fr-BE.h +++ b/reactos/base/setup/usetup/lang/fr-BE.h @@ -1,5 +1,4 @@ -#ifndef LANG_FR_BE_H__ -#define LANG_FR_BE_H__ +#pragma once MUI_LAYOUTS frBELayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS frBELayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/fr-CA.h b/reactos/base/setup/usetup/lang/fr-CA.h index e0ff26a5d91..918a421f741 100644 --- a/reactos/base/setup/usetup/lang/fr-CA.h +++ b/reactos/base/setup/usetup/lang/fr-CA.h @@ -1,5 +1,4 @@ -#ifndef LANG_FR_CA_H__ -#define LANG_FR_CA_H__ +#pragma once MUI_LAYOUTS frCALayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS frCALayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/fr-CH.h b/reactos/base/setup/usetup/lang/fr-CH.h index c6e2378ffd7..8b083c1bcad 100644 --- a/reactos/base/setup/usetup/lang/fr-CH.h +++ b/reactos/base/setup/usetup/lang/fr-CH.h @@ -1,5 +1,4 @@ -#ifndef LANG_FR_CH_H__ -#define LANG_FR_CH_H__ +#pragma once MUI_LAYOUTS frCHLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS frCHLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/fr-FR.h b/reactos/base/setup/usetup/lang/fr-FR.h index 9bea8230836..ae037aba25f 100644 --- a/reactos/base/setup/usetup/lang/fr-FR.h +++ b/reactos/base/setup/usetup/lang/fr-FR.h @@ -1,5 +1,4 @@ -#ifndef LANG_FR_FR_H__ -#define LANG_FR_FR_H__ +#pragma once MUI_LAYOUTS frFRLayouts[] = { @@ -1707,5 +1706,3 @@ MUI_STRING frFRStrings[] = "Adding keyboard layouts"}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/fr-LU.h b/reactos/base/setup/usetup/lang/fr-LU.h index 0a50dbdd121..18fb3a7d623 100644 --- a/reactos/base/setup/usetup/lang/fr-LU.h +++ b/reactos/base/setup/usetup/lang/fr-LU.h @@ -1,5 +1,4 @@ -#ifndef LANG_FR_LU_H__ -#define LANG_FR_LU_H__ +#pragma once MUI_LAYOUTS frLULayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS frLULayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/fr-MC.h b/reactos/base/setup/usetup/lang/fr-MC.h index 6e564feae00..1720d0a5fce 100644 --- a/reactos/base/setup/usetup/lang/fr-MC.h +++ b/reactos/base/setup/usetup/lang/fr-MC.h @@ -1,5 +1,4 @@ -#ifndef LANG_FR_MC_H__ -#define LANG_FR_MC_H__ +#pragma once MUI_LAYOUTS frMCLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS frMCLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/gl-ES.h b/reactos/base/setup/usetup/lang/gl-ES.h index 35dcf5ec1f2..31acfd370cf 100644 --- a/reactos/base/setup/usetup/lang/gl-ES.h +++ b/reactos/base/setup/usetup/lang/gl-ES.h @@ -1,5 +1,4 @@ -#ifndef LANG_GL_ES_H__ -#define LANG_GL_ES_H__ +#pragma once MUI_LAYOUTS glESLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS glESLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/gu-IN.h b/reactos/base/setup/usetup/lang/gu-IN.h index 5443e1dc3ec..c0cb2cbf21a 100644 --- a/reactos/base/setup/usetup/lang/gu-IN.h +++ b/reactos/base/setup/usetup/lang/gu-IN.h @@ -1,5 +1,4 @@ -#ifndef LANG_GU_IN_H__ -#define LANG_GU_IN_H__ +#pragma once MUI_LAYOUTS guINLayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS guINLayouts[] = { L"0439", L"00000439" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/he-IL.h b/reactos/base/setup/usetup/lang/he-IL.h index c981fe70b02..9c18824630c 100644 --- a/reactos/base/setup/usetup/lang/he-IL.h +++ b/reactos/base/setup/usetup/lang/he-IL.h @@ -1,5 +1,4 @@ -#ifndef LANG_HE_IL_H__ -#define LANG_HE_IL_H__ +#pragma once MUI_LAYOUTS heILLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS heILLayouts[] = { L"040D", L"0000040D" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/hi-IN.h b/reactos/base/setup/usetup/lang/hi-IN.h index b01731728fb..caf0c3d8917 100644 --- a/reactos/base/setup/usetup/lang/hi-IN.h +++ b/reactos/base/setup/usetup/lang/hi-IN.h @@ -1,5 +1,4 @@ -#ifndef LANG_HI_IN_H__ -#define LANG_HI_IN_H__ +#pragma once MUI_LAYOUTS hiINLayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS hiINLayouts[] = { L"0439", L"00000439" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/hr-HR.h b/reactos/base/setup/usetup/lang/hr-HR.h index 8622ea5339b..33a62e2873b 100644 --- a/reactos/base/setup/usetup/lang/hr-HR.h +++ b/reactos/base/setup/usetup/lang/hr-HR.h @@ -1,5 +1,4 @@ -#ifndef LANG_HR_HR_H__ -#define LANG_HR_HR_H__ +#pragma once MUI_LAYOUTS hrHRLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS hrHRLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/hu-HU.h b/reactos/base/setup/usetup/lang/hu-HU.h index fc57399808d..a59208b6bb8 100644 --- a/reactos/base/setup/usetup/lang/hu-HU.h +++ b/reactos/base/setup/usetup/lang/hu-HU.h @@ -1,5 +1,4 @@ -#ifndef LANG_HU_HU_H__ -#define LANG_HU_HU_H__ +#pragma once MUI_LAYOUTS huHULayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS huHULayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/hy-AM.h b/reactos/base/setup/usetup/lang/hy-AM.h index 8499622fd3c..249c6d67c53 100644 --- a/reactos/base/setup/usetup/lang/hy-AM.h +++ b/reactos/base/setup/usetup/lang/hy-AM.h @@ -1,5 +1,4 @@ -#ifndef LANG_HY_AM_H__ -#define LANG_HY_AM_H__ +#pragma once MUI_LAYOUTS hyAMLayouts[] = { @@ -9,5 +8,3 @@ MUI_LAYOUTS hyAMLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/id-ID.h b/reactos/base/setup/usetup/lang/id-ID.h index 2346f239152..0cd4cebfa94 100644 --- a/reactos/base/setup/usetup/lang/id-ID.h +++ b/reactos/base/setup/usetup/lang/id-ID.h @@ -1,5 +1,4 @@ -#ifndef LANG_ID_ID_H__ -#define LANG_ID_ID_H__ +#pragma once MUI_LAYOUTS idIDLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS idIDLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/is-IS.h b/reactos/base/setup/usetup/lang/is-IS.h index e23d530f496..aad013eab52 100644 --- a/reactos/base/setup/usetup/lang/is-IS.h +++ b/reactos/base/setup/usetup/lang/is-IS.h @@ -1,5 +1,4 @@ -#ifndef LANG_IS_IS_H__ -#define LANG_IS_IS_H__ +#pragma once MUI_LAYOUTS isISLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS isISLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/it-CH.h b/reactos/base/setup/usetup/lang/it-CH.h index f0cbd7c4f83..eb6748bd4bf 100644 --- a/reactos/base/setup/usetup/lang/it-CH.h +++ b/reactos/base/setup/usetup/lang/it-CH.h @@ -1,5 +1,4 @@ -#ifndef LANG_IT_CH_H__ -#define LANG_IT_CH_H__ +#pragma once MUI_LAYOUTS itCHLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS itCHLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/it-IT.h b/reactos/base/setup/usetup/lang/it-IT.h index 56f73a76890..21d3d8990bf 100644 --- a/reactos/base/setup/usetup/lang/it-IT.h +++ b/reactos/base/setup/usetup/lang/it-IT.h @@ -1,5 +1,4 @@ -#ifndef LANG_IT_IT_H__ -#define LANG_IT_IT_H__ +#pragma once MUI_LAYOUTS itITLayouts[] = { @@ -1695,5 +1694,3 @@ MUI_STRING itITStrings[] = "Aggiunta delle nazionalit di tastiera"}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ja-JP.h b/reactos/base/setup/usetup/lang/ja-JP.h index c444450ac62..af7ccdf2a7e 100644 --- a/reactos/base/setup/usetup/lang/ja-JP.h +++ b/reactos/base/setup/usetup/lang/ja-JP.h @@ -1,5 +1,4 @@ -#ifndef LANG_JA_JP_H__ -#define LANG_JA_JP_H__ +#pragma once MUI_LAYOUTS jaJPLayouts[] = { @@ -1694,5 +1693,3 @@ MUI_STRING jaJPStrings[] = "ް ڲ ² "}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ka-GE.h b/reactos/base/setup/usetup/lang/ka-GE.h index 1c90f06b12b..c1036087b82 100644 --- a/reactos/base/setup/usetup/lang/ka-GE.h +++ b/reactos/base/setup/usetup/lang/ka-GE.h @@ -1,5 +1,4 @@ -#ifndef LANG_KA_GE_H__ -#define LANG_KA_GE_H__ +#pragma once MUI_LAYOUTS kaGELayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS kaGELayouts[] = { L"0419", L"00000419" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/kk-KZ.h b/reactos/base/setup/usetup/lang/kk-KZ.h index 64d7e297fe7..86723663b94 100644 --- a/reactos/base/setup/usetup/lang/kk-KZ.h +++ b/reactos/base/setup/usetup/lang/kk-KZ.h @@ -1,5 +1,4 @@ -#ifndef LANG_KK_KZ_H__ -#define LANG_KK_KZ_H__ +#pragma once MUI_LAYOUTS kkKZLayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS kkKZLayouts[] = { L"0419", L"00000419" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/kn-IN.h b/reactos/base/setup/usetup/lang/kn-IN.h index 241ff8700cc..1441331ed5e 100644 --- a/reactos/base/setup/usetup/lang/kn-IN.h +++ b/reactos/base/setup/usetup/lang/kn-IN.h @@ -1,5 +1,4 @@ -#ifndef LANG_KN_IN_H__ -#define LANG_KN_IN_H__ +#pragma once MUI_LAYOUTS knINLayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS knINLayouts[] = { L"0439", L"00010439" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ko-KR.h b/reactos/base/setup/usetup/lang/ko-KR.h index 4f805a88f22..799ae3ab1f1 100644 --- a/reactos/base/setup/usetup/lang/ko-KR.h +++ b/reactos/base/setup/usetup/lang/ko-KR.h @@ -1,5 +1,4 @@ -#ifndef LANG_KO_KR_H__ -#define LANG_KO_KR_H__ +#pragma once MUI_LAYOUTS koKRLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS koKRLayouts[] = { L"0412", L"00000412" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/kok-IN.h b/reactos/base/setup/usetup/lang/kok-IN.h index ea9b692a2fa..cbfcab3437a 100644 --- a/reactos/base/setup/usetup/lang/kok-IN.h +++ b/reactos/base/setup/usetup/lang/kok-IN.h @@ -1,5 +1,4 @@ -#ifndef LANG_KOK_IN_H__ -#define LANG_KOK_IN_H__ +#pragma once MUI_LAYOUTS kokINLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS kokINLayouts[] = { L"0457", L"00000439" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ky-KG.h b/reactos/base/setup/usetup/lang/ky-KG.h index b6571f61f88..e71b40cf2e9 100644 --- a/reactos/base/setup/usetup/lang/ky-KG.h +++ b/reactos/base/setup/usetup/lang/ky-KG.h @@ -1,5 +1,4 @@ -#ifndef LANG_KY_KG_H__ -#define LANG_KY_KG_H__ +#pragma once MUI_LAYOUTS kyKGLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS kyKGLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/lt-LT.h b/reactos/base/setup/usetup/lang/lt-LT.h index 7d455c2634c..a0a9eb485bf 100644 --- a/reactos/base/setup/usetup/lang/lt-LT.h +++ b/reactos/base/setup/usetup/lang/lt-LT.h @@ -7,8 +7,7 @@ * DATE: 2008-01-06 */ -#ifndef LANG_LT_LT_H__ -#define LANG_LT_LT_H__ +#pragma once MUI_LAYOUTS ltLTLayouts[] = { @@ -1704,5 +1703,3 @@ MUI_STRING ltLTStrings[] = "Adding keyboard layouts"}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/lv-LV.h b/reactos/base/setup/usetup/lang/lv-LV.h index 23ca79b96ab..8371a2369bd 100644 --- a/reactos/base/setup/usetup/lang/lv-LV.h +++ b/reactos/base/setup/usetup/lang/lv-LV.h @@ -1,10 +1,7 @@ -#ifndef LANG_LV_LV_H__ -#define LANG_LV_LV_H__ +#pragma once MUI_LAYOUTS lvLVLayouts[] = { { L"0426", L"00010426" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/mk-MK.h b/reactos/base/setup/usetup/lang/mk-MK.h index 1405f6438c0..4acab642d53 100644 --- a/reactos/base/setup/usetup/lang/mk-MK.h +++ b/reactos/base/setup/usetup/lang/mk-MK.h @@ -1,5 +1,4 @@ -#ifndef LANG_MK_MK_H__ -#define LANG_MK_MK_H__ +#pragma once MUI_LAYOUTS mkMKLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS mkMKLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/mn-MN.h b/reactos/base/setup/usetup/lang/mn-MN.h index f503f99c53b..6dec34de4c3 100644 --- a/reactos/base/setup/usetup/lang/mn-MN.h +++ b/reactos/base/setup/usetup/lang/mn-MN.h @@ -1,5 +1,4 @@ -#ifndef LANG_MN_MN_H__ -#define LANG_MN_MN_H__ +#pragma once MUI_LAYOUTS mnMNLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS mnMNLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/mr-IN.h b/reactos/base/setup/usetup/lang/mr-IN.h index 58840e927bd..ff2e09ba19d 100644 --- a/reactos/base/setup/usetup/lang/mr-IN.h +++ b/reactos/base/setup/usetup/lang/mr-IN.h @@ -1,5 +1,4 @@ -#ifndef LANG_MR_IN_H__ -#define LANG_MR_IN_H__ +#pragma once MUI_LAYOUTS mrINLayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS mrINLayouts[] = { L"044E", L"00000439" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ms-BN.h b/reactos/base/setup/usetup/lang/ms-BN.h index 24ef23d8cbe..e0563c8665b 100644 --- a/reactos/base/setup/usetup/lang/ms-BN.h +++ b/reactos/base/setup/usetup/lang/ms-BN.h @@ -1,10 +1,7 @@ -#ifndef LANG_MS_BN_H__ -#define LANG_MS_BN_H__ +#pragma once MUI_LAYOUTS msBNLayouts[] = { { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ms-MY.h b/reactos/base/setup/usetup/lang/ms-MY.h index 1abc1a33039..646eb6a90f9 100644 --- a/reactos/base/setup/usetup/lang/ms-MY.h +++ b/reactos/base/setup/usetup/lang/ms-MY.h @@ -1,10 +1,7 @@ -#ifndef LANG_MS_MY_H__ -#define LANG_MS_MY_H__ +#pragma once MUI_LAYOUTS msMYLayouts[] = { { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/my-MM.h b/reactos/base/setup/usetup/lang/my-MM.h index f02d95e26b1..9b732ad7a92 100644 --- a/reactos/base/setup/usetup/lang/my-MM.h +++ b/reactos/base/setup/usetup/lang/my-MM.h @@ -1,5 +1,4 @@ -#ifndef LANG_MY_MM_H__ -#define LANG_MY_MM_H__ +#pragma once MUI_LAYOUTS myMMLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS myMMLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/nl-BE.h b/reactos/base/setup/usetup/lang/nl-BE.h index 233697b42c0..ebf61e67f81 100644 --- a/reactos/base/setup/usetup/lang/nl-BE.h +++ b/reactos/base/setup/usetup/lang/nl-BE.h @@ -1,5 +1,4 @@ -#ifndef LANG_NL_BE_H__ -#define LANG_NL_BE_H__ +#pragma once MUI_LAYOUTS nlBELayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS nlBELayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/nl-NL.h b/reactos/base/setup/usetup/lang/nl-NL.h index 484b7ead78f..eba2d93ad5c 100644 --- a/reactos/base/setup/usetup/lang/nl-NL.h +++ b/reactos/base/setup/usetup/lang/nl-NL.h @@ -1,5 +1,4 @@ -#ifndef LANG_NL_NL_H__ -#define LANG_NL_NL_H__ +#pragma once MUI_LAYOUTS nlNLLayouts[] = { @@ -1722,6 +1721,3 @@ MUI_STRING nlNLStrings[] = "Toevoegen toetsenbord indelingen"}, {0, 0} }; - - -#endif diff --git a/reactos/base/setup/usetup/lang/nn-NO.h b/reactos/base/setup/usetup/lang/nn-NO.h index 4032b676814..8597b7405eb 100644 --- a/reactos/base/setup/usetup/lang/nn-NO.h +++ b/reactos/base/setup/usetup/lang/nn-NO.h @@ -1,5 +1,4 @@ -#ifndef LANG_NN_NO_H__ -#define LANG_NN_NO_H__ +#pragma once MUI_LAYOUTS nnNOLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS nnNOLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/pa-IN.h b/reactos/base/setup/usetup/lang/pa-IN.h index 44be5985a03..44cc3c30e6b 100644 --- a/reactos/base/setup/usetup/lang/pa-IN.h +++ b/reactos/base/setup/usetup/lang/pa-IN.h @@ -1,5 +1,4 @@ -#ifndef LANG_PA_IN_H__ -#define LANG_PA_IN_H__ +#pragma once MUI_LAYOUTS paINLayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS paINLayouts[] = { L"0439", L"00010439" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/pl-PL.h b/reactos/base/setup/usetup/lang/pl-PL.h index dde0dbdc8c3..8d4262d58cd 100644 --- a/reactos/base/setup/usetup/lang/pl-PL.h +++ b/reactos/base/setup/usetup/lang/pl-PL.h @@ -5,8 +5,7 @@ * IRC: irc.freenode.net #reactos-pl; */ -#ifndef LANG_PL_PL_H__ -#define LANG_PL_PL_H__ +#pragma once MUI_LAYOUTS plPLLayouts[] = { @@ -1703,5 +1702,3 @@ MUI_STRING plPLStrings[] = "Dodawanie ukadw klawiatury"}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/pt-BR.h b/reactos/base/setup/usetup/lang/pt-BR.h index f1623f9fa8f..6c545ad785a 100644 --- a/reactos/base/setup/usetup/lang/pt-BR.h +++ b/reactos/base/setup/usetup/lang/pt-BR.h @@ -1,5 +1,4 @@ -#ifndef LANG_PT_BR_H__ -#define LANG_PT_BR_H__ +#pragma once MUI_LAYOUTS ptBRLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS ptBRLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/pt-PT.h b/reactos/base/setup/usetup/lang/pt-PT.h index 6ca8d287221..6faf386505c 100644 --- a/reactos/base/setup/usetup/lang/pt-PT.h +++ b/reactos/base/setup/usetup/lang/pt-PT.h @@ -1,5 +1,4 @@ -#ifndef LANG_PT_PT_H__ -#define LANG_PT_PT_H__ +#pragma once MUI_LAYOUTS ptPTLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS ptPTLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/rm-CH.h b/reactos/base/setup/usetup/lang/rm-CH.h index 62e9e753116..d36a5e632df 100644 --- a/reactos/base/setup/usetup/lang/rm-CH.h +++ b/reactos/base/setup/usetup/lang/rm-CH.h @@ -1,5 +1,4 @@ -#ifndef LANG_RM_CH_H__ -#define LANG_RM_CH_H__ +#pragma once MUI_LAYOUTS rmCHLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS rmCHLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ro-RO.h b/reactos/base/setup/usetup/lang/ro-RO.h index 8ee875b2585..f8f17441a26 100644 --- a/reactos/base/setup/usetup/lang/ro-RO.h +++ b/reactos/base/setup/usetup/lang/ro-RO.h @@ -1,5 +1,4 @@ -#ifndef LANG_RO_RO_H__ -#define LANG_RO_RO_H__ +#pragma once MUI_LAYOUTS roROLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS roROLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ru-RU.h b/reactos/base/setup/usetup/lang/ru-RU.h index ea25d6c10aa..7e55b9700bb 100644 --- a/reactos/base/setup/usetup/lang/ru-RU.h +++ b/reactos/base/setup/usetup/lang/ru-RU.h @@ -1,5 +1,4 @@ -#ifndef LANG_RU_RU_H__ -#define LANG_RU_RU_H__ +#pragma once MUI_LAYOUTS ruRULayouts[] = { @@ -1695,5 +1694,3 @@ MUI_STRING ruRUStrings[] = "Adding keyboard layouts"}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/sa-IN.h b/reactos/base/setup/usetup/lang/sa-IN.h index b186ff42fc9..8d8442dcb72 100644 --- a/reactos/base/setup/usetup/lang/sa-IN.h +++ b/reactos/base/setup/usetup/lang/sa-IN.h @@ -1,5 +1,4 @@ -#ifndef LANG_SA_IN_H__ -#define LANG_SA_IN_H__ +#pragma once MUI_LAYOUTS saINLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS saINLayouts[] = { L"044F", L"00000439" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/sk-SK.h b/reactos/base/setup/usetup/lang/sk-SK.h index 76596451626..5078f08139f 100644 --- a/reactos/base/setup/usetup/lang/sk-SK.h +++ b/reactos/base/setup/usetup/lang/sk-SK.h @@ -4,8 +4,7 @@ * LastChange: 01-11-2009 */ -#ifndef LANG_SK_SK_H__ -#define LANG_SK_SK_H__ +#pragma once MUI_LAYOUTS skSKLayouts[] = { @@ -1705,5 +1704,3 @@ MUI_STRING skSKStrings[] = "Pridvam rozloenia klvesnice"}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/sl-SI.h b/reactos/base/setup/usetup/lang/sl-SI.h index 9278ee7d728..29a0133383c 100644 --- a/reactos/base/setup/usetup/lang/sl-SI.h +++ b/reactos/base/setup/usetup/lang/sl-SI.h @@ -1,5 +1,4 @@ -#ifndef LANG_SL_SI_H__ -#define LANG_SL_SI_H__ +#pragma once MUI_LAYOUTS slSILayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS slSILayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/sq-AL.h b/reactos/base/setup/usetup/lang/sq-AL.h index 74afcc3dff2..21027ea9166 100644 --- a/reactos/base/setup/usetup/lang/sq-AL.h +++ b/reactos/base/setup/usetup/lang/sq-AL.h @@ -1,5 +1,4 @@ -#ifndef LANG_SQ_AL_H__ -#define LANG_SQ_AL_H__ +#pragma once MUI_LAYOUTS sqALLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS sqALLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/sr-SP.h b/reactos/base/setup/usetup/lang/sr-SP.h index 0a2d81a8028..022248a7fbf 100644 --- a/reactos/base/setup/usetup/lang/sr-SP.h +++ b/reactos/base/setup/usetup/lang/sr-SP.h @@ -1,5 +1,4 @@ -#ifndef LANG_SR_SP_H__ -#define LANG_SR_SP_H__ +#pragma once MUI_LAYOUTS srSPLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS srSPLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/sv-FI.h b/reactos/base/setup/usetup/lang/sv-FI.h index b377d7f7e05..c90085576e9 100644 --- a/reactos/base/setup/usetup/lang/sv-FI.h +++ b/reactos/base/setup/usetup/lang/sv-FI.h @@ -1,5 +1,4 @@ -#ifndef LANG_SV_FI_H__ -#define LANG_SV_FI_H__ +#pragma once MUI_LAYOUTS svFILayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS svFILayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/sv-SE.h b/reactos/base/setup/usetup/lang/sv-SE.h index df25e299e7d..0dbffdc453c 100644 --- a/reactos/base/setup/usetup/lang/sv-SE.h +++ b/reactos/base/setup/usetup/lang/sv-SE.h @@ -1,5 +1,4 @@ -#ifndef LANG_SV_SE_H__ -#define LANG_SV_SE_H__ +#pragma once MUI_LAYOUTS svSELayouts[] = { @@ -1694,5 +1693,3 @@ MUI_STRING svSEStrings[] = "Adding keyboard layouts"}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/sw-KE.h b/reactos/base/setup/usetup/lang/sw-KE.h index c73f07d2e7d..3a58152f154 100644 --- a/reactos/base/setup/usetup/lang/sw-KE.h +++ b/reactos/base/setup/usetup/lang/sw-KE.h @@ -1,10 +1,7 @@ -#ifndef LANG_SW_KE_H__ -#define LANG_SW_KE_H__ +#pragma once MUI_LAYOUTS swKELayouts[] = { { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/syr-SY.h b/reactos/base/setup/usetup/lang/syr-SY.h index 02435a2a520..0a5f91cc4ba 100644 --- a/reactos/base/setup/usetup/lang/syr-SY.h +++ b/reactos/base/setup/usetup/lang/syr-SY.h @@ -1,5 +1,4 @@ -#ifndef LANG_SYR_SY_H__ -#define LANG_SYR_SY_H__ +#pragma once MUI_LAYOUTS syrSYLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS syrSYLayouts[] = { L"045A", L"0000045A" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ta-IN.h b/reactos/base/setup/usetup/lang/ta-IN.h index a111ada8c02..9322299c4c4 100644 --- a/reactos/base/setup/usetup/lang/ta-IN.h +++ b/reactos/base/setup/usetup/lang/ta-IN.h @@ -1,5 +1,4 @@ -#ifndef LANG_TA_IN_H__ -#define LANG_TA_IN_H__ +#pragma once MUI_LAYOUTS taINLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS taINLayouts[] = { L"0449", L"00000449" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/te-IN.h b/reactos/base/setup/usetup/lang/te-IN.h index b9072ed9c03..cd80fcc4429 100644 --- a/reactos/base/setup/usetup/lang/te-IN.h +++ b/reactos/base/setup/usetup/lang/te-IN.h @@ -1,5 +1,4 @@ -#ifndef LANG_TE_IN_H__ -#define LANG_TE_IN_H__ +#pragma once MUI_LAYOUTS teINLayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS teINLayouts[] = { L"0439", L"00010439" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/th-TH.h b/reactos/base/setup/usetup/lang/th-TH.h index a0f855fa076..6f50c4217d9 100644 --- a/reactos/base/setup/usetup/lang/th-TH.h +++ b/reactos/base/setup/usetup/lang/th-TH.h @@ -1,5 +1,4 @@ -#ifndef LANG_TH_TH_H__ -#define LANG_TH_TH_H__ +#pragma once MUI_LAYOUTS thTHLayouts[] = { @@ -10,5 +9,3 @@ MUI_LAYOUTS thTHLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/tr-TR.h b/reactos/base/setup/usetup/lang/tr-TR.h index 0920ad02d26..a3c2db5a153 100644 --- a/reactos/base/setup/usetup/lang/tr-TR.h +++ b/reactos/base/setup/usetup/lang/tr-TR.h @@ -1,5 +1,4 @@ -#ifndef LANG_TR_TR_H__ -#define LANG_TR_TR_H__ +#pragma once MUI_LAYOUTS trTRLayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS trTRLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/tt-TA.h b/reactos/base/setup/usetup/lang/tt-TA.h index 93665c43068..b54ebfdc0ba 100644 --- a/reactos/base/setup/usetup/lang/tt-TA.h +++ b/reactos/base/setup/usetup/lang/tt-TA.h @@ -1,5 +1,4 @@ -#ifndef LANG_TT_TA_H__ -#define LANG_TT_TA_H__ +#pragma once MUI_LAYOUTS ttTALayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS ttTALayouts[] = { L"0419", L"00000419" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/uk-UA.h b/reactos/base/setup/usetup/lang/uk-UA.h index e331c0c1a2e..ba3fd009623 100644 --- a/reactos/base/setup/usetup/lang/uk-UA.h +++ b/reactos/base/setup/usetup/lang/uk-UA.h @@ -3,8 +3,7 @@ * http://www.reactos.org/uk/ */ -#ifndef LANG_UK_UA_H__ -#define LANG_UK_UA_H__ +#pragma once MUI_LAYOUTS ukUALayouts[] = { @@ -1700,5 +1699,3 @@ MUI_STRING ukUAStrings[] = " ஧ i"}, {0, 0} }; - -#endif diff --git a/reactos/base/setup/usetup/lang/ur-PK.h b/reactos/base/setup/usetup/lang/ur-PK.h index b1129dee966..73beeee167b 100644 --- a/reactos/base/setup/usetup/lang/ur-PK.h +++ b/reactos/base/setup/usetup/lang/ur-PK.h @@ -1,5 +1,4 @@ -#ifndef LANG_UR_PK_H__ -#define LANG_UR_PK_H__ +#pragma once MUI_LAYOUTS urPKLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS urPKLayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/uz-UZ.h b/reactos/base/setup/usetup/lang/uz-UZ.h index 963c761be35..af15bb90dfb 100644 --- a/reactos/base/setup/usetup/lang/uz-UZ.h +++ b/reactos/base/setup/usetup/lang/uz-UZ.h @@ -1,5 +1,4 @@ -#ifndef LANG_UZ_UZ_H__ -#define LANG_UZ_UZ_H__ +#pragma once MUI_LAYOUTS uzUZLayouts[] = { @@ -8,5 +7,3 @@ MUI_LAYOUTS uzUZLayouts[] = { L"0419", L"00000419" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/vi-VN.h b/reactos/base/setup/usetup/lang/vi-VN.h index 9fed103cb5d..dfd3986f21c 100644 --- a/reactos/base/setup/usetup/lang/vi-VN.h +++ b/reactos/base/setup/usetup/lang/vi-VN.h @@ -1,5 +1,4 @@ -#ifndef LANG_VI_VN_H__ -#define LANG_VI_VN_H__ +#pragma once MUI_LAYOUTS viVNLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS viVNLayouts[] = { L"042A", L"0000042A" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/wa-BE.h b/reactos/base/setup/usetup/lang/wa-BE.h index fbaafe4d09a..7ec2c7861fc 100644 --- a/reactos/base/setup/usetup/lang/wa-BE.h +++ b/reactos/base/setup/usetup/lang/wa-BE.h @@ -1,5 +1,4 @@ -#ifndef LANG_WA_BE_H__ -#define LANG_WA_BE_H__ +#pragma once MUI_LAYOUTS waBELayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS waBELayouts[] = { L"0409", L"00000409" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/zh-CN.h b/reactos/base/setup/usetup/lang/zh-CN.h index 3a1271481c4..d538e74d92a 100644 --- a/reactos/base/setup/usetup/lang/zh-CN.h +++ b/reactos/base/setup/usetup/lang/zh-CN.h @@ -1,5 +1,4 @@ -#ifndef LANG_ZH_CN_H__ -#define LANG_ZH_CN_H__ +#pragma once MUI_LAYOUTS zhCNLayouts[] = { @@ -11,5 +10,3 @@ MUI_LAYOUTS zhCNLayouts[] = { L"0804", L"E0040804" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/zh-HK.h b/reactos/base/setup/usetup/lang/zh-HK.h index 5f99a9dce3b..82905a3a22d 100644 --- a/reactos/base/setup/usetup/lang/zh-HK.h +++ b/reactos/base/setup/usetup/lang/zh-HK.h @@ -1,5 +1,4 @@ -#ifndef LANG_ZH_HK_H__ -#define LANG_ZH_HK_H__ +#pragma once MUI_LAYOUTS zhHKLayouts[] = { @@ -7,5 +6,3 @@ MUI_LAYOUTS zhHKLayouts[] = { L"0C04", L"E0080404" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/zh-MO.h b/reactos/base/setup/usetup/lang/zh-MO.h index 6194ed3ad64..b12866fc0d2 100644 --- a/reactos/base/setup/usetup/lang/zh-MO.h +++ b/reactos/base/setup/usetup/lang/zh-MO.h @@ -1,5 +1,4 @@ -#ifndef LANG_ZH_MO_H__ -#define LANG_ZH_MO_H__ +#pragma once MUI_LAYOUTS zhMOLayouts[] = { @@ -9,5 +8,3 @@ MUI_LAYOUTS zhMOLayouts[] = { L"0404", L"E0080404" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/zh-SG.h b/reactos/base/setup/usetup/lang/zh-SG.h index 038762609ca..f59b1d98c49 100644 --- a/reactos/base/setup/usetup/lang/zh-SG.h +++ b/reactos/base/setup/usetup/lang/zh-SG.h @@ -1,5 +1,4 @@ -#ifndef LANG_ZH_SG_H__ -#define LANG_ZH_SG_H__ +#pragma once MUI_LAYOUTS zhSGLayouts[] = { @@ -10,5 +9,3 @@ MUI_LAYOUTS zhSGLayouts[] = { L"0804", L"E0040804" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/lang/zh-TW.h b/reactos/base/setup/usetup/lang/zh-TW.h index 384a844ef28..a1d3dad959c 100644 --- a/reactos/base/setup/usetup/lang/zh-TW.h +++ b/reactos/base/setup/usetup/lang/zh-TW.h @@ -1,5 +1,4 @@ -#ifndef LANG_ZH_TW_H__ -#define LANG_ZH_TW_H__ +#pragma once MUI_LAYOUTS zhTWLayouts[] = { @@ -9,5 +8,3 @@ MUI_LAYOUTS zhTWLayouts[] = { L"0404", L"E0010404" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/mui.h b/reactos/base/setup/usetup/mui.h index 61722e60612..cf0f718c2e4 100644 --- a/reactos/base/setup/usetup/mui.h +++ b/reactos/base/setup/usetup/mui.h @@ -1,5 +1,4 @@ -#ifndef MUI_H__ -#define MUI_H__ +#pragma once typedef struct { @@ -137,4 +136,3 @@ MUIGetString(ULONG Number); #define STRING_MB 54 #define STRING_GB 55 #define STRING_ADDKBLAYOUTS 56 -#endif diff --git a/reactos/base/setup/usetup/muifonts.h b/reactos/base/setup/usetup/muifonts.h index 399a7eb460d..18e707a7326 100644 --- a/reactos/base/setup/usetup/muifonts.h +++ b/reactos/base/setup/usetup/muifonts.h @@ -1,5 +1,4 @@ -#ifndef LANG_MUI_FONTS_H__ -#define LANG_MUI_FONTS_H__ +#pragma once MUI_SUBFONT LatinFonts[] = { @@ -88,5 +87,3 @@ MUI_SUBFONT UnicodeFonts[] = { L"Helv", L"DejaVu Sans" }, { NULL, NULL } }; - -#endif diff --git a/reactos/base/setup/usetup/muilanguages.h b/reactos/base/setup/usetup/muilanguages.h index 59b11591397..ebf404ac306 100644 --- a/reactos/base/setup/usetup/muilanguages.h +++ b/reactos/base/setup/usetup/muilanguages.h @@ -1,5 +1,4 @@ -#ifndef LANG_MUI_LANGUAGES_H__ -#define LANG_MUI_LANGUAGES_H__ +#pragma once #include "lang/af-ZA.h" #include "lang/ar-AE.h" @@ -281,5 +280,3 @@ const MUI_LANGUAGE LanguageList[] = {L"00000435", L"1252", L"850", L"10000", L"Zulu", L"1", enUSPages, enUSErrorEntries, enUSStrings, LatinFonts, enUSLayouts }, {NULL, NULL, NULL, NULL, NULL, NULL} }; - -#endif diff --git a/reactos/base/setup/usetup/native/host_native.h b/reactos/base/setup/usetup/native/host_native.h index 1ce410db9b2..207927c83eb 100644 --- a/reactos/base/setup/usetup/native/host_native.h +++ b/reactos/base/setup/usetup/native/host_native.h @@ -1,5 +1,4 @@ -#ifndef _HOST_NATIVE_H_ -#define _HOST_NATIVE_H_ +#pragma once #include "usetup.h" @@ -12,5 +11,3 @@ typedef struct #define SetupInitDefaultQueueCallback(a) NULL #define SetupDefaultQueueCallbackW(a, b, c, d) TRUE #define SetupTermDefaultQueueCallback(a) - -#endif /* _HOST_NATIVE_H_ */ diff --git a/reactos/base/setup/usetup/native/utils/console.h b/reactos/base/setup/usetup/native/utils/console.h index e58d4f7caaf..feb89829245 100644 --- a/reactos/base/setup/usetup/native/utils/console.h +++ b/reactos/base/setup/usetup/native/utils/console.h @@ -24,8 +24,7 @@ * PROGRAMMER: Eric Kohl */ -#ifndef _UTILS_CONSOLE_H_ -#define _UTILS_CONSOLE_H_ +#pragma once BOOL WINAPI AllocConsole(VOID); @@ -113,6 +112,4 @@ SetConsoleOutputCP( IN UINT wCodePageID ); -#endif /* _UTILS_CONSOLE_H_ */ - /* EOF */ diff --git a/reactos/base/setup/usetup/native/utils/keytrans.h b/reactos/base/setup/usetup/native/utils/keytrans.h index 8a63a1eeb70..cea1aef5ad3 100644 --- a/reactos/base/setup/usetup/native/utils/keytrans.h +++ b/reactos/base/setup/usetup/native/utils/keytrans.h @@ -23,14 +23,11 @@ * PROGRAMMER: Tinus */ -#ifndef __KEYTRANS_H__ -#define __KEYTRANS_H__ +#pragma once #include NTSTATUS IntTranslateKey(PKEYBOARD_INPUT_DATA InputData, KEY_EVENT_RECORD *Event); -#endif /* __KEYTRANS_H__ */ - /* EOF */ diff --git a/reactos/base/setup/usetup/partlist.c b/reactos/base/setup/usetup/partlist.c index ca0bdf7ae6a..5c553c2f537 100644 --- a/reactos/base/setup/usetup/partlist.c +++ b/reactos/base/setup/usetup/partlist.c @@ -846,10 +846,10 @@ AddDiskToList (HANDLE FileHandle, DiskEntry->SectorsPerTrack = DiskGeometry.SectorsPerTrack; DiskEntry->BytesPerSector = DiskGeometry.BytesPerSector; - DPRINT ("Cylinders %d\n", DiskEntry->Cylinders); - DPRINT ("TracksPerCylinder %d\n", DiskEntry->TracksPerCylinder); - DPRINT ("SectorsPerTrack %d\n", DiskEntry->SectorsPerTrack); - DPRINT ("BytesPerSector %d\n", DiskEntry->BytesPerSector); + DPRINT ("Cylinders %I64u\n", DiskEntry->Cylinders); + DPRINT ("TracksPerCylinder %I64u\n", DiskEntry->TracksPerCylinder); + DPRINT ("SectorsPerTrack %I64u\n", DiskEntry->SectorsPerTrack); + DPRINT ("BytesPerSector %I64u\n", DiskEntry->BytesPerSector); DiskEntry->TrackSize = (ULONGLONG)DiskGeometry.SectorsPerTrack * diff --git a/reactos/base/setup/usetup/partlist.h b/reactos/base/setup/usetup/partlist.h index 7d6f08813c4..ef3f4d2cbe0 100644 --- a/reactos/base/setup/usetup/partlist.h +++ b/reactos/base/setup/usetup/partlist.h @@ -23,8 +23,7 @@ * PROGRAMMER: Eric Kohl */ -#ifndef __PARTLIST_H__ -#define __PARTLIST_H__ +#pragma once /* We have to define it there, because it is not in the MS DDK */ #define PARTITION_EXT2 0x83 @@ -222,6 +221,4 @@ CheckForLinuxFdiskPartitions (PPARTLIST List); BOOLEAN WritePartitionsToDisk (PPARTLIST List); -#endif /* __PARTLIST_H__ */ - /* EOF */ diff --git a/reactos/base/setup/usetup/progress.h b/reactos/base/setup/usetup/progress.h index eda1f1ef0bd..53af83db6d9 100644 --- a/reactos/base/setup/usetup/progress.h +++ b/reactos/base/setup/usetup/progress.h @@ -24,9 +24,7 @@ * PROGRAMMER: Eric Kohl */ -#ifndef __PROGRESS_H__ -#define __PROGRESS_H__ - +#pragma once typedef struct _PROGRESS { @@ -75,6 +73,4 @@ VOID ProgressSetStep (PPROGRESSBAR Bar, ULONG Step); -#endif /* __PROGRESS_H__ */ - /* EOF */ diff --git a/reactos/base/setup/usetup/registry.h b/reactos/base/setup/usetup/registry.h index 0b41cd3ea12..d76470402d7 100644 --- a/reactos/base/setup/usetup/registry.h +++ b/reactos/base/setup/usetup/registry.h @@ -24,8 +24,7 @@ * PROGRAMMER: Eric Kohl */ -#ifndef __REGISTRY_H__ -#define __REGISTRY_H__ +#pragma once BOOLEAN ImportRegistryFile(PWSTR Filename, @@ -38,6 +37,4 @@ SetInstallPathValue(PUNICODE_STRING InstallPath); BOOLEAN SetMountedDeviceValue(CHAR Letter, ULONG Signature, LARGE_INTEGER StartingOffset); -#endif /* __REGISTRY_H__ */ - /* EOF */ diff --git a/reactos/base/setup/usetup/settings.h b/reactos/base/setup/usetup/settings.h index 5c6918e8049..65b59ef8aee 100644 --- a/reactos/base/setup/usetup/settings.h +++ b/reactos/base/setup/usetup/settings.h @@ -24,8 +24,7 @@ * PROGRAMMER: Eric Kohl */ -#ifndef __SETTINGS_H__ -#define __SETTINGS_H__ +#pragma once PGENERIC_LIST CreateComputerTypeList(HINF InfFile); @@ -66,6 +65,4 @@ ProcessKeyboardLayoutFiles(PGENERIC_LIST List); BOOLEAN SetGeoID(PWCHAR Id); -#endif /* __SETTINGS_H__ */ - /* EOF */ diff --git a/reactos/base/setup/usetup/usetup.h b/reactos/base/setup/usetup/usetup.h index 11c0819f6c4..ff7cf87fb84 100644 --- a/reactos/base/setup/usetup/usetup.h +++ b/reactos/base/setup/usetup/usetup.h @@ -24,8 +24,7 @@ * PROGRAMMER: Eric Kohl */ -#ifndef __USETUP_H__ -#define __USETUP_H__ +#pragma once /* C Headers */ #include @@ -123,12 +122,6 @@ typedef enum _PAGE_NUMBER #define POPUP_WAIT_ANY_KEY 1 #define POPUP_WAIT_ENTER 2 -#define ROUND_DOWN(n, align) \ - (((ULONG)n) & ~((align) - 1l)) - -#define ROUND_UP(n, align) \ - ROUND_DOWN(((ULONG)n) + (align) - 1, (align)) - #define LIST_FOR_EACH(elem, list, type, field) \ for ((elem) = CONTAINING_RECORD((list)->Flink, type, field); \ &(elem)->field != (list) || (elem == NULL); \ @@ -152,6 +145,4 @@ typedef enum _PAGE_NUMBER InsertTailList(current, &((NewEntry)->ListEntryField));\ } -#endif /* __USETUP_H__*/ - /* EOF */ diff --git a/reactos/base/setup/vmwinst/lang/de-DE.rc b/reactos/base/setup/vmwinst/lang/de-DE.rc index 67a0320d8f8..b66c13f0746 100644 --- a/reactos/base/setup/vmwinst/lang/de-DE.rc +++ b/reactos/base/setup/vmwinst/lang/de-DE.rc @@ -5,8 +5,8 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Grafiktreiberinstallation" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Das ReactOS Setup hat festgestellt, dass Sie ReactOS in VMware(r) installieren.", -1, 117, 8, 140, 24 - LTEXT "Wenn Sie den VMware(r) SVGA Treiber installieren mchten, klicken Sie auf 'Weiter', ansonsten auf 'Abbrechen'.", -1, 117, 140, 140, 24 + LTEXT "Das ReactOS-Setup hat festgestellt, dass Sie ReactOS in VMware(r) installieren.", -1, 117, 8, 140, 24 + LTEXT "Wenn Sie den VMware(r)-SVGA-Treiber installieren mchten, klicken Sie auf 'Weiter', ansonsten auf 'Abbrechen'.", -1, 117, 140, 140, 24 END IDD_INSERT_VMWARE_TOOLS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT @@ -14,7 +14,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Grafiktreiberinstallation" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "ReactOS wird nicht mit dem VMware(r) SVGA Treiber ausgeliefert.\n\nGehen Sie bitte auf 'VM' in der Menleiste von VMware(r) Workstation und whlen Sie 'VMware Tools installieren...'\n\n\nKlicken Sie auf 'Weiter' um fortzufahren, ansonsten auf 'Abbrechen'",-1,25,25,225,85 + LTEXT "ReactOS wird nicht mit dem VMware(r)-SVGA-Treiber ausgeliefert.\n\nGehen Sie bitte auf 'VM' in der Menleiste von VMware(r) Workstation und whlen Sie 'VMware Tools installieren...'\n\n\nKlicken Sie auf 'Weiter', um fortzufahren, ansonsten auf 'Abbrechen'",-1,25,25,225,85 END IDD_INSTALLING_VMWARE_TOOLS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT @@ -31,7 +31,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Grafiktreiberinstallation" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Der VMware(r) SVGA Treiber wurde erfolgreich installiert. Whlen Sie bitte Ihre Auflsung:",-1,25,5,225,20 + LTEXT "Der VMware(r)-SVGA-Treiber wurde erfolgreich installiert. Whlen Sie bitte Ihre Auflsung:",-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 @@ -52,7 +52,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Grafiktreiberinstallation" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Das ReactOS Setup konnte den VMware(r) SVGA Treiber nicht finden.\n\n\nKlicken Sie auf 'Fertigstellen' um mit der Installation fortzufahren",-1,25,25,225,85 + LTEXT "Das ReactOS-Setup konnte den VMware(r)-SVGA-Treiber nicht finden.\n\n\nKlicken Sie auf 'Fertigstellen', um mit der Installation fortzufahren",-1,25,25,225,85 END IDD_CHOOSEACTION DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT @@ -60,10 +60,10 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Grafiktreiberinstallation" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Der VMware(r) SVGA Treiber wurde schon installiert.\n\nWhlen Sie bitte eine der folgenden Optionen aus:",-1,25,5,225,30 + LTEXT "Der VMware(r)-SVGA-Treiber wurde schon installiert.\n\nWhlen Sie bitte eine der folgenden Optionen aus:",-1,25,5,225,30 PUSHBUTTON "Die Bildeinstellungen ndern", IDC_CONFIGSETTINGS, 25, 40, 200, 15, BS_AUTORADIOBUTTON PUSHBUTTON "Einen anderen Grafiktreiber benutzen", IDC_USEOTHERDRIVER, 25, 55, 200, 15, BS_AUTORADIOBUTTON - PUSHBUTTON "Den VMware(r) SVGA Treiber entfernen", IDC_UNINSTALL, 25, 70, 200, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "Den VMware(r)-SVGA-Treiber entfernen", IDC_UNINSTALL, 25, 70, 200, 15, BS_AUTORADIOBUTTON LTEXT "Klicken Sie auf 'Weiter' um fortzufahren oder 'Abbrechen' um den Asssistenten zu beenden.", -1, 25, 93, 225, 19 END @@ -73,9 +73,9 @@ CAPTION "Grafiktreiberinstallation" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "Whlen Sie bitte den Grafiktreiber aus, den Sie verwenden mchten:",-1,25,25,225,15 - PUSHBUTTON "ReactOS VGA Treiber", IDC_VGA, 25, 40, 225, 15, BS_AUTORADIOBUTTON - PUSHBUTTON "ReactOS VBE Treiber (SVGA)", IDC_VBE, 25, 55, 225, 15, BS_AUTORADIOBUTTON - LTEXT "Klicken Sie auf 'Fertigstellen' um die Installation fertigzustellen oder auf 'Abbrechen' um das Setup ohne Vernderungen zu beenden.", -1, 25, 93, 225, 20 + PUSHBUTTON "ReactOS-VGA-Treiber", IDC_VGA, 25, 40, 225, 15, BS_AUTORADIOBUTTON + PUSHBUTTON "ReactOS-VBE-Treiber (SVGA)", IDC_VBE, 25, 55, 225, 15, BS_AUTORADIOBUTTON + LTEXT "Klicken Sie auf 'Fertigstellen', um die Installation fertigzustellen, oder auf 'Abbrechen', um das Setup ohne Vernderungen zu beenden.", -1, 25, 93, 225, 20 END IDD_DOUNINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT @@ -83,48 +83,48 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Grafiktreiberinstallation" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Das ReactOS Setup wird Ihren VMware(r) SVGA Treiber entfernen!!!\n\n\nKlicken Sie auf 'Fertigstellen' um den Treiber zu entfernen oder auf 'Abbrechen' um ihn weiterhin zu verwenden.",-1,25,25,225,85 + LTEXT "Das ReactOS-Setup wird Ihren VMware(r)-SVGA-Treiber entfernen!!!\n\n\nKlicken Sie auf 'Fertigstellen', um den Treiber zu entfernen, oder auf 'Abbrechen', um ihn weiterhin zu verwenden.",-1,25,25,225,85 END STRINGTABLE BEGIN IDS_WIZARD_NAME "VMware(r) gefunden" - IDS_FAILEDTOLOCATEDRIVERS "Das ReactOS Setup konnte die bentigten Dateien nicht finden.\nStellen Sie sicher, dass sich die VMware-Tools CD in dem Laufwerk befindet." - IDS_FAILEDTOCOPYFILES "Das ReactOS Setup konnte die bentigten Dateien nicht kopieren.\nStellen Sie sicher, dass sich die VMware-Tools CD in dem Laufwerk befindet.\n" - IDS_FAILEDTOACTIVATEDRIVER "Fehler beim Aktivieren des VMware(r) SVGA Treibers!" - IDS_FAILEDTOSELVGADRIVER "Fehler beim Aktivieren des ReactOS VGA Treibers!" - IDS_FAILEDTOSELVBEDRIVER "Fehler beim Aktivieren des ReactOS VBE Treibers!" - IDS_UNINSTNOTICE "Die VMware(r) SVGA Treiber Dateien wurden noch nicht gelscht.\nLschen Sie sie bitte nach dem Neustart manuell." + IDS_FAILEDTOLOCATEDRIVERS "Das ReactOS-Setup konnte die bentigten Dateien nicht finden.\nStellen Sie sicher, dass sich die VMware-Tools-CD in dem Laufwerk befindet." + IDS_FAILEDTOCOPYFILES "Das ReactOS-Setup konnte die bentigten Dateien nicht kopieren.\nStellen Sie sicher, dass sich die VMware-Tools-CD in dem Laufwerk befindet.\n" + IDS_FAILEDTOACTIVATEDRIVER "Fehler beim Aktivieren des VMware(r)-SVGA-Treibers!" + IDS_FAILEDTOSELVGADRIVER "Fehler beim Aktivieren des ReactOS-VGA-Treibers!" + IDS_FAILEDTOSELVBEDRIVER "Fehler beim Aktivieren des ReactOS-VBE-Treibers!" + IDS_UNINSTNOTICE "Die VMware(r)-SVGA-Treiberdateien wurden noch nicht gelscht.\nLschen Sie sie bitte nach dem Neustart manuell." END STRINGTABLE BEGIN 10001 "Niedrigste (8BPP)" - 10002 "Mittelere (16BPP)" + 10002 "Mittlere (16BPP)" 10003 "Hchste (32BPP)" END STRINGTABLE BEGIN - IDS_SEARCHINGFORCDROM "Suche die VMware(r) Tools CD-ROM..." + IDS_SEARCHINGFORCDROM "Suche die VMware(r)-Tools-CD-ROM..." IDS_COPYINGFILES "Kopiere Dateien..." - IDS_ENABLINGDRIVER "Aktiviere den VMware(r) SVGA Treiber..." + IDS_ENABLINGDRIVER "Aktiviere den VMware(r)-SVGA-Treiber..." END STRINGTABLE BEGIN - IDD_INSERT_VMWARE_TOOLSTITLE "VMware(r) SVGA Treiber Installationsassistent" - IDD_INSERT_VMWARE_TOOLSSUBTITLE "Bitte legen Sie die VMware-Tool CD-ROM ein." - IDD_INSTALLING_VMWARE_TOOLSTITLE "VMware(r) SVGA Treiber Installationsassistent" - IDD_INSTALLING_VMWARE_TOOLSSUBTITLE "Suchen und kopieren des VMware(r) SVGA Treibers." - IDD_CONFIGTITLE "VMware(r) SVGA Treiber Installationsassistent" + IDD_INSERT_VMWARE_TOOLSTITLE "VMware(r)-SVGA-Treiber-Installationsassistent" + IDD_INSERT_VMWARE_TOOLSSUBTITLE "Bitte legen Sie die VMware-Tools-CD-ROM ein." + IDD_INSTALLING_VMWARE_TOOLSTITLE "VMware(r)-SVGA-Treiber-Installationsassistent" + IDD_INSTALLING_VMWARE_TOOLSSUBTITLE "Suchen und kopieren des VMware(r)-SVGA-Treibers." + IDD_CONFIGTITLE "VMware(r)-SVGA-Treiber-Installationsassistent" IDD_CONFIGSUBTITLE "Whlen Sie die Bildschirmauflsung aus." - IDD_INSTALLATION_FAILEDTITLE "VMware(r) SVGA Treiber Installationsassistent" - IDD_INSTALLATION_FAILEDSUBTITLE "Die VMware(r) SVGA Treiber installation ist fehlgeschlagen." - IDD_CHOOSEACTIONTITLE "VMware(r) SVGA Treiber Installationsassistent" + IDD_INSTALLATION_FAILEDTITLE "VMware(r)-SVGA-Treiber-Installationsassistent" + IDD_INSTALLATION_FAILEDSUBTITLE "Die VMware(r)-SVGA-Treiberinstallation ist fehlgeschlagen." + IDD_CHOOSEACTIONTITLE "VMware(r)-SVGA-Treiber-Installationsassistent" IDD_CHOOSEACTIONSUBTITLE "Whlen Sie eine Option aus." - IDD_SELECTDRIVERTITLE "VMware(r) SVGA Treiber Installationsassistent" + IDD_SELECTDRIVERTITLE "VMware(r)-SVGA-Treiber-Installationsassistent" IDD_SELECTDRIVERSUBTITLE "Whlen Sie einen Treiber aus." - IDD_DOUNINSTALLTITLE "VMware(r) SVGA Treiber Installationsassistent" - IDD_DOUNINSTALLSUBTITLE "De-Installieren des Treibers." + IDD_DOUNINSTALLTITLE "VMware(r)-SVGA-Treiber-Installationsassistent" + IDD_DOUNINSTALLSUBTITLE "Deinstallieren des Treibers." END diff --git a/reactos/base/setup/vmwinst/vmwinst.h b/reactos/base/setup/vmwinst/vmwinst.h index f0e9344a913..4fdb1014669 100644 --- a/reactos/base/setup/vmwinst/vmwinst.h +++ b/reactos/base/setup/vmwinst/vmwinst.h @@ -1,5 +1,4 @@ -#ifndef __VMWINST_H -#define __VMWINST_H +#pragma once #ifndef PSCB_BUTTONPRESSED #define PSCB_BUTTONPRESSED (3) @@ -67,5 +66,3 @@ #define IDD_SELECTDRIVERSUBTITLE 352 #define IDD_DOUNINSTALLTITLE 361 #define IDD_DOUNINSTALLSUBTITLE 362 - -#endif /* __VMWINST_H */ diff --git a/reactos/base/setup/welcome/lang/de-DE.rc b/reactos/base/setup/welcome/lang/de-DE.rc index 4e96578839e..63998b0b0b0 100644 --- a/reactos/base/setup/welcome/lang/de-DE.rc +++ b/reactos/base/setup/welcome/lang/de-DE.rc @@ -53,7 +53,7 @@ STRINGTABLE DISCARDABLE BEGIN IDS_TOPICDESC0 "Installiert ReactOS auf ihrem Computer oder aktualisiert eine bestehende Installation." IDS_TOPICDESC1 "Die ReactOS-CD durchsuchen." - IDS_TOPICDESC2 "Klicken Sie um dieses Programm zu beenden." + IDS_TOPICDESC2 "Klicken Sie, um dieses Programm zu beenden." // IDS_TOPICDESC3 "Topic description 3.\n\nDescribe topic 3 here." // IDS_TOPICDESC4 "Topic description 4.\n\nDescribe topic 4 here." // IDS_TOPICDESC5 "Topic description 5.\n\nDescribe topic 5 here." diff --git a/reactos/base/shell/cmd/batch.h b/reactos/base/shell/cmd/batch.h index c3a8a0bf4b5..841b09b814f 100644 --- a/reactos/base/shell/cmd/batch.h +++ b/reactos/base/shell/cmd/batch.h @@ -4,8 +4,7 @@ * */ -#ifndef _BATCH_H_INCLUDED_ -#define _BATCH_H_INCLUDED_ +#pragma once typedef struct tagBATCHCONTEXT { @@ -50,5 +49,3 @@ VOID ExitBatch (); INT Batch (LPTSTR, LPTSTR, LPTSTR, PARSED_COMMAND *); LPTSTR ReadBatchLine(); VOID AddBatchRedirection(REDIRECTION **); - -#endif /* _BATCH_H_INCLUDED_ */ diff --git a/reactos/base/shell/cmd/cmd.h b/reactos/base/shell/cmd/cmd.h index 5900e40ad5b..c6605de480f 100644 --- a/reactos/base/shell/cmd/cmd.h +++ b/reactos/base/shell/cmd/cmd.h @@ -21,8 +21,7 @@ * Thanks to Emanuele Aliberti! */ -#ifndef _CMD_H_INCLUDED_ -#define _CMD_H_INCLUDED_ +#pragma once #include "config.h" @@ -492,5 +491,3 @@ INT CommandWindow (LPTSTR); int cmd_if(TCHAR *); int cmd_pause(TCHAR *); int cmd_shift(TCHAR *); - -#endif /* _CMD_H_INCLUDED_ */ diff --git a/reactos/base/shell/cmd/config.h b/reactos/base/shell/cmd/config.h index 18e3093bfff..960f2ab40a4 100644 --- a/reactos/base/shell/cmd/config.h +++ b/reactos/base/shell/cmd/config.h @@ -9,8 +9,7 @@ * */ -#ifndef _CONFIG_H_INCLUDED_ -#define _CONFIG_H_INCLUDED_ +#pragma once #define WIN32_LEAN_AND_MEAN @@ -92,5 +91,3 @@ #ifdef NT4_INTERNAL_COMMANDS #define INCLUDE_CMD_WINDOW #endif - -#endif /* _CONFIG_H_INCLUDED_ */ diff --git a/reactos/base/shell/cmd/lang/de-DE.rc b/reactos/base/shell/cmd/lang/de-DE.rc index de29914a295..a0aa97e842e 100644 --- a/reactos/base/shell/cmd/lang/de-DE.rc +++ b/reactos/base/shell/cmd/lang/de-DE.rc @@ -29,7 +29,7 @@ ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] Dateiname ...\n\ /D Verarbeitet auch die Ordner.\n\n\ ATTRIB ohne Parameter zeigt die derzeit gesetzten Attribute aller Dateien an." -STRING_ALIAS_HELP, "Setzt, lscht oder zeigt Alias.\n\n\ +STRING_ALIAS_HELP, "Setzt, lscht oder zeigt ein Alias.\n\n\ ALIAS [alias=[command]]\n\n\ alias Name des Alias.\n\ command Text welcher fr den Alias zugeordnet wird.\n\n\ @@ -40,7 +40,7 @@ Setzt ein neues oder Lscht ein Alias von der Alias-Liste:\n\ ALIAS da=" -STRING_BEEP_HELP, "Gibt einen beep-Ton durch den PC-Speaker aus.\n\nBEEP" +STRING_BEEP_HELP, "Gibt einen Piepton durch den PC-Lautsprecher aus.\n\nBEEP" STRING_CALL_HELP, "Ruft eine Batchdatei von einer anderen aus auf.\n\n\ CALL [Laufwerk:][Pfad]Dateiname [Batch-Parameter]\n\n\ @@ -54,7 +54,7 @@ CD [Laufwerk:][Pfad]\n\ CD[..|.]\n\n\ .. bergeordnetes Verzeichnis\n\ . vorhergehende Verzeichnis\n\n\ -Geben Sie CD Laufwerk: ein, um das aktuelle Verzeichnis auf dem angegebenen\n\ +Geben Sie CD-Laufwerk: ein, um das aktuelle Verzeichnis auf dem angegebenen\n\ Laufwerk anzuzeigen.\n\ Mit CD ohne Parameter wird das aktuelle Laufwerk und Verzeichnis angezeigt." @@ -66,7 +66,7 @@ Der Befehl CHCP ohne Parameter zeigt die Nummer der aktuellen Codepage an." STRING_CHOICE_HELP, "Wartet auf den Benutzer, welcher aus einer Auswahl eine Option whlen muss.\n\n\ CHOICE [/C[:]choices][/N][/S][/T[:]c,nn][text]\n\n\ /C[:]choices Die erlaubten Tasten festlegen. Standard-Tasten sind Y und N.\n\ - /N Zeigt choices und ? am ende des Promt-Strings NICHT an.\n\ + /N Zeigt choices und ? am ende des Prompt-Strings NICHT an.\n\ /S Gro- und Kleinschreibung wird beachtet.\n\ /T[:]c,nn Standard-Auswahl wird auf c gesetzt nach nn Sekunden.\n\ text Zeigt eine Beschreibung an.\n\n\ @@ -74,9 +74,9 @@ ERRORLEVEL wird auf den Offset der Taste welche der Benutzer gedr STRING_CLS_HELP, "Lscht den Bildschirminhalt.\n\nCLS" -STRING_CMD_HELP1, "\nIntere Befehle verfgbar:\n" +STRING_CMD_HELP1, "\nInterne Befehle verfgbar:\n" -STRING_CMD_HELP2, "\nVerfgbare Features:" +STRING_CMD_HELP2, "\nVerfgbare Funktionen:" STRING_CMD_HELP3," [aliases]" @@ -96,11 +96,11 @@ CMD [/[C|K] command][/P][/Q][/T:bf]\n\n\ (kann nicht beendet werden).\n\ /T:bf Setzt die Hintergrund- und Vordergrund-Farbe (siehe COLOR Befehl)." -STRING_COLOR_HELP1, "Legt die standard Hinter- und Vordergrundfarben fr die Konsole fest.\n\n\ +STRING_COLOR_HELP1, "Legt die Standardhinter- und Vordergrundfarben fr die Konsole fest.\n\n\ COLOR [attr [/F]] \n\n\ attr Gibt die Farbattribute fr die Konsolenausgabe an.\n\ - /F fllt die Konsolenausgabe mit dem Farbattribut\n\n\ -Es gibt 3 Mglichkeiten die Farbe festzulegen:\n\ + /F Fllt die Konsolenausgabe mit dem Farbattribut\n\n\ +Es gibt 3 Mglichkeiten, um die Farbe festzulegen:\n\ 1) [bright] name on [bright] name (Nur die 4 ersten Buchstaben sind ntig)\n\ 2) decimal on decimal\n\ 3) two hex digits\n\n\ @@ -129,7 +129,7 @@ COPY [/V][/Y|/-Y][/A|/B] Quelle [/A|/B]\n\ vorhandener Zieldateien.\n\ /-Y Fordert beim berschreiben vorhandener Zieldateien zum\n\ Besttigen auf.\n\n\ -Die Option /Y ist mglicherweise in der Umgebungsvariablen COPYCMD.\n\ +Die Option /Y ist mglicherweise in der Umgebungsvariablen COPYCMD definiert.\n\ ..." STRING_DATE_HELP1, "\nGeben Sie das neue Datum ein (mm%cdd%cyyyy): " @@ -148,22 +148,22 @@ STRING_DEL_HELP1, "L DEL [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\ DELETE [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\ ERASE [/N /P /T /Q /W /Y /Z] Dateinamen ...\n\n\ - file Geben Sie die Dateinamen an welche Sie lschen mchten\n\n\ + file Geben Sie die Dateinamen an, welche Sie lschen mchten\n\n\ /N Nichts.\n\ /P Fordert Sie vor dem Lschen jeder Datei zur Besttigung auf.\n\ /T Zeigt die Anzahl der gelschten Dateien und deren vorherigen Speicherplatzbedarf an.\n\ /Q Beenden.\n\ - /W Sicheres Lschen. Dateien werden mit Zufallszahlen berschrieben bevor sie gelscht werden.\n\ + /W Sicheres Lschen. Dateien werden mit Zufallszahlen berschrieben, bevor sie gelscht werden.\n\ /Y Lscht alles (*.*) ohne Vorwarnung.\n\ - /Z Lscht versteckte, mit nur leserechten und Systemdateien.\n" + /Z Lscht versteckte Dateien mit Nur-Leserechten und Systemdateien.\n" -STRING_DEL_HELP2, "Alle Dateien in diesem Verzeichnis werden gelscht!\nSind Sie sicher (Y/N)?" +STRING_DEL_HELP2, "Alle Dateien in diesem Verzeichnis werden gelscht!\nSind Sie sich sicher (Y/N)?" STRING_DEL_HELP3, " %lu Datei(en) gelscht\n" STRING_DEL_HELP4, " %lu Datei(en) gelscht\n" STRING_DELAY_HELP, "Pause fr n Sekunden oder Millisekunden\n\ DELAY [/m]n\n\n\ - /m Millisekunden ansonsten Sekunden\n" + /m Millisekunden, ansonsten Sekunden\n" STRING_DIR_HELP1, "Listet die Dateien und Unterverzeichnisse eines Verzeichnisses auf.\n\n\ DIR [Laufwerk:][Pfad][Dateiname] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\ @@ -199,7 +199,7 @@ DIR [Laufwerk:][Pfad][Dateiname] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]\n\ werden Leerzeichen angezeigt.\n\ /4 Zeigt das Jahr vierstellig an.\n\n\ Optionen knnen in der Umgebungsvariablen DIRCMD voreingestellt werden.\n\ -""-"" vor einer Option setzt die Voreinstellung ausser Kraft, z.B. DIR /-W." +""-"" vor einer Option setzt die Voreinstellung auer Kraft, z.B. DIR /-W." STRING_DIR_HELP2, " Datentrger in Laufwerk %c ist %s\n" STRING_DIR_HELP3, " Datentrger in Laufwerk %c hat keine Bezeichnung\n" @@ -209,25 +209,25 @@ STRING_DIR_HELP6, "%16i Verzeichnis(se), % 15s Bytes frei\n" STRING_DIR_HELP7, "\n Verzeichnis von %s\n\n" STRING_DIR_HELP8, "%16i Datei(en)% 14s Bytes\n" -STRING_DIRSTACK_HELP1, "Speichert das aktuelle Verzeichnis fr den POPD Befehl, und\n\ -wechselt dann zu den festgelegten Verzeichnis.\n\n\ +STRING_DIRSTACK_HELP1, "Speichert das aktuelle Verzeichnis fr den POPD-Befehl und\n\ +wechselt dann in das festgelegte Verzeichnis.\n\n\ PUSHD [path | ..]\n\n\ - path Legt das Verzeichnis fest zu welchem gewechselt werden soll" + path Legt das Verzeichnis fest, in das gewechselt werden soll" -STRING_DIRSTACK_HELP2, "Wechselt zu dem Verzeichnis welches vom PUSHD Befehl gespeichert wurde.\n\nPOPD" +STRING_DIRSTACK_HELP2, "Wechselt in das Verzeichnis, das vom PUSHD-Befehl gespeichert wurde.\n\nPOPD" STRING_DIRSTACK_HELP3, "Druckt den Inhalt des Verzeichnis-Stacks.\n\nDIRS" STRING_DIRSTACK_HELP4, "Verzeichnis-Stack ist leer" -STRING_ECHO_HELP1, "Sendet eine Nachricht ohne den Zeilenvorschub und Wagenrcklauf zu bettigen.\n\n\ +STRING_ECHO_HELP1, "Sendet eine Nachricht, ohne den Zeilenvorschub und Wagenrcklauf zu bettigen.\n\n\ ECHOS message" -STRING_ECHO_HELP2, "Sendet eine Nachricht zur Standard Fehlerausgabe.\n\n\ +STRING_ECHO_HELP2, "Sendet eine Nachricht zur Standard-Fehlerausgabe.\n\n\ ECHOERR Nachricht\n\ ECHOERR. gibt eine Leerzeile aus" -STRING_ECHO_HELP3, "Sendet eine Nachricht zur Standard Fehlerausgabe ohne den Zeilenvorschub und Wagenrcklauf zu bettigen.\n\n\ +STRING_ECHO_HELP3, "Sendet eine Nachricht zur Standard-Fehlerausgabe, ohne den Zeilenvorschub und Wagenrcklauf zu bettigen.\n\n\ ECHOSERR Nachricht" STRING_ECHO_HELP4, "Zeigt Meldungen an oder schaltet die Befehlsanzeige ein ""ON"" oder aus ""OFF"".\n\n\ @@ -252,11 +252,11 @@ statt %Variable an." STRING_FREE_HELP1, "\nVolume in Laufwerk %s ist %-11s\n\ Volume-Seriennummer: %s\n\ - %16s bytes Speicherkapazitt\n\ - %16s bytes belegter Speicher\n\ - %16s bytes freier Speicher\n" + %16s Byte Speicherkapazitt\n\ + %16s Byte belegter Speicher\n\ + %16s Byte freier Speicher\n" -STRING_FREE_HELP2, "Zeigt die Volumesinformationen an.\n\nFREE [Laufwerk: ...]" +STRING_FREE_HELP2, "Zeigt die Volumeinformationen an.\n\nFREE [Laufwerk: ...]" STRING_IF_HELP1, "Verarbeitet Ausdrcke in einer Batchdatei abhngig von Bedingungen.\n\n\ IF [NOT] ERRORLEVEL Nummer Befehl\n\ @@ -292,12 +292,12 @@ STRING_LOCALE_HELP1, "Aktuelle Zeit: " STRING_MKDIR_HELP, "Erzeugt ein Verzeichnis.\n\n\ MKDIR [Laufwerk:]Pfad\nMD [Laufwerk:]Pfad" -STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\ -MKLINK [/D | /H | /J] linkname target\n\n\ - /D Indicates that the symbolic link target is a directory.\n\ - /H Create a hard link.\n\ - /J Create a directory junction.\n\n\ -If neither /H or /J is specified, a symbolic link is created." +STRING_MKLINK_HELP, "Erzeugt eine Dateisystemverknpfung.\n\n\ +MKLINK [/D | /H | /J] Linkname Ziel\n\n\ + /D Gibt an, dass das Ziel der Verknpfung ein Verzeichnis ist.\n\ + /H Erzeugt einen Hardlink.\n\ + /J Erzeugt einen Junction Point.\n\n\ +Wenn weder /H noch /J angegeben werden, wird eine symbolische Verknpfung angelegt." STRING_MEMMORY_HELP1, "Zeigt die Gre des Systemspeicher an.\n\nMEMORY" @@ -307,7 +307,7 @@ STRING_MEMMORY_HELP2, "\n %12s%% Speicher geladen.\n\n\ %13s bytes Auslagerungsdatei (insgesamt)\n\ %13s bytes verfgbare Auslagerungsdatei\n\n\ %13s bytes Virtueller Speicher (insgesamt)\n\ - %13s bytes verfgbarer Virtueller Speicher\n" + %13s bytes verfgbarer virtueller Speicher\n" STRING_MISC_HELP1, "Drcken Sie eine beliebige Taste . . .\n" @@ -320,9 +320,9 @@ Um ein Verzeichnis umzubenennen:\n\ MOVE [/N][Laufwerk:][Pfad]Verzeichnis1 Verzeichnis2\n\n\ [Laufwerk:][Pfad]Datei1 Bezeichnet den Pfad und den Namen der zu\n\ verschiebenden Datei(en).\n\ - /N Nichts. Tut alles ausser Dateien/Verzeichnisse verschieben.\n\n\ + /N Nichts. Tut alles auer Dateien/Verzeichnisse verschieben.\n\n\ Derzeitige Einschrnkung:\n\ -Es ist noch nicht mglich Objekte ber die Laufwerksgrenzen hinaus zu verschieben.\n" +Es ist noch nicht mglich, Objekte ber die Laufwerksgrenzen hinaus zu verschieben.\n" STRING_MSGBOX_HELP, "Zeigt ein Fenster und wartet auf eine Eingabe vom Benutzer.\n\n\ MSGBOX type ['title'] prompt\n\n\ @@ -331,7 +331,7 @@ type Button anzeigen\n\ YESNO, YESNOCANCEL\n\ title Titel des Fensters\n\ prompt Text der in dem Fenster angezeigt wird\n\n\n\ -ERRORLEVEL is set according the button pressed:\n\n\ +ERRORLEVEL wird je nach dem gedrckten Button gesetzt:\n\n\ YES : 10 | NO : 11\n\ OK : 10 | CANCEL : 12\n" @@ -387,9 +387,9 @@ REN [/E /N /P /Q /S /T] alter_Name ... neuer_Name\n\n\ /T Zeigt die Anzahl der umbenannten Dateien an.\n\n\ Nutzen Sie den 'move' Befehl falls Sie Objekte verschieben wollen.\n" -STRING_REN_HELP2, " %lu Datei umbennant\n" +STRING_REN_HELP2, " %lu Datei umbenannt\n" -STRING_REN_HELP3, " %lu Dateien umbennant\n" +STRING_REN_HELP3, " %lu Dateien umbenannt\n" STRING_REPLACE_HELP1, "Ersetzt Dateien.\n\n\ REPLACE [Laufwerk1:][Pfad1]Dateiname [Laufwerk2:][Pfad2] [/A] [/P] [/R] [/W]\n\ @@ -405,7 +405,7 @@ REPLACE [Laufwerk1:][Pfad1]Dateiname [Laufwerk2:][Pfad2] [/P] [/R] [/S] [/W] [/U /S Ersetzt Dateien in allen Unterordnern des Ziel-\n\ pfades. Kann nicht mit Parameter /A genutzt\n\ werden.\n\ - /W Wartet vor dem Start bis ein Datentrger\n\ + /W Wartet vor dem Start, bis ein Datentrger\n\ eingelegt wurde.\n\ /U Ersetzt (aktualisiert) nur Dateien, die lter\n\ sind als die Quelldaten. Kann nicht mit Paramater\n\ @@ -495,7 +495,7 @@ STRING_VERIFY_HELP2, "VERIFY ist %s.\n" STRING_VERIFY_HELP3, "VERIFY kann nur ON oder OFF sein" -STRING_VERSION_HELP1, "Zeigt Shell Informationen an.\n\n\ +STRING_VERSION_HELP1, "Zeigt Shellinformationen an.\n\n\ VER [/C][/R][/W]\n\n\ /C Zeigt die Credits an.\n\ /R Zeigt die Weitergabeinformationen an.\n\ @@ -521,9 +521,9 @@ STRING_VERSION_HELP5, "\nSenden Sie Bug-Reports an .\n\ Updates sind auf der offiziellen ReactOS-Webseite verfgbar:\n\ http://www.reactos.org" -STRING_VERSION_HELP6, "\nFreeDOS Version programmiert von:\n" +STRING_VERSION_HELP6, "\nFreeDOS-Version programmiert von:\n" -STRING_VERSION_HELP7, "\nReactOS Version programmiert von:\n" +STRING_VERSION_HELP7, "\nReactOS-Version programmiert von:\n" STRING_VOL_HELP1, " Datentrger im Laufwerk %c ist %s\n" STRING_VOL_HELP2, " Datentrger im Laufwerk %c hat keine Bezeichnung.\n" @@ -554,7 +554,7 @@ STRING_HELP1, " ? Listet alle Befehle auf (ohne Erklrung).\n\ ALIAS Setzt, lscht oder zeigt den Alias.\n\ ATTRIB Zeigt Dateiattribute an bzw. ndert sie.\n\ -BEEP Gibt einen piep-Ton durch den PC-Speaker aus.\n\ +BEEP Gibt einen Piepton durch den PC-Speaker aus.\n\ CALL Ruft eine Batchdatei aus einer anderen Batchdatei heraus auf.\n\ CD Zeigt den Namen des aktuellen Verzeichnisses an bzw. ndert diesen.\n\ CHCP Zeigt die aktive Codepagenummer an bzw. legt diese fest.\n\ @@ -581,7 +581,7 @@ IF Verarbeitet Ausdr LABEL Erstellt, ndert oder lscht die Bezeichnung eines Volumes.\n\ MD Erstellt ein Verzeichnis.\n\ MKDIR Erstellt ein Verzeichnis.\n\ -MKLINK Creates a filesystem link object.\n\ +MKLINK Erzeugt eine Dateisystemverknpfung.\n\ MOVE Verschiebt eine oder mehrere Dateien von einem Verzeichnis in\n\ ein anderes.\n\ PATH Legt den Suchpfad fr ausfhrbare Dateien fest oder zeigt diesen an.\n\ @@ -615,9 +615,9 @@ STRING_COPY_OPTION, "JNA" STRING_ALIAS_ERROR, "Die Befehlszeile ist zu lange nach der Alias-Erweiterung!\n" STRING_ASSOC_ERROR, "Dateizuordnung fr Erweiterung %s nicht gefunden\n" -STRING_BATCH_ERROR, "Es trat ein Fehler auf, whrend die Batch-Datei geffnet wurde.\n" -STRING_CHCP_ERROR1, "Aktive Code-Page: %u\n" -STRING_CHCP_ERROR4, "Ungltige Code-Page\n" +STRING_BATCH_ERROR, "Es trat ein Fehler auf, whrend die Batchdatei geffnet wurde.\n" +STRING_CHCP_ERROR1, "Aktive Codepage: %u\n" +STRING_CHCP_ERROR4, "Ungltige Codepage\n" STRING_CHOICE_ERROR, "Ungltige Option. Erwartetes Format: /C[:]options" STRING_CHOICE_ERROR_TXT, "Ungltige Option. Erwartetes Format: /T[:]c,nn" STRING_CHOICE_ERROR_OPTION, "Ungltige Option: %s" @@ -628,7 +628,7 @@ STRING_CMD_ERROR3, "%s kann nicht in die Datei umgeleitet werden \n" STRING_CMD_ERROR4, "Ausfhrend %s...\n" STRING_CMD_ERROR5, "Ausfhrend cmdexit.bat...\n" STRING_COLOR_ERROR1, "Fehler: Hinter- und Vordergrund knnen nicht die selben Farben haben!" -STRING_COLOR_ERROR2, "Fehler in der Farb-Angabe" +STRING_COLOR_ERROR2, "Fehler in der Farbangabe" STRING_COLOR_ERROR3, "Farbe %x\n" STRING_COLOR_ERROR4, "Fehler: Die selben Farben!" STRING_CONSOLE_ERROR, "Unbekannter Fehler: %d\n" @@ -679,19 +679,19 @@ STRING_REPLACE_ERROR5, "Zugriff verweigert - %s\n" STRING_REPLACE_ERROR6, "Keine Dateien gefunden - %s\n" STRING_REPLACE_ERROR7, "Erweiterter Fehler 32\n" STRING_REACTOS_VERSION, "ReactOS Operating System [Version %s-%s]\n" -STRING_CMD_SHELLINFO, "\nReactOS Befehlszeilen Interpreter\nVersion %s %s" +STRING_CMD_SHELLINFO, "\nReactOS-Befehlszeileninterpreter\nVersion %s %s" STRING_VERSION_RUNVER, " luft in %s" STRING_COPY_FILE , " %d Datei(en) kopiert\n" -STRING_DELETE_WIPE, "gewiped" +STRING_DELETE_WIPE, "sicher gelscht" STRING_FOR_ERROR, "ungltige Variablenangabe." STRING_SCREEN_COL, "ungltige Spalten-Angabe" STRING_SCREEN_ROW, "ungltige Zeilen-Angabe" STRING_TIMER_TIME "Timer %d ist %s: " -STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n" -STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n" -STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n" -STRING_MORE, "More? " -STRING_CANCEL_BATCH_FILE, "\r\nCtrl-Break pressed. Cancel batch file? (Ja/Nein/Alle) " +STRING_MKLINK_CREATED_SYMBOLIC, "Symbolische Verknpfung erstellt fr %s <<===>> %s\n" +STRING_MKLINK_CREATED_HARD, "Hardlink erstellt fr %s <<===>> %s\n" +STRING_MKLINK_CREATED_JUNCTION, "Junction Point erstellt fr %s <<===>> %s\n" +STRING_MORE, "Mehr? " +STRING_CANCEL_BATCH_FILE, "\r\nStrg-Pause gedrckt. Batchvorgang abbrechen? (Ja/Nein/Alle) " STRING_INVALID_OPERAND, "Ungltiger Operand." STRING_EXPECTED_CLOSE_PAREN, "Erwartet ')'." STRING_EXPECTED_NUMBER_OR_VARIABLE,"Erwartet Nummer oder Variablennamen." diff --git a/reactos/base/shell/cmd/lang/pl-PL.rc b/reactos/base/shell/cmd/lang/pl-PL.rc index 58bdadfc262..f8d2cb79a02 100644 --- a/reactos/base/shell/cmd/lang/pl-PL.rc +++ b/reactos/base/shell/cmd/lang/pl-PL.rc @@ -8,13 +8,13 @@ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE BEGIN -STRING_ASSOC_HELP, "Modify file extension associations.\n\n\ -assoc [.ext[=[FileType]]]\n\ +STRING_ASSOC_HELP, "Modyfikuje skojarzenia rozszerze plikw.\n\n\ +assoc [.ext[=[typPliku]]]\n\ \n\ -assoc (print all associations)\n\ -assoc .ext (print specific association)\n\ -assoc .ext= (remove specific association)\n\ -assoc .ext=FileType (add new association)\n" +assoc (wywietla wszystkie skojarzenia)\n\ +assoc .ext (wywietla okrelone skojarzenie)\n\ +assoc .ext= (usuwa okrelone skojarzenie)\n\ +assoc .ext=typPliku (dodaje nowe skojarzenie)\n" STRING_ATTRIB_HELP, "Wywietla lub zmienia atrybuty plikw.\n\n\ ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] nazwa_pliku ...\n\ @@ -298,12 +298,12 @@ STRING_LOCALE_HELP1, "Czas bie STRING_MKDIR_HELP, "Tworzy katalog.\n\n\ MKDIR [napd:]cieka\nMD [napd:]cieka" -STRING_MKLINK_HELP, "Creates a filesystem link object.\n\n\ -MKLINK [/D | /H | /J] linkname target\n\n\ - /D Indicates that the symbolic link target is a directory.\n\ - /H Create a hard link.\n\ - /J Create a directory junction.\n\n\ -If neither /H or /J is specified, a symbolic link is created." +STRING_MKLINK_HELP, "Tworzy dowizanie obiektu w systemie plikw.\n\n\ +MKLINK [/D | /H | /J] nazwa_linku element_docelowy\n\n\ + /D Oznacza, e dowizanie symboliczne elementu docelowego jest katalogiem.\n\ + /H Tworzy dowizanie twarde.\n\ + /J Tworzy punkt poczenia katalogw.\n\n\ +Jeli nie zostay uyte zarwno /H jak i /J, zostanie utworzone dowizanie symboliczne." STRING_MEMMORY_HELP1, "Wywietla ilo pamici systemowej.\n\nMEMORY" @@ -546,7 +546,7 @@ IF Przetwarzanie warunkowe w programach wsadowych.\n\ LABEL Tworzy, zmienia lub kasuje etykiet woluminu w danym napdzie.\n\ MD Tworzy katalog.\n\ MKDIR Tworzy katalog.\n\ -MKLINK Creates a filesystem link object.\n\ +MKLINK Tworzy dowizanie obiektu w systemie plikw.\n\ MOVE Przenosi jeden lub wicej plikw z jednego katalogu do drugiego.\n\ PATH Wywietla lub ustawia cieki dostpu dla programw.\n\ PAUSE Zawiesza przetwarzanie programu wsadowego i wywietla komunikat.\n\ @@ -656,11 +656,11 @@ STRING_FOR_ERROR, "z STRING_SCREEN_COL, "nieprawidowy numer kolumny" STRING_SCREEN_ROW, "nieprawidowy numer rzdu" STRING_TIMER_TIME "Stoper %d czas - %s: " -STRING_MKLINK_CREATED_SYMBOLIC, "Symbolic link created for %s <<===>> %s\n" -STRING_MKLINK_CREATED_HARD, "Hard link created for %s <<===>> %s\n" -STRING_MKLINK_CREATED_JUNCTION, "Junction created for %s <<===>> %s\n" -STRING_MORE, "More? " -STRING_CANCEL_BATCH_FILE, "\r\nCtrl-Break pressed. Cancel batch file? (Tak/Nie/Zawsze) " +STRING_MKLINK_CREATED_SYMBOLIC, "Dowizanie symboliczne utworzone dla %s <<===>> %s\n" +STRING_MKLINK_CREATED_HARD, "Dowizanie twarde utworzone dla %s <<===>> %s\n" +STRING_MKLINK_CREATED_JUNCTION, "Punkt dowizania katalogw utworzony dla %s <<===>> %s\n" +STRING_MORE, "Wicej? " +STRING_CANCEL_BATCH_FILE, "\r\nWcinito Ctrl-Break. Anulowa wykonanie pliku wsadowego? (Tak/Nie/Zawsze) " STRING_INVALID_OPERAND, "Nieprawidowy argument operatora." STRING_EXPECTED_CLOSE_PAREN, "Oczekiwano ')'." diff --git a/reactos/base/shell/explorer-new/comcsup.h b/reactos/base/shell/explorer-new/comcsup.h index 5513ecaa25f..d8a437b928e 100644 --- a/reactos/base/shell/explorer-new/comcsup.h +++ b/reactos/base/shell/explorer-new/comcsup.h @@ -1,5 +1,4 @@ -#ifndef __COMCSUP_H -#define __COMCSUP_H +#pragma once /* ****************************************************************************** @@ -49,5 +48,3 @@ static __inline impl##Impl * \ impl##Impl_from_##iface (iface *ifc) { \ return (impl##Impl *)((ULONG_PTR)ifc - FIELD_OFFSET(impl##Impl, vtbl)); \ } - -#endif /* __COMCSUP_H */ diff --git a/reactos/base/shell/explorer-new/lang/de-DE.rc b/reactos/base/shell/explorer-new/lang/de-DE.rc index 2445bb2d96e..80aefc0c32a 100644 --- a/reactos/base/shell/explorer-new/lang/de-DE.rc +++ b/reactos/base/shell/explorer-new/lang/de-DE.rc @@ -5,7 +5,7 @@ BEGIN POPUP "" BEGIN MENUITEM SEPARATOR - MENUITEM "Task Manager", ID_SHELL_CMD_OPEN_TASKMGR + MENUITEM "Taskmanager", ID_SHELL_CMD_OPEN_TASKMGR MENUITEM SEPARATOR MENUITEM "Taskbar fi&xieren", ID_LOCKTASKBAR MENUITEM "E&igenschaften", ID_SHELL_CMD_PROPERTIES @@ -56,60 +56,60 @@ END IDD_TASKBARPROP_TASKBAR DIALOGEX 0, 0, 252, 218 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Taskbar" +CAPTION "Taskleiste" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - GROUPBOX "Taskbar appearance", IDC_STATIC, 6,6,240,121 + GROUPBOX "Taskleiste", IDC_STATIC, 6,6,240,121 CONTROL "", IDC_TASKBARPROP_TASKBARBITMAP, "Static", SS_BITMAP | SS_SUNKEN, 13,18,224,21 - AUTOCHECKBOX "&Lock the taskbar", IDC_TASKBARPROP_LOCK, 13,45,200,10 - AUTOCHECKBOX "A&uto-hide the taskbar", IDC_TASKBARPROP_HIDE, 13,58,200,10 - AUTOCHECKBOX "Keep the &taskbar on top of other windows", IDC_TASKBARPROP_ONTOP, 13,71,200,10 - AUTOCHECKBOX "&Group similar taskbar buttons", IDC_TASKBARPROP_GROUP, 13,84,200,10 - AUTOCHECKBOX "Show &Quick Launch", IDC_TASKBARPROP_SHOWQL, 13,97,200,10 - AUTOCHECKBOX "&Show window previews (thumbnails)", IDC_TASKBARPROP_WNDPREV, 13,110,200,10 + AUTOCHECKBOX "Task&leiste fixieren", IDC_TASKBARPROP_LOCK, 13,45,200,10 + AUTOCHECKBOX "Taskleiste a&utom. verstecken", IDC_TASKBARPROP_HIDE, 13,58,200,10 + AUTOCHECKBOX "&Taskleiste immer im Vordergrund halten", IDC_TASKBARPROP_ONTOP, 13,71,200,10 + AUTOCHECKBOX "hnliche Buttons &gruppieren", IDC_TASKBARPROP_GROUP, 13,84,200,10 + AUTOCHECKBOX "Schnellstartleiste &anzeigen", IDC_TASKBARPROP_SHOWQL, 13,97,200,10 + AUTOCHECKBOX "Fenstervor&schau anzeigen", IDC_TASKBARPROP_WNDPREV, 13,110,200,10 END IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Start Menu" +CAPTION "Startmen" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - AUTORADIOBUTTON "&Start menu", IDC_TASKBARPROP_STARTMENU, 7,7,105,10 - LTEXT "This menu style gives you easy access to your folders, favorite programs, and search.", IDC_STATIC, 20,17,150,24, WS_DISABLED - PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED - AUTORADIOBUTTON "Classic Start &menu", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED - LTEXT "This menu style gives you the classic look and functionality",-1,20,57,150,24, WS_DISABLED - PUSHBUTTON "&Customize...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED - GROUPBOX "Privacy",IDC_STATIC, 7,100,238,42 - AUTOCHECKBOX "Store and display a list of recently opened &files", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED - AUTOCHECKBOX "Store and display a list of recently opened &programs",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED + AUTORADIOBUTTON "Modernes &Startmen", IDC_TASKBARPROP_STARTMENU, 7,7,105,10 + LTEXT "Dieser Stil gewhrt Ihnen einfachen Zugriff auf Ihre Verzeichnisse, bevorzugten Programme und die Suchfunktion.", IDC_STATIC, 20,17,150,24, WS_DISABLED + PUSHBUTTON "An&passen...", IDC_TASKBARPROP_STARTMENUCUST, 192,4,53,14, WS_DISABLED + AUTORADIOBUTTON "Klassisches Start&men", IDC_TASKBARPROP_STARTMENUCLASSIC, 7,47,105,10, WS_DISABLED + LTEXT "Dieser Stil beinhaltet das klassische Aussehen mit gewohnter Funktionalitt",-1,20,57,150,24, WS_DISABLED + PUSHBUTTON "An&passen...", IDC_TASKBARPROP_STARTMENUCLASSICCUST, 192,44,53,14, WS_DISABLED + GROUPBOX "Privatsphre",IDC_STATIC, 7,100,238,42 + AUTOCHECKBOX "Eine Liste zuletzt ge&ffneter Dateien fhren", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED + AUTOCHECKBOX "Eine Liste zuletzt gestarteter &Programme fhren",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED END IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Notification Area" +CAPTION "Benachrichtigungsfeld" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN,7,6,238,21, WS_DISABLED - GROUPBOX "Icons", IDC_STATIC, 6,33,240,58, WS_DISABLED - LTEXT "You can keep the notification area uncluttered by hiding icons that you have not clicked recently.", IDC_STATIC, 13,48,223,16, WS_DISABLED - AUTOCHECKBOX "&Hide inactive icons", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED - PUSHBUTTON "&Customize...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED - GROUPBOX "System icons", IDC_STATIC, 6,97,240,84, WS_DISABLED - LTEXT "Select which system icons to always show.", IDC_STATIC, 13,112,223,16, WS_DISABLED - AUTOCHECKBOX "Cloc&k", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED - AUTOCHECKBOX "&Volume", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED - AUTOCHECKBOX "&Network", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED - AUTOCHECKBOX "&Power", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED + GROUPBOX "Symbole", IDC_STATIC, 6,33,240,58, WS_DISABLED + LTEXT "Das Benachrichtigungsfeld kann bersichtlich gestaltet werden, indem selten verwendete Symbole ausgeblendet werden.", IDC_STATIC, 13,48,223,16, WS_DISABLED + AUTOCHECKBOX "&Inaktive Symbole ausblenden", IDC_TASKBARPROP_HIDEICONS, 13,70,125,10, WS_DISABLED + PUSHBUTTON "An&passen...", IDC_TASKBARPROP_ICONCUST, 188,70,50,14, WS_DISABLED + GROUPBOX "Systemsymbole", IDC_STATIC, 6,97,240,84, WS_DISABLED + LTEXT "Whlen Sie die Systemsymbole aus, die immer angezeigt werden sollen.", IDC_STATIC, 13,112,223,16, WS_DISABLED + AUTOCHECKBOX "&Uhr", IDC_TASKBARPROP_CLOCK, 13,126,200,10, WS_DISABLED + AUTOCHECKBOX "Lautstr&ke", IDC_TASKBARPROP_VOLUME, 13,139,200,10, WS_DISABLED + AUTOCHECKBOX "&Netzwerk", IDC_TASKBARPROP_NETWORK, 13,152,200,10, WS_DISABLED + AUTOCHECKBOX "&Akku", IDC_TASKBARPROP_POWER, 13,164,200,10, WS_DISABLED END IDD_TASKBARPROP_TOOLBARS DIALOGEX 0, 0, 252, 218 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Toolbars" +CAPTION "Symbolleisten" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - LTEXT "Select which toolbars to add to the taskbar.", IDC_STATIC, 7,7,223,12, WS_DISABLED + LTEXT "Whlen Sie aus, welche Symbolleisten der Taskleiste hinzugefgt werden sollen.", IDC_STATIC, 7,7,223,12, WS_DISABLED CONTROL "", IDC_TASKBARPROP_DESKBANDLIST, "SysTreeView32",WS_BORDER | WS_TABSTOP | WS_DISABLED, 7,20,236,160, WS_EX_CLIENTEDGE END @@ -118,11 +118,11 @@ STRINGTABLE DISCARDABLE BEGIN IDS_START "Start" IDS_PROPERTIES "E&igenschaften" - IDS_OPEN_ALL_USERS "ffnen &Alle Benutzer" - IDS_EXPLORE_ALL_USERS "Explorer A&lle Benutzer" + IDS_OPEN_ALL_USERS "ffnen (&Alle Benutzer)" + IDS_EXPLORE_ALL_USERS "Explorer (A&lle Benutzer)" END STRINGTABLE DISCARDABLE BEGIN - IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskbar and Start Menu Properties" + IDS_TASKBAR_STARTMENU_PROP_CAPTION "Taskleisten- und Startmeneinstellungen" END diff --git a/reactos/base/shell/explorer-new/resource.h b/reactos/base/shell/explorer-new/resource.h index aeed8061345..0ab9222f778 100644 --- a/reactos/base/shell/explorer-new/resource.h +++ b/reactos/base/shell/explorer-new/resource.h @@ -1,5 +1,4 @@ -#ifndef __RESOURCE_H -#define __RESOURCE_H +#pragma once #define IDC_STATIC -1 @@ -98,5 +97,3 @@ #define IDC_TASKBARPROP_DESKBANDLIST 2301 #define IDS_TASKBAR_STARTMENU_PROP_CAPTION 2200 - -#endif /* __RESOURCE_H */ diff --git a/reactos/base/shell/explorer-new/todo.h b/reactos/base/shell/explorer-new/todo.h index f0597e60a8b..8efcbe52bb5 100644 --- a/reactos/base/shell/explorer-new/todo.h +++ b/reactos/base/shell/explorer-new/todo.h @@ -1,5 +1,4 @@ -#ifndef __TODO_H -#define __TODO_H +#pragma once #ifdef INTERFACE #undef INTERFACE @@ -40,5 +39,3 @@ static const GUID SID_HACK_SMenuPopup = {0xD1E7AFEB,0x6A2E,0x11D0,{0x8C,0x78,0x0 #define IDeskBarClient_UIActivateDBC(T,a) (T)->lpVtbl->UIActivateDBC(T,a) #define IDeskBarClient_GetSize(T,a,b) (T)->lpVtbl->GetSize(T,a,b) #endif - -#endif /* __TODO_H */ diff --git a/reactos/base/shell/explorer-new/undoc.h b/reactos/base/shell/explorer-new/undoc.h index 46d829eae8c..d2cf78decd7 100644 --- a/reactos/base/shell/explorer-new/undoc.h +++ b/reactos/base/shell/explorer-new/undoc.h @@ -1,5 +1,4 @@ -#ifndef _EXPLORER_UNDOC__H -#define _EXPLORER_UNDOC__H +#pragma once /* * Undocumented stuff @@ -53,5 +52,3 @@ EXTERN_C const GUID CLSID_RebarBandSite; HRESULT WINAPI SHInvokeDefaultCommand(HWND,IShellFolder*,LPCITEMIDLIST); HRESULT WINAPI SHPropertyBag_ReadPOINTL(IPropertyBag*,LPCWSTR,POINTL*); - -#endif /* _EXPLORER_UNDOC__H */ diff --git a/reactos/base/shell/explorer/explorer-de.rc b/reactos/base/shell/explorer/explorer-de.rc index d7062378467..658b0ddb334 100644 --- a/reactos/base/shell/explorer/explorer-de.rc +++ b/reactos/base/shell/explorer/explorer-de.rc @@ -64,7 +64,7 @@ BEGIN END POPUP "&Hilfe" BEGIN - MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "Explorer-&FAQ...", ID_EXPLORER_FAQ MENUITEM "&ber ReactOS Explorer...", ID_ABOUT_EXPLORER MENUITEM "ber React&OS...", ID_ABOUT_WINDOWS END @@ -76,7 +76,7 @@ BEGIN BEGIN MENUITEM "&Ausfhren...", ID_EXECUTE MENUITEM SEPARATOR - MENUITEM "&Schliessen", ID_FILE_EXIT + MENUITEM "&Schlieen", ID_FILE_EXIT END POPUP "&Ansicht" BEGIN @@ -94,9 +94,9 @@ BEGIN END POPUP "&Hilfe" BEGIN - MENUITEM "Explorer &FAQ...", ID_EXPLORER_FAQ + MENUITEM "Explorer-&FAQ...", ID_EXPLORER_FAQ MENUITEM "&ber Explorer...", ID_ABOUT_EXPLORER - MENUITEM "ber &OS...", ID_ABOUT_WINDOWS + MENUITEM "ber React&OS...", ID_ABOUT_WINDOWS END END @@ -105,7 +105,7 @@ BEGIN POPUP "" BEGIN MENUITEM "&Einstellungen...", ID_DESKTOPBAR_SETTINGS - MENUITEM "&Task Manager...", ID_TASKMGR + MENUITEM "&Taskmanager...", ID_TASKMGR MENUITEM SEPARATOR MENUITEM "&ber Explorer...", ID_ABOUT_EXPLORER END @@ -129,7 +129,7 @@ BEGIN POPUP "" BEGIN MENUITEM "ffne &Lautstrkeregler", ID_TRAY_VOLUME - MENUITEM "Editieren der Audio-&Einstellungen", ID_VOLUME_PROPERTIES + MENUITEM "ndern der Audio-&Einstellungen", ID_VOLUME_PROPERTIES END END @@ -177,27 +177,27 @@ FONT 8, "MS Shell Dlg" BEGIN LTEXT "Bitte whlen Sie den gewnschten Platzierungs-Algorithmus fr die Desktop-Symbole aus:", IDC_STATIC,7,7,197,23 - CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | + CONTROL "li./ob. abw.",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,35,46,44 - CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | + CONTROL "li./ob. re.",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,35,46,44 - CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | + CONTROL "re./ob. li.",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,35,46,44 - CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | + CONTROL "re./ob. abw.",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,35,46,44 - CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | + CONTROL "li./unt. aufw.",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,83,46,44 - CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | + CONTROL "li./unt. re.",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,83,46,44 - CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | + CONTROL "re./unt. li.",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,83,46,44 - CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | + CONTROL "re./unt. aufw.",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,83,46,44 - CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | + CONTROL "Rahmen abw.",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,7,131,46,44 - CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | + CONTROL "Rahmen H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,57,131,46,44 - CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | + CONTROL "im Kreis",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,110,131,46,44 CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM | WS_TABSTOP,159,131,46,44 @@ -242,7 +242,7 @@ BEGIN CONTROL "ffne Unterverzeichnisses in &neuen Fenstern", IDC_SEPARATE_SUBFOLDERS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,90,157,10 - LTEXT "Diese Auswahl wird knftig fr alle Explorer-Fenster verwendet werden.", + LTEXT "Diese Auswahl wird knftig fr alle Explorerfenster verwendet werden.", IDC_STATIC,7,111,174,22 DEFPUSHBUTTON "&OK",IDOK,29,136,50,14,WS_GROUP PUSHBUTTON "A&bbrechen",IDCANCEL,106,136,50,14 @@ -344,7 +344,7 @@ BEGIN IDS_FAVORITES "Favoriten" IDS_PROGRAMS "Programme" IDS_SETTINGS "Einstellungen" - IDS_EXPLORE "Explore" + IDS_EXPLORE "Explorer" IDS_EMPTY "(Leer)" IDS_RECENT "Aktuelle Dokumente" IDS_ADMIN "Verwaltung" @@ -383,7 +383,7 @@ BEGIN IDS_SEARCH "Suche" IDS_ABOUT_EXPLORER "&ber Explorer..." IDS_LAUNCH_MANY_PROGRAMS - "Sie haben mehrere Programme ausgewhlt.\nSind Sie sicher, da Sie diese alle starten wollen?" + "Sie haben mehrere Programme ausgewhlt.\nSind Sie sich sicher, dass Sie diese alle starten wollen?" IDS_DESKTOPBAR_SETTINGS "Desktop-Einstellungen" IDS_DESKTOP "Desktop" IDS_TASKBAR "Taskbar" diff --git a/reactos/base/system/format/lang/de-DE.rc b/reactos/base/system/format/lang/de-DE.rc index c3c08486b9c..9620be2ed2f 100644 --- a/reactos/base/system/format/lang/de-DE.rc +++ b/reactos/base/system/format/lang/de-DE.rc @@ -28,9 +28,9 @@ STRING_HELP, "Syntax: %s Datentr STRING_COMPLETE "%lu Prozent komplett.\r" -STRING_FORMAT_FAIL "FormatEx konnte Operation nicht erfolgreich beenden.\n\n" +STRING_FORMAT_FAIL "FormatEx konnte Vorgang nicht erfolgreich beenden.\n\n" -STRING_NO_SUPPORT "Operation nicht untersttzt" +STRING_NO_SUPPORT "Vorgang nicht untersttzt" STRING_FMIFS_FAIL "Kann FMIFS-Eingangspunkte nicht lokalisieren.\n\n" @@ -40,11 +40,11 @@ STRING_DRIVE_PARM "Ben STRING_ERROR_DRIVE_TYPE "Konnte den Laufwerkstyp nicht erhalten" -STRING_INSERT_DISK "Legen Sie eine neue Diskette in Laufwerk %C: ein\nund drcken Sie Enter wenn das Laufwerk bereit ist" +STRING_INSERT_DISK "Legen Sie eine neue Diskette in Laufwerk %C: ein\nund bettigen Sie die Eingabetaste, wenn das Laufwerk\nbereit ist." STRING_NO_VOLUME "Kann Medium nicht abfragen" -STRING_NO_VOLUME_SIZE "Kann Mediumsgre nicht abfragen" +STRING_NO_VOLUME_SIZE "Kann Mediengre nicht abfragen" STRING_FILESYSTEM "Der Typ des Dateisystems ist %s.\n" @@ -70,7 +70,7 @@ STRING_ENTER_LABEL "Datentr STRING_NO_LABEL "Konnte Datentrger nicht benennen" -STRING_FREE_SPACE "\n%I64d bytes Speicherkapazitt.\n%I64d bytes freier Speicher.\n" +STRING_FREE_SPACE "\n%I64d Byte Speicherkapazitt.\n%I64d bytes freier Speicher.\n" -STRING_SERIAL_NUMBER "\nDatentrger Seriennummer ist %04X-%04X\n" +STRING_SERIAL_NUMBER "\nDatentrger-Seriennummer ist %04X-%04X\n" END diff --git a/reactos/base/system/msiexec/msiexec.c b/reactos/base/system/msiexec/msiexec.c index 9221fa2a9ce..fe19d98e434 100644 --- a/reactos/base/system/msiexec/msiexec.c +++ b/reactos/base/system/msiexec/msiexec.c @@ -47,6 +47,7 @@ static const char UsageStr[] = " Install a product:\n" " msiexec {package|productcode} [property]\n" " msiexec /i {package|productcode} [property]\n" +" msiexec /package {package|productcode} [property]\n" " msiexec /a package [property]\n" " Repair an installation:\n" " msiexec /f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" @@ -562,12 +563,13 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine { FunctionUnregServer = TRUE; } - else if(msi_option_prefix(argvW[i], "i")) + else if(msi_option_prefix(argvW[i], "i") || msi_option_prefix(argvW[i], "package")) { LPWSTR argvWi = argvW[i]; + int argLen = (msi_option_prefix(argvW[i], "i") ? 2 : 8); FunctionInstall = TRUE; - if(lstrlenW(argvWi) > 2) - argvWi += 2; + if(lstrlenW(argvW[i]) > argLen) + argvWi += argLen; else { i++; diff --git a/reactos/base/system/msiexec/msiexec.rbuild b/reactos/base/system/msiexec/msiexec.rbuild index a3a24950930..228875d72c7 100644 --- a/reactos/base/system/msiexec/msiexec.rbuild +++ b/reactos/base/system/msiexec/msiexec.rbuild @@ -12,7 +12,6 @@ ole32 msi msiexec.c - rsrc.rc service.c - version.rc + rsrc.rc diff --git a/reactos/base/system/msiexec/rsrc.rc b/reactos/base/system/msiexec/rsrc.rc index 01e43befe19..cfc89370039 100644 --- a/reactos/base/system/msiexec/rsrc.rc +++ b/reactos/base/system/msiexec/rsrc.rc @@ -18,7 +18,16 @@ #include -#include "version.rc" +#define WINE_FILEDESCRIPTION_STR "Wine Installer" +#define WINE_FILENAME_STR "msiexec.exe" +#define WINE_FILETYPE VFT_APP +#define WINE_FILEVERSION 3,1,4000,1823 +#define WINE_FILEVERSION_STR "3.1.4000.1823" +#define WINE_PRODUCTVERSION 3,1,4000,1823 +#define WINE_PRODUCTVERSION_STR "3.1.4000.1823" +#define WINE_PRODUCTNAME_STR "Wine Installer" + +#include "wine/wine_common_ver.rc" LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL diff --git a/reactos/base/system/regsvr32/lang/de-DE.rc b/reactos/base/system/regsvr32/lang/de-DE.rc index c467baf88da..dd519a07744 100644 --- a/reactos/base/system/regsvr32/lang/de-DE.rc +++ b/reactos/base/system/regsvr32/lang/de-DE.rc @@ -12,7 +12,7 @@ IDS_UsageMessage, "%s\n\nSyntax: regsvr32 [/u] [/s] [/c] [/n] [/i[:cmdline]] dll /s - Hintergrundmodus; Meldungen werden nicht angezeigt\n\ /c - Konsolenausgabe verwenden\n\ /i - Aufruf von DLLInstall, wobei optional eine [Befehlszeile] bergeben\n\ - werden kann. Unter Verwendung von /u wird die DLL_Deinstallation\n\ + werden kann. Unter Verwendung von /u wird die DLL-Deinstallation\n\ aufgerufen.\n\ /n - Kein Aufruf von DLLRegisterServer. Diese Option muss mit /i verwendet werden." @@ -20,12 +20,12 @@ IDS_NoDllSpecified, "Es wurde kein DLL-Name angegeben." IDS_InvalidFlag, "Ungltiger Parameter: %s" -IDS_SwitchN_NoI, "Ungltiger Parameter: /n muss zusammen mit dem /i Schalter verwendet werden." +IDS_SwitchN_NoI, "Ungltiger Parameter: /n muss zusammen mit dem /i-Schalter verwendet werden." -IDS_DllNotLoaded, "LoadLibrary('%s') ist fehlgeschlagen.\nGetLastError Rckgabewert 0x%08x." +IDS_DllNotLoaded, "LoadLibrary('%s') ist fehlgeschlagen.\nGetLastError-Rckgabewert 0x%08x." IDS_MissingEntry, "%s wurde geladen, aber der %s Einstiegspunkt wurde nicht gefunden.\n\n\ -%s wurde mglicherweise nicht exportiert, oder eine fehlerhafte Version von %s befindet sich im Speicher. Erwgen Sie die Verwendung von PView um es festzustellen und zu lschen." +%s wurde mglicherweise nicht exportiert, oder eine fehlerhafte Version von %s befindet sich im Speicher. Erwgen Sie die Verwendung von PView, um es festzustellen und zu lschen." IDS_FailureMessage, "%s in %s ist fehlgeschlagen.\nRckgabewert: 0x%08x" diff --git a/reactos/base/system/runonce/lang/de-DE.rc b/reactos/base/system/runonce/lang/de-DE.rc new file mode 100644 index 00000000000..44df265a81d --- /dev/null +++ b/reactos/base/system/runonce/lang/de-DE.rc @@ -0,0 +1,11 @@ +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + +IDD_RUNONCE_DLG DIALOG DISCARDABLE 0, 0, 239, 170 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ReactOS-Setup" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "ReactOS nimmt nun die folgenden Einstellungen vor:", -1, 38, 8, 196, 18 + LISTBOX IDC_COMP_LIST, 36, 32, 197, 131, LBS_OWNERDRAWVARIABLE | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + ICON IDI_ICON, -1, 5, 6, 21, 20 +END diff --git a/reactos/base/system/runonce/resource.h b/reactos/base/system/runonce/resource.h index 826805f9cc3..96817d435ef 100644 --- a/reactos/base/system/runonce/resource.h +++ b/reactos/base/system/runonce/resource.h @@ -1,10 +1,7 @@ -#ifndef _RESOURCE_H__ -#define _RESOURCE_H__ +#pragma once #define IDI_ICON 10 #define IDD_RUNONCE_DLG 100 #define IDC_COMP_LIST 1000 - -#endif /* _RESOURCE_H__ */ diff --git a/reactos/base/system/runonce/rsrc.rc b/reactos/base/system/runonce/rsrc.rc index 540fe8abd20..cc21daecfe9 100644 --- a/reactos/base/system/runonce/rsrc.rc +++ b/reactos/base/system/runonce/rsrc.rc @@ -1,3 +1,4 @@ +#include "lang/de-DE.rc" #include "lang/en-US.rc" #include "lang/es-ES.rc" #include "lang/ja-JP.rc" diff --git a/reactos/base/system/runonce/runonce.h b/reactos/base/system/runonce/runonce.h index 6fb2b59bd64..9e9c5849d6c 100644 --- a/reactos/base/system/runonce/runonce.h +++ b/reactos/base/system/runonce/runonce.h @@ -1,9 +1,6 @@ -#ifndef _RUNONCE_H__ -#define _RUNONCE_H__ +#pragma once #include #include #include "resource.h" - -#endif /* _RUNONCE_H__ */ diff --git a/reactos/base/system/services/database.c b/reactos/base/system/services/database.c index d33b23403b5..7a9819e4c8b 100644 --- a/reactos/base/system/services/database.c +++ b/reactos/base/system/services/database.c @@ -17,6 +17,11 @@ #define NDEBUG #include +/* + * Uncomment the line below to start services + * using the SERVICE_START_PENDING state + */ +// #define USE_SERVICE_START_PENDING /* GLOBALS *******************************************************************/ @@ -116,37 +121,6 @@ ScmGetServiceEntryByResumeCount(DWORD dwResumeCount) } -PSERVICE -ScmGetServiceEntryByClientHandle(HANDLE Handle) -{ - PLIST_ENTRY ServiceEntry; - PSERVICE CurrentService; - - DPRINT("ScmGetServiceEntryByClientHandle() called\n"); - DPRINT("looking for %p\n", Handle); - - ServiceEntry = ServiceListHead.Flink; - while (ServiceEntry != &ServiceListHead) - { - CurrentService = CONTAINING_RECORD(ServiceEntry, - SERVICE, - ServiceListEntry); - - if (CurrentService->hClient == Handle) - { - DPRINT("Found service: '%S'\n", CurrentService->lpDisplayName); - return CurrentService; - } - - ServiceEntry = ServiceEntry->Flink; - } - - DPRINT("Couldn't find a matching service\n"); - - return NULL; -} - - DWORD ScmCreateNewServiceRecord(LPCWSTR lpServiceName, PSERVICE *lpServiceRecord) @@ -191,7 +165,7 @@ ScmCreateNewServiceRecord(LPCWSTR lpServiceName, VOID ScmDeleteServiceRecord(PSERVICE lpService) { - DPRINT1("Deleting Service %S\n", lpService->lpServiceName); + DPRINT("Deleting Service %S\n", lpService->lpServiceName); /* Delete the display name */ if (lpService->lpDisplayName != NULL && @@ -215,12 +189,12 @@ ScmDeleteServiceRecord(PSERVICE lpService) /* Remove the Service from the List */ RemoveEntryList(&lpService->ServiceListEntry); - DPRINT1("Deleted Service %S\n", lpService->lpServiceName); + DPRINT("Deleted Service %S\n", lpService->lpServiceName); /* Delete the service record */ HeapFree(GetProcessHeap(), 0, lpService); - DPRINT1("Done\n"); + DPRINT("Done\n"); } @@ -705,12 +679,15 @@ ScmGetBootAndSystemDriverState(VOID) DWORD ScmControlService(PSERVICE Service, - DWORD dwControl, - LPSERVICE_STATUS lpServiceStatus) + DWORD dwControl) { PSCM_CONTROL_PACKET ControlPacket; - DWORD Count; + SCM_REPLY_PACKET ReplyPacket; + + DWORD dwWriteCount = 0; + DWORD dwReadCount = 0; DWORD TotalLength; + DWORD dwError = ERROR_SUCCESS; DPRINT("ScmControlService() called\n"); @@ -723,31 +700,37 @@ ScmControlService(PSERVICE Service, return ERROR_NOT_ENOUGH_MEMORY; ControlPacket->dwControl = dwControl; - ControlPacket->hClient = Service->hClient; ControlPacket->dwSize = TotalLength; + ControlPacket->hServiceStatus = (SERVICE_STATUS_HANDLE)Service; wcscpy(&ControlPacket->szArguments[0], Service->lpServiceName); /* Send the control packet */ WriteFile(Service->ControlPipeHandle, ControlPacket, sizeof(SCM_CONTROL_PACKET) + (TotalLength * sizeof(WCHAR)), - &Count, + &dwWriteCount, NULL); - /* FIXME: Read the reply */ + /* Read the reply */ + ReadFile(Service->ControlPipeHandle, + &ReplyPacket, + sizeof(SCM_REPLY_PACKET), + &dwReadCount, + NULL); /* Release the contol packet */ HeapFree(GetProcessHeap(), 0, ControlPacket); - RtlCopyMemory(lpServiceStatus, - &Service->Status, - sizeof(SERVICE_STATUS)); + if (dwReadCount == sizeof(SCM_REPLY_PACKET)) + { + dwError = ReplyPacket.dwError; + } - DPRINT("ScmControlService) done\n"); + DPRINT("ScmControlService() done\n"); - return ERROR_SUCCESS; + return dwError; } @@ -757,11 +740,15 @@ ScmSendStartCommand(PSERVICE Service, LPWSTR *argv) { PSCM_CONTROL_PACKET ControlPacket; + SCM_REPLY_PACKET ReplyPacket; DWORD TotalLength; DWORD ArgsLength = 0; DWORD Length; PWSTR Ptr; - DWORD Count; + DWORD dwWriteCount = 0; + DWORD dwReadCount = 0; + DWORD dwError = ERROR_SUCCESS; + DWORD i; DPRINT("ScmSendStartCommand() called\n"); @@ -769,10 +756,10 @@ ScmSendStartCommand(PSERVICE Service, TotalLength = wcslen(Service->lpServiceName) + 1; if (argc > 0) { - for (Count = 0; Count < argc; Count++) + for (i = 0; i < argc; i++) { - DPRINT("Arg: %S\n", argv[Count]); - Length = wcslen(argv[Count]) + 1; + DPRINT("Arg: %S\n", argv[i]); + Length = wcslen(argv[i]) + 1; TotalLength += Length; ArgsLength += Length; } @@ -788,7 +775,7 @@ ScmSendStartCommand(PSERVICE Service, return ERROR_NOT_ENOUGH_MEMORY; ControlPacket->dwControl = SERVICE_CONTROL_START; - ControlPacket->hClient = Service->hClient; + ControlPacket->hServiceStatus = (SERVICE_STATUS_HANDLE)Service; ControlPacket->dwSize = TotalLength; Ptr = &ControlPacket->szArguments[0]; wcscpy(Ptr, Service->lpServiceName); @@ -812,19 +799,29 @@ ScmSendStartCommand(PSERVICE Service, WriteFile(Service->ControlPipeHandle, ControlPacket, sizeof(SCM_CONTROL_PACKET) + (TotalLength - 1) * sizeof(WCHAR), - &Count, + &dwWriteCount, NULL); - /* FIXME: Read the reply */ + /* Read the reply */ + ReadFile(Service->ControlPipeHandle, + &ReplyPacket, + sizeof(SCM_REPLY_PACKET), + &dwReadCount, + NULL); /* Release the contol packet */ HeapFree(GetProcessHeap(), 0, ControlPacket); + if (dwReadCount == sizeof(SCM_REPLY_PACKET)) + { + dwError = ReplyPacket.dwError; + } + DPRINT("ScmSendStartCommand() done\n"); - return ERROR_SUCCESS; + return dwError; } @@ -845,6 +842,7 @@ ScmStartUserModeService(PSERVICE Service, WCHAR NtControlPipeName[MAX_PATH + 1]; HKEY hServiceCurrentKey = INVALID_HANDLE_VALUE; DWORD KeyDisposition; + DWORD dwProcessId; RtlInitUnicodeString(&ImagePath, NULL); @@ -986,7 +984,7 @@ ScmStartUserModeService(PSERVICE Service, /* Read SERVICE_STATUS_HANDLE from pipe */ if (!ReadFile(Service->ControlPipeHandle, - (LPVOID)&Service->hClient, + (LPVOID)&dwProcessId, sizeof(DWORD), &dwRead, NULL)) @@ -997,7 +995,7 @@ ScmStartUserModeService(PSERVICE Service, } else { - DPRINT("Received service status %lu\n", Service->hClient); + DPRINT("Received service process ID %lu\n", dwProcessId); /* Send start command */ dwError = ScmSendStartCommand(Service, argc, argv); @@ -1038,12 +1036,23 @@ ScmStartService(PSERVICE Service, DWORD argc, LPWSTR *argv) /* Load driver */ dwError = ScmLoadDriver(Service); if (dwError == ERROR_SUCCESS) + { Service->Status.dwControlsAccepted = SERVICE_ACCEPT_STOP; + Service->Status.dwCurrentState = SERVICE_RUNNING; + } } else { /* Start user-mode service */ dwError = ScmStartUserModeService(Service, argc, argv); + if (dwError == ERROR_SUCCESS) + { +#ifdef USE_SERVICE_START_PENDING + Service->Status.dwCurrentState = SERVICE_START_PENDING; +#else + Service->Status.dwCurrentState = SERVICE_RUNNING; +#endif + } } DPRINT("ScmStartService() done (Error %lu)\n", dwError); @@ -1054,7 +1063,6 @@ ScmStartService(PSERVICE Service, DWORD argc, LPWSTR *argv) { Group->ServicesRunning = TRUE; } - Service->Status.dwCurrentState = SERVICE_RUNNING; } #if 0 else @@ -1207,7 +1215,6 @@ ScmAutoShutdownServices(VOID) { PLIST_ENTRY ServiceEntry; PSERVICE CurrentService; - SERVICE_STATUS ServiceStatus; DPRINT("ScmAutoShutdownServices() called\n"); @@ -1220,7 +1227,7 @@ ScmAutoShutdownServices(VOID) CurrentService->Status.dwCurrentState == SERVICE_START_PENDING) { /* shutdown service */ - ScmControlService(CurrentService, SERVICE_CONTROL_STOP, &ServiceStatus); + ScmControlService(CurrentService, SERVICE_CONTROL_STOP); } ServiceEntry = ServiceEntry->Flink; @@ -1229,4 +1236,25 @@ ScmAutoShutdownServices(VOID) DPRINT("ScmGetBootAndSystemDriverState() done\n"); } + +BOOL +ScmLockDatabaseExclusive(VOID) +{ + return RtlAcquireResourceExclusive(&DatabaseLock, TRUE); +} + + +BOOL +ScmLockDatabaseShared(VOID) +{ + return RtlAcquireResourceShared(&DatabaseLock, TRUE); +} + + +VOID +ScmUnlockDatabase(VOID) +{ + RtlReleaseResource(&DatabaseLock); +} + /* EOF */ diff --git a/reactos/base/system/services/rpcserver.c b/reactos/base/system/services/rpcserver.c index 193cb9b946e..914e013327b 100644 --- a/reactos/base/system/services/rpcserver.c +++ b/reactos/base/system/services/rpcserver.c @@ -153,12 +153,12 @@ ScmCreateManagerHandle(LPWSTR lpDatabaseName, if (_wcsicmp(lpDatabaseName,SERVICES_FAILED_DATABASEW)==0) { - DPRINT1("Database %S, does not exist\n",lpDatabaseName); + DPRINT("Database %S, does not exist\n",lpDatabaseName); return ERROR_DATABASE_DOES_NOT_EXIST; } else if (_wcsicmp(lpDatabaseName, SERVICES_ACTIVE_DATABASEW) != 0) { - DPRINT1("Invalid Database name %S.\n",lpDatabaseName); + DPRINT("Invalid Database name %S.\n",lpDatabaseName); return ERROR_INVALID_NAME; } @@ -284,7 +284,7 @@ Int_EnumDependentServicesW(HKEY hServicesKey, NULL); if (dwError != ERROR_SUCCESS) { - DPRINT1("ERROR! Unable to get number of services keys.\n"); + DPRINT("ERROR! Unable to get number of services keys.\n"); return dwError; } @@ -341,7 +341,7 @@ Int_EnumDependentServicesW(HKEY hServicesKey, if (!lpCurrentService) { /* This should never happen! */ - DPRINT1("This should not happen at this point, report to Developer\n"); + DPRINT("This should not happen at this point, report to Developer\n"); return ERROR_NOT_FOUND; } @@ -473,7 +473,7 @@ DWORD RCloseServiceHandle( &hServicesKey); if (dwError != ERROR_SUCCESS) { - DPRINT1("Failed to open services key\n"); + DPRINT("Failed to open services key\n"); return dwError; } @@ -488,7 +488,7 @@ DWORD RCloseServiceHandle( /* if pcbBytesNeeded returned a value then there are services running that are dependent on this service*/ if (pcbBytesNeeded) { - DPRINT1("Deletion failed due to running dependencies.\n"); + DPRINT("Deletion failed due to running dependencies.\n"); RegCloseKey(hServicesKey); return ERROR_SUCCESS; } @@ -504,7 +504,7 @@ DWORD RCloseServiceHandle( if (dwError != ERROR_SUCCESS) { - DPRINT1("Failed to Delete the Service Registry key\n"); + DPRINT("Failed to Delete the Service Registry key\n"); return dwError; } @@ -517,7 +517,7 @@ DWORD RCloseServiceHandle( return ERROR_SUCCESS; } - DPRINT1("Invalid handle tag (Tag %lx)\n", hManager->Handle.Tag); + DPRINT("Invalid handle tag (Tag %lx)\n", hManager->Handle.Tag); return ERROR_INVALID_HANDLE; } @@ -546,7 +546,7 @@ DWORD RControlService( hSvc = (PSERVICE_HANDLE)hService; if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) { - DPRINT1("Invalid handle tag!\n"); + DPRINT("Invalid handle tag!\n"); return ERROR_INVALID_HANDLE; } @@ -554,7 +554,7 @@ DWORD RControlService( lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } @@ -603,7 +603,7 @@ DWORD RControlService( &hServicesKey); if (dwError != ERROR_SUCCESS) { - DPRINT1("Failed to open services key\n"); + DPRINT("Failed to open services key\n"); return dwError; } @@ -637,8 +637,12 @@ DWORD RControlService( { /* Send control code to the service */ dwError = ScmControlService(lpService, - dwControl, - lpServiceStatus); + dwControl); + + /* Return service status information */ + RtlCopyMemory(lpServiceStatus, + &lpService->Status, + sizeof(SERVICE_STATUS)); } if ((dwError == ERROR_SUCCESS) && (pcbBytesNeeded)) @@ -652,10 +656,6 @@ DWORD RControlService( lpService->ThreadId = 0; } - /* Return service status information */ - RtlCopyMemory(lpServiceStatus, - &lpService->Status, - sizeof(SERVICE_STATUS)); return dwError; } @@ -685,7 +685,7 @@ DWORD RDeleteService( lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } @@ -693,7 +693,7 @@ DWORD RDeleteService( if (lpService->bDeleted) { - DPRINT1("The service has already been marked for delete!\n"); + DPRINT("The service has already been marked for delete!\n"); return ERROR_SERVICE_MARKED_FOR_DELETE; } @@ -761,7 +761,7 @@ DWORD RQueryServiceObjectSecurity( hSvc = (PSERVICE_HANDLE)hService; if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) { - DPRINT1("Invalid handle tag!\n"); + DPRINT("Invalid handle tag!\n"); return ERROR_INVALID_HANDLE; } @@ -776,14 +776,14 @@ DWORD RQueryServiceObjectSecurity( if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, DesiredAccess)) { - DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } @@ -838,12 +838,12 @@ DWORD RSetServiceObjectSecurity( /* NTSTATUS Status; */ DWORD dwError; - DPRINT1("RSetServiceObjectSecurity() called\n"); + DPRINT("RSetServiceObjectSecurity() called\n"); hSvc = (PSERVICE_HANDLE)hService; if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) { - DPRINT1("Invalid handle tag!\n"); + DPRINT("Invalid handle tag!\n"); return ERROR_INVALID_HANDLE; } @@ -875,14 +875,14 @@ DWORD RSetServiceObjectSecurity( if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, DesiredAccess)) { - DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } @@ -960,29 +960,33 @@ DWORD RQueryServiceStatus( hSvc = (PSERVICE_HANDLE)hService; if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) { - DPRINT1("Invalid handle tag!\n"); + DPRINT("Invalid handle tag!\n"); return ERROR_INVALID_HANDLE; } if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, SERVICE_QUERY_STATUS)) { - DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } + ScmLockDatabaseShared(); + /* Return service status information */ RtlCopyMemory(lpServiceStatus, &lpService->Status, sizeof(SERVICE_STATUS)); + ScmUnlockDatabase(); + return ERROR_SUCCESS; } @@ -1026,21 +1030,21 @@ DWORD RSetServiceStatus( if (hServiceStatus == 0) { - DPRINT1("hServiceStatus == NULL!\n"); + DPRINT("hServiceStatus == NULL!\n"); return ERROR_INVALID_HANDLE; } - lpService = ScmGetServiceEntryByClientHandle((HANDLE)hServiceStatus); + lpService = (PSERVICE)hServiceStatus; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } /* Check current state */ if (!ScmIsValidServiceState(lpServiceStatus->dwCurrentState)) { - DPRINT1("Invalid service state!\n"); + DPRINT("Invalid service state!\n"); return ERROR_INVALID_DATA; } @@ -1048,22 +1052,25 @@ DWORD RSetServiceStatus( if (!(lpServiceStatus->dwServiceType & SERVICE_WIN32) && (lpServiceStatus->dwServiceType & SERVICE_DRIVER)) { - DPRINT1("Invalid service type!\n"); + DPRINT("Invalid service type!\n"); return ERROR_INVALID_DATA; } /* Check accepted controls */ if (lpServiceStatus->dwControlsAccepted & ~0xFF) { - DPRINT1("Invalid controls accepted!\n"); + DPRINT("Invalid controls accepted!\n"); return ERROR_INVALID_DATA; } + ScmLockDatabaseExclusive(); RtlCopyMemory(&lpService->Status, lpServiceStatus, sizeof(SERVICE_STATUS)); + ScmUnlockDatabase(); + DPRINT("Set %S to %lu\n", lpService->lpDisplayName, lpService->Status.dwCurrentState); DPRINT("RSetServiceStatus() done\n"); @@ -1139,21 +1146,21 @@ DWORD RChangeServiceConfigW( hSvc = (PSERVICE_HANDLE)hService; if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) { - DPRINT1("Invalid handle tag!\n"); + DPRINT("Invalid handle tag!\n"); return ERROR_INVALID_HANDLE; } if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, SERVICE_CHANGE_CONFIG)) { - DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } @@ -1162,7 +1169,7 @@ DWORD RChangeServiceConfigW( if (lpService->bDeleted) { /* FIXME: Unlock database */ - DPRINT1("The service has already been marked for delete!\n"); + DPRINT("The service has already been marked for delete!\n"); return ERROR_SERVICE_MARKED_FOR_DELETE; } @@ -1365,14 +1372,14 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) *RelativeName = LocalAlloc(LMEM_ZEROINIT, ServiceNameLen * sizeof(WCHAR) + sizeof(WCHAR)); if (*RelativeName == NULL) { - DPRINT1("Error allocating memory for boot driver name!\n"); + DPRINT("Error allocating memory for boot driver name!\n"); return ERROR_NOT_ENOUGH_MEMORY; } /* Copy it */ wcscpy(*RelativeName, CanonName); - DPRINT1("Bootdriver name %S\n", *RelativeName); + DPRINT("Bootdriver name %S\n", *RelativeName); return ERROR_SUCCESS; } @@ -1385,7 +1392,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) if (*RelativeName == NULL) { - DPRINT1("Error allocating memory for boot driver name!\n"); + DPRINT("Error allocating memory for boot driver name!\n"); return ERROR_NOT_ENOUGH_MEMORY; } @@ -1393,7 +1400,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) wcscpy(*RelativeName, L"\\SystemRoot\\"); wcscat(*RelativeName, CanonName + 13); - DPRINT1("Bootdriver name %S\n", *RelativeName); + DPRINT("Bootdriver name %S\n", *RelativeName); return ERROR_SUCCESS; } @@ -1402,7 +1409,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) if (BufferSize <= 1) { - DPRINT1("Error during a call to ExpandEnvironmentStringsW()\n"); + DPRINT("Error during a call to ExpandEnvironmentStringsW()\n"); return ERROR_INVALID_ENVIRONMENT; } @@ -1410,7 +1417,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) Expanded = LocalAlloc(LMEM_ZEROINIT, BufferSize * sizeof(WCHAR) + sizeof(WCHAR)); if (!Expanded) { - DPRINT1("Error allocating memory for boot driver name!\n"); + DPRINT("Error allocating memory for boot driver name!\n"); return ERROR_NOT_ENOUGH_MEMORY; } @@ -1418,7 +1425,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) if (ExpandEnvironmentStringsW(L"%SystemRoot%\\", Expanded, BufferSize) > BufferSize) { - DPRINT1("Error during a call to ExpandEnvironmentStringsW()\n"); + DPRINT("Error during a call to ExpandEnvironmentStringsW()\n"); LocalFree(Expanded); return ERROR_NOT_ENOUGH_MEMORY; } @@ -1426,7 +1433,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) /* Convert to NY-style path */ if (!RtlDosPathNameToNtPathName_U(Expanded, &NtPathName, NULL, NULL)) { - DPRINT1("Error during a call to RtlDosPathNameToNtPathName_U()\n"); + DPRINT("Error during a call to RtlDosPathNameToNtPathName_U()\n"); return ERROR_INVALID_ENVIRONMENT; } @@ -1439,7 +1446,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) Expanded = LocalAlloc(LMEM_ZEROINIT, NtPathName.Length + sizeof(WCHAR)); if (!Expanded) { - DPRINT1("Error allocating memory for boot driver name!\n"); + DPRINT("Error allocating memory for boot driver name!\n"); return ERROR_NOT_ENOUGH_MEMORY; } @@ -1455,7 +1462,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) (ServiceNameLen - ExpandedLen) * sizeof(WCHAR) + 13*sizeof(WCHAR)); if (*RelativeName == NULL) { - DPRINT1("Error allocating memory for boot driver name!\n"); + DPRINT("Error allocating memory for boot driver name!\n"); LocalFree(Expanded); return ERROR_NOT_ENOUGH_MEMORY; } @@ -1491,7 +1498,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) /* Check if required buffer size is sane */ if (BufferSize > 0xFFFD) { - DPRINT1("Too large buffer required\n"); + DPRINT("Too large buffer required\n"); *RelativeName = 0; if (SymbolicLinkHandle) NtClose(SymbolicLinkHandle); @@ -1503,7 +1510,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) LinkTarget.Buffer = LocalAlloc(LMEM_ZEROINIT, BufferSize + sizeof(WCHAR)); if (!LinkTarget.Buffer) { - DPRINT1("Unable to alloc buffer\n"); + DPRINT("Unable to alloc buffer\n"); if (SymbolicLinkHandle) NtClose(SymbolicLinkHandle); LocalFree(Expanded); return ERROR_NOT_ENOUGH_MEMORY; @@ -1527,7 +1534,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) if (*RelativeName == NULL) { - DPRINT1("Unable to alloc buffer\n"); + DPRINT("Unable to alloc buffer\n"); if (SymbolicLinkHandle) NtClose(SymbolicLinkHandle); LocalFree(Expanded); RtlFreeUnicodeString(&NtPathName); @@ -1557,7 +1564,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) } else { - DPRINT1("Error, Status = %08X\n", Status); + DPRINT("Error, Status = %08X\n", Status); if (SymbolicLinkHandle) NtClose(SymbolicLinkHandle); LocalFree(Expanded); RtlFreeUnicodeString(&NtPathName); @@ -1566,7 +1573,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) } else { - DPRINT1("Error, Status = %08X\n", Status); + DPRINT("Error, Status = %08X\n", Status); if (SymbolicLinkHandle) NtClose(SymbolicLinkHandle); LocalFree(Expanded); RtlFreeUnicodeString(&NtPathName); @@ -1575,7 +1582,7 @@ ScmConvertToBootPathName(wchar_t *CanonName, wchar_t **RelativeName) } else { - DPRINT1("Error, Status = %08X\n", Status); + DPRINT("Error, Status = %08X\n", Status); LocalFree(Expanded); return ERROR_INVALID_PARAMETER; } @@ -1608,7 +1615,7 @@ ScmCanonDriverImagePath(DWORD dwStartType, if (*lpCanonName == NULL) { - DPRINT1("Error allocating memory for canonized service name!\n"); + DPRINT("Error allocating memory for canonized service name!\n"); return ERROR_NOT_ENOUGH_MEMORY; } @@ -1632,7 +1639,7 @@ ScmCanonDriverImagePath(DWORD dwStartType, if (*lpCanonName == NULL) { - DPRINT1("Error allocating memory for canonized service name!\n"); + DPRINT("Error allocating memory for canonized service name!\n"); return ERROR_NOT_ENOUGH_MEMORY; } @@ -1653,7 +1660,7 @@ ScmCanonDriverImagePath(DWORD dwStartType, if (*lpCanonName == NULL) { - DPRINT1("Error allocating memory for canonized service name!\n"); + DPRINT("Error allocating memory for canonized service name!\n"); return ERROR_NOT_ENOUGH_MEMORY; } @@ -1666,7 +1673,7 @@ ScmCanonDriverImagePath(DWORD dwStartType, /* It seems to be a DOS path, convert it */ if (!RtlDosPathNameToNtPathName_U(lpServiceName, &NtServiceName, NULL, NULL)) { - DPRINT1("RtlDosPathNameToNtPathName_U() failed!\n"); + DPRINT("RtlDosPathNameToNtPathName_U() failed!\n"); return ERROR_INVALID_PARAMETER; } @@ -1674,7 +1681,7 @@ ScmCanonDriverImagePath(DWORD dwStartType, if (*lpCanonName == NULL) { - DPRINT1("Error allocating memory for canonized service name!\n"); + DPRINT("Error allocating memory for canonized service name!\n"); RtlFreeUnicodeString(&NtServiceName); return ERROR_NOT_ENOUGH_MEMORY; } @@ -1697,7 +1704,7 @@ ScmCanonDriverImagePath(DWORD dwStartType, { /* There is a problem, free name and return */ LocalFree(*lpCanonName); - DPRINT1("Error converting named!\n"); + DPRINT("Error converting named!\n"); return Result; } @@ -1759,7 +1766,7 @@ DWORD RCreateServiceW( hManager = (PMANAGER_HANDLE)hSCManager; if (!hManager || hManager->Handle.Tag != MANAGER_TAG) { - DPRINT1("Invalid manager handle!\n"); + DPRINT("Invalid manager handle!\n"); return ERROR_INVALID_HANDLE; } @@ -1767,8 +1774,8 @@ DWORD RCreateServiceW( if (!RtlAreAllAccessesGranted(hManager->Handle.DesiredAccess, SC_MANAGER_CREATE_SERVICE)) { - DPRINT1("Insufficient access rights! 0x%lx\n", - hManager->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", + hManager->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } @@ -2086,8 +2093,8 @@ DWORD REnumDependentServicesW( if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, SC_MANAGER_ENUMERATE_SERVICE)) { - DPRINT1("Insufficient access rights! 0x%lx\n", - hSvc->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", + hSvc->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } @@ -2123,7 +2130,7 @@ DWORD REnumDependentServicesW( (dwServicesReturned + 1) * sizeof(PSERVICE)); if (!lpServicesArray) { - DPRINT1("Could not allocate a buffer!!\n"); + DPRINT("Could not allocate a buffer!!\n"); dwError = ERROR_NOT_ENOUGH_MEMORY; goto Done; } @@ -2214,7 +2221,7 @@ DWORD REnumServicesStatusW( hManager = (PMANAGER_HANDLE)hSCManager; if (!hManager || hManager->Handle.Tag != MANAGER_TAG) { - DPRINT1("Invalid manager handle!\n"); + DPRINT("Invalid manager handle!\n"); return ERROR_INVALID_HANDLE; } @@ -2237,7 +2244,7 @@ DWORD REnumServicesStatusW( if (!RtlAreAllAccessesGranted(hManager->Handle.DesiredAccess, SC_MANAGER_ENUMERATE_SERVICE)) { - DPRINT1("Insufficient access rights! 0x%lx\n", + DPRINT("Insufficient access rights! 0x%lx\n", hManager->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } @@ -2418,7 +2425,7 @@ DWORD ROpenSCManagerW( &hHandle); if (dwError != ERROR_SUCCESS) { - DPRINT1("ScmCreateManagerHandle() failed (Error %lu)\n", dwError); + DPRINT("ScmCreateManagerHandle() failed (Error %lu)\n", dwError); return dwError; } @@ -2427,7 +2434,7 @@ DWORD ROpenSCManagerW( dwDesiredAccess | SC_MANAGER_CONNECT); if (dwError != ERROR_SUCCESS) { - DPRINT1("ScmCheckAccess() failed (Error %lu)\n", dwError); + DPRINT("ScmCheckAccess() failed (Error %lu)\n", dwError); HeapFree(GetProcessHeap(), 0, hHandle); return dwError; } @@ -2465,7 +2472,7 @@ DWORD ROpenServiceW( hManager = (PMANAGER_HANDLE)hSCManager; if (!hManager || hManager->Handle.Tag != MANAGER_TAG) { - DPRINT1("Invalid manager handle!\n"); + DPRINT("Invalid manager handle!\n"); return ERROR_INVALID_HANDLE; } @@ -2490,7 +2497,7 @@ DWORD ROpenServiceW( &hHandle); if (dwError != ERROR_SUCCESS) { - DPRINT1("ScmCreateServiceHandle() failed (Error %lu)\n", dwError); + DPRINT("ScmCreateServiceHandle() failed (Error %lu)\n", dwError); return dwError; } @@ -2499,7 +2506,7 @@ DWORD ROpenServiceW( dwDesiredAccess); if (dwError != ERROR_SUCCESS) { - DPRINT1("ScmCheckAccess() failed (Error %lu)\n", dwError); + DPRINT("ScmCheckAccess() failed (Error %lu)\n", dwError); HeapFree(GetProcessHeap(), 0, hHandle); return dwError; } @@ -2545,21 +2552,21 @@ DWORD RQueryServiceConfigW( hSvc = (PSERVICE_HANDLE)hService; if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) { - DPRINT1("Invalid handle tag!\n"); + DPRINT("Invalid handle tag!\n"); return ERROR_INVALID_HANDLE; } if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, SERVICE_QUERY_CONFIG)) { - DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } @@ -2753,21 +2760,21 @@ DWORD RStartServiceW( hSvc = (PSERVICE_HANDLE)hService; if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) { - DPRINT1("Invalid handle tag!\n"); + DPRINT("Invalid handle tag!\n"); return ERROR_INVALID_HANDLE; } if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, SERVICE_START)) { - DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } @@ -2810,7 +2817,7 @@ DWORD RGetServiceDisplayNameW( // hManager = (PMANAGER_HANDLE)hSCManager; // if (hManager->Handle.Tag != MANAGER_TAG) // { -// DPRINT1("Invalid manager handle!\n"); +// DPRINT("Invalid manager handle!\n"); // return ERROR_INVALID_HANDLE; // } @@ -2818,7 +2825,7 @@ DWORD RGetServiceDisplayNameW( lpService = ScmGetServiceEntryByName(lpServiceName); if (lpService == NULL) { - DPRINT1("Could not find a service!\n"); + DPRINT("Could not find a service!\n"); /* If the service could not be found and lpcchBuffer is less than 2, windows puts null in lpDisplayName and puts 2 in lpcchBuffer */ @@ -2884,7 +2891,7 @@ DWORD RGetServiceKeyNameW( // hManager = (PMANAGER_HANDLE)hSCManager; // if (hManager->Handle.Tag != MANAGER_TAG) // { -// DPRINT1("Invalid manager handle!\n"); +// DPRINT("Invalid manager handle!\n"); // return ERROR_INVALID_HANDLE; // } @@ -2892,7 +2899,7 @@ DWORD RGetServiceKeyNameW( lpService = ScmGetServiceEntryByDisplayName(lpDisplayName); if (lpService == NULL) { - DPRINT1("Could not find a service!\n"); + DPRINT("Could not find a service!\n"); /* If the service could not be found and lpcchBuffer is less than 2, windows puts null in lpDisplayName and puts 2 in lpcchBuffer */ @@ -2979,21 +2986,21 @@ DWORD RChangeServiceConfigA( hSvc = (PSERVICE_HANDLE)hService; if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) { - DPRINT1("Invalid handle tag!\n"); + DPRINT("Invalid handle tag!\n"); return ERROR_INVALID_HANDLE; } if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, SERVICE_CHANGE_CONFIG)) { - DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } @@ -3002,7 +3009,7 @@ DWORD RChangeServiceConfigA( if (lpService->bDeleted) { /* FIXME: Unlock database */ - DPRINT1("The service has already been marked for delete!\n"); + DPRINT("The service has already been marked for delete!\n"); return ERROR_SERVICE_MARKED_FOR_DELETE; } @@ -3414,8 +3421,8 @@ DWORD REnumDependentServicesA( if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, SC_MANAGER_ENUMERATE_SERVICE)) { - DPRINT1("Insufficient access rights! 0x%lx\n", - hSvc->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", + hSvc->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } @@ -3456,7 +3463,7 @@ DWORD REnumDependentServicesA( (dwServicesReturned + 1) * sizeof(PSERVICE)); if (!lpServicesArray) { - DPRINT1("Could not allocate a buffer!!\n"); + DPRINT("Could not allocate a buffer!!\n"); dwError = ERROR_NOT_ENOUGH_MEMORY; goto Done; } @@ -3554,7 +3561,7 @@ DWORD REnumServicesStatusA( lpStatusPtrW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwBufSize); if (!lpStatusPtrW) { - DPRINT1("Failed to allocate buffer!\n"); + DPRINT("Failed to allocate buffer!\n"); return ERROR_NOT_ENOUGH_MEMORY; } } @@ -3719,21 +3726,21 @@ DWORD RQueryServiceConfigA( hSvc = (PSERVICE_HANDLE)hService; if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) { - DPRINT1("Invalid handle tag!\n"); + DPRINT("Invalid handle tag!\n"); return ERROR_INVALID_HANDLE; } if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, SERVICE_QUERY_CONFIG)) { - DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } @@ -3952,7 +3959,7 @@ DWORD RStartServiceA( PSERVICE_HANDLE hSvc; PSERVICE lpService = NULL; - DPRINT1("RStartServiceA() called\n"); + DPRINT("RStartServiceA() called\n"); if (ScmShutdown) return ERROR_SHUTDOWN_IN_PROGRESS; @@ -3960,21 +3967,21 @@ DWORD RStartServiceA( hSvc = (PSERVICE_HANDLE)hService; if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) { - DPRINT1("Invalid handle tag!\n"); + DPRINT("Invalid handle tag!\n"); return ERROR_INVALID_HANDLE; } if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, SERVICE_START)) { - DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } @@ -4017,7 +4024,7 @@ DWORD RGetServiceDisplayNameA( // hManager = (PMANAGER_HANDLE)hSCManager; // if (hManager->Handle.Tag != MANAGER_TAG) // { -// DPRINT1("Invalid manager handle!\n"); +// DPRINT("Invalid manager handle!\n"); // return ERROR_INVALID_HANDLE; // } @@ -4044,7 +4051,7 @@ DWORD RGetServiceDisplayNameA( if (lpService == NULL) { - DPRINT1("Could not find a service!\n"); + DPRINT("Could not find a service!\n"); /* If the service could not be found and lpcchBuffer is 0, windows puts null in lpDisplayName and puts 1 in lpcchBuffer */ @@ -4140,7 +4147,7 @@ DWORD RGetServiceKeyNameA( if (lpService == NULL) { - DPRINT1("Could not find the service!\n"); + DPRINT("Could not find the service!\n"); /* If the service could not be found and lpcchBuffer is 0, put null in lpDisplayName and puts 1 in lpcchBuffer, verified WINXP. */ @@ -4341,21 +4348,21 @@ DWORD RChangeServiceConfig2W( hSvc = (PSERVICE_HANDLE)hService; if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) { - DPRINT1("Invalid handle tag!\n"); + DPRINT("Invalid handle tag!\n"); return ERROR_INVALID_HANDLE; } if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, SERVICE_CHANGE_CONFIG)) { - DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } @@ -4364,7 +4371,7 @@ DWORD RChangeServiceConfig2W( if (lpService->bDeleted) { /* FIXME: Unlock database */ - DPRINT1("The service has already been marked for delete!\n"); + DPRINT("The service has already been marked for delete!\n"); return ERROR_SERVICE_MARKED_FOR_DELETE; } @@ -4385,7 +4392,7 @@ DWORD RChangeServiceConfig2W( if (lpServiceDescription != NULL && lpServiceDescription->lpDescription != NULL) { - DPRINT1("Setting value %S\n", lpServiceDescription->lpDescription); + DPRINT("Setting value %S\n", lpServiceDescription->lpDescription); RegSetValueExW(hServiceKey, L"Description", 0, @@ -4430,8 +4437,8 @@ DWORD RQueryServiceConfig2A( LPWSTR lpDescriptionW = NULL; LPSTR lpDescription = NULL; - DPRINT1("RQueryServiceConfig2A() called hService %p dwInfoLevel %u, lpBuffer %p cbBufSize %u pcbBytesNeeded %p\n", - hService, dwInfoLevel, lpBuffer, cbBufSize, pcbBytesNeeded); + DPRINT("RQueryServiceConfig2A() called hService %p dwInfoLevel %u, lpBuffer %p cbBufSize %u pcbBytesNeeded %p\n", + hService, dwInfoLevel, lpBuffer, cbBufSize, pcbBytesNeeded); if (!lpBuffer) return ERROR_INVALID_ADDRESS; @@ -4442,21 +4449,21 @@ DWORD RQueryServiceConfig2A( hSvc = (PSERVICE_HANDLE)hService; if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) { - DPRINT1("Invalid handle tag!\n"); + DPRINT("Invalid handle tag!\n"); return ERROR_INVALID_HANDLE; } if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, SERVICE_QUERY_CONFIG)) { - DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } @@ -4562,21 +4569,21 @@ DWORD RQueryServiceConfig2W( hSvc = (PSERVICE_HANDLE)hService; if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) { - DPRINT1("Invalid handle tag!\n"); + DPRINT("Invalid handle tag!\n"); return ERROR_INVALID_HANDLE; } if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, SERVICE_QUERY_CONFIG)) { - DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } @@ -4715,21 +4722,21 @@ DWORD RQueryServiceStatusEx( hSvc = (PSERVICE_HANDLE)hService; if (!hSvc || hSvc->Handle.Tag != SERVICE_TAG) { - DPRINT1("Invalid handle tag!\n"); + DPRINT("Invalid handle tag!\n"); return ERROR_INVALID_HANDLE; } if (!RtlAreAllAccessesGranted(hSvc->Handle.DesiredAccess, SERVICE_QUERY_STATUS)) { - DPRINT1("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", hSvc->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } lpService = hSvc->ServiceEntry; if (lpService == NULL) { - DPRINT1("lpService == NULL!\n"); + DPRINT("lpService == NULL!\n"); return ERROR_INVALID_HANDLE; } @@ -4775,7 +4782,7 @@ DWORD REnumServicesStatusExA( pszGroupNameW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (strlen(pszGroupName) + 1) * sizeof(WCHAR)); if (!pszGroupNameW) { - DPRINT1("Failed to allocate buffer!\n"); + DPRINT("Failed to allocate buffer!\n"); return ERROR_NOT_ENOUGH_MEMORY; } @@ -4792,7 +4799,7 @@ DWORD REnumServicesStatusExA( lpStatusPtrW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cbBufSize); if (!lpStatusPtrW) { - DPRINT1("Failed to allocate buffer!\n"); + DPRINT("Failed to allocate buffer!\n"); return ERROR_NOT_ENOUGH_MEMORY; } } @@ -4908,7 +4915,7 @@ DWORD REnumServicesStatusExW( hManager = (PMANAGER_HANDLE)hSCManager; if (!hManager || hManager->Handle.Tag != MANAGER_TAG) { - DPRINT1("Invalid manager handle!\n"); + DPRINT("Invalid manager handle!\n"); return ERROR_INVALID_HANDLE; } @@ -4917,13 +4924,13 @@ DWORD REnumServicesStatusExW( if ((dwServiceType!=SERVICE_DRIVER) && (dwServiceType!=SERVICE_WIN32)) { - DPRINT1("Not a valid Service Type!\n"); + DPRINT("Not a valid Service Type!\n"); return ERROR_INVALID_PARAMETER; } if ((dwServiceStateSERVICE_STATE_ALL)) { - DPRINT1("Not a valid Service State!\n"); + DPRINT("Not a valid Service State!\n"); return ERROR_INVALID_PARAMETER; } @@ -4931,8 +4938,8 @@ DWORD REnumServicesStatusExW( if (!RtlAreAllAccessesGranted(hManager->Handle.DesiredAccess, SC_MANAGER_ENUMERATE_SERVICE)) { - DPRINT1("Insufficient access rights! 0x%lx\n", - hManager->Handle.DesiredAccess); + DPRINT("Insufficient access rights! 0x%lx\n", + hManager->Handle.DesiredAccess); return ERROR_ACCESS_DENIED; } diff --git a/reactos/base/system/services/services.c b/reactos/base/system/services/services.c index 44ee8f396af..2d97ce44f4f 100644 --- a/reactos/base/system/services/services.c +++ b/reactos/base/system/services/services.c @@ -279,7 +279,7 @@ ShutdownHandlerRoutine(DWORD dwCtrlType) { DPRINT1("ShutdownHandlerRoutine() called\n"); - if (dwCtrlType == CTRL_SHUTDOWN_EVENT) + if (dwCtrlType & (CTRL_SHUTDOWN_EVENT | CTRL_LOGOFF_EVENT)) { DPRINT1("Shutdown event received!\n"); ScmShutdown = TRUE; diff --git a/reactos/base/system/services/services.h b/reactos/base/system/services/services.h index 23022dc2c92..8371ad18b71 100644 --- a/reactos/base/system/services/services.h +++ b/reactos/base/system/services/services.h @@ -42,7 +42,6 @@ typedef struct _SERVICE DWORD dwResumeCount; DWORD dwRefCount; - CLIENT_HANDLE hClient; SERVICE_STATUS Status; DWORD dwStartType; DWORD dwErrorControl; @@ -112,15 +111,18 @@ DWORD ScmStartService(PSERVICE Service, PSERVICE ScmGetServiceEntryByName(LPCWSTR lpServiceName); PSERVICE ScmGetServiceEntryByDisplayName(LPCWSTR lpDisplayName); PSERVICE ScmGetServiceEntryByResumeCount(DWORD dwResumeCount); -PSERVICE ScmGetServiceEntryByClientHandle(HANDLE Handle); DWORD ScmCreateNewServiceRecord(LPCWSTR lpServiceName, PSERVICE *lpServiceRecord); VOID ScmDeleteServiceRecord(PSERVICE lpService); DWORD ScmMarkServiceForDelete(PSERVICE pService); DWORD ScmControlService(PSERVICE Service, - DWORD dwControl, - LPSERVICE_STATUS lpServiceStatus); + DWORD dwControl); + +BOOL ScmLockDatabaseExclusive(VOID); +BOOL ScmLockDatabaseShared(VOID); +VOID ScmUnlockDatabase(VOID); + /* driver.c */ diff --git a/reactos/base/system/winlogon/lang/de-DE.rc b/reactos/base/system/winlogon/lang/de-DE.rc index 398907674e7..22acc39d009 100644 --- a/reactos/base/system/winlogon/lang/de-DE.rc +++ b/reactos/base/system/winlogon/lang/de-DE.rc @@ -14,11 +14,11 @@ END IDD_GINALOADFAILED DIALOGEX 58, 83, 231, 119 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Benutzer Interface Fehler" +CAPTION "Benutzerinterface-Fehler" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Die Logon Benutzer Schnittstelle DLL %s konnte nicht geladen werden.", IDC_GINALOADFAILED, 39, 16, 156, 24 - LTEXT "Kontaktieren Sie Ihren Systemadministrator um die DLL zu ersetzen, oder stellen Sie die Original-DLL wieder her.", IDC_GINALOADFAILEDCONTACT, 39, 53, 151, 25 + LTEXT "Die Logon-Benutzerschnittstellen-DLL %s konnte nicht geladen werden.", IDC_GINALOADFAILED, 39, 16, 156, 24 + LTEXT "Kontaktieren Sie Ihren Systemadministrator, um die DLL zu ersetzen, oder stellen Sie die Original-DLL wieder her.", IDC_GINALOADFAILEDCONTACT, 39, 53, 151, 25 DEFPUSHBUTTON "Neusta&rt", 1, 80, 91, 68, 14 END @@ -32,9 +32,9 @@ BEGIN IDS_RUNNINGLOGOFFSCRIPTS "Abmeldeskripte ausfhren..." IDS_RUNNINGLOGONSCRIPTS "Anmeldeskripte ausfhren..." IDS_LOADINGYOURPERSONALSETTINGS "Ihre persnlichen Einstellungen laden..." - IDS_CLOSINGNETWORKCONNECTIONS "Netzwerkverbindungen schliessen..." + IDS_CLOSINGNETWORKCONNECTIONS "Netzwerkverbindungen schlieen..." IDS_REACTOSISSHUTTINGDOWN "ReactOS fhrt herunter..." - IDS_PREPARETOSTANDBY "Vorbereiten fr den StandBy Modus..." + IDS_PREPARETOSTANDBY "Vorbereiten fr den Stromsparmodus..." IDS_PREPARETOHIBERNATE "Vorbereiten fr den Ruhezustand..." IDS_SAVEYOURSETTINGS "Speichern Ihrer persnlichen Einstellungen..." IDS_REACTOSISSTARTINGUP "ReactOS startet..." diff --git a/reactos/base/system/winlogon/setup.h b/reactos/base/system/winlogon/setup.h index efc1d4a3723..d16dbf3b134 100644 --- a/reactos/base/system/winlogon/setup.h +++ b/reactos/base/system/winlogon/setup.h @@ -24,12 +24,9 @@ * PROGRAMMER: Eric Kohl */ -#ifndef __SETUP_H__ -#define __SETUP_H__ +#pragma once DWORD GetSetupType (VOID); BOOL RunSetup (VOID); -#endif /* __SETUP_H__ */ - /* EOF */ diff --git a/reactos/baseaddress.rbuild b/reactos/baseaddress.rbuild index 38f23cbeb2e..80401c1db46 100644 --- a/reactos/baseaddress.rbuild +++ b/reactos/baseaddress.rbuild @@ -3,6 +3,7 @@ + @@ -25,6 +26,7 @@ + @@ -116,6 +118,7 @@ + diff --git a/reactos/boot/armllb/armllb.rbuild b/reactos/boot/armllb/armllb.rbuild index 5e254c43071..2566c788011 100644 --- a/reactos/boot/armllb/armllb.rbuild +++ b/reactos/boot/armllb/armllb.rbuild @@ -1,65 +1,66 @@ - + - - - libcntpr - rtl - ./inc - - - - -Wl,--image-base=0x401FEFF8 - - - - - - -Wl,--image-base=0xF000 - - - boot.s - main.c - crtsupp.c - envir.c - fw.c - - keyboard.c - serial.c - time.c - video.c - - - hwdata.c - hwdss.c - hwuart.c - hwinfo.c - - - - - - hwclcd.c - hwkmi.c - hwuart.c - hwinfo.c - hwinit.c - - - - - loader.c - - - -fms-extensions - -ffreestanding - -fno-builtin - -fno-inline - -fno-zero-initialized-in-bss - -Os - - - -lgcc - - + + + libcntpr + rtl + ./inc + + + + -Wl,--image-base=0x401FEFF8 + + + + + + -Wl,--image-base=0xF000 + + + boot.s + main.c + crtsupp.c + envir.c + fw.c + + keyboard.c + serial.c + time.c + video.c + + + hwdata.c + hwdss.c + hwuart.c + hwinfo.c + hwinit.c + + + + + hwclcd.c + hwkmi.c + hwuart.c + hwinfo.c + hwinit.c + + + + + loader.c + + + -fms-extensions + -ffreestanding + -fno-builtin + -fno-inline + -fno-zero-initialized-in-bss + -Os + + + + -lgcc + + diff --git a/reactos/boot/armllb/fw.c b/reactos/boot/armllb/fw.c index 82dcd7a4c22..4286b4ababa 100644 --- a/reactos/boot/armllb/fw.c +++ b/reactos/boot/armllb/fw.c @@ -8,6 +8,26 @@ #include "precomp.h" +USHORT ColorPalette[16][3] = +{ + {0x00, 0x00, 0x00}, + {0x00, 0x00, 0xAA}, + {0x00, 0xAA, 0x00}, + {0x00, 0xAA, 0xAA}, + {0xAA, 0x00, 0x00}, + {0xAA, 0x00, 0xAA}, + {0xAA, 0x55, 0x00}, + {0xAA, 0xAA, 0xAA}, + {0x55, 0x55, 0x55}, + {0x55, 0x55, 0xFF}, + {0x55, 0xFF, 0x55}, + {0x55, 0xFF, 0xFF}, + {0xFF, 0x55, 0x55}, + {0xFF, 0x55, 0xFF}, + {0xFF, 0xFF, 0x55}, + {0xFF, 0xFF, 0xFF}, +}; + VOID LlbFwPutChar(INT Ch) { @@ -53,55 +73,6 @@ LlbFwVideoGetDisplaySize(OUT PULONG Width, *Depth = 16; } -ULONG -LlbFwVideoGetBufferSize(VOID) -{ - /* X * Y * BPP */ - return LlbHwGetScreenWidth() * LlbHwGetScreenHeight() * 2; -} - -VOID -LlbFwVideoSetTextCursorPosition(IN ULONG X, - IN ULONG Y) -{ - printf("%s is UNIMPLEMENTED", __FUNCTION__); - while (TRUE); -} - -VOID -LlbFwVideoHideShowTextCursor(IN BOOLEAN Show) -{ - /* Nothing to do */ - return; -} - -USHORT ColorPalette[16][3] = -{ - {0x00, 0x00, 0x00}, - {0x00, 0x00, 0xAA}, - {0x00, 0xAA, 0x00}, - {0x00, 0xAA, 0xAA}, - {0xAA, 0x00, 0x00}, - {0xAA, 0x00, 0xAA}, - {0xAA, 0x55, 0x00}, - {0xAA, 0xAA, 0xAA}, - {0x55, 0x55, 0x55}, - {0x55, 0x55, 0xFF}, - {0x55, 0xFF, 0x55}, - {0x55, 0xFF, 0xFF}, - {0xFF, 0x55, 0x55}, - {0xFF, 0x55, 0xFF}, - {0xFF, 0xFF, 0x55}, - {0xFF, 0xFF, 0xFF}, -}; - -VOID -LlbFwVideoCopyOffScreenBufferToVRAM(IN PVOID Buffer) -{ - /* No double-buffer is used on ARM */ - return; -} - VOID LlbFwVideoClearScreen(IN UCHAR Attr) { @@ -133,43 +104,6 @@ LlbFwVideoPutChar(IN INT c, LlbVideoDrawChar(c, Buffer, Color, BackColor); } -BOOLEAN -LlbFwVideoIsPaletteFixed(VOID) -{ - printf("%s is UNIMPLEMENTED", __FUNCTION__); - while (TRUE); - return TRUE; -} - -VOID -LlbFwVideoSetPaletteColor(IN UCHAR Color, - IN UCHAR Red, - IN UCHAR Green, - IN UCHAR Blue) -{ - printf("%s is UNIMPLEMENTED", __FUNCTION__); - while (TRUE); - return; -} - -VOID -LlbFwVideoGetPaletteColor(IN UCHAR Color, - OUT PUCHAR Red, - OUT PUCHAR Green, - OUT PUCHAR Blue) -{ - printf("%s is UNIMPLEMENTED", __FUNCTION__); - while (TRUE); - return; -} - -VOID -LlbFwVideoSync(VOID) -{ - printf("%s is UNIMPLEMENTED", __FUNCTION__); - while (TRUE); - return; -} TIMEINFO* LlbFwGetTime(VOID) diff --git a/reactos/boot/armllb/hw/versatile/hwclcd.c b/reactos/boot/armllb/hw/versatile/hwclcd.c index 438804d2b24..3131880338f 100755 --- a/reactos/boot/armllb/hw/versatile/hwclcd.c +++ b/reactos/boot/armllb/hw/versatile/hwclcd.c @@ -32,7 +32,7 @@ LlbHwVersaClcdInitialize(VOID) WRITE_REGISTER_ULONG(PL110_LCDUPBASE, (ULONG)LlbHwGetFrameBuffer()); WRITE_REGISTER_ULONG(PL110_LCDLPBASE, (ULONG)LlbHwGetFrameBuffer()); - /* Initialize timings to 1024x720 */ + /* Initialize timings to 720x400 */ WRITE_REGISTER_ULONG(PL110_LCDTIMING0, LCDTIMING0_PPL(LlbHwGetScreenWidth())); WRITE_REGISTER_ULONG(PL110_LCDTIMING1, LCDTIMING1_LPP(LlbHwGetScreenHeight())); diff --git a/reactos/boot/armllb/hw/versatile/hwinfo.c b/reactos/boot/armllb/hw/versatile/hwinfo.c index c312e125552..c1dd350f884 100755 --- a/reactos/boot/armllb/hw/versatile/hwinfo.c +++ b/reactos/boot/armllb/hw/versatile/hwinfo.c @@ -47,8 +47,8 @@ LlbHwGetSerialUart(VOID) // 0x00000200 - 0x0000FFFF ARM STACK [ 62 KB] // 0x00010000 - 0x0001FFFF ARM LLB [ 64 KB] // 0x00020000 - 0x0009FFFF ARM OS LOADER [512 KB] -// 0x000A0000 - 0x000FFFFF ARM FRAMEBUFFER [384 KB] -// 0x00100000 - 0x007FFFFF OS LOADER FREE/UNUSED [ 7 MB] +// 0x000A0000 - 0x0013FFFF ARM FRAMEBUFFER [640 KB] +// 0x00140000 - 0x007FFFFF OS LOADER FREE/UNUSED [ 6 MB] // 0x00800000 - 0x017FFFFF KERNEL, HAL, INITIAL DRIVER LOAD ADDR [ 16 MB] // 0x01800000 - 0x037FFFFF RAM DISK [ 32 MB] // 0x03800000 - 0x07FFFFFF FREE RAM [ 72 MB] @@ -61,8 +61,8 @@ BIOS_MEMORY_MAP LlbHwVersaMemoryMap[] = {0x00000200, 0x0000FE00, BiosMemoryBootStrap, 0}, {0x00010000, 0x00010000, BiosMemoryBootStrap, 0}, {0x00020000, 0x00080000, BiosMemoryBootLoader, 0}, - {0x000A0000, 0x00060000, BiosMemoryBootLoader, 0}, - {0x00100000, 0x01700000, BiosMemoryUsable, 0}, + {0x000A0000, 0x000A0000, BiosMemoryBootLoader, 0}, + {0x00140000, 0x016C0000, BiosMemoryUsable, 0}, {0x01800000, 0x02000000, BiosMemoryReserved, 0}, {0x10000000, 0x10000000, BiosMemoryReserved, 0}, {0, 0, 0, 0} diff --git a/reactos/boot/armllb/hw/video.c b/reactos/boot/armllb/hw/video.c index cfe1f60eebc..3e3179aa404 100644 --- a/reactos/boot/armllb/hw/video.c +++ b/reactos/boot/armllb/hw/video.c @@ -274,7 +274,7 @@ ULONG ScreenCursor; VOID NTAPI -LlbVideoDrawChar(IN CHAR c, +LlbVideoDrawChar(IN UCHAR c, IN PUSHORT Buffer, IN USHORT Color, IN USHORT BackColor) @@ -342,7 +342,7 @@ LlbVideoClearScreen(IN BOOLEAN OsLoader) VOID NTAPI -LlbVideoPutChar(IN CHAR c) +LlbVideoPutChar(IN UCHAR c) { ULONG cx, cy, CharsPerLine, BackColor, ScreenWidth; diff --git a/reactos/boot/armllb/inc/video.h b/reactos/boot/armllb/inc/video.h index 0e67123c934..c38ce4278f0 100755 --- a/reactos/boot/armllb/inc/video.h +++ b/reactos/boot/armllb/inc/video.h @@ -15,13 +15,13 @@ LlbVideoClearScreen( VOID NTAPI LlbVideoPutChar( - IN CHAR c + IN UCHAR c ); VOID NTAPI LlbVideoDrawChar( - IN CHAR c, + IN UCHAR c, IN PUSHORT Buffer, IN USHORT Color, IN USHORT BackColor diff --git a/reactos/boot/armllb/os/loader.c b/reactos/boot/armllb/os/loader.c index 7d0e9fcf995..5b7caa65578 100755 --- a/reactos/boot/armllb/os/loader.c +++ b/reactos/boot/armllb/os/loader.c @@ -76,16 +76,7 @@ LlbBuildArmBlock(VOID) ArmBlock.VideoClearScreen = LlbFwVideoClearScreen; ArmBlock.VideoSetDisplayMode = LlbFwVideoSetDisplayMode; ArmBlock.VideoGetDisplaySize = LlbFwVideoGetDisplaySize; - ArmBlock.VideoGetBufferSize = LlbFwVideoGetBufferSize; - ArmBlock.VideoSetTextCursorPosition = LlbFwVideoSetTextCursorPosition; - ArmBlock.VideoSetTextCursorPosition = LlbFwVideoSetTextCursorPosition; - ArmBlock.VideoHideShowTextCursor = LlbFwVideoHideShowTextCursor; ArmBlock.VideoPutChar = LlbFwVideoPutChar; - ArmBlock.VideoCopyOffScreenBufferToVRAM = LlbFwVideoCopyOffScreenBufferToVRAM; - ArmBlock.VideoIsPaletteFixed = LlbFwVideoIsPaletteFixed; - ArmBlock.VideoSetPaletteColor = LlbFwVideoSetPaletteColor; - ArmBlock.VideoGetPaletteColor = LlbFwVideoGetPaletteColor; - ArmBlock.VideoSync = LlbFwVideoSync; ArmBlock.GetTime = LlbFwGetTime; } diff --git a/reactos/boot/freeldr/fdebug/rs232.h b/reactos/boot/freeldr/fdebug/rs232.h index 8697427f3c9..1e0a3f96391 100644 --- a/reactos/boot/freeldr/fdebug/rs232.h +++ b/reactos/boot/freeldr/fdebug/rs232.h @@ -19,9 +19,7 @@ */ -#ifndef __RS232_H -#define __RS232_H - +#pragma once #ifdef __cplusplus extern "C" { @@ -42,5 +40,3 @@ BOOL Rs232WriteByteWin32(BYTE DataByte); #ifdef __cplusplus } #endif /* __cplusplus */ - -#endif // !defined(__RS232_H) diff --git a/reactos/boot/freeldr/freeldr.rbuild b/reactos/boot/freeldr/freeldr.rbuild index a21fea7f88d..422cd3cc1df 100644 --- a/reactos/boot/freeldr/freeldr.rbuild +++ b/reactos/boot/freeldr/freeldr.rbuild @@ -10,8 +10,18 @@ - - + + + + + + + + + + + + diff --git a/reactos/boot/freeldr/freeldr/arch/arm/boot.s b/reactos/boot/freeldr/freeldr/arch/arm/boot.s index 64cf06a7035..cbe9e9b5217 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/boot.s +++ b/reactos/boot/freeldr/freeldr/arch/arm/boot.s @@ -19,19 +19,3 @@ L_ArmInit: .long ArmInit - -.global PageDirectoryStart, PageDirectoryEnd -.global startup_pagedirectory -.global kernel_pagetable - -.bss -PageDirectoryStart: -kernel_pagetable: - .fill 2*4096, 1, 0 - .space 4096 -startup_pagedirectory: - .fill 4*4096, 1, 0 - - -.global PageDirectoryEnd -PageDirectoryEnd: diff --git a/reactos/boot/freeldr/freeldr/arch/arm/loader.c b/reactos/boot/freeldr/freeldr/arch/arm/loader.c deleted file mode 100644 index 80bb14f809e..00000000000 --- a/reactos/boot/freeldr/freeldr/arch/arm/loader.c +++ /dev/null @@ -1,1668 +0,0 @@ -/* - * PROJECT: ReactOS Boot Loader - * LICENSE: BSD - See COPYING.ARM in the top level directory - * FILE: boot/freeldr/arch/arm/loader.c - * PURPOSE: ARM Kernel Loader - * PROGRAMMERS: ReactOS Portable Systems Group - */ - -/* INCLUDES *******************************************************************/ - -#include -#include -#include -#include - -#define KERNEL_DESCRIPTOR_PAGE(x) (((ULONG_PTR)x &~ KSEG0_BASE) >> PAGE_SHIFT) - -/* GLOBALS ********************************************************************/ - -typedef struct _BIOS_MEMORY_DESCRIPTOR -{ - ULONG BlockBase; - ULONG BlockSize; -} BIOS_MEMORY_DESCRIPTOR, *PBIOS_MEMORY_DESCRIPTOR; - -ULONG PageDirectoryStart, PageDirectoryEnd; -PLOADER_PARAMETER_BLOCK ArmLoaderBlock; -CHAR ArmCommandLine[256]; -CHAR ArmArcBootPath[64]; -CHAR ArmArcHalPath[64]; -CHAR ArmNtHalPath[64]; -CHAR ArmNtBootPath[64]; -PNLS_DATA_BLOCK ArmNlsDataBlock; -PLOADER_PARAMETER_EXTENSION ArmExtension; -BIOS_MEMORY_DESCRIPTOR ArmBoardMemoryDescriptors[16] = {{0}}; -PBIOS_MEMORY_DESCRIPTOR ArmBoardMemoryList = ArmBoardMemoryDescriptors; -ULONG NumberDescriptors = 0; -MEMORY_DESCRIPTOR MDArray[16] = {{0}}; -ULONG ArmSharedHeapSize; -PCHAR ArmSharedHeap; - -extern PAGE_DIRECTORY_ARM startup_pagedirectory; -extern ROS_KERNEL_ENTRY_POINT KernelEntryPoint; -extern ULONG_PTR KernelBase; - -extern ADDRESS_RANGE ArmBoardMemoryMap[16]; -extern ULONG ArmBoardMemoryMapRangeCount; -extern ULONG_PTR AnsiData, OemData, UnicodeData, RegistryData, KernelData, HalData, DriverData[16]; -extern ULONG RegistrySize, AnsiSize, OemSize, UnicodeSize, KernelSize, HalSize, DriverSize[16]; -extern PCHAR DriverName[16]; -extern ULONG Drivers; -extern ULONG BootStack; - -ULONG SizeBits[] = -{ - -1, // INVALID - -1, // INVALID - 1 << 12, // 4KB - 1 << 13, // 8KB - 1 << 14, // 16KB - 1 << 15, // 32KB - 1 << 16, // 64KB - 1 << 17 // 128KB -}; - -ULONG AssocBits[] = -{ - -1, // INVALID - -1, // INVALID - 4 // 4-way associative -}; - -ULONG LenBits[] = -{ - -1, // INVALID - -1, // INVALID - 8 // 8 words per line (32 bytes) -}; - -// -// Where to map the serial port -// -#define UART_VIRTUAL 0xE0000000 - -/* FUNCTIONS ******************************************************************/ - -PVOID -ArmAllocateFromSharedHeap(IN ULONG Size) -{ - PVOID Buffer; - - // - // Allocate from the shared heap - // - Buffer = &ArmSharedHeap[ArmSharedHeapSize]; - ArmSharedHeapSize += Size; - return Buffer; -} - -PMEMORY_ALLOCATION_DESCRIPTOR -NTAPI -ArmAllocateMemoryDescriptor(VOID) -{ - // - // Allocate a descriptor from the heap - // - return ArmAllocateFromSharedHeap(sizeof(MEMORY_ALLOCATION_DESCRIPTOR)); -} - -VOID -NTAPI -ArmAddBoardMemoryDescriptor(IN ULONG Address, - IN ULONG Size) -{ - PBIOS_MEMORY_DESCRIPTOR BiosBlock = ArmBoardMemoryList; - - // - // Loop board DRAM configuration - // - while (BiosBlock->BlockSize > 0) - { - /* Check if we've found a matching head block */ - if (Address + Size == BiosBlock->BlockBase) - { - /* Simply enlarge and rebase it */ - BiosBlock->BlockBase = Address; - BiosBlock->BlockSize += Size; - break; - } - - /* Check if we've found a matching tail block */ - if (Address == (BiosBlock->BlockBase + BiosBlock->BlockSize)) - { - /* Simply enlarge it */ - BiosBlock->BlockSize += Size; - break; - } - - /* Nothing suitable found, try the next block */ - BiosBlock++; - } - - /* No usable blocks found, found a free block instead */ - if (!BiosBlock->BlockSize) - { - /* Write our data */ - BiosBlock->BlockBase = Address; - BiosBlock->BlockSize = Size; - - /* Create a new block and mark it as the end of the array */ - BiosBlock++; - BiosBlock->BlockBase = BiosBlock->BlockSize = 0L; - } -} - -VOID -NTAPI -ArmBuildBoardMemoryMap(VOID) -{ - ULONG BlockBegin, BlockEnd; - ULONG j; - - /* Loop the BIOS Memory Map */ - for (j = 0; j < ArmBoardMemoryMapRangeCount; j++) - { - /* Get the start and end addresses */ - BlockBegin = ArmBoardMemoryMap[j].BaseAddrLow; - BlockEnd = ArmBoardMemoryMap[j].BaseAddrLow + ArmBoardMemoryMap[j].LengthLow - 1; - - /* Make sure this isn't a > 4GB descriptor */ - if (!ArmBoardMemoryMap[j].BaseAddrHigh) - { - /* Make sure we don't overflow */ - if (BlockEnd < BlockBegin) BlockEnd = 0xFFFFFFFF; - - /* Check if this is free memory */ - if (ArmBoardMemoryMap[j].Type == 1) - { - /* Add it to our BIOS descriptors */ - ArmAddBoardMemoryDescriptor(BlockBegin, BlockEnd - BlockBegin + 1); - } - } - } -} - -NTSTATUS -NTAPI -ArmConfigureArcDescriptor(IN ULONG PageBegin, - IN ULONG PageEnd, - IN TYPE_OF_MEMORY MemoryType) -{ - ULONG i; - ULONG BlockBegin, BlockEnd; - MEMORY_TYPE BlockType; - BOOLEAN Combined = FALSE; - - /* If this descriptor seems bogus, just return */ - if (PageEnd <= PageBegin) return STATUS_SUCCESS; - - /* Loop every ARC descriptor, trying to find one we can modify */ - for (i = 0; i < NumberDescriptors; i++) - { - /* Get its settings */ - BlockBegin = MDArray[i].BasePage; - BlockEnd = MDArray[i].BasePage + MDArray[i].PageCount; - BlockType = MDArray[i].MemoryType; - - /* Check if we can fit inside this block */ - if (BlockBegin < PageBegin) - { - /* Check if we are larger then it */ - if ((BlockEnd > PageBegin) && (BlockEnd <= PageEnd)) - { - /* Make it end where we start */ - BlockEnd = PageBegin; - } - - /* Check if it ends after we do */ - if (BlockEnd > PageEnd) - { - /* Make sure we can allocate a descriptor */ - if (NumberDescriptors == 60) return ENOMEM; - - /* Create a descriptor for whatever memory we're not part of */ - MDArray[NumberDescriptors].MemoryType = BlockType; - MDArray[NumberDescriptors].BasePage = PageEnd; - MDArray[NumberDescriptors].PageCount = BlockEnd - PageEnd; - NumberDescriptors++; - - /* The next block ending is now where we begin */ - BlockEnd = PageBegin; - } - } - else - { - /* Check if the blog begins inside our range */ - if (BlockBegin < PageEnd) - { - /* Check if it ends before we do */ - if (BlockEnd < PageEnd) - { - /* Then make it disappear */ - BlockEnd = BlockBegin; - } - else - { - /* Otherwise make it start where we end */ - BlockBegin = PageEnd; - } - } - } - - /* Check if the block matches us, and we haven't tried combining yet */ - if ((BlockType == MemoryType) && !(Combined)) - { - /* Check if it starts where we end */ - if (BlockBegin == PageEnd) - { - /* Make it start with us, and combine us */ - BlockBegin = PageBegin; - Combined = TRUE; - } - else if (BlockEnd == PageBegin) - { - /* Otherwise, it ends where we begin, combine its ending */ - BlockEnd = PageEnd; - Combined = TRUE; - } - } - - /* Check the original block data matches with what we came up with */ - if ((MDArray[i].BasePage == BlockBegin) && - (MDArray[i].PageCount == BlockEnd - BlockBegin)) - { - /* Then skip it */ - continue; - } - - /* Otherwise, set our new settings for this block */ - MDArray[i].BasePage = BlockBegin; - MDArray[i].PageCount = BlockEnd - BlockBegin; - - /* Check if we are killing the block */ - if (BlockBegin == BlockEnd) - { - /* Delete this block and restart the loop properly */ - NumberDescriptors--; - if (i < NumberDescriptors) MDArray[i] = MDArray[NumberDescriptors]; - i--; - } - } - - /* If we got here without combining, we need to allocate a new block */ - if (!(Combined) && (MemoryType < LoaderMaximum)) - { - /* Make sure there's enough descriptors */ - if (NumberDescriptors == 60) return ENOMEM; - - /* Allocate a new block with our data */ - MDArray[NumberDescriptors].MemoryType = MemoryType; - MDArray[NumberDescriptors].BasePage = PageBegin; - MDArray[NumberDescriptors].PageCount = PageEnd - PageBegin; - NumberDescriptors++; - } - - /* Changes complete, return success */ - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -ArmBuildOsMemoryMap(VOID) -{ - PBIOS_MEMORY_DESCRIPTOR MdBlock; - ULONG BlockStart, BlockEnd, BiasedStart, BiasedEnd, PageStart, PageEnd; - NTSTATUS Status = STATUS_SUCCESS; - - /* Loop the BIOS Memory Descriptor List */ - MdBlock = ArmBoardMemoryList; - while (MdBlock->BlockSize) - { - /* Get the statrt and end addresses */ - BlockStart = MdBlock->BlockBase; - BlockEnd = BlockStart + MdBlock->BlockSize - 1; - - /* Align them to page boundaries */ - BiasedStart = BlockStart & (PAGE_SIZE - 1); - if (BiasedStart) BlockStart = BlockStart + PAGE_SIZE - BiasedStart; - BiasedEnd = (BlockEnd + 1) & (ULONG)(PAGE_SIZE - 1); - if (BiasedEnd) BlockEnd -= BiasedEnd; - - /* Get the actual page numbers */ - PageStart = BlockStart >> PAGE_SHIFT; - PageEnd = (BlockEnd + 1) >> PAGE_SHIFT; - - /* Check if we did any alignment */ - if (BiasedStart) - { - /* Mark that region as reserved */ - Status = ArmConfigureArcDescriptor(PageStart - 1, - PageStart, - MemorySpecialMemory); - if (Status != STATUS_SUCCESS) break; - } - - /* Check if we did any alignment */ - if (BiasedEnd) - { - /* Mark that region as reserved */ - Status = ArmConfigureArcDescriptor(PageEnd - 1, - PageEnd, - MemorySpecialMemory); - if (Status != STATUS_SUCCESS) break; - } - - /* It is, mark the memory a free */ - Status = ArmConfigureArcDescriptor(PageStart, - PageEnd, - LoaderFree); - - /* If we failed, break out, otherwise, go to the next BIOS block */ - if (Status != STATUS_SUCCESS) break; - MdBlock++; - } - - /* Return error code */ - return Status; -} - -VOID -NTAPI -ArmInsertMemoryDescriptor(IN PMEMORY_ALLOCATION_DESCRIPTOR NewDescriptor) -{ - PLIST_ENTRY ListHead, PreviousEntry, NextEntry; - PMEMORY_ALLOCATION_DESCRIPTOR Descriptor = NULL, NextDescriptor = NULL; - - /* Loop the memory descriptor list */ - ListHead = &ArmLoaderBlock->MemoryDescriptorListHead; - PreviousEntry = ListHead; - NextEntry = ListHead->Flink; - while (NextEntry != ListHead) - { - /* Get the current descriptor and check if it's below ours */ - NextDescriptor = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); - if (NewDescriptor->BasePage < NextDescriptor->BasePage) break; - - /* It isn't, save the previous entry and descriptor, and try again */ - PreviousEntry = NextEntry; - Descriptor = NextDescriptor; - NextEntry = NextEntry->Flink; - } - - /* So we found the right spot to insert. Is this free memory? */ - if (NewDescriptor->MemoryType != LoaderFree) - { - /* It isn't, so insert us before the last descriptor */ - InsertHeadList(PreviousEntry, &NewDescriptor->ListEntry); - } - else - { - /* We're free memory. Check if the entry we found is also free memory */ - if ((PreviousEntry != ListHead) && - ((Descriptor->MemoryType == LoaderFree) || - (Descriptor->MemoryType == LoaderReserve)) && - ((Descriptor->BasePage + Descriptor->PageCount) == - NewDescriptor->BasePage)) - { - /* It's free memory, and we're right after it. Enlarge that block */ - Descriptor->PageCount += NewDescriptor->PageCount; - NewDescriptor = Descriptor; - } - else - { - /* Our range scan't be combined, so just insert us separately */ - InsertHeadList(PreviousEntry, &NewDescriptor->ListEntry); - } - - /* Check if we merged with an existing free memory block */ - if ((NextEntry != ListHead) && - ((NextDescriptor->MemoryType == LoaderFree) || - (NextDescriptor->MemoryType == LoaderReserve)) && - ((NewDescriptor->BasePage + NewDescriptor->PageCount) == - NextDescriptor->BasePage)) - { - /* Update our own block */ - NewDescriptor->PageCount += NextDescriptor->PageCount; - - /* Remove the next block */ - RemoveEntryList(&NextDescriptor->ListEntry); - } - } -} - -NTSTATUS -NTAPI -ArmBuildMemoryDescriptor(IN PMEMORY_ALLOCATION_DESCRIPTOR MemoryDescriptor, - IN MEMORY_TYPE MemoryType, - IN ULONG BasePage, - IN ULONG PageCount) -{ - PMEMORY_ALLOCATION_DESCRIPTOR Descriptor, NextDescriptor = NULL; - LONG Delta; - TYPE_OF_MEMORY CurrentType; - BOOLEAN UseNext; - - /* Check how many pages we'll be consuming */ - Delta = BasePage - MemoryDescriptor->BasePage; - if (!(Delta) && (PageCount == MemoryDescriptor->PageCount)) - { - /* We can simply convert the current descriptor into our new type */ - MemoryDescriptor->MemoryType = MemoryType; - } - else - { - /* Get the current memory type of the descriptor, and reserve it */ - CurrentType = MemoryDescriptor->MemoryType; - MemoryDescriptor->MemoryType = LoaderSpecialMemory; - - /* Check if we'll need another descriptor for what's left of memory */ - UseNext = ((BasePage != MemoryDescriptor->BasePage) && - (Delta + PageCount != MemoryDescriptor->PageCount)); - - /* Get a descriptor */ - Descriptor = ArmAllocateMemoryDescriptor(); - if (!Descriptor) return STATUS_INSUFFICIENT_RESOURCES; - - /* Check if we are using another descriptor */ - if (UseNext) - { - /* Allocate that one too */ - NextDescriptor = ArmAllocateMemoryDescriptor(); - if (!NextDescriptor) return STATUS_INSUFFICIENT_RESOURCES; - } - - /* Build the descriptor we got */ - Descriptor->MemoryType = MemoryType; - Descriptor->BasePage = BasePage; - Descriptor->PageCount = PageCount; - - /* Check if we're starting at the same place as the old one */ - if (BasePage == MemoryDescriptor->BasePage) - { - /* Simply decrease the old descriptor and rebase it */ - MemoryDescriptor->BasePage += PageCount; - MemoryDescriptor->PageCount -= PageCount; - MemoryDescriptor->MemoryType = CurrentType; - } - else if (Delta + PageCount == MemoryDescriptor->PageCount) - { - /* We finish where the old one did, shorten it */ - MemoryDescriptor->PageCount -= PageCount; - MemoryDescriptor->MemoryType = CurrentType; - } - else - { - /* We're inside the current block, mark our free region */ - NextDescriptor->MemoryType = LoaderFree; - NextDescriptor->BasePage = BasePage + PageCount; - NextDescriptor->PageCount = MemoryDescriptor->PageCount - - (PageCount + Delta); - - /* And cut down the current descriptor */ - MemoryDescriptor->PageCount = Delta; - MemoryDescriptor->MemoryType = CurrentType; - - /* Finally, insert our new free descriptor into the list */ - ArmInsertMemoryDescriptor(NextDescriptor); - } - - /* Insert the descriptor we allocated */ - ArmInsertMemoryDescriptor(Descriptor); - } - - /* Return success */ - return STATUS_SUCCESS; -} - -PMEMORY_ALLOCATION_DESCRIPTOR -NTAPI -ArmFindMemoryDescriptor(IN ULONG BasePage) -{ - PMEMORY_ALLOCATION_DESCRIPTOR MdBlock = NULL; - PLIST_ENTRY NextEntry, ListHead; - - /* Scan the memory descriptor list */ - ListHead = &ArmLoaderBlock->MemoryDescriptorListHead; - NextEntry = ListHead->Flink; - while (NextEntry != ListHead) - { - /* Get the current descriptor */ - MdBlock = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); - - /* Check if it can contain our memory range */ - if ((MdBlock->BasePage <= BasePage) && - (MdBlock->BasePage + MdBlock->PageCount > BasePage)) - { - /* It can, break out */ - break; - } - - /* Go to the next descriptor */ - NextEntry = NextEntry->Flink; - } - - /* Return the descriptor we found, if any */ - return MdBlock; -} - -NTSTATUS -NTAPI -ArmCreateMemoryDescriptor(IN TYPE_OF_MEMORY MemoryType, - IN ULONG BasePage, - IN ULONG PageCount, - IN ULONG Alignment, - OUT PULONG ReturnedBase) -{ - PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; - ULONG AlignedBase, AlignedLimit; - PMEMORY_ALLOCATION_DESCRIPTOR ActiveMdBlock; - ULONG ActiveAlignedBase = 0; - PLIST_ENTRY NextEntry, ListHead; - - /* If no information was given, make some assumptions */ - if (!Alignment) Alignment = 1; - if (!PageCount) PageCount = 1; - - /* Start looking for a matching descvriptor */ - do - { - /* Calculate the limit of the range */ - AlignedLimit = PageCount + BasePage; - - /* Find a descriptor that already contains our base address */ - MdBlock = ArmFindMemoryDescriptor(BasePage); - if (MdBlock) - { - /* If it contains our limit as well, break out early */ - if ((MdBlock->PageCount + MdBlock->BasePage) >= AlignedLimit) break; - } - - /* Loop the memory list */ - AlignedBase = 0; - ActiveMdBlock = NULL; - ListHead = &ArmLoaderBlock->MemoryDescriptorListHead; - NextEntry = ListHead->Flink; - while (NextEntry != ListHead) - { - /* Get the current descriptors */ - MdBlock = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); - - /* Align the base address and our limit */ - AlignedBase = (MdBlock->BasePage + (Alignment - 1)) &~ Alignment; - AlignedLimit = MdBlock->PageCount - - AlignedBase + - MdBlock->BasePage; - - /* Check if this is a free block that can satisfy us */ - if ((MdBlock->MemoryType == LoaderFree) && - (AlignedLimit <= MdBlock->PageCount) && - (PageCount <= AlignedLimit)) - { - /* It is, stop searching */ - ActiveMdBlock = MdBlock; - ActiveAlignedBase = AlignedBase; - break; - } - - /* Try the next block */ - NextEntry = NextEntry->Flink; - } - - /* See if we came up with an adequate block */ - if (ActiveMdBlock) - { - /* Generate a descriptor in it */ - *ReturnedBase = AlignedBase; - return ArmBuildMemoryDescriptor(ActiveMdBlock, - MemoryType, - ActiveAlignedBase, - PageCount); - } - } while (TRUE); - - /* We found a matching block, generate a descriptor with it */ - *ReturnedBase = BasePage; - return ArmBuildMemoryDescriptor(MdBlock, MemoryType, BasePage, PageCount); -} - -NTSTATUS -NTAPI -ArmBuildLoaderMemoryList(VOID) -{ - PMEMORY_ALLOCATION_DESCRIPTOR Descriptor; - MEMORY_DESCRIPTOR *Memory; - ULONG i; - - /* Loop all BIOS Memory Descriptors */ - for (i = 0; i < NumberDescriptors; i++) - { - /* Get the current descriptor */ - Memory = &MDArray[i]; - - /* Allocate an NT Memory Descriptor */ - Descriptor = ArmAllocateMemoryDescriptor(); - if (!Descriptor) return ENOMEM; - - /* Copy the memory type */ - Descriptor->MemoryType = Memory->MemoryType; - if (Memory->MemoryType == MemoryFreeContiguous) - { - /* Convert this to free */ - Descriptor->MemoryType = LoaderFree; - } - else if (Memory->MemoryType == MemorySpecialMemory) - { - /* Convert this to special memory */ - Descriptor->MemoryType = LoaderSpecialMemory; - } - - /* Copy the range data */ - Descriptor->BasePage = Memory->BasePage; - Descriptor->PageCount = Memory->PageCount; - - /* Insert the descriptor */ - if (Descriptor->PageCount) ArmInsertMemoryDescriptor(Descriptor); - } - - /* All went well */ - return STATUS_SUCCESS; -} - -#define PFN_SHIFT 12 -#define LARGE_PFN_SHIFT 20 - -#define STARTUP_BASE 0xC0000000 -#define HAL_BASE 0xFFC00000 -#define MMIO_BASE 0x10000000 - -#define LowMemPageTableIndex 0 -#define StartupPageTableIndex (STARTUP_BASE >> PDE_SHIFT) -#define MmioPageTableIndex (MMIO_BASE >> PDE_SHIFT) -#define HalPageTableIndex (HAL_BASE >> PDE_SHIFT) - -/* Converts a Physical Address into a Page Frame Number */ -#define PaToPfn(p) ((p) >> PFN_SHIFT) -#define PaToLargePfn(p) ((p) >> LARGE_PFN_SHIFT) - -VOID -ArmSetupPageDirectory(VOID) -{ - PPAGE_DIRECTORY_ARM PageDir; - ULONG KernelPageTableIndex; - //ULONG i; - - /* Get the Kernel Table Index */ - KernelPageTableIndex = KernelBase >> PDE_SHIFT; - printf("Kernel Base: 0x%p (PDE Index: %lx)\n", KernelBase, KernelPageTableIndex); - - /* Get the Startup Page Directory */ - PageDir = (PPAGE_DIRECTORY_ARM)&startup_pagedirectory; - printf("Initial Page Directory: 0x%p\n", PageDir); - - /* Setup the Low Memory PDE as an identity-mapped Large Page (1MB) */ - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[LowMemPageTableIndex].LargePage = 1; - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[LowMemPageTableIndex].Accessed = 1; - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[LowMemPageTableIndex].PageFrameNumber = 0; - - /* Setup the MMIO PDE as two identity mapped large pages -- the kernel will blow these away later */ - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex].LargePage = 1; - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex].Accessed = 1; - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex].PageFrameNumber = PaToLargePfn(0x10000000); - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex+1].LargePage = 1; - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex+1].Accessed = 1; - ((PHARDWARE_LARGE_PTE_ARMV6)PageDir->Pde)[MmioPageTableIndex+1].PageFrameNumber = PaToLargePfn(0x10100000); - printf("Paging init done\n"); - - #if 0 - ARM_PTE Pte; - ULONG i, j; - PARM_TRANSLATION_TABLE ArmTable; - PARM_COARSE_PAGE_TABLE BootTable, KernelTable, FlatMapTable, MasterTable; - - // - // Get the PDEs that we will use - // - ArmTable = &ArmTranslationTable; - BootTable = &BootTranslationTable; - KernelTable = &KernelTranslationTable; - FlatMapTable = &FlatMapTranslationTable; - MasterTable = &MasterTranslationTable; - - // - // Set the master L1 PDE as the TTB - // - TtbRegister.AsUlong = (ULONG)ArmTable; - ASSERT(TtbRegister.Reserved == 0); - KeArmTranslationTableRegisterSet(TtbRegister); - - // - // Use Domain 0, enforce AP bits (client) - // - DomainRegister.AsUlong = 0; - DomainRegister.Domain0 = ClientDomain; - KeArmDomainRegisterSet(DomainRegister); - - // - // Set Fault PTEs everywhere - // - RtlZeroMemory(ArmTable, sizeof(ARM_TRANSLATION_TABLE)); - - // - // Identity map the first MB of memory - // - Pte.L1.Section.Type = SectionPte; - Pte.L1.Section.Buffered = FALSE; - Pte.L1.Section.Cached = FALSE; - Pte.L1.Section.Reserved = 1; // ARM926EJ-S manual recommends setting to 1 - Pte.L1.Section.Domain = Domain0; - Pte.L1.Section.Access = SupervisorAccess; - Pte.L1.Section.BaseAddress = 0; - Pte.L1.Section.Ignored = Pte.L1.Section.Ignored1 = 0; - ArmTable->Pte[0] = Pte; - - // - // Map the page in MMIO space that contains the serial port and timers - // - Pte.L1.Section.BaseAddress = ArmBoardBlock->UartRegisterBase >> PDE_SHIFT; - ArmTable->Pte[UART_VIRTUAL >> PDE_SHIFT] = Pte; - - // - // Create template PTE for the coarse page table which maps the PTE_BASE - // - Pte.L1.Coarse.Type = CoarsePte; - Pte.L1.Coarse.Domain = Domain0; - Pte.L1.Coarse.Reserved = 1; // ARM926EJ-S manual recommends setting to 1 - Pte.L1.Coarse.Ignored = Pte.L1.Coarse.Ignored1 = 0; - Pte.L1.Coarse.BaseAddress = (ULONG)FlatMapTable >> CPT_SHIFT; - - // - // On x86, there is 4MB of space, starting at 0xC0000000 to 0xC0400000 - // which contains the mappings for each PTE on the system. 4MB is needed - // since for 4GB, there will be 1 million PTEs, each of 4KB. - // - // To describe a 4MB region, on x86, only requires a page table, which can - // be linked from the page table directory. - // - // On the other hand, on ARM, we can only describe 1MB regions, so we need - // four times less PTE entries to represent a single mapping (an L2 coarse - // page table). This is problematic, because this would only take up 1KB of - // space, and we can't have a page that small. - // - // This means we must: - // - // - Allocate page tables (in physical memory) with 4KB granularity, instead - // of 1KB (the other 3KB is unused and invalid). - // - // - "Skip" the other 3KB in the region, because we can't point to another - // coarse page table after just 1KB. - // - // So 0xC0000000 will be mapped to the page table that maps the range of - // 0x00000000 to 0x01000000, while 0xC0001000 till be mapped to the page - // table that maps the area from 0x01000000 to 0x02000000, and so on. In - // total, this will require 4 million entries, and additionally, because of - // the padding, since each 256 entries will be 4KB (instead of 1KB), this - // means we'll need 16MB (0xC0000000 to 0xC1000000). - // - // We call this region the flat-map area - // - for (i = (PTE_BASE >> PDE_SHIFT); i < ((PTE_BASE + 0x1000000) >> PDE_SHIFT); i++) - { - // - // Write PTE and update the base address (next MB) for the next one - // - ArmTable->Pte[i] = Pte; - Pte.L1.Coarse.BaseAddress += 4; - } - - // - // On x86, there is also the region of 0xC0300000 to 0xC03080000 which maps - // to the various PDEs on the system. Yes, this overlaps with the above, and - // works because of an insidious dark magic (self-mapping the PDE as a PTE). - // Unfortunately, this doesn't work on ARM, firstly because the size of a L1 - // page table is different than from an L2 page table, and secondly, which - // is even worse, the format for an L1 page table is different than the one - // for an L2 page table -- basically meaning we cannot self-map. - // - // However, we somewhat emulate this behavior on ARM. This will be expensive - // since we manually need to keep track of every page directory added and - // add an entry in our flat-map region. We also need to keep track of every - // change in the TTB, so that we can update the mappings in our PDE region. - // - // Note that for us, this region starts at 0xC1000000, after the flat-map - // area. - // - // Finally, to deal with different sizes (1KB page tables, 4KB page size!), - // we pad the ARM L2 page tables to make them 4KB, so that each page will - // therefore point to an L2 page table. - // - // This region is a lot easier than the first -- an L1 page table is only - // 16KB, so to access any index inside it, we just need 4 pages, since each - // page is 4KB... Clearly, there's also no need to pad in this case. - // - // We'll call this region the master translation area. - // - Pte.L1.Coarse.BaseAddress = (ULONG)MasterTable >> CPT_SHIFT; - ArmTable->Pte[PDE_BASE >> PDE_SHIFT] = Pte; - - // - // Now create the template for the coarse page tables which map the first 8MB - // - Pte.L1.Coarse.BaseAddress = (ULONG)BootTable >> CPT_SHIFT; - - // - // Map 0x00000000 - 0x007FFFFF to 0x80000000 - 0x807FFFFF. - // This is where the freeldr boot structures are located, and we need them. - // - for (i = (KSEG0_BASE >> PDE_SHIFT); i < ((KSEG0_BASE + 0x800000) >> PDE_SHIFT); i++) - { - // - // Write PTE and update the base address (next MB) for the next one - // - ArmTable->Pte[i] = Pte; - Pte.L1.Coarse.BaseAddress += 4; - } - - // - // Now create the template PTE for the coarse page tables for the next 6MB - // - Pte.L1.Coarse.BaseAddress = (ULONG)KernelTable >> CPT_SHIFT; - - // - // Map 0x00800000 - 0x00DFFFFF to 0x80800000 - 0x80DFFFFF - // In this way, the KERNEL_PHYS_ADDR (0x800000) becomes 0x80800000 - // which is the kernel virtual base address, just like on x86. - // - ASSERT(KernelBase == 0x80800000); - for (i = (KernelBase >> PDE_SHIFT); i < ((KernelBase + 0x600000) >> PDE_SHIFT); i++) - { - // - // Write PTE and update the base address (next MB) for the next one - // - ArmTable->Pte[i] = Pte; - Pte.L1.Coarse.BaseAddress += 4; - } - - // - // Now build the template PTE for the pages mapping the first 8MB - // - Pte.L2.Small.Type = SmallPte; - Pte.L2.Small.Buffered = Pte.L2.Small.Cached = 0; - Pte.L2.Small.Access0 = - Pte.L2.Small.Access1 = - Pte.L2.Small.Access2 = - Pte.L2.Small.Access3 = SupervisorAccess; - Pte.L2.Small.BaseAddress = 0; - - // - // Loop each boot coarse page table (i). - // Each PDE describes 1MB. We're mapping an area of 8MB, so 8 times. - // - for (i = 0; i < 8; i++) - { - // - // Loop and set each the PTE (j). - // Each PTE describes 4KB. We're mapping an area of 1MB, so 256 times. - // - for (j = 0; j < (PDE_SIZE / PAGE_SIZE); j++) - { - // - // Write PTE and update the base address (next MB) for the next one - // - BootTable->Pte[j] = Pte; - Pte.L2.Small.BaseAddress++; - } - - // - // Next iteration - // - BootTable++; - } - - // - // Now create the template PTE for the pages mapping the next 6MB - // - Pte.L2.Small.BaseAddress = (ULONG)KERNEL_BASE_PHYS >> PTE_SHIFT; - - // - // Loop each kernel coarse page table (i). - // Each PDE describes 1MB. We're mapping an area of 6MB, so 6 times. - // - for (i = 0; i < 6; i++) - { - // - // Loop and set each the PTE (j). - // Each PTE describes 4KB. We're mapping an area of 1MB, so 256 times. - // - for (j = 0; j < (PDE_SIZE / PAGE_SIZE); j++) - { - // - // Write PTE and update the base address (next MB) for the next one - // - KernelTable->Pte[j] = Pte; - Pte.L2.Small.BaseAddress++; - } - - // - // Next iteration - // - KernelTable++; - } - - // - // Now we need to create the PTEs for the addresses which have been mapped - // already. - // - // We have allocated 4 page table directories: - // - // - One for the kernel, 6MB - // - One for low-memory FreeLDR, 8MB - // - One for identity-mapping below 1MB, 1MB - // - And finally, one for the flat-map itself, 16MB - // - // - Each MB mapped is a 1KB table, which we'll use a page to reference, so - // we will require 31 pages. - // - - // - // For the 0x80000000 region (8MB) - // - Pte.L2.Small.BaseAddress = (ULONG)&BootTranslationTable >> PTE_SHIFT; - FlatMapTable = &(&FlatMapTranslationTable)[0x80000000 >> 28]; - for (i = 0; i < 8; i++) - { - // - // Point to the page table mapping the next MB - // - FlatMapTable->Pte[i] = Pte; - Pte.L2.Small.BaseAddress++; - } - - // - // For the 0x80800000 region (6MB) - // - Pte.L2.Small.BaseAddress = (ULONG)&KernelTranslationTable >> PTE_SHIFT; - for (i = 8; i < 14; i++) - { - // - // Point to the page table mapping the next MB - // - FlatMapTable->Pte[i] = Pte; - Pte.L2.Small.BaseAddress++; - } - - // - // For the 0xC0000000 region (16MB) - // - Pte.L2.Small.BaseAddress = (ULONG)&FlatMapTranslationTable >> PTE_SHIFT; - FlatMapTable = &(&FlatMapTranslationTable)[0xC0000000 >> 28]; - for (i = 0; i < 16; i++) - { - // - // Point to the page table mapping the next MB - // - FlatMapTable->Pte[i] = Pte; - Pte.L2.Small.BaseAddress++; - } - - // - // For the 0xC1000000 region (1MB) - // - Pte.L2.Small.BaseAddress = (ULONG)&MasterTranslationTable >> PTE_SHIFT; - FlatMapTable->Pte[16] = Pte; - - // - // Now we handle the master translation area for our PDEs. We'll just make - // the 4 page tables point to the ARM TTB. - // - Pte.L2.Small.BaseAddress = (ULONG)&ArmTranslationTable >> PTE_SHIFT; - for (i = 0; i < 4; i++) - { - // - // Point to the page table mapping the next MB - // - MasterTable->Pte[i] = Pte; - Pte.L2.Small.BaseAddress++; - } -#endif -} - -VOID -ArmSetupPagingAndJump(IN ULONG Magic) -{ - ULONG_PTR PageDirectoryBaseAddress = (ULONG_PTR)&startup_pagedirectory; - ARM_CONTROL_REGISTER ControlRegister; - ARM_TTB_REGISTER TtbRegister; - ARM_DOMAIN_REGISTER DomainRegister; - - /* Set the TTBR */ - TtbRegister.AsUlong = PageDirectoryBaseAddress; - ASSERT(TtbRegister.Reserved == 0); - KeArmTranslationTableRegisterSet(TtbRegister); - - /* Disable domains and simply use access bits on PTEs */ - DomainRegister.AsUlong = 0; - DomainRegister.Domain0 = ClientDomain; - KeArmDomainRegisterSet(DomainRegister); - - /* Enable ARMv6+ paging (MMU), caches and the access bit */ - ControlRegister = KeArmControlRegisterGet(); - ControlRegister.MmuEnabled = TRUE; - ControlRegister.ICacheEnabled = TRUE; - ControlRegister.DCacheEnabled = TRUE; - ControlRegister.ForceAp = TRUE; - ControlRegister.ExtendedPageTables = TRUE; - KeArmControlRegisterSet(ControlRegister); - - /* Jump to Kernel */ - TuiPrintf("Hello from MMU Enabled!\n"); - while (TRUE); - (*KernelEntryPoint)((PVOID)((ULONG_PTR)ArmLoaderBlock | KSEG0_BASE)); -} - -VOID -ArmPrepareForReactOS(IN BOOLEAN Setup) -{ - ARM_CACHE_REGISTER CacheReg; - PVOID Base, MemBase; - PCHAR BootPath, HalPath; - NTSTATUS Status; - ULONG Dummy, i; - PLDR_DATA_TABLE_ENTRY LdrEntry; - PLIST_ENTRY NextEntry, OldEntry; - PARC_DISK_INFORMATION ArcDiskInformation; - PARC_DISK_SIGNATURE ArcDiskSignature; - ULONG ArcDiskCount = 0; -#if 0 - ULONG Checksum = 0; - PMASTER_BOOT_RECORD Mbr; - PULONG Buffer; -#endif - PWCHAR ArmModuleName; - - // - // Allocate the ARM Shared Heap - // - ArmSharedHeap = MmAllocateMemoryWithType(PAGE_SIZE, LoaderOsloaderHeap); - ArmSharedHeapSize = 0; - if (!ArmSharedHeap) return; - - // - // Allocate the loader block and extension - // - ArmLoaderBlock = ArmAllocateFromSharedHeap(sizeof(LOADER_PARAMETER_BLOCK)); - if (!ArmLoaderBlock) return; - ArmExtension = ArmAllocateFromSharedHeap(sizeof(LOADER_PARAMETER_EXTENSION)); - if (!ArmExtension) return; - - // - // Initialize the loader block - // - InitializeListHead(&ArmLoaderBlock->BootDriverListHead); - InitializeListHead(&ArmLoaderBlock->LoadOrderListHead); - InitializeListHead(&ArmLoaderBlock->MemoryDescriptorListHead); - - // - // Setup the extension and setup block - // - ArmLoaderBlock->Extension = (PVOID)((ULONG_PTR)ArmExtension | KSEG0_BASE); - ArmLoaderBlock->SetupLdrBlock = NULL; - - // - // Add the Board Memory Map from U-Boot into the STARTUP.COM-style - // BIOS descriptor format -- this needs to be removed later. - // - ArmBuildBoardMemoryMap(); - - // - // Now basically convert these entries to the ARC format, so that we can - // get a good map of free (usable) memory - // - ArmBuildOsMemoryMap(); - - // - // NT uses an extended ARC format, with slightly different memory types. - // We also want to link the ARC descriptors together into a linked list, - // instead of the array, and allocate the semi-permanent storage in which - // these entries will be stored so that the kernel can read them. - // - ArmBuildLoaderMemoryList(); - - // - // Setup descriptor for the shared heap - // - Status = ArmCreateMemoryDescriptor(LoaderOsloaderHeap, - (ULONG_PTR)ArmSharedHeap >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(ArmSharedHeap, - ArmSharedHeapSize), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Setup descriptor for the boot stack - // - Status = ArmCreateMemoryDescriptor(LoaderOsloaderStack, - (ULONG_PTR)&BootStack >> PAGE_SHIFT, - 4, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; -#if 0 - // - // Setup descriptor for the boot page tables - // - Status = ArmCreateMemoryDescriptor(LoaderMemoryData, - (ULONG_PTR)&TranslationTableStart >> PAGE_SHIFT, - ((ULONG_PTR)&TranslationTableEnd - - (ULONG_PTR)&TranslationTableStart) / PAGE_SIZE, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; -#endif - // - // Setup descriptor for the kernel - // - Status = ArmCreateMemoryDescriptor(LoaderSystemCode, - KernelData >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(KernelData, - KernelSize), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Setup descriptor for the HAL - // - Status = ArmCreateMemoryDescriptor(LoaderHalCode, - HalData >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(HalData, - HalSize), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Setup registry data - // - ArmLoaderBlock->RegistryBase = (PVOID)((ULONG_PTR)RegistryData | KSEG0_BASE); - ArmLoaderBlock->RegistryLength = RegistrySize; - - // - // Create an MD for it - // - Status = ArmCreateMemoryDescriptor(LoaderRegistryData, - RegistryData >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(RegistryData, - RegistrySize), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // TODO: Setup ARC Hardware tree data - // - - // - // Setup NLS data - // - ArmNlsDataBlock = ArmAllocateFromSharedHeap(sizeof(NLS_DATA_BLOCK)); - ArmLoaderBlock->NlsData = ArmNlsDataBlock; - ArmLoaderBlock->NlsData->AnsiCodePageData = (PVOID)(AnsiData | KSEG0_BASE); - ArmLoaderBlock->NlsData->OemCodePageData = (PVOID)(OemData | KSEG0_BASE); - ArmLoaderBlock->NlsData->UnicodeCodePageData = (PVOID)(UnicodeData | KSEG0_BASE); - ArmLoaderBlock->NlsData = (PVOID)((ULONG_PTR)ArmLoaderBlock->NlsData | KSEG0_BASE); - - // - // Setup ANSI NLS Memory Descriptor - // - Status = ArmCreateMemoryDescriptor(LoaderNlsData, - AnsiData >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(AnsiData, - AnsiSize), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Setup OEM NLS Memory Descriptor - // - Status = ArmCreateMemoryDescriptor(LoaderNlsData, - OemData >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(OemData, - OemSize), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Setup Unicode NLS Memory Descriptor - // - Status = ArmCreateMemoryDescriptor(LoaderNlsData, - UnicodeData >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(UnicodeData, - UnicodeSize), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Setup loader entry for the kernel - // - ArmModuleName = ArmAllocateFromSharedHeap(64 * sizeof(WCHAR)); - wcscpy(ArmModuleName, L"ntoskrnl.exe"); - LdrEntry = ArmAllocateFromSharedHeap(sizeof(LDR_DATA_TABLE_ENTRY)); - RtlZeroMemory(LdrEntry, sizeof(LDR_DATA_TABLE_ENTRY)); - LdrEntry->DllBase = (PVOID)KernelBase; - LdrEntry->SizeOfImage = KernelSize; - LdrEntry->EntryPoint = KernelEntryPoint; - LdrEntry->LoadCount = 1; - LdrEntry->Flags = LDRP_IMAGE_DLL | LDRP_ENTRY_PROCESSED; - RtlInitUnicodeString(&LdrEntry->FullDllName, ArmModuleName); - RtlInitUnicodeString(&LdrEntry->BaseDllName, ArmModuleName); - LdrEntry->FullDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->FullDllName.Buffer | KSEG0_BASE); - LdrEntry->BaseDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->BaseDllName.Buffer | KSEG0_BASE); - InsertTailList(&ArmLoaderBlock->LoadOrderListHead, &LdrEntry->InLoadOrderLinks); - - // - // Setup loader entry for the HAL - // - ArmModuleName = ArmAllocateFromSharedHeap(64 * sizeof(WCHAR)); - wcscpy(ArmModuleName, L"hal.dll"); - LdrEntry = ArmAllocateFromSharedHeap(sizeof(LDR_DATA_TABLE_ENTRY)); - RtlZeroMemory(LdrEntry, sizeof(LDR_DATA_TABLE_ENTRY)); - LdrEntry->DllBase = (PVOID)(HalData | KSEG0_BASE); - LdrEntry->SizeOfImage = HalSize; - LdrEntry->EntryPoint = (PVOID)RtlImageNtHeader((PVOID)HalData)-> - OptionalHeader.AddressOfEntryPoint; - LdrEntry->EntryPoint = (PVOID)((ULONG_PTR)LdrEntry->EntryPoint | KSEG0_BASE); - LdrEntry->LoadCount = 1; - LdrEntry->Flags = LDRP_IMAGE_DLL | LDRP_ENTRY_PROCESSED; - RtlInitUnicodeString(&LdrEntry->FullDllName, ArmModuleName); - RtlInitUnicodeString(&LdrEntry->BaseDllName, ArmModuleName); - LdrEntry->FullDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->FullDllName.Buffer | KSEG0_BASE); - LdrEntry->BaseDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->BaseDllName.Buffer | KSEG0_BASE); - InsertTailList(&ArmLoaderBlock->LoadOrderListHead, &LdrEntry->InLoadOrderLinks); - - // - // Build descriptors for the drivers loaded - // - for (i = 0; i < Drivers; i++) - { - // - // Setup loader entry for the driver - // - LdrEntry = ArmAllocateFromSharedHeap(sizeof(LDR_DATA_TABLE_ENTRY)); - RtlZeroMemory(LdrEntry, sizeof(LDR_DATA_TABLE_ENTRY)); - LdrEntry->DllBase = (PVOID)(DriverData[i] | KSEG0_BASE); - LdrEntry->SizeOfImage = DriverSize[i]; - LdrEntry->EntryPoint = (PVOID)RtlImageNtHeader((PVOID)DriverData[i])-> - OptionalHeader.AddressOfEntryPoint; - LdrEntry->EntryPoint = (PVOID)((ULONG_PTR)LdrEntry->EntryPoint | KSEG0_BASE); - LdrEntry->LoadCount = 1; - LdrEntry->Flags = LDRP_IMAGE_DLL | LDRP_ENTRY_PROCESSED; - ArmModuleName = ArmAllocateFromSharedHeap(64 * sizeof(WCHAR)); - RtlZeroMemory(ArmModuleName, 64 * sizeof(WCHAR)); - LdrEntry->FullDllName.Length = strlen(DriverName[i]) * sizeof(WCHAR); - LdrEntry->FullDllName.MaximumLength = LdrEntry->FullDllName.Length; - LdrEntry->FullDllName.Buffer = ArmModuleName; - LdrEntry->BaseDllName = LdrEntry->FullDllName; - while (*DriverName[i]) *ArmModuleName++ = *DriverName[i]++; - LdrEntry->FullDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->FullDllName.Buffer | KSEG0_BASE); - LdrEntry->BaseDllName.Buffer = (PVOID)((ULONG_PTR)LdrEntry->BaseDllName.Buffer | KSEG0_BASE); - InsertTailList(&ArmLoaderBlock->LoadOrderListHead, &LdrEntry->InLoadOrderLinks); - - // - // Build a descriptor for the driver - // - Status = ArmCreateMemoryDescriptor(LoaderBootDriver, - DriverData[i] >> PAGE_SHIFT, - ADDRESS_AND_SIZE_TO_SPAN_PAGES(DriverData[i], - DriverSize[i]), - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - } - - // - // Loop driver list - // - NextEntry = ArmLoaderBlock->LoadOrderListHead.Flink; - while (NextEntry != &ArmLoaderBlock->LoadOrderListHead) - { - // - // Remember the physical entry - // - OldEntry = NextEntry->Flink; - - // - // Edit the data - // - NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE); - NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE); - - // - // Keep looping - // - NextEntry = OldEntry; - } - - // - // Now edit the root itself - // - NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE); - NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE); - - // - // Setup extension parameters - // - ArmExtension->Size = sizeof(LOADER_PARAMETER_EXTENSION); - ArmExtension->MajorVersion = 5; - ArmExtension->MinorVersion = 2; - - // - // Make a copy of the command line - // - ArmLoaderBlock->LoadOptions = ArmCommandLine; - strcpy(ArmCommandLine, reactos_kernel_cmdline); - - // - // Find the first \, separating the ARC path from NT path - // - BootPath = strchr(ArmCommandLine, '\\'); - *BootPath = ANSI_NULL; - - // - // Set the ARC Boot Path - // - strncpy(ArmArcBootPath, ArmCommandLine, 63); - ArmLoaderBlock->ArcBootDeviceName = (PVOID)((ULONG_PTR)ArmArcBootPath | KSEG0_BASE); - - // - // The rest of the string is the NT path - // - HalPath = strchr(BootPath + 1, ' '); - *HalPath = ANSI_NULL; - ArmNtBootPath[0] = '\\'; - strncat(ArmNtBootPath, BootPath + 1, 63); - strcat(ArmNtBootPath,"\\"); - ArmLoaderBlock->NtBootPathName = (PVOID)((ULONG_PTR)ArmNtBootPath | KSEG0_BASE); - - // - // Set the HAL paths - // - strncpy(ArmArcHalPath, ArmArcBootPath, 63); - ArmLoaderBlock->ArcHalDeviceName = (PVOID)((ULONG_PTR)ArmArcHalPath | KSEG0_BASE); - strcpy(ArmNtHalPath, "\\"); - ArmLoaderBlock->NtHalPathName = (PVOID)((ULONG_PTR)ArmNtHalPath | KSEG0_BASE); - - // - // Use this new command line - // - strncpy(ArmLoaderBlock->LoadOptions, HalPath + 2, 255); - - // - // Parse it and change every slash to a space - // - BootPath = ArmLoaderBlock->LoadOptions; - do {if (*BootPath == '/') *BootPath = ' ';} while (*BootPath++); - - // - // Fixup command-line pointer - // - ArmLoaderBlock->LoadOptions = (PVOID)((ULONG_PTR)ArmLoaderBlock->LoadOptions | KSEG0_BASE); - - // - // Setup cache information - // - CacheReg = KeArmCacheRegisterGet(); - ArmLoaderBlock->u.Arm.FirstLevelDcacheSize = SizeBits[CacheReg.DSize]; - ArmLoaderBlock->u.Arm.FirstLevelDcacheFillSize = LenBits[CacheReg.DLength]; - ArmLoaderBlock->u.Arm.FirstLevelDcacheFillSize <<= 2; - ArmLoaderBlock->u.Arm.FirstLevelIcacheSize = SizeBits[CacheReg.ISize]; - ArmLoaderBlock->u.Arm.FirstLevelIcacheFillSize = LenBits[CacheReg.ILength]; - ArmLoaderBlock->u.Arm.FirstLevelIcacheFillSize <<= 2; - ArmLoaderBlock->u.Arm.SecondLevelDcacheSize = - ArmLoaderBlock->u.Arm.SecondLevelDcacheFillSize = - ArmLoaderBlock->u.Arm.SecondLevelIcacheSize = - ArmLoaderBlock->u.Arm.SecondLevelIcacheFillSize = 0; - - // - // Allocate the Interrupt stack - // - Base = MmAllocateMemoryWithType(KERNEL_STACK_SIZE, LoaderStartupDpcStack); - ArmLoaderBlock->u.Arm.InterruptStack = KSEG0_BASE | (ULONG)Base; - ArmLoaderBlock->u.Arm.InterruptStack += KERNEL_STACK_SIZE; - - // - // Build an entry for it - // - Status = ArmCreateMemoryDescriptor(LoaderStartupDpcStack, - (ULONG_PTR)Base >> PAGE_SHIFT, - KERNEL_STACK_SIZE / PAGE_SIZE, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Allocate the Kernel Boot stack - // - Base = MmAllocateMemoryWithType(KERNEL_STACK_SIZE, LoaderStartupKernelStack); - ArmLoaderBlock->KernelStack = KSEG0_BASE | (ULONG)Base; - ArmLoaderBlock->KernelStack += KERNEL_STACK_SIZE; - - // - // Build an entry for it - // - Status = ArmCreateMemoryDescriptor(LoaderStartupKernelStack, - (ULONG_PTR)Base >> PAGE_SHIFT, - KERNEL_STACK_SIZE / PAGE_SIZE, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Allocate the Abort stack - // - Base = MmAllocateMemoryWithType(KERNEL_STACK_SIZE, LoaderStartupPanicStack); - ArmLoaderBlock->u.Arm.PanicStack = KSEG0_BASE | (ULONG)Base; - ArmLoaderBlock->u.Arm.PanicStack += KERNEL_STACK_SIZE; - - // - // Build an entry for it - // - Status = ArmCreateMemoryDescriptor(LoaderStartupPanicStack, - (ULONG_PTR)Base >> PAGE_SHIFT, - KERNEL_STACK_SIZE / PAGE_SIZE, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Allocate the PCR/KUSER_SHARED page -- align it to 1MB (we only need 2x4KB) - // - Base = MmAllocateMemoryWithType(2 * 1024 * 1024, LoaderStartupPcrPage); - MemBase = Base; - Base = (PVOID)ROUND_UP(Base, 1 * 1024 * 1024); - ArmLoaderBlock->u.Arm.PcrPage = (ULONG)Base >> PDE_SHIFT; - - // - // Build an entry for the KPCR and KUSER_SHARED_DATA - // - Status = ArmCreateMemoryDescriptor(LoaderStartupPcrPage, - (ULONG_PTR)MemBase >> PAGE_SHIFT, - (2 * 1024 * 1024) / PAGE_SIZE, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Allocate PDR pages -- align them to 1MB (we only need 3x4KB) - // - Base = MmAllocateMemoryWithType(4 * 1024 * 1024, LoaderStartupPdrPage); - MemBase = Base; - Base = (PVOID)ROUND_UP(Base, 1 * 1024 * 1024); - ArmLoaderBlock->u.Arm.PdrPage = (ULONG)Base >> PDE_SHIFT; - - // - // Build an entry for the PDR, PRCB and initial KPROCESS/KTHREAD - // - Status = ArmCreateMemoryDescriptor(LoaderStartupPdrPage, - (ULONG_PTR)MemBase >> PAGE_SHIFT, - (4 * 1024 * 1024) / PAGE_SIZE, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - - // - // Set initial PRCB, Thread and Process on the last PDR page - // - Base = (PVOID)((ULONG)Base + 2 * 1024 * 1024); - ArmLoaderBlock->Prcb = KSEG0_BASE | (ULONG)Base; - ArmLoaderBlock->Process = ArmLoaderBlock->Prcb + sizeof(KPRCB); - ArmLoaderBlock->Thread = ArmLoaderBlock->Process + sizeof(EPROCESS); - - // - // Check if we're booting from RAM disk - // - if ((gRamDiskBase) && (gRamDiskSize)) - { - // - // Allocate a descriptor to describe it - // - Status = ArmCreateMemoryDescriptor(LoaderXIPRom, - (ULONG_PTR)gRamDiskBase >> PAGE_SHIFT, - gRamDiskSize / PAGE_SIZE, - 0, - &Dummy); - if (Status != STATUS_SUCCESS) return; - } - - // - // Loop memory list - // - NextEntry = ArmLoaderBlock->MemoryDescriptorListHead.Flink; - while (NextEntry != &ArmLoaderBlock->MemoryDescriptorListHead) - { - // - // Remember the physical entry - // - OldEntry = NextEntry->Flink; - - // - // Edit the data - // - NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE); - NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE); - - // - // Keep looping - // - NextEntry = OldEntry; - } - - // - // Now edit the root itself - // - NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE); - NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE); - - // - // Allocate ARC disk structure - // - ArcDiskInformation = ArmAllocateFromSharedHeap(sizeof(ARC_DISK_INFORMATION)); - InitializeListHead(&ArcDiskInformation->DiskSignatureListHead); - ArmLoaderBlock->ArcDiskInformation = (PVOID)((ULONG_PTR)ArcDiskInformation | KSEG0_BASE); - -#if 0 - // - // Read the MBR - // - MachDiskReadLogicalSectors(0x49, 0ULL, 1, (PVOID)DISKREADBUFFER); - Buffer = (ULONG*)DISKREADBUFFER; - Mbr = (PMASTER_BOOT_RECORD)DISKREADBUFFER; - - // - // Calculate the MBR checksum - // - for (i = 0; i < 128; i++) Checksum += Buffer[i]; - Checksum = ~Checksum + 1; - -#endif - // - // Allocate a disk signature and fill it out - // - ArcDiskSignature = ArmAllocateFromSharedHeap(sizeof(ARC_DISK_SIGNATURE)); - ArcDiskSignature->Signature = 0xBADAB00B;// Mbr->Signature; - ArcDiskSignature->CheckSum = 0xFAB4BEEF; //Checksum; - - // - // Allocare a string for the name and fill it out - // - ArcDiskSignature->ArcName = ArmAllocateFromSharedHeap(256); - sprintf(ArcDiskSignature->ArcName, "multi(0)disk(0)rdisk(%lu)", ArcDiskCount++); - ArcDiskSignature->ArcName = (PVOID)((ULONG_PTR)ArcDiskSignature->ArcName | KSEG0_BASE); - - // - // Insert the descriptor into the list - // - InsertTailList(&ArcDiskInformation->DiskSignatureListHead, - &ArcDiskSignature->ListEntry); - - // - // Loop ARC disk list - // - NextEntry = ArcDiskInformation->DiskSignatureListHead.Flink; - while (NextEntry != &ArcDiskInformation->DiskSignatureListHead) - { - // - // Remember the physical entry - // - OldEntry = NextEntry->Flink; - - // - // Edit the data - // - NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE); - NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE); - - // - // Keep looping - // - NextEntry = OldEntry; - } - - // - // Now edit the root itself - // - NextEntry->Flink = (PVOID)((ULONG_PTR)NextEntry->Flink | KSEG0_BASE); - NextEntry->Blink = (PVOID)((ULONG_PTR)NextEntry->Blink | KSEG0_BASE); -} - -VOID -FrLdrStartup(IN ULONG Magic) -{ - // - // Disable interrupts (already done) - // - - // - // Set proper CPSR (already done) - // - - // - // Initialize the page directory - // - ArmSetupPageDirectory(); - - // - // Initialize paging and load NTOSKRNL - // - ArmSetupPagingAndJump(Magic); -} diff --git a/reactos/boot/freeldr/freeldr/arch/arm/macharm.c b/reactos/boot/freeldr/freeldr/arch/arm/macharm.c index f8979bba771..b0b8e27e2c7 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/macharm.c +++ b/reactos/boot/freeldr/freeldr/arch/arm/macharm.c @@ -9,73 +9,79 @@ /* INCLUDES *******************************************************************/ #include -#define RGB565(r, g, b) (((r >> 3) << 11)| ((g >> 2) << 5)| ((b >> 3) << 0)) +#include /* GLOBALS ********************************************************************/ -UCHAR BootStack[0x4000]; -PUCHAR BootStackEnd = &BootStack[0x3FFF]; PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock; -ULONG BootDrive, BootPartition; -VOID ArmPrepareForReactOS(IN BOOLEAN Setup); -ADDRESS_RANGE ArmBoardMemoryMap[16]; -ULONG ArmBoardMemoryMapRangeCount; ULONG gDiskReadBuffer, gFileSysBuffer; +BOOLEAN ArmHwDetectRan; +PCONFIGURATION_COMPONENT_DATA RootNode; + +ULONG FirstLevelDcacheSize; +ULONG FirstLevelDcacheFillSize; +ULONG FirstLevelIcacheSize; +ULONG FirstLevelIcacheFillSize; +ULONG SecondLevelDcacheSize; +ULONG SecondLevelDcacheFillSize; +ULONG SecondLevelIcacheSize; +ULONG SecondLevelIcacheFillSize; + +ARC_DISK_SIGNATURE reactos_arc_disk_info; +ULONG reactos_disk_count; +CHAR reactos_arc_hardware_data[256]; + +ULONG SizeBits[] = +{ + -1, // INVALID + -1, // INVALID + 1 << 12, // 4KB + 1 << 13, // 8KB + 1 << 14, // 16KB + 1 << 15, // 32KB + 1 << 16, // 64KB + 1 << 17 // 128KB +}; + +ULONG AssocBits[] = +{ + -1, // INVALID + -1, // INVALID + 4 // 4-way associative +}; + +ULONG LenBits[] = +{ + -1, // INVALID + -1, // INVALID + 8 // 8 words per line (32 bytes) +}; /* FUNCTIONS ******************************************************************/ VOID ArmInit(IN PARM_BOARD_CONFIGURATION_BLOCK BootContext) { - ULONG i; - - // - // Remember the pointer - // + /* Remember the pointer */ ArmBoardBlock = BootContext; - // - // Let's make sure we understand the LLB - // + /* Let's make sure we understand the LLB */ ASSERT(ArmBoardBlock->MajorVersion == ARM_BOARD_CONFIGURATION_MAJOR_VERSION); ASSERT(ArmBoardBlock->MinorVersion == ARM_BOARD_CONFIGURATION_MINOR_VERSION); - // - // This should probably go away once we support more boards - // + /* This should probably go away once we support more boards */ ASSERT((ArmBoardBlock->BoardType == MACH_TYPE_FEROCEON) || (ArmBoardBlock->BoardType == MACH_TYPE_VERSATILE_PB) || (ArmBoardBlock->BoardType == MACH_TYPE_OMAP3_BEAGLE)); - // - // Save data required for memory initialization - // - ArmBoardMemoryMapRangeCount = ArmBoardBlock->MemoryMapEntryCount; - ASSERT(ArmBoardMemoryMapRangeCount != 0); - ASSERT(ArmBoardMemoryMapRangeCount < 16); - for (i = 0; i < ArmBoardMemoryMapRangeCount; i++) - { - // - // Copy each entry - // - RtlCopyMemory(&ArmBoardMemoryMap[i], - &ArmBoardBlock->MemoryMap[i], - sizeof(ADDRESS_RANGE)); - } - - // - // Call FreeLDR's portable entrypoint with our command-line - // + /* Call FreeLDR's portable entrypoint with our command-line */ BootMain(ArmBoardBlock->CommandLine); } -BOOLEAN -ArmDiskNormalizeSystemPath(IN OUT PCHAR SystemPath, - IN unsigned Size) +VOID +ArmPrepareForReactOS(IN BOOLEAN Setup) { - /* Only RAMDISK supported for now */ - if (!strstr(SystemPath, "ramdisk(0)")) return FALSE; - return TRUE; + return; } BOOLEAN @@ -95,28 +101,42 @@ ArmDiskGetBootPath(OUT PCHAR BootPath, PCONFIGURATION_COMPONENT_DATA ArmHwDetect(VOID) { - PCONFIGURATION_COMPONENT_DATA RootNode; + ARM_CACHE_REGISTER CacheReg; - // - // Create the root node - // + /* Create the root node */ + if (ArmHwDetectRan++) return RootNode; FldrCreateSystemKey(&RootNode); - // - // TODO: - // There's no such thing as "PnP" on embedded hardware. - // The boot loader will send us a device tree, similar to ACPI - // or OpenFirmware device trees, and we will convert it to ARC. - // + /* + * TODO: + * There's no such thing as "PnP" on embedded hardware. + * The boot loader will send us a device tree, similar to ACPI + * or OpenFirmware device trees, and we will convert it to ARC. + */ - // - // Register RAMDISK Device - // + /* Get cache information */ + CacheReg = KeArmCacheRegisterGet(); + FirstLevelDcacheSize = SizeBits[CacheReg.DSize]; + FirstLevelDcacheFillSize = LenBits[CacheReg.DLength]; + FirstLevelDcacheFillSize <<= 2; + FirstLevelIcacheSize = SizeBits[CacheReg.ISize]; + FirstLevelIcacheFillSize = LenBits[CacheReg.ILength]; + FirstLevelIcacheFillSize <<= 2; + SecondLevelDcacheSize = + SecondLevelDcacheFillSize = + SecondLevelIcacheSize = + SecondLevelIcacheFillSize = 0; + + /* Register RAMDISK Device */ RamDiskInitialize(); - // - // Return the root node - // + /* Fill out the ARC disk block */ + reactos_arc_disk_info.Signature = 0xBADAB00F; + reactos_arc_disk_info.CheckSum = 0xDEADBABE; + reactos_arc_disk_info.ArcName = "ramdisk(0)"; + reactos_disk_count = 1; + + /* Return the root node */ return RootNode; } @@ -124,34 +144,26 @@ ULONG ArmMemGetMemoryMap(OUT PBIOS_MEMORY_MAP BiosMemoryMap, IN ULONG MaxMemoryMapSize) { - // - // Return whatever the board returned to us (CS0 Base + Size and FLASH0) - // - RtlCopyMemory(BiosMemoryMap, - ArmBoardBlock->MemoryMap, - ArmBoardBlock->MemoryMapEntryCount * sizeof(BIOS_MEMORY_MAP)); + /* Return whatever the board returned to us (CS0 Base + Size and FLASH0) */ + memcpy(BiosMemoryMap, + ArmBoardBlock->MemoryMap, + ArmBoardBlock->MemoryMapEntryCount * sizeof(BIOS_MEMORY_MAP)); return ArmBoardBlock->MemoryMapEntryCount; } VOID MachInit(IN PCCH CommandLine) { - // - // Setup board-specific ARM routines - // + /* Setup board-specific ARM routines */ switch (ArmBoardBlock->BoardType) { - // - // Check for Feroceon-base boards - // + /* Check for Feroceon-base boards */ case MACH_TYPE_FEROCEON: TuiPrintf("Not implemented\n"); while (TRUE); break; - // - // Check for ARM Versatile PB boards - // + /* Check for ARM Versatile PB boards */ case MACH_TYPE_VERSATILE_PB: /* Copy Machine Routines from Firmware Table */ @@ -161,16 +173,7 @@ MachInit(IN PCCH CommandLine) MachVtbl.VideoClearScreen = ArmBoardBlock->VideoClearScreen; MachVtbl.VideoSetDisplayMode = ArmBoardBlock->VideoSetDisplayMode; MachVtbl.VideoGetDisplaySize = ArmBoardBlock->VideoGetDisplaySize; - MachVtbl.VideoGetBufferSize = ArmBoardBlock->VideoGetBufferSize; - MachVtbl.VideoSetTextCursorPosition = ArmBoardBlock->VideoSetTextCursorPosition; - MachVtbl.VideoSetTextCursorPosition = ArmBoardBlock->VideoSetTextCursorPosition; - MachVtbl.VideoHideShowTextCursor = ArmBoardBlock->VideoHideShowTextCursor; MachVtbl.VideoPutChar = ArmBoardBlock->VideoPutChar; - MachVtbl.VideoCopyOffScreenBufferToVRAM = ArmBoardBlock->VideoCopyOffScreenBufferToVRAM; - MachVtbl.VideoIsPaletteFixed = ArmBoardBlock->VideoIsPaletteFixed; - MachVtbl.VideoSetPaletteColor = ArmBoardBlock->VideoSetPaletteColor; - MachVtbl.VideoGetPaletteColor = ArmBoardBlock->VideoGetPaletteColor; - MachVtbl.VideoSync = ArmBoardBlock->VideoSync; MachVtbl.GetTime = ArmBoardBlock->GetTime; /* Setup the disk and file system buffers */ @@ -178,10 +181,10 @@ MachInit(IN PCCH CommandLine) gFileSysBuffer = 0x00090000; break; - // - // Check for TI OMAP3 boards - // For now that means only Beagle, but ZOOM and others should be ok too - // + /* + * Check for TI OMAP3 boards + * For now that means only Beagle, but ZOOM and others should be ok too + */ case MACH_TYPE_OMAP3_BEAGLE: TuiPrintf("Not implemented\n"); while (TRUE); @@ -191,22 +194,9 @@ MachInit(IN PCCH CommandLine) ASSERT(FALSE); } - // - // Setup generic ARM routines for all boards - // + /* Setup generic ARM routines for all boards */ MachVtbl.PrepareForReactOS = ArmPrepareForReactOS; MachVtbl.GetMemoryMap = ArmMemGetMemoryMap; MachVtbl.HwDetect = ArmHwDetect; - - // - // Setup disk I/O routines - // MachVtbl.DiskGetBootPath = ArmDiskGetBootPath; - MachVtbl.DiskNormalizeSystemPath = ArmDiskNormalizeSystemPath; - - // - // We can now print to the console - // - TuiPrintf("%s for ARM\n", GetFreeLoaderVersionString()); - TuiPrintf("Bootargs: %s\n\n", CommandLine); } diff --git a/reactos/boot/freeldr/freeldr/arch/i386/halstub.c b/reactos/boot/freeldr/freeldr/arch/i386/halstub.c new file mode 100644 index 00000000000..02aca2b67de --- /dev/null +++ b/reactos/boot/freeldr/freeldr/arch/i386/halstub.c @@ -0,0 +1,97 @@ +/* +* PROJECT: ReactOS Kernel +* LICENSE: GPL - See COPYING in the top level directory +* FILE: boot/freeldr/freeldr/arch/i386/hal/halstub.c +* PURPOSE: I/O Stub HAL Routines +* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) +*/ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS *****************************************************************/ + +NTSTATUS +FASTCALL +xHalIoReadPartitionTable( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN BOOLEAN ReturnRecognizedPartitions, + OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer) +{ + return IoReadPartitionTable(DeviceObject, + SectorSize, + ReturnRecognizedPartitions, + PartitionBuffer); +} + +UCHAR +NTAPI +xHalVectorToIDTEntry(IN ULONG Vector) +{ + /* Return the vector */ + return Vector; +} + +VOID +NTAPI +xHalHaltSystem(VOID) +{ + /* Halt execution */ + while (TRUE); +} + +/* GLOBALS *******************************************************************/ + +HAL_DISPATCH HalDispatchTable = +{ + HAL_DISPATCH_VERSION, + (pHalQuerySystemInformation)NULL, + (pHalSetSystemInformation)NULL, + (pHalQueryBusSlots)NULL, + 0, + (pHalExamineMBR)NULL, + (pHalIoAssignDriveLetters)NULL, + (pHalIoReadPartitionTable)xHalIoReadPartitionTable, + (pHalIoSetPartitionInformation)NULL, + (pHalIoWritePartitionTable)NULL, + (pHalHandlerForBus)NULL, + (pHalReferenceBusHandler)NULL, + (pHalReferenceBusHandler)NULL, + (pHalInitPnpDriver)NULL, + (pHalInitPowerManagement)NULL, + (pHalGetDmaAdapter)NULL, + (pHalGetInterruptTranslator)NULL, + (pHalStartMirroring)NULL, + (pHalEndMirroring)NULL, + (pHalMirrorPhysicalMemory)NULL, + (pHalEndOfBoot)NULL, + (pHalMirrorVerify)NULL +}; + +HAL_PRIVATE_DISPATCH HalPrivateDispatchTable = +{ + HAL_PRIVATE_DISPATCH_VERSION, + (pHalHandlerForBus)NULL, + (pHalHandlerForConfigSpace)NULL, + (pHalLocateHiberRanges)NULL, + (pHalRegisterBusHandler)NULL, + (pHalSetWakeEnable)NULL, + (pHalSetWakeAlarm)NULL, + (pHalTranslateBusAddress)NULL, + (pHalAssignSlotResources)NULL, + (pHalHaltSystem)xHalHaltSystem, + (pHalFindBusAddressTranslation)NULL, + (pHalResetDisplay)NULL, + (pHalAllocateMapRegisters)NULL, + (pKdSetupPciDeviceForDebugging)NULL, + (pKdReleasePciDeviceForDebugging)NULL, + (pKdGetAcpiTablePhase0)NULL, + (pKdCheckPowerButton)NULL, + (pHalVectorToIDTEntry)xHalVectorToIDTEntry, + (pKdMapPhysicalMemory64)NULL, + (pKdUnmapVirtualAddress)NULL +}; diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c index 6b3d7a4dcc4..d4654ccd138 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c @@ -433,11 +433,27 @@ static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) ULONGLONG SectorOffset = 0; ULONGLONG SectorCount = 0; PARTITION_TABLE_ENTRY PartitionTableEntry; + GEOMETRY Geometry; + EXTENDED_GEOMETRY ExtGeometry; CHAR FileName[1]; if (!DissectArcPath(Path, FileName, &DriveNumber, &DrivePartition)) return EINVAL; - SectorSize = (DrivePartition == 0xff ? 2048 : 512); + + ExtGeometry.Size = sizeof(EXTENDED_GEOMETRY); + if (DiskGetExtendedDriveParameters(DriveNumber, &ExtGeometry, ExtGeometry.Size)) + { + SectorSize = ExtGeometry.BytesPerSector; + SectorCount = ExtGeometry.Sectors; + } + else if (MachDiskGetDriveGeometry(DriveNumber, &Geometry)) + { + SectorSize = Geometry.BytesPerSector; + SectorCount = Geometry.Sectors; + } + else + return EINVAL; + if (DrivePartition != 0xff && DrivePartition != 0) { if (!DiskGetPartitionEntry(DriveNumber, DrivePartition, &PartitionTableEntry)) @@ -445,10 +461,6 @@ static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) SectorOffset = PartitionTableEntry.SectorCountBeforePartition; SectorCount = PartitionTableEntry.PartitionSectorCount; } - else - { - SectorCount = 0; /* FIXME */ - } Context = MmHeapAlloc(sizeof(DISKCONTEXT)); if (!Context) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/loader.c b/reactos/boot/freeldr/freeldr/arch/i386/loader.c index 70ad27f2be0..c9ae5c454e1 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/loader.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/loader.c @@ -17,7 +17,6 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#define _NTSYSTEM_ #include #define NDEBUG diff --git a/reactos/boot/freeldr/freeldr/arch/i386/ntoskrnl.c b/reactos/boot/freeldr/freeldr/arch/i386/ntoskrnl.c new file mode 100644 index 00000000000..dcc51ef2b59 --- /dev/null +++ b/reactos/boot/freeldr/freeldr/arch/i386/ntoskrnl.c @@ -0,0 +1,114 @@ +#include +#define NDEBUG +#include + +VOID +NTAPI +KeInitializeEvent( + IN PRKEVENT Event, + IN EVENT_TYPE Type, + IN BOOLEAN State) +{ +} + +VOID +FASTCALL +KiAcquireSpinLock( + IN PKSPIN_LOCK SpinLock) +{ +} + +VOID +FASTCALL +KiReleaseSpinLock( + IN PKSPIN_LOCK SpinLock) +{ +} + +VOID +NTAPI +KeSetTimeIncrement( + IN ULONG MaxIncrement, + IN ULONG MinIncrement) +{ +} + +NTKERNELAPI +VOID +FASTCALL +IoAssignDriveLetters( + IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, + IN PSTRING NtDeviceName, + OUT PUCHAR NtSystemPath, + OUT PSTRING NtSystemPathString) +{ +} + +NTKERNELAPI +NTSTATUS +FASTCALL +IoSetPartitionInformation( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG PartitionNumber, + IN ULONG PartitionType) +{ + return STATUS_NOT_IMPLEMENTED; +} + +NTKERNELAPI +NTSTATUS +FASTCALL +IoWritePartitionTable( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG SectorsPerTrack, + IN ULONG NumberOfHeads, + IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer) +{ + return STATUS_NOT_IMPLEMENTED; +} + +NTHALAPI +VOID +NTAPI +KeStallExecutionProcessor( + IN ULONG MicroSeconds) +{ + REGS Regs; + ULONG usec_this; + + // Int 15h AH=86h + // BIOS - WAIT (AT,PS) + // + // AH = 86h + // CX:DX = interval in microseconds + // Return: + // CF clear if successful (wait interval elapsed) + // CF set on error or AH=83h wait already in progress + // AH = status (see #00496) + + // Note: The resolution of the wait period is 977 microseconds on + // many systems because many BIOSes use the 1/1024 second fast + // interrupt from the AT real-time clock chip which is available on INT 70; + // because newer BIOSes may have much more precise timers available, it is + // not possible to use this function accurately for very short delays unless + // the precise behavior of the BIOS is known (or found through testing) + + while (MicroSeconds) + { + usec_this = MicroSeconds; + + if (usec_this > 4000000) + { + usec_this = 4000000; + } + + Regs.b.ah = 0x86; + Regs.w.cx = usec_this >> 16; + Regs.w.dx = usec_this & 0xffff; + Int386(0x15, &Regs, &Regs); + + MicroSeconds -= usec_this; + } +} diff --git a/reactos/boot/freeldr/freeldr/arch/powerpc/compat.h b/reactos/boot/freeldr/freeldr/arch/powerpc/compat.h index 66797a6929d..3bc1b7998d7 100644 --- a/reactos/boot/freeldr/freeldr/arch/powerpc/compat.h +++ b/reactos/boot/freeldr/freeldr/arch/powerpc/compat.h @@ -1,5 +1,4 @@ -#ifndef _FREELDR_ARCH_COMPAT_H -#define _FREELDR_ARCH_COMPAT_H +#pragma once #define __init #define __initdata @@ -104,5 +103,3 @@ void *ioremap(__u32 phys, __u32 size); void iounmap(void *logical); __u32 GetPVR(); - -#endif/*_FREELDR_ARCH_COMPAT_H*/ diff --git a/reactos/boot/freeldr/freeldr/arch/powerpc/prep.h b/reactos/boot/freeldr/freeldr/arch/powerpc/prep.h index 710f6caec69..ea03fa0ae1f 100644 --- a/reactos/boot/freeldr/freeldr/arch/powerpc/prep.h +++ b/reactos/boot/freeldr/freeldr/arch/powerpc/prep.h @@ -1,5 +1,4 @@ -#ifndef FREELDR_ARCH_POWERPC_PREP_H -#define FREELDR_ARCH_POWERPC_PREP_H +#pragma once extern struct _pci_desc pci1_desc; extern struct _idectl_desc ide1_desc; @@ -27,5 +26,3 @@ void vga_setup ( PCONFIGURATION_COMPONENT_DATA pci_bus, struct _pci_desc *pci_desc, struct _vga_desc *vga_desc, int bus, int dev, int fn ); - -#endif//FREELDR_ARCH_POWERPC_PREP_H diff --git a/reactos/boot/freeldr/freeldr/bootmgr.c b/reactos/boot/freeldr/freeldr/bootmgr.c index a83f294cef3..0959de69d69 100644 --- a/reactos/boot/freeldr/freeldr/bootmgr.c +++ b/reactos/boot/freeldr/freeldr/bootmgr.c @@ -119,6 +119,12 @@ VOID RunLoader(VOID) return; } + // Load additional SCSI driver (if any) + if (LoadBootDeviceDriver() != ESUCCESS) + { + UiMessageBoxCritical("Unable to load additional boot device driver"); + } + if (!IniFileInitialize()) { UiMessageBoxCritical("Error initializing .ini file"); @@ -218,6 +224,7 @@ VOID RunLoader(VOID) IniOpenSection("Operating Systems", &SectionId); IniReadSettingByName(SectionId, SectionName, SettingValue, sizeof(SettingValue)); +#ifndef _M_ARM // Install the drive mapper according to this sections drive mappings #ifdef __i386__ DriveMapMapDrivesInSection(SectionName); @@ -270,6 +277,9 @@ VOID RunLoader(VOID) { LoadAndBootDrive(SectionName); } +#endif +#else + LoadAndBootWindows(SectionName, SettingValue, _WIN32_WINNT_WS03); #endif } diff --git a/reactos/boot/freeldr/freeldr/comm/rs232.c b/reactos/boot/freeldr/freeldr/comm/rs232.c index 3e3697a6aa0..0ef92cef2cd 100644 --- a/reactos/boot/freeldr/freeldr/comm/rs232.c +++ b/reactos/boot/freeldr/freeldr/comm/rs232.c @@ -18,6 +18,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ + +#ifndef _M_ARM #include @@ -285,3 +287,5 @@ BOOLEAN Rs232PortInUse(ULONG Base) return FALSE; #endif } + +#endif /* not _M_ARM */ diff --git a/reactos/boot/freeldr/freeldr/debug.c b/reactos/boot/freeldr/freeldr/debug.c index 86a4574d71b..11cdc83e4a1 100644 --- a/reactos/boot/freeldr/freeldr/debug.c +++ b/reactos/boot/freeldr/freeldr/debug.c @@ -21,7 +21,7 @@ #include -#if DBG +#if DBG && !defined(_M_ARM) //#define DEBUG_ALL //#define DEBUG_INIFILE @@ -171,6 +171,12 @@ VOID DebugPrintHeader(ULONG Mask) case DPRINT_HWDETECT: DbgPrint("HWDETECT: "); break; + case DPRINT_PELOADER: + DbgPrint("PELOADER: "); + break; + case DPRINT_SCSIPORT: + DbgPrint("SCSIPORT: "); + break; default: DbgPrint("UNKNOWN: "); break; @@ -192,6 +198,12 @@ VOID DbgPrintMask(ULONG Mask, char *format, ...) return; } + // Disable file/line for scsiport messages + if (Mask & DPRINT_SCSIPORT) + { + DebugStartOfLine = FALSE; + } + // Print the header if we have started a new line if (DebugStartOfLine) { @@ -326,3 +338,22 @@ MsgBoxPrint(const char *Format, ...) return 0; } +NTKERNELAPI +DECLSPEC_NORETURN +VOID +NTAPI +KeBugCheckEx( + IN ULONG BugCheckCode, + IN ULONG_PTR BugCheckParameter1, + IN ULONG_PTR BugCheckParameter2, + IN ULONG_PTR BugCheckParameter3, + IN ULONG_PTR BugCheckParameter4) +{ + char Buffer[70]; + sprintf(Buffer, "*** STOP: 0x%08lX (0x%08lX, 0x%08lX, 0x%08lX, 0x%08lX)", + BugCheckCode, BugCheckParameter1, BugCheckParameter2, + BugCheckParameter3, BugCheckParameter4); + UiMessageBoxCritical(Buffer); + assert(FALSE); + for (;;); +} diff --git a/reactos/boot/freeldr/freeldr/disk/disk.c b/reactos/boot/freeldr/freeldr/disk/disk.c index 1ca0a941499..16ee1be7ad9 100644 --- a/reactos/boot/freeldr/freeldr/disk/disk.c +++ b/reactos/boot/freeldr/freeldr/disk/disk.c @@ -17,6 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#ifndef _M_ARM #include #include @@ -167,3 +168,5 @@ DiskNormalizeSystemPath(char *SystemPath, unsigned Size) // This function is in arch/i386/i386disk.c //ULONG DiskGetCacheableBlockCount(ULONG DriveNumber) + +#endif diff --git a/reactos/boot/freeldr/freeldr/disk/partition.c b/reactos/boot/freeldr/freeldr/disk/partition.c index a0198bfff06..8966e67187a 100644 --- a/reactos/boot/freeldr/freeldr/disk/partition.c +++ b/reactos/boot/freeldr/freeldr/disk/partition.c @@ -17,6 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#ifndef _M_ARM #include #include @@ -238,3 +239,153 @@ BOOLEAN DiskReadBootRecord(ULONG DriveNumber, ULONGLONG LogicalSectorNumber, PMA return TRUE; } + +NTSTATUS +NTAPI +IopReadBootRecord( + IN PDEVICE_OBJECT DeviceObject, + IN ULONGLONG LogicalSectorNumber, + IN ULONG SectorSize, + OUT PMASTER_BOOT_RECORD BootRecord) +{ + ULONG FileId = (ULONG)DeviceObject; + LARGE_INTEGER Position; + ULONG BytesRead; + ULONG Status; + + Position.QuadPart = LogicalSectorNumber * SectorSize; + Status = ArcSeek(FileId, &Position, SeekAbsolute); + if (Status != ESUCCESS) + return STATUS_IO_DEVICE_ERROR; + + Status = ArcRead(FileId, BootRecord, SectorSize, &BytesRead); + if (Status != ESUCCESS || BytesRead != SectorSize) + return STATUS_IO_DEVICE_ERROR; + + return STATUS_SUCCESS; +} + +BOOLEAN +NTAPI +IopCopyPartitionRecord( + IN BOOLEAN ReturnRecognizedPartitions, + IN ULONG SectorSize, + IN PPARTITION_TABLE_ENTRY PartitionTableEntry, + OUT PARTITION_INFORMATION *PartitionEntry) +{ + BOOLEAN IsRecognized; + + IsRecognized = TRUE; /* FIXME */ + if (!IsRecognized && ReturnRecognizedPartitions) + return FALSE; + + PartitionEntry->StartingOffset.QuadPart = (ULONGLONG)PartitionTableEntry->SectorCountBeforePartition * SectorSize; + PartitionEntry->PartitionLength.QuadPart = (ULONGLONG)PartitionTableEntry->PartitionSectorCount * SectorSize; + PartitionEntry->HiddenSectors = 0; + PartitionEntry->PartitionNumber = 0; /* Will be filled later */ + PartitionEntry->PartitionType = PartitionTableEntry->SystemIndicator; + PartitionEntry->BootIndicator = (PartitionTableEntry->BootIndicator & 0x80) ? TRUE : FALSE; + PartitionEntry->RecognizedPartition = IsRecognized; + PartitionEntry->RewritePartition = FALSE; + + return TRUE; +} + +NTKERNELAPI +NTSTATUS +FASTCALL +IoReadPartitionTable( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN BOOLEAN ReturnRecognizedPartitions, + OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer) +{ + PMASTER_BOOT_RECORD MasterBootRecord; + PDRIVE_LAYOUT_INFORMATION Partitions; + ULONG NbPartitions, i, Size; + NTSTATUS ret; + + *PartitionBuffer = NULL; + + if (SectorSize < sizeof(MASTER_BOOT_RECORD)) + return STATUS_NOT_SUPPORTED; + + MasterBootRecord = ExAllocatePool(NonPagedPool, SectorSize); + if (!MasterBootRecord) + return STATUS_NO_MEMORY; + + /* Read disk MBR */ + ret = IopReadBootRecord(DeviceObject, 0, SectorSize, MasterBootRecord); + if (!NT_SUCCESS(ret)) + { + ExFreePool(MasterBootRecord); + return ret; + } + + /* Check validity of boot record */ + if (MasterBootRecord->MasterBootRecordMagic != 0xaa55) + { + ExFreePool(MasterBootRecord); + return STATUS_NOT_SUPPORTED; + } + + /* Count number of partitions */ + NbPartitions = 0; + for (i = 0; i < 4; i++) + { + NbPartitions++; + + if (MasterBootRecord->PartitionTable[i].SystemIndicator == PARTITION_EXTENDED || + MasterBootRecord->PartitionTable[i].SystemIndicator == PARTITION_XINT13_EXTENDED) + { + /* FIXME: unhandled case; count number of partitions */ + UNIMPLEMENTED; + } + } + + if (NbPartitions == 0) + { + ExFreePool(MasterBootRecord); + return STATUS_NOT_SUPPORTED; + } + + /* Allocation space to store partitions */ + Size = FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION, PartitionEntry) + + NbPartitions * sizeof(PARTITION_INFORMATION); + Partitions = ExAllocatePool(NonPagedPool, Size); + if (!Partitions) + { + ExFreePool(MasterBootRecord); + return STATUS_NO_MEMORY; + } + + /* Count number of partitions */ + NbPartitions = 0; + for (i = 0; i < 4; i++) + { + if (IopCopyPartitionRecord(ReturnRecognizedPartitions, + SectorSize, + &MasterBootRecord->PartitionTable[i], + &Partitions->PartitionEntry[NbPartitions])) + { + Partitions->PartitionEntry[NbPartitions].PartitionNumber = NbPartitions + 1; + NbPartitions++; + } + + if (MasterBootRecord->PartitionTable[i].SystemIndicator == PARTITION_EXTENDED || + MasterBootRecord->PartitionTable[i].SystemIndicator == PARTITION_XINT13_EXTENDED) + { + /* FIXME: unhandled case; copy partitions */ + UNIMPLEMENTED; + } + } + + Partitions->PartitionCount = NbPartitions; + Partitions->Signature = MasterBootRecord->Signature; + ExFreePool(MasterBootRecord); + + *PartitionBuffer = Partitions; + return STATUS_SUCCESS; +} + +#endif diff --git a/reactos/boot/freeldr/freeldr/disk/scsiport.c b/reactos/boot/freeldr/freeldr/disk/scsiport.c new file mode 100644 index 00000000000..d8d15b12d84 --- /dev/null +++ b/reactos/boot/freeldr/freeldr/disk/scsiport.c @@ -0,0 +1,1701 @@ +#include + +#define _SCSIPORT_ + +#include +#include +#include +#include +#include +#include +#include +#include + +#define NDEBUG +#include + +#define DPRINTM2(fmt, ...) DPRINTM(DPRINT_SCSIPORT, "(%s:%d) SCSIPORT: " fmt, __FILE__, __LINE__, __VA_ARGS__) + +#undef UNIMPLEMENTED +#define UNIMPLEMENTED DPRINTM2("%s UNIMPLEMENTED\n", __FUNCTION__) + +#define SCSI_PORT_NEXT_REQUEST_READY 0x0008 + +typedef struct +{ + PVOID NonCachedExtension; + + ULONG BusNum; + ULONG MaxTargedIds; + + ULONG InterruptFlags; + + /* SRB extension stuff */ + ULONG SrbExtensionSize; + PVOID SrbExtensionBuffer; + + IO_SCSI_CAPABILITIES PortCapabilities; + + PHW_INITIALIZE HwInitialize; + PHW_STARTIO HwStartIo; + PHW_INTERRUPT HwInterrupt; + PHW_RESET_BUS HwResetBus; + + /* DMA related stuff */ + PADAPTER_OBJECT AdapterObject; + + ULONG CommonBufferLength; + + PVOID MiniPortDeviceExtension; +} SCSI_PORT_DEVICE_EXTENSION, *PSCSI_PORT_DEVICE_EXTENSION; + +PSCSI_PORT_DEVICE_EXTENSION ScsiDeviceExtensions[SCSI_MAXIMUM_BUSES]; + +ULONG +ntohl( + IN ULONG Value) +{ + FOUR_BYTE Dest; + PFOUR_BYTE Source = (PFOUR_BYTE)&Value; + + Dest.Byte0 = Source->Byte3; + Dest.Byte1 = Source->Byte2; + Dest.Byte2 = Source->Byte1; + Dest.Byte3 = Source->Byte0; + + return Dest.AsULong; +} + +BOOLEAN +SpiSendSynchronousSrb( + IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, + IN PSCSI_REQUEST_BLOCK Srb) +{ + BOOLEAN ret; + + ASSERT(!(Srb->SrbFlags & SRB_FLAGS_IS_ACTIVE)); + + /* HACK: handle lack of interrupts */ + while (!(DeviceExtension->InterruptFlags & SCSI_PORT_NEXT_REQUEST_READY)) + { + KeStallExecutionProcessor(100 * 1000); + DeviceExtension->HwInterrupt(DeviceExtension->MiniPortDeviceExtension); + } + + DeviceExtension->InterruptFlags &= ~SCSI_PORT_NEXT_REQUEST_READY; + Srb->SrbFlags |= SRB_FLAGS_IS_ACTIVE; + + if (!DeviceExtension->HwStartIo( + DeviceExtension->MiniPortDeviceExtension, + Srb)) + { + ExFreePool(Srb); + return FALSE; + } + + /* HACK: handle lack of interrupts */ + while (Srb->SrbFlags & SRB_FLAGS_IS_ACTIVE) + { + KeStallExecutionProcessor(100 * 1000); + DeviceExtension->HwInterrupt(DeviceExtension->MiniPortDeviceExtension); + } + + ret = SRB_STATUS(Srb->SrbStatus) == SRB_STATUS_SUCCESS; + ExFreePool(Srb); + + return ret; +} + +typedef struct tagDISKCONTEXT +{ + /* Device ID */ + PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; + ULONG PathId; + ULONG TargetId; + ULONG Lun; + + /* Device characteristics */ + ULONG SectorSize; + ULONGLONG SectorOffset; + ULONGLONG SectorCount; + ULONGLONG SectorNumber; +} DISKCONTEXT; + +static LONG DiskClose(ULONG FileId) +{ + DISKCONTEXT* Context = FsGetDeviceSpecific(FileId); + + ExFreePool(Context); + return ESUCCESS; +} + +static LONG DiskGetFileInformation(ULONG FileId, FILEINFORMATION* Information) +{ + DISKCONTEXT* Context = FsGetDeviceSpecific(FileId); + + RtlZeroMemory(Information, sizeof(FILEINFORMATION)); + Information->EndingAddress.QuadPart = Context->SectorCount * Context->SectorSize; + Information->CurrentAddress.LowPart = Context->SectorNumber * Context->SectorSize; + + return ESUCCESS; +} + +static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) +{ + PSCSI_REQUEST_BLOCK Srb; + PCDB Cdb; + READ_CAPACITY_DATA ReadCapacityBuffer; + + DISKCONTEXT* Context; + PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; + ULONG ScsiBus, PathId, TargetId, Lun, Partition, PathSyntax; + ULONG SectorSize; + ULONGLONG SectorOffset = 0; + ULONGLONG SectorCount; + + /* Parse ARC path */ + if (!DissectArcPath2(Path, &ScsiBus, &TargetId, &Lun, &Partition, &PathSyntax)) + return EINVAL; + if (PathSyntax != 0) /* scsi() format */ + return EINVAL; + DeviceExtension = ScsiDeviceExtensions[ScsiBus]; + PathId = ScsiBus - DeviceExtension->BusNum; + + /* Get disk capacity and sector size */ + Srb = ExAllocatePool(PagedPool, sizeof(SCSI_REQUEST_BLOCK)); + if (!Srb) + return ENOMEM; + RtlZeroMemory(Srb, sizeof(SCSI_REQUEST_BLOCK)); + Srb->Length = sizeof(SCSI_REQUEST_BLOCK); + Srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + Srb->PathId = PathId; + Srb->TargetId = TargetId; + Srb->Lun = Lun; + Srb->CdbLength = 10; + Srb->SrbFlags = SRB_FLAGS_DATA_IN; + Srb->DataTransferLength = sizeof(READ_CAPACITY_DATA); + Srb->TimeOutValue = 5; /* in seconds */ + Srb->DataBuffer = &ReadCapacityBuffer; + Cdb = (PCDB)Srb->Cdb; + Cdb->CDB10.OperationCode = SCSIOP_READ_CAPACITY; + if (!SpiSendSynchronousSrb(DeviceExtension, Srb)) + { + return EIO; + } + + /* Transform result to host endianness */ + SectorCount = ntohl(ReadCapacityBuffer.LogicalBlockAddress); + SectorSize = ntohl(ReadCapacityBuffer.BytesPerBlock); + + if (Partition != 0) + { + /* Need to offset start of disk and length */ + UNIMPLEMENTED; + return EIO; + } + + Context = ExAllocatePool(PagedPool, sizeof(DISKCONTEXT)); + if (!Context) + return ENOMEM; + Context->DeviceExtension = DeviceExtension; + Context->PathId = PathId; + Context->TargetId = TargetId; + Context->Lun = Lun; + Context->SectorSize = SectorSize; + Context->SectorOffset = SectorOffset; + Context->SectorCount = SectorCount; + Context->SectorNumber = 0; + FsSetDeviceSpecific(*FileId, Context); + + return ESUCCESS; +} + +static LONG DiskRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count) +{ + DISKCONTEXT* Context = FsGetDeviceSpecific(FileId); + PSCSI_REQUEST_BLOCK Srb; + PCDB Cdb; + ULONG FullSectors, NbSectors; + ULONG Lba; + + *Count = 0; + + if (N == 0) + return ESUCCESS; + + FullSectors = N / Context->SectorSize; + NbSectors = (N + Context->SectorSize - 1) / Context->SectorSize; + if (Context->SectorNumber + NbSectors >= Context->SectorCount) + return EINVAL; + if (FullSectors > 0xffff) + return EINVAL; + + /* Read full sectors */ + Lba = Context->SectorNumber; + if (FullSectors > 0) + { + Srb = ExAllocatePool(PagedPool, sizeof(SCSI_REQUEST_BLOCK)); + if (!Srb) + return ENOMEM; + + RtlZeroMemory(Srb, sizeof(SCSI_REQUEST_BLOCK)); + Srb->Length = sizeof(SCSI_REQUEST_BLOCK); + Srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + Srb->PathId = Context->PathId; + Srb->TargetId = Context->TargetId; + Srb->Lun = Context->Lun; + Srb->CdbLength = 10; + Srb->SrbFlags = SRB_FLAGS_DATA_IN; + Srb->DataTransferLength = FullSectors * Context->SectorSize; + Srb->TimeOutValue = 5; /* in seconds */ + Srb->DataBuffer = Buffer; + Cdb = (PCDB)Srb->Cdb; + Cdb->CDB10.OperationCode = SCSIOP_READ; + Cdb->CDB10.LogicalUnitNumber = Srb->Lun; + Cdb->CDB10.LogicalBlockByte0 = (Lba >> 24) & 0xff; + Cdb->CDB10.LogicalBlockByte1 = (Lba >> 16) & 0xff; + Cdb->CDB10.LogicalBlockByte2 = (Lba >> 8) & 0xff; + Cdb->CDB10.LogicalBlockByte3 = Lba & 0xff; + Cdb->CDB10.TransferBlocksMsb = (FullSectors >> 8) & 0xff; + Cdb->CDB10.TransferBlocksLsb = FullSectors & 0xff; + if (!SpiSendSynchronousSrb(Context->DeviceExtension, Srb)) + { + return EIO; + } + Buffer = (PUCHAR)Buffer + FullSectors * Context->SectorSize; + N -= FullSectors * Context->SectorSize; + *Count += FullSectors * Context->SectorSize; + Lba += FullSectors; + } + + /* Read incomplete last sector */ + if (N > 0) + { + PUCHAR Sector; + + Sector = ExAllocatePool(PagedPool, Context->SectorSize); + if (!Sector) + return ENOMEM; + + Srb = ExAllocatePool(PagedPool, sizeof(SCSI_REQUEST_BLOCK)); + if (!Srb) + { + ExFreePool(Sector); + return ENOMEM; + } + + RtlZeroMemory(Srb, sizeof(SCSI_REQUEST_BLOCK)); + Srb->Length = sizeof(SCSI_REQUEST_BLOCK); + Srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + Srb->PathId = Context->PathId; + Srb->TargetId = Context->TargetId; + Srb->Lun = Context->Lun; + Srb->CdbLength = 10; + Srb->SrbFlags = SRB_FLAGS_DATA_IN; + Srb->DataTransferLength = Context->SectorSize; + Srb->TimeOutValue = 5; /* in seconds */ + Srb->DataBuffer = Sector; + Cdb = (PCDB)Srb->Cdb; + Cdb->CDB10.OperationCode = SCSIOP_READ; + Cdb->CDB10.LogicalUnitNumber = Srb->Lun; + Cdb->CDB10.LogicalBlockByte0 = (Lba >> 24) & 0xff; + Cdb->CDB10.LogicalBlockByte1 = (Lba >> 16) & 0xff; + Cdb->CDB10.LogicalBlockByte2 = (Lba >> 8) & 0xff; + Cdb->CDB10.LogicalBlockByte3 = Lba & 0xff; + Cdb->CDB10.TransferBlocksMsb = 0; + Cdb->CDB10.TransferBlocksLsb = 1; + if (!SpiSendSynchronousSrb(Context->DeviceExtension, Srb)) + { + ExFreePool(Sector); + return EIO; + } + RtlCopyMemory(Buffer, Sector, N); + *Count += N; + ExFreePool(Sector); + } + + return ESUCCESS; +} + +static LONG DiskSeek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode) +{ + DISKCONTEXT* Context = FsGetDeviceSpecific(FileId); + + if (SeekMode != SeekAbsolute) + return EINVAL; + if (Position->QuadPart & (Context->SectorSize - 1)) + return EINVAL; + + Context->SectorNumber = Position->QuadPart / Context->SectorSize; + return ESUCCESS; +} + +static const DEVVTBL DiskVtbl = { + DiskClose, + DiskGetFileInformation, + DiskOpen, + DiskRead, + DiskSeek, +}; + +NTSTATUS +SpiCreatePortConfig( + IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, + IN PHW_INITIALIZATION_DATA HwInitData, + OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, + IN BOOLEAN ZeroStruct) +{ + ULONG Bus; + + /* Zero out the struct if told so */ + if (ZeroStruct) + { + /* First zero the portconfig */ + RtlZeroMemory(ConfigInfo, sizeof(PORT_CONFIGURATION_INFORMATION)); + + /* Initialize the struct */ + ConfigInfo->Length = sizeof(PORT_CONFIGURATION_INFORMATION); + ConfigInfo->AdapterInterfaceType = HwInitData->AdapterInterfaceType; + ConfigInfo->InterruptMode = Latched; + ConfigInfo->DmaChannel = SP_UNINITIALIZED_VALUE; + ConfigInfo->DmaPort = SP_UNINITIALIZED_VALUE; + ConfigInfo->MaximumTransferLength = SP_UNINITIALIZED_VALUE; + ConfigInfo->MaximumNumberOfTargets = SCSI_MAXIMUM_TARGETS_PER_BUS; + + /* Store parameters */ + ConfigInfo->NeedPhysicalAddresses = HwInitData->NeedPhysicalAddresses; + ConfigInfo->MapBuffers = HwInitData->MapBuffers; + ConfigInfo->AutoRequestSense = HwInitData->AutoRequestSense; + ConfigInfo->ReceiveEvent = HwInitData->ReceiveEvent; + ConfigInfo->TaggedQueuing = HwInitData->TaggedQueuing; + ConfigInfo->MultipleRequestPerLu = HwInitData->MultipleRequestPerLu; + + /* Get the disk usage */ + ConfigInfo->AtdiskPrimaryClaimed = FALSE; // FIXME + ConfigInfo->AtdiskSecondaryClaimed = FALSE; // FIXME + + /* Initiator bus id is not set */ + for (Bus = 0; Bus < 8; Bus++) + ConfigInfo->InitiatorBusId[Bus] = (CCHAR)SP_UNINITIALIZED_VALUE; + } + + ConfigInfo->NumberOfPhysicalBreaks = 17; + + return STATUS_SUCCESS; +} + +VOID +DDKCDECLAPI +ScsiDebugPrint( + IN ULONG DebugPrintLevel, + IN PCCHAR DebugMessage, + IN ...) +{ + va_list ap; + CHAR Buffer[512]; + ULONG Length; + + if (DebugPrintLevel > 10) + return; + + va_start(ap, DebugMessage); + + /* Construct a string */ + Length = _vsnprintf(Buffer, 512, DebugMessage, ap); + + /* Check if we went past the buffer */ + if (Length == MAXULONG) + { + /* Terminate it if we went over-board */ + Buffer[sizeof(Buffer) - 1] = '\0'; + + /* Put maximum */ + Length = sizeof(Buffer); + } + + /* Print the message */ + DPRINTM(DPRINT_SCSIPORT, "%s", Buffer); + + /* Cleanup */ + va_end(ap); +} + +VOID +DDKAPI +ScsiPortCompleteRequest( + IN PVOID HwDeviceExtension, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun, + IN UCHAR SrbStatus) +{ + // FIXME + UNIMPLEMENTED; +} + +#undef ScsiPortConvertPhysicalAddressToUlong +ULONG +DDKAPI +ScsiPortConvertPhysicalAddressToUlong( + IN SCSI_PHYSICAL_ADDRESS Address) +{ + return Address.LowPart; +} + +SCSI_PHYSICAL_ADDRESS +DDKAPI +ScsiPortConvertUlongToPhysicalAddress( + IN ULONG UlongAddress) +{ + return RtlConvertUlongToLargeInteger(UlongAddress); +} + +VOID +DDKAPI +ScsiPortFlushDma( + IN PVOID DeviceExtension) +{ + // FIXME + UNIMPLEMENTED; +} + +VOID +DDKAPI +ScsiPortFreeDeviceBase( + IN PVOID HwDeviceExtension, + IN PVOID MappedAddress) +{ + // Nothing to do +} + +ULONG +DDKAPI +ScsiPortGetBusData( + IN PVOID DeviceExtension, + IN ULONG BusDataType, + IN ULONG SystemIoBusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Length) +{ + return HalGetBusDataByOffset(BusDataType, SystemIoBusNumber, SlotNumber, Buffer, 0, Length); +} + +PVOID +DDKAPI +ScsiPortGetDeviceBase( + IN PVOID HwDeviceExtension, + IN INTERFACE_TYPE BusType, + IN ULONG SystemIoBusNumber, + IN SCSI_PHYSICAL_ADDRESS IoAddress, + IN ULONG NumberOfBytes, + IN BOOLEAN InIoSpace) +{ + PHYSICAL_ADDRESS TranslatedAddress; + ULONG AddressSpace; + + AddressSpace = (ULONG)InIoSpace; + if (HalTranslateBusAddress(BusType, + SystemIoBusNumber, + IoAddress, + &AddressSpace, + &TranslatedAddress) == FALSE) + { + return NULL; + } + + /* I/O space */ + if (AddressSpace != 0) + return (PVOID)TranslatedAddress.u.LowPart; + + // FIXME + UNIMPLEMENTED; + return (PVOID)IoAddress.LowPart; +} + +PVOID +DDKAPI +ScsiPortGetLogicalUnit( + IN PVOID HwDeviceExtension, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun) +{ + // FIXME + UNIMPLEMENTED; + return NULL; +} + +SCSI_PHYSICAL_ADDRESS +DDKAPI +ScsiPortGetPhysicalAddress( + IN PVOID HwDeviceExtension, + IN PSCSI_REQUEST_BLOCK Srb OPTIONAL, + IN PVOID VirtualAddress, + OUT ULONG *Length) +{ + PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; + SCSI_PHYSICAL_ADDRESS PhysicalAddress; + ULONG BufferLength = 0; + ULONG Offset; + + DPRINTM2("ScsiPortGetPhysicalAddress(%p %p %p %p)\n", + HwDeviceExtension, Srb, VirtualAddress, Length); + + DeviceExtension = ((PSCSI_PORT_DEVICE_EXTENSION)HwDeviceExtension) - 1; + + if (Srb == NULL || Srb->SenseInfoBuffer == VirtualAddress) + { + /* Simply look it up in the allocated common buffer */ + Offset = (PUCHAR)VirtualAddress - (PUCHAR)DeviceExtension->SrbExtensionBuffer; + + BufferLength = DeviceExtension->CommonBufferLength - Offset; + PhysicalAddress.QuadPart = Offset; + } + else + { + /* Nothing */ + *Length = 0; + PhysicalAddress.QuadPart = (LONGLONG)(SP_UNINITIALIZED_VALUE); + } + + *Length = BufferLength; + return PhysicalAddress; +} + +PSCSI_REQUEST_BLOCK +DDKAPI +ScsiPortGetSrb( + IN PVOID DeviceExtension, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun, + IN LONG QueueTag) +{ + // FIXME + UNIMPLEMENTED; + return NULL; +} + +NTSTATUS +SpiAllocateCommonBuffer( + IN OUT PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, + IN ULONG NonCachedSize) +{ + PVOID CommonBuffer; + ULONG CommonBufferLength, BufSize; + + /* If size is 0, set it to 16 */ + if (!DeviceExtension->SrbExtensionSize) + DeviceExtension->SrbExtensionSize = 16; + + /* Calculate size */ + BufSize = DeviceExtension->SrbExtensionSize; + + /* Round it */ + BufSize = (BufSize + sizeof(LONGLONG) - 1) & ~(sizeof(LONGLONG) - 1); + + /* Sum up into the total common buffer length, and round it to page size */ + CommonBufferLength = + ROUND_TO_PAGES(NonCachedSize); + + /* Allocate it */ + if (!DeviceExtension->AdapterObject) + { + /* From nonpaged pool if there is no DMA */ + CommonBuffer = ExAllocatePool(NonPagedPool, CommonBufferLength); + } + else + { + /* Perform a full request since we have a DMA adapter*/ + UNIMPLEMENTED; + CommonBuffer = NULL; + } + + /* Fail in case of error */ + if (!CommonBuffer) + return STATUS_INSUFFICIENT_RESOURCES; + + /* Zero it */ + RtlZeroMemory(CommonBuffer, CommonBufferLength); + + /* Store its size in Device Extension */ + DeviceExtension->CommonBufferLength = CommonBufferLength; + + /* SrbExtension buffer is located at the beginning of the buffer */ + DeviceExtension->SrbExtensionBuffer = CommonBuffer; + + /* Non-cached extension buffer is located at the end of + the common buffer */ + if (NonCachedSize) + { + CommonBufferLength -= NonCachedSize; + DeviceExtension->NonCachedExtension = (PUCHAR)CommonBuffer + CommonBufferLength; + } + else + { + DeviceExtension->NonCachedExtension = NULL; + } + + return STATUS_SUCCESS; +} + +PVOID +DDKAPI +ScsiPortGetUncachedExtension( + IN PVOID HwDeviceExtension, + IN PPORT_CONFIGURATION_INFORMATION ConfigInfo, + IN ULONG NumberOfBytes) +{ + PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; + DEVICE_DESCRIPTION DeviceDescription; + ULONG MapRegistersCount; + NTSTATUS Status; + + DPRINTM2("ScsiPortGetUncachedExtension(%p %p %lu)\n", + HwDeviceExtension, ConfigInfo, NumberOfBytes); + + DeviceExtension = ((PSCSI_PORT_DEVICE_EXTENSION)HwDeviceExtension) - 1; + + /* Check for allocated common DMA buffer */ + if (DeviceExtension->SrbExtensionBuffer != NULL) + { + return NULL; + } + + /* Check for DMA adapter object */ + if (DeviceExtension->AdapterObject == NULL) + { + /* Initialize DMA adapter description */ + RtlZeroMemory(&DeviceDescription, sizeof(DEVICE_DESCRIPTION)); + + DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION; + DeviceDescription.Master = ConfigInfo->Master; + DeviceDescription.ScatterGather = ConfigInfo->ScatterGather; + DeviceDescription.DemandMode = ConfigInfo->DemandMode; + DeviceDescription.Dma32BitAddresses = ConfigInfo->Dma32BitAddresses; + DeviceDescription.BusNumber = ConfigInfo->SystemIoBusNumber; + DeviceDescription.DmaChannel = ConfigInfo->DmaChannel; + DeviceDescription.InterfaceType = ConfigInfo->AdapterInterfaceType; + DeviceDescription.DmaWidth = ConfigInfo->DmaWidth; + DeviceDescription.DmaSpeed = ConfigInfo->DmaSpeed; + DeviceDescription.MaximumLength = ConfigInfo->MaximumTransferLength; + DeviceDescription.DmaPort = ConfigInfo->DmaPort; + + /* Get a DMA adapter object */ +#if 0 + DeviceExtension->AdapterObject = + HalGetAdapter(&DeviceDescription, &MapRegistersCount); + + /* Fail in case of error */ + if (DeviceExtension->AdapterObject == NULL) + { + return NULL; + } +#else + MapRegistersCount = 0; +#endif + + /* Set number of physical breaks */ + if (ConfigInfo->NumberOfPhysicalBreaks != 0 && + MapRegistersCount > ConfigInfo->NumberOfPhysicalBreaks) + { + DeviceExtension->PortCapabilities.MaximumPhysicalPages = + ConfigInfo->NumberOfPhysicalBreaks; + } + else + { + DeviceExtension->PortCapabilities.MaximumPhysicalPages = MapRegistersCount; + } + } + + /* Update Srb extension size */ + if (DeviceExtension->SrbExtensionSize != ConfigInfo->SrbExtensionSize) + DeviceExtension->SrbExtensionSize = ConfigInfo->SrbExtensionSize; + + /* Allocate a common DMA buffer */ + Status = SpiAllocateCommonBuffer(DeviceExtension, NumberOfBytes); + + if (!NT_SUCCESS(Status)) + { + DPRINTM2("SpiAllocateCommonBuffer() failed with Status = 0x%08X!\n", Status); + return NULL; + } + + return DeviceExtension->NonCachedExtension; +} + +PVOID +DDKAPI +ScsiPortGetVirtualAddress( + IN PVOID HwDeviceExtension, + IN SCSI_PHYSICAL_ADDRESS PhysicalAddress) +{ + // FIXME + UNIMPLEMENTED; + return NULL; +} + +VOID +SpiScanDevice( + IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, + IN PCHAR ArcName, + IN ULONG ScsiBus, + IN ULONG TargetId, + IN ULONG Lun) +{ + ULONG FileId, i; + ULONG Status; + NTSTATUS ret; + struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer; + CHAR PartitionName[64]; + + /* Register device with partition(0) suffix */ + sprintf(PartitionName, "%spartition(0)", ArcName); + FsRegisterDevice(PartitionName, &DiskVtbl); + + /* Read device partition table */ + Status = ArcOpen(PartitionName, OpenReadOnly, &FileId); + if (Status == ESUCCESS) + { + ret = HALDISPATCH->HalIoReadPartitionTable((PDEVICE_OBJECT)FileId, 512, FALSE, &PartitionBuffer); + if (NT_SUCCESS(ret)) + { + for (i = 0; i < PartitionBuffer->PartitionCount; i++) + { + if (PartitionBuffer->PartitionEntry[i].PartitionType != PARTITION_ENTRY_UNUSED) + { + sprintf(PartitionName, "%spartition(%lu)", + ArcName, PartitionBuffer->PartitionEntry[i].PartitionNumber); + FsRegisterDevice(PartitionName, &DiskVtbl); + } + } + ExFreePool(PartitionBuffer); + } + ArcClose(FileId); + } +} + +VOID +SpiScanAdapter( + IN PSCSI_PORT_DEVICE_EXTENSION DeviceExtension, + IN ULONG ScsiBus, + IN ULONG PathId) +{ + CHAR ArcName[64]; + PSCSI_REQUEST_BLOCK Srb; + PCDB Cdb; + INQUIRYDATA InquiryBuffer; + ULONG TargetId; + ULONG Lun; + + if (!DeviceExtension->HwResetBus(DeviceExtension->MiniPortDeviceExtension, PathId)) + { + return; + } + + /* Remember the extension */ + ScsiDeviceExtensions[ScsiBus] = DeviceExtension; + + for (TargetId = 0; TargetId < DeviceExtension->MaxTargedIds; TargetId++) + { + Lun = 0; + do + { + DPRINTM2("Scanning SCSI device %d.%d.%d\n", + ScsiBus, TargetId, Lun); + + Srb = ExAllocatePool(PagedPool, sizeof(SCSI_REQUEST_BLOCK)); + if (!Srb) + break; + RtlZeroMemory(Srb, sizeof(SCSI_REQUEST_BLOCK)); + Srb->Length = sizeof(SCSI_REQUEST_BLOCK); + Srb->Function = SRB_FUNCTION_EXECUTE_SCSI; + Srb->PathId = PathId; + Srb->TargetId = TargetId; + Srb->Lun = Lun; + Srb->CdbLength = 6; + Srb->SrbFlags = SRB_FLAGS_DATA_IN; + Srb->DataTransferLength = INQUIRYDATABUFFERSIZE; + Srb->TimeOutValue = 5; /* in seconds */ + Srb->DataBuffer = &InquiryBuffer; + Cdb = (PCDB)Srb->Cdb; + Cdb->CDB6INQUIRY.OperationCode = SCSIOP_INQUIRY; + Cdb->CDB6INQUIRY.LogicalUnitNumber = Srb->Lun; + Cdb->CDB6INQUIRY.AllocationLength = Srb->DataTransferLength; + if (!SpiSendSynchronousSrb(DeviceExtension, Srb)) + { + /* Don't check next LUNs */ + break; + } + + /* Device exists, create its ARC name */ + if (InquiryBuffer.RemovableMedia) + { + sprintf(ArcName, "scsi(%ld)cdrom(%ld)fdisk(%ld)", + ScsiBus, TargetId, Lun); + FsRegisterDevice(ArcName, &DiskVtbl); + } + else + { + sprintf(ArcName, "scsi(%ld)disk(%ld)rdisk(%ld)", + ScsiBus, TargetId, Lun); + /* Now, check if it has partitions */ + SpiScanDevice(DeviceExtension, ArcName, PathId, TargetId, Lun); + } + + /* Check next LUN */ + Lun++; + } while (Lun < SCSI_MAXIMUM_LOGICAL_UNITS); + } +} + +VOID +SpiResourceToConfig( + IN PHW_INITIALIZATION_DATA HwInitializationData, + IN PCM_FULL_RESOURCE_DESCRIPTOR ResourceDescriptor, + IN OUT PPORT_CONFIGURATION_INFORMATION PortConfig) +{ + PACCESS_RANGE AccessRange; + PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialData; + ULONG RangeNumber; + ULONG Index; + + RangeNumber = 0; + + /* Loop through all entries */ + for (Index = 0; Index < ResourceDescriptor->PartialResourceList.Count; Index++) + { + PartialData = &ResourceDescriptor->PartialResourceList.PartialDescriptors[Index]; + + switch (PartialData->Type) + { + case CmResourceTypePort: + /* Copy access ranges */ + if (RangeNumber < HwInitializationData->NumberOfAccessRanges) + { + DPRINTM2("Got port at 0x%I64x, len 0x%x\n", + PartialData->u.Port.Start.QuadPart, PartialData->u.Port.Length); + AccessRange = &((*(PortConfig->AccessRanges))[RangeNumber]); + + AccessRange->RangeStart = PartialData->u.Port.Start; + AccessRange->RangeLength = PartialData->u.Port.Length; + + AccessRange->RangeInMemory = FALSE; + RangeNumber++; + } + break; + + case CmResourceTypeMemory: + /* Copy access ranges */ + if (RangeNumber < HwInitializationData->NumberOfAccessRanges) + { + DPRINTM2("Got memory at 0x%I64x, len 0x%x\n", + PartialData->u.Memory.Start.QuadPart, PartialData->u.Memory.Length); + AccessRange = &((*(PortConfig->AccessRanges))[RangeNumber]); + + AccessRange->RangeStart = PartialData->u.Memory.Start; + AccessRange->RangeLength = PartialData->u.Memory.Length; + + AccessRange->RangeInMemory = TRUE; + RangeNumber++; + } + break; + + case CmResourceTypeInterrupt: + /* Copy interrupt data */ + DPRINTM2("Got interrupt level %d, vector %d\n", + PartialData->u.Interrupt.Level, PartialData->u.Interrupt.Vector); + PortConfig->BusInterruptLevel = PartialData->u.Interrupt.Level; + PortConfig->BusInterruptVector = PartialData->u.Interrupt.Vector; + + /* Set interrupt mode accordingly to the resource */ + if (PartialData->Flags == CM_RESOURCE_INTERRUPT_LATCHED) + { + PortConfig->InterruptMode = Latched; + } + else if (PartialData->Flags == CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE) + { + PortConfig->InterruptMode = LevelSensitive; + } + break; + + case CmResourceTypeDma: + DPRINTM2("Got DMA channel %d, port %d\n", + PartialData->u.Dma.Channel, PartialData->u.Dma.Port); + PortConfig->DmaChannel = PartialData->u.Dma.Channel; + PortConfig->DmaPort = PartialData->u.Dma.Port; + break; + } + } +} + +BOOLEAN +SpiGetPciConfigData( + IN struct _HW_INITIALIZATION_DATA *HwInitializationData, + IN OUT PPORT_CONFIGURATION_INFORMATION PortConfig, + IN ULONG BusNumber, + IN OUT PPCI_SLOT_NUMBER NextSlotNumber) +{ + PCI_COMMON_CONFIG PciConfig; + PCI_SLOT_NUMBER SlotNumber; + ULONG DataSize; + ULONG DeviceNumber; + ULONG FunctionNumber; + CHAR VendorIdString[8]; + CHAR DeviceIdString[8]; + PCM_RESOURCE_LIST ResourceList; + NTSTATUS Status; + + RtlZeroMemory(&ResourceList, sizeof(PCM_RESOURCE_LIST)); + SlotNumber.u.AsULONG = 0; + + /* Loop through all devices */ + for (DeviceNumber = NextSlotNumber->u.bits.DeviceNumber; DeviceNumber < PCI_MAX_DEVICES; DeviceNumber++) + { + SlotNumber.u.bits.DeviceNumber = DeviceNumber; + + /* Loop through all functions */ + for (FunctionNumber = NextSlotNumber->u.bits.FunctionNumber; FunctionNumber < PCI_MAX_FUNCTION; FunctionNumber++) + { + SlotNumber.u.bits.FunctionNumber = FunctionNumber; + + /* Get PCI config bytes */ + DataSize = HalGetBusDataByOffset( + PCIConfiguration, + BusNumber, + SlotNumber.u.AsULONG, + &PciConfig, + 0, + sizeof(ULONG)); + + /* If result of HalGetBusData is 0, then the bus is wrong */ + if (DataSize == 0) + return FALSE; + + /* If result is PCI_INVALID_VENDORID, then this device has no more + "Functions" */ + if (PciConfig.VendorID == PCI_INVALID_VENDORID) + break; + + sprintf(VendorIdString, "%04hx", PciConfig.VendorID); + sprintf(DeviceIdString, "%04hx", PciConfig.DeviceID); + + if (_strnicmp(VendorIdString, HwInitializationData->VendorId, HwInitializationData->VendorIdLength) || + _strnicmp(DeviceIdString, HwInitializationData->DeviceId, HwInitializationData->DeviceIdLength)) + { + /* It is not our device */ + continue; + } + + DPRINTM2( "Found device 0x%04hx 0x%04hx at %1lu %2lu %1lu\n", + PciConfig.VendorID, PciConfig.DeviceID, + BusNumber, + SlotNumber.u.bits.DeviceNumber, SlotNumber.u.bits.FunctionNumber); + + Status = HalAssignSlotResources(NULL, + NULL, + NULL, + NULL, + PCIBus, + BusNumber, + SlotNumber.u.AsULONG, + &ResourceList); + + if (!NT_SUCCESS(Status)) + break; + + /* Create configuration information */ + SpiResourceToConfig(HwInitializationData, + ResourceList->List, + PortConfig); + + /* Free the resource list */ + ExFreePool(ResourceList); + + /* Set dev & fn numbers */ + NextSlotNumber->u.bits.DeviceNumber = DeviceNumber; + NextSlotNumber->u.bits.FunctionNumber = FunctionNumber + 1; + + /* Save the slot number */ + PortConfig->SlotNumber = SlotNumber.u.AsULONG; + + return TRUE; + } + NextSlotNumber->u.bits.FunctionNumber = 0; + } + + NextSlotNumber->u.bits.DeviceNumber = 0; + + return FALSE; +} + +ULONG +DDKAPI +ScsiPortInitialize( + IN PVOID Argument1, + IN PVOID Argument2, + IN struct _HW_INITIALIZATION_DATA *HwInitializationData, + IN PVOID HwContext OPTIONAL) +{ + PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; + ULONG DeviceExtensionSize; + PORT_CONFIGURATION_INFORMATION PortConfig; + BOOLEAN Again; + BOOLEAN FirstConfigCall = TRUE; + PCI_SLOT_NUMBER SlotNumber; + NTSTATUS Status; + + if (HwInitializationData->HwInitializationDataSize != sizeof(HW_INITIALIZATION_DATA)) + { + return STATUS_INVALID_PARAMETER; + } + + /* Check params for validity */ + if ((HwInitializationData->HwInitialize == NULL) || + (HwInitializationData->HwStartIo == NULL) || + (HwInitializationData->HwInterrupt == NULL) || + (HwInitializationData->HwFindAdapter == NULL) || + (HwInitializationData->HwResetBus == NULL)) + { + return STATUS_INVALID_PARAMETER; + } + + /* Zero starting slot number */ + SlotNumber.u.AsULONG = 0; + + while (TRUE) + { + Again = FALSE; + + DeviceExtensionSize = sizeof(SCSI_PORT_DEVICE_EXTENSION) + HwInitializationData->DeviceExtensionSize; + DeviceExtension = MmHeapAlloc(DeviceExtensionSize); + if (!DeviceExtension) + { + return STATUS_NO_MEMORY; + } + RtlZeroMemory(DeviceExtension, DeviceExtensionSize); + DeviceExtension->InterruptFlags = SCSI_PORT_NEXT_REQUEST_READY; + DeviceExtension->HwInitialize = HwInitializationData->HwInitialize; + DeviceExtension->HwStartIo = HwInitializationData->HwStartIo; + DeviceExtension->HwInterrupt = HwInitializationData->HwInterrupt; + DeviceExtension->HwResetBus = HwInitializationData->HwResetBus; + DeviceExtension->MiniPortDeviceExtension = (PVOID)(DeviceExtension + 1); + + Status = SpiCreatePortConfig(DeviceExtension, + HwInitializationData, + &PortConfig, + FirstConfigCall); + if (Status != STATUS_SUCCESS) + { + MmHeapFree(DeviceExtension); + return Status; + } + + PortConfig.NumberOfAccessRanges = HwInitializationData->NumberOfAccessRanges; + PortConfig.AccessRanges = MmHeapAlloc(sizeof(ACCESS_RANGE) * HwInitializationData->NumberOfAccessRanges); + if (!PortConfig.AccessRanges) + { + MmHeapFree(DeviceExtension); + return STATUS_NO_MEMORY; + } + RtlZeroMemory(PortConfig.AccessRanges, sizeof(ACCESS_RANGE) * HwInitializationData->NumberOfAccessRanges); + + /* Search for matching PCI device */ + if ((HwInitializationData->AdapterInterfaceType == PCIBus) && + (HwInitializationData->VendorIdLength > 0) && + (HwInitializationData->VendorId != NULL) && + (HwInitializationData->DeviceIdLength > 0) && + (HwInitializationData->DeviceId != NULL)) + { + PortConfig.BusInterruptLevel = 0; + + /* Get PCI device data */ + DPRINTM2("VendorId '%.*s' DeviceId '%.*s'\n", + HwInitializationData->VendorIdLength, + HwInitializationData->VendorId, + HwInitializationData->DeviceIdLength, + HwInitializationData->DeviceId); + + if (!SpiGetPciConfigData(HwInitializationData, + &PortConfig, + 0, /* FIXME */ + &SlotNumber)) + { + /* Continue to the next bus, nothing here */ + MmHeapFree(DeviceExtension); + return STATUS_INTERNAL_ERROR; + } + + if (!PortConfig.BusInterruptLevel) + { + /* Bypass this slot, because no interrupt was assigned */ + MmHeapFree(DeviceExtension); + return STATUS_INTERNAL_ERROR; + } + } + + if (HwInitializationData->HwFindAdapter( + DeviceExtension->MiniPortDeviceExtension, + HwContext, + NULL, + NULL, + &PortConfig, + &Again) != SP_RETURN_FOUND) + { + MmHeapFree(DeviceExtension); + return STATUS_INTERNAL_ERROR; + } + + /* Copy all stuff which we ever need from PortConfig to the DeviceExtension */ + if (PortConfig.MaximumNumberOfTargets > SCSI_MAXIMUM_TARGETS_PER_BUS) + DeviceExtension->MaxTargedIds = SCSI_MAXIMUM_TARGETS_PER_BUS; + else + DeviceExtension->MaxTargedIds = PortConfig.MaximumNumberOfTargets; + + DeviceExtension->BusNum = PortConfig.SystemIoBusNumber; + + DPRINTM2("Adapter found: buses = %d, targets = %d\n", + PortConfig.NumberOfBuses, DeviceExtension->MaxTargedIds); + + /* Initialize adapter */ + if (!DeviceExtension->HwInitialize(DeviceExtension->MiniPortDeviceExtension)) + { + MmHeapFree(DeviceExtension); + return STATUS_INTERNAL_ERROR; + } + + /* Scan bus */ + { + ULONG ScsiBus; + for (ScsiBus = 0; ScsiBus < PortConfig.NumberOfBuses; ScsiBus++) + { + SpiScanAdapter(DeviceExtension, PortConfig.SystemIoBusNumber, ScsiBus); + PortConfig.SystemIoBusNumber++; + } + } + + FirstConfigCall = FALSE; + if (!Again) + { + break; + } + } + + return STATUS_SUCCESS; +} + +VOID +DDKAPI +ScsiPortIoMapTransfer( + IN PVOID HwDeviceExtension, + IN PSCSI_REQUEST_BLOCK Srb, + IN PVOID LogicalAddress, + IN ULONG Length) +{ + // FIXME + UNIMPLEMENTED; +} + +VOID +DDKAPI +ScsiPortLogError( + IN PVOID HwDeviceExtension, + IN PSCSI_REQUEST_BLOCK Srb OPTIONAL, + IN UCHAR PathId, + IN UCHAR TargetId, + IN UCHAR Lun, + IN ULONG ErrorCode, + IN ULONG UniqueId) +{ + // FIXME + UNIMPLEMENTED; +} + +VOID +DDKAPI +ScsiPortMoveMemory( + IN PVOID WriteBuffer, + IN PVOID ReadBuffer, + IN ULONG Length) +{ + RtlMoveMemory(WriteBuffer, ReadBuffer, Length); +} + +VOID +DDKCDECLAPI +ScsiPortNotification( + IN SCSI_NOTIFICATION_TYPE NotificationType, + IN PVOID HwDeviceExtension, + IN ...) +{ + PSCSI_PORT_DEVICE_EXTENSION DeviceExtension; + PSCSI_REQUEST_BLOCK Srb; + va_list ap; + + DeviceExtension = ((PSCSI_PORT_DEVICE_EXTENSION)HwDeviceExtension) - 1; + + va_start(ap, HwDeviceExtension); + + switch (NotificationType) + { + case RequestComplete: + /* Mask the SRB as completed */ + Srb = va_arg(ap, PSCSI_REQUEST_BLOCK); + Srb->SrbFlags &= ~SRB_FLAGS_IS_ACTIVE; + break; + + case NextRequest: + /* Say that device is ready */ + DeviceExtension->InterruptFlags |= SCSI_PORT_NEXT_REQUEST_READY; + break; + + default: + // FIXME + UNIMPLEMENTED; + } + + va_end(ap); +} + +VOID +DDKAPI +ScsiPortReadPortBufferUchar( + IN PUCHAR Port, + OUT PUCHAR Buffer, + IN ULONG Count) +{ + __inbytestring(H2I(Port), Buffer, Count); +} + +VOID +DDKAPI +ScsiPortReadPortBufferUlong( + IN PULONG Port, + OUT PULONG Buffer, + IN ULONG Count) +{ + __indwordstring(H2I(Port), Buffer, Count); +} + +VOID +DDKAPI +ScsiPortReadPortBufferUshort( + IN PUSHORT Port, + OUT PUSHORT Buffer, + IN ULONG Count) +{ + __inwordstring(H2I(Port), Buffer, Count); +} + +UCHAR +DDKAPI +ScsiPortReadPortUchar( + IN PUCHAR Port) +{ + DPRINTM2("ScsiPortReadPortUchar(%p)\n", + Port); + + return READ_PORT_UCHAR(Port); +} + +ULONG +DDKAPI +ScsiPortReadPortUlong( + IN PULONG Port) +{ + return READ_PORT_ULONG(Port); +} + +USHORT +DDKAPI +ScsiPortReadPortUshort( + IN PUSHORT Port) +{ + return READ_PORT_USHORT(Port); +} + +VOID +DDKAPI +ScsiPortReadRegisterBufferUchar( + IN PUCHAR Register, + IN PUCHAR Buffer, + IN ULONG Count) +{ + // FIXME + UNIMPLEMENTED; +} + +VOID +DDKAPI +ScsiPortReadRegisterBufferUlong( + IN PULONG Register, + IN PULONG Buffer, + IN ULONG Count) +{ + // FIXME + UNIMPLEMENTED; +} + +VOID +DDKAPI +ScsiPortReadRegisterBufferUshort( + IN PUSHORT Register, + IN PUSHORT Buffer, + IN ULONG Count) +{ + // FIXME + UNIMPLEMENTED; +} + +UCHAR +DDKAPI +ScsiPortReadRegisterUchar( + IN PUCHAR Register) +{ + return READ_REGISTER_UCHAR(Register); +} + +ULONG +DDKAPI +ScsiPortReadRegisterUlong( + IN PULONG Register) +{ + return READ_REGISTER_ULONG(Register); +} + +USHORT +DDKAPI +ScsiPortReadRegisterUshort( + IN PUSHORT Register) +{ + return READ_REGISTER_USHORT(Register); +} + +ULONG +DDKAPI +ScsiPortSetBusDataByOffset( + IN PVOID DeviceExtension, + IN ULONG BusDataType, + IN ULONG SystemIoBusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length) +{ + // FIXME + UNIMPLEMENTED; + return 0; +} + +VOID +DDKAPI +ScsiPortStallExecution( + IN ULONG Delay) +{ + KeStallExecutionProcessor(Delay); +} + +BOOLEAN +DDKAPI +ScsiPortValidateRange( + IN PVOID HwDeviceExtension, + IN INTERFACE_TYPE BusType, + IN ULONG SystemIoBusNumber, + IN SCSI_PHYSICAL_ADDRESS IoAddress, + IN ULONG NumberOfBytes, + IN BOOLEAN InIoSpace) +{ + // FIXME + UNIMPLEMENTED; + return TRUE; +} + +#if 0 +// ScsiPortWmi* +#endif + + +VOID +DDKAPI +ScsiPortWritePortBufferUchar( + IN PUCHAR Port, + IN PUCHAR Buffer, + IN ULONG Count) +{ + __outbytestring(H2I(Port), Buffer, Count); +} + +VOID +DDKAPI +ScsiPortWritePortBufferUlong( + IN PULONG Port, + IN PULONG Buffer, + IN ULONG Count) +{ + __outdwordstring(H2I(Port), Buffer, Count); +} + +VOID +DDKAPI +ScsiPortWritePortBufferUshort( + IN PUSHORT Port, + IN PUSHORT Buffer, + IN ULONG Count) +{ + __outwordstring(H2I(Port), Buffer, Count); +} + +VOID +DDKAPI +ScsiPortWritePortUchar( + IN PUCHAR Port, + IN UCHAR Value) +{ + WRITE_PORT_UCHAR(Port, Value); +} + +VOID +DDKAPI +ScsiPortWritePortUlong( + IN PULONG Port, + IN ULONG Value) +{ + WRITE_PORT_ULONG(Port, Value); +} + +VOID +DDKAPI +ScsiPortWritePortUshort( + IN PUSHORT Port, + IN USHORT Value) +{ + WRITE_PORT_USHORT(Port, Value); +} + +VOID +DDKAPI +ScsiPortWriteRegisterBufferUchar( + IN PUCHAR Register, + IN PUCHAR Buffer, + IN ULONG Count) +{ + // FIXME + UNIMPLEMENTED; +} + +VOID +DDKAPI +ScsiPortWriteRegisterBufferUlong( + IN PULONG Register, + IN PULONG Buffer, + IN ULONG Count) +{ + // FIXME + UNIMPLEMENTED; +} + +VOID +DDKAPI +ScsiPortWriteRegisterBufferUshort( + IN PUSHORT Register, + IN PUSHORT Buffer, + IN ULONG Count) +{ + // FIXME + UNIMPLEMENTED; +} + +VOID +DDKAPI +ScsiPortWriteRegisterUchar( + IN PUCHAR Register, + IN ULONG Value) +{ + WRITE_REGISTER_UCHAR(Register, Value); +} + +VOID +DDKAPI +ScsiPortWriteRegisterUlong( + IN PULONG Register, + IN ULONG Value) +{ + WRITE_REGISTER_ULONG(Register, Value); +} + +VOID +DDKAPI +ScsiPortWriteRegisterUshort( + IN PUSHORT Register, + IN USHORT Value) +{ + WRITE_REGISTER_USHORT(Register, Value); +} + +ULONG +LoadBootDeviceDriver(VOID) +{ + struct + { + CHAR* Name; + PVOID Function; + } ExportTable[] = + { + { "ScsiDebugPrint", ScsiDebugPrint }, + { "ScsiPortCompleteRequest", ScsiPortCompleteRequest }, + { "ScsiPortConvertPhysicalAddressToUlong", ScsiPortConvertPhysicalAddressToUlong }, + { "ScsiPortConvertUlongToPhysicalAddress", ScsiPortConvertUlongToPhysicalAddress }, + { "ScsiPortFlushDma", ScsiPortFlushDma }, + { "ScsiPortFreeDeviceBase", ScsiPortFreeDeviceBase }, + { "ScsiPortGetBusData", ScsiPortGetBusData }, + { "ScsiPortGetDeviceBase", ScsiPortGetDeviceBase }, + { "ScsiPortGetLogicalUnit", ScsiPortGetLogicalUnit }, + { "ScsiPortGetPhysicalAddress", ScsiPortGetPhysicalAddress }, + { "ScsiPortGetSrb", ScsiPortGetSrb }, + { "ScsiPortGetUncachedExtension", ScsiPortGetUncachedExtension }, + { "ScsiPortGetVirtualAddress", ScsiPortGetVirtualAddress }, + { "ScsiPortInitialize", ScsiPortInitialize }, + { "ScsiPortIoMapTransfer", ScsiPortIoMapTransfer }, + { "ScsiPortLogError", ScsiPortLogError }, + { "ScsiPortMoveMemory", ScsiPortMoveMemory }, + { "ScsiPortNotification", ScsiPortNotification }, + { "ScsiPortReadPortBufferUchar", ScsiPortReadPortBufferUchar }, + { "ScsiPortReadPortBufferUlong", ScsiPortReadPortBufferUlong }, + { "ScsiPortReadPortBufferUshort", ScsiPortReadPortBufferUshort }, + { "ScsiPortReadPortUchar", ScsiPortReadPortUchar }, + { "ScsiPortReadPortUlong", ScsiPortReadPortUlong }, + { "ScsiPortReadPortUshort", ScsiPortReadPortUshort }, + { "ScsiPortReadRegisterBufferUchar", ScsiPortReadRegisterBufferUchar }, + { "ScsiPortReadRegisterBufferUlong", ScsiPortReadRegisterBufferUlong }, + { "ScsiPortReadRegisterBufferUshort", ScsiPortReadRegisterBufferUshort }, + { "ScsiPortReadRegisterUchar", ScsiPortReadRegisterUchar }, + { "ScsiPortReadRegisterUlong", ScsiPortReadRegisterUlong }, + { "ScsiPortReadRegisterUshort", ScsiPortReadRegisterUshort }, + { "ScsiPortSetBusDataByOffset", ScsiPortSetBusDataByOffset }, + { "ScsiPortStallExecution", ScsiPortStallExecution }, + { "ScsiPortValidateRange", ScsiPortValidateRange }, + { "ScsiPortWritePortBufferUchar", ScsiPortWritePortBufferUchar }, + { "ScsiPortWritePortBufferUlong", ScsiPortWritePortBufferUlong }, + { "ScsiPortWritePortBufferUshort", ScsiPortWritePortBufferUshort }, + { "ScsiPortWritePortUchar", ScsiPortWritePortUchar }, + { "ScsiPortWritePortUlong", ScsiPortWritePortUlong }, + { "ScsiPortWritePortUshort", ScsiPortWritePortUshort }, + { "ScsiPortWriteRegisterBufferUchar", ScsiPortWriteRegisterBufferUchar }, + { "ScsiPortWriteRegisterBufferUlong", ScsiPortWriteRegisterBufferUlong }, + { "ScsiPortWriteRegisterBufferUshort", ScsiPortWriteRegisterBufferUshort }, + { "ScsiPortWriteRegisterUchar", ScsiPortWriteRegisterUchar }, + { "ScsiPortWriteRegisterUlong", ScsiPortWriteRegisterUlong }, + { "ScsiPortWriteRegisterUshort", ScsiPortWriteRegisterUshort }, + }; + IMAGE_DOS_HEADER ImageDosHeader; + IMAGE_NT_HEADERS ImageNtHeaders; + IMAGE_EXPORT_DIRECTORY ImageExportDirectory; + CHAR* TableName[sizeof(ExportTable) / sizeof(ExportTable[0])]; + USHORT OrdinalTable[sizeof(ExportTable) / sizeof(ExportTable[0])]; + ULONG FunctionTable[sizeof(ExportTable) / sizeof(ExportTable[0])]; + + PIMAGE_NT_HEADERS NtHeaders; + LOADER_PARAMETER_BLOCK LoaderBlock; + PIMAGE_IMPORT_DESCRIPTOR ImportTable; + ULONG ImportTableSize; + PLDR_DATA_TABLE_ENTRY BootDdDTE, FreeldrDTE; + CHAR NtBootDdPath[MAX_PATH]; + PVOID ImageBase; + ULONG (NTAPI *EntryPoint)(IN PVOID DriverObject, IN PVOID RegistryPath); + ULONG i; + BOOLEAN Status; + + /* Some initialization of our temporary loader block */ + RtlZeroMemory(&LoaderBlock, sizeof(LOADER_PARAMETER_BLOCK)); + InitializeListHead(&LoaderBlock.LoadOrderListHead); + + /* Create our fake executable header for freeldr.sys */ + RtlZeroMemory(&ImageDosHeader, sizeof(IMAGE_DOS_HEADER)); + RtlZeroMemory(&ImageNtHeaders, sizeof(IMAGE_NT_HEADERS)); + RtlZeroMemory(&ImageExportDirectory, sizeof(IMAGE_EXPORT_DIRECTORY)); + ImageDosHeader.e_magic = SWAPW(IMAGE_DOS_SIGNATURE); + ImageDosHeader.e_lfanew = SWAPD((ULONG_PTR)&ImageNtHeaders - (ULONG_PTR)&ImageDosHeader); + ImageNtHeaders.Signature = IMAGE_NT_SIGNATURE; + ImageNtHeaders.OptionalHeader.NumberOfRvaAndSizes = SWAPD(IMAGE_DIRECTORY_ENTRY_EXPORT + 1); + ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = + SWAPW((ULONG_PTR)&ImageExportDirectory - (ULONG_PTR)&ImageDosHeader); + ImageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size = 1; + ImageExportDirectory.NumberOfNames = sizeof(ExportTable) / sizeof(ExportTable[0]); + ImageExportDirectory.AddressOfNames = (ULONG_PTR)TableName - (ULONG_PTR)&ImageDosHeader; + ImageExportDirectory.AddressOfNameOrdinals = (ULONG_PTR)OrdinalTable - (ULONG_PTR)&ImageDosHeader; + ImageExportDirectory.NumberOfFunctions = sizeof(ExportTable) / sizeof(ExportTable[0]); + ImageExportDirectory.AddressOfFunctions = (ULONG_PTR)FunctionTable - (ULONG_PTR)&ImageDosHeader; + + /* Fill freeldr.sys export table */ + for (i = 0; i < sizeof(ExportTable) / sizeof(ExportTable[0]); i++) + { + TableName[i] = PaToVa((PVOID)((ULONG_PTR)ExportTable[i].Name - (ULONG_PTR)&ImageDosHeader)); + OrdinalTable[i] = i; + FunctionTable[i] = (ULONG)((ULONG_PTR)ExportTable[i].Function - (ULONG_PTR)&ImageDosHeader); + } + + /* Add freeldr.sys to list of loaded executables */ + RtlZeroMemory(FreeldrDTE, sizeof(LDR_DATA_TABLE_ENTRY)); + Status = WinLdrAllocateDataTableEntry(&LoaderBlock, "scsiport.sys", + "FREELDR.SYS", &ImageDosHeader, &FreeldrDTE); + if (!Status) + return EIO; + + /* Create full ntbootdd.sys path */ + MachDiskGetBootPath(NtBootDdPath, sizeof(NtBootDdPath)); + strcat(NtBootDdPath, "\\NTBOOTDD.SYS"); + + /* Load file */ + Status = WinLdrLoadImage(NtBootDdPath, LoaderBootDriver, &ImageBase); + if (!Status) + { + /* That's OK. File simply doesn't exist */ + return ESUCCESS; + } + + /* Fix imports */ + Status = WinLdrAllocateDataTableEntry(&LoaderBlock, "ntbootdd.sys", + "NTBOOTDD.SYS", ImageBase, &BootDdDTE); + if (!Status) + return EIO; + Status = WinLdrScanImportDescriptorTable(&LoaderBlock, "", BootDdDTE); + if (!Status) + return EIO; + + /* Change imports to PA */ + ImportTable = (PIMAGE_IMPORT_DESCRIPTOR)RtlImageDirectoryEntryToData(VaToPa(BootDdDTE->DllBase), + TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &ImportTableSize); + for (;(ImportTable->Name != 0) && (ImportTable->FirstThunk != 0);ImportTable++) + { + PIMAGE_THUNK_DATA ThunkData = (PIMAGE_THUNK_DATA)VaToPa(RVA(BootDdDTE->DllBase, ImportTable->FirstThunk)); + + while (((PIMAGE_THUNK_DATA)ThunkData)->u1.AddressOfData != 0) + { + ThunkData->u1.Function = (ULONG)VaToPa((PVOID)ThunkData->u1.Function); + ThunkData++; + } + } + + /* Relocate image to PA */ + NtHeaders = RtlImageNtHeader(VaToPa(BootDdDTE->DllBase)); + if (!NtHeaders) + return EIO; + Status = LdrRelocateImageWithBias( + VaToPa(BootDdDTE->DllBase), + NtHeaders->OptionalHeader.ImageBase - (ULONG_PTR)BootDdDTE->DllBase, + "FreeLdr", + TRUE, + TRUE, /* in case of conflict still return success */ + FALSE); + if (!Status) + return EIO; + + /* Call the entrypoint */ + EntryPoint = VaToPa(BootDdDTE->EntryPoint); + (*EntryPoint)(NULL, NULL); + + return ESUCCESS; +} + +/* EOF */ diff --git a/reactos/boot/freeldr/freeldr/freeldr.c b/reactos/boot/freeldr/freeldr/freeldr.c index 3fa9b476b06..5761ed9460c 100644 --- a/reactos/boot/freeldr/freeldr/freeldr.c +++ b/reactos/boot/freeldr/freeldr/freeldr.c @@ -20,6 +20,9 @@ #include #include +VOID NTAPI HalpInitializePciStubs(VOID); +VOID NTAPI HalpInitBusHandler(VOID); + VOID BootMain(LPSTR CmdLine) { CmdLineParse(CmdLine); @@ -44,5 +47,7 @@ VOID BootMain(LPSTR CmdLine) return; } + HalpInitializePciStubs(); + HalpInitBusHandler(); RunLoader(); } diff --git a/reactos/boot/freeldr/freeldr/freeldr.rbuild b/reactos/boot/freeldr/freeldr/freeldr.rbuild index dc83aaa9878..b513dabca44 100644 --- a/reactos/boot/freeldr/freeldr/freeldr.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr.rbuild @@ -7,6 +7,7 @@ freeldr_startup freeldr_base64k freeldr_base + mini_hal freeldr_arch freeldr_main rossym diff --git a/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild b/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild index 8d8287bba5d..05ca7b327f1 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_arch.rbuild @@ -6,20 +6,9 @@ include include/reactos/libs include/reactos/elf + - - -fno-inline - -fno-zero-initialized-in-bss - - - - - -ffreestanding - -fno-builtin - -Os - - - + @@ -27,6 +16,7 @@ archmach.c custom.c drivemap.c + halstub.c hardware.c hwacpi.c hwapm.c @@ -37,6 +27,7 @@ loader.c machpc.c miscboot.c + ntoskrnl.c pccons.c pcdisk.c pcmem.c @@ -73,7 +64,6 @@ boot.s - loader.c macharm.c @@ -102,6 +92,11 @@ + + + wlmemory.c + + ntsetup.c diff --git a/reactos/boot/freeldr/freeldr/freeldr_base.rbuild b/reactos/boot/freeldr/freeldr/freeldr_base.rbuild index 16076bf18f4..8edcd8ef4d0 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_base.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_base.rbuild @@ -5,12 +5,9 @@ cache . include + - - -fno-inline - -fno-zero-initialized-in-bss - mm.c time.c @@ -26,6 +23,7 @@ disk.c partition.c ramdisk.c + scsiport.c ext2.c @@ -56,6 +54,7 @@ libsupp.c + directui.c gui.c minitui.c noui.c @@ -68,24 +67,13 @@ palette.c video.c - - - conversion.c - peloader.c - winldr.c - wlmemory.c - wlregistry.c - - - - - conversion.c - peloader.c - winldr.c - wlmemory.c - wlregistry.c - - + + conversion.c + peloader.c + winldr.c + wlmemory.c + wlregistry.c + freeldr.c debug.c version.c diff --git a/reactos/boot/freeldr/freeldr/freeldr_base64k.rbuild b/reactos/boot/freeldr/freeldr/freeldr_base64k.rbuild index 29bf32cf9ef..b5127e6b4ed 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_base64k.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_base64k.rbuild @@ -4,10 +4,6 @@ include include - - -fno-inline - -fno-zero-initialized-in-bss - diff --git a/reactos/boot/freeldr/freeldr/freeldr_main.rbuild b/reactos/boot/freeldr/freeldr/freeldr_main.rbuild index 4a93dff79f0..fbb410e86a4 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_main.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_main.rbuild @@ -4,9 +4,5 @@ include include - - -fno-inline - -fno-zero-initialized-in-bss - bootmgr.c diff --git a/reactos/boot/freeldr/freeldr/freeldr_startup.rbuild b/reactos/boot/freeldr/freeldr/freeldr_startup.rbuild index 57d87958c20..836ecf628dd 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_startup.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_startup.rbuild @@ -3,10 +3,6 @@ include include - - -fno-inline - -fno-zero-initialized-in-bss - diff --git a/reactos/boot/freeldr/freeldr/fs/ext2.c b/reactos/boot/freeldr/freeldr/fs/ext2.c index afd37ae5fdd..46f12fbe6d4 100644 --- a/reactos/boot/freeldr/freeldr/fs/ext2.c +++ b/reactos/boot/freeldr/freeldr/fs/ext2.c @@ -17,6 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#ifndef _M_ARM #include #include @@ -1308,3 +1309,6 @@ const DEVVTBL* Ext2Mount(ULONG DeviceId) else return NULL; } + +#endif + diff --git a/reactos/boot/freeldr/freeldr/fs/fs.c b/reactos/boot/freeldr/freeldr/fs/fs.c index 49f817c112e..eb23215f789 100644 --- a/reactos/boot/freeldr/freeldr/fs/fs.c +++ b/reactos/boot/freeldr/freeldr/fs/fs.c @@ -319,15 +319,26 @@ LONG ArcOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) FileData[DeviceId].FuncTable = NULL; return ret; } + else if (!*FileName) + { + /* Done, caller wanted to open the raw device */ + *FileId = DeviceId; + pDevice->ReferenceCount++; + return ESUCCESS; + } /* Try to detect the file system */ +#ifndef _M_ARM FileData[DeviceId].FileFuncTable = IsoMount(DeviceId); if (!FileData[DeviceId].FileFuncTable) +#endif FileData[DeviceId].FileFuncTable = FatMount(DeviceId); +#ifndef _M_ARM if (!FileData[DeviceId].FileFuncTable) FileData[DeviceId].FileFuncTable = NtfsMount(DeviceId); if (!FileData[DeviceId].FileFuncTable) FileData[DeviceId].FileFuncTable = Ext2Mount(DeviceId); +#endif if (!FileData[DeviceId].FileFuncTable) { /* Error, unable to detect file system */ diff --git a/reactos/boot/freeldr/freeldr/fs/iso.c b/reactos/boot/freeldr/freeldr/fs/iso.c index fc35402da66..dd1231558d7 100644 --- a/reactos/boot/freeldr/freeldr/fs/iso.c +++ b/reactos/boot/freeldr/freeldr/fs/iso.c @@ -18,6 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#ifndef _M_ARM #include #include @@ -510,3 +511,6 @@ const DEVVTBL* IsoMount(ULONG DeviceId) else return NULL; } + +#endif + diff --git a/reactos/boot/freeldr/freeldr/fs/ntfs.c b/reactos/boot/freeldr/freeldr/fs/ntfs.c index 23344dd10e4..830e3ade042 100644 --- a/reactos/boot/freeldr/freeldr/fs/ntfs.c +++ b/reactos/boot/freeldr/freeldr/fs/ntfs.c @@ -23,6 +23,7 @@ * - May crash on corrupted filesystem. */ +#ifndef _M_ARM #include #include @@ -957,3 +958,5 @@ const DEVVTBL* NtfsMount(ULONG DeviceId) // return &NtfsFuncTable; } + +#endif diff --git a/reactos/boot/freeldr/freeldr/include/arch.h b/reactos/boot/freeldr/freeldr/include/arch.h index c3e3c45c307..b9a6cc02386 100644 --- a/reactos/boot/freeldr/freeldr/include/arch.h +++ b/reactos/boot/freeldr/freeldr/include/arch.h @@ -17,9 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - -#ifndef __ARCH_H -#define __ARCH_H +#pragma once #ifdef _M_AMD64 #include @@ -176,6 +174,3 @@ VOID SoftReboot(VOID); // Implemented in boot.S VOID DetectHardware(VOID); // Implemented in hardware.c #endif /* ! ASM */ - - -#endif // #defined __ARCH_H diff --git a/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h b/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h index 0a1ff1d82cb..9068e00f90a 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h +++ b/reactos/boot/freeldr/freeldr/include/arch/amd64/amd64.h @@ -18,8 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __AMD64_AMD64_H_ -#define __AMD64_AMD64_H_ +#pragma once // This is needed because headers define wrong one for ReactOS #undef KIP0PCRADDRESS @@ -63,6 +62,4 @@ VOID FrLdrSetupGdtIdt(); #endif -#endif /* __AMD64_AMD64_H_ */ - /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/include/arch/amd64/hardware.h b/reactos/boot/freeldr/freeldr/include/arch/amd64/hardware.h index c1252af6916..b6da01e555e 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/amd64/hardware.h +++ b/reactos/boot/freeldr/freeldr/include/arch/amd64/hardware.h @@ -18,8 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __AMD64_HARDWARE_H_ -#define __AMD64_HARDWARE_H_ +#pragma once #ifndef __REGISTRY_H #include "../../reactos/registry.h" @@ -92,6 +91,4 @@ ULONG PnpBiosGetDeviceNodeCount(ULONG *NodeSize, ULONG PnpBiosGetDeviceNode(UCHAR *NodeId, UCHAR *NodeBuffer); -#endif /* __AMD64_HARDWARE_H_ */ - /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/include/arch/amd64/machpc.h b/reactos/boot/freeldr/freeldr/include/arch/amd64/machpc.h index 91ad2d566b4..2efd7e8c74a 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/amd64/machpc.h +++ b/reactos/boot/freeldr/freeldr/include/arch/amd64/machpc.h @@ -19,8 +19,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __I386_MACHPC_H_ -#define __I386_MACHPC_H_ +#pragma once #ifndef __MEMORY_H #include "mm.h" @@ -59,6 +58,4 @@ TIMEINFO* PcGetTime(VOID); PCONFIGURATION_COMPONENT_DATA PcHwDetect(VOID); -#endif /* __I386_MACHPC_H_ */ - /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h b/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h index c09d5bfed4a..1668b4f4daa 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h +++ b/reactos/boot/freeldr/freeldr/include/arch/arm/hardware.h @@ -6,8 +6,7 @@ * PROGRAMMERS: ReactOS Portable Systems Group */ -#ifndef _ARM_HARDWARE_ -#define __ARM_HARDWARE_ +#pragma once #ifndef __REGISTRY_H #include "../../reactos/registry.h" @@ -16,12 +15,6 @@ #include "../../../../../armllb/inc/osloader.h" #include "../../../../../armllb/inc/machtype.h" -// -// Static heap for ARC Hardware Component Tree -// 16KB oughta be enough for anyone. -// -#define HW_MAX_ARC_HEAP_SIZE 16 * 1024 - // // ARC Component Configuration Routines // @@ -31,21 +24,14 @@ FldrCreateSystemKey( OUT PCONFIGURATION_COMPONENT_DATA *SystemKey ); -VOID -NTAPI -FldrCreateComponentKey( - IN PCONFIGURATION_COMPONENT_DATA SystemKey, - IN CONFIGURATION_CLASS Class, - IN CONFIGURATION_TYPE Type, - IN IDENTIFIER_FLAG Flags, - IN ULONG Key, - IN ULONG Affinity, - IN PCHAR IdentifierString, - IN PCM_PARTIAL_RESOURCE_LIST ResourceList, - IN ULONG Size, - OUT PCONFIGURATION_COMPONENT_DATA *ComponentKey -); +#define HW_MAX_ARC_HEAP_SIZE 256 extern PARM_BOARD_CONFIGURATION_BLOCK ArmBoardBlock; - -#endif +extern ULONG FirstLevelDcacheSize; +extern ULONG FirstLevelDcacheFillSize; +extern ULONG FirstLevelIcacheSize; +extern ULONG FirstLevelIcacheFillSize; +extern ULONG SecondLevelDcacheSize; +extern ULONG SecondLevelDcacheFillSize; +extern ULONG SecondLevelIcacheSize; +extern ULONG SecondLevelIcacheFillSize; diff --git a/reactos/boot/freeldr/freeldr/include/arch/i386/custom.h b/reactos/boot/freeldr/freeldr/include/arch/i386/custom.h index 3594c4a1ebb..1ab1dcdfd78 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/i386/custom.h +++ b/reactos/boot/freeldr/freeldr/include/arch/i386/custom.h @@ -17,8 +17,7 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ifndef __I386_OPTIONS_H -#define __I386_OPTIONS_H +#pragma once #define HAS_OPTION_MENU_CUSTOM_BOOT #define HAS_OPTION_MENU_REBOOT @@ -31,5 +30,3 @@ VOID OptionMenuCustomBootPartition(VOID); VOID OptionMenuCustomBootBootSectorFile(VOID); VOID OptionMenuCustomBootReactOS(VOID); VOID OptionMenuCustomBootLinux(VOID); - -#endif // #defined __I386_OPTIONS_H diff --git a/reactos/boot/freeldr/freeldr/include/arch/i386/drivemap.h b/reactos/boot/freeldr/freeldr/include/arch/i386/drivemap.h index e425fd80d94..aebd893a53b 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/i386/drivemap.h +++ b/reactos/boot/freeldr/freeldr/include/arch/i386/drivemap.h @@ -17,8 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __I386_DRIVEMAP_H -#define __I386_DRIVEMAP_H +#pragma once #include typedef struct @@ -38,5 +37,3 @@ extern PVOID DriveMapInt13HandlerStart; extern PVOID DriveMapInt13HandlerEnd; extern ULONG DriveMapOldInt13HandlerAddress; extern DRIVE_MAP_LIST DriveMapInt13HandlerMapList; - -#endif // #defined __I386_DRIVEMAP_H diff --git a/reactos/boot/freeldr/freeldr/include/arch/i386/hardware.h b/reactos/boot/freeldr/freeldr/include/arch/i386/hardware.h index 6282b266425..c97ba88e9b7 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/i386/hardware.h +++ b/reactos/boot/freeldr/freeldr/include/arch/i386/hardware.h @@ -18,8 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __I386_HARDWARE_H_ -#define __I386_HARDWARE_H_ +#pragma once #ifndef __REGISTRY_H #include "../../reactos/registry.h" @@ -92,6 +91,4 @@ ULONG PnpBiosGetDeviceNodeCount(ULONG *NodeSize, ULONG PnpBiosGetDeviceNode(UCHAR *NodeId, UCHAR *NodeBuffer); -#endif /* __I386_HARDWARE_H_ */ - /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/include/arch/i386/i386.h b/reactos/boot/freeldr/freeldr/include/arch/i386/i386.h index c58f5953848..faf26b8b8fd 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/i386/i386.h +++ b/reactos/boot/freeldr/freeldr/include/arch/i386/i386.h @@ -18,14 +18,10 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __I386_I386_H_ -#define __I386_I386_H_ +#pragma once // This is needed because headers define wrong one for ReactOS #undef KIP0PCRADDRESS #define KIP0PCRADDRESS 0xffdff000 - -#endif /* __I386_I386_H_ */ - /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h b/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h index 7cf78767fb1..1cb40b24f10 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h +++ b/reactos/boot/freeldr/freeldr/include/arch/i386/machpc.h @@ -19,8 +19,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __I386_MACHPC_H_ -#define __I386_MACHPC_H_ +#pragma once #ifndef __MEMORY_H #include "mm.h" @@ -58,6 +57,4 @@ TIMEINFO* PcGetTime(VOID); PCONFIGURATION_COMPONENT_DATA PcHwDetect(VOID); -#endif /* __I386_MACHPC_H_ */ - /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h b/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h index 5d0cd1e3395..febba0b8636 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h +++ b/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h @@ -17,8 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __I386_MACHXBOX_H_ -#define __I386_MACHXBOX_H_ +#pragma once #ifndef __MEMORY_H #include "mm.h" @@ -63,7 +62,4 @@ PCONFIGURATION_COMPONENT_DATA XboxHwDetect(VOID); VOID XboxSetLED(PCSTR Pattern); - -#endif /* __I386_HWXBOX_H_ */ - /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/include/arch/i386/miscboot.h b/reactos/boot/freeldr/freeldr/include/arch/i386/miscboot.h index 3ee8ab3dac4..df17f558848 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/i386/miscboot.h +++ b/reactos/boot/freeldr/freeldr/include/arch/i386/miscboot.h @@ -17,11 +17,8 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __I386_BOOT_H -#define __I386_BOOT_H +#pragma once VOID LoadAndBootBootSector(PCSTR OperatingSystemName); VOID LoadAndBootPartition(PCSTR OperatingSystemName); VOID LoadAndBootDrive(PCSTR OperatingSystemName); - -#endif // defined __I386_BOOT_H diff --git a/reactos/boot/freeldr/freeldr/include/arch/powerpc/hardware.h b/reactos/boot/freeldr/freeldr/include/arch/powerpc/hardware.h index da4a99f94fc..9aebb0fbaea 100644 --- a/reactos/boot/freeldr/freeldr/include/arch/powerpc/hardware.h +++ b/reactos/boot/freeldr/freeldr/include/arch/powerpc/hardware.h @@ -18,8 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __POWERPC_HARDWARE_H_ -#define __POWERPC_HARDWARE_H_ +#pragma once #ifndef __REGISTRY_H #include "../../reactos/registry.h" @@ -68,6 +67,4 @@ VOID HalpCalibrateStallExecution(VOID); ULONGLONG RDTSC(VOID); -#endif /* __POWERPC_HARDWARE_H_ */ - /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/include/bytesex.h b/reactos/boot/freeldr/freeldr/include/bytesex.h index ccbfc7cad05..7392ba24cfe 100644 --- a/reactos/boot/freeldr/freeldr/include/bytesex.h +++ b/reactos/boot/freeldr/freeldr/include/bytesex.h @@ -1,5 +1,4 @@ -#ifndef __BYTESEX_H_ -#define __BYTESEX_H_ +#pragma once #ifdef _PPC_ #define SWAPD(x) ((((x)&0xff)<<24)|(((x)&0xff00)<<8)|(((x)>>8)&0xff00)|(((x)>>24)&0xff)) @@ -10,5 +9,3 @@ #endif #define SD(Object,Field) Object->Field = SWAPD(Object->Field) #define SW(Object,Field) Object->Field = SWAPW(Object->Field) - -#endif/*__BYTESEX_H_*/ diff --git a/reactos/boot/freeldr/freeldr/include/cache.h b/reactos/boot/freeldr/freeldr/include/cache.h index cd05fd7c26d..abadfd32c93 100644 --- a/reactos/boot/freeldr/freeldr/include/cache.h +++ b/reactos/boot/freeldr/freeldr/include/cache.h @@ -18,8 +18,7 @@ */ -#ifndef __CACHE_H -#define __CACHE_H +#pragma once /////////////////////////////////////////////////////////////////////////////////////// // @@ -90,5 +89,3 @@ VOID CacheInvalidateCacheData(VOID); BOOLEAN CacheReadDiskSectors(ULONG DiskNumber, ULONG StartSector, ULONG SectorCount, PVOID Buffer); BOOLEAN CacheForceDiskSectorsIntoCache(ULONG DiskNumber, ULONG StartSector, ULONG SectorCount); BOOLEAN CacheReleaseMemory(ULONG MinimumAmountToRelease); - -#endif // defined __CACHE_H diff --git a/reactos/boot/freeldr/freeldr/include/cmdline.h b/reactos/boot/freeldr/freeldr/include/cmdline.h index 1910ef8c0c9..05b92f1410c 100644 --- a/reactos/boot/freeldr/freeldr/include/cmdline.h +++ b/reactos/boot/freeldr/freeldr/include/cmdline.h @@ -18,8 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __CMDLINE_H__ -#define __CMDLINE_H__ +#pragma once typedef struct tagCMDLINEINFO { @@ -32,6 +31,4 @@ void CmdLineParse(char *CmdLine); const char *CmdLineGetDefaultOS(void); LONG CmdLineGetTimeOut(void); -#endif /* __CMDLINE_H__ */ - /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/include/comm.h b/reactos/boot/freeldr/freeldr/include/comm.h index 58ba8594946..511b705de50 100644 --- a/reactos/boot/freeldr/freeldr/include/comm.h +++ b/reactos/boot/freeldr/freeldr/include/comm.h @@ -19,14 +19,10 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __RS232_H -#define __RS232_H +#pragma once BOOLEAN Rs232PortInitialize(ULONG ComPort, ULONG BaudRate); BOOLEAN Rs232PortGetByte(PUCHAR ByteRecieved); BOOLEAN Rs232PortPollByte(PUCHAR ByteRecieved); VOID Rs232PortPutByte(UCHAR ByteToSend); BOOLEAN Rs232PortInUse(ULONG Base); - - -#endif // defined __RS232_H diff --git a/reactos/boot/freeldr/freeldr/include/debug.h b/reactos/boot/freeldr/freeldr/include/debug.h index b0d3c626ff2..1e855360491 100644 --- a/reactos/boot/freeldr/freeldr/include/debug.h +++ b/reactos/boot/freeldr/freeldr/include/debug.h @@ -35,11 +35,12 @@ #define DPRINT_HWDETECT 0x00000400 // OR this with DebugPrintMask to enable hardware detection messages #define DPRINT_WINDOWS 0x00000800 // OR this with DebugPrintMask to enable messages from Windows loader #define DPRINT_PELOADER 0x00001000 // OR this with DebugPrintMask to enable messages from PE images loader +#define DPRINT_SCSIPORT 0x00002000 // OR this with DebugPrintMask to enable messages from SCSI miniport extern char* g_file; extern int g_line; -#if DBG +#if DBG && !defined(_M_ARM) VOID DbgPrintMask(ULONG Mask, char *format, ...); VOID DebugInit(VOID); @@ -80,7 +81,7 @@ void MEMORY_WRITE_BREAKPOINT4(unsigned long addr); #else - #define DebugInit() + #define DebugInit(x) #define DPRINTM(_x_, ...) #define BugCheck(_x_) #define DbgDumpBuffer(_x_, _y_, _z_) diff --git a/reactos/boot/freeldr/freeldr/include/disk.h b/reactos/boot/freeldr/freeldr/include/disk.h index a1a09fac410..daaaa495e55 100644 --- a/reactos/boot/freeldr/freeldr/include/disk.h +++ b/reactos/boot/freeldr/freeldr/include/disk.h @@ -17,8 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __DISK_H -#define __DISK_H +#pragma once #include @@ -142,4 +141,4 @@ BOOLEAN DiskGetFirstPartitionEntry(PMASTER_BOOT_RECORD MasterBootRecord, PPARTIT BOOLEAN DiskGetFirstExtendedPartitionEntry(PMASTER_BOOT_RECORD MasterBootRecord, PPARTITION_TABLE_ENTRY PartitionTableEntry); BOOLEAN DiskReadBootRecord(ULONG DriveNumber, ULONGLONG LogicalSectorNumber, PMASTER_BOOT_RECORD BootRecord); -#endif // defined __DISK_H +ULONG LoadBootDeviceDriver(VOID); diff --git a/reactos/boot/freeldr/freeldr/include/freeldr.h b/reactos/boot/freeldr/freeldr/include/freeldr.h index ca8788da288..c80fed6b6f8 100644 --- a/reactos/boot/freeldr/freeldr/include/freeldr.h +++ b/reactos/boot/freeldr/freeldr/include/freeldr.h @@ -32,6 +32,7 @@ #define NTOSAPI #define printf TuiPrintf #include +#include #include #include #include @@ -39,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -60,6 +62,8 @@ #include #include #include +#include +#include /* file system headers */ #include #include diff --git a/reactos/boot/freeldr/freeldr/include/fs.h b/reactos/boot/freeldr/freeldr/include/fs.h index 1ecaceaacb2..2aa15257386 100644 --- a/reactos/boot/freeldr/freeldr/include/fs.h +++ b/reactos/boot/freeldr/freeldr/include/fs.h @@ -17,8 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __FS_H -#define __FS_H +#pragma once typedef struct tagDEVVTBL { @@ -60,5 +59,3 @@ ULONG FsGetNumPathParts(PCSTR Path); VOID FsGetFirstNameFromPath(PCHAR Buffer, PCSTR Path); #define MAX_FDS 60 - -#endif // #defined __FS_H diff --git a/reactos/boot/freeldr/freeldr/include/fs/ext2.h b/reactos/boot/freeldr/freeldr/include/fs/ext2.h index 5189f6ebf45..8a2b518a4be 100644 --- a/reactos/boot/freeldr/freeldr/include/fs/ext2.h +++ b/reactos/boot/freeldr/freeldr/include/fs/ext2.h @@ -17,8 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __EXT2_H -#define __EXT2_H +#pragma once /* * grub/fs/ext2.c @@ -237,5 +236,3 @@ typedef struct } EXT2_FILE_INFO, * PEXT2_FILE_INFO; const DEVVTBL* Ext2Mount(ULONG DeviceId); - -#endif // #defined __EXT2_H diff --git a/reactos/boot/freeldr/freeldr/include/fs/fat.h b/reactos/boot/freeldr/freeldr/include/fs/fat.h index 5812f0a80f1..1bf99bfff24 100644 --- a/reactos/boot/freeldr/freeldr/include/fs/fat.h +++ b/reactos/boot/freeldr/freeldr/include/fs/fat.h @@ -17,8 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __FAT_H -#define __FAT_H +#pragma once #include typedef struct _FAT_BOOTSECTOR @@ -174,5 +173,3 @@ typedef struct #define ISFATX(FT) ((FT) == FATX16 || (FT) == FATX32) const DEVVTBL* FatMount(ULONG DeviceId); - -#endif // #defined __FAT_H diff --git a/reactos/boot/freeldr/freeldr/include/fs/iso.h b/reactos/boot/freeldr/freeldr/include/fs/iso.h index 957d083b3ff..eacfc970407 100644 --- a/reactos/boot/freeldr/freeldr/include/fs/iso.h +++ b/reactos/boot/freeldr/freeldr/include/fs/iso.h @@ -17,8 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __ISO_H -#define __ISO_H +#pragma once #include struct _DIR_RECORD @@ -100,5 +99,3 @@ typedef struct } ISO_FILE_INFO, * PISO_FILE_INFO; const DEVVTBL* IsoMount(ULONG DeviceId); - -#endif // #defined __FAT_H diff --git a/reactos/boot/freeldr/freeldr/include/fs/ntfs.h b/reactos/boot/freeldr/freeldr/include/fs/ntfs.h index 06421f76e99..123508632da 100644 --- a/reactos/boot/freeldr/freeldr/include/fs/ntfs.h +++ b/reactos/boot/freeldr/freeldr/include/fs/ntfs.h @@ -17,8 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __NTFS_H -#define __NTFS_H +#pragma once #define NTFS_FILE_MFT 0 #define NTFS_FILE_MFTMIRR 1 @@ -226,5 +225,3 @@ typedef struct #include const DEVVTBL* NtfsMount(ULONG DeviceId); - -#endif // #defined __NTFS_H diff --git a/reactos/boot/freeldr/freeldr/include/inffile.h b/reactos/boot/freeldr/freeldr/include/inffile.h index 938f8b90a84..89afe6de322 100644 --- a/reactos/boot/freeldr/freeldr/include/inffile.h +++ b/reactos/boot/freeldr/freeldr/include/inffile.h @@ -25,9 +25,7 @@ * Eric Kohl */ -#ifndef __INFCACHE_H__ -#define __INFCACHE_H__ - +#pragma once #define STATUS_BAD_SECTION_NAME_LINE (0xC0700001) #define STATUS_SECTION_NAME_TOO_LONG (0xC0700002) @@ -125,6 +123,4 @@ InfGetDataField (PINFCONTEXT Context, ULONG FieldIndex, PCSTR *Data); -#endif /* __INFCACHE_H__ */ - /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/include/inifile.h b/reactos/boot/freeldr/freeldr/include/inifile.h index 72d633e7ac4..ac71d551408 100644 --- a/reactos/boot/freeldr/freeldr/include/inifile.h +++ b/reactos/boot/freeldr/freeldr/include/inifile.h @@ -17,13 +17,10 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __PARSEINI_H -#define __PARSEINI_H +#pragma once #define INI_FILE_COMMENT_CHAR ';' - - // This structure describes a single .ini file item // The item format in the .ini file is: // Name=Value @@ -78,6 +75,3 @@ BOOLEAN IniReadSettingByNumber(ULONG_PTR SectionId, ULONG SettingNumber, PCHAR S BOOLEAN IniReadSettingByName(ULONG_PTR SectionId, PCSTR SettingName, PCHAR Buffer, ULONG BufferSize); BOOLEAN IniAddSection(PCSTR SectionName, ULONG_PTR* SectionId); BOOLEAN IniAddSettingValueToSection(ULONG_PTR SectionId, PCSTR SettingName, PCSTR SettingValue); - - -#endif // defined __PARSEINI_H diff --git a/reactos/boot/freeldr/freeldr/include/keycodes.h b/reactos/boot/freeldr/freeldr/include/keycodes.h index 55e03edbc8a..5d781f92389 100644 --- a/reactos/boot/freeldr/freeldr/include/keycodes.h +++ b/reactos/boot/freeldr/freeldr/include/keycodes.h @@ -17,9 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __KEYCODES_H -#define __KEYCODES_H - +#pragma once // Key codes #define KEY_EXTENDED 0x00 @@ -41,6 +39,3 @@ #define KEY_F8 0x42 #define KEY_F9 0x43 #define KEY_F10 0x44 - - -#endif // #defined __KEYCODES_H diff --git a/reactos/boot/freeldr/freeldr/include/machine.h b/reactos/boot/freeldr/freeldr/include/machine.h index 440755de6a7..0c0076f4760 100644 --- a/reactos/boot/freeldr/freeldr/include/machine.h +++ b/reactos/boot/freeldr/freeldr/include/machine.h @@ -17,8 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __MACHINE_H_ -#define __MACHINE_H_ +#pragma once #ifndef __DISK_H #include "disk.h" @@ -126,6 +125,4 @@ VOID MachPrepareForReactOS(IN BOOLEAN Setup); #define MachDiskGetCacheableBlockCount(Drive) MachVtbl.DiskGetCacheableBlockCount(Drive) #define MachHwDetect() MachVtbl.HwDetect() -#endif /* __MACHINE_H_ */ - /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/include/mm.h b/reactos/boot/freeldr/freeldr/include/mm.h index cfec1478eaa..a7840e37791 100644 --- a/reactos/boot/freeldr/freeldr/include/mm.h +++ b/reactos/boot/freeldr/freeldr/include/mm.h @@ -17,9 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - -#ifndef __MEMORY_H -#define __MEMORY_H +#pragma once typedef enum { @@ -119,4 +117,6 @@ PVOID MmAllocateHighestMemoryBelowAddress(ULONG MemorySize, PVOID DesiredAddress PVOID MmHeapAlloc(ULONG MemorySize); VOID MmHeapFree(PVOID MemoryPointer); -#endif // defined __MEMORY_H +#define ExAllocatePool(pool, size) MmHeapAlloc(size) +#define ExAllocatePoolWithTag(pool, size, tag) MmHeapAlloc(size) +#define ExFreePool(p) MmHeapFree(p) diff --git a/reactos/boot/freeldr/freeldr/include/multiboot.h b/reactos/boot/freeldr/freeldr/include/multiboot.h index be28f2b246c..dd3467f28d2 100644 --- a/reactos/boot/freeldr/freeldr/include/multiboot.h +++ b/reactos/boot/freeldr/freeldr/include/multiboot.h @@ -16,8 +16,7 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __MULTIBOOT_H -#define __MULTIBOOT_H +#pragma once /* Macros. */ @@ -103,6 +102,3 @@ typedef struct memory_map } memory_map_t; #endif /* ! ASM */ - - -#endif // defined __MULTIBOOT_H diff --git a/reactos/boot/freeldr/freeldr/include/ntoskrnl.h b/reactos/boot/freeldr/freeldr/include/ntoskrnl.h new file mode 100644 index 00000000000..f2e9e468008 --- /dev/null +++ b/reactos/boot/freeldr/freeldr/include/ntoskrnl.h @@ -0,0 +1,17 @@ +#include +#undef _NTHAL_ +//#undef DECLSPEC_IMPORT +//#define DECLSPEC_IMPORT +#undef NTSYSAPI +#define NTSYSAPI + +/* Windows Device Driver Kit */ +#include +#include + +//typedef GUID UUID; + +/* Disk stuff */ +typedef PVOID PLOADER_PARAMETER_BLOCK; +#include +#include diff --git a/reactos/boot/freeldr/freeldr/include/of.h b/reactos/boot/freeldr/freeldr/include/of.h index 8ab77b293b5..76c9d2162ce 100644 --- a/reactos/boot/freeldr/freeldr/include/of.h +++ b/reactos/boot/freeldr/freeldr/include/of.h @@ -1,5 +1,4 @@ -#ifndef FREELDR_OF_H -#define FREELDR_OF_H +#pragma once #define OF_FAILED 0 #define ERR_NOT_FOUND 0xc0000010 @@ -15,5 +14,3 @@ extern of_proxy ofproxy; int setjmp( jmp_buf buf ); int longjmp( jmp_buf buf, int retval ); int ofw_callmethod_ret(const char *method, int handle, int nargs, int *args, int ret); - -#endif/*FREELDR_OF_H*/ diff --git a/reactos/boot/freeldr/freeldr/include/options.h b/reactos/boot/freeldr/freeldr/include/options.h index bfa64798cd3..124b64e2326 100644 --- a/reactos/boot/freeldr/freeldr/include/options.h +++ b/reactos/boot/freeldr/freeldr/include/options.h @@ -17,9 +17,6 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __OPTIONS_H -#define __OPTIONS_H +#pragma once VOID DoOptionsMenu(VOID); - -#endif // #defined __OPTIONS_H diff --git a/reactos/boot/freeldr/freeldr/include/oslist.h b/reactos/boot/freeldr/freeldr/include/oslist.h index 0f3ab77faef..04df0fa789b 100644 --- a/reactos/boot/freeldr/freeldr/include/oslist.h +++ b/reactos/boot/freeldr/freeldr/include/oslist.h @@ -17,8 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __OSLIST_H -#define __OSLIST_H +#pragma once typedef struct tagOperatingSystemItem { @@ -28,5 +27,3 @@ typedef struct tagOperatingSystemItem } OperatingSystemItem; OperatingSystemItem* InitOperatingSystemList(ULONG* OperatingSystemCountPointer); - -#endif // #defined __OSLIST_H diff --git a/reactos/boot/freeldr/freeldr/include/ramdisk.h b/reactos/boot/freeldr/freeldr/include/ramdisk.h index c77c09e6876..8979bcf98a8 100644 --- a/reactos/boot/freeldr/freeldr/include/ramdisk.h +++ b/reactos/boot/freeldr/freeldr/include/ramdisk.h @@ -6,8 +6,7 @@ * PROGRAMMERS: ReactOS Portable Systems Group */ -#ifndef _RAMDISK_ -#define _RAMDISK_ +#pragma once // // Ramdisk Routines @@ -26,5 +25,3 @@ RamDiskInitialize( extern PVOID gRamDiskBase; extern ULONG gRamDiskSize; - -#endif diff --git a/reactos/boot/freeldr/freeldr/include/reactos.h b/reactos/boot/freeldr/freeldr/include/reactos.h index de159735d35..82e23abb946 100644 --- a/reactos/boot/freeldr/freeldr/include/reactos.h +++ b/reactos/boot/freeldr/freeldr/include/reactos.h @@ -17,8 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __REACTOS_H -#define __REACTOS_H +#pragma once /* Base Addres of Kernel in Physical Memory */ #define KERNEL_BASE_PHYS 0x800000 @@ -74,6 +73,14 @@ VOID ReactOSRunSetupLoader(VOID); // ARC Path Functions // /////////////////////////////////////////////////////////////////////////////////////// +BOOLEAN +DissectArcPath2( + IN CHAR* ArcPath, + OUT ULONG* x, + OUT ULONG* y, + OUT ULONG* z, + OUT ULONG* Partition, + OUT ULONG *PathSyntax); BOOLEAN DissectArcPath(CHAR *ArcPath, CHAR *BootPath, ULONG* BootDrive, ULONG* BootPartition); VOID ConstructArcPath(PCHAR ArcPath, PCHAR SystemFolder, ULONG Disk, ULONG Partition); ULONG ConvertArcNameToBiosDriveNumber(PCHAR ArcPath); @@ -128,5 +135,3 @@ FrLdrLoadImage( IN INT nPos, IN ULONG ImageType ); - -#endif // defined __REACTOS_H diff --git a/reactos/boot/freeldr/freeldr/include/rtl.h b/reactos/boot/freeldr/freeldr/include/rtl.h index 877f217a352..d4ef384e9d0 100644 --- a/reactos/boot/freeldr/freeldr/include/rtl.h +++ b/reactos/boot/freeldr/freeldr/include/rtl.h @@ -17,8 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __STDLIB_H -#define __STDLIB_H +#pragma once #include @@ -28,5 +27,3 @@ char * convert_i64_to_ascii(char *buf, int c, unsigned long long num); void PcBeep(void); void delay(unsigned msec); void sound(int freq); - -#endif // defined __STDLIB_H diff --git a/reactos/boot/freeldr/freeldr/include/ui.h b/reactos/boot/freeldr/freeldr/include/ui.h index ee58003b0d4..1b57fd9e069 100644 --- a/reactos/boot/freeldr/freeldr/include/ui.h +++ b/reactos/boot/freeldr/freeldr/include/ui.h @@ -17,9 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __UI_H -#define __UI_H - +#pragma once extern ULONG UiScreenWidth; // Screen Width extern ULONG UiScreenHeight; // Screen Height @@ -176,5 +174,3 @@ extern UIVTBL UiVtbl; #define D_HORZ (0xcd) /* Double horizontal line.*/ #define VERT (0xb3) /* Single vertical line */ #define D_VERT (0xba) /* Double vertical line. */ - -#endif // #defined __UI_H diff --git a/reactos/boot/freeldr/freeldr/include/ui/gui.h b/reactos/boot/freeldr/freeldr/include/ui/gui.h index 076fa05aacb..77a983a5eb9 100644 --- a/reactos/boot/freeldr/freeldr/include/ui/gui.h +++ b/reactos/boot/freeldr/freeldr/include/ui/gui.h @@ -17,8 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __GUI_H -#define __GUI_H +#pragma once #define TUI_SCREEN_MEM 0xB8000 #define TITLE_BOX_CHAR_HEIGHT 5 @@ -52,5 +51,3 @@ UCHAR GuiTextToFillStyle(PCSTR FillStyleText); // Converts the text fill into BOOLEAN GuiDisplayMenu(PCSTR MenuItemList[], ULONG MenuItemCount, ULONG DefaultMenuItem, LONG MenuTimeOut, ULONG* SelectedMenuItem); extern const UIVTBL GuiVtbl; - -#endif // #defined __GUI_H diff --git a/reactos/boot/freeldr/freeldr/include/ui/minitui.h b/reactos/boot/freeldr/freeldr/include/ui/minitui.h index d20230b25d4..d845c5202ed 100644 --- a/reactos/boot/freeldr/freeldr/include/ui/minitui.h +++ b/reactos/boot/freeldr/freeldr/include/ui/minitui.h @@ -6,8 +6,7 @@ * PROGRAMMERS: Herv Poussineau */ -#ifndef __MINITUI_H -#define __MINITUI_H +#pragma once /////////////////////////////////////////////////////////////////////////////////////// // @@ -29,5 +28,3 @@ VOID MiniTuiDrawProgressBar(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, UL VOID MiniTuiDrawMenu(PUI_MENU_INFO MenuInfo); extern const UIVTBL MiniTuiVtbl; - -#endif // #defined __TUI_H diff --git a/reactos/boot/freeldr/freeldr/include/ui/noui.h b/reactos/boot/freeldr/freeldr/include/ui/noui.h index df53ce1bdfd..de027d7951b 100644 --- a/reactos/boot/freeldr/freeldr/include/ui/noui.h +++ b/reactos/boot/freeldr/freeldr/include/ui/noui.h @@ -6,8 +6,7 @@ * PROGRAMMERS: Herv Poussineau */ -#ifndef _NOUI_H_ -#define _NOUI_H_ +#pragma once /////////////////////////////////////////////////////////////////////////////////////// // @@ -47,5 +46,3 @@ VOID NoUiDrawMenu(PUI_MENU_INFO MenuInfo); BOOLEAN NoUiDisplayMenu(PCSTR MenuItemList[], ULONG MenuItemCount, ULONG DefaultMenuItem, LONG MenuTimeOut, ULONG* SelectedMenuItem, BOOLEAN CanEscape, UiMenuKeyPressFilterCallback KeyPressFilter); VOID NoUiDrawMenu(PUI_MENU_INFO MenuInfo); - -#endif /* _NOUI_H_ */ diff --git a/reactos/boot/freeldr/freeldr/include/ui/tui.h b/reactos/boot/freeldr/freeldr/include/ui/tui.h index 5c0c0c34c0a..ad7faa4cf8e 100644 --- a/reactos/boot/freeldr/freeldr/include/ui/tui.h +++ b/reactos/boot/freeldr/freeldr/include/ui/tui.h @@ -17,8 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __TUI_H -#define __TUI_H +#pragma once #define TUI_SCREEN_MEM 0xB8000 #define TUI_TITLE_BOX_CHAR_HEIGHT 5 @@ -80,12 +79,6 @@ VOID NTAPI TuiDrawMenuItem(PUI_MENU_INFO MenuInfo, ULONG MenuItemNumber); ULONG NTAPI TuiProcessMenuKeyboardEvent(PUI_MENU_INFO MenuInfo, UiMenuKeyPressFilterCallback KeyPressFilter); BOOLEAN TuiDisplayMenu(PCSTR MenuItemList[], ULONG MenuItemCount, ULONG DefaultMenuItem, LONG MenuTimeOut, ULONG* SelectedMenuItem, BOOLEAN CanEscape, UiMenuKeyPressFilterCallback KeyPressFilter); - - - - - - /* Definitions for corners, depending on HORIZ and VERT */ #define UL (0xda) #define UR (0xbf) /* HORZ and VERT */ @@ -108,5 +101,3 @@ BOOLEAN TuiDisplayMenu(PCSTR MenuItemList[], ULONG MenuItemCount, ULONG DefaultM #define VD_LR (0xbd) extern const UIVTBL TuiVtbl; - -#endif // #defined __TUI_H diff --git a/reactos/boot/freeldr/freeldr/include/ver.h b/reactos/boot/freeldr/freeldr/include/ver.h index 2f94f80a1a5..d078f8e1416 100644 --- a/reactos/boot/freeldr/freeldr/include/ver.h +++ b/reactos/boot/freeldr/freeldr/include/ver.h @@ -17,9 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __VERSION_H -#define __VERSION_H - +#pragma once /* just some stuff */ #define VERSION "FreeLoader v3.0" @@ -44,6 +42,3 @@ PCHAR GetFreeLoaderVersionString(VOID); #endif // ASM - - -#endif // defined __VERSION_H diff --git a/reactos/boot/freeldr/freeldr/include/video.h b/reactos/boot/freeldr/freeldr/include/video.h index 60d338a10ac..921f28dd521 100644 --- a/reactos/boot/freeldr/freeldr/include/video.h +++ b/reactos/boot/freeldr/freeldr/include/video.h @@ -17,8 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __VIDEO_H -#define __VIDEO_H +#pragma once #include typedef struct @@ -43,6 +42,3 @@ VOID VideoRestorePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount); VOID VideoSetAllColorsToBlack(ULONG ColorCount); VOID VideoFadeIn(PPALETTE_ENTRY Palette, ULONG ColorCount); VOID VideoFadeOut(ULONG ColorCount); - - -#endif // defined __VIDEO_H diff --git a/reactos/boot/freeldr/freeldr/include/winldr.h b/reactos/boot/freeldr/freeldr/include/winldr.h index 8fc5ef8ee3d..ac42a407922 100644 --- a/reactos/boot/freeldr/freeldr/include/winldr.h +++ b/reactos/boot/freeldr/freeldr/include/winldr.h @@ -18,9 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __WINLDR_H -#define __WINLDR_H - +#pragma once /////////////////////////////////////////////////////////////////////////////////////// // @@ -108,6 +106,3 @@ typedef struct /* Root System Descriptor Pointer */ CHAR reserved [3]; /* reserved field must be 0 */ } RSDP_DESCRIPTOR, *PRSDP_DESCRIPTOR; #include - - -#endif // defined __WINLDR_H diff --git a/reactos/boot/freeldr/freeldr/linuxboot.c b/reactos/boot/freeldr/freeldr/linuxboot.c index e3755c97046..10c2017eb0c 100644 --- a/reactos/boot/freeldr/freeldr/linuxboot.c +++ b/reactos/boot/freeldr/freeldr/linuxboot.c @@ -17,10 +17,10 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - +#ifndef _M_ARM + #include #include - #ifdef __i386__ #define LINUX_READ_CHUNK_SIZE 0x20000 // Read 128k at a time @@ -516,3 +516,4 @@ BOOLEAN LinuxReadInitrd(PFILE LinuxInitrdFile) return TRUE; } #endif /* __i386__ */ +#endif diff --git a/reactos/boot/freeldr/freeldr/mm/meminit.c b/reactos/boot/freeldr/freeldr/mm/meminit.c index e3e62c802c2..f59a43f7b54 100644 --- a/reactos/boot/freeldr/freeldr/mm/meminit.c +++ b/reactos/boot/freeldr/freeldr/mm/meminit.c @@ -102,8 +102,11 @@ VOID MmInitializeHeap(PVOID PageLookupTable) { ULONG PagesNeeded; ULONG HeapStart; - + MEMORY_TYPE Type; + PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTable; + // HACK: Make it so it doesn't overlap kernel space + Type = RealPageLookupTable[0x100].PageAllocated; MmMarkPagesInLookupTable(PageLookupTableAddress, 0x100, 0xFF, LoaderSystemCode); // Find contigious memory block for HEAP:STACK @@ -111,7 +114,7 @@ VOID MmInitializeHeap(PVOID PageLookupTable) HeapStart = MmFindAvailablePages(PageLookupTable, TotalPagesInLookupTable, PagesNeeded, FALSE); // Unapply the hack - MmMarkPagesInLookupTable(PageLookupTableAddress, 0x100, 0xFF, LoaderFree); + MmMarkPagesInLookupTable(PageLookupTableAddress, 0x100, 0xFF, Type); if (HeapStart == 0) { diff --git a/reactos/boot/freeldr/freeldr/mm/mm.c b/reactos/boot/freeldr/freeldr/mm/mm.c index c06bb00f632..f4a4c69b095 100644 --- a/reactos/boot/freeldr/freeldr/mm/mm.c +++ b/reactos/boot/freeldr/freeldr/mm/mm.c @@ -345,3 +345,54 @@ PPAGE_LOOKUP_TABLE_ITEM MmGetMemoryMap(ULONG *NoEntries) return RealPageLookupTable; } + +#undef ExAllocatePoolWithTag +NTKERNELAPI +PVOID +NTAPI +ExAllocatePoolWithTag( + IN POOL_TYPE PoolType, + IN SIZE_T NumberOfBytes, + IN ULONG Tag) +{ + return MmHeapAlloc(NumberOfBytes); +} + +#undef ExFreePool +NTKERNELAPI +VOID +NTAPI +ExFreePool( + IN PVOID P) +{ + MmHeapFree(P); +} + +PVOID +NTAPI +RtlAllocateHeap( + IN PVOID HeapHandle, + IN ULONG Flags, + IN SIZE_T Size) +{ + PVOID ptr; + + ptr = MmHeapAlloc(Size); + if (ptr && (Flags & HEAP_ZERO_MEMORY)) + { + RtlZeroMemory(ptr, Size); + } + + return ptr; +} + +BOOLEAN +NTAPI +RtlFreeHeap( + IN PVOID HeapHandle, + IN ULONG Flags, + IN PVOID HeapBase) +{ + MmHeapFree(HeapBase); + return TRUE; +} diff --git a/reactos/boot/freeldr/freeldr/reactos/arcname.c b/reactos/boot/freeldr/freeldr/reactos/arcname.c index e46022c6c6b..3ca69fadb51 100644 --- a/reactos/boot/freeldr/freeldr/reactos/arcname.c +++ b/reactos/boot/freeldr/freeldr/reactos/arcname.c @@ -104,6 +104,62 @@ BOOLEAN DissectArcPath(CHAR *ArcPath, CHAR *BootPath, ULONG* BootDrive, ULONG* B return TRUE; } +/* PathSyntax: scsi() = 0, multi() = 1, ramdisk() = 2 */ +BOOLEAN +DissectArcPath2( + IN CHAR* ArcPath, + OUT ULONG* x, + OUT ULONG* y, + OUT ULONG* z, + OUT ULONG* Partition, + OUT ULONG *PathSyntax) +{ + /* Detect ramdisk() */ + if (_strnicmp(ArcPath, "ramdisk(0)", 10) == 0) + { + *x = *y = *z = 0; + *Partition = 1; + *PathSyntax = 2; + return TRUE; + } + /* Detect scsi()disk()rdisk()partition() */ + else if (sscanf(ArcPath, "scsi(%lu)disk(%lu)rdisk(%lu)partition(%lu)", x, y, z, Partition) == 4) + { + *PathSyntax = 0; + return TRUE; + } + /* Detect scsi()cdrom()fdisk() */ + else if (sscanf(ArcPath, "scsi(%lu)cdrom(%lu)fdisk(%lu)", x, y, z) == 3) + { + *Partition = 0; + *PathSyntax = 0; + return TRUE; + } + /* Detect multi()disk()rdisk()partition() */ + else if (sscanf(ArcPath, "multi(%lu)disk(%lu)rdisk(%lu)partition(%lu)", x, y, z, Partition) == 4) + { + *PathSyntax = 1; + return TRUE; + } + /* Detect multi()disk()cdrom() */ + else if (sscanf(ArcPath, "multi(%lu)disk(%lu)cdrom(%lu)", x, y, z) == 3) + { + *Partition = 1; + *PathSyntax = 1; + return TRUE; + } + /* Detect multi()disk()fdisk() */ + else if (sscanf(ArcPath, "multi(%lu)disk(%lu)fdisk(%lu)", x, y, z) == 3) + { + *Partition = 1; + *PathSyntax = 1; + return TRUE; + } + + /* Unknown syntax */ + return FALSE; +} + VOID ConstructArcPath(PCHAR ArcPath, PCHAR SystemFolder, ULONG Disk, ULONG Partition) { char tmp[50]; diff --git a/reactos/boot/freeldr/freeldr/reactos/imageldr.c b/reactos/boot/freeldr/freeldr/reactos/imageldr.c index 1e50115c83f..296e3afc10a 100644 --- a/reactos/boot/freeldr/freeldr/reactos/imageldr.c +++ b/reactos/boot/freeldr/freeldr/reactos/imageldr.c @@ -1,3 +1,4 @@ +#ifndef _M_ARM #include #include @@ -780,5 +781,5 @@ FrLdrMapImage(IN PFILE Image, /* Return the final mapped address */ return LoadBase; } - +#endif /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/reactos/reactos.c b/reactos/boot/freeldr/freeldr/reactos/reactos.c index 0700dca676e..12c8c6647e4 100644 --- a/reactos/boot/freeldr/freeldr/reactos/reactos.c +++ b/reactos/boot/freeldr/freeldr/reactos/reactos.c @@ -18,6 +18,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#ifndef _M_ARM #include #include @@ -889,6 +890,7 @@ LoadAndBootReactOS(PCSTR OperatingSystemName) * Load boot drivers */ FrLdrLoadBootDrivers(szBootPath, 40); + UiDrawProgressBarCenter(100, 100, szLoadingMsg); //UiUnInitialize("Booting ReactOS..."); // @@ -901,5 +903,6 @@ LoadAndBootReactOS(PCSTR OperatingSystemName) // FrLdrStartup(0x2badb002); } +#endif /* EOF */ diff --git a/reactos/boot/freeldr/freeldr/setupldr.rbuild b/reactos/boot/freeldr/freeldr/setupldr.rbuild index 20d0c745430..0a352f48602 100644 --- a/reactos/boot/freeldr/freeldr/setupldr.rbuild +++ b/reactos/boot/freeldr/freeldr/setupldr.rbuild @@ -11,6 +11,7 @@ cmlib rtl libcntpr + mini_hal -nostartfiles -nostdlib diff --git a/reactos/boot/freeldr/freeldr/ui/directui.c b/reactos/boot/freeldr/freeldr/ui/directui.c new file mode 100644 index 00000000000..2a9db377bd6 --- /dev/null +++ b/reactos/boot/freeldr/freeldr/ui/directui.c @@ -0,0 +1,574 @@ +/* + * PROJECT: ReactOS Boot Loader + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: boot/freeldr/freeldr/ui/directui.c + * PURPOSE: FreeLDR UI Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ +#ifdef _M_ARM + +/* INCLUDES *******************************************************************/ + +#include +#include + +/* GLOBALS ********************************************************************/ + +/* FUNCTIONS ******************************************************************/ + +ULONG UiScreenWidth; +ULONG UiScreenHeight; +UCHAR UiMenuFgColor = COLOR_GRAY; +UCHAR UiMenuBgColor = COLOR_BLACK; +UCHAR UiTextColor = COLOR_GRAY; +UCHAR UiSelectedTextColor = COLOR_BLACK; +UCHAR UiSelectedTextBgColor = COLOR_GRAY; +CHAR UiTimeText[260] = "Seconds until highlighted choice will be started automatically: "; + +INT +TuiPrintf(const char *Format, + ...) +{ + int i; + int Length; + va_list ap; + CHAR Buffer[512]; + + va_start(ap, Format); + Length = _vsnprintf(Buffer, sizeof(Buffer), Format, ap); + va_end(ap); + + if (Length == -1) Length = sizeof(Buffer); + + for (i = 0; i < Length; i++) + { + MachConsPutChar(Buffer[i]); + } + + return Length; +} + +BOOLEAN +UiInitialize(IN BOOLEAN ShowGui) +{ + ULONG Depth; + + /* Nothing to do */ + if (!ShowGui) return TRUE; + + /* Set mode and query size */ + MachVideoSetDisplayMode(NULL, TRUE); + MachVideoGetDisplaySize(&UiScreenWidth, &UiScreenHeight, &Depth); + return TRUE; +} + +VOID +UiUnInitialize(IN PCSTR BootText) +{ + /* Nothing to do */ + return; +} + +VOID +UiDrawBackdrop(VOID) +{ + /* Clear the screen */ + MachVideoClearScreen(ATTR(COLOR_WHITE, COLOR_BLACK)); +} + +VOID +UiDrawText(IN ULONG X, + IN ULONG Y, + IN PCSTR Text, + IN UCHAR Attr) +{ + ULONG i, j; + + /* Draw the text character by character, but don't exceed the width */ + for (i = X, j = 0; Text[j] && i < UiScreenWidth; i++, j++) + { + /* Write the character */ + MachVideoPutChar(Text[j], Attr, i, Y); + } +} + +VOID +UiDrawCenteredText(IN ULONG Left, + IN ULONG Top, + IN ULONG Right, + IN ULONG Bottom, + IN PCSTR TextString, + IN UCHAR Attr) +{ + ULONG TextLength, BoxWidth, BoxHeight, LineBreakCount, Index, LastIndex; + ULONG RealLeft, RealTop, X, Y; + CHAR Temp[2]; + + /* Query text length */ + TextLength = strlen(TextString); + + /* Count the new lines and the box width */ + LineBreakCount = 0; + BoxWidth = 0; + LastIndex = 0; + for (Index=0; Index < TextLength; Index++) + { + /* Scan for new lines */ + if (TextString[Index] == '\n') + { + /* Remember the new line */ + LastIndex = Index; + LineBreakCount++; + } + else + { + /* Check for new larger box width */ + if ((Index - LastIndex) > BoxWidth) + { + /* Update it */ + BoxWidth = (Index - LastIndex); + } + } + } + + /* Base the box height on the number of lines */ + BoxHeight = LineBreakCount + 1; + + /* Create the centered coordinates */ + RealLeft = (((Right - Left) - BoxWidth) / 2) + Left; + RealTop = (((Bottom - Top) - BoxHeight) / 2) + Top; + + /* Now go for a second scan */ + LastIndex = 0; + for (Index=0; Index < TextLength; Index++) + { + /* Look for new lines again */ + if (TextString[Index] == '\n') + { + /* Update where the text should start */ + RealTop++; + LastIndex = 0; + } + else + { + /* We've got a line of text to print, do it */ + X = RealLeft + LastIndex; + Y = RealTop; + LastIndex++; + Temp[0] = TextString[Index]; + Temp[1] = 0; + UiDrawText(X, Y, Temp, Attr); + } + } +} + +VOID +UiDrawStatusText(IN PCSTR StatusText) +{ + return; +} + +VOID +UiInfoBox(IN PCSTR MessageText) +{ + TuiPrintf(MessageText); +} + +VOID +UiMessageBox(IN PCSTR MessageText) +{ + TuiPrintf(MessageText); +} + +VOID +UiMessageBoxCritical(IN PCSTR MessageText) +{ + TuiPrintf(MessageText); +} + +VOID +UiDrawProgressBarCenter(IN ULONG Position, + IN ULONG Range, + IN PCHAR ProgressText) +{ + ULONG Left, Top, Right, Bottom, Width, Height; + + /* Build the coordinates and sizes */ + Height = 2; + Width = UiScreenWidth; + Left = 0; + Right = (Left + Width) - 1; + Top = UiScreenHeight - Height - 4; + Bottom = Top + Height + 1; + + /* Draw the progress bar */ + UiDrawProgressBar(Left, Top, Right, Bottom, Position, Range, ProgressText); +} + +VOID +UiDrawProgressBar(IN ULONG Left, + IN ULONG Top, + IN ULONG Right, + IN ULONG Bottom, + IN ULONG Position, + IN ULONG Range, + IN PCHAR ProgressText) +{ + ULONG i, ProgressBarWidth; + + /* Calculate the width of the bar proper */ + ProgressBarWidth = (Right - Left) - 3; + + /* First make sure the progress bar text fits */ + UiTruncateStringEllipsis(ProgressText, ProgressBarWidth - 4); + if (Position > Range) Position = Range; + + /* Draw the "Loading..." text */ + UiDrawCenteredText(Left + 2, Top + 1, Right - 2, Top + 1, ProgressText, ATTR(7, 0)); + + /* Draw the percent complete */ + for (i = 0; i < (Position * ProgressBarWidth) / Range; i++) + { + /* Use the fill character */ + UiDrawText(Left + 2 + i, Top + 2, "\xDB", ATTR(UiTextColor, UiMenuBgColor)); + } +} + +VOID +UiShowMessageBoxesInSection(IN PCSTR SectionName) +{ + return; +} + +VOID +UiTruncateStringEllipsis(IN PCHAR StringText, + IN ULONG MaxChars) +{ + /* If it's too large, just add some ellipsis past the maximum */ + if (strlen(StringText) > MaxChars) strcpy(&StringText[MaxChars - 3], "..."); +} + +VOID +NTAPI +UiDrawMenuBox(IN PUI_MENU_INFO MenuInfo) +{ + CHAR MenuLineText[80], TempString[80]; + ULONG i; + + /* If there is a timeout draw the time remaining */ + if (MenuInfo->MenuTimeRemaining >= 0) + { + /* Copy the integral time text string, and remove the last 2 chars */ + strcpy(TempString, UiTimeText); + i = strlen(TempString); + TempString[i - 2] = 0; + + /* Display the first part of the string and the remaining time */ + strcpy(MenuLineText, TempString); + _itoa(MenuInfo->MenuTimeRemaining, TempString, 10); + strcat(MenuLineText, TempString); + + /* Add the last 2 chars */ + strcat(MenuLineText, &UiTimeText[i - 2]); + + /* Display under the menu directly */ + UiDrawText(0, + MenuInfo->Bottom + 3, + MenuLineText, + ATTR(UiMenuFgColor, UiMenuBgColor)); + } + else + { + /* Erase the timeout string with spaces, and 0-terminate for sure */ + for (i=0; iBottom + 3, + MenuLineText, + ATTR(UiMenuFgColor, UiMenuBgColor)); + } + + /* Loop each item */ + for (i = 0; i < MenuInfo->MenuItemCount; i++) + { + /* Check if it's a separator */ + if (!(_stricmp(MenuInfo->MenuItemList[i], "SEPARATOR"))) + { + /* Draw the separator line */ + UiDrawText(MenuInfo->Left, + MenuInfo->Top + i + 1, + "\xC7", + ATTR(UiMenuFgColor, UiMenuBgColor)); + UiDrawText(MenuInfo->Right, + MenuInfo->Top + i + 1, + "\xB6", + ATTR(UiMenuFgColor, UiMenuBgColor)); + } + } +} + +VOID +NTAPI +UiDrawMenuItem(IN PUI_MENU_INFO MenuInfo, + IN ULONG MenuItemNumber) +{ + CHAR MenuLineText[80]; + UCHAR Attribute = ATTR(UiTextColor, UiMenuBgColor); + + /* Simply left-align it */ + MenuLineText[0] = '\0'; + strcat(MenuLineText, " "); + + /* Now append the text string */ + strcat(MenuLineText, MenuInfo->MenuItemList[MenuItemNumber]); + + /* If it is a separator */ + if (!(_stricmp(MenuInfo->MenuItemList[MenuItemNumber], "SEPARATOR"))) + { + /* Make it a separator line and use menu colors */ + memset(MenuLineText, 0, 80); + memset(MenuLineText, 0xC4, (MenuInfo->Right - MenuInfo->Left - 1)); + Attribute = ATTR(UiMenuFgColor, UiMenuBgColor); + } + else if (MenuItemNumber == MenuInfo->SelectedMenuItem) + { + /* If this is the selected item, use the selected colors */ + Attribute = ATTR(UiSelectedTextColor, UiSelectedTextBgColor); + } + + /* Draw the item */ + UiDrawText(MenuInfo->Left + 1, + MenuInfo->Top + 1 + MenuItemNumber, + MenuLineText, + Attribute); +} + +VOID +UiDrawMenu(IN PUI_MENU_INFO MenuInfo) +{ + ULONG i; + + /* No GUI status bar text, just minimal text. first to tell the user to choose */ + UiDrawText(0, + MenuInfo->Top - 2, + "Please select the operating system to start:", + ATTR(UiMenuFgColor, UiMenuBgColor)); + + /* Now tell him how to choose */ + UiDrawText(0, + MenuInfo->Bottom + 1, + "Use the up and down arrow keys to move the highlight to " + "your choice.", + ATTR(UiMenuFgColor, UiMenuBgColor)); + UiDrawText(0, + MenuInfo->Bottom + 2, + "Press ENTER to choose.", + ATTR(UiMenuFgColor, UiMenuBgColor)); + + /* And offer F8 options */ + UiDrawText(0, + UiScreenHeight - 4, + "For troubleshooting and advanced startup options for " + "ReactOS, press F8.", + ATTR(UiMenuFgColor, UiMenuBgColor)); + + /* Draw the menu box */ + UiDrawMenuBox(MenuInfo); + + /* Draw each line of the menu */ + for (i = 0; i < MenuInfo->MenuItemCount; i++) UiDrawMenuItem(MenuInfo, i); +} + +ULONG +NTAPI +UiProcessMenuKeyboardEvent(IN PUI_MENU_INFO MenuInfo, + IN UiMenuKeyPressFilterCallback KeyPressFilter) +{ + ULONG KeyEvent = 0, Selected, Count; + + /* Check for a keypress */ + if (MachConsKbHit()) + { + /* Check if the timeout is not already complete */ + if (MenuInfo->MenuTimeRemaining != -1) + { + // + // Cancel it and remove it + // + MenuInfo->MenuTimeRemaining = -1; + UiDrawMenuBox(MenuInfo); + } + + /* Get the key */ + KeyEvent = MachConsGetCh(); + + /* Is it extended? Then get the extended key */ + if (!KeyEvent) KeyEvent = MachConsGetCh(); + + /* Call the supplied key filter callback function to see if it is going to handle this keypress. */ + if ((KeyPressFilter) && (KeyPressFilter(KeyEvent))) + { + /* It processed the key character, so redraw and exit */ + UiDrawMenu(MenuInfo); + return 0; + } + + /* Process the key */ + if ((KeyEvent == KEY_UP) || (KeyEvent == KEY_DOWN)) + { + /* Get the current selected item and count */ + Selected = MenuInfo->SelectedMenuItem; + Count = MenuInfo->MenuItemCount - 1; + + /* Check if this was a key up and there's a selected menu item */ + if ((KeyEvent == KEY_UP) && (Selected)) + { + /* Update the menu (Deselect previous item) */ + MenuInfo->SelectedMenuItem--; + UiDrawMenuItem(MenuInfo, Selected); + Selected--; + + /* Skip past any separators */ + if ((Selected) && + !(_stricmp(MenuInfo->MenuItemList[Selected], "SEPARATOR"))) + { + MenuInfo->SelectedMenuItem--; + } + } + else if ((KeyEvent == KEY_DOWN) && (Selected < Count)) + { + /* Update the menu (deselect previous item) */ + MenuInfo->SelectedMenuItem++; + UiDrawMenuItem(MenuInfo, Selected); + Selected++; + + /* Skip past any separators */ + if ((Selected < Count) && + !(_stricmp(MenuInfo->MenuItemList[Selected], "SEPARATOR"))) + { + MenuInfo->SelectedMenuItem++; + } + } + + /* Select new item and update video buffer */ + UiDrawMenuItem(MenuInfo, MenuInfo->SelectedMenuItem); + } + } + + /* Return the pressed key */ + return KeyEvent; +} + +VOID +NTAPI +UiCalcMenuBoxSize(IN PUI_MENU_INFO MenuInfo) +{ + ULONG i, Width = 0, Height, Length; + + /* Height is the menu item count plus 2 (top border & bottom border) */ + Height = MenuInfo->MenuItemCount + 2; + Height -= 1; // Height is zero-based + + /* Loop every item */ + for (i = 0; i < MenuInfo->MenuItemCount; i++) + { + /* Get the string length and make it become the new width if necessary */ + Length = strlen(MenuInfo->MenuItemList[i]); + if (Length > Width) Width = Length; + } + + /* Allow room for left & right borders, plus 8 spaces on each side */ + Width += 18; + + /* Put the menu in the default left-corner position */ + MenuInfo->Left = -1; + MenuInfo->Top = 4; + + /* The other margins are the same */ + MenuInfo->Right = (MenuInfo->Left) + Width; + MenuInfo->Bottom = (MenuInfo->Top) + Height; +} + +BOOLEAN +UiDisplayMenu(IN PCSTR MenuItemList[], + IN ULONG MenuItemCount, + IN ULONG DefaultMenuItem, + IN LONG MenuTimeOut, + OUT PULONG SelectedMenuItem, + IN BOOLEAN CanEscape, + IN UiMenuKeyPressFilterCallback KeyPressFilter) +{ + UI_MENU_INFO MenuInformation; + ULONG LastClockSecond; + ULONG CurrentClockSecond; + ULONG KeyPress; + + /* Check if there's no timeout */ + if (!MenuTimeOut) + { + /* Return the default selected item */ + if (SelectedMenuItem) *SelectedMenuItem = DefaultMenuItem; + return TRUE; + } + + /* Setup the MENU_INFO structure */ + MenuInformation.MenuItemList = MenuItemList; + MenuInformation.MenuItemCount = MenuItemCount; + MenuInformation.MenuTimeRemaining = MenuTimeOut; + MenuInformation.SelectedMenuItem = DefaultMenuItem; + + /* Calculate the size of the menu box */ + UiCalcMenuBoxSize(&MenuInformation); + + /* Draw the menu */ + UiDrawMenu(&MenuInformation); + + /* Get the current second of time */ + LastClockSecond = ArcGetTime()->Second; + + /* Process keys */ + while (TRUE) + { + /* Process key presses */ + KeyPress = UiProcessMenuKeyboardEvent(&MenuInformation, + KeyPressFilter); + + /* Check for ENTER or ESC */ + if (KeyPress == KEY_ENTER) break; + if (CanEscape && KeyPress == KEY_ESC) return FALSE; + + /* Check if there is a countdown */ + if (MenuInformation.MenuTimeRemaining) + { + /* Get the updated time, seconds only */ + CurrentClockSecond = ArcGetTime()->Second; + + /* Check if more then a second has now elapsed */ + if (CurrentClockSecond != LastClockSecond) + { + /* Update the time information */ + LastClockSecond = CurrentClockSecond; + MenuInformation.MenuTimeRemaining--; + + /* Update the menu */ + UiDrawMenuBox(&MenuInformation); + } + } + else + { + /* A time out occurred, exit this loop and return default OS */ + break; + } + } + + /* Return the selected item */ + if (SelectedMenuItem) *SelectedMenuItem = MenuInformation.SelectedMenuItem; + return TRUE; +} + +#endif diff --git a/reactos/boot/freeldr/freeldr/ui/gui.c b/reactos/boot/freeldr/freeldr/ui/gui.c index e188ecd9a97..56b0faa7641 100644 --- a/reactos/boot/freeldr/freeldr/ui/gui.c +++ b/reactos/boot/freeldr/freeldr/ui/gui.c @@ -17,6 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ +#ifndef _M_ARM #include VOID GuiDrawBackdrop(VOID) @@ -103,3 +104,4 @@ const UIVTBL GuiVtbl = NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; +#endif diff --git a/reactos/boot/freeldr/freeldr/ui/minitui.c b/reactos/boot/freeldr/freeldr/ui/minitui.c index bbc36a82dd8..adaa68c777d 100644 --- a/reactos/boot/freeldr/freeldr/ui/minitui.c +++ b/reactos/boot/freeldr/freeldr/ui/minitui.c @@ -6,7 +6,7 @@ * PROGRAMMERS: Brian Palmer * Herv Poussineau */ - +#ifndef _M_ARM #include VOID MiniTuiDrawBackdrop(VOID) @@ -154,3 +154,4 @@ const UIVTBL MiniTuiVtbl = TuiDisplayMenu, MiniTuiDrawMenu, }; +#endif diff --git a/reactos/boot/freeldr/freeldr/ui/noui.c b/reactos/boot/freeldr/freeldr/ui/noui.c index a52c81cf45c..433ddb73387 100644 --- a/reactos/boot/freeldr/freeldr/ui/noui.c +++ b/reactos/boot/freeldr/freeldr/ui/noui.c @@ -5,7 +5,7 @@ * PURPOSE: No Text UI interface * PROGRAMMERS: Herv Poussineau */ - +#ifndef _M_ARM #include BOOLEAN NoUiInitialize(VOID) @@ -118,3 +118,4 @@ BOOLEAN NoUiDisplayMenu(PCSTR MenuItemList[], ULONG MenuItemCount, ULONG Default VOID NoUiDrawMenu(PUI_MENU_INFO MenuInfo) { } +#endif diff --git a/reactos/boot/freeldr/freeldr/ui/tui.c b/reactos/boot/freeldr/freeldr/ui/tui.c index d0016f463a8..91356d28122 100644 --- a/reactos/boot/freeldr/freeldr/ui/tui.c +++ b/reactos/boot/freeldr/freeldr/ui/tui.c @@ -16,7 +16,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - +#ifndef _M_ARM #include PVOID TextVideoBuffer = NULL; @@ -325,13 +325,8 @@ VOID TuiDrawText(ULONG X, ULONG Y, PCSTR Text, UCHAR Attr) // Draw the text for (i=X, j=0; Text[j] && i /* FUNCTIONS *****************************************************************/ @@ -530,3 +530,4 @@ TuiProcessMenuKeyboardEvent(PUI_MENU_INFO MenuInfo, // return KeyEvent; } +#endif diff --git a/reactos/boot/freeldr/freeldr/ui/ui.c b/reactos/boot/freeldr/freeldr/ui/ui.c index 4864f0adb40..9a6a237f27e 100644 --- a/reactos/boot/freeldr/freeldr/ui/ui.c +++ b/reactos/boot/freeldr/freeldr/ui/ui.c @@ -16,7 +16,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - +#ifndef _M_ARM #include #include @@ -496,3 +496,4 @@ BOOLEAN UiEditBox(PCSTR MessageText, PCHAR EditTextBuffer, ULONG Length) { return UiVtbl.EditBox(MessageText, EditTextBuffer, Length); } +#endif diff --git a/reactos/boot/freeldr/freeldr/video/fade.c b/reactos/boot/freeldr/freeldr/video/fade.c index 9839f2afaab..4cfd4352d46 100644 --- a/reactos/boot/freeldr/freeldr/video/fade.c +++ b/reactos/boot/freeldr/freeldr/video/fade.c @@ -16,7 +16,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - +#ifndef _M_ARM #include #define RGB_MAX 64 @@ -130,3 +130,4 @@ VOID VideoFadeOut(ULONG ColorCount) } } } +#endif diff --git a/reactos/boot/freeldr/freeldr/video/palette.c b/reactos/boot/freeldr/freeldr/video/palette.c index 8b1f469531c..c631648381a 100644 --- a/reactos/boot/freeldr/freeldr/video/palette.c +++ b/reactos/boot/freeldr/freeldr/video/palette.c @@ -16,9 +16,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - +#ifndef _M_ARM #include - VOID VideoSavePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount) { ULONG Color; @@ -40,3 +39,4 @@ VOID VideoRestorePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount) MachVideoSetPaletteColor(Color, Palette[Color].Red, Palette[Color].Green, Palette[Color].Blue); } } +#endif diff --git a/reactos/boot/freeldr/freeldr/video/video.c b/reactos/boot/freeldr/freeldr/video/video.c index 0f9fc9a14eb..5401d81320e 100644 --- a/reactos/boot/freeldr/freeldr/video/video.c +++ b/reactos/boot/freeldr/freeldr/video/video.c @@ -16,7 +16,7 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - +#ifndef _M_ARM #include PVOID VideoOffScreenBuffer = NULL; @@ -42,3 +42,4 @@ VOID VideoCopyOffScreenBufferToVRAM(VOID) { MachVideoCopyOffScreenBufferToVRAM(VideoOffScreenBuffer); } +#endif diff --git a/reactos/boot/freeldr/freeldr/windows/arm/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/arm/wlmemory.c new file mode 100644 index 00000000000..660656a5722 --- /dev/null +++ b/reactos/boot/freeldr/freeldr/windows/arm/wlmemory.c @@ -0,0 +1,256 @@ +/* + * PROJECT: ReactOS Boot Loader + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: boot/freeldr/arch/arm/loader.c + * PURPOSE: ARM Kernel Loader + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES ***************************************************************/ + +#include +#include +#include +#include + +#define PFN_SHIFT 12 +#define LARGE_PFN_SHIFT 20 + +#define PTE_BASE 0xC0000000 +#define PDE_BASE 0xC0400000 +#define PDR_BASE 0xFFD00000 +#define MMIO_BASE 0x10000000 +#define VECTOR_BASE 0xFFFF0000 + +#define LowMemPageTableIndex 0 +#define KernelPageTableIndex (KSEG0_BASE >> PDE_SHIFT) +#define StartupPtePageTableIndex (PTE_BASE >> PDE_SHIFT) +#define StartupPdePageTableIndex (PDE_BASE >> PDE_SHIFT) +#define MmioPageTableIndex (MMIO_BASE >> PDE_SHIFT) +#define PdrPageTableIndex (PDR_BASE >> PDE_SHIFT) +#define VectorPageTableIndex (VECTOR_BASE >> PDE_SHIFT) + +/* Converts a Physical Address into a Page Frame Number */ +#define PaToPfn(p) ((p) >> PFN_SHIFT) +#define PaToLargePfn(p) ((p) >> LARGE_PFN_SHIFT) +#define PaPtrToPfn(p) (((ULONG_PTR)(p)) >> PFN_SHIFT) + +/* Converts a Physical Address into a Coarse Page Table PFN */ +#define PaPtrToPdePfn(p) (((ULONG_PTR)(p)) >> CPT_SHIFT) + +typedef struct _KPDR_PAGE +{ + PAGE_DIRECTORY_ARM PageDir; // 0xC0400000 [0xFFD00000] + CHAR HyperSpace[233 * PAGE_SIZE]; // 0xC0404000 [0xFFD04000] + PAGE_TABLE_ARM KernelPageTable[3]; // 0xC04ED000 [0xFFDED000] + CHAR SharedData[PAGE_SIZE]; // 0xC04F0000 [0xFFDF0000] + CHAR KernelStack[KERNEL_STACK_SIZE]; // 0xC04F1000 [0xFFDF1000] + CHAR PanicStack[KERNEL_STACK_SIZE]; // 0xC04F4000 [0xFFDF4000] + CHAR InterruptStack[KERNEL_STACK_SIZE]; // 0xC04F7000 [0xFFDF7000] + CHAR InitialProcess[PAGE_SIZE]; // 0xC04FA000 [0xFFDFA000] + CHAR InitialThread[PAGE_SIZE]; // 0xC04FB000 [0xFFDFB000] + CHAR Prcb[PAGE_SIZE]; // 0xC04FC000 [0xFFDFC000] + PAGE_TABLE_ARM PageDirPageTable; // 0xC04FD000 [0xFFDFD000] + PAGE_TABLE_ARM VectorPageTable; // 0xC04FE000 [0xFFDFE000] + CHAR Pcr[PAGE_SIZE]; // 0xC04FF000 [0xFFDFF000] +} KPDR_PAGE, *PKPDR_PAGE; + +C_ASSERT(sizeof(KPDR_PAGE) == (1 * 1024 * 1024)); + +HARDWARE_PTE_ARMV6 TempPte; +HARDWARE_LARGE_PTE_ARMV6 TempLargePte; +HARDWARE_PDE_ARMV6 TempPde; +PKPDR_PAGE PdrPage; + +/* FUNCTIONS **************************************************************/ + +BOOLEAN +MempSetupPaging(IN ULONG StartPage, + IN ULONG NumberOfPages) +{ + return TRUE; +} + +VOID +MempUnmapPage(IN ULONG Page) +{ + return; +} + +VOID +MempDump(VOID) +{ + return; +} + +BOOLEAN +WinLdrMapSpecialPages(ULONG PcrBasePage) +{ + ULONG i; + PHARDWARE_PTE_ARMV6 PointerPte; + PHARDWARE_PDE_ARMV6 PointerPde; + PHARDWARE_LARGE_PTE_ARMV6 LargePte; + PFN_NUMBER Pfn; + + /* Setup the Startup PDE */ + LargePte = &PdrPage->PageDir.Pte[StartupPdePageTableIndex]; + TempLargePte.PageFrameNumber = PaToLargePfn((ULONG_PTR)&PdrPage->PageDir); + *LargePte = TempLargePte; + + /* Map-in the PDR */ + LargePte = &PdrPage->PageDir.Pte[PdrPageTableIndex]; + *LargePte = TempLargePte; + + /* After this point, any MiAddressToPde is guaranteed not to fault */ + + /* + * Link them in the Startup PDE. + * Note these are the entries in the PD at (MiAddressToPde(PTE_BASE)). + */ + PointerPde = &PdrPage->PageDir.Pde[StartupPtePageTableIndex]; + Pfn = PaPtrToPdePfn(&PdrPage->PageDirPageTable); + for (i = 0; i < 4; i++) + { + TempPde.PageFrameNumber = Pfn++; + *PointerPde++ = TempPde; + } + + /* + * Now map these page tables in PTE space (MiAddressToPte(PTE_BASE)). + * Note that they all live on a single page, since each is 1KB. + */ + PointerPte = &PdrPage->PageDirPageTable.Pte[0x300]; + TempPte.PageFrameNumber = PaPtrToPfn(&PdrPage->PageDirPageTable); + *PointerPte = TempPte; + + /* + * After this point, MiAddressToPte((PDE_BASE) to MiAddressToPte(PDE_TOP)) + * is guaranteed not to fault. + * Any subsequent page allocation will first need its page table created + * and mapped in the PTE_BASE first, then the page table itself will be + * editable through its flat PTE address. + */ + + /* Setup the Vector PDE */ + PointerPde = &PdrPage->PageDir.Pde[VectorPageTableIndex]; + TempPde.PageFrameNumber = PaPtrToPdePfn(&PdrPage->VectorPageTable); + *PointerPde = TempPde; + + /* Setup the Vector PTEs */ + PointerPte = &PdrPage->VectorPageTable.Pte[0xF0]; + TempPte.PageFrameNumber = 0; + *PointerPte = TempPte; + + /* TODO: Map in the kernel CPTs */ + return TRUE; +} + +VOID +WinLdrSetupForNt(IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PVOID *GdtIdt, + IN ULONG *PcrBasePage, + IN ULONG *TssBasePage) +{ + PKPDR_PAGE PdrPage = (PVOID)0xFFD00000; + + /* Load cache information */ + LoaderBlock->u.Arm.FirstLevelDcacheSize = FirstLevelDcacheSize; + LoaderBlock->u.Arm.FirstLevelDcacheFillSize = FirstLevelDcacheFillSize; + LoaderBlock->u.Arm.FirstLevelIcacheSize = FirstLevelIcacheSize; + LoaderBlock->u.Arm.FirstLevelIcacheFillSize = FirstLevelIcacheFillSize; + LoaderBlock->u.Arm.SecondLevelDcacheSize = SecondLevelDcacheSize; + LoaderBlock->u.Arm.SecondLevelDcacheFillSize = SecondLevelDcacheFillSize; + LoaderBlock->u.Arm.SecondLevelIcacheSize = SecondLevelIcacheSize; + LoaderBlock->u.Arm.SecondLevelIcacheFillSize = SecondLevelIcacheSize; + + /* Write initial context information */ + LoaderBlock->KernelStack = (ULONG_PTR)PdrPage->KernelStack; + LoaderBlock->KernelStack += KERNEL_STACK_SIZE; + LoaderBlock->u.Arm.PanicStack = (ULONG_PTR)PdrPage->PanicStack; + LoaderBlock->u.Arm.PanicStack += KERNEL_STACK_SIZE; + LoaderBlock->u.Arm.InterruptStack = (ULONG_PTR)PdrPage->InterruptStack; + LoaderBlock->u.Arm.InterruptStack += KERNEL_STACK_SIZE; + LoaderBlock->Prcb = (ULONG_PTR)PdrPage->Prcb; + LoaderBlock->Process = (ULONG_PTR)PdrPage->InitialProcess; + LoaderBlock->Thread = (ULONG_PTR)PdrPage->InitialThread; +} + +BOOLEAN +MempAllocatePageTables(VOID) +{ + ULONG i; + PHARDWARE_PTE_ARMV6 PointerPte; + PHARDWARE_PDE_ARMV6 PointerPde; + PHARDWARE_LARGE_PTE_ARMV6 LargePte; + PFN_NUMBER Pfn; + + /* Setup templates */ + TempPte.Accessed = TempPte.Valid = TempLargePte.LargePage = TempLargePte.Accessed = TempPde.Valid = 1; + + /* Allocate the 1MB "PDR" (Processor Data Region). Must be 1MB aligned */ + PdrPage = MmAllocateMemoryAtAddress(sizeof(KPDR_PAGE), (PVOID)0x700000, LoaderMemoryData); + + /* Setup the Low Memory PDE as an identity-mapped Large Page (1MB) */ + LargePte = &PdrPage->PageDir.Pte[LowMemPageTableIndex]; + *LargePte = TempLargePte; + + /* Setup the MMIO PDE as two identity mapped large pages -- the kernel will blow these away later */ + LargePte = &PdrPage->PageDir.Pte[MmioPageTableIndex]; + Pfn = PaToLargePfn(0x10000000); + for (i = 0; i < 2; i++) + { + TempLargePte.PageFrameNumber = Pfn++; + *LargePte++ = TempLargePte; + } + + /* Setup the Kernel PDEs */ + PointerPde = &PdrPage->PageDir.Pde[KernelPageTableIndex]; + Pfn = PaPtrToPdePfn(PdrPage->KernelPageTable); + for (i = 0; i < 12; i++) + { + TempPde.PageFrameNumber = Pfn; + *PointerPde++ = TempPde; + Pfn++; + } + + /* Setup the Kernel PTEs */ + PointerPte = PdrPage->KernelPageTable[0].Pte; + Pfn = 0; + for (i = 0; i < 3072; i++) + { + TempPte.PageFrameNumber = Pfn++; + *PointerPte++ = TempPte; + } + + /* Done */ + return TRUE; +} + +VOID +WinLdrSetProcessorContext(PVOID GdtIdt, + IN ULONG Pcr, + IN ULONG Tss) +{ + ARM_CONTROL_REGISTER ControlRegister; + ARM_TTB_REGISTER TtbRegister; + ARM_DOMAIN_REGISTER DomainRegister; + + /* Set the TTBR */ + TtbRegister.AsUlong = (ULONG_PTR)&PdrPage->PageDir; + ASSERT(TtbRegister.Reserved == 0); + KeArmTranslationTableRegisterSet(TtbRegister); + + /* Disable domains and simply use access bits on PTEs */ + DomainRegister.AsUlong = 0; + DomainRegister.Domain0 = ClientDomain; + KeArmDomainRegisterSet(DomainRegister); + + /* Enable ARMv6+ paging (MMU), caches and the access bit */ + ControlRegister = KeArmControlRegisterGet(); + ControlRegister.MmuEnabled = TRUE; + ControlRegister.ICacheEnabled = TRUE; + ControlRegister.DCacheEnabled = TRUE; + ControlRegister.ForceAp = TRUE; + ControlRegister.ExtendedPageTables = TRUE; + KeArmControlRegisterSet(ControlRegister); +} diff --git a/reactos/boot/freeldr/freeldr/windows/peloader.c b/reactos/boot/freeldr/freeldr/windows/peloader.c index 42ca170bb17..fae23d6b90c 100644 --- a/reactos/boot/freeldr/freeldr/windows/peloader.c +++ b/reactos/boot/freeldr/freeldr/windows/peloader.c @@ -56,7 +56,7 @@ WinLdrCheckForLoadedDll(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock, PLDR_DATA_TABLE_ENTRY DataTableEntry; LIST_ENTRY *ModuleEntry; - DPRINTM(DPRINT_PELOADER, "WinLdrCheckForLoadedDll: DllName %X, LoadedEntry: %X\n", + DPRINTM(DPRINT_PELOADER, "WinLdrCheckForLoadedDll: DllName %s, LoadedEntry: %X\n", DllName, LoadedEntry); /* Just go through each entry in the LoadOrderList and compare loaded module's @@ -277,7 +277,7 @@ WinLdrLoadImage(IN PCHAR FileName, Status = ArcOpen(FileName, OpenReadOnly, &FileId); if (Status != ESUCCESS) { - UiMessageBox("Can not open the file"); + //UiMessageBox("Can not open the file"); return FALSE; } diff --git a/reactos/boot/freeldr/freeldr/windows/winldr.c b/reactos/boot/freeldr/freeldr/windows/winldr.c index 4d9651518e9..dc210bd6a6d 100644 --- a/reactos/boot/freeldr/freeldr/windows/winldr.c +++ b/reactos/boot/freeldr/freeldr/windows/winldr.c @@ -37,6 +37,7 @@ extern char reactos_arc_strings[32][256]; extern BOOLEAN UseRealHeap; extern ULONG LoaderPagesSpanned; +extern BOOLEAN AcpiPresent; BOOLEAN WinLdrCheckForLoadedDll(IN OUT PLOADER_PARAMETER_BLOCK WinLdrBlock, @@ -196,6 +197,13 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock, Extension->MinorVersion = VersionToBoot & 0xFF; Extension->Profile.Status = 2; + /* Check if ACPI is present */ + if (AcpiPresent) + { + /* See KiRosFrldrLpbToNtLpb for details */ + Extension->AcpiTable = (PVOID)1; + } + /* Load drivers database */ strcpy(MiscFiles, BootPath); strcat(MiscFiles, "AppPatch\\drvmain.sdb"); @@ -224,7 +232,7 @@ WinLdrLoadDeviceDriver(PLOADER_PARAMETER_BLOCK LoaderBlock, PVOID DriverBase; // Separate the path to file name and directory path - sprintf(DriverPath, "%S", FilePath->Buffer); + snprintf(DriverPath, sizeof(DriverPath), "%wZ", FilePath); DriverNamePos = strrchr(DriverPath, '\\'); if (DriverNamePos != NULL) { @@ -253,7 +261,7 @@ WinLdrLoadDeviceDriver(PLOADER_PARAMETER_BLOCK LoaderBlock, } // It's not loaded, we have to load it - sprintf(FullPath,"%s%S", BootPath, FilePath->Buffer); + snprintf(FullPath, sizeof(FullPath), "%s%wZ", BootPath, FilePath); Status = WinLdrLoadImage(FullPath, LoaderBootDriver, &DriverBase); if (!Status) { @@ -320,6 +328,7 @@ WinLdrLoadBootDrivers(PLOADER_PARAMETER_BLOCK LoaderBlock, // Convert the RegistryPath and DTE addresses to VA since we are not going to use it anymore BootDriver->RegistryPath.Buffer = PaToVa(BootDriver->RegistryPath.Buffer); + BootDriver->FilePath.Buffer = PaToVa(BootDriver->FilePath.Buffer); BootDriver->LdrEntry = PaToVa(BootDriver->LdrEntry); NextBd = BootDriver->Link.Flink; @@ -590,7 +599,7 @@ LoadAndBootWindows(PCSTR OperatingSystemName, DbgPrint("Heeelooo\n"); /* Save final value of LoaderPagesSpanned */ - LoaderBlock->Extension->LoaderPagesSpanned = LoaderPagesSpanned; + LoaderBlockVA->Extension->LoaderPagesSpanned = LoaderPagesSpanned; DPRINTM(DPRINT_WINDOWS, "Hello from paged mode, KiSystemStartup %p, LoaderBlockVA %p!\n", KiSystemStartup, LoaderBlockVA); diff --git a/reactos/boot/freeldr/freeldr/windows/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/wlmemory.c index 668dea3c33d..bfa68ab904e 100644 --- a/reactos/boot/freeldr/freeldr/windows/wlmemory.c +++ b/reactos/boot/freeldr/freeldr/windows/wlmemory.c @@ -198,6 +198,10 @@ MempAddMemoryBlock(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, } } +#ifdef _M_ARM +#define PKTSS PVOID +#endif + BOOLEAN WinLdrTurnOnPaging(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, ULONG PcrBasePage, diff --git a/reactos/boot/freeldr/install/install.h b/reactos/boot/freeldr/install/install.h index beace9228b7..a2c5eff0fb9 100644 --- a/reactos/boot/freeldr/install/install.h +++ b/reactos/boot/freeldr/install/install.h @@ -18,7 +18,4 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __INSTALL_H -#define __INSTALL_H - -#endif // defined __INSTALL_H +#pragma once diff --git a/reactos/boot/freeldr/install/linux/finstext2.h b/reactos/boot/freeldr/install/linux/finstext2.h index b4aa6ae9118..12b3ee80a93 100644 --- a/reactos/boot/freeldr/install/linux/finstext2.h +++ b/reactos/boot/freeldr/install/linux/finstext2.h @@ -1,6 +1,4 @@ -#ifndef __FINSTEXT2_H -#define __FINSTEXT2_H - +#pragma once #define PACKED __attribute__((packed)) @@ -28,8 +26,4 @@ typedef struct unsigned char BootPartition; unsigned short BootSignature; -} PACKED EXT2_BOOTCODE, *PEXT2_BOOTCODE; - - - -#endif // defined __FINSTEXT2_H \ No newline at end of file +} PACKED EXT2_BOOTCODE, *PEXT2_BOOTCODE; \ No newline at end of file diff --git a/reactos/boot/freeldr/install/volume.h b/reactos/boot/freeldr/install/volume.h index f173a6a455c..26654fc3009 100644 --- a/reactos/boot/freeldr/install/volume.h +++ b/reactos/boot/freeldr/install/volume.h @@ -18,12 +18,9 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __VOLUME_H -#define __VOLUME_H +#pragma once BOOL OpenVolume(LPCTSTR lpszVolumeName); void CloseVolume(void); BOOL ReadVolumeSector(ULONG SectorNumber, PVOID SectorBuffer); BOOL WriteVolumeSector(ULONG SectorNumber, PVOID SectorBuffer); - -#endif // defined __VOLUME_H diff --git a/reactos/dll/cpl/access/access.h b/reactos/dll/cpl/access/access.h index 954b0940f68..88c29d2c8c7 100644 --- a/reactos/dll/cpl/access/access.h +++ b/reactos/dll/cpl/access/access.h @@ -1,5 +1,4 @@ -#ifndef __CPL_SYSDM_H -#define __CPL_SYSDM_H +#pragma once typedef LONG (CALLBACK *APPLET_INITPROC)(VOID); @@ -59,6 +58,4 @@ INT_PTR CALLBACK KeyboardPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM INT_PTR CALLBACK MousePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK SoundPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); -#endif /* __CPL_SYSDM_H */ - /* EOF */ diff --git a/reactos/dll/cpl/access/lang/de-DE.rc b/reactos/dll/cpl/access/lang/de-DE.rc index 3f8de377b94..50fb674e97b 100644 --- a/reactos/dll/cpl/access/lang/de-DE.rc +++ b/reactos/dll/cpl/access/lang/de-DE.rc @@ -23,7 +23,7 @@ BEGIN AUTOCHECKBOX "&Signalfunktion benutzen",IDC_TOGGLE_BOX,PROPSHEETPADDING(2),LABELLINE(20)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 PUSHBUTTON "Ei&nstellungen",IDC_TOGGLE_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(20)+2,PROPSHEETPADDING(15),14 - AUTOCHECKBOX "Extra Tastaturhilfe in &Programmen anzeigen ",IDC_KEYBOARD_EXTRA,PROPSHEETPADDING(1),LABELLINE(23)+3,PROPSHEETWIDTH-PROPSHEETPADDING(2),14 + AUTOCHECKBOX "Extra-Tastaturhilfe in &Programmen anzeigen ",IDC_KEYBOARD_EXTRA,PROPSHEETPADDING(1),LABELLINE(23)+3,PROPSHEETWIDTH-PROPSHEETPADDING(2),14 END @@ -75,7 +75,7 @@ CAPTION "Maus" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN GROUPBOX "Tastaturmaus",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) - LTEXT "Aktivieren Sie diese Option, um den Mauszeiger mit dem Nummernpad der Tastatur zu steuern.",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) + LTEXT "Aktivieren Sie diese Option, um den Mauszeiger mit den Nummerntasten der Tastatur zu steuern.",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) AUTOCHECKBOX "&Tastaturmaus aktivieren",IDC_MOUSE_BOX,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(20),14 PUSHBUTTON "&Einstellungen",IDC_MOUSE_BUTTON,PROPSHEETWIDTH-PROPSHEETPADDING(17),LABELLINE(5)+2,PROPSHEETPADDING(15),14 END @@ -112,12 +112,12 @@ CAPTION "Einstellungen f FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Tastenkombination",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) - LTEXT "Drcken Sie fnfmal die Umschalttaste um die Einrastfunktion zu aktivieren.",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) + LTEXT "Drcken Sie fnfmal die Umschalttaste, um die Einrastfunktion zu aktivieren.",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) AUTOCHECKBOX "Tastenkombination a&ktivieren",IDC_STICKY_ACTIVATE_CHECK,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETPADDING(17)+4,14 GROUPBOX "Optionen",-1,PROPSHEETPADDING(1),LABELLINE(9),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(4)+PROPSHEETPADDING(1) AUTOCHECKBOX "&Zum Einrasten Feststelltaste zweimal drcken.",IDC_STICKY_LOCK_CHECK,PROPSHEETPADDING(2),LABELLINE(10)+2,PROPSHEETWIDTH-PROPSHEETPADDING(4),14 - AUTOCHECKBOX "&Einrastfunktion deaktivieren wenn zwei Tasten gedrckt sind.",IDC_STICKY_UNLOCK_CHECK,PROPSHEETPADDING(2),LABELLINE(12),PROPSHEETWIDTH-PROPSHEETPADDING(4),14 + AUTOCHECKBOX "&Einrastfunktion deaktivieren, wenn zwei Tasten gedrckt sind.",IDC_STICKY_UNLOCK_CHECK,PROPSHEETPADDING(2),LABELLINE(12),PROPSHEETWIDTH-PROPSHEETPADDING(4),14 GROUPBOX "Mitteilungen",-1,PROPSHEETPADDING(1),LABELLINE(15),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(4)+PROPSHEETPADDING(1) AUTOCHECKBOX "&Ausgabe eines Tons wenn die Feststelltaste gedrckt wird.",IDC_STICKY_SOUND_CHECK,PROPSHEETPADDING(2),LABELLINE(16)+2,PROPSHEETWIDTH-PROPSHEETPADDING(4),14 @@ -130,7 +130,7 @@ END IDD_FILTERKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Anschlagverzgerung Einstellungen" +CAPTION "AnschlagverzgerungseEinstellungen" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Tastenkombination",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) @@ -150,13 +150,13 @@ BEGIN AUTOCHECKBOX "Status der Ansc&hlagverzgerung auf dem Bildschirm anzeigen.",IDC_FILTER_STATUS_CHECK,PROPSHEETPADDING(2),LABELLINE(20)+6,PROPSHEETWIDTH-PROPSHEETPADDING(4),10 DEFPUSHBUTTON "OK", IDOK, PROPSHEETWIDTH-111, PROPSHEETHEIGHT-21, 50, 14 - PUSHBUTTON "Abrechen", IDCANCEL, PROPSHEETWIDTH-57, PROPSHEETHEIGHT-21, 50, 14 + PUSHBUTTON "Abbrechen", IDCANCEL, PROPSHEETWIDTH-57, PROPSHEETHEIGHT-21, 50, 14 END IDD_TOGGLEKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Toggle Keys Einstellungen" +CAPTION "Toggle-Keys-Einstellungen" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Tastenkombination",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) @@ -170,14 +170,14 @@ END IDD_CONTRASTOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Hoher Konstrast Einstellungen" +CAPTION "Einstellungen fr hohen Konstrast" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Tastenkombination",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) LTEXT "Die Tastenkombination fr hohen Kontrast ist:\nDrcke .",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(3) AUTOCHECKBOX "&Whle Schnelltaste",IDC_CONTRAST_ACTIVATE_CHECK,PROPSHEETPADDING(2),LABELLINE(5)+2,PROPSHEETWIDTH-PROPSHEETPADDING(4),14 - GROUPBOX "Hoher Kontrast Farbschema",-1,PROPSHEETPADDING(1),LABELLINE(9),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(4)+PROPSHEETPADDING(1) + GROUPBOX "Hoher-Kontrast-Farbschema",-1,PROPSHEETPADDING(1),LABELLINE(9),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(4)+PROPSHEETPADDING(1) LTEXT "Derzeitiges Farbschema:",-1,PROPSHEETPADDING(2),LABELLINE(10)+2,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(1) COMBOBOX IDC_CONTRAST_COMBO, PROPSHEETPADDING(2), LABELLINE(11)+2, PROPSHEETWIDTH-PROPSHEETPADDING(4), LABELLINE(6), CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_VISIBLE | WS_TABSTOP @@ -189,7 +189,7 @@ END IDD_MOUSEKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Tastaturmaus Einstellungen" +CAPTION "Tastaturmaus-Einstellungen" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Tastenkombiation",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(6)+PROPSHEETPADDING(1) @@ -223,10 +223,10 @@ END IDD_BOUNCEKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Erweiterte Anschlagverzgerung Einstellungen" +CAPTION "Einstellungen fr die erweiterte Anschlagverzgerung" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Bounce Keys",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(5) + GROUPBOX "Tastenanschlge",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(5) LTEXT "&Tastenanschlge igorieren, die schneller wiederholt werden als:",-1,PROPSHEETPADDING(2),LABELLINE(2)+1,PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(2) COMBOBOX IDC_BOUNCE_TIME_COMBO, PROPSHEETPADDING(2), LABELLINE(3)+5, PROPSHEETWIDTH-PROPSHEETPADDING(4), LABELLINE(6), CBS_DROPDOWNLIST | WS_VSCROLL | WS_VISIBLE | WS_TABSTOP @@ -241,10 +241,10 @@ END IDD_REPEATKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Erweiterte Anschlagverzgerung Einstellungen" +CAPTION "Einstellungen fr die erweiterte Anschlagverzgerung" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Repeat Keys",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(12) + GROUPBOX "Tastenwiederholung",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(12) LTEXT "Tastatureinstellungen in der Systemsteuerung bergehen:",-1,PROPSHEETPADDING(2),LABELLINE(2),PROPSHEETWIDTH-PROPSHEETPADDING(4),LABELLINE(2) AUTORADIOBUTTON "&Keine Wiederholung",IDC_REPEAT_NOREPEAT_RADIO,PROPSHEETPADDING(2),LABELLINE(3)+3,78,LABELLINE(1),WS_GROUP @@ -273,7 +273,7 @@ END IDD_SERIALKEYSOPTIONS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "SerialKeys Einstellungen" +CAPTION "SerialKeys-Einstellungen" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Serial Keys",-1,PROPSHEETPADDING(1),LABELLINE(1),PROPSHEETWIDTH-PROPSHEETPADDING(2),LABELLINE(10) diff --git a/reactos/dll/cpl/access/resource.h b/reactos/dll/cpl/access/resource.h index 88f6ffa889e..04ab1183ddf 100644 --- a/reactos/dll/cpl/access/resource.h +++ b/reactos/dll/cpl/access/resource.h @@ -1,5 +1,4 @@ -#ifndef __CPL_RESOURCE_H -#define __CPL_RESOURCE_H +#pragma once /* metrics */ #define PROPSHEETWIDTH 246 @@ -113,6 +112,4 @@ #define IDC_SERIAL_PORT_COMBO 275 #define IDC_SERIAL_BAUD_COMBO 276 -#endif /* __CPL_RESOURCE_H */ - /* EOF */ diff --git a/reactos/dll/cpl/appwiz/appwiz.h b/reactos/dll/cpl/appwiz/appwiz.h index c243997817a..8ee2bd4c6b3 100644 --- a/reactos/dll/cpl/appwiz/appwiz.h +++ b/reactos/dll/cpl/appwiz/appwiz.h @@ -1,5 +1,4 @@ -#ifndef __CPL_APPWIZ_H -#define __CPL_APPWIZ_H +#pragma once #define COBJMACROS #include @@ -41,6 +40,4 @@ NewLinkHere(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2); void ShowLastWin32Error(HWND hWndOwner); -#endif /* __CPL_APPWIZ_H */ - /* EOF */ diff --git a/reactos/dll/cpl/appwiz/lang/de-DE.rc b/reactos/dll/cpl/appwiz/lang/de-DE.rc index fe55301c09f..b2c32d21b94 100644 --- a/reactos/dll/cpl/appwiz/lang/de-DE.rc +++ b/reactos/dll/cpl/appwiz/lang/de-DE.rc @@ -43,7 +43,7 @@ END STRINGTABLE BEGIN - IDS_CPLSYSTEMNAME "Programme Hinzufgen/Entfernen" + IDS_CPLSYSTEMNAME "Programme hinzufgen/entfernen" IDS_CPLSYSTEMDESCRIPTION "Installiert Programme und erstellt Verknpfungen." IDS_CREATE_SHORTCUT "Verknpfung erstellen" IDS_ERROR_NOT_FOUND "Die Datei %s konnte nicht gefunden werden." diff --git a/reactos/dll/cpl/appwiz/resource.h b/reactos/dll/cpl/appwiz/resource.h index e889fafe2f6..b0dda4080cf 100644 --- a/reactos/dll/cpl/appwiz/resource.h +++ b/reactos/dll/cpl/appwiz/resource.h @@ -1,5 +1,4 @@ -#ifndef __CPL_RESOURCE_H -#define __CPL_RESOURCE_H +#pragma once /* metrics */ #define PROPSHEETWIDTH 380 @@ -32,6 +31,4 @@ #define IDC_SHORTCUT_BROWSE 108 #define IDC_SHORTCUT_NAME 109 -#endif /* __CPL_RESOURCE_H */ - /* EOF */ diff --git a/reactos/dll/cpl/console/lang/de-DE.rc b/reactos/dll/cpl/console/lang/de-DE.rc index e01dc0ad68c..a6611419d53 100644 --- a/reactos/dll/cpl/console/lang/de-DE.rc +++ b/reactos/dll/cpl/console/lang/de-DE.rc @@ -20,7 +20,7 @@ GROUPBOX "Cursorgr CONTROL "&Klein", IDC_RADIO_SMALL_CURSOR, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 25, 90, 10 CONTROL "&Mittel", IDC_RADIO_MEDIUM_CURSOR, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 40, 90, 10 CONTROL "&Gro", IDC_RADIO_LARGE_CURSOR, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 90, 10 -GROUPBOX "Display Einstellungen", -1, 140, 15, 100, 70, WS_CHILD | WS_VISIBLE | WS_GROUP +GROUPBOX "Anzeigeeinstellungen", -1, 140, 15, 100, 70, WS_CHILD | WS_VISIBLE | WS_GROUP CONTROL "&Fenster", IDC_RADIO_DISPLAY_WINDOW, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 150, 35, 70, 10 CONTROL "V&ollbild", IDC_RADIO_DISPLAY_FULL, "Button", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 150, 50, 70, 10 GROUPBOX "Befehlsspeicher:", -1, 15, 90, 120, 70, WS_CHILD | WS_VISIBLE | WS_GROUP @@ -34,7 +34,7 @@ CHECKBOX "&Alte Duplikate l GROUPBOX "Bearbeitungsoptionen", -1, 140, 90, 100, 70, BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP -CHECKBOX "&QuickEdit Modus", IDC_CHECK_QUICK_EDIT, 150, 100, 70, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP +CHECKBOX "&QuickEdit-Modus", IDC_CHECK_QUICK_EDIT, 150, 100, 70, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP CHECKBOX "&Einfgemodus", IDC_CHECK_INSERT_MODE, 150, 120, 70, 15, WS_CHILD | WS_VISIBLE | WS_TABSTOP END @@ -53,7 +53,7 @@ LISTBOX IDC_LBOX_TYPE, 10, 120, 110, 50, LBS_DISABLENOSCROLL | WS_VSCROLL GROUPBOX "", IDC_GROUPBOX_FONT_NAME, 10, 155, 200, 50 CONTROL "", IDC_STATIC_SELECT_FONT_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 15, 165, 95, 35 LTEXT "Jedes Zeichen ist:", -1, 130, 165, 75, 10 -LTEXT "screen pixel breit\nscreen pixel hoch", -1, 140, 180, 65, 20 +LTEXT "Bildschirmpixe breit\nBildschirmpixel hoch", -1, 140, 180, 65, 20 LTEXT "", IDC_FONT_SIZE_X, 125, 180, 10, 10 LTEXT "", IDC_FONT_SIZE_Y, 125, 188, 10, 10 END @@ -147,5 +147,5 @@ BEGIN IDS_CPLDESCRIPTION "Konfiguriert die Konsoleneigenschaften." IDS_APPLY_SHORTCUT_ALL "Modifiziere die &Verknpfung, die das Fenster startete" IDS_SCREEN_TEXT "C:\ReactOS> dir\nSYSTEM 10-01-99 5:00\nSYSTEM32 10-01-99 5:00" - IDS_RASTERFONTS "Raster Schriften" + IDS_RASTERFONTS "Rasterschriften" END diff --git a/reactos/dll/cpl/console/resource.h b/reactos/dll/cpl/console/resource.h index e621cc60ea5..09ffcced27c 100644 --- a/reactos/dll/cpl/console/resource.h +++ b/reactos/dll/cpl/console/resource.h @@ -1,5 +1,4 @@ -#ifndef RESOURCE_H__ -#define RESOURCE_H__ +#pragma once #define IDC_CPLICON 40 #define IDS_CPLNAME 41 @@ -92,5 +91,3 @@ //string ids #define IDS_SCREEN_TEXT 700 #define IDS_RASTERFONTS 701 - -#endif diff --git a/reactos/dll/cpl/desk/desk.h b/reactos/dll/cpl/desk/desk.h index 8b1d9de7d90..a486eadbe65 100644 --- a/reactos/dll/cpl/desk/desk.h +++ b/reactos/dll/cpl/desk/desk.h @@ -1,5 +1,4 @@ -#ifndef __CPL_DESK_H__ -#define __CPL_DESK_H__ +#pragma once #define COBJMACROS #include @@ -96,6 +95,3 @@ HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY,LPCWSTR,UINT,IDataObject*); INT_PTR CALLBACK AdvGeneralPageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); - -#endif /* __CPL_DESK_H__ */ - diff --git a/reactos/dll/cpl/desk/lang/de-DE.rc b/reactos/dll/cpl/desk/lang/de-DE.rc index 4deba826591..d0829d9fbc0 100644 --- a/reactos/dll/cpl/desk/lang/de-DE.rc +++ b/reactos/dll/cpl/desk/lang/de-DE.rc @@ -124,7 +124,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Einstellungen" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Verschieben Sie die Monitor-Symbole, sodass sie der physikalischen Anordnung Ihrer Monitore entsprechen.",-1,3,1,240,16 + LTEXT "Verschieben Sie die Monitor-Symbole, so dass sie der physikalischen Anordnung Ihrer Monitore entsprechen.",-1,3,1,240,16 CONTROL "",IDC_SETTINGS_MONSEL,"MONITORSELWNDCLASS",WS_CHILD|WS_VISIBLE|WS_TABSTOP,3,20,240,82,WS_EX_CLIENTEDGE LTEXT "&Anzeige:",1820,3,106,30,8 LTEXT "",IDC_SETTINGS_DEVICE,9,115,224,8 @@ -178,8 +178,8 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_SLIDEEFFECT "Slide-Effekt" - IDS_FADEEFFECT "Fade-Effekt" + IDS_SLIDEEFFECT "Gleiten" + IDS_FADEEFFECT "Ausblenden" END STRINGTABLE DISCARDABLE diff --git a/reactos/dll/cpl/desk/lang/pl-PL.rc b/reactos/dll/cpl/desk/lang/pl-PL.rc index 0c4761b23e3..01d7c796d70 100644 --- a/reactos/dll/cpl/desk/lang/pl-PL.rc +++ b/reactos/dll/cpl/desk/lang/pl-PL.rc @@ -63,7 +63,7 @@ BEGIN WS_VISIBLE | WS_BORDER, 7, 7, 232, 120 LTEXT "Schemat kolorw", IDC_STATIC, 7, 140, 64, 7 COMBOBOX IDC_APPEARANCE_UI_ITEM, 7, 169, 120, 54, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "&Effects...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 + PUSHBUTTON "&Efekty...", IDC_APPEARANCE_EFFECTS, 182, 150, 56, 15 PUSHBUTTON "Zaawansowane", IDC_APPEARANCE_ADVANCED, 182, 170, 56, 15 END @@ -108,24 +108,24 @@ END IDD_EFFAPPEARANCE DIALOGEX DISCARDABLE 0, 0, 285, 185 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU EXSTYLE WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE -CAPTION "Effects" +CAPTION "Efekty" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "&Use the following transition effect for menus and tooltips:",IDC_EFFAPPEARANCE_ANIMATION,"button", + CONTROL "&Uyj nastpujcego efektu przejcia dla menu i etykiet narzdzi:",IDC_EFFAPPEARANCE_ANIMATION,"button", BS_AUTOCHECKBOX | WS_TABSTOP, 10, 5, 285, 19 COMBOBOX IDC_EFFAPPEARANCE_ANIMATIONTYPE, 20, 25, 80, 19 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_CHILD | WS_VSCROLL | WS_TABSTOP - CONTROL "U&se the following method to smooth edges of screen fonts:",IDC_EFFAPPEARANCE_SMOOTHING,"button", + CONTROL "U&yj nastpujcej metody wygadzania krawdzi czcionek ekranowych:",IDC_EFFAPPEARANCE_SMOOTHING,"button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 42, 285, 19 COMBOBOX IDC_EFFAPPEARANCE_SMOOTHINGTYPE, 20, 62, 80, 19 , CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_DISABLED - CONTROL "Us&e large icons",IDC_EFFAPPEARANCE_LARGEICONS,"button", + CONTROL "Uy&j duych ikon",IDC_EFFAPPEARANCE_LARGEICONS,"button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 80, 285, 19 - CONTROL "Show sh&adows under menus",IDC_EFFAPPEARANCE_SETDROPSHADOW,"button", + CONTROL "Pok&a cienie pod menu",IDC_EFFAPPEARANCE_SETDROPSHADOW,"button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 95, 285, 19 - CONTROL "Show &window contents while dragging",IDC_EFFAPPEARANCE_DRAGFULLWINDOWS,"button", + CONTROL "Poka za&warto okna podczas przecigania",IDC_EFFAPPEARANCE_DRAGFULLWINDOWS,"button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_DISABLED, 10, 110, 285, 19 - CONTROL "&Hide underlined letters for keyboard navigation until I press the Alt key",IDC_EFFAPPEARANCE_KEYBOARDCUES,"button", + CONTROL "U&kryj podkrelenie liter do nawigacji klawiatur dopki nie nacisn klawisza Alt",IDC_EFFAPPEARANCE_KEYBOARDCUES,"button", BS_AUTOCHECKBOX | WS_TABSTOP, 10, 125, 285, 19 - PUSHBUTTON "Cancel", IDCANCEL, 226, 165, 50, 14 + PUSHBUTTON "Anuluj", IDCANCEL, 226, 165, 50, 14 DEFPUSHBUTTON "OK", IDOK, 172, 165, 50, 14 END @@ -188,13 +188,13 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_SLIDEEFFECT "Slide effect" - IDS_FADEEFFECT "Fade effect" + IDS_SLIDEEFFECT "Efekt przewijania" + IDS_FADEEFFECT "Efekt przejcia" END STRINGTABLE DISCARDABLE BEGIN - IDS_STANDARDEFFECT "Standard" + IDS_STANDARDEFFECT "Standardowe" IDS_CLEARTYPEEFFECT "ClearType" END diff --git a/reactos/dll/cpl/desk/monslctl.h b/reactos/dll/cpl/desk/monslctl.h index 28326ea7683..7ee32440ae4 100644 --- a/reactos/dll/cpl/desk/monslctl.h +++ b/reactos/dll/cpl/desk/monslctl.h @@ -1,5 +1,4 @@ -#ifndef __MONSLCTL__H -#define __MONSLCTL__H +#pragma once /* Control extended styles */ #define MSLM_EX_ALLOWSELECTNONE 0x1 @@ -214,5 +213,3 @@ typedef struct _MONSL_MONNMMONITORCHANGING BOOL RegisterMonitorSelectionControl(IN HINSTANCE hInstance); VOID UnregisterMonitorSelectionControl(IN HINSTANCE hInstance); - -#endif /* __MONSLCTL__H */ diff --git a/reactos/dll/cpl/desk/resource.h b/reactos/dll/cpl/desk/resource.h index 54fa074dd39..ae02abac30f 100644 --- a/reactos/dll/cpl/desk/resource.h +++ b/reactos/dll/cpl/desk/resource.h @@ -1,5 +1,4 @@ -#ifndef __CPL_DESK_RESOURCE_H__ -#define __CPL_DESK_RESOURCE_H__ +#pragma once /* metrics */ #define PROPSHEETWIDTH 246 @@ -185,7 +184,3 @@ #define IDC_RESTART_RB 5002 #define IDC_WITHOUTREBOOT_RB 5003 #define IDC_ASKME_RB 5004 - -#endif /* __CPL_DESK_RESOURCE_H__ */ - - diff --git a/reactos/dll/cpl/hdwwiz/hdwwiz.h b/reactos/dll/cpl/hdwwiz/hdwwiz.h index b480ad10165..3712adb222a 100644 --- a/reactos/dll/cpl/hdwwiz/hdwwiz.h +++ b/reactos/dll/cpl/hdwwiz/hdwwiz.h @@ -1,5 +1,4 @@ -#ifndef __CPL_HDWWIZ_H -#define __CPL_HDWWIZ_H +#pragma once #include #include @@ -19,6 +18,4 @@ extern HINSTANCE hApplet; -#endif /* __CPL_HDWWIZ_H */ - /* EOF */ diff --git a/reactos/dll/cpl/hdwwiz/lang/de-DE.rc b/reactos/dll/cpl/hdwwiz/lang/de-DE.rc index 6ef031b23be..9fb5c2daac2 100644 --- a/reactos/dll/cpl/hdwwiz/lang/de-DE.rc +++ b/reactos/dll/cpl/hdwwiz/lang/de-DE.rc @@ -2,21 +2,21 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL IDD_STARTPAGE DIALOG DISCARDABLE 0, 0, 317, 186 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Wilkommen zum Hardware Assistenten", IDC_FINISHTITLE, 114, 8, 203, 24 + LTEXT "Wilkommen zum Hardwareassistenten", IDC_FINISHTITLE, 114, 8, 203, 24 LTEXT "Dieser Assistent untersttzt Sie bei:", -1, 114, 40, 182, 8 LTEXT "1) Software installieren, um die an den Computer angeschlossene Hardware zu untersttzen.", -1, 121, 56, 184, 16 LTEXT "2) Probleme lsen, die Sie mit Ihrer Hardware haben.", -1, 121, 78, 185, 16 ICON IDI_WARNINGICON, IDC_WARNINGICON, 124, 109, 20, 20 - LTEXT "Falls die Hardware mit einer Installations CD geliefert wurde, ist es empfehlenswert den Assistenten zu beenden und die Installations CD des Anbieters zu verwenden.", 503, 150, 106, 155, 50 - LTEXT "Klicken Sie ""Weiter"", um fortzufahren.", -1, 114, 166, 193, 8 + LTEXT "Falls die Hardware mit einer Installations-CD geliefert wurde, ist es empfehlenswert, den Assistenten zu beenden und die Installations-CD des Anbieters zu verwenden.", 503, 150, 106, 155, 50 + LTEXT "Klicken Sie auf ""Weiter"", um fortzufahren.", -1, 114, 166, 193, 8 END IDD_SEARCHPAGE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN LTEXT "", IDC_STATUSTEXT, 21, 8, 275, 32 @@ -25,7 +25,7 @@ END IDD_ISCONNECTEDPAGE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Ist die Hardware bereits am Computer angeschlossen?", -1, 20, 11, 275, 8 @@ -35,21 +35,21 @@ END IDD_PROBELISTPAGE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Whlen Sie aus der Liste ein installiertes Gert aus und klicken Sie auf ""Weiter"", um die Einstellungen zu berprfen und mgliche Probleme zu lsen.", -1, 21, 8, 275, 22 - LTEXT "Um Hardware zu installieren, die nicht in der Liste aufgelistet ist, klicken Sie ""Ein neues Gert hinzufgen.""", -1, 21, 32, 275, 24 + LTEXT "Um Hardware zu installieren, die nicht in der Liste aufgelistet ist, klicken Sie auf ""Ein neues Gert hinzufgen.""", -1, 21, 32, 275, 24 LTEXT "I&nstallierte Hardware:", -1, 21, 62, 140, 8 CONTROL "", IDC_PROBELIST, "SysListView32", WS_BORDER | WS_GROUP | WS_TABSTOP | LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHAREIMAGELISTS | LVS_NOCOLUMNHEADER, 21, 72, 275, 66 END IDD_SELECTWAYPAGE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Der Assistent kann automatisch Hardware suchen und diese installieren. Oder, falls Sie das zu installierende Gert genau kennen, knnen Sie es aus der Liste auswhlen.", -1, 21, 8, 280, 24 + LTEXT "Der Assistent kann automatisch Hardware suchen und diese installieren oder, falls Sie das zu installierende Gert genau kennen, knnen Sie es aus der Liste auswhlen.", -1, 21, 8, 280, 24 LTEXT "Wie wollen Sie den Assistenten fortsetzen?", -1, 23, 40, 275, 8 AUTORADIOBUTTON "Automatisch nach neuer Hardware &suchen und installieren (empfohlen)", IDC_AUTOINSTALL, 30, 55, 266, 8, WS_GROUP | NOT WS_TABSTOP AUTORADIOBUTTON "&Manuell aus der Liste ausgewhlte Hardware installieren (erweitert)", IDC_MANUALLYINST, 30, 70, 266, 8, NOT WS_TABSTOP @@ -57,7 +57,7 @@ END IDD_DETECTEDHWPAGE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN LTEXT "", IDC_STATUSTEXT, 21, 9, 275, 40 @@ -67,20 +67,20 @@ END IDD_HWTYPESPAGE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Wenn Sie die Hardwarekategorie, die Sie bentigen nicht finden, whlen Sie ""Alle Gerte"".", IDC_STATUSTEXT, 21, 9, 275, 18 - LTEXT "Bekannte &Hardware Typen:", IDC_HWTYPESTEXT, 21, 31, 180, 8 + LTEXT "Wenn Sie die Hardwarekategorie, die Sie bentigen, nicht finden, whlen Sie ""Alle Gerte"".", IDC_STATUSTEXT, 21, 9, 275, 18 + LTEXT "Bekannte &Hardwaretypen:", IDC_HWTYPESTEXT, 21, 31, 180, 8 CONTROL "", IDC_HWTYPESLIST, "SysListView32", WS_BORDER | WS_GROUP | WS_TABSTOP | LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHAREIMAGELISTS | LVS_NOCOLUMNHEADER, 21, 42, 275, 92 END IDD_PROGRESSPAGE DIALOG DISCARDABLE 0, 0, 317, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Der Hardware Suchvorgang kann mehere Minuten dauern.", -1, 21, 8, 275, 15 + LTEXT "Der Hardware-Suchvorgang kann mehrere Minuten dauern.", -1, 21, 8, 275, 15 LTEXT "Fortschitt:", IDC_TPROGRESSTEXT, 21, 25, 275, 8 CONTROL "", IDC_TPROGRESSBAR, "msctls_progress32", 0, 21, 37, 275, 14 LTEXT "", IDC_PROGRESSTEXT, 58, 58, 200, 8, SS_NOPREFIX @@ -89,21 +89,21 @@ END IDD_FINISHPAGE DIALOG DISCARDABLE 0, 0, 317, 186 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Hardware Assistent wird vervollstndigt", IDC_FINISHTITLE, 114, 8, 203, 24 - LTEXT "Der Hardware Assistent wurde erfolgreich abgeschlossen.", -1, 114, 32, 193, 19 + LTEXT "Hardwareassistent wird vervollstndigt", IDC_FINISHTITLE, 114, 8, 203, 24 + LTEXT "Der Hardwareassistent wurde erfolgreich abgeschlossen.", -1, 114, 32, 193, 19 LTEXT "", IDC_STATUSTEXT, 114, 70, 193, 92 LTEXT "Klicken Sie ""Beenden"", um den Assistenten zu schlieen.", -1, 114, 166, 192, 8 END IDD_ISFOUNDPAGE DIALOG DISCARDABLE 0, 0, 317, 186 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Hardware Assistent wird vervollstndigt", IDC_FINISHTITLE, 114, 8, 203, 24 + LTEXT "Hardwareassistent wird vervollstndigt", IDC_FINISHTITLE, 114, 8, 203, 24 LTEXT "Der Assistent fand folgende Hardware an ihrem Computer:", -1, 114, 32, 193, 19 LTEXT "Klicken Sie ""Beenden"", um den Assistenten zu schlieen.", -1, 114, 166, 132, 8 CONTROL "", IDC_FOUNDHARDWARELIST, "SysListView32", WS_BORDER | WS_GROUP | WS_TABSTOP | LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHAREIMAGELISTS, 114, 56, 193, 78 @@ -111,10 +111,10 @@ END IDD_HWSTATUSPAGE DIALOG DISCARDABLE 0, 0, 317, 186 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Hardware Assistent wird vervollstndigt", IDC_FINISHTITLE, 114, 8, 195, 28 + LTEXT "Hardwareassistent wird vervollstndigt", IDC_FINISHTITLE, 114, 8, 195, 28 LTEXT "Derzeitiger Status der ausgewhlten Hardware:", -1, 114, 40, 193, 19 EDITTEXT IDC_HWSTATUSEDIT, 114, 60, 193, 70, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | NOT WS_TABSTOP LTEXT "Klicken Sie ""Beenden"", um Hilfe zum Lsen von mglichen Problemen zu erhalten.", -1, 114, 136, 193, 16 @@ -123,10 +123,10 @@ END IDD_NOTCONNECTEDPAGE DIALOG DISCARDABLE 0, 0, 317, 186 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware Assistent" +CAPTION "Hardwareassistent" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Hardware Assistent kann nicht fortgesetzt werden", IDC_FINISHTITLE, 114, 8, 203, 28 + LTEXT "Hardwareassistent kann nicht fortgesetzt werden", IDC_FINISHTITLE, 114, 8, 203, 28 LTEXT "Um fortsetzen zu knnen, verbinden Sie folgende Hardware mit dem Computer.", -1, 114, 40, 193, 16 AUTOCHECKBOX "&Nach Beenden den Computer neustarten, um die Hardware anschlieen zu knnen.", IDC_TURNOFFCHECKBOX, 114, 64, 203, 20, BS_TOP | BS_MULTILINE LTEXT "In den meisten Fllen wird ReactOS die Hardware automatisch installieren, wenn Sie sie mit dem Computer verbinden. Andernfalls knnen Sie den Assistenten erneut starten, um die zu untersttzende Hardware zu installieren.", -1, 114, 98, 193, 32 @@ -139,7 +139,7 @@ BEGIN IDS_CPLDESCRIPTION "Installiert neue Hardwarekomponenten." IDS_SEARCHTITLE "Bitte warten Sie, whrend der Assistent neue Hardware sucht..." IDS_SEARCHTEXT "Dieser Assistent sucht nach Hardware, die vor kurzem an Ihren Computer angeschlossen, aber noch nicht installiert wurde." - IDS_ISCONNECTED "Ist die Hardware bereits verbunden?" + IDS_ISCONNECTED "Ist die Hardware bereits angeschlossen?" IDS_PROBELISTTITLE "Folgende Hardware ist bereits auf Ihrem Computer installiert" IDS_ADDNEWDEVICE "Ein neues Gert hinzufgen" IDS_SELECTWAYTITLE "Der Assistent kann Sie bei der Installation anderer Hardware untersttzen" diff --git a/reactos/dll/cpl/hdwwiz/resource.h b/reactos/dll/cpl/hdwwiz/resource.h index 98f8a9c6c75..1d5a832bf89 100644 --- a/reactos/dll/cpl/hdwwiz/resource.h +++ b/reactos/dll/cpl/hdwwiz/resource.h @@ -1,5 +1,4 @@ -#ifndef __CPL_RESOURCE_H -#define __CPL_RESOURCE_H +#pragma once /* Icons */ #define IDI_CPLICON 100 @@ -57,6 +56,4 @@ #define IDC_NOTCONNECTED 505 #define IDC_TURNOFFCHECKBOX 506 -#endif /* __CPL_RESOURCE_H */ - /* EOF */ diff --git a/reactos/dll/cpl/input/input.h b/reactos/dll/cpl/input/input.h index 3e2ca9fe3e4..edfe121878f 100644 --- a/reactos/dll/cpl/input/input.h +++ b/reactos/dll/cpl/input/input.h @@ -1,5 +1,4 @@ -#ifndef __CPL_INPUT_H -#define __CPL_INPUT_H +#pragma once #include #include @@ -66,6 +65,4 @@ GetHotkeys(LPTSTR szHotkey, LPTSTR szLangHotkey, LPTSTR szLayoutHotkey); void ShowLastWin32Error(HWND hWndOwner); -#endif /* __CPL_INPUT_H */ - /* EOF */ diff --git a/reactos/dll/cpl/input/lang/de-DE.rc b/reactos/dll/cpl/input/lang/de-DE.rc index c44f155bbb8..6412b5a6348 100644 --- a/reactos/dll/cpl/input/lang/de-DE.rc +++ b/reactos/dll/cpl/input/lang/de-DE.rc @@ -5,7 +5,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Einstellungen" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Whlen Sie die Dienste, die Sie fr die Eingabesprachen in der Liste verwenden wollen.\nVerwenden Sie Hinzufgen und Entfernen, um die Liste zu bearbeiten.", -1, 9, 6, 238, 25 + LTEXT "Whlen Sie die Dienste aus, die Sie fr die Eingabesprachen in der Liste verwenden wollen.\nVerwenden Sie Hinzufgen und Entfernen, um die Liste zu bearbeiten.", -1, 9, 6, 238, 25 CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | WS_VSCROLL | WS_TABSTOP | LVS_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101 PUSHBUTTON "&Als Standard", IDC_SET_DEFAULT, 101, 159, 144, 14 PUSHBUTTON "&Hinzufgen...", IDC_ADD_BUTTON, 27, 142, 70, 14 @@ -22,7 +22,7 @@ FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Um Caps Lock zu deaktivieren", -1, 7, 7, 258, 26 AUTORADIOBUTTON "Caps &Lock Taste drcken", IDC_PRESS_CL_KEY_RB, 14, 17, 120, 11, WS_GROUP - AUTORADIOBUTTON "&Shift Taste drcken", IDC_PRESS_SHIFT_KEY_RB, 144, 17, 120, 11, NOT WS_TABSTOP + AUTORADIOBUTTON "Um&schalttaste drcken", IDC_PRESS_SHIFT_KEY_RB, 144, 17, 120, 11, NOT WS_TABSTOP GROUPBOX "Schnelltasten fr Eingabesprachen", -1, 7, 37, 258, 95 LTEXT "Aktion", -1, 14, 47, 60, 9 RTEXT "Tasten&kombination", -1, 177, 47, 79, 9 @@ -57,7 +57,7 @@ BEGIN AUTORADIOBUTTON "&Strg", IDC_CTRL_LANG, 29, 31, 30, 11 AUTORADIOBUTTON "&Alt links", IDC_LEFT_ALT_LANG, 29, 45, 46, 12 AUTOCHECKBOX "&Tastaturlayout umschalten", IDC_SWITCH_KBLAYOUTS_CB, 16, 65, 141, 12 - LTEXT "Shift", -1, 74, 87, 27, 12 + LTEXT "Umschalt", -1, 74, 87, 27, 12 CTEXT "+", -1, 63, 87, 8, 9 AUTORADIOBUTTON "S&trg", IDC_CTRL_LAYOUT, 30, 81, 30, 11 AUTORADIOBUTTON "A< links", IDC_LEFT_ALT_LAYOUT, 30, 95, 44, 12 @@ -67,7 +67,7 @@ END IDD_INPUT_LANG_PROP DIALOGEX 20, 20, 227, 75 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Eingabesprache Einstellungen" +CAPTION "Eingabespracheneinstellungen" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Eingabesprache:", -1, 7, 7, 61, 8 @@ -94,8 +94,8 @@ BEGIN IDS_CONFIRMATION "Besttigung" IDS_LAYOUT_EXISTS "Dieses Layout existiert bereits." IDS_LAYOUT_EXISTS2 "Dieses Layout existiert bereits und kann nicht hinzugefgt werden." - IDS_CTRL_SHIFT "Strg+Shift" - IDS_LEFT_ALT_SHIFT "Alt links+Shift" + IDS_CTRL_SHIFT "Strg+Umschalt" + IDS_LEFT_ALT_SHIFT "Alt links+Umschalt" IDS_SWITCH_BET_INLANG "Zwischen Eingabesprachen umschalten" END @@ -171,7 +171,7 @@ BEGIN IDS_CHINESE_TRADITIONAL_BIG5CODE_LAYOUT, "Chinesisch (traditionell) - Big5-Code" IDS_CHINESE_TRADITIONAL_DAYI_LAYOUT, "Chinesisch (traditionell) - DaYi" IDS_CHINESE_TRADITIONAL_UNICODE_LAYOUT, "Chinesisch (traditionell) - Unicode" - IDS_CHINESE_TRADITIONAL_ALPHANUMERIC_LAYOUT, "Chinesisch (traditionell) - Alphanumerisch" + IDS_CHINESE_TRADITIONAL_ALPHANUMERIC_LAYOUT, "Chinesisch (traditionell) - Alphanummerisch" IDS_CHINESE_SIMPLIFIED_USKEYBOARD_LAYOUT, "Chinesisch (vereinfacht) - US-Tastatur" IDS_CHINESE_SIMPLIFIED_QUANPIN_LAYOUT, "Chinesisch (vereinfacht) - QuanPin" IDS_CHINESE_SIMPLIFIED_SHUANGPIN_LAYOUT, "Chinesisch (vereinfacht) - ShuangPin" @@ -220,7 +220,7 @@ BEGIN IDS_ARMENIAN_EASTERN_LAYOUT, "Ostarmenisch" IDS_ARMENIAN_WESTERN_LAYOUT, "Westarmenisch" IDS_GREEK_POLYTONIC_LAYOUT, "Griechisch (Polytonisch)" - IDS_USENG_TABLE_IBM_ARABIC238L_LAYOUT, "US-Englische Tabelle fr IBM Arabisch 238_L" + IDS_USENG_TABLE_IBM_ARABIC238L_LAYOUT, "US-englische Tabelle fr IBM Arabisch 238_L" IDS_FARSI_LAYOUT, "Farsi" IDS_GAELIC_LAYOUT, "Glisch" IDS_PORTUGUESE_BRAZIL_ABNT2_LAYOUT, "Portugiesisch (Brasilianisch, ABNT2)" @@ -231,12 +231,12 @@ BEGIN IDS_SYRIAC_PHONETIC_LAYOUT, "Syrisch (Phonetisch)" IDS_DIVEHI_PHONETIC_LAYOUT, "Divehi (Phonetisch)" IDS_DIVEHI_TYPEWRITER_LAYOUT, "Divehi (Schreibmaschine)" - IDS_BULGARIAN_PHONETIC_CLASSIC_LAYOUT, "Bulgarian Phonetic (Classic)" - IDS_BULGARIAN_PHONETIC_BDS_LAYOUT, "Bulgarian Phonetic (BDS)" - IDS_BULGARIAN_BDS_LAYOUT, "Bulgarian BDS 5237-1978" - IDS_GERMAN_RISTOME_LAYOUT, "German (RISTOME)" - IDS_GERMAN_NEO_11_LAYOUT, "German (NEO-1.1)" - IDS_GERMAN_DE_ERGO_LAYOUT, "German (de_ergo)" - IDS_BURMESE_LAYOUT, "Burmese" + IDS_BULGARIAN_PHONETIC_CLASSIC_LAYOUT, "Bulgarisch (klassisch phonetisch)" + IDS_BULGARIAN_PHONETIC_BDS_LAYOUT, "Bulgarisch BDS (phonetisch)" + IDS_BULGARIAN_BDS_LAYOUT, "Bulgarisch BDS 5237-1978" + IDS_GERMAN_RISTOME_LAYOUT, "Deutsch (RISTOME)" + IDS_GERMAN_NEO_11_LAYOUT, "Deutsch (NEO-1.1)" + IDS_GERMAN_DE_ERGO_LAYOUT, "Deutsch (de_ergo)" + IDS_BURMESE_LAYOUT, "Burmesisch" IDS_UKRAINIAN_STUDENT_LAYOUT, "Ukrainian (Student)" END diff --git a/reactos/dll/cpl/input/resource.h b/reactos/dll/cpl/input/resource.h index 9d6408a3d39..4147d2c3da5 100644 --- a/reactos/dll/cpl/input/resource.h +++ b/reactos/dll/cpl/input/resource.h @@ -1,5 +1,4 @@ -#ifndef __CPL_RESOURCE_H -#define __CPL_RESOURCE_H +#pragma once /* metrics */ #define PROPSHEETWIDTH 252 @@ -204,6 +203,4 @@ #define IDS_BURMESE_LAYOUT 5140 #define IDS_UKRAINIAN_STUDENT_LAYOUT 5141 -#endif /* __CPL_RESOURCE_H */ - /* EOF */ diff --git a/reactos/dll/cpl/intl/intl.h b/reactos/dll/cpl/intl/intl.h index 9e58f77a90a..12de475dc5e 100644 --- a/reactos/dll/cpl/intl/intl.h +++ b/reactos/dll/cpl/intl/intl.h @@ -1,5 +1,4 @@ -#ifndef __CPL_INTL_H -#define __CPL_INTL_H +#pragma once #include @@ -103,6 +102,4 @@ SetupApplet(HWND hwndDlg, LCID lcid); /* kblayouts.c */ VOID AddNewKbLayoutsByLcid(LCID Lcid); -#endif /* __CPL_INTL_H */ - /* EOF */ diff --git a/reactos/dll/cpl/intl/lang/de-DE.rc b/reactos/dll/cpl/intl/lang/de-DE.rc index cbb8ca8cd14..909652966c4 100644 --- a/reactos/dll/cpl/intl/lang/de-DE.rc +++ b/reactos/dll/cpl/intl/lang/de-DE.rc @@ -22,7 +22,7 @@ BEGIN EDITTEXT IDC_SHORTTIMESAMPLE_EDIT, 89, 131, 140, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | NOT WS_TABSTOP EDITTEXT IDC_FULLTIMESAMPLE_EDIT, 89, 146, 140, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | NOT WS_TABSTOP GROUPBOX "Geografische Lage", -1, 5, 172, 234, 55 - LTEXT "Whlen Sie Ihren Standort, sodass Dienste Sie mit lokalen Informationen, wie Nachrichten und Wettervorhersagen, versorgen knnen.", -1, 14, 184, 210, 24 + LTEXT "Whlen Sie Ihren Standort, so dass Dienste Sie mit lokalen Informationen, wie Nachrichten und Wettervorhersagen, versorgen knnen.", -1, 14, 184, 210, 24 COMBOBOX IDC_LOCATION_COMBO, 14, 210, 217, 160, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SORT END @@ -36,7 +36,7 @@ BEGIN PUSHBUTTON "&Details...", IDC_DETAIL_BUTTON, 177, 34, 54, 14 GROUPBOX "Zustzliche Sprachuntersttzung", -1, 5, 62, 234, 82 LTEXT "Die meisten Sprachen sind standardmig installiert. Um weitere Sprachen zu installieren, aktivieren Sie die unteren Kontollkstchen.", -1, 12, 72, 220, 18 - CHECKBOX "Dateien fr Sprachen mit &komplexer Schrift und Rechts-nach-Links Schreibstil installieren.", IDC_INST_FILES_FOR_RTOL_LANG, 12, 92, 215, 22, BS_MULTILINE + CHECKBOX "Dateien fr Sprachen mit &komplexer Schrift und Rechts-nach-Links-Schreibstil installieren.", IDC_INST_FILES_FOR_RTOL_LANG, 12, 92, 215, 22, BS_MULTILINE CHECKBOX "Dateien fr &ostasiatische Sprachen installieren.", IDC_INST_FILES_FOR_ASIAN, 12, 114, 180, 22, BS_MULTILINE END @@ -47,12 +47,12 @@ FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Sprache fr Unicode-Inkompatible Programme", -1, 5, 5, 234, 90 COMBOBOX IDC_LANGUAGE_COMBO, 14, 75, 217, 160, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP | CBS_SORT - LTEXT "Diese Einstellung ermglicht es Unicode-Inkompatiblen Programmen, Mens und Dialoge in der rtlichen Sprache darzustellen. Dies beeinflusst Unicode-Kompatible Programme nicht, wird aber fr alle Nutzer des Computers angewendet.", -1, 14, 18, 223, 33 - LTEXT "Whlen Sie eine Sprache aus, die der Sprachversion des Programmes entspricht, dass Sie nutzen wollen:", -1, 14, 55, 223, 18 + LTEXT "Diese Einstellung ermglicht es, Unicode-Inkompatiblen Programmen, Mens und Dialoge in der rtlichen Sprache darzustellen. Dies beeinflusst Unicode-Kompatible Programme nicht, wird aber fr alle Nutzer des Computers angewendet.", -1, 14, 18, 223, 33 + LTEXT "Whlen Sie eine Sprache aus, die der Sprachversion des Programmes entspricht, das Sie nutzen wollen:", -1, 14, 55, 223, 18 GROUPBOX "Codepage Konvertierungstabellen", -1, 5, 101, 234, 88 CONTROL "", IDC_CONV_TABLES, "SysListView32", LVS_REPORT | LVS_SORTASCENDING | LVS_NOCOLUMNHEADER | WS_BORDER | WS_TABSTOP, 14, 114, 217, 70 GROUPBOX "Standardeinstellungen fr Benutzerkonten", -1, 5, 193, 234, 30 - CHECKBOX "Einstellungen &auf das aktive und Standardkonto anwenden.", IDC_APPLY_CUR_USER_DEF_PROFILE, 12, 200, 220, 22, BS_MULTILINE + CHECKBOX "Einstellungen &auf das aktive und das Standardkonto anwenden.", IDC_APPLY_CUR_USER_DEF_PROFILE, 12, 200, 220, 22, BS_MULTILINE END IDD_NUMBERSPAGE DIALOGEX 0, 0, 246, 234 @@ -143,7 +143,7 @@ CAPTION "Datum" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Kalender", -1, 7, 7, 230, 74 - LTEXT "Eine Zweistellige Jahreszahl in folgendem Zeitraum interpretieren:", -1, 13, 18, 215, 8 + LTEXT "Eine zweistellige Jahreszahl in folgendem Zeitraum interpretieren:", -1, 13, 18, 215, 8 EDITTEXT IDC_FIRSTYEAR_EDIT, 13, 30, 36, 12, ES_READONLY | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_DISABLED LTEXT "und", -1, 55, 32, 17, 8 EDITTEXT IDC_SECONDYEAR_EDIT, 77, 30, 36, 12, ES_LEFT | ES_NUMBER | WS_GROUP @@ -178,7 +178,7 @@ FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Sortierung", -1, 7, 7, 230, 74 LTEXT "Sortiermethoden definieren die Sortierreihenfolge von Zeichen, Wrtern, Dateien und Ordnern.", -1, 14, 17, 220, 25 - LTEXT "Whlen Sie eine Sortiermethode fr Ihre Sprache:", -1, 14, 37, 220, 22 + LTEXT "Whlen Sie eine Sortiermethode fr Ihre Sprache aus:", -1, 14, 37, 220, 22 COMBOBOX IDC_SORTLIST_COMBO, 14, 56, 217, 83, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL END diff --git a/reactos/dll/cpl/intl/resource.h b/reactos/dll/cpl/intl/resource.h index de4582ec932..8491517acce 100644 --- a/reactos/dll/cpl/intl/resource.h +++ b/reactos/dll/cpl/intl/resource.h @@ -1,5 +1,4 @@ -#ifndef __CPL_RESOURCE_H -#define __CPL_RESOURCE_H +#pragma once #define IDC_FLAGS 2 @@ -76,6 +75,4 @@ #define IDS_CUSTOMIZE_TITLE 1002 #define IDS_SPAIN 1003 -#endif /* __CPL_RESOURCE_H */ - /* EOF */ diff --git a/reactos/dll/cpl/joy/joy.h b/reactos/dll/cpl/joy/joy.h index 4aacd59df6d..7e1b30c2916 100644 --- a/reactos/dll/cpl/joy/joy.h +++ b/reactos/dll/cpl/joy/joy.h @@ -1,5 +1,4 @@ -#ifndef __CPL_JOY_H -#define __CPL_JOY_H +#pragma once #include #include @@ -35,6 +34,4 @@ extern HINSTANCE hApplet; void ShowLastWin32Error(HWND hWndOwner); -#endif /* __CPL_JOY_H */ - /* EOF */ diff --git a/reactos/dll/cpl/joy/lang/de-DE.rc b/reactos/dll/cpl/joy/lang/de-DE.rc index 1d8ae576c14..e80697d6778 100644 --- a/reactos/dll/cpl/joy/lang/de-DE.rc +++ b/reactos/dll/cpl/joy/lang/de-DE.rc @@ -3,12 +3,12 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL IDD_PROPPAGEMAIN DIALOGEX 0, 0, 252, 205 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Gamecontroller" +CAPTION "Spielcontroller" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_CPLSYSTEM, -1, 7, 7, 20, 20 - LTEXT "ber diese Einstellungen knnen an den PC angeschlossene Gamecontroller konfiguriert werden.", -1, 33, 7, 214, 20, NOT WS_GROUP - GROUPBOX "I&nstallierte Gamecontroller", -1, 7, 34, 238, 117 + LTEXT "ber diese Einstellungen knnen an den PC angeschlossene Spielcontroller konfiguriert werden.", -1, 33, 7, 214, 20, NOT WS_GROUP + GROUPBOX "I&nstallierte Spielcontroller", -1, 7, 34, 238, 117 CONTROL "List1", IDC_CONTROLLER_LIST, "SysListView32", WS_BORDER | WS_GROUP | WS_TABSTOP | 0x0000808D, 14, 44, 224, 80 PUSHBUTTON "&Hinzufgen...", IDC_ADD_BUTTON, 35, 129, 65, 14 PUSHBUTTON "&Entfernen", IDC_REMOVE_BUTTON, 104, 129, 65, 14, WS_DISABLED @@ -21,15 +21,15 @@ END IDD_ADD DIALOGEX 0, 0, 265, 200 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_CAPTION EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Gamecontroller hinzufgen" +CAPTION "Spielcontroller hinzufgen" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_CPLSYSTEM, -1, 8, 7, 20, 20 - LTEXT "Whlen Sie einen Gamecontroller aus der Liste und klicken Sie auf OK. Wenn ihr Gamecontroller nicht in der Liste erscheint, klicken Sie auf Benutzerdefiniert.", -1, 35, 7, 210, 33 - LTEXT "&Gamecontroller:", -1, 8, 45, 126, 8 + LTEXT "Whlen Sie einen Spielcontroller aus der Liste und klicken Sie auf OK. Wenn ihr Spielcontroller nicht in der Liste erscheint, klicken Sie auf Benutzerdefiniert.", -1, 35, 7, 210, 33 + LTEXT "&Spielcontroller:", -1, 8, 45, 126, 8 LISTBOX IDC_GAME_CONTROLLERS_LIST, 7, 55, 251, 57, LBS_STANDARD | LBS_NOINTEGRALHEIGHT | LBS_WANTKEYBOARDINPUT | WS_HSCROLL | WS_TABSTOP AUTOCHECKBOX "&Ruder und Pedale aktivieren", IDC_ENABLE_RUDDERS_CHECKBOX, 7, 114, 105, 10, WS_GROUP - LTEXT "&Game Port:", -1, 7, 134, 38, 8, NOT WS_VISIBLE + LTEXT "&Gameport:", -1, 7, 134, 38, 8, NOT WS_VISIBLE COMBOBOX IDC_GAME_PORT_COMBO, 7, 147, 140, 50, CBS_DROPDOWNLIST | CBS_SORT | NOT WS_VISIBLE | WS_VSCROLL PUSHBUTTON "&Benutzerdefiniert...", IDC_CUSTOM_BUTTON, 195, 147, 63, 14 CONTROL "", -25525, "STATIC", SS_ETCHEDHORZ, 7, 170, 251, 1 @@ -40,7 +40,7 @@ END IDD_CUSTOM DIALOGEX 0, 0, 265, 183, 0 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_CAPTION EXSTYLE WS_EX_CONTEXTHELP -CAPTION "Benutzerdefinierter Gamecontroller" +CAPTION "Benutzerdefinierter Spielcontroller" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Spezielle Eigenschaften", -1, 7, 7, 245, 52 @@ -51,10 +51,10 @@ BEGIN GROUPBOX "&Achsen", -1, 7, 67, 116, 44, WS_GROUP COMBOBOX IDC_AXES_COMBO, 37, 79, 48, 50, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL AUTORADIOBUTTON "Ruder/Pedale", IDC_RUDDER_PEDALS_RADIO, 14, 97, 63, 10, NOT WS_VISIBLE - AUTORADIOBUTTON "Z Achse", IDC_Z_AXIS_RADIO, 81, 97, 40, 10, NOT WS_VISIBLE + AUTORADIOBUTTON "Z-Achse", IDC_Z_AXIS_RADIO, 81, 97, 40, 10, NOT WS_VISIBLE GROUPBOX "&Tasten", -1, 137, 67, 116, 44 COMBOBOX IDC_BUTTONS_COMBO, 178, 79, 48, 50, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL, WS_EX_CLIENTEDGE - AUTOCHECKBOX "Beinhaltet eine &Point of View Steuerung", IDC_INC_POINT_CHECKBOX, 7, 123, 140, 10 + AUTOCHECKBOX "Beinhaltet eine &Point-of-View-Steuerung", IDC_INC_POINT_CHECKBOX, 7, 123, 140, 10 LTEXT "C&ontrollername:", -1, 7, 139, 200, 9 EDITTEXT IDC_CONTROLLER_NAME_EDIT, 7, 150, 116, 15, ES_AUTOHSCROLL, WS_EX_CLIENTEDGE | WS_EX_STATICEDGE DEFPUSHBUTTON "OK", IDOK, 137, 150, 50, 14 @@ -77,8 +77,8 @@ END STRINGTABLE BEGIN - IDS_CPLSYSTEMNAME "Gamecontroller" - IDS_CPLSYSTEMDESCRIPTION "Hinzufgen, Entfernen und Konfigurieren von Gamecontroller Hardware, wie Joysticks und Gamepads." + IDS_CPLSYSTEMNAME "Spielcontroller" + IDS_CPLSYSTEMDESCRIPTION "Hinzufgen, Entfernen und Konfigurieren von Spielcontrollerhardware wie Joysticks und Gamepads." IDS_CONTROLLER "Controller" IDS_STATUS "Status" END diff --git a/reactos/dll/cpl/joy/resource.h b/reactos/dll/cpl/joy/resource.h index a2083da057f..17efe670339 100644 --- a/reactos/dll/cpl/joy/resource.h +++ b/reactos/dll/cpl/joy/resource.h @@ -1,5 +1,4 @@ -#ifndef __CPL_RESOURCE_H -#define __CPL_RESOURCE_H +#pragma once /* icons */ #define IDI_CPLSYSTEM 102 @@ -39,6 +38,4 @@ #define IDC_CONTROLLER_NAME_EDIT 1056 #define IDC_PREFERRED_DEV_COMBO 8195 -#endif /* __CPL_RESOURCE_H */ - /* EOF */ diff --git a/reactos/dll/cpl/liccpa/lang/de-DE.rc b/reactos/dll/cpl/liccpa/lang/de-DE.rc index cdb2910f528..b5d68134899 100644 --- a/reactos/dll/cpl/liccpa/lang/de-DE.rc +++ b/reactos/dll/cpl/liccpa/lang/de-DE.rc @@ -4,11 +4,11 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL IDD_PROPPAGE1 DIALOGEX DISCARDABLE 20, 40, 315, 104 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_OVERLAPPED | WS_CAPTION | WS_VISIBLE | WS_SYSMENU -CAPTION "Chose Licensing Mode" +CAPTION "Whlen sie den Lizenzmodus aus" FONT 8, "Helv" BEGIN - CONTROL "Client Lizenzierungs Modus", 100, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 4, 4, 239, 94 - CONTROL "Per Gert oder Per Benutzer", 102, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 13, 79, 107, 12 + CONTROL "Client-Lizenzierungsmodus", 100, "BUTTON", BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 4, 4, 239, 94 + CONTROL "Per Gert oder per Benutzer", 102, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 13, 79, 107, 12 CONTROL "Per Server. Nummer der gleichzeitigen Verbindungen:", 103, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE, 13, 38, 163, 9 CONTROL "Produkt:", 105, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE, 13, 20, 31, 8 CONTROL "", 106, "COMBOBOX", CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP, 49, 20, 171, 12 @@ -23,7 +23,7 @@ END STRINGTABLE BEGIN - IDS_CPLNAME_1 "Lizenz Manager" - IDS_CPLDESCRIPTION_1 "Lizenz Manager" + IDS_CPLNAME_1 "Lizenzmanager" + IDS_CPLDESCRIPTION_1 "Lizenzmanager" IDS_REACTOS "ReactOS - Freie Software" END diff --git a/reactos/dll/cpl/liccpa/liccpa.h b/reactos/dll/cpl/liccpa/liccpa.h index 817bd4fc80a..694663d2082 100644 --- a/reactos/dll/cpl/liccpa/liccpa.h +++ b/reactos/dll/cpl/liccpa/liccpa.h @@ -1,5 +1,4 @@ -#ifndef __CPL_SAMPLE_H -#define __CPL_SAMPLE_H +#pragma once typedef struct { @@ -11,6 +10,4 @@ typedef struct extern HINSTANCE hApplet; -#endif /* __CPL_SAMPLE_H */ - /* EOF */ diff --git a/reactos/dll/cpl/liccpa/resource.h b/reactos/dll/cpl/liccpa/resource.h index 917dc15c69f..b1cbbf74c6a 100644 --- a/reactos/dll/cpl/liccpa/resource.h +++ b/reactos/dll/cpl/liccpa/resource.h @@ -1,5 +1,4 @@ -#ifndef __CPL_RESOURCE_H -#define __CPL_RESOURCE_H +#pragma once /* ids */ @@ -13,6 +12,4 @@ #define IDC_OK 107 #define IDC_CANCEL 108 -#endif /* __CPL_RESOURCE_H */ - /* EOF */ diff --git a/reactos/dll/cpl/main/lang/de-DE.rc b/reactos/dll/cpl/main/lang/de-DE.rc index 97ed969f8b1..cc63724e1f1 100644 --- a/reactos/dll/cpl/main/lang/de-DE.rc +++ b/reactos/dll/cpl/main/lang/de-DE.rc @@ -91,7 +91,7 @@ STYLE DS_SHELLFONT | WS_CAPTION | WS_SYSMENU CAPTION "Schema speichern" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Cursorschema speichern unter:", -1, 5, 5, 100, 10 + LTEXT "Zeigerschema speichern unter:", -1, 5, 5, 100, 10 EDITTEXT IDC_EDIT_SCHEME_NAME, 5, 15, 180, 15, WS_CHILD | WS_VISIBLE | WS_GROUP PUSHBUTTON "&OK", IDOK, 60, 45, 50, 15 PUSHBUTTON "&Abbrechen", IDCANCEL, 115, 45, 50, 15 @@ -169,7 +169,7 @@ BEGIN IDS_REMOVE_TITLE "Lschen des Cursorschemas besttigen" IDS_REMOVE_TEXT "Soll das Cursorschema '%s' wirklich gelscht werden?" IDS_OVERWRITE_TITLE "Cursorschema berscheiben" - IDS_OVERWRITE_TEXT "Ein Cursorschema mit diesem Namen existiert bereits. Mchen Sie das existierende Cursorschema berscheiben?" + IDS_OVERWRITE_TEXT "Ein Cursorschema mit diesem Namen existiert bereits. Mchten Sie das existierende Cursorschema berscheiben?" IDS_ANIMATE_CURSOR "Animierter Cursor" END diff --git a/reactos/dll/cpl/main/main.h b/reactos/dll/cpl/main/main.h index 18d713c2c69..2c32c7e63b1 100644 --- a/reactos/dll/cpl/main/main.h +++ b/reactos/dll/cpl/main/main.h @@ -1,5 +1,4 @@ -#ifndef __CPL_MAIN_H -#define __CPL_MAIN_H +#pragma once typedef enum { @@ -46,6 +45,4 @@ PropSheetAddPage(HPROPSHEETPAGE hpage, LPARAM lParam); LONG APIENTRY MouseApplet(HWND hwnd, UINT uMsg, LPARAM wParam, LPARAM lParam); -#endif /* __CPL_MAIN_H */ - /* EOF */ diff --git a/reactos/dll/cpl/main/resource.h b/reactos/dll/cpl/main/resource.h index cc4d770defe..169c2ea67fe 100644 --- a/reactos/dll/cpl/main/resource.h +++ b/reactos/dll/cpl/main/resource.h @@ -1,5 +1,4 @@ -#ifndef __CPL_RESOURCE_H -#define __CPL_RESOURCE_H +#pragma once /* Icons */ #define IDC_CPLICON_1 100 @@ -102,6 +101,4 @@ #define IDC_TEXT_TRAIL_SHORT 2057 #define IDC_TEXT_TRAIL_LONG 2058 -#endif /* __CPL_RESOURCE_H */ - /* EOF */ diff --git a/reactos/dll/cpl/mmsys/lang/de-DE.rc b/reactos/dll/cpl/mmsys/lang/de-DE.rc index cfcfb47cbaf..81e3d437828 100644 --- a/reactos/dll/cpl/mmsys/lang/de-DE.rc +++ b/reactos/dll/cpl/mmsys/lang/de-DE.rc @@ -12,10 +12,10 @@ BEGIN CONTROL "",IDC_VOLUME_TRACKBAR, "msctls_trackbar32", TBS_AUTOTICKS | TBS_ENABLESELRANGE | TBS_BOTTOM | TBS_HORZ | WS_TABSTOP, 65, 45, 140, 14 LTEXT "Niedrig",-1,62,66,30,17 LTEXT "Hoch",-1,195,66,30,17 - CHECKBOX "Stu&mmschalten", IDC_MUTE_CHECKBOX, 50, 78, 140, 10 + CHECKBOX "Stu&mm schalten", IDC_MUTE_CHECKBOX, 50, 78, 140, 10 CHECKBOX "Lautstrkeregelungs-&Icon in der Taskleiste zeigen", IDC_ICON_IN_TASKBAR, 50, 92, 170, 10 PUSHBUTTON "Er&weitert", IDC_ADVANCED_BTN, 150,105,75,15 - GROUPBOX "Lautsprechereintellungen", IDC_SPEAKER_SET_BTN, 7,140,230,80 + GROUPBOX "Lautsprechereinstellungen", IDC_SPEAKER_SET_BTN, 7,140,230,80 CONTROL "", IDC_SPEAKIMG, "Static", SS_OWNERDRAW, 4, 160, 70, 70 LTEXT "Verwenden Sie die unteren Einstellungen um die Lautstre einzelner Gerte und andere Einstellungen zu verndern.",-1,70,155,150,36 PUSHBUTTON "&Lautstrke...", IDC_SPEAKER_VOL_BTN, 70,195,75,15 @@ -24,18 +24,18 @@ END IDD_SOUNDS DIALOGEX 0, 0, 246, 228 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Sounds" +CAPTION "Klnge" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Ein Soundschema ist eine Kollektion von Sounds, die bestimmten Programmereignissen in ReactOS zugordnet sind. Sie knnen ein existierendes Schema anwhlen oder ein modifiziertes speichern.",-1,8,7,230,40 - LTEXT "Sounds&chema:",-1,8,42,150,17 + LTEXT "Ein Klangschema ist eine Sammlung von Klngen, die bestimmten Programmereignissen in ReactOS zugordnet sind. Sie knnen ein existierendes Schema auswhlen oder ein modifiziertes speichern.",-1,8,7,230,40 + LTEXT "Klang&schema:",-1,8,42,150,17 COMBOBOX IDC_SOUND_SCHEME, 8, 53, 230, 46, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Sp&eichern unter...", IDC_SAVEAS_BTN, 120,70,65,15 PUSHBUTTON "&Lschen", IDC_DELETE_BTN, 188,70,50,15 - LTEXT "Um Sounds zu ndern, klicken Sie auf ein Programmereignis in der folgenden Liste und whlen Sie einen Sound. Sie knnen nderungen als neue Soundschemata speichern.",-1,8,90,230,40 - LTEXT "&Pogrammereignisse:",-1,8,118,150,17 + LTEXT "Um Klnge zu ndern, klicken Sie auf ein Programmereignis in der folgenden Liste und whlen Sie einen Klang aus. Sie knnen nderungen als neue Klangschemata speichern.",-1,8,90,230,40 + LTEXT "&Programmereignisse:",-1,8,118,150,17 CONTROL "", IDC_SCHEME_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, 8, 130, 230, 60, WS_EX_CLIENTEDGE - LTEXT "&Sounds:", IDC_TEXT_SOUND,8,194,80,17, WS_DISABLED + LTEXT "&Klnge:", IDC_TEXT_SOUND,8,194,80,17, WS_DISABLED COMBOBOX IDC_SOUND_LIST, 8, 205, 155, 146, CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_DISABLED PUSHBUTTON "", IDC_PLAY_SOUND, 168,205,15,15, WS_DISABLED | BS_ICON PUSHBUTTON "&Durchsuchen...", IDC_BROWSE_SOUND, 188,205,81,15, WS_DISABLED @@ -52,7 +52,7 @@ BEGIN COMBOBOX IDC_DEVICE_PLAY_LIST, 50, 30, 180, 46, CBS_DROPDOWNLIST PUSHBUTTON "&Lautstrke...", IDC_VOLUME1_BTN, 85,47,70,15 PUSHBUTTON "&Erweitert...", IDC_ADV2_BTN, 160,47,70,15 - GROUPBOX "Soundaufnahme", -1, 7,75,230,60 + GROUPBOX "Tonaufnahme", -1, 7,75,230,60 ICON IDI_MICROPHONE_ICON, IDI_MICROPHONE_ICON, 15,88,32,32 LTEXT "S&tandardgert:",-1,50,88,80,17 COMBOBOX IDC_DEVICE_REC_LIST, 50, 98, 180, 46, CBS_DROPDOWNLIST @@ -101,7 +101,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBL CAPTION "Schema speichern unter" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "&Dieses Soundschema speichern unter:", -1, 7, 7, 212, 9 + LTEXT "&Dieses Klangschema speichern unter:", -1, 7, 7, 212, 9 EDITTEXT 8960, 7, 17, 211, 14, ES_AUTOHSCROLL DEFPUSHBUTTON "OK", IDOK, 93, 36, 60, 14 PUSHBUTTON "Abbrechen", IDCANCEL, 157, 36, 60, 14 @@ -136,8 +136,8 @@ BEGIN LTEXT "Voll", 8498, 214, 56, 21, 9 LTEXT "Gut", 8499, 128, 123, 21, 10 LTEXT "Beste", 8500, 214, 123, 23, 9 - LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung fr das Capture Gert", 5399, 13, 145, 227, 21 - LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung fr das Render Gert", 5398, 13, 78, 227, 22 + LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung fr das Capture-Gert", 5399, 13, 145, 227, 21 + LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung fr das Render-Gert", 5398, 13, 78, 227, 22 END IDD_PERFORMANCE2 DIALOG 0, 0, 257, 218 @@ -157,8 +157,8 @@ BEGIN LTEXT "Voll", 8498, 217, 46, 19, 9 LTEXT "Gut", 8499, 125, 103, 24, 10 LTEXT "Beste", 8500, 217, 103, 19, 9 - LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung fr das Capture Gert", 5399, 13, 125, 222, 21 - LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung fr das Render Gert", 5398, 13, 68, 218, 24 + LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung fr das Capture-Gert", 5399, 13, 125, 222, 21 + LTEXT "Diese Zeichenfolge beschreibt die Hardwareeinstellung fr das Render-Gert", 5398, 13, 68, 218, 24 END IDD_SETUP1 DIALOG 0, 0, 227, 206 @@ -168,11 +168,11 @@ FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "ReactOS Audio", 10243, 7, 5, 213, 192 ICON 4393, 10241, 26, 26, 20, 20 - LTEXT "Dieser Computer kann keine Audiodaten abspielen, da der ReactOS Audio-Dienst nicht aktiviert ist.", 10245, 60, 25, 150, 40 + LTEXT "Dieser Computer kann keine Audiodaten abspielen, da der ReactOS-Audiodienst nicht aktiviert ist.", 10245, 60, 25, 150, 40 AUTOCHECKBOX "&ReactOS Audio aktivieren", 10253, 60, 68, 150, 9 LTEXT "Informationen", 10246, 58, 87, 150, 11 LTEXT "1. Sie mssen Administrator sein, um diesen Dienst aktivieren zu knnen. Wenn Sie nicht als Administrator angemeldet sind, werden Sie nach dem Administaratornamen und Passwort gefragt.", 10247, 60, 100, 150, 40 - LTEXT "2. Nach Aktivierung des ReactOS Audio Dienstes mssen Sie den Computer neustarten.", 10248, 60, 140, 150, 40 + LTEXT "2. Nach Aktivierung des ReactOS-Audiodienstes mssen Sie den Computer neu starten.", 10248, 60, 140, 150, 40 END IDD_MULTICHANNEL DIALOG 0, 0, 227, 218 @@ -224,17 +224,17 @@ FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "ReactOS Audio", 10259, 7, 5, 213, 192 ICON 4394, 10257, 25, 25, 20, 20 - LTEXT "Der ReactOS Audio Dienst ist nun aktiviert. Dennoch kann es sein, dass die Audiowiedergabe nicht richtig funktioniert, bis Sie ReactOS neugestartet haben. Wenn Sie jetzt neustarten wollen, speichern Sie Ihre Arbeit und beenden Sie alle Programme.", 10261, 60, 25, 150, 50 - LTEXT "Um ReactOS neuzustarten, klicken Sie OK.", 10262, 60, 75, 150, 20 - LTEXT "Wenn Sie abbrechen, mssen Sie spter neustarten, um sichergehen zu knnen, dass die Audiowiedergabe richtig funktioniert.", 10263, 60, 100, 150, 40 + LTEXT "Der ReactOS-Audiodienst ist nun aktiviert. Dennoch kann es sein, dass die Audiowiedergabe nicht richtig funktioniert, bis Sie ReactOS neu gestartet haben. Wenn Sie jetzt neu starten wollen, speichern Sie Ihre Arbeit und beenden Sie alle Programme.", 10261, 60, 25, 150, 50 + LTEXT "Um ReactOS neu zu starten, klicken Sie auf OK.", 10262, 60, 75, 150, 20 + LTEXT "Wenn Sie abbrechen, mssen Sie spter neu starten, um sichergehen zu knnen, dass die Audiowiedergabe richtig funktioniert.", 10263, 60, 100, 150, 40 END STRINGTABLE BEGIN - IDS_CPLNAME "Sounds und Audio Gerte" - IDS_CPLDESCRIPTION "ndert das Sound-Schema Ihres Computers, oder konfiguriert die Einstellungen fr Ihre Lautsprecher und Aufnahmegerte." + IDS_CPLNAME "Klnge und Audiogerte" + IDS_CPLDESCRIPTION "ndert das Klangschema Ihres Computers oder konfiguriert die Einstellungen fr Ihre Lautsprecher und Aufnahmegerte." IDS_NO_SOUND "(Kein)" - IDS_NO_DEVICES "No Devices" + IDS_NO_DEVICES "Keine Gerte" 5825 "Programmfehler" 5826 "Programm schlieen" diff --git a/reactos/dll/cpl/mmsys/mmsys.h b/reactos/dll/cpl/mmsys/mmsys.h index 87d313f4b8d..ed6c480a0c0 100644 --- a/reactos/dll/cpl/mmsys/mmsys.h +++ b/reactos/dll/cpl/mmsys/mmsys.h @@ -1,5 +1,4 @@ -#ifndef __CPL_MMSYS_H -#define __CPL_MMSYS_H +#pragma once //typedef LONG (CALLBACK *APPLET_PROC)(VOID); @@ -64,6 +63,4 @@ AudioDlgProc(HWND hwndDlg, WPARAM wParam, LPARAM lParam); -#endif /* __CPL_MMSYS_H */ - /* EOF */ diff --git a/reactos/dll/cpl/mmsys/resource.h b/reactos/dll/cpl/mmsys/resource.h index c8511da90c0..6423de9fe37 100644 --- a/reactos/dll/cpl/mmsys/resource.h +++ b/reactos/dll/cpl/mmsys/resource.h @@ -1,5 +1,4 @@ -#ifndef __CPL_RESOURCE_H -#define __CPL_RESOURCE_H +#pragma once /* Icons */ #define IDI_CPLICON 3004 @@ -77,6 +76,4 @@ #define IDS_NO_SOUND 1002 #define IDS_NO_DEVICES 1003 -#endif /* __CPL_RESOURCE_H */ - /* EOF */ diff --git a/reactos/dll/cpl/odbccp32/odbccp32.h b/reactos/dll/cpl/odbccp32/odbccp32.h index e1e7e3324e1..8a534c4b038 100644 --- a/reactos/dll/cpl/odbccp32/odbccp32.h +++ b/reactos/dll/cpl/odbccp32/odbccp32.h @@ -1,5 +1,4 @@ -#ifndef ODBCCP32_H__ // odbccp32.h -#define ODBCCP32_H__ +#pragma once #include #include @@ -8,5 +7,3 @@ extern HINSTANCE hApplet; extern HMODULE hLibrary; - -#endif /* end of ODBCCP32_H__ */ diff --git a/reactos/dll/cpl/powercfg/lang/de-DE.rc b/reactos/dll/cpl/powercfg/lang/de-DE.rc index ff72ddebaa9..b209830224f 100644 --- a/reactos/dll/cpl/powercfg/lang/de-DE.rc +++ b/reactos/dll/cpl/powercfg/lang/de-DE.rc @@ -47,7 +47,7 @@ BEGIN CONTROL "Slider1",IDC_ALARMBAR1,"msctls_trackbar32",TBS_HORZ | TBS_AUTOTICKS | WS_TABSTOP,30,40,170,15 LTEXT "100%",-1,215,40,25,10 - PUSHBUTTON "Alar&m Action...",-1,20,70,70,15,WS_DISABLED + PUSHBUTTON "Alar&maktion...",-1,20,70,70,15,WS_DISABLED LTEXT "Benachrichtigung:",-1,95,70,60,10 LTEXT "Unbekannt",IDC_ALARMMSG1,155,70,95,10 LTEXT "Aktion:",-1,95,80,45,10 @@ -63,7 +63,7 @@ BEGIN CONTROL "Slider1",IDC_ALARMBAR2,"msctls_trackbar32",TBS_HORZ | TBS_AUTOTICKS | WS_TABSTOP,30,140,170,15 LTEXT "100%",-1,215,140,25,10 - PUSHBUTTON "Alar&m Action...",-1,20,170,70,15,WS_DISABLED + PUSHBUTTON "Alar&maktion...",-1,20,170,70,15,WS_DISABLED LTEXT "Benachrichtigung:",-1,95,170,60,10 LTEXT "Unbekannt",IDC_ALARMMSG2,155,170,95,10 LTEXT "Aktion:",-1,95,180,45,10 @@ -122,7 +122,7 @@ BEGIN IDS_CPLNAME_1 "Energieoptionen" IDS_CPLDESCRIPTION_1 "Konfiguriert die Energiespareinstellungen fr den Computer." IDS_PROCENT "%i%%" - IDS_SOUND "Sound" + IDS_SOUND "Klang" IDS_TEXT "Text" IDS_CONFIG1 "Einstellungen fr Energieschema %s." IDS_CONFIG2 "Erweiterte Einstellungen fr %s." @@ -134,7 +134,7 @@ BEGIN IDS_PowerActionNone1 "Keine Aktion" IDS_PowerActionUnknown "Unbekannt" - IDS_PowerActionSleep "In den Standbymodus wechseln" + IDS_PowerActionSleep "In den Stromsparmodus wechseln" IDS_PowerActionHibernate "In den Ruhezustand wechseln" IDS_PowerActionShutdown "Computer herunterfahren" IDS_PowerActionRestart "Computer neu starten" @@ -159,6 +159,6 @@ BEGIN IDS_TIMEOUT15 "Nach 5 Stunden" IDS_TIMEOUT16 "Nie" - IDS_DEL_SCHEME "Sind Sie sicher, dass Sie das Energieschema lschen wollen?" + IDS_DEL_SCHEME "Sind Sie sich sicher, dass Sie das Energieschema lschen wollen?" IDS_DEL_SCHEME_TITLE "Schema lschen" END diff --git a/reactos/dll/cpl/powercfg/powercfg.h b/reactos/dll/cpl/powercfg/powercfg.h index 1a0fc7d24c1..27b54e596a8 100644 --- a/reactos/dll/cpl/powercfg/powercfg.h +++ b/reactos/dll/cpl/powercfg/powercfg.h @@ -1,5 +1,4 @@ -#ifndef POWERCFG_H -#define POWERCFG_H +#pragma once #include "powrprof.h" @@ -23,6 +22,4 @@ INT_PTR CALLBACK AlarmsDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP INT_PTR CALLBACK AdvancedDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK HibernateDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); -#endif /* __CPL_SAMPLE_H */ - /* EOF */ diff --git a/reactos/dll/cpl/powercfg/resource.h b/reactos/dll/cpl/powercfg/resource.h index e98c6023231..5993106ecfb 100644 --- a/reactos/dll/cpl/powercfg/resource.h +++ b/reactos/dll/cpl/powercfg/resource.h @@ -1,5 +1,4 @@ -#ifndef __CPL_RESOURCE_H -#define __CPL_RESOURCE_H +#pragma once /* metrics */ #define PROPSHEETWIDTH 246 @@ -124,6 +123,4 @@ #define IDS_CPLDESCRIPTION_1 901 -#endif /* __CPL_RESOURCE_H */ - /* EOF */ diff --git a/reactos/dll/cpl/sysdm/lang/de-DE.rc b/reactos/dll/cpl/sysdm/lang/de-DE.rc index e87d23df567..92282242d97 100644 --- a/reactos/dll/cpl/sysdm/lang/de-DE.rc +++ b/reactos/dll/cpl/sysdm/lang/de-DE.rc @@ -53,12 +53,12 @@ END IDD_SYSSETTINGS DIALOGEX 0, 0, 221, 106 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION -CAPTION "System Einstellungen" +CAPTION "Systemeinstellungen" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - GROUPBOX "Versions Info",IDC_STATIC,6,3,210,73 + GROUPBOX "Versionsinfo",IDC_STATIC,6,3,210,73 CONTROL "Als Workstation identifizieren",IDC_REPORTASWORKSTATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,57,110,10 - LTEXT "ReactOS ist als Server OS konzipiert und identifiziert sich auch als solches. Diese Einstellung ndert das Verhalten fr Anwendungen.",IDC_STATIC,15,15,183,41 + LTEXT "ReactOS ist als Serversystem konzipiert worden und identifiziert sich auch als solches. Diese Einstellung ndert das Verhalten fr Anwendungen.",IDC_STATIC,15,15,183,41 PUSHBUTTON "OK",IDOK,166,83,50,14 END @@ -68,9 +68,9 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Erweitert" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Administrator-Rechte werden fr die meisten dieser Einstellungen bentigt.", IDC_STATIC, 12, 5, 242, 8 + LTEXT "Administratorrechte werden fr die meisten dieser Einstellungen bentigt.", IDC_STATIC, 12, 5, 242, 8 GROUPBOX "Leistung", IDC_STATIC, 6, 18, 244, 50 - LTEXT "Mit Leistungs-Optionen knnen Sie einstellen, wie Programme Speicher benutzen sollen. Diese Einstellungen beeinflussen die Leistung ihres Computers.", IDC_STATIC, 16, 29, 210, 24 + LTEXT "Mit Leistungsoptionen knnen Sie einstellen, wie Programme Speicher benutzen sollen. Diese Einstellungen beeinflussen die Leistung ihres Computers.", IDC_STATIC, 16, 29, 210, 24 PUSHBUTTON "Einstellungen", IDC_PERFOR, 194, 48, 50, 14 GROUPBOX "Benutzerprofile", IDC_STATIC, 6,75,244,48 @@ -78,7 +78,7 @@ BEGIN PUSHBUTTON "Einstellungen", IDC_USERPROFILE, 194, 103, 50, 14 GROUPBOX "Starten und Wiederherstellen", IDC_STATIC, 6, 131, 244, 52 - LTEXT "Start- und Wiederherstellungs-Einstellungen regeln, wie der Computer gestartet werden soll und was passieren soll, wenn ein Fehler auftritt.", IDC_STATIC, 16, 144, 210, 27 + LTEXT "Start- und Wiederherstellungseinstellungen regeln, wie der Computer gestartet werden soll und was passieren soll, wenn ein Fehler auftritt.", IDC_STATIC, 16, 144, 210, 27 PUSHBUTTON "Einstellungen", IDC_STAREC, 194, 162, 50, 14 PUSHBUTTON "Umgebungsvariablen", IDC_ENVVAR, 84, 192, 80, 14 @@ -88,12 +88,12 @@ END IDD_HARDWAREPROFILES DIALOGEX 6, 18, 254, 234 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Hardware-Profile" +CAPTION "Hardwareprofile" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_HARDPROF, IDC_STATIC, 8, 11, 18, 20, SS_ICON - LTEXT "Sie knnen Hardware-Profile fr verschiedene Hardware-Konfigurationen einrichten. Beim Starten knnen Sie dann das Profil auswhlen, welches benutzt werden soll.", IDC_STATIC, 46, 11, 200, 25 - LTEXT "Verfgbare Hardware-Profile:", IDC_STATIC, 8, 41, 120, 8 + LTEXT "Sie knnen Hardwareprofile fr verschiedene Hardware-Konfigurationen einrichten. Beim Starten knnen Sie dann das Profil auswhlen, welches benutzt werden soll.", IDC_STATIC, 46, 11, 200, 25 + LTEXT "Verfgbare Hardwareprofile:", IDC_STATIC, 8, 41, 120, 8 LISTBOX IDC_HRDPROFLSTBOX, 8, 52, 215, 54, LBS_NOTIFY PUSHBUTTON "", IDC_HRDPROFUP, 232, 59, 15, 14, BS_ICON PUSHBUTTON "", IDC_HRDPROFDWN, 232, 79, 15, 14, BS_ICON @@ -102,11 +102,11 @@ BEGIN PUSHBUTTON "&Umbenennen", IDC_HRDPROFRENAME, 118, 106, 50, 14 PUSHBUTTON "&Lschen", IDC_HRDPROFDEL, 173, 106, 50, 14 - GROUPBOX "Hardware-Profil Auswahl", IDC_STATIC, 7, 130, 240, 75 + GROUPBOX "Hardwareprofil-Auswahl", IDC_STATIC, 7, 130, 240, 75 LTEXT "Wenn ReactOS startet:", IDC_STATIC, 14, 142, 210, 8 - AUTORADIOBUTTON "&Warten, bis ein Hardware-Profil gewhlt wird", IDC_HRDPROFWAIT, 14, 158, 170, 8, WS_GROUP - AUTORADIOBUTTON "&Das erste Profil aus der Liste whlen, wenn ich kein Profil innerhalb von", IDC_HRDPROFSELECT, 14, 173, 200, 8 - LTEXT "Sekunden gewhlt wird", IDC_STATIC, 65, 187, 80, 8 + AUTORADIOBUTTON "&Warten, bis ein Hardwareprofil gewhlt wird", IDC_HRDPROFWAIT, 14, 158, 170, 8, WS_GROUP + AUTORADIOBUTTON "&Das erste Profil aus der Liste auswhlen, wenn ich kein Profil innerhalb von", IDC_HRDPROFSELECT, 14, 173, 200, 8 + LTEXT "Sekunden gewhlt habe", IDC_STATIC, 65, 187, 80, 8 EDITTEXT IDC_HRDPROFEDIT, 25, 185, 35, 12 CONTROL "", IDC_HRDPROFUPDWN, "msctls_updown32", UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | WS_CHILD | WS_VISIBLE, 25, 185, 7, 10 @@ -136,7 +136,7 @@ CAPTION "Benutzerprofile" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_USERPROF, IDC_STATIC, 6, 11, 16, 16, SS_ICON - LTEXT "Benutzerprofile enthalten Desktop-Einstellungen und andere Informationen bezglich ihrer Anmeldung. Sie knnen unterschiedliche Profile, fr jeden Computer, den Sie benutzen, einrichten, oder aber auch ein einziges Profil whlen, welches auf jedem Computer gleich ist.", + LTEXT "Benutzerprofile enthalten Desktopeinstellungen und andere Informationen bezglich ihrer Anmeldung. Sie knnen unterschiedliche Profile, fr jeden Computer, den Sie benutzen, einrichten, oder aber auch ein einziges Profil whlen, welches auf jedem Computer gleich ist.", IDC_STATIC, 40, 7, 204, 40 LTEXT "Auf diesem Computer gespeicherte Profile:", IDC_STATIC, 16, 51, 204, 9 CONTROL "", IDC_USERPROFILE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, @@ -157,8 +157,8 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS CAPTION "Starten und Wiederherstellen" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "System-Start", IDC_STATIC, 7, 12, 238, 95 - LTEXT "Standard Betriebs&system:", IDC_STATIC, 14, 26, 100, 8 + GROUPBOX "Systemstart", IDC_STATIC, 7, 12, 238, 95 + LTEXT "Standard-Betriebs&system:", IDC_STATIC, 14, 26, 100, 8 COMBOBOX IDC_STRECOSCOMBO, 14, 37, 224, 46, CBS_DROPDOWNLIST AUTOCHECKBOX "&Anzeigedauer der Betriebssystem-Liste:", IDC_STRECLIST, 14, 56, 150, 8 EDITTEXT IDC_STRRECLISTEDIT, 185, 54, 30, 12, ES_NUMBER @@ -168,10 +168,10 @@ BEGIN EDITTEXT IDC_STRRECRECEDIT, 185, 68, 30, 12, ES_NUMBER CONTROL "", IDC_STRRECRECUPDWN, "msctls_updown32", UDS_WRAP | UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_NOTHOUSANDS | WS_CHILD | WS_VISIBLE, 0, 0, 8, 13 LTEXT "Sek.", IDC_STATIC, 221, 70, 14, 8 - LTEXT "Um die Start-Optionen manuell zu bearbeiten, klicken Sie auf ""Bearbeiten"".", IDC_STATIC, 14, 84, 170, 18 + LTEXT "Um die Startoptionen manuell zu bearbeiten, klicken Sie auf ""Bearbeiten"".", IDC_STATIC, 14, 84, 170, 18 PUSHBUTTON "Be&arbeiten", IDC_STRRECEDIT, 188, 87, 50, 14 - GROUPBOX "System-Fehler", IDC_STATIC, 7, 111, 238, 140 + GROUPBOX "Systemfehler", IDC_STATIC, 7, 111, 238, 140 AUTOCHECKBOX "Ereignis in das Systemprotokoll &eintragen", IDC_STRRECWRITEEVENT, 14, 124, 148, 10 AUTOCHECKBOX "Administrator-Warnmeldung &senden", IDC_STRRECSENDALERT, 14, 138, 148, 10 AUTOCHECKBOX "Automatisch &neu starten", IDC_STRRECRESTART, 14, 152, 145, 10 @@ -234,7 +234,7 @@ BEGIN PUSHBUTTON "&Neu...", IDC_USER_VARIABLE_NEW, 80, 90, 50, 14 PUSHBUTTON "Be&arbeiten...", IDC_USER_VARIABLE_EDIT, 134, 90, 50, 14 PUSHBUTTON "&Lschen", IDC_USER_VARIABLE_DELETE, 188, 90, 50, 14 - GROUPBOX "System-Variablen", IDC_STATIC, 7, 116, 238, 100 + GROUPBOX "Systemvariablen", IDC_STATIC, 7, 116, 238, 100 CONTROL "", IDC_SYSTEM_VARIABLE_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_NOSORTHEADER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP, 14, 129, 224, 58, WS_EX_CLIENTEDGE diff --git a/reactos/dll/cpl/sysdm/resource.h b/reactos/dll/cpl/sysdm/resource.h index b111e5c3171..f0918a35d9f 100644 --- a/reactos/dll/cpl/sysdm/resource.h +++ b/reactos/dll/cpl/sysdm/resource.h @@ -1,5 +1,4 @@ -#ifndef __CPL_RESOURCE_H -#define __CPL_RESOURCE_H +#pragma once #define IDC_STATIC -1 @@ -157,5 +156,3 @@ #define RTDATA 1503 #define IDS_DEVS 2000 - -#endif /* __CPL_RESOURCE_H */ diff --git a/reactos/dll/cpl/telephon/resource.h b/reactos/dll/cpl/telephon/resource.h index a4be13c91aa..9d2319a8bb0 100644 --- a/reactos/dll/cpl/telephon/resource.h +++ b/reactos/dll/cpl/telephon/resource.h @@ -1,5 +1,4 @@ -#ifndef __CPL_RESOURCE_H -#define __CPL_RESOURCE_H +#pragma once /* icons */ #define IDI_CPLSYSTEM 100 @@ -8,6 +7,4 @@ #define IDS_CPLSYSTEMNAME 1001 #define IDS_CPLSYSTEMDESCRIPTION 2001 -#endif /* __CPL_RESOURCE_H */ - /* EOF */ diff --git a/reactos/dll/cpl/timedate/lang/de-DE.rc b/reactos/dll/cpl/timedate/lang/de-DE.rc index 5b0e99f3c48..7221427d49f 100644 --- a/reactos/dll/cpl/timedate/lang/de-DE.rc +++ b/reactos/dll/cpl/timedate/lang/de-DE.rc @@ -40,11 +40,11 @@ END IDD_INETTIMEPAGE DIALOGEX 0, 0, 252, 146 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Internet Zeit" +CAPTION "Internetzeit" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN COMBOBOX IDC_SERVERLIST, 65, 22, 117, 136, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Automatisch mit einem Internet Zeitserver synchronisieren", IDC_AUTOSYNC, + CONTROL "Automatisch mit einem Internetzeitserver synchronisieren", IDC_AUTOSYNC, "Button", BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,11,7,241,10 LTEXT "Server:", -1, 34, 22, 28, 13 PUSHBUTTON "Jetzt updaten", IDC_UPDATEBUTTON, 187, 22, 49, 14 diff --git a/reactos/dll/cpl/timedate/resource.h b/reactos/dll/cpl/timedate/resource.h index 501500a14de..b420c359703 100644 --- a/reactos/dll/cpl/timedate/resource.h +++ b/reactos/dll/cpl/timedate/resource.h @@ -1,6 +1,4 @@ -#ifndef __CPL_RESOURCE_H -#define __CPL_RESOURCE_H - +#pragma once #define IDC_CPLICON 1 @@ -38,5 +36,3 @@ #define IDS_INETTIMENEXTSYNC 1007 #define IDS_INETTIMESYNCING 1008 #define IDS_INETTIMEERROR 1009 - -#endif /* __CPL_RESOURCE_H */ diff --git a/reactos/dll/cpl/timedate/timedate.h b/reactos/dll/cpl/timedate/timedate.h index 54915563b90..ced96a12eec 100644 --- a/reactos/dll/cpl/timedate/timedate.h +++ b/reactos/dll/cpl/timedate/timedate.h @@ -1,5 +1,4 @@ -#ifndef __CPL_SAMPLE_H -#define __CPL_SAMPLE_H +#pragma once #include #include @@ -112,6 +111,4 @@ typedef struct _NMMCCAUTOUPDATE BOOL RegisterMonthCalControl(IN HINSTANCE hInstance); VOID UnregisterMonthCalControl(IN HINSTANCE hInstance); -#endif /* __CPL_SAMPLE_H */ - /* EOF */ diff --git a/reactos/dll/cpl/usrmgr/lang/de-DE.rc b/reactos/dll/cpl/usrmgr/lang/de-DE.rc new file mode 100644 index 00000000000..c8fa221989d --- /dev/null +++ b/reactos/dll/cpl/usrmgr/lang/de-DE.rc @@ -0,0 +1,223 @@ +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + +/* + * 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 "Benutzer" +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 "Gruppen" +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 "Extra" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Dieser Platz wurde absichtlich leer gelassen.", 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 "Allgemein" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "", IDC_USER_GENERAL_NAME, 7, 12, 112, 8 + LTEXT "Voller Name:", -1, 7, 46, 63, 8 + EDITTEXT IDC_USER_GENERAL_FULL_NAME,77,43,168,13,ES_AUTOHSCROLL + LTEXT "Beschreibung:", -1, 7, 64, 63, 8 + EDITTEXT IDC_USER_GENERAL_DESCRIPTION,77,61,168,13,ES_AUTOHSCROLL + AUTOCHECKBOX "Benutzer muss das Passwort bei der ersten Anmeldung ändern",IDC_USER_GENERAL_FORCE_CHANGE,7,82,210,10 + AUTOCHECKBOX "Benutzer kann das Passwort nicht ändern",IDC_USER_GENERAL_CANNOT_CHANGE,7,95,210,10 + AUTOCHECKBOX "Passwort läuft nie ab",IDC_USER_GENERAL_NEVER_EXPIRES,7,108,210,10 + AUTOCHECKBOX "Konto ist deativiert",IDC_USER_GENERAL_DISABLED,7,121,210,10 + AUTOCHECKBOX "Konto ist gesperrt",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 "Mitgliedschaft" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Mitglied von:", -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 "Hzfg...", IDC_USER_MEMBERSHIP_ADD, 7, 197, 50, 14 + PUSHBUTTON "Entfernen", 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 "Profil" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Benutzerprofil", -1, 7, 7, 238, 54 + LTEXT "Profilpfad:", -1, 16, 22, 55, 8 + EDITTEXT IDC_USER_PROFILE_PATH, 78, 19, 160, 13, ES_AUTOHSCROLL + LTEXT "Anmeldeskript:", -1, 16, 40, 55, 8 + EDITTEXT IDC_USER_PROFILE_SCRIPT, 78, 37, 160, 13, ES_AUTOHSCROLL + + GROUPBOX "Benutzerverzeichnis", -1, 7, 68, 238, 54 + AUTORADIOBUTTON "Lokaler Pfad:", IDC_USER_PROFILE_LOCAL, 16, 83, 60, 10 + AUTORADIOBUTTON "Verbinden:", 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 "to:", -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 "Allgemein" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "", IDC_GROUP_GENERAL_NAME, 7, 12, 112, 8 + LTEXT "Beschreibung:", -1, 7, 45, 46, 8 + EDITTEXT IDC_GROUP_GENERAL_DESCRIPTION,65,42,180,13,ES_AUTOHSCROLL + LTEXT "Mitglieder:", -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 "Hzfg...", IDC_GROUP_GENERAL_ADD, 7, 197, 50, 14 + PUSHBUTTON "Entfernen", 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 "Passwort ändern" +FONT 8, "MS Shell Dlg" +BEGIN + EDITTEXT IDC_EDIT_PASSWORD1,107,7,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT "Neues Passwort!", -1,7,10,96,8 + EDITTEXT IDC_EDIT_PASSWORD2,107,25,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT "Passwort wiederholen:", -1,7,28,96,8 + DEFPUSHBUTTON "OK",IDOK,156,53,50,14 + PUSHBUTTON "Abbrechen",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 "Neuer Benutzer" +FONT 8, "MS Shell Dlg" +BEGIN + EDITTEXT IDC_USER_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL + RTEXT "Benutzername:", -1,7,10,96,8 + EDITTEXT IDC_USER_NEW_FULL_NAME,107,25,153,14,ES_AUTOHSCROLL + RTEXT "Vollständiger Name:", -1,7,28,96,8 + EDITTEXT IDC_USER_NEW_DESCRIPTION,107,43,153,14,ES_AUTOHSCROLL + RTEXT "Beschreibung:", -1,7,46,96,8 + EDITTEXT IDC_USER_NEW_PASSWORD1,107,67,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT "Passwort:", -1,7,70,96,8 + EDITTEXT IDC_USER_NEW_PASSWORD2,107,85,153,14,ES_AUTOHSCROLL | ES_PASSWORD + RTEXT "Passwort wiederholen:", -1,7,88,96,8 + AUTOCHECKBOX "Benutzer muss das Passwort bei der ersten Anmeldung ändern",IDC_USER_NEW_FORCE_CHANGE,7,109,200,10 + AUTOCHECKBOX "Benutzer kann das Passwort nicht ändern",IDC_USER_NEW_CANNOT_CHANGE,7,123,200,10,WS_DISABLED + AUTOCHECKBOX "Passwort läuft nie ab",IDC_USER_NEW_NEVER_EXPIRES,7,137,200,10,WS_DISABLED + AUTOCHECKBOX "Konto ist deaktiviert",IDC_USER_NEW_DISABLED,7,151,200,10 + DEFPUSHBUTTON "OK",IDOK,156,179,50,14,WS_DISABLED + PUSHBUTTON "Abbrechen",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 "Neue Gruppe" +FONT 8, "MS Shell Dlg" +BEGIN + EDITTEXT IDC_GROUP_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL + RTEXT "Gruppenname:", -1,7,10,96,8 + EDITTEXT IDC_GROUP_NEW_DESCRIPTION,107,25,153,14,ES_AUTOHSCROLL + RTEXT "Beschreibung:", -1,7,28,96,8 + DEFPUSHBUTTON "OK",IDOK,156,53,50,14,WS_DISABLED + PUSHBUTTON "Abbrechen",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 "Gruppenmitgliedschaft" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Mitglied von:", -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 "Abbrechen",IDCANCEL,195,197,50,14 +END + + +/* Menus */ + +IDM_POPUP_GROUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Neue Gruppe...", IDM_GROUP_NEW + END + POPUP "" + BEGIN + MENUITEM "Mitglied hinzufügen", IDM_GROUP_ADD_MEMBER, GRAYED + MENUITEM SEPARATOR + MENUITEM "Löschen", IDM_GROUP_DELETE + MENUITEM "Umbenennen", IDM_GROUP_RENAME + MENUITEM SEPARATOR + MENUITEM "Eigenschaften", IDM_GROUP_PROPERTIES + END +END + + +IDM_POPUP_USER MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "Neuer Benutzer...", IDM_USER_NEW + END + POPUP "" + BEGIN + MENUITEM "Passwort ändern", IDM_USER_CHANGE_PASSWORD + MENUITEM SEPARATOR + MENUITEM "Löschen", IDM_USER_DELETE + MENUITEM "Umbenennen", IDM_USER_RENAME + MENUITEM SEPARATOR + MENUITEM "Eigenschaften", IDM_USER_PROPERTIES + END +END + + +/* Strings */ + +STRINGTABLE +BEGIN + IDS_CPLNAME "Benutzerkonten" + IDS_CPLDESCRIPTION "Verwaltet Benutzer und Gruppen" +END + +STRINGTABLE +BEGIN + IDS_NAME "Name" + IDS_FULLNAME "Voller Name" + IDS_DESCRIPTION "Beschreibung" +END diff --git a/reactos/dll/cpl/usrmgr/resource.h b/reactos/dll/cpl/usrmgr/resource.h index 34910d48007..c0c7bfa97fb 100644 --- a/reactos/dll/cpl/usrmgr/resource.h +++ b/reactos/dll/cpl/usrmgr/resource.h @@ -1,5 +1,4 @@ -#ifndef __CPL_USRMGR_RESOURCE_H__ -#define __CPL_USRMGR_RESOURCE_H__ +#pragma once #include @@ -115,6 +114,3 @@ #define IDM_USER_DELETE 133 #define IDM_USER_RENAME 134 #define IDM_USER_PROPERTIES 135 - -#endif /* __CPL_USRMGR_RESOURCE_H__ */ - diff --git a/reactos/dll/cpl/usrmgr/rsrc.rc b/reactos/dll/cpl/usrmgr/rsrc.rc index 2102d74add8..5e400c134c0 100644 --- a/reactos/dll/cpl/usrmgr/rsrc.rc +++ b/reactos/dll/cpl/usrmgr/rsrc.rc @@ -1,6 +1,7 @@ #include #include "resource.h" +#include "lang/de-DE.rc" #include "lang/en-US.rc" #include "lang/pl-PL.rc" #include "lang/ru-RU.rc" diff --git a/reactos/dll/cpl/usrmgr/usrmgr.h b/reactos/dll/cpl/usrmgr/usrmgr.h index 9820606c3f5..13896cd147c 100644 --- a/reactos/dll/cpl/usrmgr/usrmgr.h +++ b/reactos/dll/cpl/usrmgr/usrmgr.h @@ -1,5 +1,4 @@ -#ifndef __CPL_DESK_H__ -#define __CPL_DESK_H__ +#pragma once #include #include @@ -45,6 +44,3 @@ CheckAccountName(HWND hwndDlg, /* userprops.c */ BOOL UserProperties(HWND hwndDlg); - -#endif /* __CPL_DESK_H__ */ - diff --git a/reactos/dll/directx/amstream/amstream.c b/reactos/dll/directx/amstream/amstream.c index 9e4d45aef04..f8ae2a6e39b 100644 --- a/reactos/dll/directx/amstream/amstream.c +++ b/reactos/dll/directx/amstream/amstream.c @@ -35,7 +35,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(amstream); typedef struct { - IAMMultiMediaStream lpVtbl; + const IAMMultiMediaStreamVtbl *lpVtbl; LONG ref; IGraphBuilder* pFilterGraph; IPin* ipin; @@ -63,7 +63,7 @@ HRESULT AM_create(IUnknown *pUnkOuter, LPVOID *ppObj) return E_OUTOFMEMORY; } - object->lpVtbl.lpVtbl = &AM_Vtbl; + object->lpVtbl = &AM_Vtbl; object->ref = 1; *ppObj = object; @@ -129,7 +129,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_GetMediaStream(IAMMultiMediaStream MSPID PurposeId; unsigned int i; - TRACE("(%p/%p)->(%p,%p)\n", This, iface, idPurpose, ppMediaStream); + TRACE("(%p/%p)->(%s,%p)\n", This, iface, debugstr_guid(idPurpose), ppMediaStream); for (i = 0; i < This->nbStreams; i++) { @@ -214,7 +214,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_Initialize(IAMMultiMediaStream* if IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; HRESULT hr = S_OK; - FIXME("(%p/%p)->(%x,%x,%p) partial stub!\n", This, iface, (DWORD)StreamType, dwFlags, pFilterGraph); + TRACE("(%p/%p)->(%x,%x,%p)\n", This, iface, (DWORD)StreamType, dwFlags, pFilterGraph); if (pFilterGraph) { @@ -238,9 +238,17 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_GetFilterGraph(IAMMultiMediaStream { IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; - FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppGraphBuilder); + TRACE("(%p/%p)->(%p)\n", This, iface, ppGraphBuilder); - return E_NOTIMPL; + if (!ppGraphBuilder) + return E_POINTER; + + if (This->pFilterGraph) + return IFilterGraph_QueryInterface(This->pFilterGraph, &IID_IGraphBuilder, (void**)ppGraphBuilder); + else + *ppGraphBuilder = NULL; + + return S_OK; } static HRESULT WINAPI IAMMultiMediaStreamImpl_GetFilter(IAMMultiMediaStream* iface, IMediaStreamFilter** ppFilter) @@ -260,7 +268,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_AddMediaStream(IAMMultiMediaStream IMediaStream* pStream; IMediaStream** pNewStreams; - FIXME("(%p/%p)->(%p,%p,%x,%p) partial stub!\n", This, iface, pStreamObject, PurposeId, dwFlags, ppNewStream); + FIXME("(%p/%p)->(%p,%s,%x,%p) partial stub!\n", This, iface, pStreamObject, debugstr_guid(PurposeId), dwFlags, ppNewStream); if (IsEqualGUID(PurposeId, &MSPID_PrimaryVideo)) hr = DirectDrawMediaStream_create((IMultiMediaStream*)iface, PurposeId, This->StreamType, &pStream); @@ -341,6 +349,14 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_OpenFile(IAMMultiMediaStream* ifac goto end; } + /* If Initialize was not called before, we do it here */ + if (!This->pFilterGraph) + { + ret = IAMMultiMediaStream_Initialize(iface, STREAMTYPE_READ, 0, NULL); + if (FAILED(ret)) + goto end; + } + ret = IFilterGraph_QueryInterface(This->pFilterGraph, &IID_IGraphBuilder, (void**)&This->GraphBuilder); if(ret != S_OK) { diff --git a/reactos/dll/directx/amstream/mediastream.c b/reactos/dll/directx/amstream/mediastream.c index bf197aadcf7..dc4ec642cf9 100644 --- a/reactos/dll/directx/amstream/mediastream.c +++ b/reactos/dll/directx/amstream/mediastream.c @@ -29,13 +29,14 @@ #include "wingdi.h" #include "amstream_private.h" -#include "ddstream.h" #include "amstream.h" +#include "ddstream.h" + WINE_DEFAULT_DEBUG_CHANNEL(amstream); typedef struct { - IMediaStream lpVtbl; + const IMediaStreamVtbl *lpVtbl; LONG ref; IMultiMediaStream* Parent; MSPID PurposeId; @@ -43,7 +44,7 @@ typedef struct { } IMediaStreamImpl; typedef struct { - IDirectDrawMediaStream lpVtbl; + const IDirectDrawMediaStreamVtbl *lpVtbl; LONG ref; IMultiMediaStream* Parent; MSPID PurposeId; @@ -57,7 +58,7 @@ HRESULT MediaStream_create(IMultiMediaStream* Parent, const MSPID* pPurposeId, S { IMediaStreamImpl* object; - TRACE("(%p,%p,%p)\n", Parent, pPurposeId, ppMediaStream); + TRACE("(%p,%s,%p)\n", Parent, debugstr_guid(pPurposeId), ppMediaStream); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMediaStreamImpl)); if (!object) @@ -66,7 +67,7 @@ HRESULT MediaStream_create(IMultiMediaStream* Parent, const MSPID* pPurposeId, S return E_OUTOFMEMORY; } - object->lpVtbl.lpVtbl = &MediaStream_Vtbl; + object->lpVtbl = &MediaStream_Vtbl; object->ref = 1; object->Parent = Parent; @@ -197,7 +198,7 @@ HRESULT DirectDrawMediaStream_create(IMultiMediaStream* Parent, const MSPID* pPu { IDirectDrawMediaStreamImpl* object; - TRACE("(%p,%p,%p)\n", Parent, pPurposeId, ppMediaStream); + TRACE("(%p,%s,%p)\n", Parent, debugstr_guid(pPurposeId), ppMediaStream); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMediaStreamImpl)); if (!object) @@ -206,7 +207,7 @@ HRESULT DirectDrawMediaStream_create(IMultiMediaStream* Parent, const MSPID* pPu return E_OUTOFMEMORY; } - object->lpVtbl.lpVtbl = &DirectDrawMediaStream_Vtbl; + object->lpVtbl = &DirectDrawMediaStream_Vtbl; object->ref = 1; object->Parent = Parent; diff --git a/reactos/dll/directx/amstream/mediastreamfilter.c b/reactos/dll/directx/amstream/mediastreamfilter.c index af335fdeafe..4a4d7123e16 100644 --- a/reactos/dll/directx/amstream/mediastreamfilter.c +++ b/reactos/dll/directx/amstream/mediastreamfilter.c @@ -36,7 +36,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(amstream); typedef struct { - IMediaStreamFilter lpVtbl; + const IMediaStreamFilterVtbl *lpVtbl; LONG ref; CRITICAL_SECTION csFilter; FILTER_STATE state; @@ -63,7 +63,7 @@ HRESULT MediaStreamFilter_create(IUnknown *pUnkOuter, LPVOID *ppObj) return E_OUTOFMEMORY; } - object->lpVtbl.lpVtbl = &MediaStreamFilter_Vtbl; + object->lpVtbl = &MediaStreamFilter_Vtbl; object->ref = 1; *ppObj = object; @@ -120,7 +120,7 @@ static ULONG WINAPI MediaStreamFilterImpl_Release(IMediaStreamFilter * iface) if (!refCount) { - This->lpVtbl.lpVtbl = NULL; + This->lpVtbl = NULL; HeapFree(GetProcessHeap(), 0, This); } diff --git a/reactos/dll/directx/amstream/regsvr.c b/reactos/dll/directx/amstream/regsvr.c index 028c68de754..9c328914749 100644 --- a/reactos/dll/directx/amstream/regsvr.c +++ b/reactos/dll/directx/amstream/regsvr.c @@ -456,6 +456,13 @@ static struct regsvr_coclass const coclass_list[] = { "Both" }, + { &CLSID_MediaStreamFilter, + "SFilter Class", + NULL, + "amstream.dll", + "Both" + }, + { NULL } /* list terminator */ }; diff --git a/reactos/dll/directx/bdaplgin/bdaplgin.cpp b/reactos/dll/directx/bdaplgin/bdaplgin.cpp new file mode 100644 index 00000000000..39ddb8a2ccb --- /dev/null +++ b/reactos/dll/directx/bdaplgin/bdaplgin.cpp @@ -0,0 +1,110 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/bdaplgin/classfactory.cpp + * PURPOSE: ClassFactory interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ + +#include "precomp.h" + +const GUID CBDADeviceControl_GUID = {STATIC_KSMETHODSETID_BdaChangeSync}; +const GUID CBDAPinControl_GUID = {0x0DED49D5, 0xA8B7, 0x4d5d, {0x97, 0xA1, 0x12, 0xB0, 0xC1, 0x95, 0x87, 0x4D}}; + +static INTERFACE_TABLE InterfaceTable[] = +{ + {&CBDADeviceControl_GUID, CBDADeviceControl_fnConstructor}, + {&CBDAPinControl_GUID, CBDAPinControl_fnConstructor}, + {NULL, NULL} +}; + +extern "C" +BOOL +WINAPI +DllMain( + HINSTANCE hInstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + CoInitialize(NULL); + +#ifdef BDAPLGIN_TRACE + OutputDebugStringW(L"BDAPLGIN::DllMain()\n"); +#endif + + DisableThreadLibraryCalls(hInstDLL); + break; + default: + break; + } + + return TRUE; +} + + +extern "C" +KSDDKAPI +HRESULT +WINAPI +DllUnregisterServer(void) +{ + return S_OK; +} + +extern "C" +KSDDKAPI +HRESULT +WINAPI +DllRegisterServer(void) +{ + return S_OK; +} + +KSDDKAPI +HRESULT +WINAPI +DllGetClassObject( + REFCLSID rclsid, + REFIID riid, + LPVOID *ppv) +{ + UINT i; + HRESULT hres = E_OUTOFMEMORY; + IClassFactory * pcf = NULL; + + if (!ppv) + return E_INVALIDARG; + + *ppv = NULL; + + for (i = 0; InterfaceTable[i].riid; i++) + { + if (IsEqualIID(*InterfaceTable[i].riid, rclsid)) + { + pcf = CClassFactory_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL); + break; + } + } + + if (!pcf) + { + return CLASS_E_CLASSNOTAVAILABLE; + } + + hres = pcf->QueryInterface(riid, ppv); + pcf->Release(); + + return hres; +} + +KSDDKAPI +HRESULT +WINAPI +DllCanUnloadNow(void) +{ + return S_OK; +} diff --git a/reactos/dll/directx/bdaplgin/bdaplgin.rbuild b/reactos/dll/directx/bdaplgin/bdaplgin.rbuild new file mode 100644 index 00000000000..0824323331b --- /dev/null +++ b/reactos/dll/directx/bdaplgin/bdaplgin.rbuild @@ -0,0 +1,33 @@ + + + + + + . + ntdll + kernel32 + advapi32 + ole32 + advapi32 + msvcrt + ksproxy + + -fno-exceptions + -fno-rtti + + + /GR- + + + bdaplgin.cpp + bdaplgin.rc + classfactory.cpp + controlnode.cpp + devicecontrol.cpp + digitaldemo.cpp + frequencyfilter.cpp + lnbinfo.cpp + pincontrol.cpp + signalstatistics.cpp + + diff --git a/reactos/dll/directx/bdaplgin/bdaplgin.rc b/reactos/dll/directx/bdaplgin/bdaplgin.rc new file mode 100644 index 00000000000..05b576c09de --- /dev/null +++ b/reactos/dll/directx/bdaplgin/bdaplgin.rc @@ -0,0 +1,12 @@ +#include + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS BDA Device Control Plug-in for MPEG2 based networks\0" +#define REACTOS_STR_INTERNAL_NAME "BdaPlgin.ax\0" +#define REACTOS_STR_ORIGINAL_FILENAME "BdaPlgin.ax\0" +#define REACTOS_STR_PRODUCT_VERSION "5.3.2600.3264\0" +#define REACTOS_STR_FILE_VERSION "5.3.2600.3264\0" + +#include diff --git a/reactos/dll/directx/bdaplgin/bdaplgin.spec b/reactos/dll/directx/bdaplgin/bdaplgin.spec new file mode 100644 index 00000000000..5baed04ed66 --- /dev/null +++ b/reactos/dll/directx/bdaplgin/bdaplgin.spec @@ -0,0 +1,4 @@ +@ stdcall DllCanUnloadNow() +@ stdcall DllGetClassObject(ptr ptr ptr) +@ stdcall DllRegisterServer() +@ stdcall DllUnregisterServer() diff --git a/reactos/dll/directx/bdaplgin/classfactory.cpp b/reactos/dll/directx/bdaplgin/classfactory.cpp new file mode 100644 index 00000000000..d6aaa3e8a18 --- /dev/null +++ b/reactos/dll/directx/bdaplgin/classfactory.cpp @@ -0,0 +1,105 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/bdaplgin/classfactory.cpp + * PURPOSE: ClassFactory interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; +const GUID IID_IClassFactory = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; + +class CClassFactory : public IClassFactory +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject); + HRESULT WINAPI LockServer(BOOL fLock); + + CClassFactory(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, IID *riidInst) : m_Ref(1), m_lpfnCI(lpfnCI), m_IID(riidInst) + {}; + + virtual ~CClassFactory(){}; + +protected: + LONG m_Ref; + LPFNCREATEINSTANCE m_lpfnCI; + IID * m_IID; +}; + +HRESULT +WINAPI +CClassFactory::QueryInterface( + REFIID riid, + LPVOID *ppvObj) +{ + *ppvObj = NULL; + if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) + { + *ppvObj = PVOID(this); + InterlockedIncrement(&m_Ref); + return S_OK; + } + return E_NOINTERFACE; +} + +HRESULT +WINAPI +CClassFactory::CreateInstance( + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID *ppvObject) +{ + *ppvObject = NULL; + + if ( m_IID == NULL || IsEqualCLSID(riid, *m_IID) || IsEqualCLSID(riid, IID_IUnknown)) + { + return m_lpfnCI(pUnkOuter, riid, ppvObject); + } + + return E_NOINTERFACE; +} + +HRESULT +WINAPI +CClassFactory::LockServer( + BOOL fLock) +{ + return E_NOTIMPL; +} + +IClassFactory * +CClassFactory_fnConstructor( + LPFNCREATEINSTANCE lpfnCI, + PLONG pcRefDll, + IID * riidInst) +{ + CClassFactory* factory = new CClassFactory(lpfnCI, pcRefDll, riidInst); + + if (!factory) + return NULL; + + if (pcRefDll) + InterlockedIncrement(pcRefDll); + + return (LPCLASSFACTORY)factory; +} diff --git a/reactos/dll/directx/bdaplgin/controlnode.cpp b/reactos/dll/directx/bdaplgin/controlnode.cpp new file mode 100644 index 00000000000..5cd98ccbdcb --- /dev/null +++ b/reactos/dll/directx/bdaplgin/controlnode.cpp @@ -0,0 +1,154 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/bdaplgin/controlnode.cpp + * PURPOSE: ControlNode interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ + +#include "precomp.h" + +const GUID IID_IKsPropertySet = {0x31efac30, 0x515c, 0x11d0, {0xa9,0xaa, 0x00,0xaa,0x00,0x61,0xbe,0x93}}; + +class CControlNode : public IUnknown +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + CControlNode(HANDLE hFile, ULONG NodeType, ULONG PinId) : m_Ref(0), m_hFile(hFile), m_NodeType(NodeType), m_PinId(PinId){}; + virtual ~CControlNode(){}; + +protected: + LONG m_Ref; + HANDLE m_hFile; + ULONG m_NodeType; + ULONG m_PinId; +}; + +HRESULT +STDMETHODCALLTYPE +CControlNode::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + *Output = NULL; + + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if(IsEqualGUID(refiid, IID_IBDA_FrequencyFilter)) + { + return CBDAFrequencyFilter_fnConstructor(m_hFile, m_NodeType, refiid, Output); + } + else if(IsEqualGUID(refiid, IID_IBDA_SignalStatistics)) + { + return CBDASignalStatistics_fnConstructor(m_hFile, m_NodeType, refiid, Output); + } + else if(IsEqualGUID(refiid, IID_IBDA_LNBInfo)) + { + return CBDALNBInfo_fnConstructor(m_hFile, m_NodeType, refiid, Output); + } + else if(IsEqualGUID(refiid, IID_IBDA_DigitalDemodulator)) + { + return CBDADigitalDemodulator_fnConstructor(m_hFile, m_NodeType, refiid, Output); + } +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CControlNode::QueryInterface: NoInterface for %s", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); +#endif + + return E_NOINTERFACE; +} + + +HRESULT +WINAPI +CControlNode_fnConstructor( + HANDLE hFile, + IBaseFilter * pFilter, + ULONG NodeType, + ULONG PinId, + REFIID riid, + LPVOID * ppv) +{ + WCHAR Buffer[100]; + HRESULT hr; + IPin * pPin = NULL; + IKsObject * pObject = NULL; + + // store pin id + swprintf(Buffer, L"%u", PinId); + + // try find target pin + hr = pFilter->FindPin(Buffer, &pPin); + + if (FAILED(hr)) + { +#ifdef BDAPLGIN_TRACE + swprintf(Buffer, L"CControlNode_fnConstructor failed find pin %lu with %lx\n", PinId, hr); + OutputDebugStringW(Buffer); +#endif + return hr; + } + + // query IKsObject interface + hr = pPin->QueryInterface(IID_IKsObject, (void**)&pObject); + +#ifdef BDAPLGIN_TRACE + swprintf(Buffer, L"CControlNode_fnConstructor get IID_IKsObject status %lx\n", hr); + OutputDebugStringW(Buffer); +#endif + + if (SUCCEEDED(hr)) + { + // get pin handle + hFile = pObject->KsGetObjectHandle(); + // release IKsObject interface + pObject->Release(); + } + // release IPin interface + pPin->Release(); + + // construct device control + CControlNode * handler = new CControlNode(hFile, NodeType, PinId); + +#ifdef BDAPLGIN_TRACE + OutputDebugStringW(L"CControlNode_fnConstructor\n"); +#endif + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/bdaplgin/devicecontrol.cpp b/reactos/dll/directx/bdaplgin/devicecontrol.cpp new file mode 100644 index 00000000000..661eba547a0 --- /dev/null +++ b/reactos/dll/directx/bdaplgin/devicecontrol.cpp @@ -0,0 +1,558 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/bdaplgin/classfactory.cpp + * PURPOSE: ClassFactory interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ + +#include "precomp.h" + +const GUID CLSID_DVBTNetworkProvider = {0x216c62df, 0x6d7f, 0x4e9a, {0x85, 0x71, 0x5, 0xf1, 0x4e, 0xdb, 0x76, 0x6a}}; +const GUID IID_IAC3Filter = {0xe4539501, 0xc609, 0x46ea, {0xad, 0x2a, 0x0e, 0x97, 0x00, 0x24, 0x56, 0x83}}; +const GUID IID_IAsyncReader = {0x56A868AA, 0x0AD4, 0x11CE, {0xB0, 0x3A, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70}}; +const GUID IID_IMatrixMixer = {0xafc57835, 0x2fd1, 0x4541, {0xa6, 0xd9, 0x0d, 0xb7, 0x18, 0x56, 0xe5, 0x89}}; +const GUID IID_IBDA_NetworkProvider = {0xfd501041, 0x8ebe, 0x11ce, {0x81, 0x83, 0x00, 0xaa, 0x00, 0x57, 0x7d, 0xa2}}; +const GUID IID_IAMOpenProgress = {0x8E1C39A1, 0xDE53, 0x11cf, {0xAA, 0x63, 0x00, 0x80, 0xC7, 0x44, 0x52, 0x8D}}; +const GUID IID_IDistributorNotify = {0x56a868af, 0x0ad4, 0x11ce, {0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}}; +const GUID IID_IBDA_DeviceControl = {0xFD0A5AF3, 0xB41D, 0x11d2, {0x9C, 0x95, 0x00, 0xC0, 0x4F, 0x79, 0x71, 0xE0}}; +const GUID IID_IBDA_Topology = {0x79B56888, 0x7FEA, 0x4690, {0xB4, 0x5D, 0x38, 0xFD, 0x3C, 0x78, 0x49, 0xBE}}; +const GUID IID_IKsObject = {0x423c13a2, 0x2070, 0x11d0, {0x9e, 0xf7, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1}}; +const GUID KSPROPSETID_BdaTopology = {0xa14ee835, 0x0a23, 0x11d3, {0x9c, 0xc7, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}}; +const GUID KSMETHODSETID_BdaDeviceConfiguration = {0x71985f45, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}}; +const GUID IID_IBaseFilter = {0x56a86895, 0x0ad4, 0x11ce, {0xb0,0x3a, 0x00,0x20,0xaf,0x0b,0xa7,0x70}}; +const GUID KSMETHODSETID_BdaChangeSync = {0xfd0a5af3, 0xb41d, 0x11d2, {0x9c, 0x95, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}}; + +class CBDADeviceControl : public IBDA_DeviceControl, + public IBDA_Topology +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + // IBDA_DeviceControl methods + HRESULT STDMETHODCALLTYPE StartChanges( void); + HRESULT STDMETHODCALLTYPE CheckChanges( void); + HRESULT STDMETHODCALLTYPE CommitChanges( void); + HRESULT STDMETHODCALLTYPE GetChangeState(ULONG *pState); + + // IBDA_Topology methods + HRESULT STDMETHODCALLTYPE GetNodeTypes(ULONG *pulcNodeTypes, ULONG ulcNodeTypesMax, ULONG * rgulNodeTypes); + HRESULT STDMETHODCALLTYPE GetNodeDescriptors(ULONG *ulcNodeDescriptors, ULONG ulcNodeDescriptorsMax, BDANODE_DESCRIPTOR * rgNodeDescriptors); + HRESULT STDMETHODCALLTYPE GetNodeInterfaces(ULONG ulNodeType, ULONG *pulcInterfaces, ULONG ulcInterfacesMax, GUID * rgguidInterfaces); + HRESULT STDMETHODCALLTYPE GetPinTypes(ULONG *pulcPinTypes, ULONG ulcPinTypesMax, ULONG *rgulPinTypes); + HRESULT STDMETHODCALLTYPE GetTemplateConnections(ULONG *pulcConnections, ULONG ulcConnectionsMax, BDA_TEMPLATE_CONNECTION * rgConnections); + HRESULT STDMETHODCALLTYPE CreatePin(ULONG ulPinType, ULONG *pulPinId); + HRESULT STDMETHODCALLTYPE DeletePin(ULONG ulPinId); + HRESULT STDMETHODCALLTYPE SetMediaType(ULONG ulPinId, AM_MEDIA_TYPE *pMediaType); + HRESULT STDMETHODCALLTYPE SetMedium(ULONG ulPinId, REGPINMEDIUM *pMedium); + HRESULT STDMETHODCALLTYPE CreateTopology(ULONG ulInputPinId, ULONG ulOutputPinId); + HRESULT STDMETHODCALLTYPE GetControlNode(ULONG ulInputPinId, ULONG ulOutputPinId, ULONG ulNodeType, IUnknown **ppControlNode); + + CBDADeviceControl(IUnknown * pUnkOuter, IBaseFilter *pFilter, HANDLE hFile) : m_Ref(0), m_pUnkOuter(pUnkOuter), m_Handle(hFile), m_pFilter(pFilter){}; + virtual ~CBDADeviceControl(){}; + +protected: + LONG m_Ref; + IUnknown * m_pUnkOuter; + HANDLE m_Handle; + IBaseFilter * m_pFilter; +}; + +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + *Output = NULL; + + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + if (IsEqualGUID(refiid, IID_IBDA_DeviceControl)) + { + *Output = (IBDA_DeviceControl*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IBDA_Topology)) + { + *Output = (IBDA_Topology*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + return E_NOINTERFACE; +} + + +//------------------------------------------------------------------- +// IBDA_DeviceControl methods +// +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::StartChanges( void) +{ + KSMETHOD Method; + HRESULT hr; + ULONG BytesReturned; + + /* setup request */ + Method.Set = KSMETHODSETID_BdaChangeSync; + Method.Id = KSMETHOD_BDA_START_CHANGES; + Method.Flags = KSMETHOD_TYPE_NONE; + + /* execute request */ + hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_METHOD, (PVOID)&Method, sizeof(KSMETHOD), NULL, 0, &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDADeviceControl::StartChanges: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + + +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::CheckChanges( void) +{ + KSMETHOD Method; + HRESULT hr; + ULONG BytesReturned; + + /* setup request */ + Method.Set = KSMETHODSETID_BdaChangeSync; + Method.Id = KSMETHOD_BDA_CHECK_CHANGES; + Method.Flags = KSMETHOD_TYPE_NONE; + + /* execute request */ + hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_METHOD, (PVOID)&Method, sizeof(KSMETHOD), NULL, 0, &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDADeviceControl::CheckChanges: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + + +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::CommitChanges( void) +{ + KSMETHOD Method; + HRESULT hr; + ULONG BytesReturned; + + /* setup request */ + Method.Set = KSMETHODSETID_BdaChangeSync; + Method.Id = KSMETHOD_BDA_COMMIT_CHANGES; + Method.Flags = KSMETHOD_TYPE_NONE; + + /* execute request */ + hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_METHOD, (PVOID)&Method, sizeof(KSMETHOD), NULL, 0, &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDADeviceControl::CommitChanges: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::GetChangeState(ULONG *pState) +{ + if (pState) + { + *pState = BDA_CHANGES_COMPLETE; + return S_OK; + } + else + { + return E_POINTER; + } +} + +//------------------------------------------------------------------- +// IBDA_Topology methods +// +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::GetNodeTypes(ULONG *pulcNodeTypes, ULONG ulcNodeTypesMax, ULONG * rgulNodeTypes) +{ + KSPROPERTY Property; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Property.Set = KSPROPSETID_BdaTopology; + Property.Id = KSPROPERTY_BDA_NODE_TYPES; + Property.Flags = KSPROPERTY_TYPE_GET; + + // perform request + hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), rgulNodeTypes, sizeof(ULONG) * ulcNodeTypesMax, &BytesReturned); + + *pulcNodeTypes = (BytesReturned / sizeof(ULONG)); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDADeviceControl::GetNodeTypes: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + OutputDebugStringW(Buffer); + + if (SUCCEEDED(hr)) + { + for(ULONG Index = 0; Index < *pulcNodeTypes; Index++) + { + swprintf(Buffer, L"CBDADeviceControl::GetPinTypes: Index %lu Value %lx\n", Index, rgulNodeTypes[Index]); + OutputDebugStringW(Buffer); + } + } +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::GetNodeDescriptors(ULONG *ulcNodeDescriptors, ULONG ulcNodeDescriptorsMax, BDANODE_DESCRIPTOR * rgNodeDescriptors) +{ + KSPROPERTY Property; + HRESULT hr; + ULONG BytesReturned; + + + // setup request + Property.Set = KSPROPSETID_BdaTopology; + Property.Id = KSPROPERTY_BDA_NODE_DESCRIPTORS; + Property.Flags = KSPROPERTY_TYPE_GET; + + // perform request + hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), rgNodeDescriptors, sizeof(BDANODE_DESCRIPTOR) * ulcNodeDescriptorsMax, &BytesReturned); + + *ulcNodeDescriptors = (BytesReturned / sizeof(BDANODE_DESCRIPTOR)); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[1000]; + swprintf(Buffer, L"CBDADeviceControl::GetNodeDescriptors: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + OutputDebugStringW(Buffer); + + + if (SUCCEEDED(hr)) + { + for(ULONG Index = 0; Index < min(*ulcNodeDescriptors, ulcNodeDescriptorsMax); Index++) + { + LPOLESTR pGUIDFunction, pGUIDName; + + StringFromCLSID(rgNodeDescriptors[Index].guidFunction, &pGUIDFunction); + StringFromCLSID(rgNodeDescriptors[Index].guidName, &pGUIDName); + + swprintf(Buffer, L"CBDADeviceControl::GetPinTypes: Index %lu Value %lx\nFunction %s\n Name %s\n-----\n", Index, rgNodeDescriptors[Index].ulBdaNodeType, pGUIDFunction, pGUIDName); + OutputDebugStringW(Buffer); + } + } +#endif + + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::GetNodeInterfaces(ULONG ulNodeType, ULONG *pulcInterfaces, ULONG ulcInterfacesMax, GUID * rgguidInterfaces) +{ + KSP_NODE Property; + HRESULT hr; + ULONG BytesReturned; + + + // setup request + Property.Property.Set = KSPROPSETID_BdaTopology; + Property.Property.Id = KSPROPERTY_BDA_NODE_PROPERTIES; + Property.Property.Flags = KSPROPERTY_TYPE_GET; + Property.NodeId = ulNodeType; + Property.Reserved = 0; + + // perform request + hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_NODE), rgguidInterfaces, sizeof(GUID) * ulcInterfacesMax, &BytesReturned); + + *pulcInterfaces = (BytesReturned / sizeof(GUID)); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDADeviceControl::GetNodeInterfaces: hr %lx, BytesReturned %lu ulNodeType %lu\n", hr, BytesReturned, ulNodeType); + OutputDebugStringW(Buffer); + + if (SUCCEEDED(hr)) + { + for(ULONG Index = 0; Index < min(*pulcInterfaces, ulcInterfacesMax); Index++) + { + LPOLESTR pstr; + + StringFromCLSID(rgguidInterfaces[Index], &pstr); + + swprintf(Buffer, L"CBDADeviceControl::GetNodeInterfaces: Index %lu Name %s\n", Index, pstr); + OutputDebugStringW(Buffer); + } + } +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::GetPinTypes(ULONG *pulcPinTypes, ULONG ulcPinTypesMax, ULONG *rgulPinTypes) +{ + KSPROPERTY Property; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Property.Set = KSPROPSETID_BdaTopology; + Property.Id = KSPROPERTY_BDA_PIN_TYPES; + Property.Flags = KSPROPERTY_TYPE_GET; + + // perform request + hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), rgulPinTypes, sizeof(ULONG) * ulcPinTypesMax, &BytesReturned); + + *pulcPinTypes = (BytesReturned / sizeof(ULONG)); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDADeviceControl::GetPinTypes: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + OutputDebugStringW(Buffer); + + if (SUCCEEDED(hr)) + { + for(ULONG Index = 0; Index < *pulcPinTypes; Index++) + { + swprintf(Buffer, L"CBDADeviceControl::GetPinTypes: Index %lu Value %lx\n", Index, rgulPinTypes[Index]); + OutputDebugStringW(Buffer); + } + } +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::GetTemplateConnections(ULONG *pulcConnections, ULONG ulcConnectionsMax, BDA_TEMPLATE_CONNECTION * rgConnections) +{ +#ifdef BDAPLGIN_TRACE + OutputDebugStringW(L"CBDADeviceControl::GetTemplateConnections: NotImplemented\n"); +#endif + + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::CreatePin(ULONG ulPinType, ULONG *pulPinId) +{ +#ifdef BDAPLGIN_TRACE + OutputDebugStringW(L"CBDADeviceControl::CreatePin: NotImplemented\n"); +#endif + + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::DeletePin(ULONG ulPinId) +{ +#ifdef BDAPLGIN_TRACE + OutputDebugStringW(L"CBDADeviceControl::DeletePin: NotImplemented\n"); +#endif + + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::SetMediaType(ULONG ulPinId, AM_MEDIA_TYPE *pMediaType) +{ +#ifdef BDAPLGIN_TRACE + OutputDebugStringW(L"CBDADeviceControl::SetMediaType: NotImplemented\n"); +#endif + + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::SetMedium(ULONG ulPinId, REGPINMEDIUM *pMedium) +{ +#ifdef BDAPLGIN_TRACE + OutputDebugStringW(L"CBDADeviceControl::SetMedium: NotImplemented\n"); +#endif + + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::CreateTopology(ULONG ulInputPinId, ULONG ulOutputPinId) +{ + KSM_BDA_PIN_PAIR Method; + HRESULT hr; + ULONG BytesReturned = 0; + + Method.Method.Flags = KSMETHOD_TYPE_NONE; + Method.Method.Id = KSMETHOD_BDA_CREATE_TOPOLOGY; + Method.Method.Set = KSMETHODSETID_BdaDeviceConfiguration; + Method.InputPinId = ulInputPinId; + Method.OutputPinId = ulOutputPinId; + + hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_METHOD, (PVOID)&Method, sizeof(KSM_BDA_PIN_PAIR), NULL, 0, &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDADeviceControl::CreateTopology: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDADeviceControl::GetControlNode(ULONG ulInputPinId, ULONG ulOutputPinId, ULONG ulNodeType, IUnknown **ppControlNode) +{ + HRESULT hr; + ULONG PinId = 0; + ULONG BytesReturned; + KSP_BDA_NODE_PIN Property; + + //setup request + Property.Property.Set = KSPROPSETID_BdaTopology; + Property.Property.Id = KSPROPERTY_BDA_CONTROLLING_PIN_ID; + Property.Property.Flags = KSPROPERTY_TYPE_GET; + Property.ulInputPinId = ulInputPinId; + Property.ulOutputPinId = ulOutputPinId; + Property.ulNodeType = ulNodeType; + + // perform request + // WinXP SP3 expects minimum sizeof(KSP_BDA_NODE_PIN) + sizeof(ULONG) + // seems a driver to be a driver bug + + hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_BDA_NODE_PIN) + sizeof(ULONG), &PinId, sizeof(ULONG), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDADeviceControl::GetControlNode: hr %lx, BytesReturned %lu PinId %lu\n", hr, BytesReturned, PinId); + OutputDebugStringW(Buffer); +#endif + + if (FAILED(hr)) + return hr; + + hr = CControlNode_fnConstructor(m_Handle, m_pFilter, ulNodeType, PinId, IID_IUnknown, (LPVOID*)ppControlNode); + +#ifdef BDAPLGIN_TRACE + swprintf(Buffer, L"CBDADeviceControl::GetControlNode: hr %lx\n", hr); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +WINAPI +CBDADeviceControl_fnConstructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv) +{ + HRESULT hr; + IKsObject *pObject = NULL; + IBaseFilter *pFilter = NULL; + HANDLE hFile; + +#ifdef BDAPLGIN_TRACE + OutputDebugStringW(L"CBDADeviceControl_fnConstructor\n"); +#endif + + //DebugBreak(); + + // sanity check + assert(pUnkOuter); + + // query for IKsObject + hr = pUnkOuter->QueryInterface(IID_IKsObject, (void**)&pObject); + + if (FAILED(hr)) + return E_NOINTERFACE; + + // sanity check + assert(hr == NOERROR); + + // query for IBaseFilter interface support + hr = pUnkOuter->QueryInterface(IID_IBaseFilter, (void**)&pFilter); + + if (FAILED(hr)) + { + // release + pObject->Release(); + return E_NOINTERFACE; + } + + // another sanity check + assert(pObject != NULL); + + // get file handle + hFile = pObject->KsGetObjectHandle(); + + // one more sanity check + assert(hFile != NULL && hFile != INVALID_HANDLE_VALUE); + + // release IKsObject interface + pObject->Release(); + + // release filter + pFilter->Release(); + + // construct device control + CBDADeviceControl * handler = new CBDADeviceControl(pUnkOuter, pFilter, hFile); + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/bdaplgin/digitaldemo.cpp b/reactos/dll/directx/bdaplgin/digitaldemo.cpp new file mode 100644 index 00000000000..2d1b7ed62d6 --- /dev/null +++ b/reactos/dll/directx/bdaplgin/digitaldemo.cpp @@ -0,0 +1,355 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/bdaplgin/digitaldemo.cpp + * PURPOSE: IBDA_DigitalDemodulator interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ + +#include "precomp.h" + +const GUID IID_IBDA_DigitalDemodulator = {0xef30f379, 0x985b, 0x4d10, {0xb6, 0x40, 0xa7, 0x9d, 0x5e, 0x04, 0xe1, 0xe0}}; +const GUID KSPROPSETID_BdaDigitalDemodulator = {0xef30f379, 0x985b, 0x4d10, {0xb6, 0x40, 0xa7, 0x9d, 0x5e, 0x4, 0xe1, 0xe0}}; + +class CBDADigitalDemodulator : public IBDA_DigitalDemodulator +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + //IBDA_DigitalDemodulator methods + HRESULT STDMETHODCALLTYPE put_ModulationType(ModulationType *pModulationType); + HRESULT STDMETHODCALLTYPE get_ModulationType(ModulationType *pModulationType); + HRESULT STDMETHODCALLTYPE put_InnerFECMethod(FECMethod *pFECMethod); + HRESULT STDMETHODCALLTYPE get_InnerFECMethod(FECMethod *pFECMethod); + HRESULT STDMETHODCALLTYPE put_InnerFECRate(BinaryConvolutionCodeRate *pFECRate); + HRESULT STDMETHODCALLTYPE get_InnerFECRate(BinaryConvolutionCodeRate *pFECRate); + HRESULT STDMETHODCALLTYPE put_OuterFECMethod(FECMethod *pFECMethod); + HRESULT STDMETHODCALLTYPE get_OuterFECMethod(FECMethod *pFECMethod); + HRESULT STDMETHODCALLTYPE put_OuterFECRate(BinaryConvolutionCodeRate *pFECRate); + HRESULT STDMETHODCALLTYPE get_OuterFECRate(BinaryConvolutionCodeRate *pFECRate); + HRESULT STDMETHODCALLTYPE put_SymbolRate(ULONG *pSymbolRate); + HRESULT STDMETHODCALLTYPE get_SymbolRate(ULONG *pSymbolRate); + HRESULT STDMETHODCALLTYPE put_SpectralInversion(SpectralInversion *pSpectralInversion); + HRESULT STDMETHODCALLTYPE get_SpectralInversion(SpectralInversion *pSpectralInversion); + + CBDADigitalDemodulator(HANDLE hFile, ULONG NodeId) : m_Ref(0), m_hFile(hFile), m_NodeId(NodeId){}; + ~CBDADigitalDemodulator(){}; + +protected: + LONG m_Ref; + HANDLE m_hFile; + ULONG m_NodeId; +}; + +HRESULT +STDMETHODCALLTYPE +CBDADigitalDemodulator::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + *Output = NULL; + + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IBDA_DigitalDemodulator)) + { + *Output = (IBDA_DigitalDemodulator*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CBDADigitalDemodulator::QueryInterface: NoInterface for %s", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); +#endif + + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDADigitalDemodulator::put_ModulationType(ModulationType *pModulationType) +{ + KSP_NODE Node; + HRESULT hr; + + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator; + Node.Property.Id = KSPROPERTY_BDA_MODULATION_TYPE; + Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET; + Node.NodeId = m_NodeId; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pModulationType, sizeof(ModulationType), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDADigitalDemodulator::put_ModulationType: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDADigitalDemodulator::get_ModulationType(ModulationType *pModulationType) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDADigitalDemodulator::put_InnerFECMethod(FECMethod *pFECMethod) +{ + KSP_NODE Node; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator; + Node.Property.Id = KSPROPERTY_BDA_INNER_FEC_TYPE; + Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET; + Node.NodeId = m_NodeId; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECMethod, sizeof(FECMethod), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECMethod: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDADigitalDemodulator::get_InnerFECMethod(FECMethod *pFECMethod) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDADigitalDemodulator::put_InnerFECRate(BinaryConvolutionCodeRate *pFECRate) +{ + KSP_NODE Node; + HRESULT hr; + + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator; + Node.Property.Id = KSPROPERTY_BDA_INNER_FEC_RATE; + Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET; + Node.NodeId = m_NodeId; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECRate, sizeof(BinaryConvolutionCodeRate), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDADigitalDemodulator::put_InnerFECRate: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDADigitalDemodulator::get_InnerFECRate(BinaryConvolutionCodeRate *pFECRate) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDADigitalDemodulator::put_OuterFECMethod(FECMethod *pFECMethod) +{ + KSP_NODE Node; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator; + Node.Property.Id = KSPROPERTY_BDA_OUTER_FEC_TYPE; + Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET; + Node.NodeId = m_NodeId; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECMethod, sizeof(FECMethod), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECMethod: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + + +HRESULT +STDMETHODCALLTYPE CBDADigitalDemodulator::get_OuterFECMethod(FECMethod *pFECMethod) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDADigitalDemodulator::put_OuterFECRate(BinaryConvolutionCodeRate *pFECRate) +{ + KSP_NODE Node; + HRESULT hr; + + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator; + Node.Property.Id = KSPROPERTY_BDA_OUTER_FEC_RATE; + Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET; + Node.NodeId = m_NodeId; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pFECRate, sizeof(BinaryConvolutionCodeRate), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDADigitalDemodulator::put_OuterFECRate: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDADigitalDemodulator::get_OuterFECRate(BinaryConvolutionCodeRate *pFECRate) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDADigitalDemodulator::put_SymbolRate(ULONG *pSymbolRate) +{ + KSP_NODE Node; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator; + Node.Property.Id = KSPROPERTY_BDA_SYMBOL_RATE; + Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET; + Node.NodeId = m_NodeId; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pSymbolRate, sizeof(ULONG), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDADigitalDemodulator::put_SymbolRate: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDADigitalDemodulator::get_SymbolRate(ULONG *pSymbolRate) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDADigitalDemodulator::put_SpectralInversion(SpectralInversion *pSpectralInversion) +{ + KSP_NODE Node; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaDigitalDemodulator; + Node.Property.Id = KSPROPERTY_BDA_SPECTRAL_INVERSION; + Node.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY | KSPROPERTY_TYPE_SET; + Node.NodeId = m_NodeId; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), pSpectralInversion, sizeof(SpectralInversion), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDADigitalDemodulator::put_SpectralInversion: hr %lx, BytesReturned %lu\n", hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDADigitalDemodulator::get_SpectralInversion(SpectralInversion *pSpectralInversion) +{ + return E_NOINTERFACE; +} + + +HRESULT +WINAPI +CBDADigitalDemodulator_fnConstructor( + HANDLE hFile, + ULONG NodeId, + REFIID riid, + LPVOID * ppv) +{ + // construct device control + CBDADigitalDemodulator * handler = new CBDADigitalDemodulator(hFile, NodeId); + +#ifdef BDAPLGIN_TRACE + OutputDebugStringW(L"CBDADigitalDemodulator_fnConstructor\n"); +#endif + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/bdaplgin/frequencyfilter.cpp b/reactos/dll/directx/bdaplgin/frequencyfilter.cpp new file mode 100644 index 00000000000..90d1e6a24fa --- /dev/null +++ b/reactos/dll/directx/bdaplgin/frequencyfilter.cpp @@ -0,0 +1,297 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/bdaplgin/frequencyfilter.cpp + * PURPOSE: IBDA_FrequencyFilter interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ + +#include "precomp.h" + +const GUID IID_IBDA_FrequencyFilter = {0x71985f47, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x00, 0xc0, 0x4f, 0x79, 0x71, 0xe0}}; +const GUID KSPROPSETID_BdaFrequencyFilter = {0x71985f47, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}}; + +class CBDAFrequencyFilter : public IBDA_FrequencyFilter +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + HRESULT STDMETHODCALLTYPE put_Autotune(ULONG ulTransponder); + HRESULT STDMETHODCALLTYPE get_Autotune(ULONG *pulTransponder); + HRESULT STDMETHODCALLTYPE put_Frequency(ULONG ulFrequency); + HRESULT STDMETHODCALLTYPE get_Frequency(ULONG *pulFrequency); + HRESULT STDMETHODCALLTYPE put_Polarity(Polarisation Polarity); + HRESULT STDMETHODCALLTYPE get_Polarity(Polarisation *pPolarity); + HRESULT STDMETHODCALLTYPE put_Range(ULONG ulRange); + HRESULT STDMETHODCALLTYPE get_Range(ULONG *pulRange); + HRESULT STDMETHODCALLTYPE put_Bandwidth(ULONG ulBandwidth); + HRESULT STDMETHODCALLTYPE get_Bandwidth(ULONG *pulBandwidth); + HRESULT STDMETHODCALLTYPE put_FrequencyMultiplier(ULONG ulMultiplier); + HRESULT STDMETHODCALLTYPE get_FrequencyMultiplier(ULONG *pulMultiplier); + + CBDAFrequencyFilter(HANDLE hFile, ULONG NodeId) : m_Ref(0), m_hFile(hFile), m_NodeId(NodeId){}; + virtual ~CBDAFrequencyFilter(){}; + +protected: + LONG m_Ref; + HANDLE m_hFile; + ULONG m_NodeId; +}; + +HRESULT +STDMETHODCALLTYPE +CBDAFrequencyFilter::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + *Output = NULL; + + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IBDA_FrequencyFilter)) + { + *Output = (IBDA_FrequencyFilter*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CControlNode::QueryInterface: NoInterface for %s", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); +#endif + + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDAFrequencyFilter::put_Autotune(ULONG ulTransponder) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDAFrequencyFilter::get_Autotune(ULONG *pulTransponder) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDAFrequencyFilter::put_Frequency(ULONG ulFrequency) +{ + KSP_NODE Node; + HRESULT hr; + + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaFrequencyFilter; + Node.Property.Id = KSPROPERTY_BDA_RF_TUNER_FREQUENCY; + Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY; + Node.NodeId = m_NodeId; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulFrequency, sizeof(ULONG), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDAFrequencyFilter::put_Frequency: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDAFrequencyFilter::get_Frequency(ULONG *pulFrequency) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDAFrequencyFilter::put_Polarity(Polarisation Polarity) +{ + KSP_NODE Node; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaFrequencyFilter; + Node.Property.Id = KSPROPERTY_BDA_RF_TUNER_POLARITY; + Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY; + Node.NodeId = m_NodeId; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &Polarity, sizeof(Polarisation), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDAFrequencyFilter::put_Polarity: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDAFrequencyFilter::get_Polarity(Polarisation *pPolarity) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDAFrequencyFilter::put_Range(ULONG ulRange) +{ + KSP_NODE Node; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaFrequencyFilter; + Node.Property.Id = KSPROPERTY_BDA_RF_TUNER_RANGE; + Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY; + Node.NodeId = m_NodeId; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulRange, sizeof(ULONG), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDAFrequencyFilter::put_Polarity: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDAFrequencyFilter::get_Range(ULONG *pulRange) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDAFrequencyFilter::put_Bandwidth(ULONG ulBandwidth) +{ + KSP_NODE Node; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaFrequencyFilter; + Node.Property.Id = KSPROPERTY_BDA_RF_TUNER_BANDWIDTH; + Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY; + Node.NodeId = m_NodeId; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulBandwidth, sizeof(ULONG), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDAFrequencyFilter::put_Bandwidth: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDAFrequencyFilter::get_Bandwidth(ULONG *pulBandwidth) +{ + return E_NOINTERFACE; +} +HRESULT +STDMETHODCALLTYPE +CBDAFrequencyFilter::put_FrequencyMultiplier(ULONG ulMultiplier) +{ + KSP_NODE Node; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaFrequencyFilter; + Node.Property.Id = KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER; + Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY; + Node.NodeId = m_NodeId; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulMultiplier, sizeof(ULONG), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDAFrequencyFilter::put_FrequencyMultiplier: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDAFrequencyFilter::get_FrequencyMultiplier(ULONG *pulMultiplier) +{ + return E_NOINTERFACE; +} + +HRESULT +WINAPI +CBDAFrequencyFilter_fnConstructor( + HANDLE hFile, + ULONG NodeId, + REFIID riid, + LPVOID * ppv) +{ + // construct device control + CBDAFrequencyFilter * handler = new CBDAFrequencyFilter(hFile, NodeId); + +#ifdef BDAPLGIN_TRACE + OutputDebugStringW(L"CBDAFrequencyFilter_fnConstructor\n"); +#endif + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} \ No newline at end of file diff --git a/reactos/dll/directx/bdaplgin/lnbinfo.cpp b/reactos/dll/directx/bdaplgin/lnbinfo.cpp new file mode 100644 index 00000000000..a6638839289 --- /dev/null +++ b/reactos/dll/directx/bdaplgin/lnbinfo.cpp @@ -0,0 +1,212 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/bdaplgin/lnbinfo.cpp + * PURPOSE: IBDA_LNBInfo interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ + +#include "precomp.h" + +const GUID IID_IBDA_LNBInfo = {0x992cf102, 0x49f9, 0x4719, {0xa6, 0x64, 0xc4, 0xf2, 0x3e, 0x24, 0x08, 0xf4}}; +const GUID KSPROPSETID_BdaLNBInfo = {0x992cf102, 0x49f9, 0x4719, {0xa6, 0x64, 0xc4, 0xf2, 0x3e, 0x24, 0x8, 0xf4}}; + +class CBDALNBInfo : public IBDA_LNBInfo +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + //IBDA_LNBInfo methods + HRESULT STDMETHODCALLTYPE put_LocalOscilatorFrequencyLowBand(ULONG ulLOFLow); + HRESULT STDMETHODCALLTYPE get_LocalOscilatorFrequencyLowBand(ULONG *pulLOFLow); + HRESULT STDMETHODCALLTYPE put_LocalOscilatorFrequencyHighBand(ULONG ulLOFHigh); + HRESULT STDMETHODCALLTYPE get_LocalOscilatorFrequencyHighBand(ULONG *pulLOFHigh); + HRESULT STDMETHODCALLTYPE put_HighLowSwitchFrequency(ULONG ulSwitchFrequency); + HRESULT STDMETHODCALLTYPE get_HighLowSwitchFrequency(ULONG *pulSwitchFrequency); + + CBDALNBInfo(HANDLE hFile, ULONG NodeId) : m_Ref(0), m_hFile(hFile), m_NodeId(NodeId){}; + ~CBDALNBInfo(){}; + +protected: + LONG m_Ref; + HANDLE m_hFile; + ULONG m_NodeId; +}; + +HRESULT +STDMETHODCALLTYPE +CBDALNBInfo::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + *Output = NULL; + + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IBDA_LNBInfo)) + { + *Output = (IBDA_LNBInfo*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CBDALNBInfo::QueryInterface: NoInterface for %s", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); +#endif + + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDALNBInfo::put_LocalOscilatorFrequencyLowBand(ULONG ulLOFLow) +{ + KSP_NODE Node; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaLNBInfo; + Node.Property.Id = KSPROPERTY_BDA_LNB_LOF_LOW_BAND; + Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY; + Node.NodeId = m_NodeId; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulLOFLow, sizeof(ULONG), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDALNBInfo::put_LocalOscilatorFrequencyLowBand: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDALNBInfo::get_LocalOscilatorFrequencyLowBand(ULONG *pulLOFLow) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDALNBInfo::put_LocalOscilatorFrequencyHighBand(ULONG ulLOFHigh) +{ + KSP_NODE Node; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaLNBInfo; + Node.Property.Id = KSPROPERTY_BDA_LNB_LOF_HIGH_BAND; + Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY; + Node.NodeId = m_NodeId; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulLOFHigh, sizeof(ULONG), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDALNBInfo::put_LocalOscilatorFrequencyHighBand: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDALNBInfo::get_LocalOscilatorFrequencyHighBand(ULONG *pulLOFHigh) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDALNBInfo::put_HighLowSwitchFrequency(ULONG ulSwitchFrequency) +{ + KSP_NODE Node; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaLNBInfo; + Node.Property.Id = KSPROPERTY_BDA_LNB_SWITCH_FREQUENCY; + Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY; + Node.NodeId = m_NodeId; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &ulSwitchFrequency, sizeof(ULONG), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDALNBInfo::put_HighLowSwitchFrequency: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDALNBInfo::get_HighLowSwitchFrequency(ULONG *pulSwitchFrequency) +{ + return E_NOINTERFACE; +} + +HRESULT +WINAPI +CBDALNBInfo_fnConstructor( + HANDLE hFile, + ULONG NodeId, + REFIID riid, + LPVOID * ppv) +{ + // construct device control + CBDALNBInfo * handler = new CBDALNBInfo(hFile, NodeId); + +#ifdef BDAPLGIN_TRACE + OutputDebugStringW(L"CBDALNBInfo_fnConstructor\n"); +#endif + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} \ No newline at end of file diff --git a/reactos/dll/directx/bdaplgin/pincontrol.cpp b/reactos/dll/directx/bdaplgin/pincontrol.cpp new file mode 100644 index 00000000000..a5b99128b16 --- /dev/null +++ b/reactos/dll/directx/bdaplgin/pincontrol.cpp @@ -0,0 +1,306 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/bdaplgin/classfactory.cpp + * PURPOSE: ClassFactory interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ + +#include "precomp.h" + +const GUID IID_IBDA_PinControl = {0x0DED49D5, 0xA8B7, 0x4d5d, {0x97, 0xA1, 0x12, 0xB0, 0xC1, 0x95, 0x87, 0x4D}}; +const GUID KSPROPSETID_BdaPinControl = {0x0ded49d5, 0xa8b7, 0x4d5d, {0x97, 0xa1, 0x12, 0xb0, 0xc1, 0x95, 0x87, 0x4d}}; +const GUID IID_IPin = {0x56a86891, 0x0ad4, 0x11ce, {0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70}}; + +class CBDAPinControl : public IBDA_PinControl +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + // IBDA_PinControl methods + HRESULT STDMETHODCALLTYPE GetPinID(ULONG *pulPinID); + HRESULT STDMETHODCALLTYPE GetPinType(ULONG *pulPinType); + HRESULT STDMETHODCALLTYPE RegistrationContext(ULONG *pulRegistrationCtx); + + + CBDAPinControl(HANDLE hFile, IBDA_NetworkProvider * pProvider, IPin * pConnectedPin) : m_Ref(0), m_Handle(hFile), m_pProvider(pProvider), m_pConnectedPin(pConnectedPin){}; + virtual ~CBDAPinControl() + { + //m_pConnectedPin->Release(); + //m_pProvider->Release(); + }; + +protected: + LONG m_Ref; + HANDLE m_Handle; + IBDA_NetworkProvider * m_pProvider; + IPin * m_pConnectedPin; +}; + +HRESULT +STDMETHODCALLTYPE +CBDAPinControl::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + *Output = NULL; + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + if (IsEqualGUID(refiid, IID_IBDA_PinControl)) + { + *Output = (IBDA_PinControl*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CBDAPinControl::QueryInterface: NoInterface for %s", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); +#endif + + return E_NOINTERFACE; +} +//------------------------------------------------------------------- +// IBDA_PinControl methods +// +HRESULT +STDMETHODCALLTYPE +CBDAPinControl::GetPinID(ULONG *pulPinID) +{ + KSPROPERTY Property; + ULONG BytesReturned; + HRESULT hr; + + // setup request + Property.Set = KSPROPSETID_BdaPinControl; + Property.Id = KSPROPERTY_BDA_PIN_ID; + Property.Flags = KSPROPERTY_TYPE_GET; + + // perform request + hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), pulPinID, sizeof(ULONG), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDAPinControl::GetPinID: hr %lx pulPinID %lu BytesReturned %lx\n", hr, *pulPinID, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDAPinControl::GetPinType(ULONG *pulPinType) +{ + KSPROPERTY Property; + ULONG BytesReturned; + HRESULT hr; + + // setup request + Property.Set = KSPROPSETID_BdaPinControl; + Property.Id = KSPROPERTY_BDA_PIN_TYPE; + Property.Flags = KSPROPERTY_TYPE_GET; + + // perform request + hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), pulPinType, sizeof(ULONG), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDAPinControl::GetPinType: hr %lx pulPinType %lu BytesReturned %lx\n", hr, *pulPinType, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDAPinControl::RegistrationContext(ULONG *pulRegistrationCtx) +{ +#ifdef BDAPLGIN_TRACE + OutputDebugStringW(L"CBDAPinControl::RegistrationContext: NotImplemented\n"); +#endif + + return E_NOTIMPL; +} + +HRESULT +WINAPI +CBDAPinControl_fnConstructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv) +{ + IPin * pConnectedPin = NULL; + IBDA_NetworkProvider * pNetworkProvider = NULL; + HANDLE hFile = INVALID_HANDLE_VALUE; + +#if 0 + if (!IsEqualGUID(riid, IID_IUnknown)) + { +#ifdef BDAPLGIN_TRACE + OutputDebugStringW(L"CBDAPinControl_fnConstructor: Expected IUnknown\n"); +#endif + return REGDB_E_CLASSNOTREG; + } + + + HRESULT hr; + IKsObject * pObject = NULL; + IPin * pPin = NULL; + IEnumFilters *pEnumFilters = NULL; + + IBaseFilter * ppFilter[1]; + PIN_INFO PinInfo; + FILTER_INFO FilterInfo; + + + if (!pUnkOuter) + return E_POINTER; + + // query for IKsObject interface + hr = pUnkOuter->QueryInterface(IID_IKsObject, (void**)&pObject); + + if (FAILED(hr)) + return hr; + + // query for IPin interface + hr = pObject->QueryInterface(IID_IPin, (void**)&pPin); + + if (FAILED(hr)) + { + //clean up + pObject->Release(); + return hr; + } + + // get pin info + hr = pPin->QueryPinInfo(&PinInfo); + + if (FAILED(hr)) + { + //clean up + pObject->Release(); + pPin->Release(); + return hr; + } + + // sanity checks + assert(PinInfo.dir == PINDIR_OUTPUT); + assert(PinInfo.pFilter != NULL); + + // query filter info + hr = PinInfo.pFilter->QueryFilterInfo(&FilterInfo); + + // sanity check + assert(FilterInfo.pGraph != NULL); + + // get IEnumFilters interface + hr = FilterInfo.pGraph->EnumFilters(&pEnumFilters); + + if (FAILED(hr)) + { + //clean up + FilterInfo.pGraph->Release(); + PinInfo.pFilter->Release(); + pObject->Release(); + pPin->Release(); + return hr; + } + + while(pEnumFilters->Next(1, ppFilter, NULL) == S_OK) + { + // check if that filter supports the IBDA_NetworkProvider interface + hr = ppFilter[0]->QueryInterface(IID_IBDA_NetworkProvider, (void**)&pNetworkProvider); + + // release IBaseFilter + ppFilter[0]->Release(); + + if (SUCCEEDED(hr)) + break; + } + + // release IEnumFilters interface + pEnumFilters->Release(); + + // release IFilterGraph interface + FilterInfo.pGraph->Release(); + + // release IBaseFilter interface + PinInfo.pFilter->Release(); + + if (pNetworkProvider) + { + // get connected pin handle + hr = pPin->ConnectedTo(&pConnectedPin); + + // get file handle + hFile = pObject->KsGetObjectHandle(); + + if (FAILED(hr) || hFile == INVALID_HANDLE_VALUE) + { + // pin not connected + pNetworkProvider->Release(); + // set zero + pNetworkProvider = NULL; + } + } + + // release IPin + pPin->Release(); + + // release IKsObject + pObject->Release(); + + + if (pNetworkProvider == NULL) + { + // no network provider interface in graph + return E_NOINTERFACE; + } +#endif + + CBDAPinControl * handler = new CBDAPinControl(hFile, pNetworkProvider, pConnectedPin); + +#ifdef BDAPLGIN_TRACE + OutputDebugStringW(L"CBDAPinControl_fnConstructor"); +#endif + + DebugBreak(); + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/bdaplgin/precomp.h b/reactos/dll/directx/bdaplgin/precomp.h new file mode 100644 index 00000000000..771a798f2c3 --- /dev/null +++ b/reactos/dll/directx/bdaplgin/precomp.h @@ -0,0 +1,104 @@ +#ifndef PRECOMP_H__ +#define PRECOMP_H__ + +//#define BDAPLGIN_TRACE +#define BUILDING_KS +#define _KSDDK_ +#include +//#include +#include +#define __STREAMS__ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject); + +typedef struct +{ + const GUID* riid; + LPFNCREATEINSTANCE lpfnCI; +} INTERFACE_TABLE; + +/* classfactory.cpp */ +IClassFactory * +CClassFactory_fnConstructor( + LPFNCREATEINSTANCE lpfnCI, + PLONG pcRefDll, + IID * riidInst); + +/* devicecontrol.cpp */ +HRESULT +WINAPI +CBDADeviceControl_fnConstructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv); + + +/* pincontrol.cpp */ +HRESULT +WINAPI +CBDAPinControl_fnConstructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv); + +/* controlnode.cpp */ + +HRESULT +WINAPI +CControlNode_fnConstructor( + HANDLE hFile, + IBaseFilter * pFilter, + ULONG NodeType, + ULONG PinId, + REFIID riid, + LPVOID * ppv); + +/* frequencyfilter.cpp */ + +HRESULT +WINAPI +CBDAFrequencyFilter_fnConstructor( + HANDLE hFile, + ULONG NodeId, + REFIID riid, + LPVOID * ppv); + +/* signalstatistics.cpp */ + +HRESULT +WINAPI +CBDASignalStatistics_fnConstructor( + HANDLE hFile, + ULONG NodeId, + REFIID riid, + LPVOID * ppv); + +/* lnbinfo.cpp */ + +HRESULT +WINAPI +CBDALNBInfo_fnConstructor( + HANDLE hFile, + ULONG NodeId, + REFIID riid, + LPVOID * ppv); + +/* digitaldemo.cpp */ +HRESULT +WINAPI +CBDADigitalDemodulator_fnConstructor( + HANDLE hFile, + ULONG NodeId, + REFIID riid, + LPVOID * ppv); + +#endif diff --git a/reactos/dll/directx/bdaplgin/signalstatistics.cpp b/reactos/dll/directx/bdaplgin/signalstatistics.cpp new file mode 100644 index 00000000000..ae6079e5b23 --- /dev/null +++ b/reactos/dll/directx/bdaplgin/signalstatistics.cpp @@ -0,0 +1,297 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/bdaplgin/frequencyfilter.cpp + * PURPOSE: IBDA_FrequencyFilter interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ + +#include "precomp.h" + +const GUID IID_IBDA_SignalStatistics = {0x1347d106, 0xcf3a, 0x428a, {0xa5, 0xcb, 0xac, 0x0d, 0x9a, 0x2a, 0x43, 0x38}}; +const GUID KSPROPSETID_BdaSignalStats = {0x1347d106, 0xcf3a, 0x428a, {0xa5, 0xcb, 0xac, 0xd, 0x9a, 0x2a, 0x43, 0x38}}; + +class CBDASignalStatistics : public IBDA_SignalStatistics +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + // IBDA_SignalStatistics methods + HRESULT STDMETHODCALLTYPE put_SignalStrength(LONG lDbStrength); + HRESULT STDMETHODCALLTYPE get_SignalStrength(LONG *plDbStrength); + HRESULT STDMETHODCALLTYPE put_SignalQuality(LONG lPercentQuality); + HRESULT STDMETHODCALLTYPE get_SignalQuality(LONG *plPercentQuality); + HRESULT STDMETHODCALLTYPE put_SignalPresent(BOOLEAN fPresent); + HRESULT STDMETHODCALLTYPE get_SignalPresent(BOOLEAN *pfPresent); + HRESULT STDMETHODCALLTYPE put_SignalLocked(BOOLEAN fLocked); + HRESULT STDMETHODCALLTYPE get_SignalLocked(BOOLEAN *pfLocked); + HRESULT STDMETHODCALLTYPE put_SampleTime(LONG lmsSampleTime); + HRESULT STDMETHODCALLTYPE get_SampleTime(LONG *plmsSampleTime); + + CBDASignalStatistics(HANDLE hFile, ULONG NodeId) : m_Ref(0), m_hFile(hFile), m_NodeId(NodeId){}; + ~CBDASignalStatistics(){}; + +protected: + LONG m_Ref; + HANDLE m_hFile; + ULONG m_NodeId; +}; + +HRESULT +STDMETHODCALLTYPE +CBDASignalStatistics::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + *Output = NULL; + + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IBDA_SignalStatistics)) + { + *Output = (IBDA_SignalStatistics*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDASignalStatistics::put_SignalStrength(LONG lDbStrength) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDASignalStatistics::get_SignalStrength(LONG *plDbStrength) +{ + KSP_NODE Node; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaSignalStats; + Node.Property.Id = KSPROPERTY_BDA_SIGNAL_STRENGTH; + Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY; + Node.NodeId = (ULONG)-1; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), plDbStrength, sizeof(LONG), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDASignalStatistics::get_SignalStrength: m_NodeId %lu hr %lx, BytesReturned %lu plDbStrength %ld\n", m_NodeId, hr, BytesReturned, *plDbStrength); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDASignalStatistics::put_SignalQuality(LONG lPercentQuality) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDASignalStatistics::get_SignalQuality(LONG *plPercentQuality) +{ + KSP_NODE Node; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaSignalStats; + Node.Property.Id = KSPROPERTY_BDA_SIGNAL_QUALITY; + Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY; + Node.NodeId = (ULONG)-1; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), plPercentQuality, sizeof(LONG), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDASignalStatistics::get_SignalQuality: m_NodeId %lu hr %lx, BytesReturned %lu plPercentQuality %lu\n", m_NodeId, hr, BytesReturned, *plPercentQuality); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDASignalStatistics::put_SignalPresent(BOOLEAN fPresent) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDASignalStatistics::get_SignalPresent(BOOLEAN *pfPresent) +{ + KSP_NODE Node; + HRESULT hr; + ULONG Present; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaSignalStats; + Node.Property.Id = KSPROPERTY_BDA_SIGNAL_PRESENT; + Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY; + Node.NodeId = (ULONG)-1; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &Present, sizeof(ULONG), &BytesReturned); + // store result + *pfPresent = Present; + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDASignalStatistics::get_SignalPresent: m_NodeId %lu hr %lx, BytesReturned %lu Present %lu\n", m_NodeId, hr, BytesReturned, Present); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDASignalStatistics::put_SignalLocked(BOOLEAN fLocked) +{ + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CBDASignalStatistics::get_SignalLocked(BOOLEAN *pfLocked) +{ + KSP_NODE Node; + HRESULT hr; + ULONG Locked; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaSignalStats; + Node.Property.Id = KSPROPERTY_BDA_SIGNAL_LOCKED; + Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY; + Node.NodeId = (ULONG)-1; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &Locked, sizeof(ULONG), &BytesReturned); + *pfLocked = Locked; + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDASignalStatistics::get_SignalLocked: m_NodeId %lu hr %lx, BytesReturned %lu Locked %lu\n", m_NodeId, hr, BytesReturned, Locked); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDASignalStatistics::put_SampleTime(LONG lmsSampleTime) +{ + KSP_NODE Node; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaSignalStats; + Node.Property.Id = KSPROPERTY_BDA_SAMPLE_TIME; + Node.Property.Flags = KSPROPERTY_TYPE_SET | KSPROPERTY_TYPE_TOPOLOGY; + Node.NodeId = (ULONG)-1; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), &lmsSampleTime, sizeof(LONG), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDASignalStatistics::put_SampleTime: m_NodeId %lu hr %lx, BytesReturned %lu\n", m_NodeId, hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CBDASignalStatistics::get_SampleTime(LONG *plmsSampleTime) +{ + KSP_NODE Node; + HRESULT hr; + ULONG BytesReturned; + + // setup request + Node.Property.Set = KSPROPSETID_BdaSignalStats; + Node.Property.Id = KSPROPERTY_BDA_SAMPLE_TIME; + Node.Property.Flags = KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_TOPOLOGY; + Node.NodeId = (ULONG)-1; + + // perform request + hr = KsSynchronousDeviceControl(m_hFile, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), plmsSampleTime, sizeof(LONG), &BytesReturned); + +#ifdef BDAPLGIN_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CBDASignalStatistics::get_SampleTime: m_NodeId %lu hr %lx, BytesReturned %lu \n", m_NodeId, hr, BytesReturned); + OutputDebugStringW(Buffer); +#endif + + return hr; +} + +HRESULT +WINAPI +CBDASignalStatistics_fnConstructor( + HANDLE hFile, + ULONG NodeId, + REFIID riid, + LPVOID * ppv) +{ + // construct device control + CBDASignalStatistics * handler = new CBDASignalStatistics(hFile, NodeId); + +#ifdef BDAPLGIN_TRACE + OutputDebugStringW(L"CBDASignalStatistics_fnConstructor\n"); +#endif + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/ddraw/rosdraw.h b/reactos/dll/directx/ddraw/rosdraw.h index f38172e1f84..6cb0f2088c8 100644 --- a/reactos/dll/directx/ddraw/rosdraw.h +++ b/reactos/dll/directx/ddraw/rosdraw.h @@ -1,5 +1,4 @@ -#ifndef __DDRAW_PRIVATE -#define __DDRAW_PRIVATE +#pragma once /********* Includes *********/ #include @@ -283,5 +282,3 @@ VOID Hal_DirectDraw_Release (LPDIRECTDRAW7); #define DX_STUB_str(x) // #endif - -#endif /* __DDRAW_PRIVATE */ diff --git a/reactos/dll/directx/directx.rbuild b/reactos/dll/directx/directx.rbuild index 1f5718d37c6..78508ecc99f 100644 --- a/reactos/dll/directx/directx.rbuild +++ b/reactos/dll/directx/directx.rbuild @@ -4,6 +4,9 @@ + + + diff --git a/reactos/dll/directx/dsound_new/directsound.c b/reactos/dll/directx/dsound_new/directsound.c index 754f56b0028..8a630c2c055 100644 --- a/reactos/dll/directx/dsound_new/directsound.c +++ b/reactos/dll/directx/dsound_new/directsound.c @@ -121,6 +121,12 @@ IDirectSound8_fnCreateSoundBuffer( return DSERR_INVALIDPARAM; } + if (lpcDSBufferDesc->dwBufferBytes != 0) + { + /* buffer size must be zero for primary sound buffer */ + return DSERR_INVALIDPARAM; + } + if (This->PrimaryBuffer) { /* primary buffer already exists */ @@ -129,7 +135,7 @@ IDirectSound8_fnCreateSoundBuffer( return S_OK; } - hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel); + hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel, lpcDSBufferDesc->dwFlags); if (SUCCEEDED(hResult)) { /* store primary buffer */ @@ -145,9 +151,15 @@ IDirectSound8_fnCreateSoundBuffer( return DSERR_INVALIDPARAM; } + if (lpcDSBufferDesc->dwBufferBytes < DSBSIZE_MIN || lpcDSBufferDesc->dwBufferBytes > DSBSIZE_MAX) + { + /* buffer size must be within bounds for secondary sound buffer*/ + return DSERR_INVALIDPARAM; + } + if (!This->PrimaryBuffer) { - hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel); + hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel, lpcDSBufferDesc->dwFlags); if (SUCCEEDED(hResult)) { /* store primary buffer */ diff --git a/reactos/dll/directx/dsound_new/dsound_convert.c b/reactos/dll/directx/dsound_new/dsound_convert.c new file mode 100644 index 00000000000..0a6e474d09d --- /dev/null +++ b/reactos/dll/directx/dsound_new/dsound_convert.c @@ -0,0 +1,435 @@ +/* DirectSound format conversion and mixing routines + * + * Copyright 2007 Maarten Lankhorst + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* 8 bits is unsigned, the rest is signed. + * First I tried to reuse existing stuff from alsa-lib, after that + * didn't work, I gave up and just went for individual hacks. + * + * 24 bit is expensive to do, due to unaligned access. + * In dlls/winex11.drv/dib_convert.c convert_888_to_0888_asis there is a way + * around it, but I'm happy current code works, maybe something for later. + * + * The ^ 0x80 flips the signed bit, this is the conversion from + * signed (-128.. 0.. 127) to unsigned (0...255) + * This is only temporary: All 8 bit data should be converted to signed. + * then when fed to the sound card, it should be converted to unsigned again. + * + * Sound is LITTLE endian + */ + +#include "config.h" + +#include + +#define NONAMELESSSTRUCT +#define NONAMELESSUNION +#include "windef.h" +#include "winbase.h" +#include "mmsystem.h" +#include "winternl.h" +#include "wine/debug.h" +#include "dsound.h" +#include "dsdriver.h" +#include "dsound_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(dsound); + +#ifdef WORDS_BIGENDIAN +#define le16(x) RtlUshortByteSwap((x)) +#define le32(x) RtlUlongByteSwap((x)) +#else +#define le16(x) (x) +#define le32(x) (x) +#endif + +static inline void src_advance(const void **src, UINT stride, INT *count, UINT *freqAcc, UINT adj) +{ + *freqAcc += adj; + if (*freqAcc >= (1 << DSOUND_FREQSHIFT)) + { + ULONG adv = (*freqAcc >> DSOUND_FREQSHIFT); + *freqAcc &= (1 << DSOUND_FREQSHIFT) - 1; + *(const char **)src += adv * stride; + *count -= adv; + } +} + +static void convert_8_to_8 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + *(BYTE *)dst = *(const BYTE *)src; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_8_to_16 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + WORD dest = *(const BYTE *)src, *dest16 = dst; + *dest16 = le16(dest * 257 - 32768); + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_8_to_24 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + BYTE dest = *(const BYTE *)src; + BYTE *dest24 = dst; + dest24[0] = dest; + dest24[1] = dest; + dest24[2] = dest - 0x80; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_8_to_32 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + DWORD dest = *(const BYTE *)src, *dest32 = dst; + *dest32 = le32(dest * 16843009 - 2147483648U); + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_16_to_8 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + BYTE *dst8 = dst; + *dst8 = (le16(*(const WORD *)src)) / 256; + *dst8 -= 0x80; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_16_to_16 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + *(WORD *)dst = *(const WORD *)src; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_16_to_24 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + WORD dest = le16(*(const WORD *)src); + BYTE *dest24 = dst; + + dest24[0] = dest / 256; + dest24[1] = dest; + dest24[2] = dest / 256; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_16_to_32 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + DWORD dest = *(const WORD *)src, *dest32 = dst; + *dest32 = dest * 65537; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_24_to_8 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + BYTE *dst8 = dst; + *dst8 = ((const BYTE *)src)[2]; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_24_to_16 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + WORD *dest16 = dst; + const BYTE *source = src; + *dest16 = le16(source[2] * 256 + source[1]); + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_24_to_24 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + BYTE *dest24 = dst; + const BYTE *src24 = src; + + dest24[0] = src24[0]; + dest24[1] = src24[1]; + dest24[2] = src24[2]; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_24_to_32 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + DWORD *dest32 = dst; + const BYTE *source = src; + *dest32 = le32(source[2] * 16777217 + source[1] * 65536 + source[0] * 256); + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_32_to_8 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + BYTE *dst8 = dst; + *dst8 = (le32(*(const DWORD *)src) / 16777216); + *dst8 -= 0x80; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_32_to_16 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + WORD *dest16 = dst; + *dest16 = le16(le32(*(const DWORD *)src) / 65536); + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_32_to_24 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + DWORD dest = le32(*(const DWORD *)src); + BYTE *dest24 = dst; + + dest24[0] = dest / 256; + dest24[1] = dest / 65536; + dest24[2] = dest / 16777216; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +static void convert_32_to_32 (const void *src, void *dst, UINT src_stride, + UINT dst_stride, INT count, UINT freqAcc, UINT adj) +{ + while (count > 0) + { + DWORD *dest = dst; + *dest = *(const DWORD *)src; + + dst = (char *)dst + dst_stride; + src_advance(&src, src_stride, &count, &freqAcc, adj); + } +} + +const bitsconvertfunc convertbpp[4][4] = { + { convert_8_to_8, convert_8_to_16, convert_8_to_24, convert_8_to_32 }, + { convert_16_to_8, convert_16_to_16, convert_16_to_24, convert_16_to_32 }, + { convert_24_to_8, convert_24_to_16, convert_24_to_24, convert_24_to_32 }, + { convert_32_to_8, convert_32_to_16, convert_32_to_24, convert_32_to_32 }, +}; + +static void mix8(signed char *src, INT *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + while (len--) + /* 8-bit WAV is unsigned, it's here converted to signed, normalize function will convert it back again */ + *(dst++) += (signed char)((BYTE)*(src++) - (BYTE)0x80); +} + +static void mix16(SHORT *src, INT *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + len /= 2; + while (len--) + { + *dst += le16(*src); + ++dst; ++src; + } +} + +static void mix24(BYTE *src, INT *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + len /= 3; + while (len--) + { + DWORD field; + field = ((DWORD)src[2] << 16) + ((DWORD)src[1] << 8) + (DWORD)src[0]; + if (src[2] & 0x80) + field |= 0xFF000000U; + *(dst++) += field; + ++src; + } +} + +static void mix32(INT *src, LONGLONG *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + len /= 4; + while (len--) + *(dst++) += le32(*(src++)); +} + +const mixfunc mixfunctions[4] = { + (mixfunc)mix8, + (mixfunc)mix16, + (mixfunc)mix24, + (mixfunc)mix32 +}; + +static void norm8(INT *src, signed char *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + while (len--) + { + *dst = (*src) + 0x80; + if (*src < -0x80) + *dst = 0; + else if (*src > 0x7f) + *dst = 0xff; + ++dst; + ++src; + } +} + +static void norm16(INT *src, SHORT *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + len /= 2; + while (len--) + { + *dst = le16(*src); + if (*src <= -0x8000) + *dst = le16(0x8000); + else if (*src > 0x7fff) + *dst = le16(0x7fff); + ++dst; + ++src; + } +} + +static void norm24(INT *src, BYTE *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + len /= 3; + while (len--) + { + if (*src <= -0x800000) + { + dst[0] = 0; + dst[1] = 0; + dst[2] = 0x80; + } + else if (*src > 0x7fffff) + { + dst[0] = 0xff; + dst[1] = 0xff; + dst[2] = 0x7f; + } + else + { + dst[0] = *src; + dst[1] = *src >> 8; + dst[2] = *src >> 16; + } + ++dst; + ++src; + } +} + +static void norm32(LONGLONG *src, INT *dst, unsigned len) +{ + TRACE("%p - %p %d\n", src, dst, len); + len /= 4; + while (len--) + { + *dst = le32(*src); + if (*src <= -(LONGLONG)0x80000000) + *dst = le32(0x80000000); + else if (*src > 0x7fffffff) + *dst = le32(0x7fffffff); + ++dst; + ++src; + } +} + +const normfunc normfunctions[4] = { + (normfunc)norm8, + (normfunc)norm16, + (normfunc)norm24, + (normfunc)norm32, +}; diff --git a/reactos/dll/directx/dsound_new/precomp.h b/reactos/dll/directx/dsound_new/precomp.h index 36139b745c1..71c314c40d8 100644 --- a/reactos/dll/directx/dsound_new/precomp.h +++ b/reactos/dll/directx/dsound_new/precomp.h @@ -1,5 +1,4 @@ -#ifndef PRECOMP_H__ -#define PRECOMP_H__ +#pragma once #define COBJMACROS #define NONAMELESSUNION @@ -15,7 +14,7 @@ #include #include #include -#define NDEBUG +#define YDEBUG #include #include #include @@ -201,7 +200,8 @@ HRESULT NewPrimarySoundBuffer( LPDIRECTSOUNDBUFFER8 *OutBuffer, LPFILTERINFO Filter, - DWORD dwLevel); + DWORD dwLevel, + DWORD dwFlags); HRESULT PrimaryDirectSoundBuffer_SetFormat( @@ -266,5 +266,3 @@ NewDirectSoundNotify( BOOL bMix, HANDLE hPin, DWORD BufferSize); - -#endif diff --git a/reactos/dll/directx/dsound_new/primary.c b/reactos/dll/directx/dsound_new/primary.c index 9b5e822e8bc..2a62ccee855 100644 --- a/reactos/dll/directx/dsound_new/primary.c +++ b/reactos/dll/directx/dsound_new/primary.c @@ -17,6 +17,10 @@ typedef struct LPFILTERINFO Filter; DWORD dwLevel; + DWORD dwFlags; + DWORD dwFrequency; + LONG Volume; + LONG VolumePan; WAVEFORMATEX Format; HANDLE hPin; CRITICAL_SECTION Lock; @@ -94,8 +98,29 @@ PrimaryDirectSoundBuffer8Impl_fnGetCaps( LPDIRECTSOUNDBUFFER8 iface, LPDSBCAPS pDSBufferCaps) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetCaps\n"); + + if (!pDSBufferCaps) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + if (pDSBufferCaps->dwSize < sizeof(DSBCAPS)) + { + /* invalid buffer size */ + return DSERR_INVALIDPARAM; + } + + /* get buffer details */ + pDSBufferCaps->dwUnlockTransferRate = 0; + pDSBufferCaps->dwPlayCpuOverhead = 0; + pDSBufferCaps->dwSize = 0; //FIXME + pDSBufferCaps->dwFlags = This->dwFlags; + + return DS_OK; } HRESULT @@ -105,7 +130,23 @@ PrimaryDirectSoundBuffer8Impl_fnGetCurrentPosition( LPDWORD pdwCurrentPlayCursor, LPDWORD pdwCurrentWriteCursor) { - UNIMPLEMENTED + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetCurrentPosition\n"); + + if (This->dwLevel < DSSCL_PRIORITY) + { + /* needs priority level */ + return DSERR_PRIOLEVELNEEDED; + } + + if (!pdwCurrentPlayCursor && !pdwCurrentWriteCursor) + { + /* all parameters are null */ + return DSERR_INVALIDPARAM; + } + + UNIMPLEMENTED; return DSERR_INVALIDPARAM; } @@ -120,6 +161,8 @@ PrimaryDirectSoundBuffer8Impl_fnGetFormat( DWORD FormatSize; LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetFormat\n"); + FormatSize = sizeof(WAVEFORMATEX) + This->Format.cbSize; if (!pwfxFormat && !pdwSizeWritten) @@ -160,8 +203,20 @@ PrimaryDirectSoundBuffer8Impl_fnGetVolume( LPDIRECTSOUNDBUFFER8 iface, LPLONG plVolume) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetVolume\n"); + + if (!plVolume) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* get volume */ + *plVolume = This->Volume; + + return DS_OK; } HRESULT @@ -170,8 +225,20 @@ PrimaryDirectSoundBuffer8Impl_fnGetPan( LPDIRECTSOUNDBUFFER8 iface, LPLONG plPan) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetPan\n"); + + if (!plPan) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* get frequency */ + *plPan = This->VolumePan; + + return DS_OK; } HRESULT @@ -180,8 +247,20 @@ PrimaryDirectSoundBuffer8Impl_fnGetFrequency( LPDIRECTSOUNDBUFFER8 iface, LPDWORD pdwFrequency) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetFrequency\n"); + + if (!pdwFrequency) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* get frequency */ + *pdwFrequency = This->dwFrequency; + + return DS_OK; } HRESULT @@ -190,8 +269,24 @@ PrimaryDirectSoundBuffer8Impl_fnGetStatus( LPDIRECTSOUNDBUFFER8 iface, LPDWORD pdwStatus) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetStatus\n"); + + if (!pdwStatus) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + *pdwStatus = 0; + if (This->State == KSSTATE_RUN || This->State == KSSTATE_ACQUIRE) + { + /* buffer is playing */ + *pdwStatus |= DSBSTATUS_PLAYING | DSBSTATUS_LOOPING; + } + + return DS_OK; } HRESULT @@ -201,8 +296,8 @@ PrimaryDirectSoundBuffer8Impl_fnInitialize( LPDIRECTSOUND pDirectSound, LPCDSBUFFERDESC pcDSBufferDesc) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + /* RTFM */ + return DSERR_ALREADYINITIALIZED; } HRESULT @@ -229,8 +324,39 @@ PrimaryDirectSoundBuffer8Impl_fnPlay( DWORD dwPriority, DWORD dwFlags) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + DPRINT("PrimaryDirectSoundBuffer8Impl_fnPlay dwFlags %x\n", dwFlags); + + if (dwReserved1 != 0 || !(dwFlags & DSBPLAY_LOOPING)) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + PrimaryDirectSoundBuffer_AcquireLock(iface); + + if (This->State == KSSTATE_STOP) + { + PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_ACQUIRE); + ASSERT(This->State == KSSTATE_ACQUIRE); + } + + if (This->State == KSSTATE_ACQUIRE) + { + PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_PAUSE); + ASSERT(This->State == KSSTATE_PAUSE); + } + + if (This->State == KSSTATE_PAUSE) + { + PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_RUN); + ASSERT(This->State == KSSTATE_RUN); + } + + PrimaryDirectSoundBuffer_ReleaseLock(iface); + + return DS_OK; } HRESULT @@ -239,8 +365,8 @@ PrimaryDirectSoundBuffer8Impl_fnSetCurrentPosition( LPDIRECTSOUNDBUFFER8 iface, DWORD dwNewPosition) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + /* The position of a primary buffer can't be set */ + return DSERR_INVALIDCALL; } HRESULT @@ -274,8 +400,20 @@ PrimaryDirectSoundBuffer8Impl_fnSetVolume( LPDIRECTSOUNDBUFFER8 iface, LONG lVolume) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (lVolume < DSBVOLUME_MIN || lVolume > DSBVOLUME_MAX) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* TODO: call volume node */ + + /* Store volume */ + This->Volume = lVolume; + + return DS_OK; } HRESULT @@ -284,8 +422,20 @@ PrimaryDirectSoundBuffer8Impl_fnSetPan( LPDIRECTSOUNDBUFFER8 iface, LONG lPan) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (lPan < DSBPAN_LEFT || lPan > DSBPAN_RIGHT) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* TODO: call volume node */ + + /* Store volume pan */ + This->VolumePan = lPan; + + return DS_OK; } HRESULT @@ -294,8 +444,16 @@ PrimaryDirectSoundBuffer8Impl_fnSetFrequency( LPDIRECTSOUNDBUFFER8 iface, DWORD dwFrequency) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (This->dwLevel < DSSCL_PRIORITY) + { + /* needs priority level */ + return DSERR_PRIOLEVELNEEDED; + } + + /* invalid request */ + return DSERR_CONTROLUNAVAIL; } HRESULT @@ -303,8 +461,33 @@ WINAPI PrimaryDirectSoundBuffer8Impl_fnStop( LPDIRECTSOUNDBUFFER8 iface) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + DPRINT("PrimaryDirectSoundBuffer8Impl_fnStop\n"); + + PrimaryDirectSoundBuffer_AcquireLock(iface); + + if (This->State == KSSTATE_RUN) + { + PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_PAUSE); + ASSERT(This->State == KSSTATE_PAUSE); + } + + if (This->State == KSSTATE_PAUSE) + { + PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_ACQUIRE); + ASSERT(This->State == KSSTATE_ACQUIRE); + } + + if (This->State == KSSTATE_ACQUIRE) + { + PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_STOP); + ASSERT(This->State == KSSTATE_STOP); + } + + PrimaryDirectSoundBuffer_ReleaseLock(iface); + + return DS_OK; } @@ -322,8 +505,6 @@ PrimaryDirectSoundBuffer8Impl_fnUnlock( } - - HRESULT WINAPI PrimaryDirectSoundBuffer8Impl_fnRestore( @@ -468,9 +649,10 @@ PrimaryDirectSoundBuffer_GetPosition( KSAUDIO_POSITION Position; KSPROPERTY Request; DWORD Result; - LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + //DPRINT("PrimaryDirectSoundBuffer_GetPosition\n"); + if (!This->hPin) { if (pdwCurrentPlayCursor) @@ -541,7 +723,10 @@ PrimaryDirectSoundBuffer_SetFormat( Result = OpenPin(This->Filter->hFilter, PinId, (LPWAVEFORMATEX)pcfxFormat, &This->hPin, bLooped); DPRINT("PinId %u Result %u\n", PinId, Result); if (Result == ERROR_SUCCESS) + { + This->dwFrequency = pcfxFormat->nSamplesPerSec; break; + } This->hPin = NULL; DeviceId++; @@ -583,7 +768,8 @@ HRESULT NewPrimarySoundBuffer( LPDIRECTSOUNDBUFFER8 *OutBuffer, LPFILTERINFO Filter, - DWORD dwLevel) + DWORD dwLevel, + DWORD dwFlags) { LPCDirectSoundBuffer This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CDirectSoundBuffer)); @@ -597,8 +783,21 @@ NewPrimarySoundBuffer( This->lpVtbl = &vt_DirectSoundBuffer8; This->Filter = Filter; This->dwLevel = dwLevel; + This->dwFlags = dwFlags; + This->dwFrequency = 0; + This->Volume = DSBVOLUME_MAX; + This->VolumePan = DSBPAN_CENTER; This->hPin = NULL; + /* FIXME: determine default format for audio device */ + This->Format.cbSize = sizeof(WAVEFORMATEX); + This->Format.nChannels = 2; + This->Format.nSamplesPerSec = 44100; + This->Format.wBitsPerSample = 16; + This->Format.wFormatTag = WAVE_FORMAT_PCM; + This->Format.nBlockAlign = (This->Format.nChannels * This->Format.wBitsPerSample) / 8; + This->Format.nAvgBytesPerSec = (This->Format.nChannels * This->Format.nSamplesPerSec * This->Format.wBitsPerSample) / 8; + InitializeCriticalSection(&This->Lock); *OutBuffer = (LPDIRECTSOUNDBUFFER8)&This->lpVtbl; diff --git a/reactos/dll/directx/dsound_new/resource.h b/reactos/dll/directx/dsound_new/resource.h index 5c963cca5f6..04f9ebf3df7 100644 --- a/reactos/dll/directx/dsound_new/resource.h +++ b/reactos/dll/directx/dsound_new/resource.h @@ -1,16 +1,4 @@ -#ifndef RESOURCE_H__ -#define RESOURCE_H__ +#pragma once #define IDS_PRIMARY_PLAYBACK_DEVICE 100 #define IDS_PRIMARY_RECORD_DEVICE 101 - - - - - - - - - - -#endif diff --git a/reactos/dll/directx/dsound_new/secondary.c b/reactos/dll/directx/dsound_new/secondary.c index a3fe2b17a62..2293d34f2e9 100644 --- a/reactos/dll/directx/dsound_new/secondary.c +++ b/reactos/dll/directx/dsound_new/secondary.c @@ -17,6 +17,11 @@ typedef struct LPFILTERINFO Filter; DWORD dwLevel; + DWORD dwFlags; + DWORD dwFrequency; + DWORD BufferPosition; + LONG Volume; + LONG VolumePan; LPWAVEFORMATEX Format; PUCHAR Buffer; DWORD BufferSize; @@ -97,8 +102,27 @@ SecondaryDirectSoundBuffer8Impl_fnGetCaps( LPDIRECTSOUNDBUFFER8 iface, LPDSBCAPS pDSBufferCaps) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (!pDSBufferCaps) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + if (pDSBufferCaps->dwSize < sizeof(DSBCAPS)) + { + /* invalid buffer size */ + return DSERR_INVALIDPARAM; + } + + /* get buffer details */ + pDSBufferCaps->dwUnlockTransferRate = 0; + pDSBufferCaps->dwPlayCpuOverhead = 0; + pDSBufferCaps->dwSize = This->BufferSize; + pDSBufferCaps->dwFlags = This->dwFlags; + + return DS_OK; } HRESULT @@ -112,15 +136,20 @@ SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition( //DPRINT("SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition This %p Play %p Write %p\n", This, pdwCurrentPlayCursor, pdwCurrentWriteCursor); - return PrimaryDirectSoundBuffer_GetPosition(This->PrimaryBuffer, pdwCurrentPlayCursor, pdwCurrentWriteCursor); + if (pdwCurrentWriteCursor) + { + *pdwCurrentWriteCursor = This->BufferPosition; + } + + return PrimaryDirectSoundBuffer_GetPosition(This->PrimaryBuffer, pdwCurrentPlayCursor, NULL); } HRESULT WINAPI SecondaryDirectSoundBuffer8Impl_fnGetFormat( LPDIRECTSOUNDBUFFER8 iface, - LPWAVEFORMATEX pwfxFormat, - DWORD dwSizeAllocated, + LPWAVEFORMATEX pwfxFormat, + DWORD dwSizeAllocated, LPDWORD pdwSizeWritten) { DWORD FormatSize; @@ -166,8 +195,18 @@ SecondaryDirectSoundBuffer8Impl_fnGetVolume( LPDIRECTSOUNDBUFFER8 iface, LPLONG plVolume) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (!plVolume) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* get volume */ + *plVolume = This->Volume; + + return DS_OK; } HRESULT @@ -176,8 +215,18 @@ SecondaryDirectSoundBuffer8Impl_fnGetPan( LPDIRECTSOUNDBUFFER8 iface, LPLONG plPan) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (!plPan) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* get frequency */ + *plPan = This->VolumePan; + + return DS_OK; } HRESULT @@ -186,8 +235,18 @@ SecondaryDirectSoundBuffer8Impl_fnGetFrequency( LPDIRECTSOUNDBUFFER8 iface, LPDWORD pdwFrequency) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (!pdwFrequency) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* get frequency */ + *pdwFrequency = This->dwFrequency; + + return DS_OK; } HRESULT @@ -223,8 +282,8 @@ SecondaryDirectSoundBuffer8Impl_fnInitialize( LPDIRECTSOUND pDirectSound, LPCDSBUFFERDESC pcDSBufferDesc) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + /* RTFM */ + return DSERR_ALREADYINITIALIZED; } HRESULT @@ -263,11 +322,18 @@ SecondaryDirectSoundBuffer8Impl_fnLock( else { ASSERT(dwOffset < This->BufferSize); - ASSERT(dwBytes < This->BufferSize); - ASSERT(dwBytes + dwOffset <= This->BufferSize); + ASSERT(dwBytes <= This->BufferSize); + + dwBytes = min(This->BufferSize - dwOffset, dwBytes); *ppvAudioPtr1 = This->Buffer + dwOffset; *pdwAudioBytes1 = dwBytes; + + This->BufferPosition = dwOffset + dwBytes; + + if (This->BufferPosition == This->BufferSize) + This->BufferPosition = 0; + if (ppvAudioPtr2) *ppvAudioPtr2 = NULL; if (pdwAudioBytes2) @@ -297,6 +363,13 @@ SecondaryDirectSoundBuffer8Impl_fnPlay( /* sanity check */ ASSERT(dwFlags & DSBPLAY_LOOPING); + + if (This->State == KSSTATE_RUN) + { + /* sound buffer is already playing */ + return DS_OK; + } + /* set dataformat */ hResult = PrimaryDirectSoundBuffer_SetFormat(This->PrimaryBuffer, This->Format, TRUE); @@ -316,7 +389,9 @@ SecondaryDirectSoundBuffer8Impl_fnPlay( /* release primary buffer */ PrimaryDirectSoundBuffer_ReleaseLock(This->PrimaryBuffer); - DPRINT1("SetFormatSuccess PrimaryBuffer %p\n", This->PrimaryBuffer); + DPRINT("SetFormatSuccess PrimaryBuffer %p\n", This->PrimaryBuffer); + This->State = KSSTATE_RUN; + return DS_OK; } @@ -340,6 +415,7 @@ SecondaryDirectSoundBuffer8Impl_fnSetFormat( LPDIRECTSOUNDBUFFER8 iface, LPCWAVEFORMATEX pcfxFormat) { + /* RTFM */ return DSERR_INVALIDCALL; } @@ -349,8 +425,19 @@ SecondaryDirectSoundBuffer8Impl_fnSetVolume( LPDIRECTSOUNDBUFFER8 iface, LONG lVolume) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (lVolume < DSBVOLUME_MIN || lVolume > DSBVOLUME_MAX) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + + /* Store volume */ + This->Volume = lVolume; + + return DS_OK; } HRESULT @@ -359,8 +446,18 @@ SecondaryDirectSoundBuffer8Impl_fnSetPan( LPDIRECTSOUNDBUFFER8 iface, LONG lPan) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (lPan < DSBPAN_LEFT || lPan > DSBPAN_RIGHT) + { + /* invalid parameter */ + return DSERR_INVALIDPARAM; + } + + /* Store volume pan */ + This->VolumePan = lPan; + + return DS_OK; } HRESULT @@ -369,8 +466,29 @@ SecondaryDirectSoundBuffer8Impl_fnSetFrequency( LPDIRECTSOUNDBUFFER8 iface, DWORD dwFrequency) { - UNIMPLEMENTED - return DSERR_INVALIDPARAM; + LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); + + if (dwFrequency == DSBFREQUENCY_ORIGINAL) + { + /* restore original frequency */ + dwFrequency = This->Format->nSamplesPerSec; + } + + if (dwFrequency < DSBFREQUENCY_MIN || dwFrequency > DSBFREQUENCY_MAX) + { + /* invalid frequency */ + return DSERR_INVALIDPARAM; + } + + if (dwFrequency != This->dwFrequency) + { + /* FIXME handle frequency change */ + } + + /* store frequency */ + This->dwFrequency = dwFrequency; + + return DS_OK; } HRESULT @@ -384,6 +502,13 @@ SecondaryDirectSoundBuffer8Impl_fnStop( PrimaryDirectSoundBuffer_SetState(This->PrimaryBuffer, KSSTATE_ACQUIRE); PrimaryDirectSoundBuffer_SetState(This->PrimaryBuffer, KSSTATE_STOP); + DPRINT("SecondaryDirectSoundBuffer8Impl_fnStop\n"); + + + /* set state to stop */ + This->State = KSSTATE_STOP; + This->BufferPosition = 0; + return DS_OK; } @@ -522,12 +647,18 @@ NewSecondarySoundBuffer( return DSERR_OUTOFMEMORY; } + /* fill buffer with silence */ + FillMemory(This->Buffer, lpcDSBufferDesc->dwBufferBytes, lpcDSBufferDesc->lpwfxFormat->wBitsPerSample == 8 ? 0x80 : 0); This->ref = 1; This->lpVtbl = &vt_DirectSoundBuffer8; This->Filter = Filter; This->dwLevel = dwLevel; + This->dwFlags = lpcDSBufferDesc->dwFlags; + This->dwFrequency = lpcDSBufferDesc->lpwfxFormat->nSamplesPerSec; This->State = KSSTATE_STOP; + This->Volume = DSBVOLUME_MAX; + This->VolumePan = DSBPAN_CENTER; This->Flags = 0; This->Position = 0; This->BufferSize = lpcDSBufferDesc->dwBufferBytes; diff --git a/reactos/dll/directx/ksproxy/allocator.cpp b/reactos/dll/directx/ksproxy/allocator.cpp new file mode 100644 index 00000000000..f5b9c1e1e6a --- /dev/null +++ b/reactos/dll/directx/ksproxy/allocator.cpp @@ -0,0 +1,606 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy + * FILE: dll/directx/ksproxy/allocator.cpp + * PURPOSE: IKsAllocator interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +const GUID IID_IKsAllocatorEx = {0x091bb63a, 0x603f, 0x11d1, {0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02}}; +const GUID IID_IKsAllocator = {0x8da64899, 0xc0d9, 0x11d0, {0x84, 0x13, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a}}; + +class CKsAllocator : public IKsAllocatorEx, + public IMemAllocatorCallbackTemp +{ +public: + typedef std::stackMediaSampleStack; + typedef std::listMediaSampleList; + + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + //IKsAllocator + HANDLE STDMETHODCALLTYPE KsGetAllocatorHandle(); + KSALLOCATORMODE STDMETHODCALLTYPE KsGetAllocatorMode(); + HRESULT STDMETHODCALLTYPE KsGetAllocatorStatus(PKSSTREAMALLOCATOR_STATUS AllocatorStatus); + VOID STDMETHODCALLTYPE KsSetAllocatorMode(KSALLOCATORMODE Mode); + + //IKsAllocatorEx + PALLOCATOR_PROPERTIES_EX STDMETHODCALLTYPE KsGetProperties(); + VOID STDMETHODCALLTYPE KsSetProperties(PALLOCATOR_PROPERTIES_EX Properties); + VOID STDMETHODCALLTYPE KsSetAllocatorHandle(HANDLE AllocatorHandle); + HANDLE STDMETHODCALLTYPE KsCreateAllocatorAndGetHandle(IKsPin* KsPin); + + //IMemAllocator + HRESULT STDMETHODCALLTYPE SetProperties(ALLOCATOR_PROPERTIES *pRequest, ALLOCATOR_PROPERTIES *pActual); + HRESULT STDMETHODCALLTYPE GetProperties(ALLOCATOR_PROPERTIES *pProps); + HRESULT STDMETHODCALLTYPE Commit(); + HRESULT STDMETHODCALLTYPE Decommit(); + HRESULT STDMETHODCALLTYPE GetBuffer(IMediaSample **ppBuffer, REFERENCE_TIME *pStartTime, REFERENCE_TIME *pEndTime, DWORD dwFlags); + HRESULT STDMETHODCALLTYPE ReleaseBuffer(IMediaSample *pBuffer); + + //IMemAllocatorCallbackTemp + HRESULT STDMETHODCALLTYPE SetNotify(IMemAllocatorNotifyCallbackTemp *pNotify); + HRESULT STDMETHODCALLTYPE GetFreeCount(LONG *plBuffersFree); + + + CKsAllocator(); + virtual ~CKsAllocator(){} + VOID STDMETHODCALLTYPE FreeMediaSamples(); +protected: + LONG m_Ref; + HANDLE m_hAllocator; + KSALLOCATORMODE m_Mode; + ALLOCATOR_PROPERTIES_EX m_Properties; + IMemAllocatorNotifyCallbackTemp *m_Notify; + ULONG m_Allocated; + LONG m_cbBuffer; + LONG m_cBuffers; + LONG m_cbAlign; + LONG m_cbPrefix; + BOOL m_Commited; + CRITICAL_SECTION m_CriticalSection; + MediaSampleStack m_FreeList; + MediaSampleList m_UsedList; + LPVOID m_Buffer; + BOOL m_FreeSamples; +}; + + +HRESULT +STDMETHODCALLTYPE +CKsAllocator::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown) || + IsEqualGUID(refiid, IID_IKsAllocator) || + IsEqualGUID(refiid, IID_IKsAllocatorEx)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + if (IsEqualGUID(refiid, IID_IMemAllocator) || + IsEqualGUID(refiid, IID_IMemAllocatorCallbackTemp)) + { + *Output = (IMemAllocatorCallbackTemp*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + return E_NOINTERFACE; +} + +CKsAllocator::CKsAllocator() : m_Ref(0), + m_hAllocator(0), + m_Mode(KsAllocatorMode_User), + m_Notify(0), + m_Allocated(0), + m_cbBuffer(0), + m_cBuffers(0), + m_cbAlign(0), + m_cbPrefix(0), + m_Commited(FALSE), + m_FreeList(), + m_UsedList(), + m_Buffer(0), + m_FreeSamples(FALSE) +{ + InitializeCriticalSection(&m_CriticalSection); + +} + +//------------------------------------------------------------------- +// IMemAllocator +// +HRESULT +STDMETHODCALLTYPE +CKsAllocator::SetProperties( + ALLOCATOR_PROPERTIES *pRequest, + ALLOCATOR_PROPERTIES *pActual) +{ + SYSTEM_INFO SystemInfo; + + EnterCriticalSection(&m_CriticalSection); + OutputDebugStringW(L"CKsAllocator::SetProperties\n"); + + if (!pRequest || !pActual) + return E_POINTER; + + // zero output properties + ZeroMemory(pActual, sizeof(ALLOCATOR_PROPERTIES)); + + // get system info + GetSystemInfo(&SystemInfo); + + if (!pRequest->cbAlign || (pRequest->cbAlign - 1) & SystemInfo.dwAllocationGranularity) + { + // bad alignment + LeaveCriticalSection(&m_CriticalSection); + return VFW_E_BADALIGN; + } + + if (m_Mode == KsAllocatorMode_Kernel) + { + // u can't change a kernel allocator + LeaveCriticalSection(&m_CriticalSection); + return VFW_E_ALREADY_COMMITTED; + } + + if (m_Commited) + { + // need to decommit first + LeaveCriticalSection(&m_CriticalSection); + return VFW_E_ALREADY_COMMITTED; + } + + if (m_Allocated != m_FreeList.size()) + { + // outstanding buffers + LeaveCriticalSection(&m_CriticalSection); + return VFW_E_BUFFERS_OUTSTANDING; + } + + pActual->cbAlign = m_cbAlign = pRequest->cbAlign; + pActual->cbBuffer = m_cbBuffer = pRequest->cbBuffer; + pActual->cbPrefix = m_cbPrefix = pRequest->cbPrefix; + pActual->cBuffers = m_cBuffers = pRequest->cBuffers; + + LeaveCriticalSection(&m_CriticalSection); + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CKsAllocator::GetProperties( + ALLOCATOR_PROPERTIES *pProps) +{ + if (!pProps) + return E_POINTER; + + pProps->cbBuffer = m_cbBuffer; + pProps->cBuffers = m_cBuffers; + pProps->cbAlign = m_cbAlign; + pProps->cbPrefix = m_cbPrefix; + + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CKsAllocator::Commit() +{ + LONG Index; + PUCHAR CurrentBuffer; + IMediaSample * Sample; + HRESULT hr; + + //TODO integer overflow checks + EnterCriticalSection(&m_CriticalSection); + + OutputDebugStringW(L"CKsAllocator::Commit\n"); + + if (m_Mode == KsAllocatorMode_Kernel) + { + /* no-op for kernel allocator */ + LeaveCriticalSection(&m_CriticalSection); + return NOERROR; + } + + if (m_Commited) + { + // already commited + LeaveCriticalSection(&m_CriticalSection); + return NOERROR; + } + + if (m_cbBuffer < 0 || m_cBuffers < 0 || m_cbPrefix < 0) + { + // invalid parameter + LeaveCriticalSection(&m_CriticalSection); + return E_OUTOFMEMORY; + } + + LONG Size = m_cbBuffer + m_cbPrefix; + + if (m_cbAlign > 1) + { + //check alignment + LONG Mod = Size % m_cbAlign; + if (Mod) + { + // calculate aligned size + Size += m_cbAlign - Mod; + } + } + + LONG TotalSize = Size * m_cBuffers; + + assert(TotalSize); + assert(m_cBuffers); + assert(Size); + + // now allocate buffer + m_Buffer = VirtualAlloc(NULL, TotalSize, MEM_COMMIT, PAGE_READWRITE); + if (!m_Buffer) + { + LeaveCriticalSection(&m_CriticalSection); + return E_OUTOFMEMORY; + } + + ZeroMemory(m_Buffer, TotalSize); + + CurrentBuffer = (PUCHAR)m_Buffer; + + for (Index = 0; Index < m_cBuffers; Index++) + { + // construct media sample + hr = CMediaSample_Constructor((IMemAllocator*)this, CurrentBuffer + m_cbPrefix, m_cbBuffer, IID_IMediaSample, (void**)&Sample); + if (FAILED(hr)) + { + LeaveCriticalSection(&m_CriticalSection); + return E_OUTOFMEMORY; + } + + // add to free list + m_FreeList.push(Sample); + m_Allocated++; + + //next sample buffer + CurrentBuffer += Size; + } + + // we are now commited + m_Commited = true; + + LeaveCriticalSection(&m_CriticalSection); + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CKsAllocator::Decommit() +{ + EnterCriticalSection(&m_CriticalSection); + + OutputDebugStringW(L"CKsAllocator::Decommit\n"); + + if (m_Mode == KsAllocatorMode_Kernel) + { + /* no-op for kernel allocator */ + LeaveCriticalSection(&m_CriticalSection); + return NOERROR; + } + + m_Commited = false; + + if (m_Allocated != m_FreeList.size()) + { + // outstanding buffers + m_FreeSamples = true; + LeaveCriticalSection(&m_CriticalSection); + return NOERROR; + } + else + { + // no outstanding buffers + // free to free them + FreeMediaSamples(); + } + + LeaveCriticalSection(&m_CriticalSection); + return NOERROR; +} + + +HRESULT +STDMETHODCALLTYPE +CKsAllocator::GetBuffer( + IMediaSample **ppBuffer, + REFERENCE_TIME *pStartTime, + REFERENCE_TIME *pEndTime, + DWORD dwFlags) +{ + IMediaSample * Sample = NULL; + OutputDebugStringW(L"CKsAllocator::GetBuffer\n"); + + do + { + EnterCriticalSection(&m_CriticalSection); + + if (!m_FreeList.empty()) + { + Sample = m_FreeList.top(); + m_FreeList.pop(); + } + + LeaveCriticalSection(&m_CriticalSection); + + if (dwFlags & AM_GBF_NOWAIT) + { + // never wait untill a buffer becomes available + break; + } + } + while(Sample == NULL); + + if (!Sample) + { + // no sample acquired + //HACKKKKKKK + Sample = m_UsedList.back(); + m_UsedList.pop_back(); + + if (!Sample) + return VFW_E_TIMEOUT; + } + + // store result + *ppBuffer = Sample; + + // store sample in used list + m_UsedList.push_front(Sample); + + // done + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CKsAllocator::ReleaseBuffer( + IMediaSample *pBuffer) +{ + EnterCriticalSection(&m_CriticalSection); + + OutputDebugStringW(L"CKsAllocator::ReleaseBuffer\n"); + + // media sample always 1 ref count in free list + pBuffer->AddRef(); + + // add the sample to the free list + m_FreeList.push(pBuffer); + + + if (m_FreeSamples) + { + // pending de-commit + if (m_FreeList.size () == m_Allocated) + { + FreeMediaSamples(); + } + } + + if (m_Notify) + { + //notify caller of an available buffer + m_Notify->NotifyRelease(); + } + + LeaveCriticalSection(&m_CriticalSection); + return S_OK; +} + +//------------------------------------------------------------------- +// IMemAllocatorCallbackTemp +// +HRESULT +STDMETHODCALLTYPE +CKsAllocator::SetNotify( + IMemAllocatorNotifyCallbackTemp *pNotify) +{ + EnterCriticalSection(&m_CriticalSection); + OutputDebugStringW(L"CKsAllocator::SetNotify\n"); + + if (pNotify) + pNotify->AddRef(); + + if (m_Notify) + m_Notify->Release(); + + m_Notify = pNotify; + + LeaveCriticalSection(&m_CriticalSection); + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CKsAllocator::GetFreeCount( + LONG *plBuffersFree) +{ + *plBuffersFree = m_Allocated - m_FreeList.size(); + return S_OK; +} + +//------------------------------------------------------------------- +// IKsAllocator +// +HANDLE +STDMETHODCALLTYPE +CKsAllocator::KsGetAllocatorHandle() +{ + return m_hAllocator; +} + +KSALLOCATORMODE +STDMETHODCALLTYPE +CKsAllocator::KsGetAllocatorMode() +{ + return m_Mode; +} + +HRESULT +STDMETHODCALLTYPE +CKsAllocator::KsGetAllocatorStatus( + PKSSTREAMALLOCATOR_STATUS AllocatorStatus) +{ + return NOERROR; +} +VOID +STDMETHODCALLTYPE +CKsAllocator::KsSetAllocatorMode( + KSALLOCATORMODE Mode) +{ + m_Mode = Mode; +} + +//------------------------------------------------------------------- +// IKsAllocatorEx +// +PALLOCATOR_PROPERTIES_EX +STDMETHODCALLTYPE +CKsAllocator::KsGetProperties() +{ + return &m_Properties; +} + +VOID +STDMETHODCALLTYPE +CKsAllocator::KsSetProperties( + PALLOCATOR_PROPERTIES_EX Properties) +{ + CopyMemory(&m_Properties, Properties, sizeof(ALLOCATOR_PROPERTIES_EX)); +} + +VOID +STDMETHODCALLTYPE +CKsAllocator::KsSetAllocatorHandle( + HANDLE AllocatorHandle) +{ + m_hAllocator = AllocatorHandle; +} + + +HANDLE +STDMETHODCALLTYPE +CKsAllocator::KsCreateAllocatorAndGetHandle( + IKsPin* KsPin) +{ + HRESULT hr; + IKsObject * pObject; + KSALLOCATOR_FRAMING AllocatorFraming; + HANDLE hPin; + + OutputDebugStringW(L"CKsAllocator::KsCreateAllocatorAndGetHandle\n"); + + if (m_hAllocator) + { + CloseHandle(m_hAllocator); + m_hAllocator = NULL; + } + + // get pin IKsObject interface + hr = KsPin->QueryInterface(IID_IKsObject, (void**)&pObject); + if (FAILED(hr)) + return NULL; + + // get pin handle + hPin = pObject->KsGetObjectHandle(); + + //release IKsObject interface + pObject->Release(); + + if (!hPin || hPin == INVALID_HANDLE_VALUE) + return NULL; + + //setup allocator framing + AllocatorFraming.Frames = m_Properties.cBuffers; + AllocatorFraming.FrameSize = m_Properties.cbBuffer; + AllocatorFraming.FileAlignment = (m_Properties.cbAlign -1); + AllocatorFraming.OptionsFlags = KSALLOCATOR_OPTIONF_SYSTEM_MEMORY; + AllocatorFraming.PoolType = (m_Properties.LogicalMemoryType == KS_MemoryTypeKernelPaged); + + DWORD dwError = KsCreateAllocator(hPin, &AllocatorFraming, &m_hAllocator); + if (dwError) + return NULL; + + return m_hAllocator; +} + +//------------------------------------------------------------------- +VOID +STDMETHODCALLTYPE +CKsAllocator::FreeMediaSamples() +{ + ULONG Index; + + for(Index = 0; Index < m_FreeList.size(); Index++) + { + IMediaSample * Sample = m_FreeList.top(); + m_FreeList.pop(); + delete Sample; + } + + m_FreeSamples = false; + m_Allocated = 0; + + if (m_Buffer) + { + // release buffer + VirtualFree(m_Buffer, 0, MEM_RELEASE); + + m_Buffer = NULL; + } +} + +HRESULT +WINAPI +CKsAllocator_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv) +{ + OutputDebugStringW(L"CKsAllocator_Constructor\n"); + + CKsAllocator * handler = new CKsAllocator(); + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/ksproxy/basicaudio.cpp b/reactos/dll/directx/ksproxy/basicaudio.cpp new file mode 100644 index 00000000000..7fec05f2140 --- /dev/null +++ b/reactos/dll/directx/ksproxy/basicaudio.cpp @@ -0,0 +1,256 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy + * FILE: dll/directx/ksproxy/basicaudio.cpp + * PURPOSE: IBasicAudio interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CKsBasicAudio : public IBasicAudio, + public IDistributorNotify +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + // IDistributorNotify methods + HRESULT STDMETHODCALLTYPE Stop(); + HRESULT STDMETHODCALLTYPE Pause(); + HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart); + HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock); + HRESULT STDMETHODCALLTYPE NotifyGraphChange(); + + // IDispatch methods + HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); + HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); + HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); + HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); + + + // IBasicAudio methods + HRESULT STDMETHODCALLTYPE put_Volume(long lVolume); + HRESULT STDMETHODCALLTYPE get_Volume(long *plVolume); + HRESULT STDMETHODCALLTYPE put_Balance(long lBalance); + HRESULT STDMETHODCALLTYPE get_Balance(long *plBalance); + + + CKsBasicAudio() : m_Ref(0){} + virtual ~CKsBasicAudio(){} + +protected: + LONG m_Ref; +}; + +HRESULT +STDMETHODCALLTYPE +CKsBasicAudio::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + if (IsEqualGUID(refiid, IID_IDistributorNotify)) + { + *Output = (IDistributorNotify*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IBasicAudio)) + { + *Output = (IBasicAudio*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IDistributorNotify interface +// + + +HRESULT +STDMETHODCALLTYPE +CKsBasicAudio::Stop() +{ + OutputDebugStringW(L"UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CKsBasicAudio::Pause() +{ + OutputDebugStringW(L"UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CKsBasicAudio::Run( + REFERENCE_TIME tStart) +{ + OutputDebugStringW(L"UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CKsBasicAudio::SetSyncSource( + IReferenceClock *pClock) +{ + OutputDebugStringW(L"UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CKsBasicAudio::NotifyGraphChange() +{ + OutputDebugStringW(L"UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// IDispatch interface +// + +HRESULT +STDMETHODCALLTYPE +CKsBasicAudio::GetTypeInfoCount( + UINT *pctinfo) +{ + OutputDebugStringW(L"UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CKsBasicAudio::GetTypeInfo( + UINT iTInfo, + LCID lcid, + ITypeInfo **ppTInfo) +{ + OutputDebugStringW(L"UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CKsBasicAudio::GetIDsOfNames( + REFIID riid, + LPOLESTR *rgszNames, + UINT cNames, + LCID lcid, + DISPID *rgDispId) +{ + OutputDebugStringW(L"UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CKsBasicAudio::Invoke( + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS *pDispParams, + VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, + UINT *puArgErr) +{ + OutputDebugStringW(L"UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// IBasicAudio interface +// + +HRESULT +STDMETHODCALLTYPE +CKsBasicAudio::put_Volume( + long lVolume) +{ + OutputDebugStringW(L"UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + + +HRESULT +STDMETHODCALLTYPE +CKsBasicAudio::get_Volume( + long *plVolume) +{ + OutputDebugStringW(L"UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + + +HRESULT +STDMETHODCALLTYPE +CKsBasicAudio::put_Balance( + long lBalance) +{ + OutputDebugStringW(L"UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + + +HRESULT +STDMETHODCALLTYPE +CKsBasicAudio::get_Balance( + long *plBalance) +{ + OutputDebugStringW(L"UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +WINAPI +CKsBasicAudio_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv) +{ + OutputDebugStringW(L"CKsBasicAudio_Constructor\n"); + + CKsBasicAudio * handler = new CKsBasicAudio(); + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/ksproxy/classfactory.cpp b/reactos/dll/directx/ksproxy/classfactory.cpp new file mode 100644 index 00000000000..5b90adeb868 --- /dev/null +++ b/reactos/dll/directx/ksproxy/classfactory.cpp @@ -0,0 +1,112 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy + * FILE: dll/directx/ksproxy/classfactory.cpp + * PURPOSE: IClassFactory interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CClassFactory : public IClassFactory +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject); + HRESULT WINAPI LockServer(BOOL fLock); + + CClassFactory(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, IID *riidInst) : m_Ref(1), m_lpfnCI(lpfnCI), m_IID(riidInst) + {}; + + virtual ~CClassFactory(){}; + +protected: + LONG m_Ref; + LPFNCREATEINSTANCE m_lpfnCI; + IID * m_IID; +}; + +HRESULT +WINAPI +CClassFactory::QueryInterface( + REFIID riid, + LPVOID *ppvObj) +{ + *ppvObj = NULL; + if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) + { + *ppvObj = PVOID(this); + InterlockedIncrement(&m_Ref); + return S_OK; + } + return E_NOINTERFACE; +} + +HRESULT +WINAPI +CClassFactory::CreateInstance( + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID *ppvObject) +{ + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + + *ppvObject = NULL; + + StringFromCLSID(riid, &lpstr); + + swprintf(Buffer, L"riid %s", lpstr); + OutputDebugStringW(Buffer); + + + if ( m_IID == NULL || IsEqualCLSID(riid, *m_IID) || IsEqualCLSID(riid, IID_IUnknown)) + { + return m_lpfnCI(pUnkOuter, riid, ppvObject); + } + + return E_NOINTERFACE; +} + +HRESULT +WINAPI +CClassFactory::LockServer( + BOOL fLock) +{ + return E_NOTIMPL; +} + +IClassFactory * +CClassFactory_fnConstructor( + LPFNCREATEINSTANCE lpfnCI, + PLONG pcRefDll, + IID * riidInst) +{ + CClassFactory* factory = new CClassFactory(lpfnCI, pcRefDll, riidInst); + + if (!factory) + return NULL; + + if (pcRefDll) + InterlockedIncrement(pcRefDll); + + return (LPCLASSFACTORY)factory; +} diff --git a/reactos/dll/directx/ksproxy/clockforward.cpp b/reactos/dll/directx/ksproxy/clockforward.cpp new file mode 100644 index 00000000000..d692dec5f63 --- /dev/null +++ b/reactos/dll/directx/ksproxy/clockforward.cpp @@ -0,0 +1,361 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy + * FILE: dll/directx/ksproxy/clockforward.cpp + * PURPOSE: IKsClockForwarder interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +#ifndef _MSC_VER +const GUID KSCATEGORY_CLOCK = {0x53172480, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; +#endif + +DWORD WINAPI CKsClockForwarder_ThreadStartup(LPVOID lpParameter); + +class CKsClockForwarder : public IDistributorNotify, + public IKsObject +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + // IDistributorNotify interface + HRESULT STDMETHODCALLTYPE Stop(); + HRESULT STDMETHODCALLTYPE Pause(); + HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart); + HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock); + HRESULT STDMETHODCALLTYPE NotifyGraphChange(); + + // IKsObject interface + HANDLE STDMETHODCALLTYPE KsGetObjectHandle(); + + CKsClockForwarder(HANDLE handle); + virtual ~CKsClockForwarder(){}; + HRESULT STDMETHODCALLTYPE SetClockState(KSSTATE State); +protected: + LONG m_Ref; + HANDLE m_Handle; + IReferenceClock * m_Clock; + HANDLE m_hEvent; + HANDLE m_hThread; + BOOL m_ThreadStarted; + BOOL m_PendingStop; + BOOL m_ForceStart; + KSSTATE m_State; + REFERENCE_TIME m_Time; + + friend DWORD WINAPI CKsClockForwarder_ThreadStartup(LPVOID lpParameter); +}; + +CKsClockForwarder::CKsClockForwarder( + HANDLE handle) : m_Ref(0), + m_Handle(handle), + m_Clock(0), + m_hEvent(NULL), + m_hThread(NULL), + m_ThreadStarted(FALSE), + m_PendingStop(FALSE), + m_ForceStart(FALSE), + m_State(KSSTATE_STOP), + m_Time(0) +{ +} + +HRESULT +STDMETHODCALLTYPE +CKsClockForwarder::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + if (IsEqualGUID(refiid, IID_IKsObject)) + { + *Output = (IKsObject*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IDistributorNotify)) + { + *Output = (IDistributorNotify*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + +#if 0 + if (IsEqualGUID(refiid, IID_IKsClockForwarder)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } +#endif + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IDistributorNotify interface +// + + +HRESULT +STDMETHODCALLTYPE +CKsClockForwarder::Stop() +{ + OutputDebugString("CKsClockForwarder::Stop\n"); + + if (m_ThreadStarted) + { + // signal pending stop + m_PendingStop = true; + + assert(m_hThread); + assert(m_hEvent); + + // set stop event + SetEvent(m_hEvent); + + // wait untill the thread has finished + WaitForSingleObject(m_hThread, INFINITE); + + // close thread handle + CloseHandle(m_hThread); + + // zero handle + m_hThread = NULL; + } + + if (m_hEvent) + { + // close stop event + CloseHandle(m_hEvent); + m_hEvent = NULL; + } + + m_PendingStop = false; + + SetClockState(KSSTATE_STOP); + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CKsClockForwarder::Pause() +{ + OutputDebugString("CKsClockForwarder::Pause\n"); + + if (!m_hEvent) + { + m_hEvent = CreateEventW(NULL, FALSE, FALSE, NULL); + if (!m_hEvent) + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); + } + + if (m_State <= KSSTATE_PAUSE) + { + if (m_State == KSSTATE_STOP) + SetClockState(KSSTATE_ACQUIRE); + + if (m_State == KSSTATE_ACQUIRE) + SetClockState(KSSTATE_PAUSE); + } + else + { + if (!m_ForceStart) + { + SetClockState(KSSTATE_PAUSE); + } + } + + if (!m_hThread) + { + m_hThread = CreateThread(NULL, 0, CKsClockForwarder_ThreadStartup, (LPVOID)this, 0, NULL); + if (!m_hThread) + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); + } + + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CKsClockForwarder::Run( + REFERENCE_TIME tStart) +{ + OutputDebugString("CKsClockForwarder::Run\n"); + + m_Time = tStart; + + if (!m_hEvent || !m_hThread) + { + m_ForceStart = TRUE; + HRESULT hr = Pause(); + m_ForceStart = FALSE; + + if (FAILED(hr)) + return hr; + } + + assert(m_hThread); + + SetClockState(KSSTATE_RUN); + SetEvent(m_hEvent); + + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CKsClockForwarder::SetSyncSource( + IReferenceClock *pClock) +{ + OutputDebugString("CKsClockForwarder::SetSyncSource\n"); + + if (pClock) + pClock->AddRef(); + + if (m_Clock) + m_Clock->Release(); + + + m_Clock = pClock; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CKsClockForwarder::NotifyGraphChange() +{ + OutputDebugString("CKsClockForwarder::NotifyGraphChange\n"); + DebugBreak(); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// IKsObject interface +// + +HANDLE +STDMETHODCALLTYPE +CKsClockForwarder::KsGetObjectHandle() +{ + return m_Handle; +} + +//------------------------------------------------------------------- +HRESULT +STDMETHODCALLTYPE +CKsClockForwarder::SetClockState(KSSTATE State) +{ + KSPROPERTY Property; + ULONG BytesReturned; + + Property.Set = KSPROPSETID_Clock; + Property.Id = KSPROPERTY_CLOCK_STATE; + Property.Flags = KSPROPERTY_TYPE_SET; + + HRESULT hr = KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), &State, sizeof(KSSTATE), &BytesReturned); + if (SUCCEEDED(hr)) + m_State = State; + + return hr; +} + +DWORD +WINAPI +CKsClockForwarder_ThreadStartup(LPVOID lpParameter) +{ + REFERENCE_TIME Time; + ULONG BytesReturned; + + CKsClockForwarder * Fwd = (CKsClockForwarder*)lpParameter; + + Fwd->m_ThreadStarted = TRUE; + + do + { + if (Fwd->m_PendingStop) + break; + + if (Fwd->m_State != KSSTATE_RUN) + WaitForSingleObject(Fwd->m_hEvent, INFINITE); + + KSPROPERTY Property; + Property.Set = KSPROPSETID_Clock; + Property.Id = KSPROPERTY_CLOCK_TIME; + Property.Flags = KSPROPERTY_TYPE_SET; + + Fwd->m_Clock->GetTime(&Time); + Time -= Fwd->m_Time; + + KsSynchronousDeviceControl(Fwd->m_Handle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), &Time, sizeof(REFERENCE_TIME), &BytesReturned); + } + while(TRUE); + + Fwd->m_ThreadStarted = FALSE; + return NOERROR; +} + +HRESULT +WINAPI +CKsClockForwarder_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv) +{ + HRESULT hr; + HANDLE handle; + + OutputDebugStringW(L"CKsClockForwarder_Constructor\n"); + + // open default clock + hr = KsOpenDefaultDevice(KSCATEGORY_CLOCK, GENERIC_READ | GENERIC_WRITE, &handle); + + if (hr != NOERROR) + { + OutputDebugString("CKsClockForwarder_Constructor failed to open device\n"); + return hr; + } + + CKsClockForwarder * clock = new CKsClockForwarder(handle); + + if (!clock) + { + // free clock handle + CloseHandle(handle); + return E_OUTOFMEMORY; + } + + if (FAILED(clock->QueryInterface(riid, ppv))) + { + /* not supported */ + delete clock; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/ksproxy/cvpconfig.cpp b/reactos/dll/directx/ksproxy/cvpconfig.cpp new file mode 100644 index 00000000000..91d2006ad49 --- /dev/null +++ b/reactos/dll/directx/ksproxy/cvpconfig.cpp @@ -0,0 +1,319 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy + * FILE: dll/directx/ksproxy/cvpconfig.cpp + * PURPOSE: IVPConfig interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CVPConfig : public IVPConfig, + public IDistributorNotify +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + // IDistributorNotify interface + HRESULT STDMETHODCALLTYPE Stop(); + HRESULT STDMETHODCALLTYPE Pause(); + HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart); + HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock); + HRESULT STDMETHODCALLTYPE NotifyGraphChange(); + + // IVPBaseConfig + HRESULT STDMETHODCALLTYPE GetConnectInfo(LPDWORD pdwNumConnectInfo, IN OUT LPDDVIDEOPORTCONNECT pddVPConnectInfo); + HRESULT STDMETHODCALLTYPE SetConnectInfo(DWORD dwChosenEntry); + HRESULT STDMETHODCALLTYPE GetVPDataInfo(LPAMVPDATAINFO pamvpDataInfo); + HRESULT STDMETHODCALLTYPE GetMaxPixelRate(LPAMVPSIZE pamvpSize, OUT LPDWORD pdwMaxPixelsPerSecond); + HRESULT STDMETHODCALLTYPE InformVPInputFormats(DWORD dwNumFormats, IN LPDDPIXELFORMAT pDDPixelFormats); + HRESULT STDMETHODCALLTYPE GetVideoFormats(LPDWORD pdwNumFormats, IN OUT LPDDPIXELFORMAT pddPixelFormats); + HRESULT STDMETHODCALLTYPE SetVideoFormat(DWORD dwChosenEntry); + HRESULT STDMETHODCALLTYPE SetInvertPolarity(); + HRESULT STDMETHODCALLTYPE GetOverlaySurface(LPDIRECTDRAWSURFACE* ppddOverlaySurface); + HRESULT STDMETHODCALLTYPE SetDirectDrawKernelHandle(ULONG_PTR dwDDKernelHandle); + HRESULT STDMETHODCALLTYPE SetVideoPortID(IN DWORD dwVideoPortID); + HRESULT STDMETHODCALLTYPE SetDDSurfaceKernelHandles(DWORD cHandles, IN ULONG_PTR *rgDDKernelHandles); + HRESULT STDMETHODCALLTYPE SetSurfaceParameters(DWORD dwPitch, IN DWORD dwXOrigin, IN DWORD dwYOrigin); + // IVPConfig + HRESULT STDMETHODCALLTYPE IsVPDecimationAllowed(LPBOOL pbIsDecimationAllowed); + HRESULT STDMETHODCALLTYPE SetScalingFactors(LPAMVPSIZE pamvpSize); + + CVPConfig() : m_Ref(0){} + virtual ~CVPConfig(){} + +protected: + LONG m_Ref; +}; + + +HRESULT +STDMETHODCALLTYPE +CVPConfig::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + if (IsEqualGUID(refiid, IID_IDistributorNotify)) + { + *Output = (IDistributorNotify*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IVPConfig)) + { + *Output = (IVPConfig*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IDistributorNotify interface +// + + +HRESULT +STDMETHODCALLTYPE +CVPConfig::Stop() +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPConfig::Pause() +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPConfig::Run( + REFERENCE_TIME tStart) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPConfig::SetSyncSource( + IReferenceClock *pClock) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPConfig::NotifyGraphChange() +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// IVPBaseConfig +// +HRESULT +STDMETHODCALLTYPE +CVPConfig::GetConnectInfo( + LPDWORD pdwNumConnectInfo, + IN OUT LPDDVIDEOPORTCONNECT pddVPConnectInfo) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPConfig::SetConnectInfo( + DWORD dwChosenEntry) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPConfig::GetVPDataInfo( + LPAMVPDATAINFO pamvpDataInfo) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPConfig::GetMaxPixelRate( + LPAMVPSIZE pamvpSize, + OUT LPDWORD pdwMaxPixelsPerSecond) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPConfig::InformVPInputFormats( + DWORD dwNumFormats, + IN LPDDPIXELFORMAT pDDPixelFormats) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPConfig::GetVideoFormats( + LPDWORD pdwNumFormats, + IN OUT LPDDPIXELFORMAT pddPixelFormats) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPConfig::SetVideoFormat( + DWORD dwChosenEntry) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPConfig::SetInvertPolarity() +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPConfig::GetOverlaySurface( + LPDIRECTDRAWSURFACE* ppddOverlaySurface) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPConfig::SetDirectDrawKernelHandle( + ULONG_PTR dwDDKernelHandle) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPConfig::SetVideoPortID( + IN DWORD dwVideoPortID) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + + +HRESULT +STDMETHODCALLTYPE +CVPConfig::SetDDSurfaceKernelHandles( + DWORD cHandles, + IN ULONG_PTR *rgDDKernelHandles) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + + +HRESULT +STDMETHODCALLTYPE +CVPConfig::SetSurfaceParameters( + DWORD dwPitch, + IN DWORD dwXOrigin, + IN DWORD dwYOrigin) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// IVPConfig +// + +HRESULT +STDMETHODCALLTYPE +CVPConfig::IsVPDecimationAllowed( + LPBOOL pbIsDecimationAllowed) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPConfig::SetScalingFactors( + LPAMVPSIZE pamvpSize) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + + + + +HRESULT +WINAPI +CVPConfig_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv) +{ + OutputDebugStringW(L"CVPConfig_Constructor\n"); + + CVPConfig * handler = new CVPConfig(); + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} + diff --git a/reactos/dll/directx/ksproxy/cvpvbiconfig.cpp b/reactos/dll/directx/ksproxy/cvpvbiconfig.cpp new file mode 100644 index 00000000000..016d060aa24 --- /dev/null +++ b/reactos/dll/directx/ksproxy/cvpvbiconfig.cpp @@ -0,0 +1,290 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy + * FILE: dll/directx/ksproxy/cvpvbiconfig.cpp + * PURPOSE: CVPVBIConfig interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CVPVBIConfig : public IVPVBIConfig, + public IDistributorNotify +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + // IDistributorNotify interface + HRESULT STDMETHODCALLTYPE Stop(); + HRESULT STDMETHODCALLTYPE Pause(); + HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart); + HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock); + HRESULT STDMETHODCALLTYPE NotifyGraphChange(); + + // IVPBaseConfig + HRESULT STDMETHODCALLTYPE GetConnectInfo(LPDWORD pdwNumConnectInfo, IN OUT LPDDVIDEOPORTCONNECT pddVPConnectInfo); + HRESULT STDMETHODCALLTYPE SetConnectInfo(DWORD dwChosenEntry); + HRESULT STDMETHODCALLTYPE GetVPDataInfo(LPAMVPDATAINFO pamvpDataInfo); + HRESULT STDMETHODCALLTYPE GetMaxPixelRate(LPAMVPSIZE pamvpSize, OUT LPDWORD pdwMaxPixelsPerSecond); + HRESULT STDMETHODCALLTYPE InformVPInputFormats(DWORD dwNumFormats, IN LPDDPIXELFORMAT pDDPixelFormats); + HRESULT STDMETHODCALLTYPE GetVideoFormats(LPDWORD pdwNumFormats, IN OUT LPDDPIXELFORMAT pddPixelFormats); + HRESULT STDMETHODCALLTYPE SetVideoFormat(DWORD dwChosenEntry); + HRESULT STDMETHODCALLTYPE SetInvertPolarity(); + HRESULT STDMETHODCALLTYPE GetOverlaySurface(LPDIRECTDRAWSURFACE* ppddOverlaySurface); + HRESULT STDMETHODCALLTYPE SetDirectDrawKernelHandle(ULONG_PTR dwDDKernelHandle); + HRESULT STDMETHODCALLTYPE SetVideoPortID(IN DWORD dwVideoPortID); + HRESULT STDMETHODCALLTYPE SetDDSurfaceKernelHandles(DWORD cHandles, IN ULONG_PTR *rgDDKernelHandles); + HRESULT STDMETHODCALLTYPE SetSurfaceParameters(DWORD dwPitch, IN DWORD dwXOrigin, IN DWORD dwYOrigin); + + CVPVBIConfig() : m_Ref(0){} + virtual ~CVPVBIConfig(){} + +protected: + LONG m_Ref; +}; + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + if (IsEqualGUID(refiid, IID_IDistributorNotify)) + { + *Output = (IDistributorNotify*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IVPVBIConfig)) + { + *Output = (IVPConfig*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IDistributorNotify interface +// + + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::Stop() +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::Pause() +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::Run( + REFERENCE_TIME tStart) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::SetSyncSource( + IReferenceClock *pClock) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::NotifyGraphChange() +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// IVPBaseConfig +// +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::GetConnectInfo( + LPDWORD pdwNumConnectInfo, + IN OUT LPDDVIDEOPORTCONNECT pddVPConnectInfo) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::SetConnectInfo( + DWORD dwChosenEntry) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::GetVPDataInfo( + LPAMVPDATAINFO pamvpDataInfo) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::GetMaxPixelRate( + LPAMVPSIZE pamvpSize, + OUT LPDWORD pdwMaxPixelsPerSecond) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::InformVPInputFormats( + DWORD dwNumFormats, + IN LPDDPIXELFORMAT pDDPixelFormats) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::GetVideoFormats( + LPDWORD pdwNumFormats, + IN OUT LPDDPIXELFORMAT pddPixelFormats) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::SetVideoFormat( + DWORD dwChosenEntry) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::SetInvertPolarity() +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::GetOverlaySurface( + LPDIRECTDRAWSURFACE* ppddOverlaySurface) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::SetDirectDrawKernelHandle( + ULONG_PTR dwDDKernelHandle) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::SetVideoPortID( + IN DWORD dwVideoPortID) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::SetDDSurfaceKernelHandles( + DWORD cHandles, + IN ULONG_PTR *rgDDKernelHandles) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + + +HRESULT +STDMETHODCALLTYPE +CVPVBIConfig::SetSurfaceParameters( + DWORD dwPitch, + IN DWORD dwXOrigin, + IN DWORD dwYOrigin) +{ + OutputDebugString("UNIMPLEMENTED\n"); + return E_NOTIMPL; +} + + +HRESULT +WINAPI +CVPVBIConfig_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv) +{ + OutputDebugStringW(L"CVPVBIConfig_Constructor\n"); + + CVPVBIConfig * handler = new CVPVBIConfig(); + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/ksproxy/datatype.cpp b/reactos/dll/directx/ksproxy/datatype.cpp new file mode 100644 index 00000000000..5006b68a121 --- /dev/null +++ b/reactos/dll/directx/ksproxy/datatype.cpp @@ -0,0 +1,245 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy + * FILE: dll/directx/ksproxy/datatype.cpp + * PURPOSE: IKsDataTypeHandler interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +/* FIXME guid mess */ +#ifndef _MSC_VER +const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; +#endif +const GUID IID_IClassFactory = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; + +class CKsDataTypeHandler : public IKsDataTypeHandler +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + HRESULT STDMETHODCALLTYPE KsCompleteIoOperation(IN OUT IMediaSample *Sample, IN OUT PVOID StreamHeader, IN KSIOOPERATION IoOperation, IN BOOL Cancelled); + HRESULT STDMETHODCALLTYPE KsIsMediaTypeInRanges(IN PVOID DataRanges); + HRESULT STDMETHODCALLTYPE KsPrepareIoOperation(IN OUT IMediaSample *Sample, IN OUT PVOID StreamHeader, IN KSIOOPERATION IoOperation); + HRESULT STDMETHODCALLTYPE KsQueryExtendedSize(OUT ULONG* ExtendedSize); + HRESULT STDMETHODCALLTYPE KsSetMediaType(IN const AM_MEDIA_TYPE* AmMediaType); + + CKsDataTypeHandler() : m_Ref(0), m_Type(0){}; + virtual ~CKsDataTypeHandler() + { + if (m_Type) + { + if (m_Type->pbFormat) + CoTaskMemFree(m_Type->pbFormat); + + if (m_Type->pUnk) + m_Type->pUnk->Release(); + + CoTaskMemFree(m_Type); + } + + }; + +protected: + LONG m_Ref; + AM_MEDIA_TYPE * m_Type; +}; + + +HRESULT +STDMETHODCALLTYPE +CKsDataTypeHandler::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown) || + IsEqualGUID(refiid, IID_IKsDataTypeHandler)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + return E_NOINTERFACE; +} + + +HRESULT +STDMETHODCALLTYPE +CKsDataTypeHandler::KsCompleteIoOperation( + IN OUT IMediaSample *Sample, + IN OUT PVOID StreamHeader, + IN KSIOOPERATION IoOperation, + IN BOOL Cancelled) +{ + return NOERROR; +} + + +HRESULT +STDMETHODCALLTYPE +CKsDataTypeHandler::KsIsMediaTypeInRanges( + IN PVOID DataRanges) +{ + PKSMULTIPLE_ITEM DataList; + PKSDATARANGE DataRange; + ULONG Index; + HRESULT hr = S_FALSE; + + OutputDebugStringW(L"CKsDataTypeHandler::KsIsMediaTypeInRanges\n"); + + DataList = (PKSMULTIPLE_ITEM)DataRanges; + DataRange = (PKSDATARANGE)(DataList + 1); + + for(Index = 0; Index < DataList->Count; Index++) + { + BOOL bMatch = FALSE; + + if (DataRange->FormatSize >= sizeof(KSDATARANGE)) + { + bMatch = IsEqualGUID(DataRange->MajorFormat, GUID_NULL); + } + + if (!bMatch && DataRange->FormatSize >= sizeof(KSDATARANGE_AUDIO)) + { + bMatch = IsEqualGUID(DataRange->MajorFormat, MEDIATYPE_Audio); + } + + if (bMatch) + { + if (IsEqualGUID(DataRange->SubFormat, m_Type->subtype) || + IsEqualGUID(DataRange->SubFormat, GUID_NULL)) + { + if (IsEqualGUID(DataRange->Specifier, m_Type->formattype) || + IsEqualGUID(DataRange->Specifier, GUID_NULL)) + { + if (!IsEqualGUID(m_Type->formattype, FORMAT_WaveFormatEx) && !IsEqualGUID(DataRange->Specifier, FORMAT_WaveFormatEx)) + { + //found match + hr = S_OK; + break; + } + + if (DataRange->FormatSize >= sizeof(KSDATARANGE_AUDIO) && m_Type->cbFormat >= sizeof(WAVEFORMATEX)) + { + LPWAVEFORMATEX Format = (LPWAVEFORMATEX)m_Type->pbFormat; + PKSDATARANGE_AUDIO AudioRange = (PKSDATARANGE_AUDIO)DataRange; + + if (Format->nSamplesPerSec >= AudioRange->MinimumSampleFrequency && + Format->nSamplesPerSec <= AudioRange->MaximumSampleFrequency && + Format->wBitsPerSample >= AudioRange->MinimumSampleFrequency && + Format->wBitsPerSample <= AudioRange->MaximumBitsPerSample && + Format->nChannels <= AudioRange->MaximumChannels) + { + // found match + hr = S_OK; + break; + } + } + } + } + } + + DataRange = (PKSDATARANGE)(((ULONG_PTR)DataRange + DataRange->FormatSize + 7) & ~7); + } + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CKsDataTypeHandler::KsPrepareIoOperation( + IN OUT IMediaSample *Sample, + IN OUT PVOID StreamHeader, + IN KSIOOPERATION IoOperation) +{ + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CKsDataTypeHandler::KsQueryExtendedSize( + OUT ULONG* ExtendedSize) +{ + /* no header extension required */ + *ExtendedSize = 0; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CKsDataTypeHandler::KsSetMediaType( + IN const AM_MEDIA_TYPE* AmMediaType) +{ + OutputDebugString("CKsDataTypeHandler::KsSetMediaType\n"); + + if (m_Type) + { + /* media type can only be set once */ + return E_FAIL; + } + + m_Type = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); + if (!m_Type) + return E_OUTOFMEMORY; + + CopyMemory(m_Type, AmMediaType, sizeof(AM_MEDIA_TYPE)); + + if (m_Type->cbFormat) + { + m_Type->pbFormat = (BYTE*)CoTaskMemAlloc(m_Type->cbFormat); + + if (!m_Type->pbFormat) + { + CoTaskMemFree(m_Type); + return E_OUTOFMEMORY; + } + + CopyMemory(m_Type->pbFormat, AmMediaType->pbFormat, m_Type->cbFormat); + } + + if (m_Type->pUnk) + m_Type->pUnk->AddRef(); + + + return S_OK; +} + +HRESULT +WINAPI +CKsDataTypeHandler_Constructor ( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv) +{ + OutputDebugStringW(L"CKsDataTypeHandler_Constructor\n"); + CKsDataTypeHandler * handler = new CKsDataTypeHandler(); + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/ksproxy/enum_mediatypes.cpp b/reactos/dll/directx/ksproxy/enum_mediatypes.cpp new file mode 100644 index 00000000000..462ffda24fc --- /dev/null +++ b/reactos/dll/directx/ksproxy/enum_mediatypes.cpp @@ -0,0 +1,211 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Network Provider for MPEG2 based networks + * FILE: dll/directx/msdvbnp/enum_mediatypes.cpp + * PURPOSE: IEnumMediaTypes interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CEnumMediaTypes : public IEnumMediaTypes +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + HRESULT STDMETHODCALLTYPE Next(ULONG cMediaTypes, AM_MEDIA_TYPE **ppMediaTypes, ULONG *pcFetched); + HRESULT STDMETHODCALLTYPE Skip(ULONG cMediaTypes); + HRESULT STDMETHODCALLTYPE Reset(); + HRESULT STDMETHODCALLTYPE Clone(IEnumMediaTypes **ppEnum); + + + CEnumMediaTypes(ULONG MediaTypeCount, AM_MEDIA_TYPE * MediaTypes) : m_Ref(0), m_MediaTypeCount(MediaTypeCount), m_MediaTypes(MediaTypes), m_Index(0){}; + virtual ~CEnumMediaTypes(){}; + +protected: + LONG m_Ref; + ULONG m_MediaTypeCount; + AM_MEDIA_TYPE * m_MediaTypes; + ULONG m_Index; +}; + +HRESULT +STDMETHODCALLTYPE +CEnumMediaTypes::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + if (IsEqualGUID(refiid, IID_IEnumMediaTypes)) + { + *Output = (IEnumMediaTypes*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CEnumMediaTypes::QueryInterface: NoInterface for %s\n", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IEnumMediaTypes +// + +HRESULT +STDMETHODCALLTYPE +CEnumMediaTypes::Next( + ULONG cMediaTypes, + AM_MEDIA_TYPE **ppMediaTypes, + ULONG *pcFetched) +{ + ULONG i = 0; + AM_MEDIA_TYPE * MediaType; + + if (!ppMediaTypes) + return E_POINTER; + + if (cMediaTypes > 1 && !pcFetched) + return E_INVALIDARG; + + while(i < cMediaTypes) + { + if (m_Index + i >= m_MediaTypeCount) + break; + + MediaType = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); + if (!MediaType) + break; + + if (m_MediaTypes[m_Index + i].cbFormat) + { + LPBYTE pFormat = (LPBYTE)CoTaskMemAlloc(m_MediaTypes[m_Index + i].cbFormat); + if (!pFormat) + { + CoTaskMemFree(MediaType); + break; + } + + CopyMemory(MediaType, &m_MediaTypes[m_Index + i], sizeof(AM_MEDIA_TYPE)); + MediaType->pbFormat = pFormat; + CopyMemory(MediaType->pbFormat, m_MediaTypes[m_Index + i].pbFormat, m_MediaTypes[m_Index + i].cbFormat); + MediaType->pUnk = (IUnknown *)this; + MediaType->pUnk->AddRef(); + } + else + { + CopyMemory(MediaType, &m_MediaTypes[m_Index + i], sizeof(AM_MEDIA_TYPE)); + } + + if (MediaType->pUnk) + { + MediaType->pUnk->AddRef(); + } + + ppMediaTypes[i] = MediaType; + i++; + } + + if (pcFetched) + { + *pcFetched = i; + } + + m_Index += i; + if (i < cMediaTypes) + return S_FALSE; + else + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CEnumMediaTypes::Skip( + ULONG cMediaTypes) +{ + if (cMediaTypes + m_Index >= m_MediaTypeCount) + { + return S_FALSE; + } + + m_Index += cMediaTypes; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CEnumMediaTypes::Reset() +{ + m_Index = 0; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CEnumMediaTypes::Clone( + IEnumMediaTypes **ppEnum) +{ + OutputDebugStringW(L"CEnumMediaTypes::Clone : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +WINAPI +CEnumMediaTypes_fnConstructor( + ULONG MediaTypeCount, + AM_MEDIA_TYPE * MediaTypes, + REFIID riid, + LPVOID * ppv) +{ + CEnumMediaTypes * handler = new CEnumMediaTypes(MediaTypeCount, MediaTypes); + +#ifdef KSPROXY_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(riid, &lpstr); + swprintf(Buffer, L"CEnumMediaTypes_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); + OutputDebugStringW(Buffer); +#endif + + if (!handler) + { + CoTaskMemFree(MediaTypes); + return E_OUTOFMEMORY; + } + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} + diff --git a/reactos/dll/directx/ksproxy/enumpins.cpp b/reactos/dll/directx/ksproxy/enumpins.cpp new file mode 100644 index 00000000000..5c0f0ecd7bd --- /dev/null +++ b/reactos/dll/directx/ksproxy/enumpins.cpp @@ -0,0 +1,159 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Network Provider for MPEG2 based networks + * FILE: dll/directx/msdvbnp/enumpins.cpp + * PURPOSE: IEnumPins interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CEnumPins : public IEnumPins +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + + HRESULT STDMETHODCALLTYPE Next(ULONG cPins, IPin **ppPins, ULONG *pcFetched); + HRESULT STDMETHODCALLTYPE Skip(ULONG cPins); + HRESULT STDMETHODCALLTYPE Reset(); + HRESULT STDMETHODCALLTYPE Clone(IEnumPins **ppEnum); + + CEnumPins(std::vector Pins) : m_Ref(0), m_Pins(Pins), m_Index(0){}; + virtual ~CEnumPins(){}; + +protected: + LONG m_Ref; + std::vector m_Pins; + ULONG m_Index; +}; + +HRESULT +STDMETHODCALLTYPE +CEnumPins::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + *Output = NULL; + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + if (IsEqualGUID(refiid, IID_IEnumPins)) + { + *Output = (IEnumPins*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CEnumPins::Next( + ULONG cPins, + IPin **ppPins, + ULONG *pcFetched) +{ + ULONG i = 0; + + if (!ppPins) + return E_POINTER; + + if (cPins > 1 && !pcFetched) + return E_INVALIDARG; + + while(i < cPins) + { + if (m_Index + i >= m_Pins.size()) + break; + + ppPins[i] = m_Pins[m_Index + i]; + m_Pins[m_Index + i]->AddRef(); + + i++; + } + + if (pcFetched) + { + *pcFetched = i; + } + + m_Index += i; + if (i < cPins) + return S_FALSE; + else + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CEnumPins::Skip( + ULONG cPins) +{ + if (cPins + m_Index >= m_Pins.size()) + { + return S_FALSE; + } + + m_Index += cPins; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CEnumPins::Reset() +{ + m_Index = 0; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CEnumPins::Clone( + IEnumPins **ppEnum) +{ + OutputDebugStringW(L"CEnumPins::Clone : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +WINAPI +CEnumPins_fnConstructor( + std::vector Pins, + REFIID riid, + LPVOID * ppv) +{ + CEnumPins * handler = new CEnumPins(Pins); + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} \ No newline at end of file diff --git a/reactos/dll/directx/ksproxy/input_pin.cpp b/reactos/dll/directx/ksproxy/input_pin.cpp new file mode 100644 index 00000000000..783ff703e5e --- /dev/null +++ b/reactos/dll/directx/ksproxy/input_pin.cpp @@ -0,0 +1,1498 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy + * FILE: dll/directx/ksproxy/input_pin.cpp + * PURPOSE: InputPin of Proxy Filter + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +const GUID IID_IKsPinPipe = {0xe539cd90, 0xa8b4, 0x11d1, {0x81, 0x89, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02}}; +const GUID IID_IKsPinEx = {0x7bb38260L, 0xd19c, 0x11d2, {0xb3, 0x8a, 0x00, 0xa0, 0xc9, 0x5e, 0xc2, 0x2e}}; + + +#ifndef _MSC_VER + +const GUID KSPROPSETID_Connection = {0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; + +KSPIN_INTERFACE StandardPinInterface = +{ + {STATIC_KSINTERFACESETID_Standard}, + KSINTERFACE_STANDARD_STREAMING, + 0 +}; + +KSPIN_MEDIUM StandardPinMedium = +{ + {STATIC_KSMEDIUMSETID_Standard}, + KSMEDIUM_TYPE_ANYINSTANCE, + 0 +}; + +#else + +KSPIN_INTERFACE StandardPinInterface = +{ + STATIC_KSINTERFACESETID_Standard, + KSINTERFACE_STANDARD_STREAMING, + 0 +}; + +KSPIN_MEDIUM StandardPinMedium = +{ + STATIC_KSMEDIUMSETID_Standard, + KSMEDIUM_TYPE_ANYINSTANCE, + 0 +}; + +#endif + +class CInputPin : public IPin, + public IKsPropertySet, + public IKsControl, + public IKsObject, + public IKsPinEx, + public IMemInputPin, + public IKsPinPipe, + public IKsPinFactory, + public IStreamBuilder, + public IKsAggregateControl, + public IQualityControl, + public ISpecifyPropertyPages +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + //IKsPinPipe + HRESULT STDMETHODCALLTYPE KsGetPinFramingCache(PKSALLOCATOR_FRAMING_EX *FramingEx, PFRAMING_PROP FramingProp, FRAMING_CACHE_OPS Option); + HRESULT STDMETHODCALLTYPE KsSetPinFramingCache(PKSALLOCATOR_FRAMING_EX FramingEx, PFRAMING_PROP FramingProp, FRAMING_CACHE_OPS Option); + IPin* STDMETHODCALLTYPE KsGetConnectedPin(); + IKsAllocatorEx* STDMETHODCALLTYPE KsGetPipe(KSPEEKOPERATION Operation); + HRESULT STDMETHODCALLTYPE KsSetPipe(IKsAllocatorEx *KsAllocator); + ULONG STDMETHODCALLTYPE KsGetPipeAllocatorFlag(); + HRESULT STDMETHODCALLTYPE KsSetPipeAllocatorFlag(ULONG Flag); + GUID STDMETHODCALLTYPE KsGetPinBusCache(); + HRESULT STDMETHODCALLTYPE KsSetPinBusCache(GUID Bus); + PWCHAR STDMETHODCALLTYPE KsGetPinName(); + PWCHAR STDMETHODCALLTYPE KsGetFilterName(); + + //IPin methods + HRESULT STDMETHODCALLTYPE Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE Disconnect(); + HRESULT STDMETHODCALLTYPE ConnectedTo(IPin **pPin); + HRESULT STDMETHODCALLTYPE ConnectionMediaType(AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE QueryPinInfo(PIN_INFO *pInfo); + HRESULT STDMETHODCALLTYPE QueryDirection(PIN_DIRECTION *pPinDir); + HRESULT STDMETHODCALLTYPE QueryId(LPWSTR *Id); + HRESULT STDMETHODCALLTYPE QueryAccept(const AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE EnumMediaTypes(IEnumMediaTypes **ppEnum); + HRESULT STDMETHODCALLTYPE QueryInternalConnections(IPin **apPin, ULONG *nPin); + HRESULT STDMETHODCALLTYPE EndOfStream(); + HRESULT STDMETHODCALLTYPE BeginFlush(); + HRESULT STDMETHODCALLTYPE EndFlush(); + HRESULT STDMETHODCALLTYPE NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate); + + // ISpecifyPropertyPages + HRESULT STDMETHODCALLTYPE GetPages(CAUUID *pPages); + + //IKsObject methods + HANDLE STDMETHODCALLTYPE KsGetObjectHandle(); + + //IKsPropertySet + HRESULT STDMETHODCALLTYPE Set(REFGUID guidPropSet, DWORD dwPropID, LPVOID pInstanceData, DWORD cbInstanceData, LPVOID pPropData, DWORD cbPropData); + HRESULT STDMETHODCALLTYPE Get(REFGUID guidPropSet, DWORD dwPropID, LPVOID pInstanceData, DWORD cbInstanceData, LPVOID pPropData, DWORD cbPropData, DWORD *pcbReturned); + HRESULT STDMETHODCALLTYPE QuerySupported(REFGUID guidPropSet, DWORD dwPropID, DWORD *pTypeSupport); + + //IKsControl + HRESULT STDMETHODCALLTYPE KsProperty(PKSPROPERTY Property, ULONG PropertyLength, LPVOID PropertyData, ULONG DataLength, ULONG* BytesReturned); + HRESULT STDMETHODCALLTYPE KsMethod(PKSMETHOD Method, ULONG MethodLength, LPVOID MethodData, ULONG DataLength, ULONG* BytesReturned); + HRESULT STDMETHODCALLTYPE KsEvent(PKSEVENT Event, ULONG EventLength, LPVOID EventData, ULONG DataLength, ULONG* BytesReturned); + + //IKsPin + HRESULT STDMETHODCALLTYPE KsQueryMediums(PKSMULTIPLE_ITEM* MediumList); + HRESULT STDMETHODCALLTYPE KsQueryInterfaces(PKSMULTIPLE_ITEM* InterfaceList); + HRESULT STDMETHODCALLTYPE KsCreateSinkPinHandle(KSPIN_INTERFACE& Interface, KSPIN_MEDIUM& Medium); + HRESULT STDMETHODCALLTYPE KsGetCurrentCommunication(KSPIN_COMMUNICATION *Communication, KSPIN_INTERFACE *Interface, KSPIN_MEDIUM *Medium); + HRESULT STDMETHODCALLTYPE KsPropagateAcquire(); + HRESULT STDMETHODCALLTYPE KsDeliver(IMediaSample* Sample, ULONG Flags); + HRESULT STDMETHODCALLTYPE KsMediaSamplesCompleted(PKSSTREAM_SEGMENT StreamSegment); + IMemAllocator * STDMETHODCALLTYPE KsPeekAllocator(KSPEEKOPERATION Operation); + HRESULT STDMETHODCALLTYPE KsReceiveAllocator(IMemAllocator *MemAllocator); + HRESULT STDMETHODCALLTYPE KsRenegotiateAllocator(); + LONG STDMETHODCALLTYPE KsIncrementPendingIoCount(); + LONG STDMETHODCALLTYPE KsDecrementPendingIoCount(); + HRESULT STDMETHODCALLTYPE KsQualityNotify(ULONG Proportion, REFERENCE_TIME TimeDelta); + // IKsPinEx + VOID STDMETHODCALLTYPE KsNotifyError(IMediaSample* Sample, HRESULT hr); + + //IMemInputPin + HRESULT STDMETHODCALLTYPE GetAllocator(IMemAllocator **ppAllocator); + HRESULT STDMETHODCALLTYPE NotifyAllocator(IMemAllocator *pAllocator, BOOL bReadOnly); + HRESULT STDMETHODCALLTYPE GetAllocatorRequirements(ALLOCATOR_PROPERTIES *pProps); + HRESULT STDMETHODCALLTYPE Receive(IMediaSample *pSample); + HRESULT STDMETHODCALLTYPE ReceiveMultiple(IMediaSample **pSamples, long nSamples, long *nSamplesProcessed); + HRESULT STDMETHODCALLTYPE ReceiveCanBlock( void); + + //IKsPinFactory + HRESULT STDMETHODCALLTYPE KsPinFactory(ULONG* PinFactory); + + //IStreamBuilder + HRESULT STDMETHODCALLTYPE Render(IPin *ppinOut, IGraphBuilder *pGraph); + HRESULT STDMETHODCALLTYPE Backout(IPin *ppinOut, IGraphBuilder *pGraph); + + //IKsAggregateControl + HRESULT STDMETHODCALLTYPE KsAddAggregate(IN REFGUID AggregateClass); + HRESULT STDMETHODCALLTYPE KsRemoveAggregate(REFGUID AggregateClass); + + //IQualityControl + HRESULT STDMETHODCALLTYPE Notify(IBaseFilter *pSelf, Quality q); + HRESULT STDMETHODCALLTYPE SetSink(IQualityControl *piqc); + + //--------------------------------------------------------------- + HRESULT STDMETHODCALLTYPE CheckFormat(const AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE CreatePin(const AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE CreatePinHandle(PKSPIN_MEDIUM Medium, PKSPIN_INTERFACE Interface, const AM_MEDIA_TYPE *pmt); + CInputPin(IBaseFilter * ParentFilter, LPCWSTR PinName, HANDLE hFilter, ULONG PinId, KSPIN_COMMUNICATION Communication); + virtual ~CInputPin(){}; + +protected: + LONG m_Ref; + IBaseFilter * m_ParentFilter; + LPCWSTR m_PinName; + HANDLE m_hFilter; + HANDLE m_hPin; + ULONG m_PinId; + IMemAllocator * m_MemAllocator; + LONG m_IoCount; + KSPIN_COMMUNICATION m_Communication; + KSPIN_INTERFACE m_Interface; + KSPIN_MEDIUM m_Medium; + AM_MEDIA_TYPE m_MediaFormat; + IPin * m_Pin; + BOOL m_ReadOnly; + IKsInterfaceHandler * m_InterfaceHandler; + IKsAllocatorEx * m_KsAllocatorEx; + ULONG m_PipeAllocatorFlag; + BOOL m_bPinBusCacheInitialized; + GUID m_PinBusCache; + LPWSTR m_FilterName; + FRAMING_PROP m_FramingProp[4]; + PKSALLOCATOR_FRAMING_EX m_FramingEx[4]; +}; + +CInputPin::CInputPin( + IBaseFilter * ParentFilter, + LPCWSTR PinName, + HANDLE hFilter, + ULONG PinId, + KSPIN_COMMUNICATION Communication) : m_Ref(0), + m_ParentFilter(ParentFilter), + m_PinName(PinName), + m_hFilter(hFilter), + m_hPin(INVALID_HANDLE_VALUE), + m_PinId(PinId), + m_MemAllocator(0), + m_IoCount(0), + m_Communication(Communication), + m_Pin(0), + m_ReadOnly(0), + m_InterfaceHandler(0), + m_KsAllocatorEx(0), + m_PipeAllocatorFlag(0), + m_bPinBusCacheInitialized(0), + m_FilterName(0) +{ + ZeroMemory(m_FramingProp, sizeof(m_FramingProp)); + ZeroMemory(m_FramingEx, sizeof(m_FramingEx)); + + ZeroMemory(&m_MediaFormat, sizeof(AM_MEDIA_TYPE)); + HRESULT hr = KsGetMediaType(0, &m_MediaFormat, m_hFilter, m_PinId); + assert(hr == S_OK); +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + WCHAR Buffer[100]; + + *Output = NULL; + + if (IsEqualGUID(refiid, IID_IUnknown) || + IsEqualGUID(refiid, IID_IPin)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IMemInputPin)) + { + if (m_hPin == INVALID_HANDLE_VALUE) + { + HRESULT hr = CreatePin(&m_MediaFormat); + if (FAILED(hr)) + return hr; + } + + *Output = (IMemInputPin*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsObject)) + { + *Output = (IKsObject*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsPropertySet)) + { + if (m_hPin == INVALID_HANDLE_VALUE) + { + HRESULT hr = CreatePin(&m_MediaFormat); + if (FAILED(hr)) + return hr; + } + + *Output = (IKsPropertySet*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsControl)) + { + *Output = (IKsControl*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsPin) || + IsEqualGUID(refiid, IID_IKsPinEx)) + { + *Output = (IKsPinEx*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsPinPipe)) + { + *Output = (IKsPinPipe*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsPinFactory)) + { + *Output = (IKsPinFactory*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } +#if 0 + else if (IsEqualGUID(refiid, IID_IStreamBuilder)) + { + *Output = (IStreamBuilder*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } +#endif + else if (IsEqualGUID(refiid, IID_IKsAggregateControl)) + { + *Output = (IKsAggregateControl*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IQualityControl)) + { + *Output = (IQualityControl*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_ISpecifyPropertyPages)) + { + *Output = (ISpecifyPropertyPages*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CInputPin::QueryInterface: NoInterface for %s\n", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + + return E_NOINTERFACE; +} +//------------------------------------------------------------------- +// IQualityControl interface +// +HRESULT +STDMETHODCALLTYPE +CInputPin::Notify( + IBaseFilter *pSelf, + Quality q) +{ + OutputDebugStringW(L"CInputPin::Notify NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::SetSink( + IQualityControl *piqc) +{ + OutputDebugStringW(L"CInputPin::SetSink NotImplemented\n"); + return E_NOTIMPL; +} + + +//------------------------------------------------------------------- +// IKsAggregateControl interface +// +HRESULT +STDMETHODCALLTYPE +CInputPin::KsAddAggregate( + IN REFGUID AggregateClass) +{ + OutputDebugStringW(L"CInputPin::KsAddAggregate NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsRemoveAggregate( + REFGUID AggregateClass) +{ + OutputDebugStringW(L"CInputPin::KsRemoveAggregate NotImplemented\n"); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// IStreamBuilder +// + +HRESULT +STDMETHODCALLTYPE +CInputPin::Render( + IPin *ppinOut, + IGraphBuilder *pGraph) +{ + OutputDebugStringW(L"CInputPin::Render\n"); + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::Backout( + IPin *ppinOut, + IGraphBuilder *pGraph) +{ + OutputDebugStringW(L"CInputPin::Backout\n"); + return S_OK; +} + +//------------------------------------------------------------------- +// IKsPinFactory +// + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsPinFactory( + ULONG* PinFactory) +{ + OutputDebugStringW(L"CInputPin::KsPinFactory\n"); + *PinFactory = m_PinId; + return S_OK; +} + +//------------------------------------------------------------------- +// IKsPinPipe +// + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsGetPinFramingCache( + PKSALLOCATOR_FRAMING_EX *FramingEx, + PFRAMING_PROP FramingProp, + FRAMING_CACHE_OPS Option) +{ + if (Option > Framing_Cache_Write || Option < Framing_Cache_ReadLast) + { + // invalid argument + return E_INVALIDARG; + } + + // get framing properties + *FramingProp = m_FramingProp[Option]; + *FramingEx = m_FramingEx[Option]; + + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsSetPinFramingCache( + PKSALLOCATOR_FRAMING_EX FramingEx, + PFRAMING_PROP FramingProp, + FRAMING_CACHE_OPS Option) +{ + ULONG Index; + ULONG RefCount = 0; + + if (m_FramingEx[Option]) + { + for(Index = 1; Index < 4; Index++) + { + if (m_FramingEx[Index] == m_FramingEx[Option]) + RefCount++; + } + + if (RefCount == 1) + { + // existing framing is only used once + CoTaskMemFree(m_FramingEx[Option]); + } + } + + // store framing + m_FramingEx[Option] = FramingEx; + m_FramingProp[Option] = *FramingProp; + + return S_OK; +} + +IPin* +STDMETHODCALLTYPE +CInputPin::KsGetConnectedPin() +{ + return m_Pin; +} + +IKsAllocatorEx* +STDMETHODCALLTYPE +CInputPin::KsGetPipe( + KSPEEKOPERATION Operation) +{ + if (Operation == KsPeekOperation_AddRef) + { + if (m_KsAllocatorEx) + m_KsAllocatorEx->AddRef(); + } + return m_KsAllocatorEx; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsSetPipe( + IKsAllocatorEx *KsAllocator) +{ + if (KsAllocator) + KsAllocator->AddRef(); + + if (m_KsAllocatorEx) + m_KsAllocatorEx->Release(); + + m_KsAllocatorEx = KsAllocator; + return NOERROR; +} + +ULONG +STDMETHODCALLTYPE +CInputPin::KsGetPipeAllocatorFlag() +{ + return m_PipeAllocatorFlag; +} + + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsSetPipeAllocatorFlag( + ULONG Flag) +{ + m_PipeAllocatorFlag = Flag; + return NOERROR; +} + +GUID +STDMETHODCALLTYPE +CInputPin::KsGetPinBusCache() +{ + if (!m_bPinBusCacheInitialized) + { + CopyMemory(&m_PinBusCache, &m_Medium.Set, sizeof(GUID)); + m_bPinBusCacheInitialized = TRUE; + } + + return m_PinBusCache; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsSetPinBusCache( + GUID Bus) +{ + CopyMemory(&m_PinBusCache, &Bus, sizeof(GUID)); + return NOERROR; +} + +PWCHAR +STDMETHODCALLTYPE +CInputPin::KsGetPinName() +{ + return (PWCHAR)m_PinName; +} + + +PWCHAR +STDMETHODCALLTYPE +CInputPin::KsGetFilterName() +{ + return m_FilterName; +} + +//------------------------------------------------------------------- +// ISpecifyPropertyPages +// + +HRESULT +STDMETHODCALLTYPE +CInputPin::GetPages(CAUUID *pPages) +{ + if (!pPages) + return E_POINTER; + + pPages->cElems = 0; + pPages->pElems = NULL; + + return S_OK; +} + +//------------------------------------------------------------------- +// IMemInputPin +// + + +HRESULT +STDMETHODCALLTYPE +CInputPin::GetAllocator(IMemAllocator **ppAllocator) +{ + OutputDebugStringW(L"CInputPin::GetAllocator\n"); + return VFW_E_NO_ALLOCATOR; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::NotifyAllocator(IMemAllocator *pAllocator, BOOL bReadOnly) +{ + WCHAR Buffer[100]; + HRESULT hr; + ALLOCATOR_PROPERTIES Properties; + + hr = pAllocator->GetProperties(&Properties); + swprintf(Buffer, L"CInputPin::NotifyAllocator hr %lx bReadOnly, %u cbAlign %u cbBuffer %u cbPrefix %u cBuffers %u\n", hr, bReadOnly, Properties.cbAlign, Properties.cbBuffer, Properties.cbPrefix, Properties.cBuffers); + OutputDebugStringW(Buffer); + + if (pAllocator) + { + pAllocator->AddRef(); + } + + if (m_MemAllocator) + { + m_MemAllocator->Release(); + } + + m_MemAllocator = pAllocator; + m_ReadOnly = bReadOnly; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::GetAllocatorRequirements(ALLOCATOR_PROPERTIES *pProps) +{ + KSALLOCATOR_FRAMING Framing; + KSPROPERTY Property; + HRESULT hr; + ULONG BytesReturned; + + Property.Set = KSPROPSETID_Connection; + Property.Id = KSPROPERTY_CONNECTION_ALLOCATORFRAMING; + Property.Flags = KSPROPERTY_TYPE_SET; + + hr = KsProperty(&Property, sizeof(KSPROPERTY), (PVOID)&Framing, sizeof(KSALLOCATOR_FRAMING), &BytesReturned); + if (SUCCEEDED(hr)) + { + pProps->cBuffers = Framing.Frames; + pProps->cbBuffer = Framing.FrameSize; + pProps->cbAlign = Framing.FileAlignment; + pProps->cbPrefix = 0; + } + else + hr = E_NOTIMPL; + + WCHAR Buffer[100]; + swprintf(Buffer, L"CInputPin::GetAllocatorRequirements hr %lx m_hPin %p cBuffers %u cbBuffer %u cbAlign %u cbPrefix %u\n", hr, m_hPin, pProps->cBuffers, pProps->cbBuffer, pProps->cbAlign, pProps->cbPrefix); + OutputDebugStringW(Buffer); + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::Receive(IMediaSample *pSample) +{ + OutputDebugStringW(L"CInputPin::Receive NotImplemented\n"); + DebugBreak(); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::ReceiveMultiple(IMediaSample **pSamples, long nSamples, long *nSamplesProcessed) +{ + OutputDebugStringW(L"CInputPin::ReceiveMultiple NotImplemented\n"); + DebugBreak(); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::ReceiveCanBlock( void) +{ + OutputDebugStringW(L"CInputPin::ReceiveCanBlock NotImplemented\n"); + DebugBreak(); + return S_FALSE; +} + +//------------------------------------------------------------------- +// IKsPin +// + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsQueryMediums( + PKSMULTIPLE_ITEM* MediumList) +{ + return KsGetMultiplePinFactoryItems(m_hFilter, m_PinId, KSPROPERTY_PIN_MEDIUMS, (PVOID*)MediumList); +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsQueryInterfaces( + PKSMULTIPLE_ITEM* InterfaceList) +{ + return KsGetMultiplePinFactoryItems(m_hFilter, m_PinId, KSPROPERTY_PIN_INTERFACES, (PVOID*)InterfaceList); +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsCreateSinkPinHandle( + KSPIN_INTERFACE& Interface, + KSPIN_MEDIUM& Medium) +{ + return CreatePin(&m_MediaFormat); +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsGetCurrentCommunication( + KSPIN_COMMUNICATION *Communication, + KSPIN_INTERFACE *Interface, + KSPIN_MEDIUM *Medium) +{ + if (Communication) + { + *Communication = m_Communication; + } + + if (Interface) + { + if (!m_hPin) + return VFW_E_NOT_CONNECTED; + + CopyMemory(Interface, &m_Interface, sizeof(KSPIN_INTERFACE)); + } + + if (Medium) + { + if (!m_hPin) + return VFW_E_NOT_CONNECTED; + + CopyMemory(Medium, &m_Medium, sizeof(KSPIN_MEDIUM)); + } + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsPropagateAcquire() +{ + KSPROPERTY Property; + KSSTATE State; + ULONG BytesReturned; + HRESULT hr; + + assert(m_hPin != INVALID_HANDLE_VALUE); + + Property.Set = KSPROPSETID_Connection; + Property.Id = KSPROPERTY_CONNECTION_STATE; + Property.Flags = KSPROPERTY_TYPE_SET; + + State = KSSTATE_ACQUIRE; + + hr = KsProperty(&Property, sizeof(KSPROPERTY), (LPVOID)&State, sizeof(KSSTATE), &BytesReturned); + + //TODO + //propagate to connected pin on the pipe + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsDeliver( + IMediaSample* Sample, + ULONG Flags) +{ + return E_FAIL; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsMediaSamplesCompleted(PKSSTREAM_SEGMENT StreamSegment) +{ + return NOERROR; +} + +IMemAllocator * +STDMETHODCALLTYPE +CInputPin::KsPeekAllocator(KSPEEKOPERATION Operation) +{ + if (Operation == KsPeekOperation_AddRef) + { + // add reference on allocator + m_MemAllocator->AddRef(); + } + + return m_MemAllocator; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsReceiveAllocator(IMemAllocator *MemAllocator) +{ + + if (MemAllocator) + { + MemAllocator->AddRef(); + } + + if (m_MemAllocator) + { + m_MemAllocator->Release(); + } + + m_MemAllocator = MemAllocator; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsRenegotiateAllocator() +{ + return E_FAIL; +} + +LONG +STDMETHODCALLTYPE +CInputPin::KsIncrementPendingIoCount() +{ + return InterlockedIncrement((volatile LONG*)&m_IoCount); +} + +LONG +STDMETHODCALLTYPE +CInputPin::KsDecrementPendingIoCount() +{ + return InterlockedDecrement((volatile LONG*)&m_IoCount); +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsQualityNotify( + ULONG Proportion, + REFERENCE_TIME TimeDelta) +{ + OutputDebugStringW(L"CInputPin::KsQualityNotify NotImplemented\n"); + DebugBreak(); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// IKsPinEx +// + +VOID +STDMETHODCALLTYPE +CInputPin::KsNotifyError( + IMediaSample* Sample, + HRESULT hr) +{ + OutputDebugStringW(L"CInputPin::KsNotifyError NotImplemented\n"); +} + + +//------------------------------------------------------------------- +// IKsControl +// +HRESULT +STDMETHODCALLTYPE +CInputPin::KsProperty( + PKSPROPERTY Property, + ULONG PropertyLength, + LPVOID PropertyData, + ULONG DataLength, + ULONG* BytesReturned) +{ + assert(m_hPin != INVALID_HANDLE_VALUE); + return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_PROPERTY, (PVOID)Property, PropertyLength, (PVOID)PropertyData, DataLength, BytesReturned); +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsMethod( + PKSMETHOD Method, + ULONG MethodLength, + LPVOID MethodData, + ULONG DataLength, + ULONG* BytesReturned) +{ + assert(m_hPin != INVALID_HANDLE_VALUE); + return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_METHOD, (PVOID)Method, MethodLength, (PVOID)MethodData, DataLength, BytesReturned); +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::KsEvent( + PKSEVENT Event, + ULONG EventLength, + LPVOID EventData, + ULONG DataLength, + ULONG* BytesReturned) +{ + assert(m_hPin != INVALID_HANDLE_VALUE); + + if (EventLength) + return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_ENABLE_EVENT, (PVOID)Event, EventLength, (PVOID)EventData, DataLength, BytesReturned); + else + return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_DISABLE_EVENT, (PVOID)Event, EventLength, NULL, 0, BytesReturned); +} + + +//------------------------------------------------------------------- +// IKsPropertySet +// +HRESULT +STDMETHODCALLTYPE +CInputPin::Set( + REFGUID guidPropSet, + DWORD dwPropID, + LPVOID pInstanceData, + DWORD cbInstanceData, + LPVOID pPropData, + DWORD cbPropData) +{ + ULONG BytesReturned; + + if (cbInstanceData) + { + PKSPROPERTY Property = (PKSPROPERTY)CoTaskMemAlloc(sizeof(KSPROPERTY) + cbInstanceData); + if (!Property) + return E_OUTOFMEMORY; + + Property->Set = guidPropSet; + Property->Id = dwPropID; + Property->Flags = KSPROPERTY_TYPE_SET; + + CopyMemory((Property+1), pInstanceData, cbInstanceData); + + HRESULT hr = KsProperty(Property, sizeof(KSPROPERTY) + cbInstanceData, pPropData, cbPropData, &BytesReturned); + CoTaskMemFree(Property); + return hr; + } + else + { + KSPROPERTY Property; + + Property.Set = guidPropSet; + Property.Id = dwPropID; + Property.Flags = KSPROPERTY_TYPE_SET; + + HRESULT hr = KsProperty(&Property, sizeof(KSPROPERTY), pPropData, cbPropData, &BytesReturned); + return hr; + } +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::Get( + REFGUID guidPropSet, + DWORD dwPropID, + LPVOID pInstanceData, + DWORD cbInstanceData, + LPVOID pPropData, + DWORD cbPropData, + DWORD *pcbReturned) +{ + ULONG BytesReturned; + + if (cbInstanceData) + { + PKSPROPERTY Property = (PKSPROPERTY)CoTaskMemAlloc(sizeof(KSPROPERTY) + cbInstanceData); + if (!Property) + return E_OUTOFMEMORY; + + Property->Set = guidPropSet; + Property->Id = dwPropID; + Property->Flags = KSPROPERTY_TYPE_GET; + + CopyMemory((Property+1), pInstanceData, cbInstanceData); + + HRESULT hr = KsProperty(Property, sizeof(KSPROPERTY) + cbInstanceData, pPropData, cbPropData, &BytesReturned); + CoTaskMemFree(Property); + return hr; + } + else + { + KSPROPERTY Property; + + Property.Set = guidPropSet; + Property.Id = dwPropID; + Property.Flags = KSPROPERTY_TYPE_GET; + + HRESULT hr = KsProperty(&Property, sizeof(KSPROPERTY), pPropData, cbPropData, &BytesReturned); + return hr; + } +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::QuerySupported( + REFGUID guidPropSet, + DWORD dwPropID, + DWORD *pTypeSupport) +{ + KSPROPERTY Property; + ULONG BytesReturned; + + Property.Set = guidPropSet; + Property.Id = dwPropID; + Property.Flags = KSPROPERTY_TYPE_SETSUPPORT; + + return KsProperty(&Property, sizeof(KSPROPERTY), pTypeSupport, sizeof(DWORD), &BytesReturned); +} + + +//------------------------------------------------------------------- +// IKsObject +// +HANDLE +STDMETHODCALLTYPE +CInputPin::KsGetObjectHandle() +{ + assert(m_hPin); + return m_hPin; +} + +//------------------------------------------------------------------- +// IPin interface +// +HRESULT +STDMETHODCALLTYPE +CInputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) +{ + OutputDebugStringW(L"CInputPin::Connect NotImplemented\n"); + DebugBreak(); + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt) +{ + HRESULT hr; + + if (m_Pin) + { + // already connected + return VFW_E_ALREADY_CONNECTED; + } + + // first check format + hr = CheckFormat(pmt); + if (FAILED(hr)) + { + // format is not supported + return hr; + } + + hr = CreatePin(pmt); + if (FAILED(hr)) + { + return hr; + } + + m_Pin = pConnector; + m_Pin->AddRef(); + + return S_OK; +} +HRESULT +STDMETHODCALLTYPE +CInputPin::Disconnect( void) +{ + if (!m_Pin) + { + // pin was not connected + return S_FALSE; + } + + //FIXME + //check if filter is active + + m_Pin->Release(); + m_Pin = NULL; + + OutputDebugStringW(L"CInputPin::Disconnect\n"); + return S_OK; +} +HRESULT +STDMETHODCALLTYPE +CInputPin::ConnectedTo(IPin **pPin) +{ + if (!pPin) + return E_POINTER; + + if (m_Pin) + { + // increment reference count + m_Pin->AddRef(); + *pPin = m_Pin; + return S_OK; + } + + *pPin = NULL; + return VFW_E_NOT_CONNECTED; +} +HRESULT +STDMETHODCALLTYPE +CInputPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt) +{ + if (!m_Pin) + return VFW_E_NOT_CONNECTED; + + OutputDebugStringW(L"CInputPin::ConnectionMediaType NotImplemented\n"); + DebugBreak(); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CInputPin::QueryPinInfo(PIN_INFO *pInfo) +{ + wcscpy(pInfo->achName, m_PinName); + pInfo->dir = PINDIR_INPUT; + pInfo->pFilter = m_ParentFilter; + m_ParentFilter->AddRef(); + + return S_OK; +} +HRESULT +STDMETHODCALLTYPE +CInputPin::QueryDirection(PIN_DIRECTION *pPinDir) +{ + if (pPinDir) + { + *pPinDir = PINDIR_INPUT; + return S_OK; + } + + return E_POINTER; +} +HRESULT +STDMETHODCALLTYPE +CInputPin::QueryId(LPWSTR *Id) +{ + *Id = (LPWSTR)CoTaskMemAlloc((wcslen(m_PinName)+1)*sizeof(WCHAR)); + if (!*Id) + return E_OUTOFMEMORY; + + wcscpy(*Id, m_PinName); + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::QueryAccept( + const AM_MEDIA_TYPE *pmt) +{ + return CheckFormat(pmt); +} +HRESULT +STDMETHODCALLTYPE +CInputPin::EnumMediaTypes(IEnumMediaTypes **ppEnum) +{ + HRESULT hr; + ULONG MediaTypeCount = 0, Index; + AM_MEDIA_TYPE * MediaTypes; + + // query media type count + hr = KsGetMediaTypeCount(m_hFilter, m_PinId, &MediaTypeCount); + if (FAILED(hr) || !MediaTypeCount) + return hr; + + // allocate media types + MediaTypes = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * MediaTypeCount); + if (!MediaTypes) + { + // not enough memory + return E_OUTOFMEMORY; + } + + // zero media types + ZeroMemory(MediaTypes, sizeof(AM_MEDIA_TYPE) * MediaTypeCount); + + for(Index = 0; Index < MediaTypeCount; Index++) + { + // get media type + hr = KsGetMediaType(Index, &MediaTypes[Index], m_hFilter, m_PinId); + if (FAILED(hr)) + { + // failed + CoTaskMemFree(MediaTypes); + return hr; + } + } + + return CEnumMediaTypes_fnConstructor(MediaTypeCount, MediaTypes, IID_IEnumMediaTypes, (void**)ppEnum); +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::QueryInternalConnections(IPin **apPin, ULONG *nPin) +{ + OutputDebugStringW(L"CInputPin::QueryInternalConnections NotImplemented\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CInputPin::EndOfStream( void) +{ + OutputDebugStringW(L"CInputPin::EndOfStream NotImplemented\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CInputPin::BeginFlush( void) +{ + OutputDebugStringW(L"CInputPin::BeginFlush NotImplemented\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CInputPin::EndFlush( void) +{ + OutputDebugStringW(L"CInputPin::EndFlush NotImplemented\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CInputPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) +{ + OutputDebugStringW(L"CInputPin::NewSegment NotImplemented\n"); + return E_NOTIMPL; +} + + +//------------------------------------------------------------------- +HRESULT +STDMETHODCALLTYPE +CInputPin::CheckFormat( + const AM_MEDIA_TYPE *pmt) +{ + PKSMULTIPLE_ITEM MultipleItem; + PKSDATAFORMAT DataFormat; + HRESULT hr; + + if (!pmt) + return E_POINTER; + + hr = KsGetMultiplePinFactoryItems(m_hFilter, m_PinId, KSPROPERTY_PIN_DATARANGES, (PVOID*)&MultipleItem); + if (FAILED(hr)) + return S_FALSE; + + DataFormat = (PKSDATAFORMAT)(MultipleItem + 1); + for(ULONG Index = 0; Index < MultipleItem->Count; Index++) + { + if (IsEqualGUID(pmt->majortype, DataFormat->MajorFormat) && + IsEqualGUID(pmt->subtype, DataFormat->SubFormat) && + IsEqualGUID(pmt->formattype, DataFormat->Specifier)) + { + // format is supported + CoTaskMemFree(MultipleItem); + OutputDebugStringW(L"CInputPin::CheckFormat format OK\n"); + return S_OK; + } + DataFormat = (PKSDATAFORMAT)((ULONG_PTR)DataFormat + DataFormat->FormatSize); + } + //format is not supported + CoTaskMemFree(MultipleItem); + return S_FALSE; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::CreatePin( + const AM_MEDIA_TYPE *pmt) +{ + PKSMULTIPLE_ITEM MediumList; + PKSMULTIPLE_ITEM InterfaceList; + PKSPIN_MEDIUM Medium; + PKSPIN_INTERFACE Interface; + IKsInterfaceHandler * InterfaceHandler; + HRESULT hr; + + // query for pin medium + hr = KsQueryMediums(&MediumList); + if (FAILED(hr)) + return hr; + + // query for pin interface + hr = KsQueryInterfaces(&InterfaceList); + if (FAILED(hr)) + { + // failed + CoTaskMemFree(MediumList); + return hr; + } + + if (MediumList->Count) + { + //use first available medium + Medium = (PKSPIN_MEDIUM)(MediumList + 1); + } + else + { + // default to standard medium + Medium = &StandardPinMedium; + } + + if (InterfaceList->Count) + { + //use first available interface + Interface = (PKSPIN_INTERFACE)(InterfaceList + 1); + } + else + { + // default to standard interface + Interface = &StandardPinInterface; + } + + if (m_Communication != KSPIN_COMMUNICATION_BRIDGE && m_Communication != KSPIN_COMMUNICATION_NONE) + { + if (!m_InterfaceHandler) + { + // now load the IKsInterfaceHandler plugin + hr = CoCreateInstance(Interface->Set, NULL, CLSCTX_INPROC_SERVER, IID_IKsInterfaceHandler, (void**)&InterfaceHandler); + if (FAILED(hr)) + { + // failed to load interface handler plugin + OutputDebugStringW(L"CInputPin::CreatePin failed to load InterfaceHandlerPlugin\n"); + CoTaskMemFree(MediumList); + CoTaskMemFree(InterfaceList); + + return hr; + } + + // now set the pin + hr = InterfaceHandler->KsSetPin((IKsPin*)this); + if (FAILED(hr)) + { + // failed to load interface handler plugin + OutputDebugStringW(L"CInputPin::CreatePin failed to initialize InterfaceHandlerPlugin\n"); + InterfaceHandler->Release(); + CoTaskMemFree(MediumList); + CoTaskMemFree(InterfaceList); + return hr; + } + + // store interface handler + m_InterfaceHandler = InterfaceHandler; + } + + // now create pin + hr = CreatePinHandle(Medium, Interface, pmt); + if (FAILED(hr)) + { + m_InterfaceHandler->Release(); + m_InterfaceHandler = InterfaceHandler; + } + } + else + { + WCHAR Buffer[100]; + swprintf(Buffer, L"CInputPin::CreatePin unexpected communication %u %s\n", m_Communication, m_PinName); + OutputDebugStringW(Buffer); + DebugBreak(); + hr = E_FAIL; + } + + // free medium / interface / dataformat + CoTaskMemFree(MediumList); + CoTaskMemFree(InterfaceList); + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CInputPin::CreatePinHandle( + PKSPIN_MEDIUM Medium, + PKSPIN_INTERFACE Interface, + const AM_MEDIA_TYPE *pmt) +{ + PKSPIN_CONNECT PinConnect; + PKSDATAFORMAT DataFormat; + ULONG Length; + HRESULT hr; + + if (m_hPin != INVALID_HANDLE_VALUE) + { + // pin already exists + //CloseHandle(m_hPin); + //m_hPin = INVALID_HANDLE_VALUE; + return S_OK; + } + + + // calc format size + Length = sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT) + pmt->cbFormat; + + // allocate pin connect + PinConnect = (PKSPIN_CONNECT)CoTaskMemAlloc(Length); + if (!PinConnect) + { + // failed + return E_OUTOFMEMORY; + } + + // setup request + CopyMemory(&PinConnect->Interface, Interface, sizeof(KSPIN_INTERFACE)); + CopyMemory(&PinConnect->Medium, Medium, sizeof(KSPIN_MEDIUM)); + PinConnect->PinId = m_PinId; + PinConnect->PinToHandle = NULL; + PinConnect->Priority.PriorityClass = KSPRIORITY_NORMAL; + PinConnect->Priority.PrioritySubClass = KSPRIORITY_NORMAL; + + // get dataformat offset + DataFormat = (PKSDATAFORMAT)(PinConnect + 1); + + // copy data format + DataFormat->FormatSize = sizeof(KSDATAFORMAT) + pmt->cbFormat; + DataFormat->Flags = 0; + DataFormat->SampleSize = pmt->lSampleSize; + DataFormat->Reserved = 0; + CopyMemory(&DataFormat->MajorFormat, &pmt->majortype, sizeof(GUID)); + CopyMemory(&DataFormat->SubFormat, &pmt->subtype, sizeof(GUID)); + CopyMemory(&DataFormat->Specifier, &pmt->formattype, sizeof(GUID)); + + if (pmt->cbFormat) + { + // copy extended format + CopyMemory((DataFormat + 1), pmt->pbFormat, pmt->cbFormat); + } + + // create pin + hr = KsCreatePin(m_hFilter, PinConnect, GENERIC_WRITE, &m_hPin); + + if (SUCCEEDED(hr)) + { + // store current interface / medium + CopyMemory(&m_Medium, Medium, sizeof(KSPIN_MEDIUM)); + CopyMemory(&m_Interface, Interface, sizeof(KSPIN_INTERFACE)); + CopyMemory(&m_MediaFormat, pmt, sizeof(AM_MEDIA_TYPE)); + + LPOLESTR pMajor, pSub, pFormat; + StringFromIID(m_MediaFormat.majortype, &pMajor); + StringFromIID(m_MediaFormat.subtype , &pSub); + StringFromIID(m_MediaFormat.formattype, &pFormat); + WCHAR Buffer[200]; + swprintf(Buffer, L"CInputPin::CreatePinHandle Major %s SubType %s Format %s pbFormat %p cbFormat %u\n", pMajor, pSub, pFormat, pmt->pbFormat, pmt->cbFormat); + CoTaskMemFree(pMajor); + CoTaskMemFree(pSub); + CoTaskMemFree(pFormat); + OutputDebugStringW(Buffer); + + if (pmt->cbFormat) + { + m_MediaFormat.pbFormat = (BYTE*)CoTaskMemAlloc(pmt->cbFormat); + if (!m_MediaFormat.pbFormat) + { + CoTaskMemFree(PinConnect); + m_MediaFormat.pbFormat = NULL; + m_MediaFormat.cbFormat = 0; + return E_OUTOFMEMORY; + } + CopyMemory(m_MediaFormat.pbFormat, pmt->pbFormat, pmt->cbFormat); + } + + //TODO + // connect pin pipes + + } + + // free pin connect + CoTaskMemFree(PinConnect); + + return hr; +} + +HRESULT +WINAPI +CInputPin_Constructor( + IBaseFilter * ParentFilter, + LPCWSTR PinName, + HANDLE hFilter, + ULONG PinId, + KSPIN_COMMUNICATION Communication, + REFIID riid, + LPVOID * ppv) +{ + CInputPin * handler = new CInputPin(ParentFilter, PinName, hFilter, PinId, Communication); + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return S_OK; +} diff --git a/reactos/dll/directx/ksproxy/interface.cpp b/reactos/dll/directx/ksproxy/interface.cpp new file mode 100644 index 00000000000..3d1af0db1b0 --- /dev/null +++ b/reactos/dll/directx/ksproxy/interface.cpp @@ -0,0 +1,497 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy + * FILE: dll/directx/ksproxy/interface.cpp + * PURPOSE: IKsInterfaceHandler interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +const GUID IID_IKsObject = {0x423c13a2, 0x2070, 0x11d0, {0x9e, 0xf7, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1}}; + +class CKsInterfaceHandler : public IKsInterfaceHandler +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + HRESULT STDMETHODCALLTYPE KsSetPin(IKsPin *KsPin); + HRESULT STDMETHODCALLTYPE KsProcessMediaSamples(IKsDataTypeHandler *KsDataTypeHandler, IMediaSample** SampleList, PLONG SampleCount, KSIOOPERATION IoOperation, PKSSTREAM_SEGMENT *StreamSegment); + HRESULT STDMETHODCALLTYPE KsCompleteIo(PKSSTREAM_SEGMENT StreamSegment); + + CKsInterfaceHandler() : m_Ref(0), m_Handle(NULL), m_Pin(0) {m_PinName[0] = L'\0';}; + virtual ~CKsInterfaceHandler(){}; + +protected: + LONG m_Ref; + HANDLE m_Handle; + IKsPinEx * m_Pin; + WCHAR m_PinName[129]; +}; + +typedef struct +{ + KSSTREAM_SEGMENT StreamSegment; + OVERLAPPED Overlapped; + IMediaSample * MediaSample[64]; + + ULONG SampleCount; + ULONG ExtendedSize; + PKSSTREAM_HEADER StreamHeader; +}KSSTREAM_SEGMENT_EXT, *PKSSTREAM_SEGMENT_EXT; + + +HRESULT +STDMETHODCALLTYPE +CKsInterfaceHandler::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown) || + IsEqualGUID(refiid, IID_IKsInterfaceHandler)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CKsInterfaceHandler::KsSetPin( + IKsPin *KsPin) +{ + HRESULT hr; + IKsObject * KsObject; + IKsPinEx * Pin; + + // get IKsPinEx interface + hr = KsPin->QueryInterface(IID_IKsPinEx, (void**)&Pin); + if (SUCCEEDED(hr)) + { + // check if IKsObject is supported + hr = KsPin->QueryInterface(IID_IKsObject, (void**)&KsObject); + + if (SUCCEEDED(hr)) + { + // get pin handle + m_Handle = KsObject->KsGetObjectHandle(); + + // release IKsObject interface + KsObject->Release(); + + if (!m_Handle) + { + // expected a file handle + hr = E_UNEXPECTED; + Pin->Release(); + } + else + { + if (m_Pin) + { + // release old interface + m_Pin->Release(); + } + m_Pin = Pin; + } + } + else + { + //release IKsPinEx interface + Pin->Release(); + } + } +#if 1 + //DBG code + PIN_INFO PinInfo; + IPin * pPin; + if (SUCCEEDED(KsPin->QueryInterface(IID_IPin, (void**)&pPin))) + { + if (SUCCEEDED(pPin->QueryPinInfo(&PinInfo))) + { + if (PinInfo.pFilter) + PinInfo.pFilter->Release(); + + wcscpy(m_PinName, PinInfo.achName); + } + pPin->Release(); + } +#endif + + // done + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsInterfaceHandler::KsProcessMediaSamples( + IKsDataTypeHandler *KsDataTypeHandler, + IMediaSample** SampleList, + PLONG SampleCount, + KSIOOPERATION IoOperation, + PKSSTREAM_SEGMENT *OutStreamSegment) +{ + PKSSTREAM_SEGMENT_EXT StreamSegment; + ULONG ExtendedSize, Index, BytesReturned; + HRESULT hr = S_OK; + + // sanity check + assert(*SampleCount); + + if (*SampleCount == 0 || *SampleCount < 0) + return E_FAIL; + + // zero stream segment + *OutStreamSegment = NULL; + + // allocate stream segment + StreamSegment = (PKSSTREAM_SEGMENT_EXT)CoTaskMemAlloc(sizeof(KSSTREAM_SEGMENT_EXT)); + if (!StreamSegment) + return E_OUTOFMEMORY; + + // zero stream segment + ZeroMemory(StreamSegment, sizeof(KSSTREAM_SEGMENT_EXT)); + + //allocate event + StreamSegment->StreamSegment.CompletionEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + + if (!StreamSegment->StreamSegment.CompletionEvent) + { + // failed to create event + CoTaskMemFree(StreamSegment); + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); + } + + // increase our own reference count + AddRef(); + + // setup stream segment + StreamSegment->StreamSegment.KsDataTypeHandler = KsDataTypeHandler; + StreamSegment->StreamSegment.KsInterfaceHandler = (IKsInterfaceHandler*)this; + StreamSegment->StreamSegment.IoOperation = IoOperation; + StreamSegment->Overlapped.hEvent = StreamSegment->StreamSegment.CompletionEvent; + + + // ge extension size + ExtendedSize = 0; + if (KsDataTypeHandler) + { + // query extension size + KsDataTypeHandler->KsQueryExtendedSize(&ExtendedSize); + + if (ExtendedSize) + { + // increment reference count + KsDataTypeHandler->AddRef(); + } + else + { + // no need for the datatype handler + StreamSegment->StreamSegment.KsDataTypeHandler = NULL; + } + } + + StreamSegment->ExtendedSize = ExtendedSize; + StreamSegment->SampleCount = (ULONG)*SampleCount; + + // calculate stream header size count + ULONG StreamHeaderSize = StreamSegment->SampleCount * (sizeof(KSSTREAM_HEADER) + ExtendedSize); + + // allocate stream header + StreamSegment->StreamHeader = (PKSSTREAM_HEADER)CoTaskMemAlloc(StreamHeaderSize); + if (!StreamSegment->StreamHeader) + { + // not enough memory + CloseHandle(StreamSegment->StreamSegment.CompletionEvent); + + if (StreamSegment->StreamSegment.KsDataTypeHandler) + StreamSegment->StreamSegment.KsDataTypeHandler->Release(); + + // free stream segment + CoTaskMemFree(StreamSegment); + + //release our reference count + Release(); + return E_OUTOFMEMORY; + } + + // zero stream headers + ZeroMemory(StreamSegment->StreamHeader, StreamHeaderSize); + + PKSSTREAM_HEADER CurStreamHeader = StreamSegment->StreamHeader; + + // initialize all stream headers + for(Index = 0; Index < StreamSegment->SampleCount; Index++) + { + if (ExtendedSize) + { + // initialize extended size + hr = KsDataTypeHandler->KsPrepareIoOperation(SampleList[Index], (CurStreamHeader + 1), IoOperation); + // sanity check + assert(hr == NOERROR); + } + + // query for IMediaSample2 interface + IMediaSample2 * MediaSample; + AM_SAMPLE2_PROPERTIES Properties; + ZeroMemory(&Properties, sizeof(AM_SAMPLE2_PROPERTIES)); + + hr = SampleList[Index]->QueryInterface(IID_IMediaSample2, (void**)&MediaSample); + if (SUCCEEDED(hr)) + { + //get properties + + hr = MediaSample->GetProperties(sizeof(AM_SAMPLE2_PROPERTIES), (BYTE*)&Properties); + + //release IMediaSample2 interface + MediaSample->Release(); + } + else + { + // get properties + hr = SampleList[Index]->GetPointer((BYTE**)&Properties.pbBuffer); + assert(hr == NOERROR); + hr = SampleList[Index]->GetTime(&Properties.tStart, &Properties.tStop); + + Properties.cbBuffer = SampleList[Index]->GetSize(); + assert(Properties.cbBuffer); + + Properties.dwSampleFlags = 0; + + if (SampleList[Index]->IsDiscontinuity() == S_OK) + Properties.dwSampleFlags |= AM_SAMPLE_DATADISCONTINUITY; + + if (SampleList[Index]->IsPreroll() == S_OK) + Properties.dwSampleFlags |= AM_SAMPLE_PREROLL; + + if (SampleList[Index]->IsSyncPoint() == S_OK) + Properties.dwSampleFlags |= AM_SAMPLE_SPLICEPOINT; + } + + WCHAR Buffer[200]; + swprintf(Buffer, L"CKsInterfaceHandler::KsProcessMediaSamples PinName %s BufferLength %lu Property Buffer %p ExtendedSize %u lActual %u dwSampleFlags %lx\n", m_PinName, Properties.cbBuffer, Properties.pbBuffer, ExtendedSize, Properties.lActual, Properties.dwSampleFlags); + //OutputDebugStringW(Buffer); + + CurStreamHeader->Size = sizeof(KSSTREAM_HEADER) + ExtendedSize; + CurStreamHeader->PresentationTime.Denominator = 1; + CurStreamHeader->PresentationTime.Numerator = 1; + CurStreamHeader->FrameExtent = Properties.cbBuffer; + CurStreamHeader->Data = Properties.pbBuffer; + + if (IoOperation == KsIoOperation_Write) + { + // set flags + CurStreamHeader->OptionsFlags = Properties.dwSampleFlags; + CurStreamHeader->DataUsed = Properties.lActual; + // increment reference count + SampleList[Index]->AddRef(); + } + + // store sample in stream segment + StreamSegment->MediaSample[Index] = SampleList[Index]; + + // move to next header + CurStreamHeader = (PKSSTREAM_HEADER)((ULONG_PTR)CurStreamHeader + CurStreamHeader->Size); + } + + // submit to device + m_Pin->KsIncrementPendingIoCount(); + + if (DeviceIoControl(m_Handle, + IoOperation == KsIoOperation_Write ? IOCTL_KS_WRITE_STREAM : IOCTL_KS_READ_STREAM, + NULL, 0, + StreamSegment->StreamHeader, + StreamHeaderSize, + &BytesReturned, + &StreamSegment->Overlapped)) + { + // signal completion + SetEvent(StreamSegment->StreamSegment.CompletionEvent); + hr = S_OK; + *OutStreamSegment = (PKSSTREAM_SEGMENT)StreamSegment; + } + else + { + if (GetLastError() == ERROR_IO_PENDING) + { + *OutStreamSegment = (PKSSTREAM_SEGMENT)StreamSegment; + hr = S_OK; + } + } + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsInterfaceHandler::KsCompleteIo( + PKSSTREAM_SEGMENT InStreamSegment) +{ + PKSSTREAM_SEGMENT_EXT StreamSegment; + PKSSTREAM_HEADER CurStreamHeader; + DWORD dwError = ERROR_SUCCESS, BytesReturned; + BOOL bOverlapped; + ULONG Index; + HRESULT hr; + IMediaSample2 * MediaSample; + AM_SAMPLE2_PROPERTIES Properties; + REFERENCE_TIME Start, Stop; + + // get private stream segment + StreamSegment = (PKSSTREAM_SEGMENT_EXT)InStreamSegment; + + // get result + bOverlapped = GetOverlappedResult(m_Handle, &StreamSegment->Overlapped, &BytesReturned, FALSE); + dwError = GetLastError(); + + CurStreamHeader = StreamSegment->StreamHeader; + + //iterate through all stream headers + for(Index = 0; Index < StreamSegment->SampleCount; Index++) + { + if (!bOverlapped) + { + // operation failed + m_Pin->KsNotifyError(StreamSegment->MediaSample[Index], MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, dwError)); + } + + // query IMediaSample2 interface + hr = StreamSegment->MediaSample[Index]->QueryInterface(IID_IMediaSample2, (void**)&MediaSample); + if (SUCCEEDED(hr)) + { + // media sample properties + hr = MediaSample->GetProperties(sizeof(AM_SAMPLE2_PROPERTIES), (BYTE*)&Properties); + if (SUCCEEDED(hr)) + { + //update media sample properties + Properties.dwTypeSpecificFlags = CurStreamHeader->TypeSpecificFlags; + Properties.dwSampleFlags |= (CurStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY); + + MediaSample->SetProperties(sizeof(AM_SAMPLE2_PROPERTIES), (BYTE*)&Properties); + } + // release IMediaSample2 interface + MediaSample->Release(); + } + + // was an extended header used + if (StreamSegment->ExtendedSize) + { + // unprepare stream header extension + StreamSegment->StreamSegment.KsDataTypeHandler->KsCompleteIoOperation(StreamSegment->MediaSample[Index], (CurStreamHeader + 1), StreamSegment->StreamSegment.IoOperation, bOverlapped == FALSE); + } + + Start = 0; + Stop = 0; + if (bOverlapped && StreamSegment->StreamSegment.IoOperation == KsIoOperation_Read) + { + // update common media sample details + StreamSegment->MediaSample[Index]->SetSyncPoint((CurStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT)); + StreamSegment->MediaSample[Index]->SetPreroll((CurStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_PREROLL)); + StreamSegment->MediaSample[Index]->SetDiscontinuity((CurStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY)); + + if (CurStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TIMEVALID) + { + // use valid timestamp + Start = CurStreamHeader->PresentationTime.Time; + + if (CurStreamHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_DURATIONVALID) + { + Stop = CurStreamHeader->PresentationTime.Time + CurStreamHeader->Duration; + } + } + } + + // now set time + hr = StreamSegment->MediaSample[Index]->SetTime(&Start, &Stop); + if (FAILED(hr)) + { + // use start time + StreamSegment->MediaSample[Index]->SetTime(&Start, &Start); + } + + // set valid data length + StreamSegment->MediaSample[Index]->SetActualDataLength(CurStreamHeader->DataUsed); + + if (StreamSegment->StreamSegment.IoOperation == KsIoOperation_Read) + { + if (bOverlapped) + { + // deliver sample + m_Pin->KsDeliver(StreamSegment->MediaSample[Index], CurStreamHeader->OptionsFlags); + } + } + else if (StreamSegment->StreamSegment.IoOperation == KsIoOperation_Write) + { + // release media sample reference + StreamSegment->MediaSample[Index]->Release(); + } + + CurStreamHeader = (PKSSTREAM_HEADER)((ULONG_PTR)CurStreamHeader + CurStreamHeader->Size); + } + + // delete stream headers + CoTaskMemFree(StreamSegment->StreamHeader); + + if (StreamSegment->StreamSegment.KsDataTypeHandler) + { + // release reference + StreamSegment->StreamSegment.KsDataTypeHandler->Release(); + } + + // decrement pending i/o count + m_Pin->KsDecrementPendingIoCount(); + + //notify of completion + m_Pin->KsMediaSamplesCompleted(InStreamSegment); + + //destroy stream segment + CoTaskMemFree(StreamSegment); + + //release reference to ourselves + Release(); + + // done + // Event handle is closed by caller + return S_OK; +} + +HRESULT +WINAPI +CKsInterfaceHandler_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv) +{ + OutputDebugStringW(L"CKsInterfaceHandler_Constructor\n"); + + CKsInterfaceHandler * handler = new CKsInterfaceHandler(); + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/ksproxy/ksproxy.c b/reactos/dll/directx/ksproxy/ksproxy.c deleted file mode 100644 index bb899578b57..00000000000 --- a/reactos/dll/directx/ksproxy/ksproxy.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - * KSPROXY.AX - ReactOS WDM Streaming ActiveMovie Proxy - * - * Copyright 2008 Dmitry Chapyshev - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include -#include -#include -#include -#include -#include - -HRESULT WINAPI -KsSynchronousDeviceControl( - HANDLE Handle, - ULONG IoControl, - PVOID InBuffer, - ULONG InLength, - PVOID OutBuffer, - ULONG OutLength, - PULONG BytesReturned) -{ - return NOERROR; -} - -HRESULT WINAPI -KsResolveRequiredAttributes( - PKSDATARANGE DataRange, - KSMULTIPLE_ITEM *Attributes OPTIONAL) -{ - return NOERROR; -} - -HRESULT WINAPI -KsOpenDefaultDevice( - REFGUID Category, - ACCESS_MASK Access, - PHANDLE DeviceHandle) -{ - return NOERROR; -} - -HRESULT WINAPI -KsGetMultiplePinFactoryItems( - HANDLE FilterHandle, - ULONG PinFactoryId, - ULONG PropertyId, - PVOID *Items) -{ - return NOERROR; -} - -HRESULT WINAPI -KsGetMediaTypeCount( - HANDLE FilterHandle, - ULONG PinFactoryId, - ULONG *MediaTypeCount) -{ - return NOERROR; -} - -HRESULT WINAPI -KsGetMediaType( - int Position, - AM_MEDIA_TYPE *AmMediaType, - HANDLE FilterHandle, - ULONG PinFactoryId) -{ - return NOERROR; -} - -HRESULT WINAPI -DllUnregisterServer(void) -{ - return S_OK; -} - -HRESULT WINAPI -DllRegisterServer(void) -{ - return S_OK; -} - -HRESULT WINAPI -DllGetClassObject( - REFCLSID rclsid, - REFIID riid, - LPVOID *ppv) -{ - return S_OK; -} - -HRESULT WINAPI -DllCanUnloadNow(void) -{ - return S_OK; -} - diff --git a/reactos/dll/directx/ksproxy/ksproxy.cpp b/reactos/dll/directx/ksproxy/ksproxy.cpp new file mode 100644 index 00000000000..f1e17c96922 --- /dev/null +++ b/reactos/dll/directx/ksproxy/ksproxy.cpp @@ -0,0 +1,402 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy + * FILE: dll/directx/ksproxy/ksproxy.c + * PURPOSE: ActiveMovie Proxy functions + * + * PROGRAMMERS: Dmitry Chapyshev + Johannes Anderwald (janderwald@reactos.org) + */ + +#include "precomp.h" + + +const GUID CLSID_KsClockForwarder = {0x877e4351, 0x6fea, 0x11d0, {0xb8, 0x63, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1}}; +const GUID CLSID_KsQualityForwarder = {0xe05592e4, 0xc0b5, 0x11d0, {0xa4, 0x39, 0x00, 0xa0, 0xc9, 0x22, 0x31, 0x96}}; + + +#ifndef _MSC_VER +const GUID CLSID_KsIBasicAudioInterfaceHandler = {0xb9f8ac3e, 0x0f71, 0x11d2, {0xb7, 0x2c, 0x00, 0xc0, 0x4f, 0xb6, 0xbd, 0x3d}}; +const GUID KSPROPSETID_Pin = {0x8C134960, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}}; +const GUID KSINTERFACESETID_Standard = {STATIC_KSINTERFACESETID_Standard}; +const GUID CLSID_Proxy = {0x17CCA71B, 0xECD7, 0x11D0, {0xB9, 0x08, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}}; +#endif + +static INTERFACE_TABLE InterfaceTable[] = +{ + {&MEDIATYPE_Audio, CKsDataTypeHandler_Constructor}, + {&KSINTERFACESETID_Standard, CKsInterfaceHandler_Constructor}, + {&CLSID_KsClockForwarder, CKsClockForwarder_Constructor}, + {&CLSID_KsQualityForwarder, CKsQualityForwarder_Constructor}, + {&IID_IVPConfig, CVPConfig_Constructor}, + {&IID_IVPVBIConfig, CVPVBIConfig_Constructor}, + {&CLSID_KsIBasicAudioInterfaceHandler, CKsBasicAudio_Constructor}, + {&CLSID_Proxy, CKsProxy_Constructor}, + {NULL, NULL} +}; + +KSDDKAPI +HRESULT +WINAPI +KsSynchronousDeviceControl( + HANDLE Handle, + ULONG IoControl, + PVOID InBuffer, + ULONG InLength, + PVOID OutBuffer, + ULONG OutLength, + PULONG BytesReturned) +{ + OVERLAPPED Overlapped; + DWORD Transferred; + + /* zero overlapped */ + RtlZeroMemory(&Overlapped, sizeof(OVERLAPPED)); + + /* create notification event */ + Overlapped.hEvent = CreateEventW(NULL, TRUE, FALSE, NULL); + + if (!Overlapped.hEvent) + { + /* failed */ + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); + } + + if (!DeviceIoControl(Handle, IoControl, InBuffer, InLength, OutBuffer, OutLength, BytesReturned, &Overlapped)) + { + /* operation failed */ + if (GetLastError() != ERROR_IO_PENDING) + { + /* failed */ + CloseHandle(Overlapped.hEvent); + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); + } + } + + /* get result of pending operation */ + if (!GetOverlappedResult(Handle, &Overlapped, &Transferred, TRUE)) + { + /* failed */ + CloseHandle(Overlapped.hEvent); + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); + } + + /* store number of bytes transferred */ + *BytesReturned = Transferred; + + /* close event object */ + CloseHandle(Overlapped.hEvent); + + /* done */ + return NOERROR; +} + +KSDDKAPI +HRESULT +WINAPI +KsResolveRequiredAttributes( + PKSDATARANGE DataRange, + KSMULTIPLE_ITEM *Attributes OPTIONAL) +{ + //UNIMPLEMENTED + return NOERROR; +} + +KSDDKAPI +HRESULT +WINAPI +KsOpenDefaultDevice( + REFGUID Category, + ACCESS_MASK Access, + PHANDLE DeviceHandle) +{ + HDEVINFO hList; + SP_DEVINFO_DATA DeviceInfoData; + SP_DEVICE_INTERFACE_DATA DeviceInterfaceData; + PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData; + WCHAR Path[MAX_PATH+sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W)]; + + /* open device list */ + hList = SetupDiGetClassDevsW(&Category, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); + + if (hList == INVALID_HANDLE_VALUE) + { + /* failed */ + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); + } + + /* setup parameters */ + DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); + DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + + if (SetupDiEnumDeviceInterfaces(hList, NULL, &Category, 0, &DeviceInterfaceData)) + { + /* setup interface data struct */ + DeviceInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA_W)Path; + DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W); + + /* get device interface details */ + if (SetupDiGetDeviceInterfaceDetailW(hList, &DeviceInterfaceData, DeviceInterfaceDetailData, sizeof(Path), NULL, NULL)) + { + /* open device */ + *DeviceHandle = CreateFileW(DeviceInterfaceDetailData->DevicePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL, NULL); + + if (*DeviceHandle != INVALID_HANDLE_VALUE) + { + /* operation succeeded */ + SetupDiDestroyDeviceInfoList(hList); + return NOERROR; + } + } + } + + /* free device list */ + SetupDiDestroyDeviceInfoList(hList); + + /* failed */ + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); +} + +KSDDKAPI +HRESULT +WINAPI +KsGetMultiplePinFactoryItems( + HANDLE FilterHandle, + ULONG PinFactoryId, + ULONG PropertyId, + PVOID *Items) +{ + KSP_PIN Property; + ULONG BytesReturned, NumData; + HRESULT hResult; + + /* zero pin property */ + RtlZeroMemory(&Property, sizeof(KSP_PIN)); + Property.Property.Set = KSPROPSETID_Pin; + Property.Property.Id = PropertyId; + Property.Property.Flags = KSPROPERTY_TYPE_GET; + Property.PinId = PinFactoryId; + + /* query pin factory */ + hResult = KsSynchronousDeviceControl(FilterHandle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), NULL, 0, &BytesReturned); + + if (hResult == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_INSUFFICIENT_BUFFER)) + { + /* buffer too small */ + hResult = KsSynchronousDeviceControl(FilterHandle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), (PVOID)&NumData, sizeof(ULONG), &BytesReturned); + + if (SUCCEEDED(hResult)) + { + /* store required data size */ + BytesReturned = NumData; + hResult = MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_MORE_DATA); + } + } + + if (hResult == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_MORE_DATA)) + { + /* allocate data */ + *Items = CoTaskMemAlloc(BytesReturned); + + if (!*Items) + { + /* no memory */ + return E_OUTOFMEMORY; + } + + /* retry querying property */ + hResult = KsSynchronousDeviceControl(FilterHandle, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), (PVOID)*Items, BytesReturned, &BytesReturned); + + /* check for success */ + if (FAILED(hResult)) + { + /* free memory */ + CoTaskMemFree(*Items); + } + } + + /* done */ + return hResult; +} + +KSDDKAPI +HRESULT +WINAPI +KsGetMediaTypeCount( + HANDLE FilterHandle, + ULONG PinFactoryId, + ULONG *MediaTypeCount) +{ + PKSMULTIPLE_ITEM MultipleItem; + HRESULT hr; + + /* try get contrained data ranges */ + hr = KsGetMultiplePinFactoryItems(FilterHandle, PinFactoryId, KSPROPERTY_PIN_CONSTRAINEDDATARANGES, (PVOID*)&MultipleItem); + + /* check for failure*/ + if (FAILED(hr)) + { + /* try getting default data ranges */ + hr = KsGetMultiplePinFactoryItems(FilterHandle, PinFactoryId, KSPROPERTY_PIN_DATARANGES, (PVOID*)&MultipleItem); + } + + if (SUCCEEDED(hr)) + { + /* store number of media types */ + *MediaTypeCount = MultipleItem->Count; + + /* free memory */ + CoTaskMemFree(MultipleItem); + } + + /* done */ + return hr; +} + +KSDDKAPI +HRESULT +WINAPI +KsGetMediaType( + int Position, + AM_MEDIA_TYPE *AmMediaType, + HANDLE FilterHandle, + ULONG PinFactoryId) +{ + HRESULT hr; + PKSMULTIPLE_ITEM ItemList; + int i = 0; + PKSDATAFORMAT DataFormat; + + if (Position < 0) + return E_INVALIDARG; + + // get current supported ranges + hr = KsGetMultiplePinFactoryItems(FilterHandle, PinFactoryId, KSPROPERTY_PIN_CONSTRAINEDDATARANGES, (PVOID*)&ItemList); + if (FAILED(hr)) + { + // get standard dataranges + hr = KsGetMultiplePinFactoryItems(FilterHandle, PinFactoryId, KSPROPERTY_PIN_DATARANGES, (PVOID*)&ItemList); + + //check for success + if (FAILED(hr)) + return hr; + } + + if ((ULONG)Position >= ItemList->Count) + { + // out of bounds + CoTaskMemFree(ItemList); + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NO_MORE_ITEMS); + } + + // goto first datarange + DataFormat = (PKSDATAFORMAT)(ItemList + 1); + + while(i != Position) + { + // goto next format; + DataFormat = (PKSDATAFORMAT)(ULONG_PTR)(DataFormat + DataFormat->FormatSize); + i++; + } + + + DataFormat->FormatSize -= sizeof(KSDATAFORMAT); + if (DataFormat->FormatSize) + { + // copy extra format buffer + AmMediaType->pbFormat = (BYTE*)CoTaskMemAlloc(DataFormat->FormatSize); + if (!AmMediaType->pbFormat) + { + // not enough memory + CoTaskMemFree(ItemList); + return E_OUTOFMEMORY; + } + // copy format buffer + CopyMemory(AmMediaType->pbFormat, (DataFormat + 1), DataFormat->FormatSize); + AmMediaType->cbFormat = DataFormat->FormatSize; + } + else + { + // no format buffer + AmMediaType->pbFormat = NULL; + AmMediaType->cbFormat = 0; + } + + // copy type info + CopyMemory(&AmMediaType->majortype, &DataFormat->MajorFormat, sizeof(GUID)); + CopyMemory(&AmMediaType->subtype, &DataFormat->SubFormat, sizeof(GUID)); + CopyMemory(&AmMediaType->formattype, &DataFormat->Specifier, sizeof(GUID)); + AmMediaType->bTemporalCompression = FALSE; //FIXME verify + AmMediaType->pUnk = NULL; //FIXME + AmMediaType->lSampleSize = DataFormat->SampleSize; + AmMediaType->bFixedSizeSamples = (AmMediaType->lSampleSize) ? TRUE : FALSE; + + // free dataformat list + CoTaskMemFree(ItemList); + + return NOERROR; +} + +extern "C" +KSDDKAPI +HRESULT +WINAPI +DllUnregisterServer(void) +{ + return S_OK; +} + +extern "C" +KSDDKAPI +HRESULT +WINAPI +DllRegisterServer(void) +{ + return S_OK; +} + +KSDDKAPI +HRESULT +WINAPI +DllGetClassObject( + REFCLSID rclsid, + REFIID riid, + LPVOID *ppv) +{ + UINT i; + HRESULT hres = E_OUTOFMEMORY; + IClassFactory * pcf = NULL; + + if (!ppv) + return E_INVALIDARG; + + *ppv = NULL; + + for (i = 0; InterfaceTable[i].riid; i++) + { + if (IsEqualIID(*InterfaceTable[i].riid, rclsid)) + { + pcf = CClassFactory_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL); + break; + } + } + + if (!pcf) + { + return CLASS_E_CLASSNOTAVAILABLE; + } + + hres = pcf->QueryInterface(riid, ppv); + pcf->Release(); + + return hres; +} + +KSDDKAPI +HRESULT +WINAPI +DllCanUnloadNow(void) +{ + return S_OK; +} + diff --git a/reactos/dll/directx/ksproxy/ksproxy.rbuild b/reactos/dll/directx/ksproxy/ksproxy.rbuild index c4c177b5e16..86cd50a2c1d 100644 --- a/reactos/dll/directx/ksproxy/ksproxy.rbuild +++ b/reactos/dll/directx/ksproxy/ksproxy.rbuild @@ -4,9 +4,39 @@ . - advapi32 ntdll - ksproxy.c + kernel32 + advapi32 + ole32 + setupapi + msvcrt + strmiids + ksuser + + -fno-exceptions + -fno-rtti + + + + /GR- + + allocator.cpp + basicaudio.cpp + classfactory.cpp + clockforward.cpp + cvpconfig.cpp + cvpvbiconfig.cpp + datatype.cpp + enum_mediatypes.cpp + enumpins.cpp + input_pin.cpp + interface.cpp + ksproxy.cpp ksproxy.rc + mediasample.cpp + node.cpp + output_pin.cpp + proxy.cpp + qualityforward.cpp diff --git a/reactos/dll/directx/ksproxy/ksproxy.rc b/reactos/dll/directx/ksproxy/ksproxy.rc index cf8ecb41a6a..2539cac432b 100644 --- a/reactos/dll/directx/ksproxy/ksproxy.rc +++ b/reactos/dll/directx/ksproxy/ksproxy.rc @@ -1,9 +1,98 @@ +// Microsoft Visual C++ generated resource script. +// +//#include "resource." -#define REACTOS_VERSION_DLL -#define REACTOS_STR_FILE_DESCRIPTION "ReactOS WDM Streaming ActiveMovie Proxy\0" -#define REACTOS_STR_INTERNAL_NAME "ksproxy\0" -#define REACTOS_STR_ORIGINAL_FILENAME "ksproxy.ax\0" +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" -#include +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// Deutsch (Deutschland) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +#ifdef _WIN32 +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 5,3,2600,3264 + PRODUCTVERSION 5,3,2600,3264 + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040704b0" + BEGIN + VALUE "CompanyName", "ReactOS WDM Streaming ActiveMovie Proxy" + VALUE "FileDescription", "ReactOS WDM Streaming ActiveMovie Proxy" + VALUE "FileVersion", "5, 3, 2600, 3264" + VALUE "InternalName", "ksproxy" + VALUE "LegalCopyright", "Copyright (C) 2010" + VALUE "OriginalFilename", "ksproxy.dll" + VALUE "ProductName", "ReactOS WDM Streaming ActiveMovie Proxy" + VALUE "ProductVersion", "5, 3, 2600, 3264" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x407, 1200 + END +END + +#endif // Deutsch (Deutschland) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + ///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED -#include diff --git a/reactos/dll/directx/ksproxy/mediasample.cpp b/reactos/dll/directx/ksproxy/mediasample.cpp new file mode 100644 index 00000000000..8e317efef61 --- /dev/null +++ b/reactos/dll/directx/ksproxy/mediasample.cpp @@ -0,0 +1,370 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy + * FILE: dll/directx/ksproxy/mediasample.cpp + * PURPOSE: IMediaSample interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CMediaSample : public IMediaSample +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + DebugBreak(); + if (!m_Ref) + { + if (m_Allocator) + { + m_Allocator->ReleaseBuffer((IMediaSample*)this); + return 0; + } + delete this; + return 0; + } + return m_Ref; + } + + HRESULT STDMETHODCALLTYPE GetPointer(BYTE **ppBuffer); + long STDMETHODCALLTYPE GetSize(void); + HRESULT STDMETHODCALLTYPE GetTime(REFERENCE_TIME *pTimeStart, REFERENCE_TIME *pTimeEnd); + HRESULT STDMETHODCALLTYPE SetTime(REFERENCE_TIME *pTimeStart, REFERENCE_TIME *pTimeEnd); + HRESULT STDMETHODCALLTYPE IsSyncPoint(); + HRESULT STDMETHODCALLTYPE SetSyncPoint(BOOL bIsSyncPoint); + HRESULT STDMETHODCALLTYPE IsPreroll(); + HRESULT STDMETHODCALLTYPE SetPreroll(BOOL bIsPreroll); + long STDMETHODCALLTYPE GetActualDataLength(); + HRESULT STDMETHODCALLTYPE SetActualDataLength(long Length); + HRESULT STDMETHODCALLTYPE GetMediaType(AM_MEDIA_TYPE **ppMediaType); + HRESULT STDMETHODCALLTYPE SetMediaType(AM_MEDIA_TYPE *pMediaType); + HRESULT STDMETHODCALLTYPE IsDiscontinuity(); + HRESULT STDMETHODCALLTYPE SetDiscontinuity(BOOL bDiscontinuity); + HRESULT STDMETHODCALLTYPE GetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd); + HRESULT STDMETHODCALLTYPE SetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd); + + CMediaSample(IMemAllocator * Allocator, BYTE * Buffer, LONG BufferSize); + virtual ~CMediaSample(){} + +protected: + ULONG m_Flags; + ULONG m_TypeFlags; + BYTE * m_Buffer; + LONG m_ActualLength; + LONG m_BufferSize; + IMemAllocator * m_Allocator; + CMediaSample * m_Next; + REFERENCE_TIME m_StartTime; + REFERENCE_TIME m_StopTime; + LONGLONG m_MediaStart; + LONGLONG m_MediaStop; + AM_MEDIA_TYPE * m_MediaType; + ULONG m_StreamId; + +public: + LONG m_Ref; + + BOOL m_bMediaTimeValid; + + +}; + +CMediaSample::CMediaSample( + IMemAllocator * Allocator, + BYTE * Buffer, + LONG BufferSize) : + m_Flags(0), + m_TypeFlags(0), + m_Buffer(Buffer), + m_ActualLength(BufferSize), + m_BufferSize(BufferSize), + m_Allocator(Allocator), + m_Next(0), + m_StartTime(0), + m_StopTime(0), + m_MediaStart(0), + m_MediaStop(0), + m_MediaType(0), + m_StreamId(0), + m_Ref(0), + m_bMediaTimeValid(0) +{ +} + + +HRESULT +STDMETHODCALLTYPE +CMediaSample::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown) || + IsEqualGUID(refiid, IID_IMediaSample)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + if (IsEqualGUID(refiid, IID_IMediaSample2)) + { + + OutputDebugStringW(L"CMediaSample::QueryInterface requested IMediaSample2 interface\n"); +#if 0 + *Output = (IMediaSample2*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; +#endif + } + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IMediaSample interface +// +HRESULT +STDMETHODCALLTYPE +CMediaSample::GetPointer( + BYTE **ppBuffer) +{ + if (!ppBuffer) + return E_POINTER; + + *ppBuffer = m_Buffer; + return S_OK; +} + +long +STDMETHODCALLTYPE +CMediaSample::GetSize() +{ + return m_BufferSize; +} + +HRESULT +STDMETHODCALLTYPE +CMediaSample::GetTime( + REFERENCE_TIME *pTimeStart, + REFERENCE_TIME *pTimeEnd) +{ + HRESULT hr; + + if (!pTimeStart || !pTimeEnd) + return E_POINTER; + + if (!(m_Flags & (AM_SAMPLE_TIMEVALID | AM_SAMPLE_STOPVALID))) + { + // no time is set + return VFW_E_SAMPLE_TIME_NOT_SET; + } + + *pTimeStart = m_StartTime; + + if (m_Flags & AM_SAMPLE_STOPVALID) + { + *pTimeEnd = m_StopTime; + hr = NOERROR; + } + else + { + *pTimeEnd = m_StartTime + 1; + hr = VFW_S_NO_STOP_TIME; + } + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CMediaSample::SetTime(REFERENCE_TIME *pTimeStart, REFERENCE_TIME *pTimeEnd) +{ + if (!pTimeStart) + { + m_Flags &= ~(AM_SAMPLE_TIMEVALID | AM_SAMPLE_STOPVALID); + return NOERROR; + } + + if (!pTimeEnd) + { + m_Flags &= ~(AM_SAMPLE_STOPVALID); + m_Flags |= AM_SAMPLE_TIMEVALID; + m_StartTime = *pTimeStart; + return NOERROR; + } + + + m_Flags |= (AM_SAMPLE_TIMEVALID | AM_SAMPLE_STOPVALID); + m_StartTime = *pTimeStart; + m_StopTime = *pTimeEnd; + + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CMediaSample::IsSyncPoint() +{ + return (m_Flags & AM_SAMPLE_SPLICEPOINT) ? S_OK : S_FALSE; +} +HRESULT +STDMETHODCALLTYPE +CMediaSample::SetSyncPoint(BOOL bIsSyncPoint) +{ + if (bIsSyncPoint) + m_Flags |= AM_SAMPLE_SPLICEPOINT; + else + m_Flags &= ~AM_SAMPLE_SPLICEPOINT; + + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CMediaSample::IsPreroll() +{ + return (m_Flags & AM_SAMPLE_PREROLL) ? S_OK : S_FALSE; +} + +HRESULT +STDMETHODCALLTYPE +CMediaSample::SetPreroll(BOOL bIsPreroll) +{ + if (bIsPreroll) + m_Flags |= AM_SAMPLE_PREROLL; + else + m_Flags &= ~AM_SAMPLE_PREROLL; + + return NOERROR; +} + +long +STDMETHODCALLTYPE +CMediaSample::GetActualDataLength() +{ + return m_ActualLength; +} + +HRESULT +STDMETHODCALLTYPE +CMediaSample::SetActualDataLength(long Length) +{ + if (Length > m_BufferSize) + return VFW_E_BUFFER_OVERFLOW; + + m_ActualLength = Length; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CMediaSample::GetMediaType(AM_MEDIA_TYPE **ppMediaType) +{ + OutputDebugStringW(L"CMediaSample::GetMediaType\n"); + + if (!m_MediaType) + { + *ppMediaType = NULL; + return S_FALSE; + } + + assert(0); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CMediaSample::SetMediaType(AM_MEDIA_TYPE *pMediaType) +{ + OutputDebugStringW(L"CMediaSample::SetMediaType NotImplemented\n"); + DebugBreak(); + return E_NOTIMPL; +} + + +HRESULT +STDMETHODCALLTYPE +CMediaSample::IsDiscontinuity() +{ + return (m_Flags & AM_SAMPLE_DATADISCONTINUITY) ? S_OK : S_FALSE; +} + +HRESULT +STDMETHODCALLTYPE +CMediaSample::SetDiscontinuity(BOOL bDiscontinuity) +{ + if (bDiscontinuity) + m_Flags |= AM_SAMPLE_DATADISCONTINUITY; + else + m_Flags &= ~AM_SAMPLE_DATADISCONTINUITY; + + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CMediaSample::GetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd) +{ + if (!pTimeStart || !pTimeEnd) + return E_POINTER; + + if (!m_bMediaTimeValid) + return VFW_E_MEDIA_TIME_NOT_SET; + + m_MediaStart = *pTimeStart; + m_MediaStop = *pTimeEnd; + + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CMediaSample::SetMediaTime(LONGLONG *pTimeStart, LONGLONG *pTimeEnd) +{ + if (!pTimeStart || !pTimeEnd) + { + m_bMediaTimeValid = false; + return NOERROR; + } + + m_MediaStart = *pTimeStart; + m_MediaStop = *pTimeEnd; + + return NOERROR; +} + + + + +HRESULT +WINAPI +CMediaSample_Constructor( + IMemAllocator* Allocator, + BYTE* pBuffer, + ULONG BufferSize, + REFIID riid, + LPVOID * ppv) +{ + OutputDebugStringW(L"CMediaSample_Constructor\n"); + + CMediaSample * handler = new CMediaSample(Allocator, pBuffer, BufferSize); + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/ksproxy/node.cpp b/reactos/dll/directx/ksproxy/node.cpp new file mode 100644 index 00000000000..d2686bb96a4 --- /dev/null +++ b/reactos/dll/directx/ksproxy/node.cpp @@ -0,0 +1,157 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy + * FILE: dll/directx/ksproxy/node.cpp + * PURPOSE: Control Node + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CKsNode : public IKsControl +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + //IKsControl + HRESULT STDMETHODCALLTYPE KsProperty(PKSPROPERTY Property, ULONG PropertyLength, LPVOID PropertyData, ULONG DataLength, ULONG* BytesReturned); + HRESULT STDMETHODCALLTYPE KsMethod(PKSMETHOD Method, ULONG MethodLength, LPVOID MethodData, ULONG DataLength, ULONG* BytesReturned); + HRESULT STDMETHODCALLTYPE KsEvent(PKSEVENT Event, ULONG EventLength, LPVOID EventData, ULONG DataLength, ULONG* BytesReturned); + + CKsNode(IUnknown * pUnkOuter, HANDLE Handle) : m_Ref(0), m_pUnkOuter(pUnkOuter), m_Handle(Handle){}; + virtual ~CKsNode() + { + CloseHandle(m_Handle); + }; + +protected: + LONG m_Ref; + IUnknown * m_pUnkOuter; + HANDLE m_Handle; +}; + +HRESULT +STDMETHODCALLTYPE +CKsNode::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown) || + IsEqualGUID(refiid, IID_IKsControl)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IKsControl +// +HRESULT +STDMETHODCALLTYPE +CKsNode::KsProperty( + PKSPROPERTY Property, + ULONG PropertyLength, + LPVOID PropertyData, + ULONG DataLength, + ULONG* BytesReturned) +{ + assert(m_Handle != 0); + return KsSynchronousDeviceControl(m_Handle, IOCTL_KS_PROPERTY, (PVOID)Property, PropertyLength, (PVOID)PropertyData, DataLength, BytesReturned); +} + +HRESULT +STDMETHODCALLTYPE +CKsNode::KsMethod( + PKSMETHOD Method, + ULONG MethodLength, + LPVOID MethodData, + ULONG DataLength, + ULONG* BytesReturned) +{ + assert(m_Handle != 0); + return KsSynchronousDeviceControl(m_Handle, IOCTL_KS_METHOD, (PVOID)Method, MethodLength, (PVOID)MethodData, DataLength, BytesReturned); +} + +HRESULT +STDMETHODCALLTYPE +CKsNode::KsEvent( + PKSEVENT Event, + ULONG EventLength, + LPVOID EventData, + ULONG DataLength, + ULONG* BytesReturned) +{ + assert(m_Handle != 0); + + if (EventLength) + return KsSynchronousDeviceControl(m_Handle, IOCTL_KS_ENABLE_EVENT, (PVOID)Event, EventLength, (PVOID)EventData, DataLength, BytesReturned); + else + return KsSynchronousDeviceControl(m_Handle, IOCTL_KS_DISABLE_EVENT, (PVOID)Event, EventLength, NULL, 0, BytesReturned); +} + +HRESULT +WINAPI +CKsNode_Constructor( + IUnknown * pUnkOuter, + HANDLE ParentHandle, + ULONG NodeId, + ACCESS_MASK DesiredAccess, + REFIID riid, + LPVOID * ppv) +{ + HRESULT hr; + HANDLE handle; + KSNODE_CREATE NodeCreate; + + OutputDebugStringW(L"CKsNode_Constructor\n"); + + //setup request + NodeCreate.CreateFlags = 0; + NodeCreate.Node = NodeId; + + hr = KsCreateTopologyNode(ParentHandle, &NodeCreate, DesiredAccess, &handle); + if (hr != NOERROR) + { + OutputDebugString("CKsNode_Constructor failed to open device\n"); + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, hr); + } + + CKsNode * quality = new CKsNode(pUnkOuter, handle); + + if (!quality) + { + // free clock handle + CloseHandle(handle); + return E_OUTOFMEMORY; + } + + if (FAILED(quality->QueryInterface(riid, ppv))) + { + /* not supported */ + delete quality; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/ksproxy/output_pin.cpp b/reactos/dll/directx/ksproxy/output_pin.cpp new file mode 100644 index 00000000000..e5f172bf2e0 --- /dev/null +++ b/reactos/dll/directx/ksproxy/output_pin.cpp @@ -0,0 +1,2149 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy + * FILE: dll/directx/ksproxy/output_pin.cpp + * PURPOSE: OutputPin of Proxy Filter + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class COutputPin : public IPin, + public IKsObject, + public IKsPropertySet, + public IStreamBuilder, + public IKsPinFactory, + public ISpecifyPropertyPages, + public IKsPinEx, + public IKsPinPipe, + public IKsControl, + public IKsAggregateControl, + public IQualityControl, + public IMediaSeeking, + public IAMBufferNegotiation, + public IAMStreamConfig, + public IMemAllocatorNotifyCallbackTemp + +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + //delete this; + return 0; + } + return m_Ref; + } + + //IKsPin + HRESULT STDMETHODCALLTYPE KsQueryMediums(PKSMULTIPLE_ITEM* MediumList); + HRESULT STDMETHODCALLTYPE KsQueryInterfaces(PKSMULTIPLE_ITEM* InterfaceList); + HRESULT STDMETHODCALLTYPE KsCreateSinkPinHandle(KSPIN_INTERFACE& Interface, KSPIN_MEDIUM& Medium); + HRESULT STDMETHODCALLTYPE KsGetCurrentCommunication(KSPIN_COMMUNICATION *Communication, KSPIN_INTERFACE *Interface, KSPIN_MEDIUM *Medium); + HRESULT STDMETHODCALLTYPE KsPropagateAcquire(); + HRESULT STDMETHODCALLTYPE KsDeliver(IMediaSample* Sample, ULONG Flags); + HRESULT STDMETHODCALLTYPE KsMediaSamplesCompleted(PKSSTREAM_SEGMENT StreamSegment); + IMemAllocator * STDMETHODCALLTYPE KsPeekAllocator(KSPEEKOPERATION Operation); + HRESULT STDMETHODCALLTYPE KsReceiveAllocator(IMemAllocator *MemAllocator); + HRESULT STDMETHODCALLTYPE KsRenegotiateAllocator(); + LONG STDMETHODCALLTYPE KsIncrementPendingIoCount(); + LONG STDMETHODCALLTYPE KsDecrementPendingIoCount(); + HRESULT STDMETHODCALLTYPE KsQualityNotify(ULONG Proportion, REFERENCE_TIME TimeDelta); + // IKsPinEx + VOID STDMETHODCALLTYPE KsNotifyError(IMediaSample* Sample, HRESULT hr); + + //IKsPinPipe + HRESULT STDMETHODCALLTYPE KsGetPinFramingCache(PKSALLOCATOR_FRAMING_EX *FramingEx, PFRAMING_PROP FramingProp, FRAMING_CACHE_OPS Option); + HRESULT STDMETHODCALLTYPE KsSetPinFramingCache(PKSALLOCATOR_FRAMING_EX FramingEx, PFRAMING_PROP FramingProp, FRAMING_CACHE_OPS Option); + IPin* STDMETHODCALLTYPE KsGetConnectedPin(); + IKsAllocatorEx* STDMETHODCALLTYPE KsGetPipe(KSPEEKOPERATION Operation); + HRESULT STDMETHODCALLTYPE KsSetPipe(IKsAllocatorEx *KsAllocator); + ULONG STDMETHODCALLTYPE KsGetPipeAllocatorFlag(); + HRESULT STDMETHODCALLTYPE KsSetPipeAllocatorFlag(ULONG Flag); + GUID STDMETHODCALLTYPE KsGetPinBusCache(); + HRESULT STDMETHODCALLTYPE KsSetPinBusCache(GUID Bus); + PWCHAR STDMETHODCALLTYPE KsGetPinName(); + PWCHAR STDMETHODCALLTYPE KsGetFilterName(); + + //IPin methods + HRESULT STDMETHODCALLTYPE Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE Disconnect(); + HRESULT STDMETHODCALLTYPE ConnectedTo(IPin **pPin); + HRESULT STDMETHODCALLTYPE ConnectionMediaType(AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE QueryPinInfo(PIN_INFO *pInfo); + HRESULT STDMETHODCALLTYPE QueryDirection(PIN_DIRECTION *pPinDir); + HRESULT STDMETHODCALLTYPE QueryId(LPWSTR *Id); + HRESULT STDMETHODCALLTYPE QueryAccept(const AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE EnumMediaTypes(IEnumMediaTypes **ppEnum); + HRESULT STDMETHODCALLTYPE QueryInternalConnections(IPin **apPin, ULONG *nPin); + HRESULT STDMETHODCALLTYPE EndOfStream(); + HRESULT STDMETHODCALLTYPE BeginFlush(); + HRESULT STDMETHODCALLTYPE EndFlush(); + HRESULT STDMETHODCALLTYPE NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate); + + // ISpecifyPropertyPages + HRESULT STDMETHODCALLTYPE GetPages(CAUUID *pPages); + + //IKsObject methods + HANDLE STDMETHODCALLTYPE KsGetObjectHandle(); + + //IKsPropertySet + HRESULT STDMETHODCALLTYPE Set(REFGUID guidPropSet, DWORD dwPropID, LPVOID pInstanceData, DWORD cbInstanceData, LPVOID pPropData, DWORD cbPropData); + HRESULT STDMETHODCALLTYPE Get(REFGUID guidPropSet, DWORD dwPropID, LPVOID pInstanceData, DWORD cbInstanceData, LPVOID pPropData, DWORD cbPropData, DWORD *pcbReturned); + HRESULT STDMETHODCALLTYPE QuerySupported(REFGUID guidPropSet, DWORD dwPropID, DWORD *pTypeSupport); + + //IKsControl + HRESULT STDMETHODCALLTYPE KsProperty(PKSPROPERTY Property, ULONG PropertyLength, LPVOID PropertyData, ULONG DataLength, ULONG* BytesReturned); + HRESULT STDMETHODCALLTYPE KsMethod(PKSMETHOD Method, ULONG MethodLength, LPVOID MethodData, ULONG DataLength, ULONG* BytesReturned); + HRESULT STDMETHODCALLTYPE KsEvent(PKSEVENT Event, ULONG EventLength, LPVOID EventData, ULONG DataLength, ULONG* BytesReturned); + + //IStreamBuilder + HRESULT STDMETHODCALLTYPE Render(IPin *ppinOut, IGraphBuilder *pGraph); + HRESULT STDMETHODCALLTYPE Backout(IPin *ppinOut, IGraphBuilder *pGraph); + + //IKsPinFactory + HRESULT STDMETHODCALLTYPE KsPinFactory(ULONG* PinFactory); + + //IKsAggregateControl + HRESULT STDMETHODCALLTYPE KsAddAggregate(IN REFGUID AggregateClass); + HRESULT STDMETHODCALLTYPE KsRemoveAggregate(REFGUID AggregateClass); + + //IQualityControl + HRESULT STDMETHODCALLTYPE Notify(IBaseFilter *pSelf, Quality q); + HRESULT STDMETHODCALLTYPE SetSink(IQualityControl *piqc); + + //IMediaSeeking + HRESULT STDMETHODCALLTYPE GetCapabilities(DWORD *pCapabilities); + HRESULT STDMETHODCALLTYPE CheckCapabilities(DWORD *pCapabilities); + HRESULT STDMETHODCALLTYPE IsFormatSupported(const GUID *pFormat); + HRESULT STDMETHODCALLTYPE QueryPreferredFormat(GUID *pFormat); + HRESULT STDMETHODCALLTYPE GetTimeFormat(GUID *pFormat); + HRESULT STDMETHODCALLTYPE IsUsingTimeFormat(const GUID *pFormat); + HRESULT STDMETHODCALLTYPE SetTimeFormat(const GUID *pFormat); + HRESULT STDMETHODCALLTYPE GetDuration(LONGLONG *pDuration); + HRESULT STDMETHODCALLTYPE GetStopPosition(LONGLONG *pStop); + HRESULT STDMETHODCALLTYPE GetCurrentPosition(LONGLONG *pCurrent); + HRESULT STDMETHODCALLTYPE ConvertTimeFormat(LONGLONG *pTarget, const GUID *pTargetFormat, LONGLONG Source, const GUID *pSourceFormat); + HRESULT STDMETHODCALLTYPE SetPositions(LONGLONG *pCurrent, DWORD dwCurrentFlags, LONGLONG *pStop, DWORD dwStopFlags); + HRESULT STDMETHODCALLTYPE GetPositions(LONGLONG *pCurrent, LONGLONG *pStop); + HRESULT STDMETHODCALLTYPE GetAvailable(LONGLONG *pEarliest, LONGLONG *pLatest); + HRESULT STDMETHODCALLTYPE SetRate(double dRate); + HRESULT STDMETHODCALLTYPE GetRate(double *pdRate); + HRESULT STDMETHODCALLTYPE GetPreroll(LONGLONG *pllPreroll); + + //IAMBufferNegotiation + HRESULT STDMETHODCALLTYPE SuggestAllocatorProperties(const ALLOCATOR_PROPERTIES *pprop); + HRESULT STDMETHODCALLTYPE GetAllocatorProperties(ALLOCATOR_PROPERTIES *pprop); + + //IAMStreamConfig + HRESULT STDMETHODCALLTYPE SetFormat(AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE GetFormat(AM_MEDIA_TYPE **ppmt); + HRESULT STDMETHODCALLTYPE GetNumberOfCapabilities(int *piCount, int *piSize); + HRESULT STDMETHODCALLTYPE GetStreamCaps(int iIndex, AM_MEDIA_TYPE **ppmt, BYTE *pSCC); + + //IMemAllocatorNotifyCallbackTemp + HRESULT STDMETHODCALLTYPE NotifyRelease(); + + //--------------------------------------------------------------- + COutputPin(IBaseFilter * ParentFilter, LPCWSTR PinName, ULONG PinId, KSPIN_COMMUNICATION Communication); + virtual ~COutputPin(); + HRESULT STDMETHODCALLTYPE CheckFormat(const AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE CreatePin(const AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE CreatePinHandle(PKSPIN_MEDIUM Medium, PKSPIN_INTERFACE Interface, const AM_MEDIA_TYPE *pmt); + HRESULT WINAPI IoProcessRoutine(); + HRESULT WINAPI InitializeIOThread(); + + friend DWORD WINAPI COutputPin_IoThreadStartup(LPVOID lpParameter); + friend HRESULT STDMETHODCALLTYPE COutputPin_SetState(IPin * Pin, KSSTATE State); + +protected: + LONG m_Ref; + IBaseFilter * m_ParentFilter; + LPCWSTR m_PinName; + HANDLE m_hPin; + ULONG m_PinId; + IKsObject * m_KsObjectParent; + IPin * m_Pin; + IKsAllocatorEx * m_KsAllocatorEx; + ULONG m_PipeAllocatorFlag; + BOOL m_bPinBusCacheInitialized; + GUID m_PinBusCache; + LPWSTR m_FilterName; + FRAMING_PROP m_FramingProp[4]; + PKSALLOCATOR_FRAMING_EX m_FramingEx[4]; + + IMemAllocator * m_MemAllocator; + IMemInputPin * m_MemInputPin; + LONG m_IoCount; + KSPIN_COMMUNICATION m_Communication; + KSPIN_INTERFACE m_Interface; + KSPIN_MEDIUM m_Medium; + AM_MEDIA_TYPE m_MediaFormat; + + IMediaSeeking * m_FilterMediaSeeking; + ALLOCATOR_PROPERTIES m_Properties; + IKsInterfaceHandler * m_InterfaceHandler; + + HANDLE m_hStartEvent; + HANDLE m_hBufferAvailable; + HANDLE m_hStopEvent; + BOOL m_StopInProgress; + BOOL m_IoThreadStarted; + + KSSTATE m_State; +}; + +COutputPin::~COutputPin() +{ + if (m_KsObjectParent) + m_KsObjectParent->Release(); +} + +COutputPin::COutputPin( + IBaseFilter * ParentFilter, + LPCWSTR PinName, + ULONG PinId, + KSPIN_COMMUNICATION Communication) : m_Ref(0), + m_ParentFilter(ParentFilter), + m_PinName(PinName), + m_hPin(INVALID_HANDLE_VALUE), + m_PinId(PinId), + m_KsObjectParent(0), + m_Pin(0), + m_KsAllocatorEx(0), + m_PipeAllocatorFlag(0), + m_bPinBusCacheInitialized(0), + m_FilterName(0), + m_MemAllocator(0), + m_MemInputPin(0), + m_IoCount(0), + m_Communication(Communication), + m_FilterMediaSeeking(0), + m_InterfaceHandler(0), + m_hStartEvent(0), + m_hBufferAvailable(0), + m_hStopEvent(0), + m_StopInProgress(0), + m_IoThreadStarted(0), + m_State(KSSTATE_STOP) +{ + HRESULT hr; + + hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&m_KsObjectParent); + assert(hr == S_OK); + + hr = m_ParentFilter->QueryInterface(IID_IMediaSeeking, (LPVOID*)&m_FilterMediaSeeking); + assert(hr == S_OK); + + ZeroMemory(m_FramingProp, sizeof(m_FramingProp)); + ZeroMemory(m_FramingEx, sizeof(m_FramingEx)); + + hr = KsGetMediaType(0, &m_MediaFormat, m_KsObjectParent->KsGetObjectHandle(), m_PinId); + assert(hr == S_OK); +}; + +HRESULT +STDMETHODCALLTYPE +COutputPin::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + *Output = NULL; + if (IsEqualGUID(refiid, IID_IUnknown) || + IsEqualGUID(refiid, IID_IPin)) + { + OutputDebugStringW(L"COutputPin::QueryInterface IID_IPin\n"); + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsObject)) + { + if (m_hPin == INVALID_HANDLE_VALUE) + { + HRESULT hr = CreatePin(&m_MediaFormat); + if (FAILED(hr)) + return hr; + } + + OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsObject\n"); + *Output = (IKsObject*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsPin) || IsEqualGUID(refiid, IID_IKsPinEx)) + { + *Output = (IKsPinEx*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsPinPipe)) + { + *Output = (IKsPinPipe*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsAggregateControl)) + { + *Output = (IKsAggregateControl*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IQualityControl)) + { + *Output = (IQualityControl*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsPropertySet)) + { + if (m_hPin == INVALID_HANDLE_VALUE) + { + HRESULT hr = CreatePin(&m_MediaFormat); + if (FAILED(hr)) + return hr; + } + OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsPropertySet\n"); + *Output = (IKsPropertySet*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsControl)) + { + OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsControl\n"); + *Output = (IKsControl*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } +#if 0 + else if (IsEqualGUID(refiid, IID_IStreamBuilder)) + { + *Output = (IStreamBuilder*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } +#endif + else if (IsEqualGUID(refiid, IID_IKsPinFactory)) + { + OutputDebugStringW(L"COutputPin::QueryInterface IID_IKsPinFactory\n"); + *Output = (IKsPinFactory*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_ISpecifyPropertyPages)) + { + OutputDebugStringW(L"COutputPin::QueryInterface IID_ISpecifyPropertyPages\n"); + *Output = (ISpecifyPropertyPages*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IMediaSeeking)) + { + *Output = (IMediaSeeking*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IAMBufferNegotiation)) + { + *Output = (IAMBufferNegotiation*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IAMStreamConfig)) + { + *Output = (IAMStreamConfig*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IMemAllocatorNotifyCallbackTemp)) + { + *Output = (IMemAllocatorNotifyCallbackTemp*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"COutputPin::QueryInterface: NoInterface for %s PinId %u PinName %s\n", lpstr, m_PinId, m_PinName); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IAMBufferNegotiation interface +// +HRESULT +STDMETHODCALLTYPE +COutputPin::SuggestAllocatorProperties( + const ALLOCATOR_PROPERTIES *pprop) +{ + OutputDebugStringW(L"COutputPin::SuggestAllocatorProperties\n"); + + if (m_Pin) + { + // pin is already connected + return VFW_E_ALREADY_CONNECTED; + } + + CopyMemory(&m_Properties, pprop, sizeof(ALLOCATOR_PROPERTIES)); + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::GetAllocatorProperties( + ALLOCATOR_PROPERTIES *pprop) +{ + OutputDebugStringW(L"COutputPin::GetAllocatorProperties\n"); + + if (!m_Pin) + { + // you should call this method AFTER you connected + return E_UNEXPECTED; + } + + if (!m_KsAllocatorEx) + { + // something went wrong while creating the allocator + return E_FAIL; + } + + CopyMemory(pprop, &m_Properties, sizeof(ALLOCATOR_PROPERTIES)); + return NOERROR; +} + +//------------------------------------------------------------------- +// IAMStreamConfig interface +// +HRESULT +STDMETHODCALLTYPE +COutputPin::SetFormat( + AM_MEDIA_TYPE *pmt) +{ + OutputDebugStringW(L"COutputPin::SetFormat NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::GetFormat(AM_MEDIA_TYPE **ppmt) +{ + OutputDebugStringW(L"COutputPin::GetFormat NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::GetNumberOfCapabilities( + int *piCount, + int *piSize) +{ + OutputDebugStringW(L"COutputPin::GetNumberOfCapabilities NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::GetStreamCaps( + int iIndex, + AM_MEDIA_TYPE **ppmt, + BYTE *pSCC) +{ + OutputDebugStringW(L"COutputPin::GetStreamCaps NotImplemented\n"); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// IMemAllocatorNotifyCallbackTemp interface +// +HRESULT +STDMETHODCALLTYPE +COutputPin::NotifyRelease() +{ + OutputDebugStringW(L"COutputPin::NotifyRelease\n"); + + // notify thread of new available sample + SetEvent(m_hBufferAvailable); + + return NOERROR; +} + +//------------------------------------------------------------------- +// IMediaSeeking interface +// +HRESULT +STDMETHODCALLTYPE +COutputPin::GetCapabilities( + DWORD *pCapabilities) +{ + return m_FilterMediaSeeking->GetCapabilities(pCapabilities); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::CheckCapabilities( + DWORD *pCapabilities) +{ + return m_FilterMediaSeeking->CheckCapabilities(pCapabilities); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::IsFormatSupported( + const GUID *pFormat) +{ + return m_FilterMediaSeeking->IsFormatSupported(pFormat); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::QueryPreferredFormat( + GUID *pFormat) +{ + return m_FilterMediaSeeking->QueryPreferredFormat(pFormat); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::GetTimeFormat( + GUID *pFormat) +{ + return m_FilterMediaSeeking->GetTimeFormat(pFormat); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::IsUsingTimeFormat( + const GUID *pFormat) +{ + return m_FilterMediaSeeking->IsUsingTimeFormat(pFormat); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::SetTimeFormat( + const GUID *pFormat) +{ + return m_FilterMediaSeeking->SetTimeFormat(pFormat); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::GetDuration( + LONGLONG *pDuration) +{ + return m_FilterMediaSeeking->GetDuration(pDuration); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::GetStopPosition( + LONGLONG *pStop) +{ + return m_FilterMediaSeeking->GetStopPosition(pStop); +} + + +HRESULT +STDMETHODCALLTYPE +COutputPin::GetCurrentPosition( + LONGLONG *pCurrent) +{ + return m_FilterMediaSeeking->GetCurrentPosition(pCurrent); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::ConvertTimeFormat( + LONGLONG *pTarget, + const GUID *pTargetFormat, + LONGLONG Source, + const GUID *pSourceFormat) +{ + return m_FilterMediaSeeking->ConvertTimeFormat(pTarget, pTargetFormat, Source, pSourceFormat); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::SetPositions( + LONGLONG *pCurrent, + DWORD dwCurrentFlags, + LONGLONG *pStop, + DWORD dwStopFlags) +{ + return m_FilterMediaSeeking->SetPositions(pCurrent, dwCurrentFlags, pStop, dwStopFlags); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::GetPositions( + LONGLONG *pCurrent, + LONGLONG *pStop) +{ + return m_FilterMediaSeeking->GetPositions(pCurrent, pStop); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::GetAvailable( + LONGLONG *pEarliest, + LONGLONG *pLatest) +{ + return m_FilterMediaSeeking->GetAvailable(pEarliest, pLatest); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::SetRate( + double dRate) +{ + return m_FilterMediaSeeking->SetRate(dRate); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::GetRate( + double *pdRate) +{ + return m_FilterMediaSeeking->GetRate(pdRate); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::GetPreroll( + LONGLONG *pllPreroll) +{ + return m_FilterMediaSeeking->GetPreroll(pllPreroll); +} + +//------------------------------------------------------------------- +// IQualityControl interface +// +HRESULT +STDMETHODCALLTYPE +COutputPin::Notify( + IBaseFilter *pSelf, + Quality q) +{ + OutputDebugStringW(L"COutputPin::Notify NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::SetSink( + IQualityControl *piqc) +{ + OutputDebugStringW(L"COutputPin::SetSink NotImplemented\n"); + return E_NOTIMPL; +} + + +//------------------------------------------------------------------- +// IKsAggregateControl interface +// +HRESULT +STDMETHODCALLTYPE +COutputPin::KsAddAggregate( + IN REFGUID AggregateClass) +{ + OutputDebugStringW(L"COutputPin::KsAddAggregate NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsRemoveAggregate( + REFGUID AggregateClass) +{ + OutputDebugStringW(L"COutputPin::KsRemoveAggregate NotImplemented\n"); + return E_NOTIMPL; +} + + +//------------------------------------------------------------------- +// IKsPin +// + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsQueryMediums( + PKSMULTIPLE_ITEM* MediumList) +{ + HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle(); + return KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_MEDIUMS, (PVOID*)MediumList); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsQueryInterfaces( + PKSMULTIPLE_ITEM* InterfaceList) +{ + HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle(); + + return KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_INTERFACES, (PVOID*)InterfaceList); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsCreateSinkPinHandle( + KSPIN_INTERFACE& Interface, + KSPIN_MEDIUM& Medium) +{ + OutputDebugStringW(L"COutputPin::KsCreateSinkPinHandle NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsGetCurrentCommunication( + KSPIN_COMMUNICATION *Communication, + KSPIN_INTERFACE *Interface, + KSPIN_MEDIUM *Medium) +{ + if (Communication) + { + *Communication = m_Communication; + } + + if (Interface) + { + if (!m_hPin) + return VFW_E_NOT_CONNECTED; + + CopyMemory(Interface, &m_Interface, sizeof(KSPIN_INTERFACE)); + } + + if (Medium) + { + if (!m_hPin) + return VFW_E_NOT_CONNECTED; + + CopyMemory(Medium, &m_Medium, sizeof(KSPIN_MEDIUM)); + } + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsPropagateAcquire() +{ + KSPROPERTY Property; + KSSTATE State; + ULONG BytesReturned; + HRESULT hr; + + OutputDebugStringW(L"COutputPin::KsPropagateAcquire\n"); + + assert(m_hPin != INVALID_HANDLE_VALUE); + + Property.Set = KSPROPSETID_Connection; + Property.Id = KSPROPERTY_CONNECTION_STATE; + Property.Flags = KSPROPERTY_TYPE_SET; + + State = KSSTATE_ACQUIRE; + + hr = KsProperty(&Property, sizeof(KSPROPERTY), (LPVOID)&State, sizeof(KSSTATE), &BytesReturned); + + //TODO + //propagate to connected pin on the pipe + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsDeliver( + IMediaSample* Sample, + ULONG Flags) +{ + return E_FAIL; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsMediaSamplesCompleted(PKSSTREAM_SEGMENT StreamSegment) +{ + return NOERROR; +} + +IMemAllocator * +STDMETHODCALLTYPE +COutputPin::KsPeekAllocator(KSPEEKOPERATION Operation) +{ + if (Operation == KsPeekOperation_AddRef) + { + // add reference on allocator + m_MemAllocator->AddRef(); + } + + return m_MemAllocator; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsReceiveAllocator(IMemAllocator *MemAllocator) +{ + if (MemAllocator) + { + MemAllocator->AddRef(); + } + + if (m_MemAllocator) + { + m_MemAllocator->Release(); + } + + m_MemAllocator = MemAllocator; + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsRenegotiateAllocator() +{ + return E_FAIL; +} + +LONG +STDMETHODCALLTYPE +COutputPin::KsIncrementPendingIoCount() +{ + return InterlockedIncrement((volatile LONG*)&m_IoCount); +} + +LONG +STDMETHODCALLTYPE +COutputPin::KsDecrementPendingIoCount() +{ + return InterlockedDecrement((volatile LONG*)&m_IoCount); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsQualityNotify( + ULONG Proportion, + REFERENCE_TIME TimeDelta) +{ + OutputDebugStringW(L"COutputPin::KsQualityNotify NotImplemented\n"); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// IKsPinEx +// + +VOID +STDMETHODCALLTYPE +COutputPin::KsNotifyError( + IMediaSample* Sample, + HRESULT hr) +{ + OutputDebugStringW(L"COutputPin::KsNotifyError NotImplemented\n"); +} + + +//------------------------------------------------------------------- +// IKsPinPipe +// + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsGetPinFramingCache( + PKSALLOCATOR_FRAMING_EX *FramingEx, + PFRAMING_PROP FramingProp, + FRAMING_CACHE_OPS Option) +{ + if (Option > Framing_Cache_Write || Option < Framing_Cache_ReadLast) + { + // invalid argument + return E_INVALIDARG; + } + + // get framing properties + *FramingProp = m_FramingProp[Option]; + *FramingEx = m_FramingEx[Option]; + + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsSetPinFramingCache( + PKSALLOCATOR_FRAMING_EX FramingEx, + PFRAMING_PROP FramingProp, + FRAMING_CACHE_OPS Option) +{ + ULONG Index; + ULONG RefCount = 0; + + if (m_FramingEx[Option]) + { + for(Index = 1; Index < 4; Index++) + { + if (m_FramingEx[Index] == m_FramingEx[Option]) + RefCount++; + } + + if (RefCount == 1) + { + // existing framing is only used once + CoTaskMemFree(m_FramingEx[Option]); + } + } + + // store framing + m_FramingEx[Option] = FramingEx; + m_FramingProp[Option] = *FramingProp; + + return S_OK; +} + +IPin* +STDMETHODCALLTYPE +COutputPin::KsGetConnectedPin() +{ + return m_Pin; +} + +IKsAllocatorEx* +STDMETHODCALLTYPE +COutputPin::KsGetPipe( + KSPEEKOPERATION Operation) +{ + if (Operation == KsPeekOperation_AddRef) + { + if (m_KsAllocatorEx) + m_KsAllocatorEx->AddRef(); + } + return m_KsAllocatorEx; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsSetPipe( + IKsAllocatorEx *KsAllocator) +{ + if (KsAllocator) + KsAllocator->AddRef(); + + if (m_KsAllocatorEx) + m_KsAllocatorEx->Release(); + + m_KsAllocatorEx = KsAllocator; + return NOERROR; +} + +ULONG +STDMETHODCALLTYPE +COutputPin::KsGetPipeAllocatorFlag() +{ + return m_PipeAllocatorFlag; +} + + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsSetPipeAllocatorFlag( + ULONG Flag) +{ + m_PipeAllocatorFlag = Flag; + return NOERROR; +} + +GUID +STDMETHODCALLTYPE +COutputPin::KsGetPinBusCache() +{ + if (!m_bPinBusCacheInitialized) + { + CopyMemory(&m_PinBusCache, &m_Medium.Set, sizeof(GUID)); + m_bPinBusCacheInitialized = TRUE; + } + + return m_PinBusCache; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsSetPinBusCache( + GUID Bus) +{ + CopyMemory(&m_PinBusCache, &Bus, sizeof(GUID)); + return NOERROR; +} + +PWCHAR +STDMETHODCALLTYPE +COutputPin::KsGetPinName() +{ + return (PWCHAR)m_PinName; +} + + +PWCHAR +STDMETHODCALLTYPE +COutputPin::KsGetFilterName() +{ + return m_FilterName; +} + +//------------------------------------------------------------------- +// ISpecifyPropertyPages +// + +HRESULT +STDMETHODCALLTYPE +COutputPin::GetPages(CAUUID *pPages) +{ + OutputDebugStringW(L"COutputPin::GetPages NotImplemented\n"); + + if (!pPages) + return E_POINTER; + + pPages->cElems = 0; + pPages->pElems = NULL; + + return S_OK; +} + +//------------------------------------------------------------------- +// IKsPinFactory +// + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsPinFactory( + ULONG* PinFactory) +{ + OutputDebugStringW(L"COutputPin::KsPinFactory\n"); + *PinFactory = m_PinId; + return S_OK; +} + + +//------------------------------------------------------------------- +// IStreamBuilder +// + +HRESULT +STDMETHODCALLTYPE +COutputPin::Render( + IPin *ppinOut, + IGraphBuilder *pGraph) +{ + OutputDebugStringW(L"COutputPin::Render\n"); + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::Backout( + IPin *ppinOut, + IGraphBuilder *pGraph) +{ + OutputDebugStringW(L"COutputPin::Backout\n"); + return S_OK; +} +//------------------------------------------------------------------- +// IKsObject +// +HANDLE +STDMETHODCALLTYPE +COutputPin::KsGetObjectHandle() +{ + OutputDebugStringW(L"COutputPin::KsGetObjectHandle\n"); + assert(m_hPin != INVALID_HANDLE_VALUE); + return m_hPin; +} + +//------------------------------------------------------------------- +// IKsControl +// +HRESULT +STDMETHODCALLTYPE +COutputPin::KsProperty( + PKSPROPERTY Property, + ULONG PropertyLength, + LPVOID PropertyData, + ULONG DataLength, + ULONG* BytesReturned) +{ + HRESULT hr; + WCHAR Buffer[100]; + LPOLESTR pstr; + + assert(m_hPin != INVALID_HANDLE_VALUE); + + hr = KsSynchronousDeviceControl(m_hPin, IOCTL_KS_PROPERTY, (PVOID)Property, PropertyLength, (PVOID)PropertyData, DataLength, BytesReturned); + + StringFromCLSID(Property->Set, &pstr); + swprintf(Buffer, L"COutputPin::KsProperty Set %s Id %lu Flags %x hr %x\n", pstr, Property->Id, Property->Flags, hr); + OutputDebugStringW(Buffer); + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsMethod( + PKSMETHOD Method, + ULONG MethodLength, + LPVOID MethodData, + ULONG DataLength, + ULONG* BytesReturned) +{ + assert(m_hPin != INVALID_HANDLE_VALUE); + OutputDebugStringW(L"COutputPin::KsMethod\n"); + return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_METHOD, (PVOID)Method, MethodLength, (PVOID)MethodData, DataLength, BytesReturned); +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::KsEvent( + PKSEVENT Event, + ULONG EventLength, + LPVOID EventData, + ULONG DataLength, + ULONG* BytesReturned) +{ + assert(m_hPin != INVALID_HANDLE_VALUE); + + OutputDebugStringW(L"COutputPin::KsEvent\n"); + + if (EventLength) + return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_ENABLE_EVENT, (PVOID)Event, EventLength, (PVOID)EventData, DataLength, BytesReturned); + else + return KsSynchronousDeviceControl(m_hPin, IOCTL_KS_DISABLE_EVENT, (PVOID)Event, EventLength, NULL, 0, BytesReturned); +} + + +//------------------------------------------------------------------- +// IKsPropertySet +// +HRESULT +STDMETHODCALLTYPE +COutputPin::Set( + REFGUID guidPropSet, + DWORD dwPropID, + LPVOID pInstanceData, + DWORD cbInstanceData, + LPVOID pPropData, + DWORD cbPropData) +{ + ULONG BytesReturned; + + if (cbInstanceData) + { + PKSPROPERTY Property = (PKSPROPERTY)CoTaskMemAlloc(sizeof(KSPROPERTY) + cbInstanceData); + if (!Property) + return E_OUTOFMEMORY; + + Property->Set = guidPropSet; + Property->Id = dwPropID; + Property->Flags = KSPROPERTY_TYPE_SET; + + CopyMemory((Property+1), pInstanceData, cbInstanceData); + + HRESULT hr = KsProperty(Property, sizeof(KSPROPERTY) + cbInstanceData, pPropData, cbPropData, &BytesReturned); + CoTaskMemFree(Property); + return hr; + } + else + { + KSPROPERTY Property; + + Property.Set = guidPropSet; + Property.Id = dwPropID; + Property.Flags = KSPROPERTY_TYPE_SET; + + HRESULT hr = KsProperty(&Property, sizeof(KSPROPERTY), pPropData, cbPropData, &BytesReturned); + return hr; + } +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::Get( + REFGUID guidPropSet, + DWORD dwPropID, + LPVOID pInstanceData, + DWORD cbInstanceData, + LPVOID pPropData, + DWORD cbPropData, + DWORD *pcbReturned) +{ + ULONG BytesReturned; + + if (cbInstanceData) + { + PKSPROPERTY Property = (PKSPROPERTY)CoTaskMemAlloc(sizeof(KSPROPERTY) + cbInstanceData); + if (!Property) + return E_OUTOFMEMORY; + + Property->Set = guidPropSet; + Property->Id = dwPropID; + Property->Flags = KSPROPERTY_TYPE_GET; + + CopyMemory((Property+1), pInstanceData, cbInstanceData); + + HRESULT hr = KsProperty(Property, sizeof(KSPROPERTY) + cbInstanceData, pPropData, cbPropData, &BytesReturned); + CoTaskMemFree(Property); + return hr; + } + else + { + KSPROPERTY Property; + + Property.Set = guidPropSet; + Property.Id = dwPropID; + Property.Flags = KSPROPERTY_TYPE_GET; + + HRESULT hr = KsProperty(&Property, sizeof(KSPROPERTY), pPropData, cbPropData, &BytesReturned); + return hr; + } +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::QuerySupported( + REFGUID guidPropSet, + DWORD dwPropID, + DWORD *pTypeSupport) +{ + KSPROPERTY Property; + ULONG BytesReturned; + + OutputDebugStringW(L"COutputPin::QuerySupported\n"); + + Property.Set = guidPropSet; + Property.Id = dwPropID; + Property.Flags = KSPROPERTY_TYPE_SETSUPPORT; + + return KsProperty(&Property, sizeof(KSPROPERTY), pTypeSupport, sizeof(DWORD), &BytesReturned); +} + + +//------------------------------------------------------------------- +// IPin interface +// +HRESULT +STDMETHODCALLTYPE +COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) +{ + HRESULT hr; + ALLOCATOR_PROPERTIES Properties; + IMemAllocatorCallbackTemp *pMemCallback; + WCHAR Buffer[200]; + + OutputDebugStringW(L"COutputPin::Connect called\n"); + if (pmt) + { + hr = pReceivePin->QueryAccept(pmt); + if (FAILED(hr)) + return hr; + } + else + { + // query accept + hr = pReceivePin->QueryAccept(&m_MediaFormat); + if (FAILED(hr)) + return hr; + + pmt = &m_MediaFormat; + } + + // query for IMemInput interface + hr = pReceivePin->QueryInterface(IID_IMemInputPin, (void**)&m_MemInputPin); + if (FAILED(hr)) + { + OutputDebugStringW(L"COutputPin::Connect no IMemInputPin interface\n"); + DebugBreak(); + return hr; + } + + // get input pin allocator properties + ZeroMemory(&Properties, sizeof(ALLOCATOR_PROPERTIES)); + m_MemInputPin->GetAllocatorRequirements(&Properties); + + //FIXME determine allocator properties + Properties.cBuffers = 32; + Properties.cbBuffer = 2048 * 188; //2048 frames * MPEG2 TS Payload size + Properties.cbAlign = 4; + + // get input pin allocator +#if 0 + hr = m_MemInputPin->GetAllocator(&m_MemAllocator); + if (SUCCEEDED(hr)) + { + // set allocator properties + hr = m_MemAllocator->SetProperties(&Properties, &m_Properties); + if (FAILED(hr)) + m_MemAllocator->Release(); + } +#endif + + if (1) + { + hr = CKsAllocator_Constructor(NULL, IID_IMemAllocator, (void**)&m_MemAllocator); + if (FAILED(hr)) + return hr; + + // set allocator properties + hr = m_MemAllocator->SetProperties(&Properties, &m_Properties); + if (FAILED(hr)) + { + swprintf(Buffer, L"COutputPin::Connect IMemAllocator::SetProperties failed with hr %lx\n", hr); + OutputDebugStringW(Buffer); + m_MemAllocator->Release(); + m_MemInputPin->Release(); + return hr; + } + } + + // commit property changes + hr = m_MemAllocator->Commit(); + if (FAILED(hr)) + { + swprintf(Buffer, L"COutputPin::Connect IMemAllocator::Commit failed with hr %lx\n", hr); + OutputDebugStringW(Buffer); + m_MemAllocator->Release(); + m_MemInputPin->Release(); + return hr; + } + + // get callback interface + hr = m_MemAllocator->QueryInterface(IID_IMemAllocatorCallbackTemp, (void**)&pMemCallback); + if (FAILED(hr)) + { + swprintf(Buffer, L"COutputPin::Connect No IMemAllocatorCallbackTemp interface hr %lx\n", hr); + OutputDebugStringW(Buffer); + m_MemAllocator->Release(); + m_MemInputPin->Release(); + return hr; + } + + // set notification routine + hr = pMemCallback->SetNotify((IMemAllocatorNotifyCallbackTemp*)this); + + // release IMemAllocatorNotifyCallbackTemp interface + pMemCallback->Release(); + + if (FAILED(hr)) + { + swprintf(Buffer, L"COutputPin::Connect IMemAllocatorNotifyCallbackTemp::SetNotify failed hr %lx\n", hr); + OutputDebugStringW(Buffer); + m_MemAllocator->Release(); + m_MemInputPin->Release(); + return hr; + } + + // now set allocator + hr = m_MemInputPin->NotifyAllocator(m_MemAllocator, TRUE); + if (FAILED(hr)) + { + swprintf(Buffer, L"COutputPin::Connect IMemInputPin::NotifyAllocator failed with hr %lx\n", hr); + OutputDebugStringW(Buffer); + m_MemAllocator->Release(); + m_MemInputPin->Release(); + return hr; + } + + if (!m_hPin) + { + //FIXME create pin handle + assert(0); + } + + // receive connection; + hr = pReceivePin->ReceiveConnection((IPin*)this, pmt); + if (SUCCEEDED(hr)) + { + // increment reference count + pReceivePin->AddRef(); + m_Pin = pReceivePin; + OutputDebugStringW(L"COutputPin::Connect success\n"); + } + else + { + m_MemInputPin->Release(); + m_MemAllocator->Release(); + } + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt) +{ + return E_UNEXPECTED; +} +HRESULT +STDMETHODCALLTYPE +COutputPin::Disconnect( void) +{ + OutputDebugStringW(L"COutputPin::Disconnect\n"); + + if (!m_Pin) + { + // pin was not connected + return S_FALSE; + } + + //FIXME + //check if filter is active + + m_Pin->Release(); + m_Pin = NULL; + m_MemInputPin->Release(); + m_MemAllocator->Release(); + + OutputDebugStringW(L"COutputPin::Disconnect\n"); + return S_OK; +} +HRESULT +STDMETHODCALLTYPE +COutputPin::ConnectedTo(IPin **pPin) +{ + OutputDebugStringW(L"COutputPin::ConnectedTo\n"); + + if (!pPin) + return E_POINTER; + + if (m_Pin) + { + // increment reference count + m_Pin->AddRef(); + *pPin = m_Pin; + return S_OK; + } + + *pPin = NULL; + return VFW_E_NOT_CONNECTED; +} +HRESULT +STDMETHODCALLTYPE +COutputPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt) +{ + OutputDebugStringW(L"COutputPin::ConnectionMediaType called\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +COutputPin::QueryPinInfo(PIN_INFO *pInfo) +{ + wcscpy(pInfo->achName, m_PinName); + pInfo->dir = PINDIR_OUTPUT; + pInfo->pFilter = m_ParentFilter; + m_ParentFilter->AddRef(); + + return S_OK; +} +HRESULT +STDMETHODCALLTYPE +COutputPin::QueryDirection(PIN_DIRECTION *pPinDir) +{ + if (pPinDir) + { + *pPinDir = PINDIR_OUTPUT; + return S_OK; + } + + return E_POINTER; +} +HRESULT +STDMETHODCALLTYPE +COutputPin::QueryId(LPWSTR *Id) +{ + *Id = (LPWSTR)CoTaskMemAlloc((wcslen(m_PinName)+1)*sizeof(WCHAR)); + if (!*Id) + return E_OUTOFMEMORY; + + wcscpy(*Id, m_PinName); + return S_OK; +} +HRESULT +STDMETHODCALLTYPE +COutputPin::QueryAccept(const AM_MEDIA_TYPE *pmt) +{ + OutputDebugStringW(L"COutputPin::QueryAccept called\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +COutputPin::EnumMediaTypes(IEnumMediaTypes **ppEnum) +{ + HRESULT hr; + ULONG MediaTypeCount = 0, Index; + AM_MEDIA_TYPE * MediaTypes; + HANDLE hFilter; + + if (!m_KsObjectParent) + { + // no interface + return E_NOINTERFACE; + } + + // get parent filter handle + hFilter = m_KsObjectParent->KsGetObjectHandle(); + + // query media type count + hr = KsGetMediaTypeCount(hFilter, m_PinId, &MediaTypeCount); + if (FAILED(hr) || !MediaTypeCount) + { + return hr; + } + + // allocate media types + MediaTypes = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * MediaTypeCount); + if (!MediaTypes) + { + // not enough memory + return E_OUTOFMEMORY; + } + + // zero media types + ZeroMemory(MediaTypes, sizeof(AM_MEDIA_TYPE) * MediaTypeCount); + + for(Index = 0; Index < MediaTypeCount; Index++) + { + // get media type + hr = KsGetMediaType(Index, &MediaTypes[Index], hFilter, m_PinId); + if (FAILED(hr)) + { + // failed + CoTaskMemFree(MediaTypes); + return hr; + } + } + + return CEnumMediaTypes_fnConstructor(MediaTypeCount, MediaTypes, IID_IEnumMediaTypes, (void**)ppEnum); +} +HRESULT +STDMETHODCALLTYPE +COutputPin::QueryInternalConnections(IPin **apPin, ULONG *nPin) +{ + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +COutputPin::EndOfStream( void) +{ + /* should be called only on input pins */ + return E_UNEXPECTED; +} +HRESULT +STDMETHODCALLTYPE +COutputPin::BeginFlush( void) +{ + /* should be called only on input pins */ + return E_UNEXPECTED; +} +HRESULT +STDMETHODCALLTYPE +COutputPin::EndFlush( void) +{ + /* should be called only on input pins */ + return E_UNEXPECTED; +} +HRESULT +STDMETHODCALLTYPE +COutputPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) +{ + if (!m_Pin) + { + // we are not connected + return VFW_E_NOT_CONNECTED; + } + + return m_Pin->NewSegment(tStart, tStop, dRate); +} + +//------------------------------------------------------------------- +HRESULT +STDMETHODCALLTYPE +COutputPin::CheckFormat( + const AM_MEDIA_TYPE *pmt) +{ + PKSMULTIPLE_ITEM MultipleItem; + PKSDATAFORMAT DataFormat; + HRESULT hr; + + if (!pmt) + return E_POINTER; + + HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle(); + assert(hFilter != NULL); + + hr = KsGetMultiplePinFactoryItems(hFilter, m_PinId, KSPROPERTY_PIN_DATARANGES, (PVOID*)&MultipleItem); + if (FAILED(hr)) + return S_FALSE; + + DataFormat = (PKSDATAFORMAT)(MultipleItem + 1); + for(ULONG Index = 0; Index < MultipleItem->Count; Index++) + { + if (IsEqualGUID(pmt->majortype, DataFormat->MajorFormat) && + IsEqualGUID(pmt->subtype, DataFormat->SubFormat) && + IsEqualGUID(pmt->formattype, DataFormat->Specifier)) + { + // format is supported + CoTaskMemFree(MultipleItem); + return S_OK; + } + DataFormat = (PKSDATAFORMAT)((ULONG_PTR)DataFormat + DataFormat->FormatSize); + } + //format is not supported + CoTaskMemFree(MultipleItem); + return S_FALSE; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::CreatePin( + const AM_MEDIA_TYPE *pmt) +{ + PKSMULTIPLE_ITEM MediumList; + PKSMULTIPLE_ITEM InterfaceList; + PKSPIN_MEDIUM Medium; + PKSPIN_INTERFACE Interface; + IKsInterfaceHandler * InterfaceHandler; + HRESULT hr; + + // query for pin medium + hr = KsQueryMediums(&MediumList); + if (FAILED(hr)) + return hr; + + // query for pin interface + hr = KsQueryInterfaces(&InterfaceList); + if (FAILED(hr)) + { + // failed + CoTaskMemFree(MediumList); + return hr; + } + + if (MediumList->Count) + { + //use first available medium + Medium = (PKSPIN_MEDIUM)(MediumList + 1); + } + else + { + // default to standard medium + Medium = &StandardPinMedium; + } + + if (InterfaceList->Count) + { + //use first available interface + Interface = (PKSPIN_INTERFACE)(InterfaceList + 1); + } + else + { + // default to standard interface + Interface = &StandardPinInterface; + } + + if (m_Communication != KSPIN_COMMUNICATION_BRIDGE && m_Communication != KSPIN_COMMUNICATION_NONE) + { + // now create pin + hr = CreatePinHandle(Medium, Interface, pmt); + if (FAILED(hr)) + { + m_InterfaceHandler->Release(); + m_InterfaceHandler = InterfaceHandler; + } + + if (!m_InterfaceHandler) + { + // now load the IKsInterfaceHandler plugin + hr = CoCreateInstance(Interface->Set, NULL, CLSCTX_INPROC_SERVER, IID_IKsInterfaceHandler, (void**)&InterfaceHandler); + if (FAILED(hr)) + { + // failed to load interface handler plugin + CoTaskMemFree(MediumList); + CoTaskMemFree(InterfaceList); + + return hr; + } + + // now set the pin + hr = InterfaceHandler->KsSetPin((IKsPin*)this); + if (FAILED(hr)) + { + // failed to load interface handler plugin + InterfaceHandler->Release(); + CoTaskMemFree(MediumList); + CoTaskMemFree(InterfaceList); + return hr; + } + + // store interface handler + m_InterfaceHandler = InterfaceHandler; + } + } + else + { + WCHAR Buffer[100]; + swprintf(Buffer, L"COutputPin::CreatePin unexpected communication %u %s\n", m_Communication, m_PinName); + OutputDebugStringW(Buffer); + DebugBreak(); + hr = E_FAIL; + } + + // free medium / interface / dataformat + CoTaskMemFree(MediumList); + CoTaskMemFree(InterfaceList); + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin::CreatePinHandle( + PKSPIN_MEDIUM Medium, + PKSPIN_INTERFACE Interface, + const AM_MEDIA_TYPE *pmt) +{ + PKSPIN_CONNECT PinConnect; + PKSDATAFORMAT DataFormat; + ULONG Length; + HRESULT hr; + //KSALLOCATOR_FRAMING Framing; + //KSPROPERTY Property; + //ULONG BytesReturned; + + if (m_hPin != INVALID_HANDLE_VALUE) + { + // pin already exists + //CloseHandle(m_hPin); + //m_hPin = INVALID_HANDLE_VALUE; + return S_OK; + } + + + // calc format size + Length = sizeof(KSPIN_CONNECT) + sizeof(KSDATAFORMAT) + pmt->cbFormat; + + // allocate pin connect + PinConnect = (PKSPIN_CONNECT)CoTaskMemAlloc(Length); + if (!PinConnect) + { + // failed + return E_OUTOFMEMORY; + } + + // setup request + CopyMemory(&PinConnect->Interface, Interface, sizeof(KSPIN_INTERFACE)); + CopyMemory(&PinConnect->Medium, Medium, sizeof(KSPIN_MEDIUM)); + PinConnect->PinId = m_PinId; + PinConnect->PinToHandle = NULL; + PinConnect->Priority.PriorityClass = KSPRIORITY_NORMAL; + PinConnect->Priority.PrioritySubClass = KSPRIORITY_NORMAL; + + // get dataformat offset + DataFormat = (PKSDATAFORMAT)(PinConnect + 1); + + // copy data format + DataFormat->FormatSize = sizeof(KSDATAFORMAT) + pmt->cbFormat; + DataFormat->Flags = 0; + DataFormat->SampleSize = pmt->lSampleSize; + DataFormat->Reserved = 0; + CopyMemory(&DataFormat->MajorFormat, &pmt->majortype, sizeof(GUID)); + CopyMemory(&DataFormat->SubFormat, &pmt->subtype, sizeof(GUID)); + CopyMemory(&DataFormat->Specifier, &pmt->formattype, sizeof(GUID)); + + if (pmt->cbFormat) + { + // copy extended format + CopyMemory((DataFormat + 1), pmt->pbFormat, pmt->cbFormat); + } + + HANDLE hFilter = m_KsObjectParent->KsGetObjectHandle(); + assert(hFilter != NULL); + + // create pin + hr = KsCreatePin(hFilter, PinConnect, GENERIC_READ, &m_hPin); + + if (SUCCEEDED(hr)) + { + // store current interface / medium + CopyMemory(&m_Medium, Medium, sizeof(KSPIN_MEDIUM)); + CopyMemory(&m_Interface, Interface, sizeof(KSPIN_INTERFACE)); + CopyMemory(&m_MediaFormat, pmt, sizeof(AM_MEDIA_TYPE)); + + LPOLESTR pMajor, pSub, pFormat; + StringFromIID(m_MediaFormat.majortype, &pMajor); + StringFromIID(m_MediaFormat.subtype , &pSub); + StringFromIID(m_MediaFormat.formattype, &pFormat); + WCHAR Buffer[200]; + swprintf(Buffer, L"COutputPin::CreatePinHandle Major %s SubType %s Format %s pbFormat %p cbFormat %u\n", pMajor, pSub, pFormat, pmt->pbFormat, pmt->cbFormat); + CoTaskMemFree(pMajor); + CoTaskMemFree(pSub); + CoTaskMemFree(pFormat); + OutputDebugStringW(Buffer); + + if (pmt->cbFormat) + { + m_MediaFormat.pbFormat = (BYTE*)CoTaskMemAlloc(pmt->cbFormat); + if (!m_MediaFormat.pbFormat) + { + CoTaskMemFree(PinConnect); + m_MediaFormat.pbFormat = NULL; + m_MediaFormat.cbFormat = 0; + return E_OUTOFMEMORY; + } + CopyMemory(m_MediaFormat.pbFormat, pmt->pbFormat, pmt->cbFormat); + } +#if 0 + Property.Set = KSPROPSETID_Connection; + Property.Id = KSPROPERTY_CONNECTION_ALLOCATORFRAMING; + Property.Flags = KSPROPERTY_TYPE_GET; + + ZeroMemory(&Framing, sizeof(KSALLOCATOR_FRAMING)); + hr = KsProperty(&Property, sizeof(KSPROPERTY), (PVOID)&Framing, sizeof(KSALLOCATOR_FRAMING), &BytesReturned); + if (SUCCEEDED(hr)) + { + m_Properties.cbAlign = (Framing.FileAlignment + 1); + m_Properties.cbBuffer = Framing.FrameSize; + m_Properties.cbPrefix = 0; //FIXME + m_Properties.cBuffers = Framing.Frames; + } + hr = S_OK; +#endif + + if (FAILED(InitializeIOThread())) + { + OutputDebugStringW(L"COutputPin::CreatePinHandle failed to initialize i/o thread\n"); + DebugBreak(); + } + + //TODO + // connect pin pipes + + } + // free pin connect + CoTaskMemFree(PinConnect); + + return hr; +} + +HRESULT +WINAPI +COutputPin::IoProcessRoutine() +{ + IMediaSample *Sample; + LONG SampleCount; + HRESULT hr; + PKSSTREAM_SEGMENT StreamSegment; + HANDLE hEvent; + WCHAR Buffer[100]; + IMediaSample * Samples[1]; + + // first wait for the start event to signal + WaitForSingleObject(m_hStartEvent, INFINITE); + + assert(m_InterfaceHandler); + REFERENCE_TIME Start = 0; + REFERENCE_TIME Stop = 1; + do + { + if (m_StopInProgress) + { + // stop io thread + break; + } + + // get buffer + hr = m_MemAllocator->GetBuffer(&Sample, NULL, NULL, AM_GBF_NOWAIT); + + if (FAILED(hr)) + { + OutputDebugStringW(L"OutOfSamples\n"); + m_Pin->BeginFlush(); + WaitForSingleObject(m_hBufferAvailable, INFINITE); + m_Pin->EndFlush(); + OutputDebugStringW(L"After Wait OutOfSamples\n"); + // now retry again + continue; + } + + // fill buffer + SampleCount = 1; + Samples[0] = Sample; + + Sample->SetTime(NULL, NULL); + hr = m_InterfaceHandler->KsProcessMediaSamples(NULL, /* FIXME */ + Samples, + &SampleCount, + KsIoOperation_Read, + &StreamSegment); + if (FAILED(hr) || !StreamSegment) + { + swprintf(Buffer, L"COutputPin::IoProcessRoutine KsProcessMediaSamples FAILED PinName %s hr %lx\n", m_PinName, hr); + OutputDebugStringW(Buffer); + SetEvent(m_hStopEvent); + m_IoThreadStarted = false; + ExitThread(0); + } + + // get completion event + hEvent = StreamSegment->CompletionEvent; + + // wait for i/o completion + WaitForSingleObject(hEvent, INFINITE); + + // perform completion + m_InterfaceHandler->KsCompleteIo(StreamSegment); + + // close completion event + CloseHandle(hEvent); + + if (SUCCEEDED(hr)) + { + LONG Length = Sample->GetActualDataLength(); + Stop += Length; + // Sample->SetMediaTime(&Start, &Stop); + Start = Stop; + + // now deliver the sample + hr = m_MemInputPin->Receive(Sample); + + swprintf(Buffer, L"COutputPin::IoProcessRoutine PinName %s IMemInputPin::Receive hr %lx Sample %p m_MemAllocator %p\n", m_PinName, hr, Sample, m_MemAllocator); + OutputDebugStringW(Buffer); + if (FAILED(hr)) + DebugBreak(); + Sample = NULL; + } + }while(TRUE); + + // signal end of i/o thread + SetEvent(m_hStopEvent); + + m_IoThreadStarted = false; + + return NOERROR; +} + +DWORD +WINAPI +COutputPin_IoThreadStartup( + LPVOID lpParameter) +{ + COutputPin * Pin = (COutputPin*)lpParameter; + assert(Pin); + + return Pin->IoProcessRoutine(); +} + + +HRESULT +WINAPI +COutputPin::InitializeIOThread() +{ + HANDLE hThread; + + if (m_IoThreadStarted) + return NOERROR; + + if (!m_hStartEvent) + m_hStartEvent = CreateEventW(NULL, FALSE, FALSE, NULL); + else + ResetEvent(m_hStartEvent); + + if (!m_hStartEvent) + return E_OUTOFMEMORY; + + if (!m_hStopEvent) + m_hStopEvent = CreateEventW(NULL, FALSE, FALSE, NULL); + else + ResetEvent(m_hStopEvent); + + if (!m_hStopEvent) + return E_OUTOFMEMORY; + + if (!m_hBufferAvailable) + m_hBufferAvailable = CreateEventW(NULL, FALSE, FALSE, NULL); + else + ResetEvent(m_hBufferAvailable); + + if (!m_hBufferAvailable) + return E_OUTOFMEMORY; + + m_StopInProgress = false; + m_IoThreadStarted = true; + + // now create the startup thread + hThread = CreateThread(NULL, 0, COutputPin_IoThreadStartup, (LPVOID)this, 0, NULL); + if (!hThread) + return E_OUTOFMEMORY; + + + // close thread handle + CloseHandle(hThread); + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +COutputPin_SetState( + IPin * Pin, + KSSTATE State) +{ + HRESULT hr = S_OK; + KSPROPERTY Property; + KSSTATE CurState; + WCHAR Buffer[100]; + ULONG BytesReturned; + + COutputPin * pPin = (COutputPin*)Pin; + + + Property.Set = KSPROPSETID_Connection; + Property.Id = KSPROPERTY_CONNECTION_STATE; + Property.Flags = KSPROPERTY_TYPE_SET; + + + if (pPin->m_State < State) + { + if (pPin->m_State == KSSTATE_STOP) + { + CurState = KSSTATE_ACQUIRE; + hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned); + + swprintf(Buffer, L"COutputPin_SetState Setting State KSSTATE_ACQUIRE PinName %s hr %lx\n", pPin->m_PinName, hr); + OutputDebugStringW(Buffer); + if (FAILED(hr)) + return hr; + + pPin->m_State = CurState; + + if (pPin->m_State == State) + return hr; + } + if (pPin->m_State == KSSTATE_ACQUIRE) + { + CurState = KSSTATE_PAUSE; + hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned); + + swprintf(Buffer, L"COutputPin_SetState Setting State KSSTATE_PAUSE PinName %s hr %lx\n", pPin->m_PinName, hr); + OutputDebugStringW(Buffer); + if (FAILED(hr)) + return hr; + + pPin->m_State = CurState; + + if (pPin->m_State == State) + return hr; + } + + CurState = KSSTATE_RUN; + hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned); + + swprintf(Buffer, L"COutputPin_SetState Setting State KSSTATE_RUN PinName %s hr %lx\n", pPin->m_PinName, hr); + OutputDebugStringW(Buffer); + if (FAILED(hr)) + return hr; + + // signal start event + SetEvent(pPin->m_hStartEvent); + + + pPin->m_State = CurState; + return hr; + } + else + { + if (pPin->m_State == KSSTATE_RUN) + { + CurState = KSSTATE_PAUSE; + hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned); + + swprintf(Buffer, L"COutputPin_SetState Setting State KSSTATE_PAUSE PinName %u hr %lx\n", pPin->m_PinName, hr); + OutputDebugStringW(Buffer); + if (FAILED(hr)) + return hr; + + pPin->m_State = CurState; + + if (pPin->m_State == State) + return hr; + } + if (pPin->m_State == KSSTATE_PAUSE) + { + CurState = KSSTATE_ACQUIRE; + hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned); + + swprintf(Buffer, L"COutputPin_SetState Setting State KSSTATE_ACQUIRE PinName %u hr %lx\n", pPin->m_PinName, hr); + OutputDebugStringW(Buffer); + if (FAILED(hr)) + return hr; + + pPin->m_State = CurState; + + if (pPin->m_State == State) + return hr; + } + + // setting pending stop flag + pPin->m_StopInProgress = true; + + CurState = KSSTATE_STOP; + hr = pPin->KsProperty(&Property, sizeof(KSPROPERTY), &CurState, sizeof(KSSTATE), &BytesReturned); + + swprintf(Buffer, L"COutputPin_SetState Setting State KSSTATE_STOP PinName %s hr %lx\n", pPin->m_PinName, hr); + OutputDebugStringW(Buffer); + if (FAILED(hr)) + return hr; + + // release any waiting threads + SetEvent(pPin->m_hBufferAvailable); + + // wait until i/o thread is done + WaitForSingleObject(pPin->m_hStopEvent, INFINITE); + + pPin->m_State = CurState; + return hr; + } +} + + +HRESULT +WINAPI +COutputPin_Constructor( + IBaseFilter * ParentFilter, + LPCWSTR PinName, + ULONG PinId, + KSPIN_COMMUNICATION Communication, + REFIID riid, + LPVOID * ppv) +{ + COutputPin * handler = new COutputPin(ParentFilter, PinName, PinId, Communication); + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return S_OK; +} diff --git a/reactos/dll/directx/ksproxy/precomp.h b/reactos/dll/directx/ksproxy/precomp.h new file mode 100644 index 00000000000..c02b6adb6f4 --- /dev/null +++ b/reactos/dll/directx/ksproxy/precomp.h @@ -0,0 +1,203 @@ +#pragma once + +#define _FORCENAMELESSUNION +#define BUILDING_KS +#define _KSDDK_ +#include +//#include +#include +#define __STREAMS__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include + + +interface DECLSPEC_UUID("877E4351-6FEA-11D0-B863-00AA00A216A1") IKsClock; + +#undef INTERFACE +#define INTERFACE IKsClock + +DECLARE_INTERFACE_(IKsClock, IUnknown) +{ + STDMETHOD_(HANDLE, KsGetClockHandle)( + THIS + ) PURE; +}; + + +typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject); + +typedef struct { + const GUID* riid; + LPFNCREATEINSTANCE lpfnCI; +} INTERFACE_TABLE; + +/* classfactory.cpp */ + +IClassFactory * +CClassFactory_fnConstructor( + LPFNCREATEINSTANCE lpfnCI, + PLONG pcRefDll, + IID * riidInst); + +/* datatype.cpp */ +HRESULT +WINAPI +CKsDataTypeHandler_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv); + +/* interface.cpp */ +HRESULT +WINAPI +CKsInterfaceHandler_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv); + +/* clockforward.cpp */ +HRESULT +WINAPI +CKsClockForwarder_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv); + +/* qualityforward.cpp */ +HRESULT +WINAPI +CKsQualityForwarder_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv); + +/* cvpconfig.cpp */ +HRESULT +WINAPI +CVPConfig_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv); + +/* cvpvbiconfig.cpp */ +HRESULT +WINAPI +CVPVBIConfig_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv); + +/* basicaudio.cpp */ +HRESULT +WINAPI +CKsBasicAudio_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv); + +/* proxy.cpp */ +HRESULT +WINAPI +CKsProxy_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv); + +/* input_pin.cpp */ +HRESULT +WINAPI +CInputPin_Constructor( + IBaseFilter * ParentFilter, + LPCWSTR PinName, + HANDLE hFilter, + ULONG PinId, + KSPIN_COMMUNICATION Communication, + REFIID riid, + LPVOID * ppv); + +/* output_pin.cpp */ +HRESULT +WINAPI +COutputPin_Constructor( + IBaseFilter * ParentFilter, + LPCWSTR PinName, + ULONG PinId, + KSPIN_COMMUNICATION Communication, + REFIID riid, + LPVOID * ppv); + +HRESULT +STDMETHODCALLTYPE +COutputPin_SetState( + IPin * Pin, + KSSTATE State); + +/* enumpins.cpp */ +HRESULT +WINAPI +CEnumPins_fnConstructor( + std::vector Pins, + REFIID riid, + LPVOID * ppv); + +/* enum_mediatypes.cpp */ +HRESULT +WINAPI +CEnumMediaTypes_fnConstructor( + ULONG MediaTypeCount, + AM_MEDIA_TYPE * MediaTypes, + REFIID riid, + LPVOID * ppv); + +/* node.cpp */ +HRESULT +WINAPI +CKsNode_Constructor( + IUnknown * pUnkOuter, + HANDLE ParentHandle, + ULONG NodeId, + ACCESS_MASK DesiredAccess, + REFIID riid, + LPVOID * ppv); + +/* allocator.cpp */ +HRESULT +WINAPI +CKsAllocator_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv); + +/* mediasample.cpp */ +HRESULT +WINAPI +CMediaSample_Constructor( + IMemAllocator* Allocator, + BYTE* pBuffer, + ULONG BufferSize, + REFIID riid, + LPVOID * ppv); + + +extern const GUID IID_IKsObject; +extern const GUID IID_IKsPinEx; +extern const GUID IID_IKsAggregateControl; +extern const GUID IID_IKsPinPipe; +extern const GUID IID_IKsPinFactory; +extern const GUID IID_IKsAllocatorEx; +extern KSPIN_INTERFACE StandardPinInterface; +extern KSPIN_MEDIUM StandardPinMedium; diff --git a/reactos/dll/directx/ksproxy/proxy.cpp b/reactos/dll/directx/ksproxy/proxy.cpp new file mode 100644 index 00000000000..41d543fa70e --- /dev/null +++ b/reactos/dll/directx/ksproxy/proxy.cpp @@ -0,0 +1,2926 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy + * FILE: dll/directx/ksproxy/proxy.cpp + * PURPOSE: IKsProxy interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +#ifndef _MSC_VER +const GUID IID_IPersistPropertyBag = {0x37D84F60, 0x42CB, 0x11CE, {0x81, 0x35, 0x00, 0xAA, 0x00, 0x4B, 0xB8, 0x51}}; +const GUID GUID_NULL = {0x00000000L, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; +const GUID IID_ISpecifyPropertyPages = {0xB196B28B, 0xBAB4, 0x101A, {0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07}}; +const GUID IID_IPersistStream = {0x00000109, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; +const GUID KSPROPSETID_MediaSeeking = {0xEE904F0CL, 0xD09B, 0x11D0, {0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}}; +const GUID KSPROPSETID_Clock = {0xDF12A4C0L, 0xAC17, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; +const GUID KSEVENTSETID_Clock = {0x364D8E20L, 0x62C7, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; +const GUID KSPROPSETID_Stream = {0x65aaba60L, 0x98ae, 0x11cf, {0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}}; +const GUID IID_IPersist = {0x0000010c, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; +#endif + +const GUID IID_IBDA_DeviceControl = {0xFD0A5AF3, 0xB41D, 0x11d2, {0x9C, 0x95, 0x00, 0xC0, 0x4F, 0x79, 0x71, 0xE0}}; +const GUID IID_IKsAggregateControl = {0x7F40EAC0, 0x3947, 0x11D2, {0x87, 0x4E, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}}; +const GUID IID_IKsClockPropertySet = {0x5C5CBD84, 0xE755, 0x11D0, {0xAC, 0x18, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}}; +const GUID IID_IKsTopology = {0x28F54683, 0x06FD, 0x11D2, {0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}}; +const GUID IID_IKsClock = {0x877E4351, 0x6FEA, 0x11D0, {0xB8, 0x63, 0x00, 0xAA, 0x00, 0xA2, 0x16, 0xA1}}; +/* + Needs IKsClock, IKsNotifyEvent +*/ + +class CKsProxy : public IBaseFilter, + public IAMovieSetup, + public IPersistPropertyBag, + public IKsObject, + public IPersistStream, + public IAMDeviceRemoval, + public ISpecifyPropertyPages, + public IReferenceClock, + public IMediaSeeking, + public IKsPropertySet, + public IKsClock, + public IKsClockPropertySet, + public IAMFilterMiscFlags, + public IKsControl, + public IKsTopology, + public IKsAggregateControl + +{ +public: + typedef std::vectorProxyPluginVector; + typedef std::vector PinVector; + + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + // IBaseFilter methods + HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); + HRESULT STDMETHODCALLTYPE Stop( void); + HRESULT STDMETHODCALLTYPE Pause( void); + HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart); + HRESULT STDMETHODCALLTYPE GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *State); + HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock); + HRESULT STDMETHODCALLTYPE GetSyncSource(IReferenceClock **pClock); + HRESULT STDMETHODCALLTYPE EnumPins(IEnumPins **ppEnum); + HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR Id, IPin **ppPin); + HRESULT STDMETHODCALLTYPE QueryFilterInfo(FILTER_INFO *pInfo); + HRESULT STDMETHODCALLTYPE JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName); + HRESULT STDMETHODCALLTYPE QueryVendorInfo(LPWSTR *pVendorInfo); + + //IReferenceClock + HRESULT STDMETHODCALLTYPE GetTime(REFERENCE_TIME *pTime); + HRESULT STDMETHODCALLTYPE AdviseTime(REFERENCE_TIME baseTime, REFERENCE_TIME streamTime, HEVENT hEvent, DWORD_PTR *pdwAdviseCookie); + HRESULT STDMETHODCALLTYPE AdvisePeriodic(REFERENCE_TIME startTime, REFERENCE_TIME periodTime, HSEMAPHORE hSemaphore, DWORD_PTR *pdwAdviseCookie); + HRESULT STDMETHODCALLTYPE Unadvise(DWORD_PTR dwAdviseCookie); + + //IMediaSeeking + HRESULT STDMETHODCALLTYPE GetCapabilities(DWORD *pCapabilities); + HRESULT STDMETHODCALLTYPE CheckCapabilities(DWORD *pCapabilities); + HRESULT STDMETHODCALLTYPE IsFormatSupported(const GUID *pFormat); + HRESULT STDMETHODCALLTYPE QueryPreferredFormat(GUID *pFormat); + HRESULT STDMETHODCALLTYPE GetTimeFormat(GUID *pFormat); + HRESULT STDMETHODCALLTYPE IsUsingTimeFormat(const GUID *pFormat); + HRESULT STDMETHODCALLTYPE SetTimeFormat(const GUID *pFormat); + HRESULT STDMETHODCALLTYPE GetDuration(LONGLONG *pDuration); + HRESULT STDMETHODCALLTYPE GetStopPosition(LONGLONG *pStop); + HRESULT STDMETHODCALLTYPE GetCurrentPosition(LONGLONG *pCurrent); + HRESULT STDMETHODCALLTYPE ConvertTimeFormat(LONGLONG *pTarget, const GUID *pTargetFormat, LONGLONG Source, const GUID *pSourceFormat); + HRESULT STDMETHODCALLTYPE SetPositions(LONGLONG *pCurrent, DWORD dwCurrentFlags, LONGLONG *pStop, DWORD dwStopFlags); + HRESULT STDMETHODCALLTYPE GetPositions(LONGLONG *pCurrent, LONGLONG *pStop); + HRESULT STDMETHODCALLTYPE GetAvailable(LONGLONG *pEarliest, LONGLONG *pLatest); + HRESULT STDMETHODCALLTYPE SetRate(double dRate); + HRESULT STDMETHODCALLTYPE GetRate(double *pdRate); + HRESULT STDMETHODCALLTYPE GetPreroll(LONGLONG *pllPreroll); + + //IKsPropertySet + HRESULT STDMETHODCALLTYPE Set(REFGUID guidPropSet, DWORD dwPropID, LPVOID pInstanceData, DWORD cbInstanceData, LPVOID pPropData, DWORD cbPropData); + HRESULT STDMETHODCALLTYPE Get(REFGUID guidPropSet, DWORD dwPropID, LPVOID pInstanceData, DWORD cbInstanceData, LPVOID pPropData, DWORD cbPropData, DWORD *pcbReturned); + HRESULT STDMETHODCALLTYPE QuerySupported(REFGUID guidPropSet, DWORD dwPropID, DWORD *pTypeSupport); + + //IAMFilterMiscFlags + ULONG STDMETHODCALLTYPE GetMiscFlags( void); + + //IKsControl + HRESULT STDMETHODCALLTYPE KsProperty(PKSPROPERTY Property, ULONG PropertyLength, LPVOID PropertyData, ULONG DataLength, ULONG* BytesReturned); + HRESULT STDMETHODCALLTYPE KsMethod(PKSMETHOD Method, ULONG MethodLength, LPVOID MethodData, ULONG DataLength, ULONG* BytesReturned); + HRESULT STDMETHODCALLTYPE KsEvent(PKSEVENT Event, ULONG EventLength, LPVOID EventData, ULONG DataLength, ULONG* BytesReturned); + + //IKsTopolology + HRESULT STDMETHODCALLTYPE CreateNodeInstance(ULONG NodeId, ULONG Flags, ACCESS_MASK DesiredAccess, IUnknown* UnkOuter, REFGUID InterfaceId, LPVOID* Interface); + + //IKsAggregateControl + HRESULT STDMETHODCALLTYPE KsAddAggregate(IN REFGUID AggregateClass); + HRESULT STDMETHODCALLTYPE KsRemoveAggregate(REFGUID AggregateClass); + + //IKsClockPropertySet + HRESULT STDMETHODCALLTYPE KsGetTime(LONGLONG* Time); + HRESULT STDMETHODCALLTYPE KsSetTime(LONGLONG Time); + HRESULT STDMETHODCALLTYPE KsGetPhysicalTime(LONGLONG* Time); + HRESULT STDMETHODCALLTYPE KsSetPhysicalTime(LONGLONG Time); + HRESULT STDMETHODCALLTYPE KsGetCorrelatedTime(KSCORRELATED_TIME* CorrelatedTime); + HRESULT STDMETHODCALLTYPE KsSetCorrelatedTime(KSCORRELATED_TIME* CorrelatedTime); + HRESULT STDMETHODCALLTYPE KsGetCorrelatedPhysicalTime(KSCORRELATED_TIME* CorrelatedTime); + HRESULT STDMETHODCALLTYPE KsSetCorrelatedPhysicalTime(KSCORRELATED_TIME* CorrelatedTime); + HRESULT STDMETHODCALLTYPE KsGetResolution(KSRESOLUTION* Resolution); + HRESULT STDMETHODCALLTYPE KsGetState(KSSTATE* State); + + + //IAMovieSetup methods + HRESULT STDMETHODCALLTYPE Register( void); + HRESULT STDMETHODCALLTYPE Unregister( void); + + // IPersistPropertyBag methods + HRESULT STDMETHODCALLTYPE InitNew( void); + HRESULT STDMETHODCALLTYPE Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog); + HRESULT STDMETHODCALLTYPE Save(IPropertyBag *pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties); + + // IKsObject + HANDLE STDMETHODCALLTYPE KsGetObjectHandle(); + + // IKsClock + HANDLE STDMETHODCALLTYPE KsGetClockHandle(); + + //IAMDeviceRemoval + HRESULT STDMETHODCALLTYPE DeviceInfo(CLSID *pclsidInterfaceClass, LPWSTR *pwszSymbolicLink); + HRESULT STDMETHODCALLTYPE Reassociate(void); + HRESULT STDMETHODCALLTYPE Disassociate( void); + + //IPersistStream + HRESULT STDMETHODCALLTYPE IsDirty( void); + HRESULT STDMETHODCALLTYPE Load(IStream *pStm); + HRESULT STDMETHODCALLTYPE Save(IStream *pStm, BOOL fClearDirty); + HRESULT STDMETHODCALLTYPE GetSizeMax(ULARGE_INTEGER *pcbSize); + + // ISpecifyPropertyPages + HRESULT STDMETHODCALLTYPE GetPages(CAUUID *pPages); + + + CKsProxy() : m_Ref(0), m_pGraph(0), m_ReferenceClock((IReferenceClock*)this), m_FilterState(State_Stopped), m_hDevice(0), m_Plugins(), m_Pins(), m_DevicePath(0), m_hClock(0) {}; + ~CKsProxy() + { + if (m_hDevice) + CloseHandle(m_hDevice); + }; + + HRESULT STDMETHODCALLTYPE GetSupportedSets(LPGUID * pOutGuid, PULONG NumGuids); + HRESULT STDMETHODCALLTYPE LoadProxyPlugins(LPGUID pGuids, ULONG NumGuids); + HRESULT STDMETHODCALLTYPE GetNumberOfPins(PULONG NumPins); + HRESULT STDMETHODCALLTYPE GetPinInstanceCount(ULONG PinId, PKSPIN_CINSTANCES Instances); + HRESULT STDMETHODCALLTYPE GetPinDataflow(ULONG PinId, KSPIN_DATAFLOW * DataFlow); + HRESULT STDMETHODCALLTYPE GetPinName(ULONG PinId, KSPIN_DATAFLOW DataFlow, ULONG PinCount, LPWSTR * OutPinName); + HRESULT STDMETHODCALLTYPE GetPinCommunication(ULONG PinId, KSPIN_COMMUNICATION * Communication); + HRESULT STDMETHODCALLTYPE CreatePins(); + HRESULT STDMETHODCALLTYPE GetMediaSeekingFormats(PKSMULTIPLE_ITEM *FormatList); + HRESULT STDMETHODCALLTYPE CreateClockInstance(); + HRESULT STDMETHODCALLTYPE PerformClockProperty(ULONG PropertyId, ULONG PropertyFlags, PVOID OutputBuffer, ULONG OutputBufferSize); + HRESULT STDMETHODCALLTYPE SetPinState(KSSTATE State); + + +protected: + LONG m_Ref; + IFilterGraph *m_pGraph; + IReferenceClock * m_ReferenceClock; + FILTER_STATE m_FilterState; + HANDLE m_hDevice; + ProxyPluginVector m_Plugins; + PinVector m_Pins; + LPWSTR m_DevicePath; + CLSID m_DeviceInterfaceGUID; + HANDLE m_hClock; +}; + +HRESULT +STDMETHODCALLTYPE +CKsProxy::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + *Output = NULL; + + if (IsEqualGUID(refiid, IID_IUnknown) || + IsEqualGUID(refiid, IID_IBaseFilter)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IPersistPropertyBag)) + { + *Output = (IPersistPropertyBag*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IAMDeviceRemoval)) + { + *Output = (IAMDeviceRemoval*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IPersistStream)) + { + *Output = (IPersistStream*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IPersist)) + { + *Output = (IPersistStream*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsObject)) + { + *Output = (IKsObject*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsClock)) + { + *Output = (IKsClock*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IReferenceClock)) + { + if (!m_hClock) + { + HRESULT hr = CreateClockInstance(); + if (FAILED(hr)) + return hr; + } + + *Output = (IReferenceClock*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IMediaSeeking)) + { + *Output = (IMediaSeeking*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IAMFilterMiscFlags)) + { + *Output = (IAMFilterMiscFlags*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsControl)) + { + *Output = (IKsControl*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsPropertySet)) + { + *Output = (IKsPropertySet*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsTopology)) + { + *Output = (IKsTopology*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsAggregateControl)) + { + *Output = (IKsAggregateControl*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_IKsClockPropertySet)) + { + if (!m_hClock) + { + HRESULT hr = CreateClockInstance(); + if (FAILED(hr)) + return hr; + } + + *Output = (IKsClockPropertySet*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + else if (IsEqualGUID(refiid, IID_ISpecifyPropertyPages)) + { + *Output = (ISpecifyPropertyPages*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + for(ULONG Index = 0; Index < m_Plugins.size(); Index++) + { + if (m_Pins[Index]) + { + HRESULT hr = m_Plugins[Index]->QueryInterface(refiid, Output); + if (SUCCEEDED(hr)) + { + WCHAR Buffer[100]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CKsProxy::QueryInterface plugin %lu supports interface %s\n", Index, lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + return hr; + } + } + } + + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CKsProxy::QueryInterface: NoInterface for %s !!!\n", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// ISpecifyPropertyPages +// + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetPages(CAUUID *pPages) +{ + OutputDebugStringW(L"CKsProxy::GetPages NotImplemented\n"); + + if (!pPages) + return E_POINTER; + + pPages->cElems = 0; + pPages->pElems = NULL; + + return S_OK; +} + +//------------------------------------------------------------------- +// IKsClockPropertySet interface +// + +HRESULT +STDMETHODCALLTYPE +CKsProxy::CreateClockInstance() +{ + HRESULT hr; + HANDLE hPin = INVALID_HANDLE_VALUE; + ULONG Index; + PIN_DIRECTION PinDir; + IKsObject *pObject; + KSCLOCK_CREATE ClockCreate; + + // find output pin and handle + for(Index = 0; Index < m_Pins.size(); Index++) + { + //get pin + IPin * pin = m_Pins[Index]; + if (!pin) + continue; + + // get direction + hr = pin->QueryDirection(&PinDir); + if (FAILED(hr)) + continue; + + // query IKsObject interface + hr = pin->QueryInterface(IID_IKsObject, (void**)&pObject); + if (FAILED(hr)) + continue; + + + // get pin handle + hPin = pObject->KsGetObjectHandle(); + + //release IKsObject + pObject->Release(); + + if (hPin != INVALID_HANDLE_VALUE) + break; + } + + if (hPin == INVALID_HANDLE_VALUE) + { + // clock can only be instantiated on a pin handle + return E_NOTIMPL; + } + + if (m_hClock) + { + // release clock handle + CloseHandle(m_hClock); + } + + //setup clock create request + ClockCreate.CreateFlags = 0; + + // setup clock create request + hr = KsCreateClock(hPin, &ClockCreate, &m_hClock); // FIXME KsCreateClock returns NTSTATUS + if (SUCCEEDED(hr)) + { + // failed to create clock + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); + } + + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::PerformClockProperty( + ULONG PropertyId, + ULONG PropertyFlags, + PVOID OutputBuffer, + ULONG OutputBufferSize) +{ + KSPROPERTY Property; + HRESULT hr; + ULONG BytesReturned; + + if (!m_hClock) + { + // create clock + hr = CreateClockInstance(); + if (FAILED(hr)) + return hr; + } + + // setup request + Property.Set = KSPROPSETID_Clock; + Property.Id = PropertyId; + Property.Flags = PropertyFlags; + + hr = KsSynchronousDeviceControl(m_hClock, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)OutputBuffer, OutputBufferSize, &BytesReturned); + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::KsGetTime( + LONGLONG* Time) +{ + OutputDebugStringW(L"CKsProxy::KsGetTime\n"); + return PerformClockProperty(KSPROPERTY_CLOCK_TIME, KSPROPERTY_TYPE_GET, (PVOID)Time, sizeof(LONGLONG)); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::KsSetTime( + LONGLONG Time) +{ + OutputDebugStringW(L"CKsProxy::KsSetTime\n"); + return PerformClockProperty(KSPROPERTY_CLOCK_TIME, KSPROPERTY_TYPE_SET, (PVOID)&Time, sizeof(LONGLONG)); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::KsGetPhysicalTime( + LONGLONG* Time) +{ + OutputDebugStringW(L"CKsProxy::KsGetPhysicalTime\n"); + return PerformClockProperty(KSPROPERTY_CLOCK_PHYSICALTIME, KSPROPERTY_TYPE_GET, (PVOID)Time, sizeof(LONGLONG)); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::KsSetPhysicalTime( + LONGLONG Time) +{ + OutputDebugStringW(L"CKsProxy::KsSetPhysicalTime\n"); + return PerformClockProperty(KSPROPERTY_CLOCK_PHYSICALTIME, KSPROPERTY_TYPE_SET, (PVOID)&Time, sizeof(LONGLONG)); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::KsGetCorrelatedTime( + KSCORRELATED_TIME* CorrelatedTime) +{ + OutputDebugStringW(L"CKsProxy::KsGetCorrelatedTime\n"); + return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDTIME, KSPROPERTY_TYPE_GET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME)); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::KsSetCorrelatedTime( + KSCORRELATED_TIME* CorrelatedTime) +{ + OutputDebugStringW(L"CKsProxy::KsSetCorrelatedTime\n"); + return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDTIME, KSPROPERTY_TYPE_SET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME)); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::KsGetCorrelatedPhysicalTime( + KSCORRELATED_TIME* CorrelatedTime) +{ + OutputDebugStringW(L"CKsProxy::KsGetCorrelatedPhysicalTime\n"); + return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME, KSPROPERTY_TYPE_GET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME)); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::KsSetCorrelatedPhysicalTime( + KSCORRELATED_TIME* CorrelatedTime) +{ + OutputDebugStringW(L"CKsProxy::KsSetCorrelatedPhysicalTime\n"); + return PerformClockProperty(KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME, KSPROPERTY_TYPE_SET, (PVOID)CorrelatedTime, sizeof(KSCORRELATED_TIME)); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::KsGetResolution( + KSRESOLUTION* Resolution) +{ + OutputDebugStringW(L"CKsProxy::KsGetResolution\n"); + return PerformClockProperty(KSPROPERTY_CLOCK_RESOLUTION, KSPROPERTY_TYPE_GET, (PVOID)Resolution, sizeof(KSRESOLUTION)); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::KsGetState( + KSSTATE* State) +{ + OutputDebugStringW(L"CKsProxy::KsGetState\n"); + return PerformClockProperty(KSPROPERTY_CLOCK_STATE, KSPROPERTY_TYPE_GET, (PVOID)State, sizeof(KSSTATE)); +} + +//------------------------------------------------------------------- +// IReferenceClock interface +// +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetTime( + REFERENCE_TIME *pTime) +{ + HRESULT hr; + KSPROPERTY Property; + ULONG BytesReturned; + + OutputDebugStringW(L"CKsProxy::GetTime\n"); + + if (!pTime) + return E_POINTER; + + // + //FIXME locks + // + + if (!m_hClock) + { + // create clock + hr = CreateClockInstance(); + if (FAILED(hr)) + return hr; + } + + // setup request + Property.Set = KSPROPSETID_Clock; + Property.Id = KSPROPERTY_CLOCK_TIME; + Property.Flags = KSPROPERTY_TYPE_GET; + + // perform request + hr = KsSynchronousDeviceControl(m_hClock, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pTime, sizeof(REFERENCE_TIME), &BytesReturned); + + // TODO + // increment value + // + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::AdviseTime( + REFERENCE_TIME baseTime, + REFERENCE_TIME streamTime, + HEVENT hEvent, + DWORD_PTR *pdwAdviseCookie) +{ + HRESULT hr; + KSEVENT Property; + ULONG BytesReturned; + PKSEVENT_TIME_MARK Event; + + OutputDebugStringW(L"CKsProxy::AdviseTime\n"); + + // + //FIXME locks + // + + if (!pdwAdviseCookie) + return E_POINTER; + + if (!m_hClock) + { + // create clock + hr = CreateClockInstance(); + if (FAILED(hr)) + return hr; + } + + // allocate event entry + Event = (PKSEVENT_TIME_MARK)CoTaskMemAlloc(sizeof(KSEVENT_TIME_MARK)); + if (Event) + { + // setup request + Property.Set = KSEVENTSETID_Clock; + Property.Id = KSEVENT_CLOCK_POSITION_MARK; + Property.Flags = KSEVENT_TYPE_ENABLE; + + Event->EventData.NotificationType = KSEVENTF_EVENT_HANDLE; + Event->EventData.EventHandle.Event = (HANDLE)hEvent; + Event->EventData.Alignment.Alignment[0] = 0; + Event->EventData.Alignment.Alignment[1] = 0; + Event->MarkTime = baseTime + streamTime; + + // perform request + hr = KsSynchronousDeviceControl(m_hClock, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSEVENT), (PVOID)Event, sizeof(KSEVENT_TIME_MARK), &BytesReturned); + if (SUCCEEDED(hr)) + { + // store event handle + *pdwAdviseCookie = (DWORD_PTR)Event; + } + else + { + // failed to enable event + CoTaskMemFree(Event); + } + } + else + { + hr = E_OUTOFMEMORY; + } + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::AdvisePeriodic( + REFERENCE_TIME startTime, + REFERENCE_TIME periodTime, + HSEMAPHORE hSemaphore, + DWORD_PTR *pdwAdviseCookie) +{ + HRESULT hr; + KSEVENT Property; + ULONG BytesReturned; + PKSEVENT_TIME_INTERVAL Event; + + OutputDebugStringW(L"CKsProxy::AdvisePeriodic\n"); + + // + //FIXME locks + // + + if (!pdwAdviseCookie) + return E_POINTER; + + if (!m_hClock) + { + // create clock + hr = CreateClockInstance(); + if (FAILED(hr)) + return hr; + } + + // allocate event entry + Event = (PKSEVENT_TIME_INTERVAL)CoTaskMemAlloc(sizeof(KSEVENT_TIME_INTERVAL)); + if (Event) + { + // setup request + Property.Set = KSEVENTSETID_Clock; + Property.Id = KSEVENT_CLOCK_INTERVAL_MARK; + Property.Flags = KSEVENT_TYPE_ENABLE; + + Event->EventData.NotificationType = KSEVENTF_SEMAPHORE_HANDLE; + Event->EventData.SemaphoreHandle.Semaphore = (HANDLE)hSemaphore; + Event->EventData.SemaphoreHandle.Reserved = 0; + Event->EventData.SemaphoreHandle.Adjustment = 1; + Event->TimeBase = startTime; + Event->Interval = periodTime; + + // perform request + hr = KsSynchronousDeviceControl(m_hClock, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSEVENT), (PVOID)Event, sizeof(KSEVENT_TIME_INTERVAL), &BytesReturned); + if (SUCCEEDED(hr)) + { + // store event handle + *pdwAdviseCookie = (DWORD_PTR)Event; + } + else + { + // failed to enable event + CoTaskMemFree(Event); + } + } + else + { + hr = E_OUTOFMEMORY; + } + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::Unadvise( + DWORD_PTR dwAdviseCookie) +{ + HRESULT hr; + ULONG BytesReturned; + + OutputDebugStringW(L"CKsProxy::Unadvise\n"); + + if (m_hClock) + { + //lets disable the event + hr = KsSynchronousDeviceControl(m_hClock, IOCTL_KS_DISABLE_EVENT, (PVOID)dwAdviseCookie, sizeof(KSEVENTDATA), 0, 0, &BytesReturned); + if (SUCCEEDED(hr)) + { + // lets free event data + CoTaskMemFree((LPVOID)dwAdviseCookie); + } + } + else + { + // no clock available + hr = E_FAIL; + } + + return hr; +} + +//------------------------------------------------------------------- +// IMediaSeeking interface +// +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetCapabilities( + DWORD *pCapabilities) +{ + KSPROPERTY Property; + ULONG BytesReturned, Index; + HRESULT hr = S_OK; + DWORD TempCaps; + + Property.Set = KSPROPSETID_MediaSeeking; + Property.Id = KSPROPERTY_MEDIASEEKING_CAPABILITIES; + Property.Flags = KSPROPERTY_TYPE_GET; + + OutputDebugStringW(L"CKsProxy::GetCapabilities\n"); + + if (!pCapabilities) + return E_POINTER; + + + *pCapabilities = (KS_SEEKING_CanSeekAbsolute | KS_SEEKING_CanSeekForwards | KS_SEEKING_CanSeekBackwards | KS_SEEKING_CanGetCurrentPos | + KS_SEEKING_CanGetStopPos | KS_SEEKING_CanGetDuration | KS_SEEKING_CanPlayBackwards); + + KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&pCapabilities, sizeof(KS_SEEKING_CAPABILITIES), &BytesReturned); + // check if plugins support it + for(Index = 0; Index < m_Plugins.size(); Index++) + { + // get plugin + IUnknown * Plugin = m_Plugins[Index]; + + if (!Plugin) + continue; + + // query for IMediaSeeking interface + IMediaSeeking *pSeek = NULL; + hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek); + if (FAILED(hr)) + { + *pCapabilities = 0; + return hr; + } + + TempCaps = 0; + // set time format + hr = pSeek->GetCapabilities(&TempCaps); + if (SUCCEEDED(hr)) + { + // and with supported flags + *pCapabilities = (*pCapabilities & TempCaps); + } + // release IMediaSeeking interface + pSeek->Release(); + } + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::CheckCapabilities( + DWORD *pCapabilities) +{ + DWORD Capabilities; + HRESULT hr; + + OutputDebugStringW(L"CKsProxy::CheckCapabilities\n"); + + if (!pCapabilities) + return E_POINTER; + + if (!*pCapabilities) + return E_FAIL; + + hr = GetCapabilities(&Capabilities); + if (SUCCEEDED(hr)) + { + if ((Capabilities | *pCapabilities) == Capabilities) + { + // all present + return S_OK; + } + + Capabilities = (Capabilities & *pCapabilities); + if (Capabilities) + { + // not all present + *pCapabilities = Capabilities; + return S_FALSE; + } + // no capabilities are present + return E_FAIL; + } + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetMediaSeekingFormats( + PKSMULTIPLE_ITEM *FormatList) +{ + KSPROPERTY Property; + HRESULT hr; + ULONG BytesReturned; + + Property.Set = KSPROPSETID_MediaSeeking; + Property.Id = KSPROPERTY_MEDIASEEKING_FORMATS; + Property.Flags = KSPROPERTY_TYPE_GET; + + // query for format size list + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &BytesReturned); + + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_MORE_DATA)) + { + // allocate format list + *FormatList = (PKSMULTIPLE_ITEM)CoTaskMemAlloc(BytesReturned); + if (!*FormatList) + { + // not enough memory + return E_OUTOFMEMORY; + } + + // get format list + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)*FormatList, BytesReturned, &BytesReturned); + if (FAILED(hr)) + { + // failed to query format list + CoTaskMemFree(FormatList); + } + } + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::IsFormatSupported( + const GUID *pFormat) +{ + PKSMULTIPLE_ITEM FormatList; + LPGUID pGuid; + ULONG Index; + HRESULT hr = S_FALSE; + + WCHAR Buffer[100]; + LPOLESTR pstr; + StringFromCLSID(*pFormat, &pstr); + swprintf(Buffer, L"CKsProxy::IsFormatSupported %s\n",pstr); + OutputDebugStringW(Buffer); + + if (!pFormat) + return E_POINTER; + + // get media formats + hr = GetMediaSeekingFormats(&FormatList); + if (SUCCEEDED(hr)) + { + swprintf(Buffer, L"CKsProxy::IsFormatSupported NumFormat %lu\n",FormatList->Count); + OutputDebugStringW(Buffer); + + //iterate through format list + pGuid = (LPGUID)(FormatList + 1); + for(Index = 0; Index < FormatList->Count; Index++) + { + if (IsEqualGUID(*pGuid, *pFormat)) + { + CoTaskMemFree(FormatList); + return S_OK; + } + pGuid++; + } + // free format list + CoTaskMemFree(FormatList); + } + + // check if all plugins support it + for(Index = 0; Index < m_Plugins.size(); Index++) + { + // get plugin + IUnknown * Plugin = m_Plugins[Index]; + + if (!Plugin) + continue; + + // query for IMediaSeeking interface + IMediaSeeking *pSeek = NULL; + hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek); + if (FAILED(hr)) + { + // plugin does not support interface + hr = S_FALSE; + OutputDebugStringW(L"CKsProxy::IsFormatSupported plugin does not support IMediaSeeking interface\n"); + break; + } + + // query if it is supported + hr = pSeek->IsFormatSupported(pFormat); + // release interface + pSeek->Release(); + + if (FAILED(hr) || hr == S_FALSE) + break; + } + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::QueryPreferredFormat( + GUID *pFormat) +{ + PKSMULTIPLE_ITEM FormatList; + HRESULT hr; + ULONG Index; + + OutputDebugStringW(L"CKsProxy::QueryPreferredFormat\n"); + + if (!pFormat) + return E_POINTER; + + hr = GetMediaSeekingFormats(&FormatList); + if (SUCCEEDED(hr)) + { + if (FormatList->Count) + { + CopyMemory(pFormat, (FormatList + 1), sizeof(GUID)); + CoTaskMemFree(FormatList); + return S_OK; + } + CoTaskMemFree(FormatList); + } + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + { + // check if plugins support it + for(Index = 0; Index < m_Plugins.size(); Index++) + { + // get plugin + IUnknown * Plugin = m_Plugins[Index]; + + if (!Plugin) + continue; + + // query for IMediaSeeking interface + IMediaSeeking *pSeek = NULL; + hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek); + if (SUCCEEDED(hr)) + { + // get preferred time format + hr = pSeek->QueryPreferredFormat(pFormat); + // release IMediaSeeking interface + pSeek->Release(); + + if (hr != S_FALSE) + return hr; + } + } + hr = S_FALSE; + } + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetTimeFormat( + GUID *pFormat) +{ + KSPROPERTY Property; + ULONG BytesReturned, Index; + HRESULT hr; + + Property.Set = KSPROPSETID_MediaSeeking; + Property.Id = KSPROPERTY_MEDIASEEKING_TIMEFORMAT; + Property.Flags = KSPROPERTY_TYPE_GET; + + OutputDebugStringW(L"CKsProxy::GetTimeFormat\n"); + + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pFormat, sizeof(GUID), &BytesReturned); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + { + // check if plugins support it + for(Index = 0; Index < m_Plugins.size(); Index++) + { + hr = E_NOTIMPL; + // get plugin + IUnknown * Plugin = m_Plugins[Index]; + + if (!Plugin) + continue; + + // query for IMediaSeeking interface + IMediaSeeking *pSeek = NULL; + hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek); + if (SUCCEEDED(hr)) + { + // set time format + hr = pSeek->GetTimeFormat(pFormat); + // release IMediaSeeking interface + pSeek->Release(); + + if (hr != S_FALSE) + break; + } + } + } + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::IsUsingTimeFormat( + const GUID *pFormat) +{ + GUID Format; + + OutputDebugStringW(L"CKsProxy::IsUsingTimeFormat\n"); + + if (FAILED(QueryPreferredFormat(&Format))) + return S_FALSE; + + if (IsEqualGUID(Format, *pFormat)) + return S_OK; + else + return S_FALSE; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::SetTimeFormat( + const GUID *pFormat) +{ + KSPROPERTY Property; + ULONG BytesReturned, Index; + HRESULT hr; + + Property.Set = KSPROPSETID_MediaSeeking; + Property.Id = KSPROPERTY_MEDIASEEKING_TIMEFORMAT; + Property.Flags = KSPROPERTY_TYPE_SET; + + OutputDebugStringW(L"CKsProxy::SetTimeFormat\n"); + + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pFormat, sizeof(GUID), &BytesReturned); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + { + // check if plugins support it + for(Index = 0; Index < m_Plugins.size(); Index++) + { + hr = E_NOTIMPL; + // get plugin + IUnknown * Plugin = m_Plugins[Index]; + + if (!Plugin) + continue; + + // query for IMediaSeeking interface + IMediaSeeking *pSeek = NULL; + hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek); + if (FAILED(hr)) + { + //not supported + break; + } + // set time format + hr = pSeek->SetTimeFormat(pFormat); + // release IMediaSeeking interface + pSeek->Release(); + + if (FAILED(hr)) + break; + } + } + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetDuration( + LONGLONG *pDuration) +{ + KSPROPERTY Property; + ULONG BytesReturned, Index; + HRESULT hr; + + Property.Set = KSPROPSETID_MediaSeeking; + Property.Id = KSPROPERTY_MEDIASEEKING_DURATION; + Property.Flags = KSPROPERTY_TYPE_GET; + + OutputDebugStringW(L"CKsProxy::GetDuration\n"); + + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pDuration, sizeof(LONGLONG), &BytesReturned); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + { + // check if plugins support it + for(Index = 0; Index < m_Plugins.size(); Index++) + { + hr = E_NOTIMPL; + // get plugin + IUnknown * Plugin = m_Plugins[Index]; + + if (!Plugin) + continue; + + // query for IMediaSeeking interface + IMediaSeeking *pSeek = NULL; + hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek); + if (SUCCEEDED(hr)) + { + // get duration + hr = pSeek->GetStopPosition(pDuration); + // release IMediaSeeking interface + pSeek->Release(); + + if (hr != S_FALSE) // plugin implements it + break; + } + } + } + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetStopPosition( + LONGLONG *pStop) +{ + KSPROPERTY Property; + ULONG BytesReturned, Index; + HRESULT hr; + + Property.Set = KSPROPSETID_MediaSeeking; + Property.Id = KSPROPERTY_MEDIASEEKING_STOPPOSITION; + Property.Flags = KSPROPERTY_TYPE_GET; + + OutputDebugStringW(L"CKsProxy::GetStopPosition\n"); + + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pStop, sizeof(LONGLONG), &BytesReturned); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + { + // check if plugins support it + for(Index = 0; Index < m_Plugins.size(); Index++) + { + hr = E_NOTIMPL; + // get plugin + IUnknown * Plugin = m_Plugins[Index]; + + if (!Plugin) + continue; + + // query for IMediaSeeking interface + IMediaSeeking *pSeek = NULL; + hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek); + if (SUCCEEDED(hr)) + { + // get stop position + hr = pSeek->GetStopPosition(pStop); + // release IMediaSeeking interface + pSeek->Release(); + + if (hr != S_FALSE) // plugin implements it + break; + } + } + } + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetCurrentPosition( + LONGLONG *pCurrent) +{ + KSPROPERTY Property; + ULONG BytesReturned, Index; + HRESULT hr; + + Property.Set = KSPROPSETID_MediaSeeking; + Property.Id = KSPROPERTY_MEDIASEEKING_POSITION; + Property.Flags = KSPROPERTY_TYPE_GET; + + OutputDebugStringW(L"CKsProxy::GetCurrentPosition\n"); + + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pCurrent, sizeof(LONGLONG), &BytesReturned); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + { + // check if plugins support it + for(Index = 0; Index < m_Plugins.size(); Index++) + { + hr = E_NOTIMPL; + // get plugin + IUnknown * Plugin = m_Plugins[Index]; + + if (!Plugin) + continue; + + // query for IMediaSeeking interface + IMediaSeeking *pSeek = NULL; + hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek); + if (SUCCEEDED(hr)) + { + // get current position + hr = pSeek->GetCurrentPosition(pCurrent); + // release IMediaSeeking interface + pSeek->Release(); + + if (hr != S_FALSE) // plugin implements it + break; + } + } + } + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::ConvertTimeFormat( + LONGLONG *pTarget, + const GUID *pTargetFormat, + LONGLONG Source, + const GUID *pSourceFormat) +{ + KSP_TIMEFORMAT Property; + ULONG BytesReturned, Index; + GUID SourceFormat, TargetFormat; + HRESULT hr; + + Property.Property.Set = KSPROPSETID_MediaSeeking; + Property.Property.Id = KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT; + Property.Property.Flags = KSPROPERTY_TYPE_GET; + + OutputDebugStringW(L"CKsProxy::ConvertTimeFormat\n"); + + if (!pTargetFormat) + { + // get current format + hr = GetTimeFormat(&TargetFormat); + if (FAILED(hr)) + return hr; + + pTargetFormat = &TargetFormat; + } + + if (!pSourceFormat) + { + // get current format + hr = GetTimeFormat(&SourceFormat); + if (FAILED(hr)) + return hr; + + pSourceFormat = &SourceFormat; + } + + Property.SourceFormat = *pSourceFormat; + Property.TargetFormat = *pTargetFormat; + Property.Time = Source; + + + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_TIMEFORMAT), (PVOID)pTarget, sizeof(LONGLONG), &BytesReturned); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + { + //default error + hr = E_NOTIMPL; + + // check if plugins support it + for(Index = 0; Index < m_Plugins.size(); Index++) + { + // get plugin + IUnknown * Plugin = m_Plugins[Index]; + + if (!Plugin) + continue; + + // query for IMediaSeeking interface + IMediaSeeking *pSeek = NULL; + hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek); + if (SUCCEEDED(hr)) + { + // convert time format + hr = pSeek->ConvertTimeFormat(pTarget, pTargetFormat, Source, pSourceFormat); + // release IMediaSeeking interface + pSeek->Release(); + + if (hr != S_FALSE) // plugin implements it + break; + } + } + } + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::SetPositions( + LONGLONG *pCurrent, + DWORD dwCurrentFlags, + LONGLONG *pStop, + DWORD dwStopFlags) +{ + KSPROPERTY Property; + KSPROPERTY_POSITIONS Positions; + ULONG BytesReturned, Index; + HRESULT hr; + + Property.Set = KSPROPSETID_MediaSeeking; + Property.Id = KSPROPERTY_MEDIASEEKING_POSITIONS; + Property.Flags = KSPROPERTY_TYPE_SET; + + Positions.Current = *pCurrent; + Positions.CurrentFlags = (KS_SEEKING_FLAGS)dwCurrentFlags; + Positions.Stop = *pStop; + Positions.StopFlags = (KS_SEEKING_FLAGS)dwStopFlags; + + OutputDebugStringW(L"CKsProxy::SetPositions\n"); + + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&Positions, sizeof(KSPROPERTY_POSITIONS), &BytesReturned); + if (SUCCEEDED(hr)) + { + if (dwCurrentFlags & AM_SEEKING_ReturnTime) + { + // retrieve current position + hr = GetCurrentPosition(pCurrent); + } + + if (SUCCEEDED(hr)) + { + if (dwStopFlags & AM_SEEKING_ReturnTime) + { + // retrieve current position + hr = GetStopPosition(pStop); + } + } + return hr; + } + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + { + hr = E_NOTIMPL; + + // check if plugins support it + for(Index = 0; Index < m_Plugins.size(); Index++) + { + // get plugin + IUnknown * Plugin = m_Plugins[Index]; + + if (!Plugin) + continue; + + // query for IMediaSeeking interface + IMediaSeeking *pSeek = NULL; + hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek); + if (SUCCEEDED(hr)) + { + // set positions + hr = pSeek->SetPositions(pCurrent, dwCurrentFlags, pStop, dwStopFlags); + // release IMediaSeeking interface + pSeek->Release(); + + if (FAILED(hr)) + break; + } + } + } + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetPositions( + LONGLONG *pCurrent, + LONGLONG *pStop) +{ + HRESULT hr; + + OutputDebugStringW(L"CKsProxy::GetPositions\n"); + + hr = GetCurrentPosition(pCurrent); + if (SUCCEEDED(hr)) + hr = GetStopPosition(pStop); + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetAvailable( + LONGLONG *pEarliest, + LONGLONG *pLatest) +{ + KSPROPERTY Property; + KSPROPERTY_MEDIAAVAILABLE Media; + ULONG BytesReturned, Index; + HRESULT hr; + + Property.Set = KSPROPSETID_MediaSeeking; + Property.Id = KSPROPERTY_MEDIASEEKING_AVAILABLE; + Property.Flags = KSPROPERTY_TYPE_GET; + + OutputDebugStringW(L"CKsProxy::GetAvailable\n"); + + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&Media, sizeof(KSPROPERTY_MEDIAAVAILABLE), &BytesReturned); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + { + // check if plugins support it + for(Index = 0; Index < m_Plugins.size(); Index++) + { + hr = E_NOTIMPL; + // get plugin + IUnknown * Plugin = m_Plugins[Index]; + + if (!Plugin) + continue; + + // query for IMediaSeeking interface + IMediaSeeking *pSeek = NULL; + hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek); + if (SUCCEEDED(hr)) + { + // delegate call + hr = pSeek->GetAvailable(pEarliest, pLatest); + // release IMediaSeeking interface + pSeek->Release(); + + if (hr != S_FALSE) // plugin implements it + break; + } + } + } + else if (SUCCEEDED(hr)) + { + *pEarliest = Media.Earliest; + *pLatest = Media.Latest; + } + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::SetRate( + double dRate) +{ + OutputDebugStringW(L"CKsProxy::SetRate\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetRate( + double *pdRate) +{ + OutputDebugStringW(L"CKsProxy::GetRate\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetPreroll( + LONGLONG *pllPreroll) +{ + KSPROPERTY Property; + ULONG BytesReturned, Index; + HRESULT hr; + + Property.Set = KSPROPSETID_MediaSeeking; + Property.Id = KSPROPERTY_MEDIASEEKING_PREROLL; + Property.Flags = KSPROPERTY_TYPE_GET; + + OutputDebugStringW(L"CKsProxy::GetPreroll\n"); + + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pllPreroll, sizeof(LONGLONG), &BytesReturned); + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND) || hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND)) + { + // check if all plugins support it + for(Index = 0; Index < m_Plugins.size(); Index++) + { + // get plugin + IUnknown * Plugin = m_Plugins[Index]; + + if (!Plugin) + continue; + + // query for IMediaSeeking interface + IMediaSeeking *pSeek = NULL; + hr = Plugin->QueryInterface(IID_IMediaSeeking, (void**)&pSeek); + if (SUCCEEDED(hr)) + { + // get preroll + hr = pSeek->GetPreroll(pllPreroll); + // release IMediaSeeking interface + pSeek->Release(); + + if (hr != S_FALSE) // plugin implements it + break; + } + } + hr = E_NOTIMPL; + } + return hr; +} + +//------------------------------------------------------------------- +// IAMFilterMiscFlags interface +// + +ULONG +STDMETHODCALLTYPE +CKsProxy::GetMiscFlags() +{ + ULONG Index; + ULONG Flags = 0; + HRESULT hr; + PIN_DIRECTION PinDirection; + KSPIN_COMMUNICATION Communication; + WCHAR Buffer[100]; + + for(Index = 0; Index < m_Pins.size(); Index++) + { + // get current pin + IPin * pin = m_Pins[Index]; + // query direction + hr = pin->QueryDirection(&PinDirection); + if (SUCCEEDED(hr)) + { + if (PinDirection == PINDIR_INPUT) + { + if (SUCCEEDED(GetPinCommunication(Index, //FIXME verify PinId + &Communication))) + { + if (Communication != KSPIN_COMMUNICATION_NONE && Communication != KSPIN_COMMUNICATION_BRIDGE) + { + Flags |= AM_FILTER_MISC_FLAGS_IS_SOURCE; + } + } + } + } + } + + swprintf(Buffer, L"CKsProxy::GetMiscFlags stub Flags %x\n", Flags); + OutputDebugStringW(Buffer); + return Flags; +} + +//------------------------------------------------------------------- +// IKsControl +// +HRESULT +STDMETHODCALLTYPE +CKsProxy::KsProperty( + PKSPROPERTY Property, + ULONG PropertyLength, + LPVOID PropertyData, + ULONG DataLength, + ULONG* BytesReturned) +{ + assert(m_hDevice != 0); + OutputDebugStringW(L"CKsProxy::KsProperty\n"); + return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)Property, PropertyLength, (PVOID)PropertyData, DataLength, BytesReturned); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::KsMethod( + PKSMETHOD Method, + ULONG MethodLength, + LPVOID MethodData, + ULONG DataLength, + ULONG* BytesReturned) +{ + assert(m_hDevice != 0); + OutputDebugStringW(L"CKsProxy::KsMethod\n"); + return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_METHOD, (PVOID)Method, MethodLength, (PVOID)MethodData, DataLength, BytesReturned); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::KsEvent( + PKSEVENT Event, + ULONG EventLength, + LPVOID EventData, + ULONG DataLength, + ULONG* BytesReturned) +{ + assert(m_hDevice != 0); + OutputDebugStringW(L"CKsProxy::KsEvent\n"); + if (EventLength) + return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_ENABLE_EVENT, (PVOID)Event, EventLength, (PVOID)EventData, DataLength, BytesReturned); + else + return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_DISABLE_EVENT, (PVOID)Event, EventLength, NULL, 0, BytesReturned); +} + + +//------------------------------------------------------------------- +// IKsPropertySet +// +HRESULT +STDMETHODCALLTYPE +CKsProxy::Set( + REFGUID guidPropSet, + DWORD dwPropID, + LPVOID pInstanceData, + DWORD cbInstanceData, + LPVOID pPropData, + DWORD cbPropData) +{ + ULONG BytesReturned; + + OutputDebugStringW(L"CKsProxy::Set\n"); + + if (cbInstanceData) + { + PKSPROPERTY Property = (PKSPROPERTY)CoTaskMemAlloc(sizeof(KSPROPERTY) + cbInstanceData); + if (!Property) + return E_OUTOFMEMORY; + + Property->Set = guidPropSet; + Property->Id = dwPropID; + Property->Flags = KSPROPERTY_TYPE_SET; + + CopyMemory((Property+1), pInstanceData, cbInstanceData); + + HRESULT hr = KsProperty(Property, sizeof(KSPROPERTY) + cbInstanceData, pPropData, cbPropData, &BytesReturned); + CoTaskMemFree(Property); + return hr; + } + else + { + KSPROPERTY Property; + + Property.Set = guidPropSet; + Property.Id = dwPropID; + Property.Flags = KSPROPERTY_TYPE_SET; + + HRESULT hr = KsProperty(&Property, sizeof(KSPROPERTY), pPropData, cbPropData, &BytesReturned); + return hr; + } +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::Get( + REFGUID guidPropSet, + DWORD dwPropID, + LPVOID pInstanceData, + DWORD cbInstanceData, + LPVOID pPropData, + DWORD cbPropData, + DWORD *pcbReturned) +{ + ULONG BytesReturned; + + OutputDebugStringW(L"CKsProxy::Get\n"); + + if (cbInstanceData) + { + PKSPROPERTY Property = (PKSPROPERTY)CoTaskMemAlloc(sizeof(KSPROPERTY) + cbInstanceData); + if (!Property) + return E_OUTOFMEMORY; + + Property->Set = guidPropSet; + Property->Id = dwPropID; + Property->Flags = KSPROPERTY_TYPE_GET; + + CopyMemory((Property+1), pInstanceData, cbInstanceData); + + HRESULT hr = KsProperty(Property, sizeof(KSPROPERTY) + cbInstanceData, pPropData, cbPropData, &BytesReturned); + CoTaskMemFree(Property); + return hr; + } + else + { + KSPROPERTY Property; + + Property.Set = guidPropSet; + Property.Id = dwPropID; + Property.Flags = KSPROPERTY_TYPE_GET; + + HRESULT hr = KsProperty(&Property, sizeof(KSPROPERTY), pPropData, cbPropData, &BytesReturned); + return hr; + } +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::QuerySupported( + REFGUID guidPropSet, + DWORD dwPropID, + DWORD *pTypeSupport) +{ + KSPROPERTY Property; + ULONG BytesReturned; + + OutputDebugStringW(L"CKsProxy::QuerySupported\n"); + + Property.Set = guidPropSet; + Property.Id = dwPropID; + Property.Flags = KSPROPERTY_TYPE_SETSUPPORT; + + return KsProperty(&Property, sizeof(KSPROPERTY), pTypeSupport, sizeof(DWORD), &BytesReturned); +} + + +//------------------------------------------------------------------- +// IKsTopology interface +// +HRESULT +STDMETHODCALLTYPE +CKsProxy::CreateNodeInstance( + ULONG NodeId, + ULONG Flags, + ACCESS_MASK DesiredAccess, + IUnknown* UnkOuter, + REFGUID InterfaceId, + LPVOID* Interface) +{ + HRESULT hr; + + OutputDebugStringW(L"CKsProxy::CreateNodeInstance\n"); + + *Interface = NULL; + + if (IsEqualIID(IID_IUnknown, InterfaceId) || !UnkOuter) + { + hr = CKsNode_Constructor(UnkOuter, m_hDevice, NodeId, DesiredAccess, InterfaceId, Interface); + } + else + { + // interface not supported + hr = E_NOINTERFACE; + } + + return hr; +} + +//------------------------------------------------------------------- +// IKsAggregateControl interface +// +HRESULT +STDMETHODCALLTYPE +CKsProxy::KsAddAggregate( + IN REFGUID AggregateClass) +{ + OutputDebugStringW(L"CKsProxy::KsAddAggregate NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::KsRemoveAggregate( + REFGUID AggregateClass) +{ + OutputDebugStringW(L"CKsProxy::KsRemoveAggregate NotImplemented\n"); + return E_NOTIMPL; +} + + +//------------------------------------------------------------------- +// IPersistStream interface +// + +HRESULT +STDMETHODCALLTYPE +CKsProxy::IsDirty() +{ + OutputDebugStringW(L"CKsProxy::IsDirty Notimplemented\n"); + DebugBreak(); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::Load( + IStream *pStm) +{ + HRESULT hr; + WCHAR Buffer[1000]; + AM_MEDIA_TYPE MediaType; + ULONG BytesReturned; + LONG Length; + + ULONG PinId; + LPOLESTR pMajor, pSub, pFormat; + + OutputDebugStringW(L"CKsProxy::Load\n"); + +#if 0 + ULONG Version = ReadInt(pStm, hr); + if (Version != 1) + return E_FAIL; +#endif + + hr = pStm->Read(&Length, sizeof(ULONG), &BytesReturned); + swprintf(Buffer, L"Length hr %x hr length %lu\n", hr, Length); + OutputDebugStringW(Buffer); + + do + { + hr = pStm->Read(&PinId, sizeof(ULONG), &BytesReturned); + swprintf(Buffer, L"Read: hr %08x PinId %lx BytesReturned %lu\n", hr, PinId, BytesReturned); + OutputDebugStringW(Buffer); + + if (FAILED(hr) || !BytesReturned) + break; + + Length -= BytesReturned; + + hr = pStm->Read(&MediaType, sizeof(AM_MEDIA_TYPE), &BytesReturned); + if (FAILED(hr) || BytesReturned != sizeof(AM_MEDIA_TYPE)) + { + swprintf(Buffer, L"Read failed with %lx\n", hr); + OutputDebugStringW(Buffer); + break; + } + + + StringFromIID(MediaType.majortype, &pMajor); + StringFromIID(MediaType.subtype , &pSub); + StringFromIID(MediaType.formattype, &pFormat); + + swprintf(Buffer, L"BytesReturned %lu majortype %s subtype %s bFixedSizeSamples %u bTemporalCompression %u lSampleSize %u formattype %s, pUnk %p cbFormat %u pbFormat %p\n", BytesReturned, pMajor, pSub, MediaType.bFixedSizeSamples, MediaType.bTemporalCompression, MediaType.lSampleSize, pFormat, MediaType.pUnk, MediaType.cbFormat, MediaType.pbFormat); + OutputDebugStringW(Buffer); + + Length -= BytesReturned; + + + if (MediaType.cbFormat) + { + MediaType.pbFormat = (BYTE*)CoTaskMemAlloc(MediaType.cbFormat); + if (!MediaType.pbFormat) + return E_OUTOFMEMORY; + + hr = pStm->Read(&MediaType.pbFormat, sizeof(MediaType.cbFormat), &BytesReturned); + if (FAILED(hr)) + { + swprintf(Buffer, L"ReadFormat failed with %lx\n", hr); + OutputDebugStringW(Buffer); + break; + } + Length -= BytesReturned; + } + + }while(Length > 0); + + DebugBreak(); + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::Save( + IStream *pStm, + BOOL fClearDirty) +{ + OutputDebugStringW(L"CKsProxy::Save Notimplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetSizeMax( + ULARGE_INTEGER *pcbSize) +{ + OutputDebugStringW(L"CKsProxy::GetSizeMax Notimplemented\n"); + DebugBreak(); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// IAMDeviceRemoval interface +// + +HRESULT +STDMETHODCALLTYPE +CKsProxy::DeviceInfo(CLSID *pclsidInterfaceClass, LPWSTR *pwszSymbolicLink) +{ + + OutputDebugStringW(L"CKsProxy::DeviceInfo\n"); + + if (!m_DevicePath) + { + // object not initialized + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND); + } + + // copy device interface guid + CopyMemory(pclsidInterfaceClass, &m_DeviceInterfaceGUID, sizeof(GUID)); + + if (pwszSymbolicLink) + { + *pwszSymbolicLink = (LPWSTR)CoTaskMemAlloc((wcslen(m_DevicePath)+1) * sizeof(WCHAR)); + if (!*pwszSymbolicLink) + return E_OUTOFMEMORY; + + wcscpy(*pwszSymbolicLink, m_DevicePath); + } + return S_OK; +} +HRESULT +STDMETHODCALLTYPE +CKsProxy::Reassociate(void) +{ + OutputDebugStringW(L"CKsProxy::Reassociate\n"); + + if (!m_DevicePath || m_hDevice) + { + // file path not available + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_FILE_NOT_FOUND); + } + + m_hDevice = CreateFileW(m_DevicePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); + if (!m_hDevice) + { + // failed to open device + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); + } + + // success + return NOERROR; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::Disassociate(void) +{ + OutputDebugStringW(L"CKsProxy::Disassociate\n"); + + if (!m_hDevice) + return E_HANDLE; + + CloseHandle(m_hDevice); + m_hDevice = NULL; + return NOERROR; +} + +//------------------------------------------------------------------- +// IKsClock interface +// + +HANDLE +STDMETHODCALLTYPE +CKsProxy::KsGetClockHandle() +{ + OutputDebugStringW(L"CKsProxy::KsGetClockHandle\n"); + return m_hClock; +} + + +//------------------------------------------------------------------- +// IKsObject interface +// + +HANDLE +STDMETHODCALLTYPE +CKsProxy::KsGetObjectHandle() +{ + OutputDebugStringW(L"CKsProxy::KsGetObjectHandle\n"); + return m_hDevice; +} + +//------------------------------------------------------------------- +// IPersistPropertyBag interface +// +HRESULT +STDMETHODCALLTYPE +CKsProxy::InitNew( void) +{ + OutputDebugStringW(L"CKsProxy::InitNew\n"); + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetSupportedSets( + LPGUID * pOutGuid, + PULONG NumGuids) +{ + KSPROPERTY Property; + LPGUID pGuid; + ULONG NumProperty = 0; + ULONG NumMethods = 0; + ULONG NumEvents = 0; + ULONG Length; + ULONG BytesReturned; + HRESULT hr; + + Property.Set = GUID_NULL; + Property.Id = 0; + Property.Flags = KSPROPERTY_TYPE_SETSUPPORT; + + KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumProperty); + KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_METHOD, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumMethods); + KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &NumEvents); + + Length = NumProperty + NumMethods + NumEvents; + + // allocate guid buffer + pGuid = (LPGUID)CoTaskMemAlloc(Length); + if (!pGuid) + { + // failed + return E_OUTOFMEMORY; + } + + NumProperty /= sizeof(GUID); + NumMethods /= sizeof(GUID); + NumEvents /= sizeof(GUID); + + // get all properties + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)pGuid, Length, &BytesReturned); + if (FAILED(hr)) + { + CoTaskMemFree(pGuid); + return E_FAIL; + } + Length -= BytesReturned; + + // get all methods + if (Length) + { + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_METHOD, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&pGuid[NumProperty], Length, &BytesReturned); + if (FAILED(hr)) + { + CoTaskMemFree(pGuid); + return E_FAIL; + } + Length -= BytesReturned; + } + + // get all events + if (Length) + { + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_ENABLE_EVENT, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&pGuid[NumProperty+NumMethods], Length, &BytesReturned); + if (FAILED(hr)) + { + CoTaskMemFree(pGuid); + return E_FAIL; + } + Length -= BytesReturned; + } + +#ifdef KSPROXY_TRACE + WCHAR Buffer[200]; + swprintf(Buffer, L"NumProperty %lu NumMethods %lu NumEvents %lu\n", NumProperty, NumMethods, NumEvents); + OutputDebugStringW(Buffer); +#endif + + *pOutGuid = pGuid; + *NumGuids = NumProperty+NumEvents+NumMethods; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::LoadProxyPlugins( + LPGUID pGuids, + ULONG NumGuids) +{ + ULONG Index; + LPOLESTR pStr; + HKEY hKey, hSubKey; + HRESULT hr; + IUnknown * pUnknown; + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\MediaInterfaces", 0, KEY_READ, &hKey) != ERROR_SUCCESS) + { + OutputDebugStringW(L"CKsProxy::LoadProxyPlugins failed to open MediaInterfaces key\n"); + return E_FAIL; + } + + // enumerate all sets + for(Index = 0; Index < NumGuids; Index++) + { + // convert to string + hr = StringFromCLSID(pGuids[Index], &pStr); + if (FAILED(hr)) + return E_FAIL; + + // now try open class key + if (RegOpenKeyExW(hKey, pStr, 0, KEY_READ, &hSubKey) != ERROR_SUCCESS) + { + // no plugin for that set exists + CoTaskMemFree(pStr); + continue; + } + + // try load plugin + hr = CoCreateInstance(pGuids[Index], (IBaseFilter*)this, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pUnknown); + if (SUCCEEDED(hr)) + { + // store plugin + m_Plugins.push_back(pUnknown); + } + // close key + RegCloseKey(hSubKey); + } + + // close media interfaces key + RegCloseKey(hKey); + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetNumberOfPins( + PULONG NumPins) +{ + KSPROPERTY Property; + ULONG BytesReturned; + + // setup request + Property.Set = KSPROPSETID_Pin; + Property.Id = KSPROPERTY_PIN_CTYPES; + Property.Flags = KSPROPERTY_TYPE_GET; + + return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)NumPins, sizeof(ULONG), &BytesReturned); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetPinInstanceCount( + ULONG PinId, + PKSPIN_CINSTANCES Instances) +{ + KSP_PIN Property; + ULONG BytesReturned; + + // setup request + Property.Property.Set = KSPROPSETID_Pin; + Property.Property.Id = KSPROPERTY_PIN_CINSTANCES; + Property.Property.Flags = KSPROPERTY_TYPE_GET; + Property.PinId = PinId; + Property.Reserved = 0; + + return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), (PVOID)Instances, sizeof(KSPIN_CINSTANCES), &BytesReturned); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetPinCommunication( + ULONG PinId, + KSPIN_COMMUNICATION * Communication) +{ + KSP_PIN Property; + ULONG BytesReturned; + + // setup request + Property.Property.Set = KSPROPSETID_Pin; + Property.Property.Id = KSPROPERTY_PIN_COMMUNICATION; + Property.Property.Flags = KSPROPERTY_TYPE_GET; + Property.PinId = PinId; + Property.Reserved = 0; + + return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), (PVOID)Communication, sizeof(KSPIN_COMMUNICATION), &BytesReturned); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetPinDataflow( + ULONG PinId, + KSPIN_DATAFLOW * DataFlow) +{ + KSP_PIN Property; + ULONG BytesReturned; + + // setup request + Property.Property.Set = KSPROPSETID_Pin; + Property.Property.Id = KSPROPERTY_PIN_DATAFLOW; + Property.Property.Flags = KSPROPERTY_TYPE_GET; + Property.PinId = PinId; + Property.Reserved = 0; + + return KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), (PVOID)DataFlow, sizeof(KSPIN_DATAFLOW), &BytesReturned); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetPinName( + ULONG PinId, + KSPIN_DATAFLOW DataFlow, + ULONG PinCount, + LPWSTR * OutPinName) +{ + KSP_PIN Property; + LPWSTR PinName; + ULONG BytesReturned; + HRESULT hr; + WCHAR Buffer[100]; + + // setup request + Property.Property.Set = KSPROPSETID_Pin; + Property.Property.Id = KSPROPERTY_PIN_NAME; + Property.Property.Flags = KSPROPERTY_TYPE_GET; + Property.PinId = PinId; + Property.Reserved = 0; + + // #1 try get it from pin directly + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), NULL, 0, &BytesReturned); + + if (hr == MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_MORE_DATA)) + { + // allocate pin name + PinName = (LPWSTR)CoTaskMemAlloc(BytesReturned); + if (!PinName) + return E_OUTOFMEMORY; + + // retry with allocated buffer + hr = KsSynchronousDeviceControl(m_hDevice, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSP_PIN), PinName, BytesReturned, &BytesReturned); + if (SUCCEEDED(hr)) + { + *OutPinName = PinName; + return hr; + } + + //free buffer + CoTaskMemFree(PinName); + } + + // + // TODO: retrieve pin name from topology node + // + + if (DataFlow == KSPIN_DATAFLOW_IN) + { + swprintf(Buffer, L"Input%lu", PinCount); + } + else + { + swprintf(Buffer, L"Output%lu", PinCount); + } + + // allocate pin name + PinName = (LPWSTR)CoTaskMemAlloc((wcslen(Buffer)+1) * sizeof(WCHAR)); + if (!PinName) + return E_OUTOFMEMORY; + + // copy pin name + wcscpy(PinName, Buffer); + + // store result + *OutPinName = PinName; + // done + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::CreatePins() +{ + ULONG NumPins, Index; + KSPIN_CINSTANCES Instances; + KSPIN_DATAFLOW DataFlow; + KSPIN_COMMUNICATION Communication; + HRESULT hr; + WCHAR Buffer[100]; + LPWSTR PinName; + IPin * pPin; + ULONG InputPin = 0; + ULONG OutputPin = 0; + + // get number of pins + hr = GetNumberOfPins(&NumPins); + if (FAILED(hr)) + return hr; + + for(Index = 0; Index < NumPins; Index++) + { + // query current instance count + hr = GetPinInstanceCount(Index, &Instances); + if (FAILED(hr)) + continue; + + // query pin communication; + hr = GetPinCommunication(Index, &Communication); + if (FAILED(hr)) + continue; + + if (Instances.CurrentCount == Instances.PossibleCount) + { + // already maximum reached for this pin + continue; + } + + // get direction of pin + hr = GetPinDataflow(Index, &DataFlow); + if (FAILED(hr)) + continue; + + if (DataFlow == KSPIN_DATAFLOW_IN) + hr = GetPinName(Index, DataFlow, InputPin, &PinName); + else + hr = GetPinName(Index, DataFlow, OutputPin, &PinName); + + if (FAILED(hr)) + continue; + + // construct the pins + if (DataFlow == KSPIN_DATAFLOW_IN) + { + hr = CInputPin_Constructor((IBaseFilter*)this, PinName, m_hDevice, Index, Communication, IID_IPin, (void**)&pPin); + if (FAILED(hr)) + { + CoTaskMemFree(PinName); + continue; + } + InputPin++; + } + else + { + hr = COutputPin_Constructor((IBaseFilter*)this, PinName, Index, Communication, IID_IPin, (void**)&pPin); + if (FAILED(hr)) + { + CoTaskMemFree(PinName); + continue; + } + OutputPin++; + } + + // store pins + m_Pins.push_back(pPin); + + swprintf(Buffer, L"Index %lu DataFlow %lu Name %s\n", Index, DataFlow, PinName); + OutputDebugStringW(Buffer); + } + + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog) +{ + HRESULT hr; + WCHAR Buffer[100]; + VARIANT varName; + LPGUID pGuid; + ULONG NumGuids = 0; + HDEVINFO hList; + SP_DEVICE_INTERFACE_DATA DeviceInterfaceData; + + OutputDebugStringW(L"CKsProxy::Load\n"); + + // read device path + varName.vt = VT_BSTR; + hr = pPropBag->Read(L"DevicePath", &varName, pErrorLog); + + if (FAILED(hr)) + { + swprintf(Buffer, L"CKsProxy::Load Read %lx\n", hr); + OutputDebugStringW(Buffer); + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); + } + + OutputDebugStringW(L"DevicePath: "); + OutputDebugStringW(varName.bstrVal); + OutputDebugStringW(L"\n"); + + // create device list + hList = SetupDiCreateDeviceInfoListExW(NULL, NULL, NULL, NULL); + if (hList == INVALID_HANDLE_VALUE) + { + // failed to create device list + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); + } + + DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + if (!SetupDiOpenDeviceInterfaceW(hList, (PCWSTR)varName.bstrVal, 0, &DeviceInterfaceData)) + { + // failed to open device interface + SetupDiDestroyDeviceInfoList(hList); + } + + // FIXME handle device interface links(aliases) + CopyMemory(&m_DeviceInterfaceGUID, &DeviceInterfaceData.InterfaceClassGuid, sizeof(GUID)); + + // close device info list + SetupDiDestroyDeviceInfoList(hList); + + // open device + m_hDevice = CreateFileW(varName.bstrVal, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); + + if (m_hDevice == INVALID_HANDLE_VALUE) + { + // failed to open device + swprintf(Buffer, L"CKsProxy:: failed to open device with %lx\n", GetLastError()); + OutputDebugStringW(Buffer); + + return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); + } + + // store device path + m_DevicePath = varName.bstrVal; + + // get all supported sets + hr = GetSupportedSets(&pGuid, &NumGuids); + if (FAILED(hr)) + { + CloseHandle(m_hDevice); + m_hDevice = NULL; + return hr; + } + + // load all proxy plugins + hr = LoadProxyPlugins(pGuid, NumGuids); + if (FAILED(hr)) + { + CloseHandle(m_hDevice); + m_hDevice = NULL; + return hr; + } + + // free sets + CoTaskMemFree(pGuid); + + // now create the input / output pins + hr = CreatePins(); + + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::Save(IPropertyBag *pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties) +{ + OutputDebugStringW(L"CKsProxy::Save\n"); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// IBaseFilter interface +// + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetClassID( + CLSID *pClassID) +{ + OutputDebugStringW(L"CKsProxy::GetClassID\n"); + CopyMemory(pClassID, &CLSID_Proxy, sizeof(GUID)); + + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::Stop() +{ + OutputDebugStringW(L"CKsProxy::Stop : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::Pause() +{ + HRESULT hr = S_OK; + + OutputDebugStringW(L"CKsProxy::Pause\n"); + + if (m_FilterState == State_Stopped) + { + hr = SetPinState(KSSTATE_PAUSE); + if (FAILED(hr)) + return hr; + + } + + m_FilterState = State_Paused; + return hr; + +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::Run( + REFERENCE_TIME tStart) +{ + HRESULT hr; + + OutputDebugStringW(L"CKsProxy::Run\n"); + + if (m_FilterState == State_Stopped) + { + // setting filter state to pause + hr = Pause(); + if (FAILED(hr)) + return hr; + + assert(m_FilterState == State_Paused); + } + + hr = SetPinState(KSSTATE_RUN); + if (FAILED(hr)) + return hr; + + m_FilterState = State_Running; + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::SetPinState( + KSSTATE State) +{ + HRESULT hr = S_OK; + ULONG Index; + IKsObject *pObject; + ULONG BytesReturned; + KSPROPERTY Property; + PIN_INFO PinInfo; + + Property.Set = KSPROPSETID_Connection; + Property.Id = KSPROPERTY_CONNECTION_STATE; + Property.Flags = KSPROPERTY_TYPE_SET; + + // set all pins to running state + for(Index = 0; Index < m_Pins.size(); Index++) + { + IPin * Pin = m_Pins[Index]; + if (!Pin) + continue; + + //check if the pin is connected + IPin * TempPin; + hr = Pin->ConnectedTo(&TempPin); + if (FAILED(hr)) + { + // skip unconnected pins + continue; + } + + // release connected pin + TempPin->Release(); + + // query for the pin info + hr = Pin->QueryPinInfo(&PinInfo); + + if (SUCCEEDED(hr)) + { + if (PinInfo.pFilter) + PinInfo.pFilter->Release(); + + if (PinInfo.dir == PINDIR_OUTPUT) + { + hr = COutputPin_SetState(Pin, State); + if (SUCCEEDED(hr)) + continue; + } + } + + //query IKsObject interface + hr = Pin->QueryInterface(IID_IKsObject, (void**)&pObject); + + // get pin handle + HANDLE hPin = pObject->KsGetObjectHandle(); + + // sanity check + assert(hPin && hPin != INVALID_HANDLE_VALUE); + + // now set state + hr = KsSynchronousDeviceControl(hPin, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&State, sizeof(KSSTATE), &BytesReturned); + + WCHAR Buffer[100]; + swprintf(Buffer, L"CKsProxy::SetPinState Index %u State %u hr %lx\n", Index, State, hr); + OutputDebugStringW(Buffer); + + if (FAILED(hr)) + return hr; + } + return hr; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetState( + DWORD dwMilliSecsTimeout, + FILTER_STATE *State) +{ + *State = m_FilterState; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::SetSyncSource( + IReferenceClock *pClock) +{ + HRESULT hr; + IKsClock *pKsClock; + HANDLE hClock, hPin; + ULONG Index; + IPin * pin; + IKsObject * pObject; + KSPROPERTY Property; + ULONG BytesReturned; + PIN_DIRECTION PinDir; + +// Plug In Distributor: IKsClock + OutputDebugStringW(L"CKsProxy::SetSyncSource\n"); + + // FIXME + // need locks + + if (pClock) + { + hr = pClock->QueryInterface(IID_IKsClock, (void**)&pKsClock); + if (FAILED(hr)) + { + hr = m_ReferenceClock->QueryInterface(IID_IKsClock, (void**)&pKsClock); + if (FAILED(hr)) + return hr; + } + + // get clock handle + hClock = pKsClock->KsGetClockHandle(); + + // release IKsClock interface + pKsClock->Release(); + m_hClock = hClock; + } + else + { + // no clock handle + m_hClock = NULL; + } + + + // distribute clock to all pins + for(Index = 0; Index < m_Pins.size(); Index++) + { + // get current pin + pin = m_Pins[Index]; + if (!pin) + continue; + + // get IKsObject interface + hr = pin->QueryInterface(IID_IKsObject, (void **)&pObject); + if (SUCCEEDED(hr)) + { + // get pin handle + hPin = pObject->KsGetObjectHandle(); + if (hPin != INVALID_HANDLE_VALUE && hPin) + { + // set clock + Property.Set = KSPROPSETID_Stream; + Property.Id = KSPROPERTY_STREAM_MASTERCLOCK; + Property.Flags = KSPROPERTY_TYPE_SET; + + // set master clock + hr = KsSynchronousDeviceControl(hPin, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&m_hClock, sizeof(HANDLE), &BytesReturned); + + if (FAILED(hr)) + { + if (hr != MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_SET_NOT_FOUND) && + hr != MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND)) + { + // failed to set master clock + pObject->Release(); + WCHAR Buffer[100]; + swprintf(Buffer, L"CKsProxy::SetSyncSource KSPROPERTY_STREAM_MASTERCLOCK failed with %lx\n", hr); + OutputDebugStringW(Buffer); + return hr; + } + } + } + // release IKsObject + pObject->Release(); + } + + // now get the direction + hr = pin->QueryDirection(&PinDir); + if (SUCCEEDED(hr)) + { + if (PinDir == PINDIR_OUTPUT) + { + // notify pin via + //CBaseStreamControl::SetSyncSource(pClock) + } + } + } + + if (pClock) + { + pClock->AddRef(); + } + + if (m_ReferenceClock) + { + m_ReferenceClock->Release(); + } + + m_ReferenceClock = pClock; + OutputDebugStringW(L"CKsProxy::SetSyncSource done\n"); + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::GetSyncSource( + IReferenceClock **pClock) +{ + OutputDebugStringW(L"CKsProxy::GetSyncSource\n"); + + if (!pClock) + return E_POINTER; + + if (m_ReferenceClock) + m_ReferenceClock->AddRef(); + + *pClock = m_ReferenceClock; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::EnumPins( + IEnumPins **ppEnum) +{ + OutputDebugStringW(L"CKsProxy::EnumPins\n"); + return CEnumPins_fnConstructor(m_Pins, IID_IEnumPins, (void**)ppEnum); +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::FindPin( + LPCWSTR Id, IPin **ppPin) +{ + ULONG PinId; + + OutputDebugStringW(L"CKsProxy::FindPin\n"); + + if (!ppPin) + return E_POINTER; + + // convert to pin + int ret = swscanf(Id, L"%u", &PinId); + + if (!ret || ret == EOF) + { + // invalid id + return VFW_E_NOT_FOUND; + } + + if (PinId >= m_Pins.size() || m_Pins[PinId] == NULL) + { + // invalid id + return VFW_E_NOT_FOUND; + } + + // found pin + *ppPin = m_Pins[PinId]; + m_Pins[PinId]->AddRef(); + + return S_OK; +} + + +HRESULT +STDMETHODCALLTYPE +CKsProxy::QueryFilterInfo( + FILTER_INFO *pInfo) +{ + if (!pInfo) + return E_POINTER; + + OutputDebugStringW(L"CKsProxy::QueryFilterInfo\n"); + + pInfo->achName[0] = L'\0'; + pInfo->pGraph = m_pGraph; + + if (m_pGraph) + m_pGraph->AddRef(); + + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::JoinFilterGraph( + IFilterGraph *pGraph, + LPCWSTR pName) +{ + OutputDebugStringW(L"CKsProxy::JoinFilterGraph\n"); + + if (pGraph) + { + // joining filter graph + m_pGraph = pGraph; + } + else + { + // leaving graph + m_pGraph = 0; + } + + return S_OK; +} + + +HRESULT +STDMETHODCALLTYPE +CKsProxy::QueryVendorInfo( + LPWSTR *pVendorInfo) +{ + OutputDebugStringW(L"CKsProxy::QueryVendorInfo\n"); + return StringFromCLSID(CLSID_Proxy, pVendorInfo); +} + +//------------------------------------------------------------------- +// IAMovieSetup interface +// + +HRESULT +STDMETHODCALLTYPE +CKsProxy::Register() +{ + OutputDebugStringW(L"CKsProxy::Register : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CKsProxy::Unregister() +{ + OutputDebugStringW(L"CKsProxy::Unregister : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +WINAPI +CKsProxy_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv) +{ + WCHAR Buffer[100]; + LPOLESTR pstr; + StringFromCLSID(riid, &pstr); + swprintf(Buffer, L"CKsProxy_Constructor pUnkOuter %p riid %s\n", pUnkOuter, pstr); + OutputDebugStringW(Buffer); + + CKsProxy * handler = new CKsProxy(); + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return S_OK; +} diff --git a/reactos/dll/directx/ksproxy/qualityforward.cpp b/reactos/dll/directx/ksproxy/qualityforward.cpp new file mode 100644 index 00000000000..88459d8275d --- /dev/null +++ b/reactos/dll/directx/ksproxy/qualityforward.cpp @@ -0,0 +1,132 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS WDM Streaming ActiveMovie Proxy + * FILE: dll/directx/ksproxy/clockforward.cpp + * PURPOSE: IKsClockForwarder interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +#ifndef _MSC_VER +const GUID KSCATEGORY_QUALITY = {0x97EBAACB, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}}; +#endif + +#define IID_IKsQualityForwarder KSCATEGORY_QUALITY + +class CKsQualityForwarder : public IKsQualityForwarder +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + // IKsObject interface + HANDLE STDMETHODCALLTYPE KsGetObjectHandle(); + + // IKsQualityForwarder + VOID STDMETHODCALLTYPE KsFlushClient(IN IKsPin *Pin); + + CKsQualityForwarder(HANDLE handle) : m_Ref(0), m_Handle(handle){} + virtual ~CKsQualityForwarder(){ if (m_Handle) CloseHandle(m_Handle);} + +protected: + LONG m_Ref; + HANDLE m_Handle; + + +}; + +HRESULT +STDMETHODCALLTYPE +CKsQualityForwarder::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown) || + IsEqualGUID(refiid, IID_IKsQualityForwarder)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IKsObject interface +// + +HANDLE +STDMETHODCALLTYPE +CKsQualityForwarder::KsGetObjectHandle() +{ + return m_Handle; +} + +//------------------------------------------------------------------- +// IKsQualityForwarder interface +// +VOID +STDMETHODCALLTYPE +CKsQualityForwarder::KsFlushClient( + IN IKsPin *Pin) +{ + OutputDebugString("UNIMPLEMENTED\n"); +} + +HRESULT +WINAPI +CKsQualityForwarder_Constructor( + IUnknown * pUnkOuter, + REFIID riid, + LPVOID * ppv) +{ + HRESULT hr; + HANDLE handle; + + OutputDebugStringW(L"CKsQualityForwarder_Constructor\n"); + + // open default clock + hr = KsOpenDefaultDevice(KSCATEGORY_QUALITY, GENERIC_READ | GENERIC_WRITE, &handle); + + if (hr != NOERROR) + { + OutputDebugString("CKsClockForwarder_Constructor failed to open device\n"); + return hr; + } + + CKsQualityForwarder * quality = new CKsQualityForwarder(handle); + + if (!quality) + { + // free clock handle + CloseHandle(handle); + return E_OUTOFMEMORY; + } + + if (FAILED(quality->QueryInterface(riid, ppv))) + { + /* not supported */ + delete quality; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/ksuser/ksuser.c b/reactos/dll/directx/ksuser/ksuser.c index 8d565231c70..8f62abf950d 100644 --- a/reactos/dll/directx/ksuser/ksuser.c +++ b/reactos/dll/directx/ksuser/ksuser.c @@ -92,7 +92,7 @@ KsiCreateObjectType( HANDLE hHandle, * *--*/ KSDDKAPI -NTSTATUS +DWORD NTAPI KsCreateAllocator(HANDLE ConnectionHandle, PKSALLOCATOR_FRAMING AllocatorFraming, @@ -130,7 +130,7 @@ KsCreateAllocator(HANDLE ConnectionHandle, * *--*/ KSDDKAPI -NTSTATUS +DWORD NTAPI KsCreateClock(HANDLE ConnectionHandle, PKSCLOCK_CREATE ClockCreate, @@ -225,7 +225,7 @@ KsCreatePin(HANDLE FilterHandle, * *--*/ KSDDKAPI -NTSTATUS +DWORD NTAPI KsCreateTopologyNode(HANDLE ParentHandle, PKSNODE_CREATE NodeCreate, diff --git a/reactos/dll/directx/ksuser/ksuser.h b/reactos/dll/directx/ksuser/ksuser.h index 1d60b17c611..de44aab6d8b 100644 --- a/reactos/dll/directx/ksuser/ksuser.h +++ b/reactos/dll/directx/ksuser/ksuser.h @@ -1,5 +1,4 @@ -#ifndef KSUSER_H__ -#define KSUSER_H__ +#pragma once #define _KSDDK_ @@ -15,5 +14,3 @@ #define ROUND_UP(n, align) \ ROUND_DOWN(((ULONG)n) + (align) - 1, (align)) - -#endif diff --git a/reactos/dll/directx/msdmo/dmoreg.c b/reactos/dll/directx/msdmo/dmoreg.c index ce4ee04f824..a3dc9304687 100644 --- a/reactos/dll/directx/msdmo/dmoreg.c +++ b/reactos/dll/directx/msdmo/dmoreg.c @@ -787,11 +787,11 @@ HRESULT read_types(HKEY root, LPCWSTR key, ULONG *supplied, ULONG requested, DMO * DMOGetTypes (MSDMO.@) */ HRESULT WINAPI DMOGetTypes(REFCLSID clsidDMO, - unsigned long ulInputTypesRequested, - unsigned long* pulInputTypesSupplied, + ULONG ulInputTypesRequested, + ULONG* pulInputTypesSupplied, DMO_PARTIAL_MEDIATYPE* pInputTypes, - unsigned long ulOutputTypesRequested, - unsigned long* pulOutputTypesSupplied, + ULONG ulOutputTypesRequested, + ULONG* pulOutputTypesSupplied, DMO_PARTIAL_MEDIATYPE* pOutputTypes) { HKEY root,hkey; @@ -815,7 +815,7 @@ HRESULT WINAPI DMOGetTypes(REFCLSID clsidDMO, if (ulInputTypesRequested > 0) { - ret = read_types(hkey, szDMOInputType, (ULONG*)pulInputTypesSupplied, ulInputTypesRequested, pInputTypes ); + ret = read_types(hkey, szDMOInputType, pulInputTypesSupplied, ulInputTypesRequested, pInputTypes ); } else *pulInputTypesSupplied = 0; @@ -823,7 +823,7 @@ HRESULT WINAPI DMOGetTypes(REFCLSID clsidDMO, if (ulOutputTypesRequested > 0) { HRESULT ret2; - ret2 = read_types(hkey, szDMOOutputType, (ULONG*)pulOutputTypesSupplied, ulOutputTypesRequested, pOutputTypes ); + ret2 = read_types(hkey, szDMOOutputType, pulOutputTypesSupplied, ulOutputTypesRequested, pOutputTypes ); if (ret == S_OK) ret = ret2; diff --git a/reactos/dll/directx/msdvbnp/classfactory.cpp b/reactos/dll/directx/msdvbnp/classfactory.cpp new file mode 100644 index 00000000000..89b61c486fe --- /dev/null +++ b/reactos/dll/directx/msdvbnp/classfactory.cpp @@ -0,0 +1,105 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/msdvbnp/classfactory.cpp + * PURPOSE: IClassFactory interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; +const GUID IID_IClassFactory = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; + +class CClassFactory : public IClassFactory +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject); + HRESULT WINAPI LockServer(BOOL fLock); + + CClassFactory(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, IID *riidInst) : m_Ref(1), m_lpfnCI(lpfnCI), m_IID(riidInst) + {}; + + virtual ~CClassFactory(){}; + +protected: + LONG m_Ref; + LPFNCREATEINSTANCE m_lpfnCI; + IID * m_IID; +}; + +HRESULT +WINAPI +CClassFactory::QueryInterface( + REFIID riid, + LPVOID *ppvObj) +{ + *ppvObj = NULL; + if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) + { + *ppvObj = PVOID(this); + InterlockedIncrement(&m_Ref); + return S_OK; + } + return E_NOINTERFACE; +} + +HRESULT +WINAPI +CClassFactory::CreateInstance( + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID *ppvObject) +{ + *ppvObject = NULL; + + if ( m_IID == NULL || IsEqualCLSID(riid, *m_IID) || IsEqualCLSID(riid, IID_IUnknown)) + { + return m_lpfnCI(pUnkOuter, riid, ppvObject); + } + + return E_NOINTERFACE; +} + +HRESULT +WINAPI +CClassFactory::LockServer( + BOOL fLock) +{ + return E_NOTIMPL; +} + +IClassFactory * +CClassFactory_fnConstructor( + LPFNCREATEINSTANCE lpfnCI, + PLONG pcRefDll, + IID * riidInst) +{ + CClassFactory* factory = new CClassFactory(lpfnCI, pcRefDll, riidInst); + + if (!factory) + return NULL; + + if (pcRefDll) + InterlockedIncrement(pcRefDll); + + return (LPCLASSFACTORY)factory; +} diff --git a/reactos/dll/directx/msdvbnp/enum_mediatypes.cpp b/reactos/dll/directx/msdvbnp/enum_mediatypes.cpp new file mode 100644 index 00000000000..6cd887f358c --- /dev/null +++ b/reactos/dll/directx/msdvbnp/enum_mediatypes.cpp @@ -0,0 +1,189 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Network Provider for MPEG2 based networks + * FILE: dll/directx/msdvbnp/enum_mediatypes.cpp + * PURPOSE: IEnumMediaTypes interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CEnumMediaTypes : public IEnumMediaTypes +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + HRESULT STDMETHODCALLTYPE Next(ULONG cMediaTypes, AM_MEDIA_TYPE **ppMediaTypes, ULONG *pcFetched); + HRESULT STDMETHODCALLTYPE Skip(ULONG cMediaTypes); + HRESULT STDMETHODCALLTYPE Reset(); + HRESULT STDMETHODCALLTYPE Clone(IEnumMediaTypes **ppEnum); + + + CEnumMediaTypes(ULONG MediaTypeCount, AM_MEDIA_TYPE * MediaTypes) : m_Ref(0), m_MediaTypeCount(MediaTypeCount), m_MediaTypes(MediaTypes), m_Index(0){}; + virtual ~CEnumMediaTypes(){}; + +protected: + LONG m_Ref; + ULONG m_MediaTypeCount; + AM_MEDIA_TYPE * m_MediaTypes; + ULONG m_Index; +}; + +HRESULT +STDMETHODCALLTYPE +CEnumMediaTypes::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + if (IsEqualGUID(refiid, IID_IEnumMediaTypes)) + { + *Output = (IEnumMediaTypes*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CEnumMediaTypes::QueryInterface: NoInterface for %s\n", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IEnumMediaTypes +// + +HRESULT +STDMETHODCALLTYPE +CEnumMediaTypes::Next( + ULONG cMediaTypes, + AM_MEDIA_TYPE **ppMediaTypes, + ULONG *pcFetched) +{ + ULONG i = 0; + AM_MEDIA_TYPE * MediaType; + + if (!ppMediaTypes) + return E_POINTER; + + if (cMediaTypes > 1 && !pcFetched) + return E_INVALIDARG; + + while(i < cMediaTypes) + { + if (m_Index + i >= m_MediaTypeCount) + break; + + MediaType = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); + if (!MediaType) + break; + + CopyMemory(MediaType, &m_MediaTypes[m_Index + i], sizeof(AM_MEDIA_TYPE)); + ppMediaTypes[i] = MediaType; + i++; + } + + if (pcFetched) + { + *pcFetched = i; + } + + m_Index += i; + + if (i < cMediaTypes) + return S_FALSE; + else + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CEnumMediaTypes::Skip( + ULONG cMediaTypes) +{ + if (cMediaTypes + m_Index >= m_MediaTypeCount) + { + return S_FALSE; + } + + m_Index += cMediaTypes; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CEnumMediaTypes::Reset() +{ + m_Index = 0; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CEnumMediaTypes::Clone( + IEnumMediaTypes **ppEnum) +{ + OutputDebugStringW(L"CEnumMediaTypes::Clone : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +WINAPI +CEnumMediaTypes_fnConstructor( + IUnknown *pUnknown, + ULONG MediaTypeCount, + AM_MEDIA_TYPE * MediaTypes, + REFIID riid, + LPVOID * ppv) +{ + CEnumMediaTypes * handler = new CEnumMediaTypes(MediaTypeCount, MediaTypes); + +#ifdef MSDVBNP_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(riid, &lpstr); + swprintf(Buffer, L"CEnumMediaTypes_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); + OutputDebugStringW(Buffer); +#endif + + if (!handler) + { + CoTaskMemFree(MediaTypes); + return E_OUTOFMEMORY; + } + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} + diff --git a/reactos/dll/directx/msdvbnp/enumpins.cpp b/reactos/dll/directx/msdvbnp/enumpins.cpp new file mode 100644 index 00000000000..567705907b7 --- /dev/null +++ b/reactos/dll/directx/msdvbnp/enumpins.cpp @@ -0,0 +1,177 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Network Provider for MPEG2 based networks + * FILE: dll/directx/msdvbnp/enumpins.cpp + * PURPOSE: IEnumPins interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CEnumPins : public IEnumPins +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + + HRESULT STDMETHODCALLTYPE Next(ULONG cPins, IPin **ppPins, ULONG *pcFetched); + HRESULT STDMETHODCALLTYPE Skip(ULONG cPins); + HRESULT STDMETHODCALLTYPE Reset(); + HRESULT STDMETHODCALLTYPE Clone(IEnumPins **ppEnum); + + CEnumPins(ULONG NumPins, IPin ** pins) : m_Ref(0), m_NumPins(NumPins), m_Pins(pins), m_Index(0){}; + virtual ~CEnumPins(){}; + +protected: + LONG m_Ref; + ULONG m_NumPins; + IPin ** m_Pins; + ULONG m_Index; +}; + +HRESULT +STDMETHODCALLTYPE +CEnumPins::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + if (IsEqualGUID(refiid, IID_IEnumPins)) + { + *Output = (IEnumPins*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CEnumPins::QueryInterface: NoInterface for %s\n", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + + return E_NOINTERFACE; +} + +HRESULT +STDMETHODCALLTYPE +CEnumPins::Next( + ULONG cPins, + IPin **ppPins, + ULONG *pcFetched) +{ + ULONG i = 0; + + if (!ppPins) + return E_POINTER; + + if (cPins > 1 && !pcFetched) + return E_INVALIDARG; + + while(i < cPins) + { + if (m_Index + i >= m_NumPins) + break; + + ppPins[i] = m_Pins[m_Index + i]; + m_Pins[m_Index + i]->AddRef(); + + i++; + } + + if (pcFetched) + { + *pcFetched = i; + } + + m_Index += i; + + if (i < cPins) + return S_FALSE; + else + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CEnumPins::Skip( + ULONG cPins) +{ + if (cPins + m_Index >= m_NumPins) + { + return S_FALSE; + } + + m_Index += cPins; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CEnumPins::Reset() +{ + m_Index = 0; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CEnumPins::Clone( + IEnumPins **ppEnum) +{ + OutputDebugStringW(L"CEnumPins::Clone : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +WINAPI +CEnumPins_fnConstructor( + IUnknown *pUnknown, + ULONG NumPins, + IPin ** pins, + REFIID riid, + LPVOID * ppv) +{ + CEnumPins * handler = new CEnumPins(NumPins, pins); + +#ifdef MSDVBNP_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(riid, &lpstr); + swprintf(Buffer, L"CEnumPins_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); + OutputDebugStringW(Buffer); +#endif + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} \ No newline at end of file diff --git a/reactos/dll/directx/msdvbnp/msdvbnp.cpp b/reactos/dll/directx/msdvbnp/msdvbnp.cpp new file mode 100644 index 00000000000..037a67ef717 --- /dev/null +++ b/reactos/dll/directx/msdvbnp/msdvbnp.cpp @@ -0,0 +1,108 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Network Provider for MPEG2 based networks + * FILE: dll/directx/msdvbnp/msdvbnp.cpp + * PURPOSE: COM Initialization + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ + +#include "precomp.h" + +const GUID CLSID_DVBTNetworkProvider = {0x216c62df, 0x6d7f, 0x4e9a, {0x85, 0x71, 0x5, 0xf1, 0x4e, 0xdb, 0x76, 0x6a}}; + +static INTERFACE_TABLE InterfaceTable[] = +{ + {&CLSID_DVBTNetworkProvider, CNetworkProvider_fnConstructor}, + {NULL, NULL} +}; + +extern "C" +BOOL +WINAPI +DllMain( + HINSTANCE hInstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + CoInitialize(NULL); + +#ifdef MSDVBNP_TRACE + OutputDebugStringW(L"MSDVBNP::DllMain()\n"); +#endif + + DisableThreadLibraryCalls(hInstDLL); + break; + default: + break; + } + + return TRUE; +} + + +extern "C" +KSDDKAPI +HRESULT +WINAPI +DllUnregisterServer(void) +{ + return S_OK; +} + +extern "C" +KSDDKAPI +HRESULT +WINAPI +DllRegisterServer(void) +{ + return S_OK; +} + +KSDDKAPI +HRESULT +WINAPI +DllGetClassObject( + REFCLSID rclsid, + REFIID riid, + LPVOID *ppv) +{ + UINT i; + HRESULT hres = E_OUTOFMEMORY; + IClassFactory * pcf = NULL; + + if (!ppv) + return E_INVALIDARG; + + *ppv = NULL; + + for (i = 0; InterfaceTable[i].riid; i++) + { + if (IsEqualIID(*InterfaceTable[i].riid, rclsid)) + { + pcf = CClassFactory_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL); + break; + } + } + + if (!pcf) + { + return CLASS_E_CLASSNOTAVAILABLE; + } + + hres = pcf->QueryInterface(riid, ppv); + pcf->Release(); + + return hres; +} + +KSDDKAPI +HRESULT +WINAPI +DllCanUnloadNow(void) +{ + return S_OK; +} diff --git a/reactos/dll/directx/msdvbnp/msdvbnp.rbuild b/reactos/dll/directx/msdvbnp/msdvbnp.rbuild new file mode 100644 index 00000000000..6213d7d8f37 --- /dev/null +++ b/reactos/dll/directx/msdvbnp/msdvbnp.rbuild @@ -0,0 +1,31 @@ + + + + + + . + ntdll + kernel32 + advapi32 + ole32 + advapi32 + msvcrt + strmiids + + -fno-exceptions + -fno-rtti + + + /GR- + + + classfactory.cpp + enum_mediatypes.cpp + enumpins.cpp + msdvbnp.cpp + msdvbnp.rc + networkprovider.cpp + pin.cpp + scanningtuner.cpp + + diff --git a/reactos/dll/directx/msdvbnp/msdvbnp.rc b/reactos/dll/directx/msdvbnp/msdvbnp.rc new file mode 100644 index 00000000000..7df396e8fdf --- /dev/null +++ b/reactos/dll/directx/msdvbnp/msdvbnp.rc @@ -0,0 +1,12 @@ +#include + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Network Provider for MPEG2 based networks\0" +#define REACTOS_STR_INTERNAL_NAME "MSDvBNP.ax\0" +#define REACTOS_STR_ORIGINAL_FILENAME "MSDvBNP.ax\0" +#define REACTOS_STR_PRODUCT_VERSION "6.5.2600.3264\0" +#define REACTOS_STR_FILE_VERSION "6.5.2600.3264\0" + +#include diff --git a/reactos/dll/directx/msdvbnp/msdvbnp.spec b/reactos/dll/directx/msdvbnp/msdvbnp.spec new file mode 100644 index 00000000000..5baed04ed66 --- /dev/null +++ b/reactos/dll/directx/msdvbnp/msdvbnp.spec @@ -0,0 +1,4 @@ +@ stdcall DllCanUnloadNow() +@ stdcall DllGetClassObject(ptr ptr ptr) +@ stdcall DllRegisterServer() +@ stdcall DllUnregisterServer() diff --git a/reactos/dll/directx/msdvbnp/networkprovider.cpp b/reactos/dll/directx/msdvbnp/networkprovider.cpp new file mode 100644 index 00000000000..c69c2336e48 --- /dev/null +++ b/reactos/dll/directx/msdvbnp/networkprovider.cpp @@ -0,0 +1,378 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Network Provider for MPEG2 based networks + * FILE: dll/directx/msdvbnp/networkprovider.cpp + * PURPOSE: IBDA_NetworkProvider interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CNetworkProvider : public IBaseFilter, + public IAMovieSetup, + public IBDA_NetworkProvider +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + // IBaseFilter methods + HRESULT STDMETHODCALLTYPE GetClassID(CLSID *pClassID); + HRESULT STDMETHODCALLTYPE Stop( void); + HRESULT STDMETHODCALLTYPE Pause( void); + HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart); + HRESULT STDMETHODCALLTYPE GetState(DWORD dwMilliSecsTimeout, FILTER_STATE *State); + HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock *pClock); + HRESULT STDMETHODCALLTYPE GetSyncSource(IReferenceClock **pClock); + HRESULT STDMETHODCALLTYPE EnumPins(IEnumPins **ppEnum); + HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR Id, IPin **ppPin); + HRESULT STDMETHODCALLTYPE QueryFilterInfo(FILTER_INFO *pInfo); + HRESULT STDMETHODCALLTYPE JoinFilterGraph(IFilterGraph *pGraph, LPCWSTR pName); + HRESULT STDMETHODCALLTYPE QueryVendorInfo(LPWSTR *pVendorInfo); + + //IAMovieSetup methods + HRESULT STDMETHODCALLTYPE Register( void); + HRESULT STDMETHODCALLTYPE Unregister( void); + + //IBDA_NetworkProvider methods + HRESULT STDMETHODCALLTYPE PutSignalSource(ULONG ulSignalSource); + HRESULT STDMETHODCALLTYPE GetSignalSource(ULONG *pulSignalSource); + HRESULT STDMETHODCALLTYPE GetNetworkType(GUID *pguidNetworkType); + HRESULT STDMETHODCALLTYPE PutTuningSpace(REFGUID guidTuningSpace); + HRESULT STDMETHODCALLTYPE GetTuningSpace(GUID *pguidTuingSpace); + HRESULT STDMETHODCALLTYPE RegisterDeviceFilter(IUnknown *pUnkFilterControl, ULONG *ppvRegisitrationContext); + HRESULT STDMETHODCALLTYPE UnRegisterDeviceFilter(ULONG pvRegistrationContext); + + CNetworkProvider() : m_Ref(0), m_pGraph(0), m_ReferenceClock(0), m_FilterState(State_Stopped) {m_Pins[0] = 0;}; + virtual ~CNetworkProvider(){}; + +protected: + LONG m_Ref; + IFilterGraph *m_pGraph; + IReferenceClock * m_ReferenceClock; + FILTER_STATE m_FilterState; + IPin * m_Pins[1]; +}; + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + *Output = NULL; + + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + if (IsEqualGUID(refiid, IID_IBaseFilter)) + { + *Output = (IBaseFilter*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_ITuner) || + IsEqualGUID(refiid, IID_IScanningTuner)) + { + // construct scanning tuner + return CScanningTunner_fnConstructor(NULL, refiid, Output); + } + + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CNetworkProvider::QueryInterface: NoInterface for %s !!!\n", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IBaseFilter interface +// + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::GetClassID( + CLSID *pClassID) +{ + OutputDebugStringW(L"CNetworkProvider::GetClassID : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::Stop() +{ + OutputDebugStringW(L"CNetworkProvider::Stop : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::Pause() +{ + OutputDebugStringW(L"CNetworkProvider::Pause : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::Run( + REFERENCE_TIME tStart) +{ + OutputDebugStringW(L"CNetworkProvider::Run : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::GetState( + DWORD dwMilliSecsTimeout, + FILTER_STATE *State) +{ + *State = m_FilterState; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::SetSyncSource( + IReferenceClock *pClock) +{ + if (pClock) + { + pClock->AddRef(); + + } + + if (m_ReferenceClock) + { + m_ReferenceClock->Release(); + } + + m_ReferenceClock = pClock; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::GetSyncSource( + IReferenceClock **pClock) +{ + if (!pClock) + return E_POINTER; + + if (m_ReferenceClock) + m_ReferenceClock->AddRef(); + + *pClock = m_ReferenceClock; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::EnumPins( + IEnumPins **ppEnum) +{ + if (m_Pins[0] == 0) + { + HRESULT hr = CPin_fnConstructor(NULL, (IBaseFilter*)this, IID_IUnknown, (void**)&m_Pins[0]); + if (FAILED(hr)) + return hr; + } + + return CEnumPins_fnConstructor(NULL, 1, m_Pins, IID_IEnumPins, (void**)ppEnum); +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::FindPin( + LPCWSTR Id, IPin **ppPin) +{ + OutputDebugStringW(L"CNetworkProvider::FindPin : NotImplemented\n"); + return E_NOTIMPL; +} + + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::QueryFilterInfo( + FILTER_INFO *pInfo) +{ + if (!pInfo) + return E_POINTER; + + pInfo->achName[0] = L'\0'; + pInfo->pGraph = m_pGraph; + + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::JoinFilterGraph( + IFilterGraph *pGraph, + LPCWSTR pName) +{ + if (pGraph) + { + // joining filter graph + m_pGraph = pGraph; + } + else + { + // leaving graph + m_pGraph = 0; + } + + OutputDebugStringW(L"CNetworkProvider::JoinFilterGraph\n"); + return S_OK; +} + + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::QueryVendorInfo( + LPWSTR *pVendorInfo) +{ + OutputDebugStringW(L"CNetworkProvider::QueryVendorInfo : NotImplemented\n"); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// IAMovieSetup interface +// + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::Register() +{ + OutputDebugStringW(L"CNetworkProvider::Register : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::Unregister() +{ + OutputDebugStringW(L"CNetworkProvider::Unregister : NotImplemented\n"); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// IBDA_NetworkProvider interface +// + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::PutSignalSource( + ULONG ulSignalSource) +{ + OutputDebugStringW(L"CNetworkProvider::PutSignalSource : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::GetSignalSource( + ULONG *pulSignalSource) +{ + OutputDebugStringW(L"CNetworkProvider::GetSignalSource : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::GetNetworkType( + GUID *pguidNetworkType) +{ + OutputDebugStringW(L"CNetworkProvider::GetNetworkType : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::PutTuningSpace( + REFGUID guidTuningSpace) +{ + OutputDebugStringW(L"CNetworkProvider::PutTuningSpace : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::GetTuningSpace( + GUID *pguidTuingSpace) +{ + OutputDebugStringW(L"CNetworkProvider::GetTuningSpace : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::RegisterDeviceFilter( + IUnknown *pUnkFilterControl, + ULONG *ppvRegisitrationContext) +{ + OutputDebugStringW(L"CNetworkProvider::RegisterDeviceFilter : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CNetworkProvider::UnRegisterDeviceFilter(ULONG pvRegistrationContext) +{ + OutputDebugStringW(L"CNetworkProvider::UnRegisterDeviceFilter : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +WINAPI +CNetworkProvider_fnConstructor( + IUnknown *pUnknown, + REFIID riid, + LPVOID * ppv) +{ + CNetworkProvider * handler = new CNetworkProvider(); + +#ifdef MSDVBNP_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(riid, &lpstr); + swprintf(Buffer, L"CNetworkProvider_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); + OutputDebugStringW(Buffer); +#endif + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + return NOERROR; +} diff --git a/reactos/dll/directx/msdvbnp/pin.cpp b/reactos/dll/directx/msdvbnp/pin.cpp new file mode 100644 index 00000000000..9662f809133 --- /dev/null +++ b/reactos/dll/directx/msdvbnp/pin.cpp @@ -0,0 +1,262 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Network Provider for MPEG2 based networks + * FILE: dll/directx/msdvbnp/pin.cpp + * PURPOSE: IPin interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +const GUID KSDATAFORMAT_TYPE_BDA_ANTENNA = {0x71985f41, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}}; +const GUID GUID_NULL = {0x00000000L, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}; + +class CPin : public IPin +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + //IPin methods + HRESULT STDMETHODCALLTYPE Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE Disconnect(); + HRESULT STDMETHODCALLTYPE ConnectedTo(IPin **pPin); + HRESULT STDMETHODCALLTYPE ConnectionMediaType(AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE QueryPinInfo(PIN_INFO *pInfo); + HRESULT STDMETHODCALLTYPE QueryDirection(PIN_DIRECTION *pPinDir); + HRESULT STDMETHODCALLTYPE QueryId(LPWSTR *Id); + HRESULT STDMETHODCALLTYPE QueryAccept(const AM_MEDIA_TYPE *pmt); + HRESULT STDMETHODCALLTYPE EnumMediaTypes(IEnumMediaTypes **ppEnum); + HRESULT STDMETHODCALLTYPE QueryInternalConnections(IPin **apPin, ULONG *nPin); + HRESULT STDMETHODCALLTYPE EndOfStream(); + HRESULT STDMETHODCALLTYPE BeginFlush(); + HRESULT STDMETHODCALLTYPE EndFlush(); + HRESULT STDMETHODCALLTYPE NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate); + + CPin(IBaseFilter * ParentFilter) : m_Ref(0), m_ParentFilter(ParentFilter){}; + virtual ~CPin(){}; + + static LPCWSTR PIN_ID; + +protected: + LONG m_Ref; + IBaseFilter * m_ParentFilter; +}; + + +LPCWSTR CPin::PIN_ID = L"Antenna Out"; + +HRESULT +STDMETHODCALLTYPE +CPin::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + if (IsEqualGUID(refiid, IID_IPin)) + { + *Output = (IPin*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CPin::QueryInterface: NoInterface for %s\n", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IPin interface +// +HRESULT +STDMETHODCALLTYPE +CPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) +{ + OutputDebugStringW(L"CPin::Connect called\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CPin::ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt) +{ + OutputDebugStringW(L"CPin::ReceiveConnection called\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CPin::Disconnect( void) +{ + OutputDebugStringW(L"CPin::Disconnect called\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CPin::ConnectedTo(IPin **pPin) +{ + OutputDebugStringW(L"CPin::ConnectedTo called\n"); + return VFW_E_NOT_CONNECTED; +} +HRESULT +STDMETHODCALLTYPE +CPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt) +{ + OutputDebugStringW(L"CPin::ConnectionMediaType called\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CPin::QueryPinInfo(PIN_INFO *pInfo) +{ + wcscpy(pInfo->achName, PIN_ID); + pInfo->dir = PINDIR_OUTPUT; + pInfo->pFilter = m_ParentFilter; + m_ParentFilter->AddRef(); + + return S_OK; +} +HRESULT +STDMETHODCALLTYPE +CPin::QueryDirection(PIN_DIRECTION *pPinDir) +{ + if (pPinDir) + { + *pPinDir = PINDIR_OUTPUT; + return S_OK; + } + + return E_POINTER; +} +HRESULT +STDMETHODCALLTYPE +CPin::QueryId(LPWSTR *Id) +{ + *Id = (LPWSTR)CoTaskMemAlloc(sizeof(PIN_ID)); + if (!*Id) + return E_OUTOFMEMORY; + + wcscpy(*Id, PIN_ID); + return S_OK; +} +HRESULT +STDMETHODCALLTYPE +CPin::QueryAccept(const AM_MEDIA_TYPE *pmt) +{ + OutputDebugStringW(L"CPin::QueryAccept called\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CPin::EnumMediaTypes(IEnumMediaTypes **ppEnum) +{ + AM_MEDIA_TYPE *MediaType = (AM_MEDIA_TYPE*)CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); + + if (!MediaType) + { + return E_OUTOFMEMORY; + } + + MediaType->majortype = KSDATAFORMAT_TYPE_BDA_ANTENNA; + MediaType->subtype = MEDIASUBTYPE_None; + MediaType->formattype = FORMAT_None; + MediaType->bFixedSizeSamples = true; + MediaType->bTemporalCompression = false; + MediaType->lSampleSize = sizeof(CHAR); + MediaType->pUnk = NULL; + MediaType->cbFormat = 0; + MediaType->pbFormat = NULL; + + return CEnumMediaTypes_fnConstructor(NULL, 1, MediaType, IID_IEnumMediaTypes, (void**)ppEnum); +} +HRESULT +STDMETHODCALLTYPE +CPin::QueryInternalConnections(IPin **apPin, ULONG *nPin) +{ + OutputDebugStringW(L"CPin::QueryInternalConnections called\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CPin::EndOfStream( void) +{ + OutputDebugStringW(L"CPin::EndOfStream called\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CPin::BeginFlush( void) +{ + OutputDebugStringW(L"CPin::BeginFlush called\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CPin::EndFlush( void) +{ + OutputDebugStringW(L"CPin::EndFlush called\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CPin::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) +{ + OutputDebugStringW(L"CPin::NewSegment called\n"); + return E_NOTIMPL; +} + +HRESULT +WINAPI +CPin_fnConstructor( + IUnknown *pUnknown, + IBaseFilter * ParentFilter, + REFIID riid, + LPVOID * ppv) +{ + CPin * handler = new CPin(ParentFilter); + +#ifdef MSDVBNP_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(riid, &lpstr); + swprintf(Buffer, L"CPin_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); + OutputDebugStringW(Buffer); +#endif + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} \ No newline at end of file diff --git a/reactos/dll/directx/msdvbnp/precomp.h b/reactos/dll/directx/msdvbnp/precomp.h new file mode 100644 index 00000000000..d20b9ac9d81 --- /dev/null +++ b/reactos/dll/directx/msdvbnp/precomp.h @@ -0,0 +1,82 @@ +#ifndef PRECOMP_H__ +#define PRECOMP_H__ + +#define MSDVBNP_TRACE +#define BUILDING_KS +#define _KSDDK_ +#include +//#include +#include +#define __STREAMS__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject); + +typedef struct +{ + const GUID* riid; + LPFNCREATEINSTANCE lpfnCI; +} INTERFACE_TABLE; + +/* classfactory.cpp */ +IClassFactory * +CClassFactory_fnConstructor( + LPFNCREATEINSTANCE lpfnCI, + PLONG pcRefDll, + IID * riidInst); + +/* networkprovider.cpp */ +HRESULT +WINAPI +CNetworkProvider_fnConstructor( + IUnknown *pUnknown, + REFIID riid, + LPVOID * ppv); + +/* scanningtunner.cpp */ +HRESULT +WINAPI +CScanningTunner_fnConstructor( + IUnknown *pUnknown, + REFIID riid, + LPVOID * ppv); + +/* enumpins.cpp */ +HRESULT +WINAPI +CEnumPins_fnConstructor( + IUnknown *pUnknown, + ULONG NumPins, + IPin ** pins, + REFIID riid, + LPVOID * ppv); + +/* pin.cpp */ +HRESULT +WINAPI +CPin_fnConstructor( + IUnknown *pUnknown, + IBaseFilter * ParentFilter, + REFIID riid, + LPVOID * ppv); + +/* enum_mediatypes.cpp */ +HRESULT +WINAPI +CEnumMediaTypes_fnConstructor( + IUnknown *pUnknown, + ULONG MediaTypeCount, + AM_MEDIA_TYPE * MediaTypes, + REFIID riid, + LPVOID * ppv); + +#endif diff --git a/reactos/dll/directx/msdvbnp/scanningtuner.cpp b/reactos/dll/directx/msdvbnp/scanningtuner.cpp new file mode 100644 index 00000000000..0c9b7782d2b --- /dev/null +++ b/reactos/dll/directx/msdvbnp/scanningtuner.cpp @@ -0,0 +1,264 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Network Provider for MPEG2 based networks + * FILE: dll/directx/msdvbnp/networkprovider.cpp + * PURPOSE: IScanningTunner interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CScanningTunner : public IScanningTuner +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + //ITuner methods + HRESULT STDMETHODCALLTYPE get_TuningSpace(ITuningSpace **TuningSpace); + HRESULT STDMETHODCALLTYPE put_TuningSpace(ITuningSpace *TuningSpace); + HRESULT STDMETHODCALLTYPE EnumTuningSpaces(IEnumTuningSpaces **ppEnum); + HRESULT STDMETHODCALLTYPE get_TuneRequest(ITuneRequest **TuneRequest); + HRESULT STDMETHODCALLTYPE put_TuneRequest(ITuneRequest *TuneRequest); + HRESULT STDMETHODCALLTYPE Validate(ITuneRequest *TuneRequest); + HRESULT STDMETHODCALLTYPE get_PreferredComponentTypes(IComponentTypes **ComponentTypes); + HRESULT STDMETHODCALLTYPE put_PreferredComponentTypes(IComponentTypes *ComponentTypes); + HRESULT STDMETHODCALLTYPE get_SignalStrength(long *Strength); + HRESULT STDMETHODCALLTYPE TriggerSignalEvents(long Interval); + + //IScanningTuner methods + HRESULT STDMETHODCALLTYPE SeekUp(); + HRESULT STDMETHODCALLTYPE SeekDown(); + HRESULT STDMETHODCALLTYPE ScanUp(long MillisecondsPause); + HRESULT STDMETHODCALLTYPE ScanDown(long MillisecondsPause); + HRESULT STDMETHODCALLTYPE AutoProgram(); + + CScanningTunner() : m_Ref(0), m_TuningSpace(0){}; + virtual ~CScanningTunner(){}; + +protected: + LONG m_Ref; + ITuningSpace * m_TuningSpace; +}; + +HRESULT +STDMETHODCALLTYPE +CScanningTunner::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + if (IsEqualGUID(refiid, IID_ITuner)) + { + *Output = (ITuner*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IScanningTuner)) + { + *Output = (IScanningTuner*)(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CScanningTunner::QueryInterface: NoInterface for %s\n", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +//ITuner +// +HRESULT +STDMETHODCALLTYPE +CScanningTunner::get_TuningSpace( + ITuningSpace **TuningSpace) +{ + OutputDebugStringW(L"CScanningTunner::get_TuningSpace\n"); + + *TuningSpace = m_TuningSpace; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CScanningTunner::put_TuningSpace( + ITuningSpace *TuningSpace) +{ + OutputDebugStringW(L"CScanningTunner::put_TuningSpace\n"); + m_TuningSpace = TuningSpace; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CScanningTunner::EnumTuningSpaces( + IEnumTuningSpaces **ppEnum) +{ + OutputDebugStringW(L"CScanningTunner::EnumTuningSpaces : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CScanningTunner::get_TuneRequest( + ITuneRequest **TuneRequest) +{ + OutputDebugStringW(L"CScanningTunner::get_TuneRequest : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CScanningTunner::put_TuneRequest( + ITuneRequest *TuneRequest) +{ + OutputDebugStringW(L"CScanningTunner::put_TuneRequest : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CScanningTunner::Validate( + ITuneRequest *TuneRequest) +{ + OutputDebugStringW(L"CScanningTunner::Validate : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CScanningTunner::get_PreferredComponentTypes( + IComponentTypes **ComponentTypes) +{ + OutputDebugStringW(L"CScanningTunner::get_PreferredComponentTypes : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CScanningTunner::put_PreferredComponentTypes( + IComponentTypes *ComponentTypes) +{ + OutputDebugStringW(L"CScanningTunner::put_PreferredComponentTypes : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CScanningTunner::get_SignalStrength( + long *Strength) +{ + OutputDebugStringW(L"CScanningTunner::get_SignalStrength : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CScanningTunner::TriggerSignalEvents( + long Interval) +{ + OutputDebugStringW(L"CScanningTunner::TriggerSignalEvents : NotImplemented\n"); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +//IScanningTuner +HRESULT +STDMETHODCALLTYPE +CScanningTunner::SeekUp() +{ + OutputDebugStringW(L"CScanningTunner::SeekUp : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CScanningTunner::SeekDown() +{ + OutputDebugStringW(L"CScanningTunner::SeekDown : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CScanningTunner::ScanUp( + long MillisecondsPause) +{ + OutputDebugStringW(L"CScanningTunner::ScanUp : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CScanningTunner::ScanDown( + long MillisecondsPause) +{ + OutputDebugStringW(L"CScanningTunner::ScanDown : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CScanningTunner::AutoProgram() +{ + OutputDebugStringW(L"CScanningTunner::AutoProgram : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +WINAPI +CScanningTunner_fnConstructor( + IUnknown *pUnknown, + REFIID riid, + LPVOID * ppv) +{ + CScanningTunner * handler = new CScanningTunner(); + +#ifdef MSDVBNP_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(riid, &lpstr); + swprintf(Buffer, L"CScanningTunner_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); + OutputDebugStringW(Buffer); +#endif + + if (!handler) + return E_OUTOFMEMORY; + + if (FAILED(handler->QueryInterface(riid, ppv))) + { + /* not supported */ + delete handler; + return E_NOINTERFACE; + } + + return NOERROR; +} \ No newline at end of file diff --git a/reactos/dll/directx/msvidctl/classfactory.cpp b/reactos/dll/directx/msvidctl/classfactory.cpp new file mode 100644 index 00000000000..8af2a69546f --- /dev/null +++ b/reactos/dll/directx/msvidctl/classfactory.cpp @@ -0,0 +1,106 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/msvidctl/classfactory.cpp + * PURPOSE: ClassFactory interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; +const GUID IID_IClassFactory = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; + +class CClassFactory : public IClassFactory +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + delete this; + return 0; + } + return m_Ref; + } + + HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject); + HRESULT WINAPI LockServer(BOOL fLock); + + CClassFactory(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, IID *riidInst) : m_Ref(1), m_lpfnCI(lpfnCI), m_IID(riidInst) + {}; + + virtual ~CClassFactory(){}; + +protected: + LONG m_Ref; + LPFNCREATEINSTANCE m_lpfnCI; + IID * m_IID; +}; + +HRESULT +WINAPI +CClassFactory::QueryInterface( + REFIID riid, + LPVOID *ppvObj) +{ + *ppvObj = NULL; + if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) + { + *ppvObj = PVOID(this); + InterlockedIncrement(&m_Ref); + return S_OK; + } + return E_NOINTERFACE; +} + +HRESULT +WINAPI +CClassFactory::CreateInstance( + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID *ppvObject) +{ + *ppvObject = NULL; + + if ( m_IID == NULL || IsEqualCLSID(riid, *m_IID) || IsEqualCLSID(riid, IID_IUnknown)) + { + return m_lpfnCI(pUnkOuter, riid, ppvObject); + } + + return E_NOINTERFACE; +} + +HRESULT +WINAPI +CClassFactory::LockServer( + BOOL fLock) +{ + return E_NOTIMPL; +} + +IClassFactory * +CClassFactory_fnConstructor( + LPFNCREATEINSTANCE lpfnCI, + PLONG pcRefDll, + IID * riidInst) +{ + CClassFactory* factory = new CClassFactory(lpfnCI, pcRefDll, riidInst); + + if (!factory) + return NULL; + + if (pcRefDll) + InterlockedIncrement(pcRefDll); + + return (LPCLASSFACTORY)factory; +} + diff --git a/reactos/dll/directx/msvidctl/enumtuningspaces.cpp b/reactos/dll/directx/msvidctl/enumtuningspaces.cpp new file mode 100644 index 00000000000..22d3e31bd47 --- /dev/null +++ b/reactos/dll/directx/msvidctl/enumtuningspaces.cpp @@ -0,0 +1,142 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/msvidctl/tuningspace.cpp + * PURPOSE: ITuningSpace interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CEnumTuningSpaces : public IEnumTuningSpaces +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + //delete this; + return 0; + } + return m_Ref; + } + + // IEnumTuningSpaces methods + HRESULT STDMETHODCALLTYPE Next(ULONG celt, ITuningSpace **rgelt, ULONG *pceltFetched); + HRESULT STDMETHODCALLTYPE Skip(ULONG celt); + HRESULT STDMETHODCALLTYPE Reset(); + HRESULT STDMETHODCALLTYPE Clone(IEnumTuningSpaces **ppEnum); + + CEnumTuningSpaces() : m_Ref(0){}; + + virtual ~CEnumTuningSpaces(){}; + +protected: + LONG m_Ref; +}; + +HRESULT +STDMETHODCALLTYPE +CEnumTuningSpaces::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IEnumTuningSpaces)) + { + *Output = (IEnumTuningSpaces*)this; + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CEnumTuningSpaces::QueryInterface: NoInterface for %s\n", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IEnumTuningSpaces +// +HRESULT +STDMETHODCALLTYPE +CEnumTuningSpaces::Next(ULONG celt, ITuningSpace **rgelt, ULONG *pceltFetched) +{ + OutputDebugStringW(L"CEnumTuningSpaces::Next : stub\n"); + return CTuningSpace_fnConstructor(NULL, IID_ITuningSpace, (void**)rgelt); + +} + +HRESULT +STDMETHODCALLTYPE +CEnumTuningSpaces::Skip(ULONG celt) +{ + OutputDebugStringW(L"CEnumTuningSpaces::Skip : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CEnumTuningSpaces::Reset() +{ + OutputDebugStringW(L"CEnumTuningSpaces::Reset : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CEnumTuningSpaces::Clone(IEnumTuningSpaces **ppEnum) +{ + OutputDebugStringW(L"CEnumTuningSpaces::Clone : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +WINAPI +CEnumTuningSpaces_fnConstructor( + IUnknown *pUnknown, + REFIID riid, + LPVOID * ppv) +{ + // construct device control + CEnumTuningSpaces * tuningspaces = new CEnumTuningSpaces(); + +#ifdef MSVIDCTL_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(riid, &lpstr); + swprintf(Buffer, L"CEnumTuningSpaces_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); + OutputDebugStringW(Buffer); +#endif + + if (!tuningspaces) + return E_OUTOFMEMORY; + + if (FAILED(tuningspaces->QueryInterface(riid, ppv))) + { + /* not supported */ + delete tuningspaces; + return E_NOINTERFACE; + } + + return NOERROR; +} + diff --git a/reactos/dll/directx/msvidctl/msvidctl.cpp b/reactos/dll/directx/msvidctl/msvidctl.cpp new file mode 100644 index 00000000000..b086e59d580 --- /dev/null +++ b/reactos/dll/directx/msvidctl/msvidctl.cpp @@ -0,0 +1,106 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS DVB + * FILE: dll/directx/msvidctl/msvidctl.cpp + * PURPOSE: ReactOS DVB Initialization + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ + +#include "precomp.h" + +static INTERFACE_TABLE InterfaceTable[] = +{ + {&CLSID_SystemTuningSpaces, CTuningSpaceContainer_fnConstructor}, + {NULL, NULL} +}; + +extern "C" +BOOL +WINAPI +DllMain( + HINSTANCE hInstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + CoInitialize(NULL); + +#ifdef MSDVBNP_TRACE + OutputDebugStringW(L"MSVIDCTL::DllMain()\n"); +#endif + + DisableThreadLibraryCalls(hInstDLL); + break; + default: + break; + } + + return TRUE; +} + + +extern "C" +KSDDKAPI +HRESULT +WINAPI +DllUnregisterServer(void) +{ + return S_OK; +} + +extern "C" +KSDDKAPI +HRESULT +WINAPI +DllRegisterServer(void) +{ + return S_OK; +} + +KSDDKAPI +HRESULT +WINAPI +DllGetClassObject( + REFCLSID rclsid, + REFIID riid, + LPVOID *ppv) +{ + UINT i; + HRESULT hres = E_OUTOFMEMORY; + IClassFactory * pcf = NULL; + + if (!ppv) + return E_INVALIDARG; + + *ppv = NULL; + + for (i = 0; InterfaceTable[i].riid; i++) + { + if (IsEqualIID(*InterfaceTable[i].riid, rclsid)) + { + pcf = CClassFactory_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL); + break; + } + } + + if (!pcf) + { + return CLASS_E_CLASSNOTAVAILABLE; + } + + hres = pcf->QueryInterface(riid, ppv); + pcf->Release(); + + return hres; +} + +KSDDKAPI +HRESULT +WINAPI +DllCanUnloadNow(void) +{ + return S_OK; +} diff --git a/reactos/dll/directx/msvidctl/msvidctl.rbuild b/reactos/dll/directx/msvidctl/msvidctl.rbuild new file mode 100644 index 00000000000..a3da3fcbe09 --- /dev/null +++ b/reactos/dll/directx/msvidctl/msvidctl.rbuild @@ -0,0 +1,30 @@ + + + + + + . + ntdll + kernel32 + advapi32 + ole32 + advapi32 + msvcrt + strmiids + + -fno-exceptions + -fno-rtti + + + /GR- + + + classfactory.cpp + enumtuningspaces.cpp + msvidctl.cpp + msvidctl.rc + tunerequest.cpp + tuningspace.cpp + tuningspace_container.cpp + + diff --git a/reactos/dll/directx/msvidctl/msvidctl.rc b/reactos/dll/directx/msvidctl/msvidctl.rc new file mode 100644 index 00000000000..43187901fe4 --- /dev/null +++ b/reactos/dll/directx/msvidctl/msvidctl.rc @@ -0,0 +1,12 @@ +#include + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS ActiveX Control for Streaming Video\0" +#define REACTOS_STR_INTERNAL_NAME "MSVidCtl\0" +#define REACTOS_STR_ORIGINAL_FILENAME "MSVidCtl\0" +#define REACTOS_STR_PRODUCT_VERSION "6.05.2600.3264\0" +#define REACTOS_STR_FILE_VERSION "6.05.2600.3264\0" + +#include diff --git a/reactos/dll/directx/msvidctl/msvidctl.spec b/reactos/dll/directx/msvidctl/msvidctl.spec new file mode 100644 index 00000000000..5baed04ed66 --- /dev/null +++ b/reactos/dll/directx/msvidctl/msvidctl.spec @@ -0,0 +1,4 @@ +@ stdcall DllCanUnloadNow() +@ stdcall DllGetClassObject(ptr ptr ptr) +@ stdcall DllRegisterServer() +@ stdcall DllUnregisterServer() diff --git a/reactos/dll/directx/msvidctl/precomp.h b/reactos/dll/directx/msvidctl/precomp.h new file mode 100644 index 00000000000..a5b86272e2d --- /dev/null +++ b/reactos/dll/directx/msvidctl/precomp.h @@ -0,0 +1,72 @@ +#ifndef PRECOMP_H__ +#define PRECOMP_H__ + +#define MSVIDCTL_TRACE +#define BUILDING_KS +#define _KSDDK_ +#include +//#include +#include +#define __STREAMS__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject); + +typedef struct +{ + const GUID* riid; + LPFNCREATEINSTANCE lpfnCI; +} INTERFACE_TABLE; + +/* classfactory.cpp */ +IClassFactory * +CClassFactory_fnConstructor( + LPFNCREATEINSTANCE lpfnCI, + PLONG pcRefDll, + IID * riidInst); + +/* tuningspace_container.cpp */ +HRESULT +WINAPI +CTuningSpaceContainer_fnConstructor( + IUnknown *pUnknown, + REFIID riid, + LPVOID * ppv); + +/* tuningspace.cpp */ +HRESULT +WINAPI +CTuningSpace_fnConstructor( + IUnknown *pUnknown, + REFIID riid, + LPVOID * ppv); + +/* tunerequest.cpp */ +HRESULT +WINAPI +CTuneRequest_fnConstructor( + IUnknown *pUnknown, + ITuningSpace * TuningSpace, + REFIID riid, + LPVOID * ppv); + +/* enumtuningspaces.cpp */ +HRESULT +WINAPI +CEnumTuningSpaces_fnConstructor( + IUnknown *pUnknown, + REFIID riid, + LPVOID * ppv); + + + +#endif diff --git a/reactos/dll/directx/msvidctl/tunerequest.cpp b/reactos/dll/directx/msvidctl/tunerequest.cpp new file mode 100644 index 00000000000..3bee7cfc194 --- /dev/null +++ b/reactos/dll/directx/msvidctl/tunerequest.cpp @@ -0,0 +1,331 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/msvidctl/tuningspace.cpp + * PURPOSE: ITuningRequest interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +class CTuneRequest : public IDVBTuneRequest +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + OutputDebugStringW(L"CTuneRequest::Release : delete\n"); + + WCHAR Buffer[100]; + swprintf(Buffer, L"CTuneRequest::Release : m_TuningSpace %p delete\n", m_TuningSpace); + OutputDebugStringW(Buffer); + + + m_TuningSpace->Release(); + //delete this; + return 0; + } + return m_Ref; + } + + //IDispatch methods + HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); + HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); + HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); + HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); + + //ITuneRequest methods + HRESULT STDMETHODCALLTYPE get_TuningSpace(ITuningSpace **TuningSpace); + HRESULT STDMETHODCALLTYPE get_Components(IComponents **Components); + HRESULT STDMETHODCALLTYPE Clone(ITuneRequest **NewTuneRequest); + HRESULT STDMETHODCALLTYPE get_Locator(ILocator **Locator); + HRESULT STDMETHODCALLTYPE put_Locator(ILocator *Locator); + + //IDVBTuneRequest methods + HRESULT STDMETHODCALLTYPE get_ONID(long *ONID); + HRESULT STDMETHODCALLTYPE put_ONID(long ONID); + HRESULT STDMETHODCALLTYPE get_TSID(long *TSID); + HRESULT STDMETHODCALLTYPE put_TSID(long TSID); + HRESULT STDMETHODCALLTYPE get_SID(long *SID); + HRESULT STDMETHODCALLTYPE put_SID(long SID); + + CTuneRequest(ITuningSpace * TuningSpace) : m_Ref(0), m_ONID(-1), m_TSID(-1), m_SID(-1), m_Locator(0), m_TuningSpace(TuningSpace) + { + m_TuningSpace->AddRef(); + }; + + CTuneRequest(ITuningSpace * TuningSpace, LONG ONID, LONG TSID, LONG SID, ILocator * Locator) : m_Ref(1), m_ONID(ONID), m_TSID(TSID), m_SID(SID), m_Locator(Locator), m_TuningSpace(TuningSpace) + { + if (m_Locator) + m_Locator->AddRef(); + + m_TuningSpace->AddRef(); + }; + + virtual ~CTuneRequest(){}; + +protected: + LONG m_Ref; + LONG m_ONID; + LONG m_TSID; + LONG m_SID; + ILocator * m_Locator; + ITuningSpace * m_TuningSpace; +}; + + +HRESULT +STDMETHODCALLTYPE +CTuneRequest::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_ITuneRequest)) + { + *Output = (ITuneRequest*)this; + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IDVBTuneRequest)) + { + *Output = (IDVBTuneRequest*)this; + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CTuneRequest::QueryInterface: NoInterface for %s", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IDispatch methods +// +HRESULT +STDMETHODCALLTYPE +CTuneRequest::GetTypeInfoCount(UINT *pctinfo) +{ + OutputDebugStringW(L"CTuneRequest::GetTypeInfoCount : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuneRequest::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + OutputDebugStringW(L"CTuneRequest::GetTypeInfo : NotImplemented\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CTuneRequest::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + OutputDebugStringW(L"CTuneRequest::GetIDsOfNames : NotImplemented\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CTuneRequest::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + OutputDebugStringW(L"CTuneRequest::Invoke : NotImplemented\n"); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// ITuneRequest interface +// + +HRESULT +STDMETHODCALLTYPE +CTuneRequest::get_TuningSpace(ITuningSpace **TuningSpace) +{ +#ifdef MSVIDCTL_TRACE + OutputDebugStringW(L"CTuneRequest::get_TuningSpace\n"); +#endif + + *TuningSpace = m_TuningSpace; + m_TuningSpace->AddRef(); + + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CTuneRequest::get_Components(IComponents **Components) +{ + OutputDebugStringW(L"CTuneRequest::get_Components : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuneRequest::Clone(ITuneRequest **NewTuneRequest) +{ +#ifdef MSVIDCTL_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CTuneRequest::Clone %p\n", NewTuneRequest); + OutputDebugStringW(Buffer); +#endif + + *NewTuneRequest = new CTuneRequest(m_TuningSpace, m_ONID, m_TSID, m_SID, m_Locator); + + if (!*NewTuneRequest) + return E_OUTOFMEMORY; + + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CTuneRequest::get_Locator(ILocator **Locator) +{ + OutputDebugStringW(L"CTuneRequest::get_Locator : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuneRequest::put_Locator(ILocator *Locator) +{ + OutputDebugStringW(L"CTuneRequest::put_Locator : stub\n"); + m_Locator = Locator; + + return S_OK; +} + +//------------------------------------------------------------------- +// IDVBTuneRequest interface +// + +HRESULT +STDMETHODCALLTYPE +CTuneRequest::get_ONID(long *ONID) +{ +#ifdef MSVIDCTL_TRACE + OutputDebugStringW(L"CTuneRequest::get_ONID\n"); +#endif + + *ONID = m_ONID; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CTuneRequest::put_ONID(long ONID) +{ +#ifdef MSVIDCTL_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CTuneRequest::put_ONID : %lu\n", ONID); + OutputDebugStringW(Buffer); +#endif + + m_ONID = ONID; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CTuneRequest::get_TSID(long *TSID) +{ +#ifdef MSVIDCTL_TRACE + OutputDebugStringW(L"CTuneRequest::get_TSID\n"); +#endif + + *TSID = m_TSID; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CTuneRequest::put_TSID(long TSID) +{ +#ifdef MSVIDCTL_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CTuneRequest::put_TSID : %lu\n", TSID); + OutputDebugStringW(Buffer); +#endif + + m_TSID = TSID; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CTuneRequest::get_SID(long *SID) +{ +#ifdef MSVIDCTL_TRACE + OutputDebugStringW(L"CTuneRequest::get_SID\n"); +#endif + + *SID = m_SID; + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CTuneRequest::put_SID(long SID) +{ +#ifdef MSVIDCTL_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CTuneRequest::put_SID : %lu\n", SID); + OutputDebugStringW(Buffer); +#endif + + m_SID = SID; + return S_OK; +} + +HRESULT +WINAPI +CTuneRequest_fnConstructor( + IUnknown *pUnknown, + ITuningSpace * TuningSpace, + REFIID riid, + LPVOID * ppv) +{ + // construct device control + CTuneRequest * request = new CTuneRequest(TuningSpace); + +#ifdef MSVIDCTL_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(riid, &lpstr); + swprintf(Buffer, L"CTuneRequest_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); + OutputDebugStringW(Buffer); +#endif + + if (!request) + return E_OUTOFMEMORY; + + if (FAILED(request->QueryInterface(riid, ppv))) + { + /* not supported */ + delete request; + return E_NOINTERFACE; + } + + return NOERROR; +} diff --git a/reactos/dll/directx/msvidctl/tuningspace.cpp b/reactos/dll/directx/msvidctl/tuningspace.cpp new file mode 100644 index 00000000000..035542e595d --- /dev/null +++ b/reactos/dll/directx/msvidctl/tuningspace.cpp @@ -0,0 +1,365 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/msvidctl/tuningspace.cpp + * PURPOSE: ITuningSpace interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#include "precomp.h" + +const GUID CLSID_DVBTNetworkProvider = {0x216c62df, 0x6d7f, 0x4e9a, {0x85, 0x71, 0x5, 0xf1, 0x4e, 0xdb, 0x76, 0x6a}}; + +class CTuningSpace : public IDVBTuningSpace +{ +public: + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + + WCHAR Buffer[100]; + swprintf(Buffer, L"CTuningSpace::Release : %p Ref %lu\n", this, m_Ref); + OutputDebugStringW(Buffer); + + if (!m_Ref) + { + //delete this; + return 0; + } + return m_Ref; + } + + // IDispatch methods + HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); + HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); + HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); + HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); + + + //ITuningSpace methods + HRESULT STDMETHODCALLTYPE get_UniqueName(BSTR *Name); + HRESULT STDMETHODCALLTYPE put_UniqueName(BSTR Name); + HRESULT STDMETHODCALLTYPE get_FriendlyName(BSTR *Name); + HRESULT STDMETHODCALLTYPE put_FriendlyName(BSTR Name); + HRESULT STDMETHODCALLTYPE get_CLSID(BSTR *SpaceCLSID); + HRESULT STDMETHODCALLTYPE get_NetworkType(BSTR *NetworkTypeGuid); + HRESULT STDMETHODCALLTYPE put_NetworkType(BSTR NetworkTypeGuid); + HRESULT STDMETHODCALLTYPE get__NetworkType(GUID *NetworkTypeGuid); + HRESULT STDMETHODCALLTYPE put__NetworkType(REFCLSID NetworkTypeGuid); + HRESULT STDMETHODCALLTYPE CreateTuneRequest(ITuneRequest **TuneRequest); + HRESULT STDMETHODCALLTYPE EnumCategoryGUIDs(IEnumGUID **ppEnum); + HRESULT STDMETHODCALLTYPE EnumDeviceMonikers(IEnumMoniker **ppEnum); + HRESULT STDMETHODCALLTYPE get_DefaultPreferredComponentTypes(IComponentTypes **ComponentTypes); + HRESULT STDMETHODCALLTYPE put_DefaultPreferredComponentTypes(IComponentTypes *NewComponentTypes); + HRESULT STDMETHODCALLTYPE get_FrequencyMapping(BSTR *pMapping); + HRESULT STDMETHODCALLTYPE put_FrequencyMapping(BSTR Mapping); + HRESULT STDMETHODCALLTYPE get_DefaultLocator(ILocator **LocatorVal); + HRESULT STDMETHODCALLTYPE put_DefaultLocator(ILocator *LocatorVal); + HRESULT STDMETHODCALLTYPE Clone(ITuningSpace **NewTS); + // IDVBTuningSpace + HRESULT STDMETHODCALLTYPE get_SystemType(DVBSystemType *SysType); + HRESULT STDMETHODCALLTYPE put_SystemType(DVBSystemType SysType); + + CTuningSpace() : m_Ref(0){}; + + virtual ~CTuningSpace(){}; + +protected: + LONG m_Ref; +}; + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_ITuningSpace)) + { + *Output = (ITuningSpace*)this; + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_IDVBTuningSpace)) + { + *Output = (IDVBTuningSpace*)this; + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CTuningSpace::QueryInterface: NoInterface for %s", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IDispatch methods +// +HRESULT +STDMETHODCALLTYPE +CTuningSpace::GetTypeInfoCount(UINT *pctinfo) +{ + OutputDebugStringW(L"CTuningSpace::GetTypeInfoCount : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + OutputDebugStringW(L"CTuningSpace::GetTypeInfo : NotImplemented\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CTuningSpace::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + OutputDebugStringW(L"CTuningSpace::GetIDsOfNames : NotImplemented\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CTuningSpace::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + OutputDebugStringW(L"CTuningSpace::Invoke : NotImplemented\n"); + return E_NOTIMPL; +} + + +//------------------------------------------------------------------- +// ITuningSpace interface +// + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::get_UniqueName(BSTR *Name) +{ + OutputDebugStringW(L"CTuningSpace::get_UniqueName : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::put_UniqueName(BSTR Name) +{ + OutputDebugStringW(L"CTuningSpace::put_UniqueName : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::get_FriendlyName(BSTR *Name) +{ + OutputDebugStringW(L"CTuningSpace::get_FriendlyName : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::put_FriendlyName(BSTR Name) +{ + OutputDebugStringW(L"CTuningSpace::put_FriendlyName : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::get_CLSID(BSTR *SpaceCLSID) +{ + OutputDebugStringW(L"CTuningSpace::get_CLSID : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::get_NetworkType(BSTR *NetworkTypeGuid) +{ + OutputDebugStringW(L"CTuningSpace::get_NetworkType : stub\n"); + return StringFromCLSID(CLSID_DVBTNetworkProvider, (LPOLESTR*)NetworkTypeGuid); + +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::put_NetworkType(BSTR NetworkTypeGuid) +{ + OutputDebugStringW(L"CTuningSpace::put_NetworkType : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::get__NetworkType(GUID *NetworkTypeGuid) +{ +#ifdef MSVIDCTL_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CTuningSpace::get__NetworkType : %p stub\n", NetworkTypeGuid); + OutputDebugStringW(Buffer); +#endif + + CopyMemory(NetworkTypeGuid, &CLSID_DVBTNetworkProvider, sizeof(GUID)); + OutputDebugStringW(L"CTuningSpace::get__NetworkType : done\n"); + return S_OK; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::put__NetworkType(REFCLSID NetworkTypeGuid) +{ + OutputDebugStringW(L"CTuningSpace::put__NetworkType : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::CreateTuneRequest(ITuneRequest **TuneRequest) +{ + OutputDebugStringW(L"CTuningSpace::CreateTuneRequest : stub\n"); + return CTuneRequest_fnConstructor(NULL, (ITuningSpace*)this, IID_ITuneRequest, (void**)TuneRequest); +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::EnumCategoryGUIDs(IEnumGUID **ppEnum) +{ + OutputDebugStringW(L"CTuningSpace::EnumCategoryGUIDs : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::EnumDeviceMonikers(IEnumMoniker **ppEnum) +{ + OutputDebugStringW(L"CTuningSpace::EnumDeviceMonikers : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::get_DefaultPreferredComponentTypes(IComponentTypes **ComponentTypes) +{ + OutputDebugStringW(L"CTuningSpace::get_DefaultPreferredComponentTypes : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::put_DefaultPreferredComponentTypes(IComponentTypes *NewComponentTypes) +{ + OutputDebugStringW(L"CTuningSpace::put_DefaultPreferredComponentTypes : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::get_FrequencyMapping(BSTR *pMapping) +{ + OutputDebugStringW(L"CTuningSpace::get_FrequencyMapping : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::put_FrequencyMapping(BSTR Mapping) +{ + OutputDebugStringW(L"CTuningSpace::put_FrequencyMapping : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::get_DefaultLocator(ILocator **LocatorVal) +{ + OutputDebugStringW(L"CTuningSpace::get_DefaultLocator : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::put_DefaultLocator(ILocator *LocatorVal) +{ + OutputDebugStringW(L"CTuningSpace::put_DefaultLocator : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::Clone(ITuningSpace **NewTS) +{ + OutputDebugStringW(L"CTuningSpace::Clone : NotImplemented\n"); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// IDVBTuningSpace +// +HRESULT +STDMETHODCALLTYPE +CTuningSpace::get_SystemType(DVBSystemType *SysType) +{ + OutputDebugStringW(L"CTuningSpace::get_SystemType : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpace::put_SystemType(DVBSystemType SysType) +{ + OutputDebugStringW(L"CTuningSpace::put_SystemType : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +WINAPI +CTuningSpace_fnConstructor( + IUnknown *pUnknown, + REFIID riid, + LPVOID * ppv) +{ + // construct device control + CTuningSpace * space = new CTuningSpace(); + +#ifdef MSVIDCTL_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(riid, &lpstr); + swprintf(Buffer, L"CTuningSpace_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); + OutputDebugStringW(Buffer); +#endif + + if (!space) + return E_OUTOFMEMORY; + + if (FAILED(space->QueryInterface(riid, ppv))) + { + /* not supported */ + delete space; + return E_NOINTERFACE; + } + + return NOERROR; +} + + diff --git a/reactos/dll/directx/msvidctl/tuningspace_container.cpp b/reactos/dll/directx/msvidctl/tuningspace_container.cpp new file mode 100644 index 00000000000..e25fdc7a600 --- /dev/null +++ b/reactos/dll/directx/msvidctl/tuningspace_container.cpp @@ -0,0 +1,272 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS BDA Proxy + * FILE: dll/directx/msvidctl/tuningspace_container.cpp + * PURPOSE: ITuningSpaceContainer interface + * + * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) + */ +#define _FORCENAMELESSUNION +#include "precomp.h" + + +class CTuningSpaceContainer : public ITuningSpaceContainer +{ +public: + + STDMETHODIMP QueryInterface( REFIID InterfaceId, PVOID* Interface); + + STDMETHODIMP_(ULONG) AddRef() + { + InterlockedIncrement(&m_Ref); + return m_Ref; + } + STDMETHODIMP_(ULONG) Release() + { + InterlockedDecrement(&m_Ref); + if (!m_Ref) + { + OutputDebugStringW(L"CTuningSpaceContainer::Release : delete\n"); + //delete this; + return 0; + } + return m_Ref; + } + + // IDispatch methods + HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo); + HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo); + HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId); + HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); + + //ITuningSpaceContainer methods + HRESULT STDMETHODCALLTYPE get_Count(long *Count); + HRESULT STDMETHODCALLTYPE get__NewEnum(IEnumVARIANT **NewEnum); + HRESULT STDMETHODCALLTYPE get_Item(VARIANT varIndex, ITuningSpace **TuningSpace); + HRESULT STDMETHODCALLTYPE put_Item(VARIANT varIndex, ITuningSpace *TuningSpace); + HRESULT STDMETHODCALLTYPE TuningSpacesForCLSID(BSTR SpaceCLSID, ITuningSpaces **NewColl); + HRESULT STDMETHODCALLTYPE _TuningSpacesForCLSID(REFCLSID SpaceCLSID, ITuningSpaces **NewColl); + HRESULT STDMETHODCALLTYPE TuningSpacesForName(BSTR Name, ITuningSpaces **NewColl); + HRESULT STDMETHODCALLTYPE FindID(ITuningSpace *TuningSpace, long *ID); + HRESULT STDMETHODCALLTYPE Add(ITuningSpace *TuningSpace, VARIANT *NewIndex); + HRESULT STDMETHODCALLTYPE get_EnumTuningSpaces(IEnumTuningSpaces **ppEnum); + HRESULT STDMETHODCALLTYPE Remove(VARIANT Index); + HRESULT STDMETHODCALLTYPE get_MaxCount(long *MaxCount); + HRESULT STDMETHODCALLTYPE put_MaxCount(long MaxCount); + + CTuningSpaceContainer() : m_Ref(0){}; + + virtual ~CTuningSpaceContainer(){}; + +protected: + LONG m_Ref; + +}; + +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::QueryInterface( + IN REFIID refiid, + OUT PVOID* Output) +{ + if (IsEqualGUID(refiid, IID_IUnknown)) + { + *Output = PVOID(this); + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + if (IsEqualGUID(refiid, IID_ITuningSpaceContainer)) + { + *Output = (ITuningSpaceContainer*)this; + reinterpret_cast(*Output)->AddRef(); + return NOERROR; + } + + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(refiid, &lpstr); + swprintf(Buffer, L"CTuningSpaceContainer::QueryInterface: NoInterface for %s", lpstr); + OutputDebugStringW(Buffer); + CoTaskMemFree(lpstr); + + + return E_NOINTERFACE; +} + +//------------------------------------------------------------------- +// IDispatch methods +// +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::GetTypeInfoCount(UINT *pctinfo) +{ + OutputDebugStringW(L"CTuningSpaceContainer::GetTypeInfoCount : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) +{ + OutputDebugStringW(L"CTuningSpaceContainer::GetTypeInfo : NotImplemented\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) +{ + OutputDebugStringW(L"CTuningSpaceContainer::GetIDsOfNames : NotImplemented\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + OutputDebugStringW(L"CTuningSpaceContainer::Invoke : NotImplemented\n"); + return E_NOTIMPL; +} + +//------------------------------------------------------------------- +// ITuningSpaceContainer methods +// + +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::get_Count(long *Count) +{ + OutputDebugStringW(L"CTuningSpaceContainer::get_Count : NotImplemented\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::get__NewEnum(IEnumVARIANT **NewEnum) +{ + OutputDebugStringW(L"CTuningSpaceContainer::get__NewEnum : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::get_Item(VARIANT varIndex, ITuningSpace **TuningSpace) +{ +#ifdef MSVIDCTL_TRACE + WCHAR Buffer[100]; + swprintf(Buffer, L"CTuningSpaceContainer::get_Item : type %x value %s stub\n", varIndex.vt, varIndex.bstrVal); + OutputDebugStringW(Buffer); +#endif + + return CTuningSpace_fnConstructor(NULL, IID_ITuningSpace, (void**)TuningSpace); +} +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::put_Item(VARIANT varIndex, ITuningSpace *TuningSpace) +{ + OutputDebugStringW(L"CTuningSpaceContainer::put_Item : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::TuningSpacesForCLSID(BSTR SpaceCLSID, ITuningSpaces **NewColl) +{ + OutputDebugStringW(L"CTuningSpaceContainer::TuningSpacesForCLSID : NotImplemented\n"); + return E_NOTIMPL; +} +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::_TuningSpacesForCLSID(REFCLSID SpaceCLSID, ITuningSpaces **NewColl) +{ + OutputDebugStringW(L"CTuningSpaceContainer::_TuningSpacesForCLSID : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::TuningSpacesForName(BSTR Name, ITuningSpaces **NewColl) +{ + OutputDebugStringW(L"CTuningSpaceContainer::TuningSpacesForName : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::FindID(ITuningSpace *TuningSpace, long *ID) +{ + OutputDebugStringW(L"CTuningSpaceContainer::FindID : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::Add(ITuningSpace *TuningSpace, VARIANT *NewIndex) +{ + OutputDebugStringW(L"CTuningSpaceContainer::Add : stub\n"); + TuningSpace->AddRef(); + NewIndex->vt = VT_BSTR; + InterlockedIncrement(&m_Ref); + return TuningSpace->get_FriendlyName(&NewIndex->bstrVal);; +} +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::get_EnumTuningSpaces(IEnumTuningSpaces **ppEnum) +{ + OutputDebugStringW(L"CTuningSpaceContainer::get_EnumTuningSpaces : stub\n"); + return CEnumTuningSpaces_fnConstructor(NULL, IID_IEnumTuningSpaces, (void**)ppEnum); +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::Remove(VARIANT Index) +{ + OutputDebugStringW(L"CTuningSpaceContainer::Remove: NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::get_MaxCount(long *MaxCount) +{ + OutputDebugStringW(L"CTuningSpaceContainer::get_MaxCount : NotImplemented\n"); + return E_NOTIMPL; +} + +HRESULT +STDMETHODCALLTYPE +CTuningSpaceContainer::put_MaxCount(long MaxCount) +{ + OutputDebugStringW(L"CTuningSpaceContainer::put_MaxCount : NotImplemented\n"); + return E_NOTIMPL; +} + + +HRESULT +WINAPI +CTuningSpaceContainer_fnConstructor( + IUnknown *pUnknown, + REFIID riid, + LPVOID * ppv) +{ + // construct device control + CTuningSpaceContainer * provider = new CTuningSpaceContainer(); + +#ifdef MSVIDCTL_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(riid, &lpstr); + swprintf(Buffer, L"CTuningSpaceContainer_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); + OutputDebugStringW(Buffer); +#endif + + if (!provider) + return E_OUTOFMEMORY; + + if (FAILED(provider->QueryInterface(riid, ppv))) + { + /* not supported */ + delete provider; + return E_NOINTERFACE; + } + + return NOERROR; +} \ No newline at end of file diff --git a/reactos/dll/directx/qedit/main.c b/reactos/dll/directx/qedit/main.c index df00137647b..ede377fb579 100644 --- a/reactos/dll/directx/qedit/main.c +++ b/reactos/dll/directx/qedit/main.c @@ -53,6 +53,7 @@ struct object_creation_info static const struct object_creation_info object_creation[] = { { &CLSID_MediaDet, MediaDet_create }, + { &CLSID_SampleGrabber, SampleGrabber_create }, }; static HRESULT WINAPI diff --git a/reactos/dll/directx/qedit/mediadet.c b/reactos/dll/directx/qedit/mediadet.c index 2cf37f96a88..3a13f717bf6 100644 --- a/reactos/dll/directx/qedit/mediadet.c +++ b/reactos/dll/directx/qedit/mediadet.c @@ -112,7 +112,7 @@ static HRESULT WINAPI MediaDet_put_Filter(IMediaDet* iface, IUnknown *newVal) return E_NOTIMPL; } -static HRESULT WINAPI MediaDet_get_OutputStreams(IMediaDet* iface, long *pVal) +static HRESULT WINAPI MediaDet_get_OutputStreams(IMediaDet* iface, LONG *pVal) { MediaDetImpl *This = (MediaDetImpl *)iface; IEnumPins *pins; @@ -156,7 +156,7 @@ static HRESULT WINAPI MediaDet_get_OutputStreams(IMediaDet* iface, long *pVal) return S_OK; } -static HRESULT WINAPI MediaDet_get_CurrentStream(IMediaDet* iface, long *pVal) +static HRESULT WINAPI MediaDet_get_CurrentStream(IMediaDet* iface, LONG *pVal) { MediaDetImpl *This = (MediaDetImpl *)iface; TRACE("(%p)\n", This); @@ -209,16 +209,16 @@ static HRESULT SetCurPin(MediaDetImpl *This, long strm) return S_OK; } -static HRESULT WINAPI MediaDet_put_CurrentStream(IMediaDet* iface, long newVal) +static HRESULT WINAPI MediaDet_put_CurrentStream(IMediaDet* iface, LONG newVal) { MediaDetImpl *This = (MediaDetImpl *)iface; HRESULT hr; - TRACE("(%p)->(%ld)\n", This, newVal); + TRACE("(%p)->(%d)\n", This, newVal); if (This->num_streams == -1) { - long n; + LONG n; hr = MediaDet_get_OutputStreams(iface, &n); if (FAILED(hr)) return hr; @@ -310,7 +310,11 @@ static HRESULT GetFilterInfo(IMoniker *pMoniker, GUID *pclsid, VARIANT *pvar) hr = IPropertyBag_Read(pPropBagCat, wszClsidName, pvar, NULL); if (SUCCEEDED(hr)) + { hr = CLSIDFromString(V_UNION(pvar, bstrVal), pclsid); + VariantClear(pvar); + V_VT(pvar) = VT_BSTR; + } if (SUCCEEDED(hr)) hr = IPropertyBag_Read(pPropBagCat, wszFriendlyName, pvar, NULL); @@ -387,10 +391,14 @@ static HRESULT GetSplitter(MediaDetImpl *This) hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void **) &splitter); if (FAILED(hr)) + { + VariantClear(&var); return hr; + } hr = IGraphBuilder_AddFilter(This->graph, splitter, V_UNION(&var, bstrVal)); + VariantClear(&var); if (FAILED(hr)) { IBaseFilter_Release(splitter); @@ -461,21 +469,21 @@ static HRESULT WINAPI MediaDet_put_Filename(IMediaDet* iface, BSTR newVal) static HRESULT WINAPI MediaDet_GetBitmapBits(IMediaDet* iface, double StreamTime, - long *pBufferSize, char *pBuffer, - long Width, long Height) + LONG *pBufferSize, char *pBuffer, + LONG Width, LONG Height) { MediaDetImpl *This = (MediaDetImpl *)iface; - FIXME("(%p)->(%f %p %p %ld %ld): not implemented!\n", This, StreamTime, pBufferSize, pBuffer, + FIXME("(%p)->(%f %p %p %d %d): not implemented!\n", This, StreamTime, pBufferSize, pBuffer, Width, Height); return E_NOTIMPL; } static HRESULT WINAPI MediaDet_WriteBitmapBits(IMediaDet* iface, - double StreamTime, long Width, - long Height, BSTR Filename) + double StreamTime, LONG Width, + LONG Height, BSTR Filename) { MediaDetImpl *This = (MediaDetImpl *)iface; - FIXME("(%p)->(%f %ld %ld %p): not implemented!\n", This, StreamTime, Width, Height, Filename); + FIXME("(%p)->(%f %d %d %p): not implemented!\n", This, StreamTime, Width, Height, Filename); return E_NOTIMPL; } diff --git a/reactos/dll/directx/qedit/qedit.rbuild b/reactos/dll/directx/qedit/qedit.rbuild index 78f7a556612..f3285f4ef48 100644 --- a/reactos/dll/directx/qedit/qedit.rbuild +++ b/reactos/dll/directx/qedit/qedit.rbuild @@ -8,6 +8,7 @@ main.c mediadet.c regsvr.c + samplegrabber.c wine strmiids uuid diff --git a/reactos/dll/directx/qedit/qedit_private.h b/reactos/dll/directx/qedit/qedit_private.h index 87bcab012fe..cf4747f5f17 100644 --- a/reactos/dll/directx/qedit/qedit_private.h +++ b/reactos/dll/directx/qedit/qedit_private.h @@ -37,5 +37,6 @@ #include "qedit.h" HRESULT MediaDet_create(IUnknown *pUnkOuter, LPVOID *ppObj); +HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppObj); #endif /* __QEDIT_PRIVATE_INCLUDED__ */ diff --git a/reactos/dll/directx/qedit/regsvr.c b/reactos/dll/directx/qedit/regsvr.c index 9ff18528523..d70c8222ee8 100644 --- a/reactos/dll/directx/qedit/regsvr.c +++ b/reactos/dll/directx/qedit/regsvr.c @@ -294,6 +294,12 @@ static struct regsvr_coclass const coclass_list[] = { "qedit.dll", "Both" }, + { &CLSID_SampleGrabber, + "Sample Grabber", + NULL, + "qedit.dll", + "Both" + }, { NULL } /* list terminator */ }; diff --git a/reactos/dll/directx/qedit/samplegrabber.c b/reactos/dll/directx/qedit/samplegrabber.c new file mode 100644 index 00000000000..1875c51c49e --- /dev/null +++ b/reactos/dll/directx/qedit/samplegrabber.c @@ -0,0 +1,1475 @@ +/* DirectShow Sample Grabber object (QEDIT.DLL) + * + * Copyright 2009 Paul Chitescu + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" + +#include "qedit_private.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(qedit); + +static WCHAR const vendor_name[] = { 'W', 'i', 'n', 'e', 0 }; +static WCHAR const pin_in_name[] = { 'I', 'n', 0 }; +static WCHAR const pin_out_name[] = { 'O', 'u', 't', 0 }; + +IEnumPins *pinsenum_create(IBaseFilter *filter, IPin **pins, ULONG pinCount); +IEnumMediaTypes *mediaenum_create(const AM_MEDIA_TYPE *mtype); + +/* Fixed pins enumerator, holds filter referenced */ +typedef struct _PE_Impl { + IEnumPins pe; + IBaseFilter *filter; + LONG refCount; + ULONG numPins; + ULONG index; + IPin *pins[0]; +} PE_Impl; + + +/* IEnumPins interface implementation */ + +/* IUnknown */ +static ULONG WINAPI +Fixed_IEnumPins_AddRef(IEnumPins *iface) +{ + PE_Impl *This = (PE_Impl *)iface; + ULONG refCount = InterlockedIncrement(&This->refCount); + TRACE("(%p) new ref = %u\n", This, refCount); + return refCount; +} + +/* IUnknown */ +static ULONG WINAPI +Fixed_IEnumPins_Release(IEnumPins *iface) +{ + PE_Impl *This = (PE_Impl *)iface; + ULONG refCount = InterlockedDecrement(&This->refCount); + TRACE("(%p) new ref = %u\n", This, refCount); + if (refCount == 0) + { + IBaseFilter_Release(This->filter); + CoTaskMemFree(This); + return 0; + } + return refCount; +} + +/* IUnknown */ +static HRESULT WINAPI +Fixed_IEnumPins_QueryInterface(IEnumPins *iface, REFIID riid, void **ppvObject) +{ + PE_Impl *This = (PE_Impl *)iface; + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject); + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IEnumPins)) { + Fixed_IEnumPins_AddRef(iface); + *ppvObject = &(This->pins); + return S_OK; + } + *ppvObject = NULL; + WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject); + return E_NOINTERFACE; +} + +/* IEnumPins */ +static HRESULT WINAPI +Fixed_IEnumPins_Next(IEnumPins *iface, ULONG nPins, IPin **pins, ULONG *fetched) +{ + PE_Impl *This = (PE_Impl *)iface; + ULONG count = 0; + TRACE("(%p)->(%u, %p, %p) index = %u\n", This, nPins, pins, fetched, This->index); + if (!nPins) + return E_INVALIDARG; + if (!pins || ((nPins != 1) && !fetched)) + return E_POINTER; + while ((count < nPins) && (This->index < This->numPins)) { + IPin *pin = This->pins[This->index++]; + IPin_AddRef(pin); + pins[count++] = pin; + } + if (fetched) + *fetched = count; + return (count == nPins) ? S_OK : S_FALSE; +} + +/* IEnumPins */ +static HRESULT WINAPI +Fixed_IEnumPins_Skip(IEnumPins *iface, ULONG nPins) +{ + PE_Impl *This = (PE_Impl *)iface; + TRACE("(%p)->(%u) index = %u\n", This, nPins, This->index); + nPins += This->index; + if (nPins >= This->numPins) { + This->index = This->numPins; + return S_FALSE; + } + This->index = nPins; + return S_OK; +} + +/* IEnumPins */ +static HRESULT WINAPI +Fixed_IEnumPins_Reset(IEnumPins *iface) +{ + PE_Impl *This = (PE_Impl *)iface; + TRACE("(%p)->() index = %u\n", This, This->index); + This->index = 0; + return S_OK; +} + +/* IEnumPins */ +static HRESULT WINAPI +Fixed_IEnumPins_Clone(IEnumPins *iface, IEnumPins **pins) +{ + PE_Impl *This = (PE_Impl *)iface; + TRACE("(%p)->(%p) index = %u\n", This, pins, This->index); + if (!pins) + return E_POINTER; + *pins = pinsenum_create(This->filter, This->pins, This->numPins); + if (!*pins) + return E_OUTOFMEMORY; + ((PE_Impl *)*pins)->index = This->index; + return S_OK; +} + + +/* Virtual tables and constructor */ + +static const IEnumPinsVtbl IEnumPins_VTable = +{ + Fixed_IEnumPins_QueryInterface, + Fixed_IEnumPins_AddRef, + Fixed_IEnumPins_Release, + Fixed_IEnumPins_Next, + Fixed_IEnumPins_Skip, + Fixed_IEnumPins_Reset, + Fixed_IEnumPins_Clone, +}; + +IEnumPins *pinsenum_create(IBaseFilter *filter, IPin **pins, ULONG pinCount) +{ + ULONG len = sizeof(PE_Impl) + (pinCount * sizeof(IPin *)); + PE_Impl *obj = CoTaskMemAlloc(len); + if (obj) { + ULONG i; + ZeroMemory(obj, len); + obj->pe.lpVtbl = &IEnumPins_VTable; + obj->refCount = 1; + obj->filter = filter; + obj->numPins = pinCount; + obj->index = 0; + for (i=0; ipins[i] = pins[i]; + IBaseFilter_AddRef(filter); + } + return &obj->pe; +} + + +/* Single media type enumerator */ +typedef struct _ME_Impl { + IEnumMediaTypes me; + LONG refCount; + BOOL past; + AM_MEDIA_TYPE mtype; +} ME_Impl; + + +/* IEnumMediaTypes interface implementation */ + +/* IUnknown */ +static ULONG WINAPI +Single_IEnumMediaTypes_AddRef(IEnumMediaTypes *iface) +{ + ME_Impl *This = (ME_Impl *)iface; + ULONG refCount = InterlockedIncrement(&This->refCount); + TRACE("(%p) new ref = %u\n", This, refCount); + return refCount; +} + +/* IUnknown */ +static ULONG WINAPI +Single_IEnumMediaTypes_Release(IEnumMediaTypes *iface) +{ + ME_Impl *This = (ME_Impl *)iface; + ULONG refCount = InterlockedDecrement(&This->refCount); + TRACE("(%p) new ref = %u\n", This, refCount); + if (refCount == 0) + { + if (This->mtype.pbFormat) + CoTaskMemFree(This->mtype.pbFormat); + CoTaskMemFree(This); + return 0; + } + return refCount; +} + +/* IUnknown */ +static HRESULT WINAPI +Single_IEnumMediaTypes_QueryInterface(IEnumMediaTypes *iface, REFIID riid, void **ppvObject) +{ + ME_Impl *This = (ME_Impl *)iface; + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject); + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IEnumMediaTypes)) { + Single_IEnumMediaTypes_AddRef(iface); + *ppvObject = &(This->me); + return S_OK; + } + *ppvObject = NULL; + WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject); + return E_NOINTERFACE; +} + +/* IEnumMediaTypes */ +static HRESULT WINAPI +Single_IEnumMediaTypes_Next(IEnumMediaTypes *iface, ULONG nTypes, AM_MEDIA_TYPE **types, ULONG *fetched) +{ + ME_Impl *This = (ME_Impl *)iface; + ULONG count = 0; + TRACE("(%p)->(%u, %p, %p)\n", This, nTypes, types, fetched); + if (!nTypes) + return E_INVALIDARG; + if (!types || ((nTypes != 1) && !fetched)) + return E_POINTER; + if (!This->past && !IsEqualGUID(&This->mtype.majortype,&GUID_NULL)) { + AM_MEDIA_TYPE *mtype = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); + *mtype = This->mtype; + if (mtype->cbFormat) { + mtype->pbFormat = CoTaskMemAlloc(mtype->cbFormat); + CopyMemory(mtype->pbFormat, This->mtype.pbFormat, mtype->cbFormat); + } + *types = mtype; + This->past = TRUE; + count = 1; + } + if (fetched) + *fetched = count; + return (count == nTypes) ? S_OK : S_FALSE; +} + +/* IEnumMediaTypes */ +static HRESULT WINAPI +Single_IEnumMediaTypes_Skip(IEnumMediaTypes *iface, ULONG nTypes) +{ + ME_Impl *This = (ME_Impl *)iface; + TRACE("(%p)->(%u)\n", This, nTypes); + if (nTypes) + This->past = TRUE; + return This->past ? S_FALSE : S_OK; +} + +/* IEnumMediaTypes */ +static HRESULT WINAPI +Single_IEnumMediaTypes_Reset(IEnumMediaTypes *iface) +{ + ME_Impl *This = (ME_Impl *)iface; + TRACE("(%p)->()\n", This); + This->past = FALSE; + return S_OK; +} + +/* IEnumMediaTypes */ +static HRESULT WINAPI +Single_IEnumMediaTypes_Clone(IEnumMediaTypes *iface, IEnumMediaTypes **me) +{ + ME_Impl *This = (ME_Impl *)iface; + TRACE("(%p)->(%p)\n", This, me); + if (!me) + return E_POINTER; + *me = mediaenum_create(&This->mtype); + if (!*me) + return E_OUTOFMEMORY; + ((ME_Impl *)*me)->past = This->past; + return S_OK; +} + + +/* Virtual tables and constructor */ + +static const IEnumMediaTypesVtbl IEnumMediaTypes_VTable = +{ + Single_IEnumMediaTypes_QueryInterface, + Single_IEnumMediaTypes_AddRef, + Single_IEnumMediaTypes_Release, + Single_IEnumMediaTypes_Next, + Single_IEnumMediaTypes_Skip, + Single_IEnumMediaTypes_Reset, + Single_IEnumMediaTypes_Clone, +}; + +IEnumMediaTypes *mediaenum_create(const AM_MEDIA_TYPE *mtype) +{ + ME_Impl *obj = CoTaskMemAlloc(sizeof(ME_Impl)); + if (obj) { + ZeroMemory(obj, sizeof(ME_Impl)); + obj->me.lpVtbl = &IEnumMediaTypes_VTable; + obj->refCount = 1; + obj->past = FALSE; + if (mtype) { + obj->mtype = *mtype; + obj->mtype.pUnk = NULL; + if (mtype->cbFormat) { + obj->mtype.pbFormat = CoTaskMemAlloc(mtype->cbFormat); + CopyMemory(obj->mtype.pbFormat, mtype->pbFormat, mtype->cbFormat); + } + else + obj->mtype.pbFormat = NULL; + } + else + obj->mtype.majortype = GUID_NULL; + } + return &obj->me; +} + + +/* Sample Grabber pin implementation */ +typedef struct _SG_Pin { + const IPinVtbl* lpVtbl; + PIN_DIRECTION dir; + WCHAR const *name; + struct _SG_Impl *sg; + IPin *pair; +} SG_Pin; + +/* Sample Grabber filter implementation */ +typedef struct _SG_Impl { + const IBaseFilterVtbl* IBaseFilter_Vtbl; + const ISampleGrabberVtbl* ISampleGrabber_Vtbl; + const IMemInputPinVtbl* IMemInputPin_Vtbl; + /* TODO: IMediaPosition, IMediaSeeking, IQualityControl */ + LONG refCount; + CRITICAL_SECTION critSect; + FILTER_INFO info; + FILTER_STATE state; + AM_MEDIA_TYPE mtype; + SG_Pin pin_in; + SG_Pin pin_out; + IMemAllocator *allocator; + IReferenceClock *refClock; + IMemInputPin *memOutput; + ISampleGrabberCB *grabberIface; + LONG grabberMethod; + LONG oneShot; + LONG bufferLen; + void* bufferData; +} SG_Impl; + +enum { + OneShot_None, + OneShot_Wait, + OneShot_Past, +}; + +/* Get the SampleGrabber implementation This pointer from various interface pointers */ +static inline SG_Impl *impl_from_IBaseFilter(IBaseFilter *iface) +{ + return (SG_Impl *)((char*)iface - FIELD_OFFSET(SG_Impl, IBaseFilter_Vtbl)); +} + +static inline SG_Impl *impl_from_ISampleGrabber(ISampleGrabber *iface) +{ + return (SG_Impl *)((char*)iface - FIELD_OFFSET(SG_Impl, ISampleGrabber_Vtbl)); +} + +static inline SG_Impl *impl_from_IMemInputPin(IMemInputPin *iface) +{ + return (SG_Impl *)((char*)iface - FIELD_OFFSET(SG_Impl, IMemInputPin_Vtbl)); +} + + +/* Cleanup at end of life */ +static void SampleGrabber_cleanup(SG_Impl *This) +{ + TRACE("(%p)\n", This); + if (This->info.pGraph) + WARN("(%p) still joined to filter graph %p\n", This, This->info.pGraph); + if (This->allocator) + IMemAllocator_Release(This->allocator); + if (This->refClock) + IReferenceClock_Release(This->refClock); + if (This->memOutput) + IMemInputPin_Release(This->memOutput); + if (This->grabberIface) + ISampleGrabberCB_Release(This->grabberIface); + if (This->mtype.pbFormat) + CoTaskMemFree(This->mtype.pbFormat); + if (This->bufferData) + CoTaskMemFree(This->bufferData); + This->critSect.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->critSect); +} + +/* Common helper AddRef called from all interfaces */ +static ULONG SampleGrabber_addref(SG_Impl *This) +{ + ULONG refCount = InterlockedIncrement(&This->refCount); + TRACE("(%p) new ref = %u\n", This, refCount); + return refCount; +} + +/* Common helper Release called from all interfaces */ +static ULONG SampleGrabber_release(SG_Impl *This) +{ + ULONG refCount = InterlockedDecrement(&This->refCount); + TRACE("(%p) new ref = %u\n", This, refCount); + if (refCount == 0) + { + SampleGrabber_cleanup(This); + CoTaskMemFree(This); + return 0; + } + return refCount; +} + +/* Common helper QueryInterface called from all interfaces */ +static HRESULT SampleGrabber_query(SG_Impl *This, REFIID riid, void **ppvObject) +{ + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject); + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IPersist) || + IsEqualIID(riid, &IID_IMediaFilter) || + IsEqualIID(riid, &IID_IBaseFilter)) { + SampleGrabber_addref(This); + *ppvObject = &(This->IBaseFilter_Vtbl); + return S_OK; + } + else if (IsEqualIID(riid, &IID_ISampleGrabber)) { + SampleGrabber_addref(This); + *ppvObject = &(This->ISampleGrabber_Vtbl); + return S_OK; + } + else if (IsEqualIID(riid, &IID_IMemInputPin)) { + SampleGrabber_addref(This); + *ppvObject = &(This->IMemInputPin_Vtbl); + return S_OK; + } + else if (IsEqualIID(riid, &IID_IMediaPosition)) + FIXME("IMediaPosition not implemented\n"); + else if (IsEqualIID(riid, &IID_IMediaSeeking)) + FIXME("IMediaSeeking not implemented\n"); + else if (IsEqualIID(riid, &IID_IQualityControl)) + FIXME("IQualityControl not implemented\n"); + *ppvObject = NULL; + WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject); + return E_NOINTERFACE; +} + +/* Helper that buffers data and/or calls installed sample callbacks */ +static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample) +{ + double time = 0.0; + REFERENCE_TIME tStart, tEnd; + if (This->bufferLen >= 0) { + BYTE *data = 0; + long size = IMediaSample_GetActualDataLength(sample); + if (size >= 0 && SUCCEEDED(IMediaSample_GetPointer(sample, &data))) { + if (!data) + size = 0; + EnterCriticalSection(&This->critSect); + if (This->bufferLen != size) { + if (This->bufferData) + CoTaskMemFree(This->bufferData); + This->bufferData = size ? CoTaskMemAlloc(size) : NULL; + This->bufferLen = size; + } + if (size) + CopyMemory(This->bufferData, data, size); + LeaveCriticalSection(&This->critSect); + } + } + if (!This->grabberIface) + return; + if (SUCCEEDED(IMediaSample_GetTime(sample, &tStart, &tEnd))) + time = 1e-7 * tStart; + switch (This->grabberMethod) { + case 0: + { + ULONG ref = IMediaSample_AddRef(sample); + ISampleGrabberCB_SampleCB(This->grabberIface, time, sample); + ref = IMediaSample_Release(sample) + 1 - ref; + if (ref) + { + ERR("(%p) Callback referenced sample %p by %u\n", This, sample, ref); + /* ugly as hell but some apps are sooo buggy */ + while (ref--) + IMediaSample_Release(sample); + } + } + break; + case 1: + { + BYTE *data = 0; + long size = IMediaSample_GetActualDataLength(sample); + if (size && SUCCEEDED(IMediaSample_GetPointer(sample, &data)) && data) + ISampleGrabberCB_BufferCB(This->grabberIface, time, data, size); + } + break; + case -1: + break; + default: + FIXME("unsupported method %ld\n", (long int)This->grabberMethod); + /* do not bother us again */ + This->grabberMethod = -1; + } +} + + +/* SampleGrabber implementation of IBaseFilter interface */ + +/* IUnknown */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_QueryInterface(IBaseFilter *iface, REFIID riid, void **ppvObject) +{ + return SampleGrabber_query(impl_from_IBaseFilter(iface), riid, ppvObject); +} + +/* IUnknown */ +static ULONG WINAPI +SampleGrabber_IBaseFilter_AddRef(IBaseFilter *iface) +{ + return SampleGrabber_addref(impl_from_IBaseFilter(iface)); +} + +/* IUnknown */ +static ULONG WINAPI +SampleGrabber_IBaseFilter_Release(IBaseFilter *iface) +{ + return SampleGrabber_release(impl_from_IBaseFilter(iface)); +} + +/* IPersist */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_GetClassID(IBaseFilter *iface, CLSID *pClassID) +{ + TRACE("(%p)\n", pClassID); + if (!pClassID) + return E_POINTER; + *pClassID = CLSID_SampleGrabber; + return S_OK; +} + +/* IMediaFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_Stop(IBaseFilter *iface) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)\n", This); + This->state = State_Stopped; + return S_OK; +} + +/* IMediaFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_Pause(IBaseFilter *iface) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)\n", This); + This->state = State_Paused; + return S_OK; +} + +/* IMediaFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_Run(IBaseFilter *iface, REFERENCE_TIME tStart) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)\n", This); + This->state = State_Running; + return S_OK; +} + +/* IMediaFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_GetState(IBaseFilter *iface, DWORD msTout, FILTER_STATE *state) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)->(%u, %p)\n", This, msTout, state); + if (!state) + return E_POINTER; + *state = This->state; + return S_OK; +} + +/* IMediaFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_SetSyncSource(IBaseFilter *iface, IReferenceClock *clock) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)->(%p)\n", This, clock); + if (clock != This->refClock) + { + if (clock) + IReferenceClock_AddRef(clock); + if (This->refClock) + IReferenceClock_Release(This->refClock); + This->refClock = clock; + } + return S_OK; +} + +/* IMediaFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_GetSyncSource(IBaseFilter *iface, IReferenceClock **clock) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)->(%p)\n", This, clock); + if (!clock) + return E_POINTER; + if (This->refClock) + IReferenceClock_AddRef(This->refClock); + *clock = This->refClock; + return S_OK; +} + +/* IBaseFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_EnumPins(IBaseFilter *iface, IEnumPins **pins) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + IPin *pin[2]; + TRACE("(%p)->(%p)\n", This, pins); + if (!pins) + return E_POINTER; + pin[0] = (IPin*)&This->pin_in.lpVtbl; + pin[1] = (IPin*)&This->pin_out.lpVtbl; + *pins = pinsenum_create(iface, pin, 2); + return *pins ? S_OK : E_OUTOFMEMORY; +} + +/* IBaseFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_FindPin(IBaseFilter *iface, LPCWSTR id, IPin **pin) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)->(%s, %p)\n", This, debugstr_w(id), pin); + if (!id || !pin) + return E_POINTER; + if (!lstrcmpiW(id,pin_in_name)) + { + SampleGrabber_addref(This); + *pin = (IPin*)&(This->pin_in.lpVtbl); + return S_OK; + } + else if (!lstrcmpiW(id,pin_out_name)) + { + SampleGrabber_addref(This); + *pin = (IPin*)&(This->pin_out.lpVtbl); + return S_OK; + } + *pin = NULL; + return VFW_E_NOT_FOUND; +} + +/* IBaseFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_QueryFilterInfo(IBaseFilter *iface, FILTER_INFO *info) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)->(%p)\n", This, info); + if (!info) + return E_POINTER; + if (This->info.pGraph) + IFilterGraph_AddRef(This->info.pGraph); + *info = This->info; + return S_OK; +} + +/* IBaseFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_JoinFilterGraph(IBaseFilter *iface, IFilterGraph *graph, LPCWSTR name) +{ + SG_Impl *This = impl_from_IBaseFilter(iface); + TRACE("(%p)->(%p, %s)\n", This, graph, debugstr_w(name)); + This->info.pGraph = graph; + if (name) + lstrcpynW(This->info.achName,name,MAX_FILTER_NAME); + This->oneShot = OneShot_None; + return S_OK; +} + +/* IBaseFilter */ +static HRESULT WINAPI +SampleGrabber_IBaseFilter_QueryVendorInfo(IBaseFilter *iface, LPWSTR *vendor) +{ + TRACE("(%p)\n", vendor); + if (!vendor) + return E_POINTER; + *vendor = CoTaskMemAlloc(sizeof(vendor_name)); + CopyMemory(*vendor, vendor_name, sizeof(vendor_name)); + return S_OK; +} + + +/* SampleGrabber implementation of ISampleGrabber interface */ + +/* IUnknown */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_QueryInterface(ISampleGrabber *iface, REFIID riid, void **ppvObject) +{ + return SampleGrabber_query(impl_from_ISampleGrabber(iface), riid, ppvObject); +} + +/* IUnknown */ +static ULONG WINAPI +SampleGrabber_ISampleGrabber_AddRef(ISampleGrabber *iface) +{ + return SampleGrabber_addref(impl_from_ISampleGrabber(iface)); +} + +/* IUnknown */ +static ULONG WINAPI +SampleGrabber_ISampleGrabber_Release(ISampleGrabber *iface) +{ + return SampleGrabber_release(impl_from_ISampleGrabber(iface)); +} + +/* ISampleGrabber */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_SetOneShot(ISampleGrabber *iface, BOOL oneShot) +{ + SG_Impl *This = impl_from_ISampleGrabber(iface); + TRACE("(%p)->(%u)\n", This, oneShot); + This->oneShot = oneShot ? OneShot_Wait : OneShot_None; + return S_OK; +} + +/* ISampleGrabber */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_SetMediaType(ISampleGrabber *iface, const AM_MEDIA_TYPE *type) +{ + SG_Impl *This = impl_from_ISampleGrabber(iface); + TRACE("(%p)->(%p)\n", This, type); + if (!type) + return E_POINTER; + TRACE("Media type: %s/%s ssize: %u format: %s (%u bytes)\n", + debugstr_guid(&type->majortype), debugstr_guid(&type->subtype), + type->lSampleSize, + debugstr_guid(&type->formattype), type->cbFormat); + if (This->mtype.pbFormat) + CoTaskMemFree(This->mtype.pbFormat); + This->mtype = *type; + This->mtype.pUnk = NULL; + if (type->cbFormat) { + This->mtype.pbFormat = CoTaskMemAlloc(type->cbFormat); + CopyMemory(This->mtype.pbFormat, type->pbFormat, type->cbFormat); + } + else + This->mtype.pbFormat = NULL; + return S_OK; +} + +/* ISampleGrabber */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_GetConnectedMediaType(ISampleGrabber *iface, AM_MEDIA_TYPE *type) +{ + SG_Impl *This = impl_from_ISampleGrabber(iface); + TRACE("(%p)->(%p)\n", This, type); + if (!type) + return E_POINTER; + if (!This->pin_in.pair) + return VFW_E_NOT_CONNECTED; + *type = This->mtype; + if (type->cbFormat) { + type->pbFormat = CoTaskMemAlloc(type->cbFormat); + CopyMemory(type->pbFormat, This->mtype.pbFormat, type->cbFormat); + } + return S_OK; +} + +/* ISampleGrabber */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_SetBufferSamples(ISampleGrabber *iface, BOOL bufferEm) +{ + SG_Impl *This = impl_from_ISampleGrabber(iface); + TRACE("(%p)->(%u)\n", This, bufferEm); + EnterCriticalSection(&This->critSect); + if (bufferEm) { + if (This->bufferLen < 0) + This->bufferLen = 0; + } + else + This->bufferLen = -1; + LeaveCriticalSection(&This->critSect); + return S_OK; +} + +/* ISampleGrabber */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_GetCurrentBuffer(ISampleGrabber *iface, LONG *bufSize, LONG *buffer) +{ + SG_Impl *This = impl_from_ISampleGrabber(iface); + HRESULT ret = S_OK; + TRACE("(%p)->(%p, %p)\n", This, bufSize, buffer); + if (!bufSize) + return E_POINTER; + EnterCriticalSection(&This->critSect); + if (!This->pin_in.pair) + ret = VFW_E_NOT_CONNECTED; + else if (This->bufferLen < 0) + ret = E_INVALIDARG; + else if (This->bufferLen == 0) + ret = VFW_E_WRONG_STATE; + else { + if (buffer) { + if (*bufSize >= This->bufferLen) + CopyMemory(buffer, This->bufferData, This->bufferLen); + else + ret = E_OUTOFMEMORY; + } + *bufSize = This->bufferLen; + } + LeaveCriticalSection(&This->critSect); + return ret; +} + +/* ISampleGrabber */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_GetCurrentSample(ISampleGrabber *iface, IMediaSample **sample) +{ + /* MS doesn't implement it either, noone should call it */ + WARN("(%p): not implemented\n", sample); + return E_NOTIMPL; +} + +/* ISampleGrabber */ +static HRESULT WINAPI +SampleGrabber_ISampleGrabber_SetCallback(ISampleGrabber *iface, ISampleGrabberCB *cb, LONG whichMethod) +{ + SG_Impl *This = impl_from_ISampleGrabber(iface); + TRACE("(%p)->(%p, %u)\n", This, cb, whichMethod); + if (This->grabberIface) + ISampleGrabberCB_Release(This->grabberIface); + This->grabberIface = cb; + This->grabberMethod = whichMethod; + if (cb) + ISampleGrabberCB_AddRef(cb); + return S_OK; +} + + +/* SampleGrabber implementation of IMemInputPin interface */ + +/* IUnknown */ +static HRESULT WINAPI +SampleGrabber_IMemInputPin_QueryInterface(IMemInputPin *iface, REFIID riid, void **ppvObject) +{ + return SampleGrabber_query(impl_from_IMemInputPin(iface), riid, ppvObject); +} + +/* IUnknown */ +static ULONG WINAPI +SampleGrabber_IMemInputPin_AddRef(IMemInputPin *iface) +{ + return SampleGrabber_addref(impl_from_IMemInputPin(iface)); +} + +/* IUnknown */ +static ULONG WINAPI +SampleGrabber_IMemInputPin_Release(IMemInputPin *iface) +{ + return SampleGrabber_release(impl_from_IMemInputPin(iface)); +} + +/* IMemInputPin */ +static HRESULT WINAPI +SampleGrabber_IMemInputPin_GetAllocator(IMemInputPin *iface, IMemAllocator **allocator) +{ + SG_Impl *This = impl_from_IMemInputPin(iface); + TRACE("(%p)->(%p) allocator = %p\n", This, allocator, This->allocator); + if (!allocator) + return E_POINTER; + *allocator = This->allocator; + if (!*allocator) + return VFW_E_NO_ALLOCATOR; + IMemAllocator_AddRef(*allocator); + return S_OK; +} + +/* IMemInputPin */ +static HRESULT WINAPI +SampleGrabber_IMemInputPin_NotifyAllocator(IMemInputPin *iface, IMemAllocator *allocator, BOOL readOnly) +{ + SG_Impl *This = impl_from_IMemInputPin(iface); + TRACE("(%p)->(%p, %u) allocator = %p\n", This, allocator, readOnly, This->allocator); + if (This->allocator == allocator) + return S_OK; + if (This->allocator) + IMemAllocator_Release(This->allocator); + This->allocator = allocator; + if (allocator) + IMemAllocator_AddRef(allocator); + return S_OK; +} + +/* IMemInputPin */ +static HRESULT WINAPI +SampleGrabber_IMemInputPin_GetAllocatorRequirements(IMemInputPin *iface, ALLOCATOR_PROPERTIES *props) +{ + SG_Impl *This = impl_from_IMemInputPin(iface); + FIXME("(%p)->(%p): semi-stub\n", This, props); + if (!props) + return E_POINTER; + return This->memOutput ? IMemInputPin_GetAllocatorRequirements(This->memOutput, props) : E_NOTIMPL; +} + +/* IMemInputPin */ +static HRESULT WINAPI +SampleGrabber_IMemInputPin_Receive(IMemInputPin *iface, IMediaSample *sample) +{ + SG_Impl *This = impl_from_IMemInputPin(iface); + HRESULT hr; + TRACE("(%p)->(%p) output = %p, grabber = %p\n", This, sample, This->memOutput, This->grabberIface); + if (!sample) + return E_POINTER; + if ((This->state != State_Running) || (This->oneShot == OneShot_Past)) + return S_FALSE; + SampleGrabber_callback(This, sample); + hr = This->memOutput ? IMemInputPin_Receive(This->memOutput, sample) : S_OK; + if (This->oneShot == OneShot_Wait) { + This->oneShot = OneShot_Past; + hr = S_FALSE; + if (This->pin_out.pair) + IPin_EndOfStream(This->pin_out.pair); + } + return hr; +} + +/* IMemInputPin */ +static HRESULT WINAPI +SampleGrabber_IMemInputPin_ReceiveMultiple(IMemInputPin *iface, IMediaSample **samples, LONG nSamples, LONG *nProcessed) +{ + SG_Impl *This = impl_from_IMemInputPin(iface); + LONG idx; + TRACE("(%p)->(%p, %u, %p) output = %p, grabber = %p\n", This, samples, nSamples, nProcessed, This->memOutput, This->grabberIface); + if (!samples || !nProcessed) + return E_POINTER; + if ((This->state != State_Running) || (This->oneShot == OneShot_Past)) + return S_FALSE; + for (idx = 0; idx < nSamples; idx++) + SampleGrabber_callback(This, samples[idx]); + return This->memOutput ? IMemInputPin_ReceiveMultiple(This->memOutput, samples, nSamples, nProcessed) : S_OK; +} + +/* IMemInputPin */ +static HRESULT WINAPI +SampleGrabber_IMemInputPin_ReceiveCanBlock(IMemInputPin *iface) +{ + SG_Impl *This = impl_from_IMemInputPin(iface); + TRACE("(%p)\n", This); + return This->memOutput ? IMemInputPin_ReceiveCanBlock(This->memOutput) : S_OK; +} + + +/* SampleGrabber member pin implementation */ + +/* IUnknown */ +static ULONG WINAPI +SampleGrabber_IPin_AddRef(IPin *iface) +{ + return SampleGrabber_addref(((SG_Pin *)iface)->sg); +} + +/* IUnknown */ +static ULONG WINAPI +SampleGrabber_IPin_Release(IPin *iface) +{ + return SampleGrabber_release(((SG_Pin *)iface)->sg); +} + +/* IUnknown */ +static HRESULT WINAPI +SampleGrabber_IPin_QueryInterface(IPin *iface, REFIID riid, void **ppvObject) +{ + SG_Pin *This = (SG_Pin *)iface; + TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObject); + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IPin)) { + SampleGrabber_addref(This->sg); + *ppvObject = This; + return S_OK; + } + else if (IsEqualIID(riid, &IID_IMemInputPin)) { + SampleGrabber_addref(This->sg); + *ppvObject = &(This->sg->IMemInputPin_Vtbl); + return S_OK; + } + *ppvObject = NULL; + WARN("(%p, %s,%p): not found\n", This, debugstr_guid(riid), ppvObject); + return E_NOINTERFACE; +} + +/* IPin - input pin */ +static HRESULT WINAPI +SampleGrabber_In_IPin_Connect(IPin *iface, IPin *receiver, const AM_MEDIA_TYPE *mtype) +{ + WARN("(%p, %p): unexpected\n", receiver, mtype); + return E_UNEXPECTED; +} + +/* IPin - output pin */ +static HRESULT WINAPI +SampleGrabber_Out_IPin_Connect(IPin *iface, IPin *receiver, const AM_MEDIA_TYPE *type) +{ + SG_Pin *This = (SG_Pin *)iface; + HRESULT hr; + TRACE("(%p)->(%p, %p)\n", This, receiver, type); + if (!receiver) + return E_POINTER; + if (This->pair) + return VFW_E_ALREADY_CONNECTED; + if (This->sg->state != State_Stopped) + return VFW_E_NOT_STOPPED; + if (type) { + TRACE("Media type: %s/%s ssize: %u format: %s (%u bytes)\n", + debugstr_guid(&type->majortype), debugstr_guid(&type->subtype), + type->lSampleSize, + debugstr_guid(&type->formattype), type->cbFormat); + if (!IsEqualGUID(&This->sg->mtype.majortype,&GUID_NULL) && + !IsEqualGUID(&This->sg->mtype.majortype,&type->majortype)) + return VFW_E_TYPE_NOT_ACCEPTED; + if (!IsEqualGUID(&This->sg->mtype.subtype,&MEDIASUBTYPE_None) && + !IsEqualGUID(&This->sg->mtype.subtype,&type->subtype)) + return VFW_E_TYPE_NOT_ACCEPTED; + if (!IsEqualGUID(&This->sg->mtype.formattype,&GUID_NULL) && + !IsEqualGUID(&This->sg->mtype.formattype,&FORMAT_None) && + !IsEqualGUID(&This->sg->mtype.formattype,&type->formattype)) + return VFW_E_TYPE_NOT_ACCEPTED; + } + else + type = &This->sg->mtype; + if (!IsEqualGUID(&type->formattype, &FORMAT_None) && + !IsEqualGUID(&type->formattype, &GUID_NULL) && + !type->pbFormat) + return VFW_E_TYPE_NOT_ACCEPTED; + hr = IPin_ReceiveConnection(receiver,(IPin*)&This->lpVtbl,type); + if (FAILED(hr)) + return hr; + This->pair = receiver; + if (This->sg->memOutput) { + IMemInputPin_Release(This->sg->memOutput); + This->sg->memOutput = NULL; + } + IPin_QueryInterface(receiver,&IID_IMemInputPin,(void **)&(This->sg->memOutput)); + TRACE("(%p) Accepted IPin %p, IMemInputPin %p\n", This, receiver, This->sg->memOutput); + return S_OK; +} + +/* IPin - input pin */ +static HRESULT WINAPI +SampleGrabber_In_IPin_ReceiveConnection(IPin *iface, IPin *connector, const AM_MEDIA_TYPE *type) +{ + SG_Pin *This = (SG_Pin *)iface; + TRACE("(%p)->(%p, %p)\n", This, connector, type); + if (!connector) + return E_POINTER; + if (This->pair) + return VFW_E_ALREADY_CONNECTED; + if (This->sg->state != State_Stopped) + return VFW_E_NOT_STOPPED; + if (type) { + TRACE("Media type: %s/%s ssize: %u format: %s (%u bytes)\n", + debugstr_guid(&type->majortype), debugstr_guid(&type->subtype), + type->lSampleSize, + debugstr_guid(&type->formattype), type->cbFormat); + if (!IsEqualGUID(&type->formattype, &FORMAT_None) && + !IsEqualGUID(&type->formattype, &GUID_NULL) && + !type->pbFormat) + return VFW_E_INVALIDMEDIATYPE; + if (!IsEqualGUID(&This->sg->mtype.majortype,&GUID_NULL) && + !IsEqualGUID(&This->sg->mtype.majortype,&type->majortype)) + return VFW_E_TYPE_NOT_ACCEPTED; + if (!IsEqualGUID(&This->sg->mtype.subtype,&MEDIASUBTYPE_None) && + !IsEqualGUID(&This->sg->mtype.subtype,&type->subtype)) + return VFW_E_TYPE_NOT_ACCEPTED; + if (!IsEqualGUID(&This->sg->mtype.formattype,&GUID_NULL) && + !IsEqualGUID(&This->sg->mtype.formattype,&FORMAT_None) && + !IsEqualGUID(&This->sg->mtype.formattype,&type->formattype)) + return VFW_E_TYPE_NOT_ACCEPTED; + if (This->sg->mtype.pbFormat) + CoTaskMemFree(This->sg->mtype.pbFormat); + This->sg->mtype = *type; + This->sg->mtype.pUnk = NULL; + if (type->cbFormat) { + This->sg->mtype.pbFormat = CoTaskMemAlloc(type->cbFormat); + CopyMemory(This->sg->mtype.pbFormat, type->pbFormat, type->cbFormat); + } + else + This->sg->mtype.pbFormat = NULL; + } + This->pair = connector; + TRACE("(%p) Accepted IPin %p\n", This, connector); + return S_OK; +} + +/* IPin - output pin */ +static HRESULT WINAPI +SampleGrabber_Out_IPin_ReceiveConnection(IPin *iface, IPin *connector, const AM_MEDIA_TYPE *mtype) +{ + WARN("(%p, %p): unexpected\n", connector, mtype); + return E_UNEXPECTED; +} + +/* IPin - input pin */ +static HRESULT WINAPI +SampleGrabber_In_IPin_Disconnect(IPin *iface) +{ + SG_Pin *This = (SG_Pin *)iface; + TRACE("(%p)->() pair = %p\n", This, This->pair); + if (This->sg->state != State_Stopped) + return VFW_E_NOT_STOPPED; + if (This->pair) { + This->pair = NULL; + return S_OK; + } + return S_FALSE; +} + +/* IPin - output pin */ +static HRESULT WINAPI +SampleGrabber_Out_IPin_Disconnect(IPin *iface) +{ + SG_Pin *This = (SG_Pin *)iface; + TRACE("(%p)->() pair = %p\n", This, This->pair); + if (This->sg->state != State_Stopped) + return VFW_E_NOT_STOPPED; + if (This->pair) { + This->pair = NULL; + if (This->sg->memOutput) { + IMemInputPin_Release(This->sg->memOutput); + This->sg->memOutput = NULL; + } + return S_OK; + } + return S_FALSE; +} + +/* IPin */ +static HRESULT WINAPI +SampleGrabber_IPin_ConnectedTo(IPin *iface, IPin **pin) +{ + SG_Pin *This = (SG_Pin *)iface; + TRACE("(%p)->(%p) pair = %p\n", This, pin, This->pair); + if (!pin) + return E_POINTER; + *pin = This->pair; + if (*pin) { + IPin_AddRef(*pin); + return S_OK; + } + return VFW_E_NOT_CONNECTED; +} + +/* IPin */ +static HRESULT WINAPI +SampleGrabber_IPin_ConnectionMediaType(IPin *iface, AM_MEDIA_TYPE *mtype) +{ + SG_Pin *This = (SG_Pin *)iface; + TRACE("(%p)->(%p)\n", This, mtype); + if (!mtype) + return E_POINTER; + if (!This->pair) + return VFW_E_NOT_CONNECTED; + *mtype = This->sg->mtype; + if (mtype->cbFormat) { + mtype->pbFormat = CoTaskMemAlloc(mtype->cbFormat); + CopyMemory(mtype->pbFormat, This->sg->mtype.pbFormat, mtype->cbFormat); + } + return S_OK; +} + +/* IPin */ +static HRESULT WINAPI +SampleGrabber_IPin_QueryPinInfo(IPin *iface, PIN_INFO *info) +{ + SG_Pin *This = (SG_Pin *)iface; + TRACE("(%p)->(%p)\n", This, info); + if (!info) + return E_POINTER; + SampleGrabber_addref(This->sg); + info->pFilter = (IBaseFilter *)This->sg; + info->dir = This->dir; + lstrcpynW(info->achName,This->name,MAX_PIN_NAME); + return S_OK; +} + +/* IPin */ +static HRESULT WINAPI +SampleGrabber_IPin_QueryDirection(IPin *iface, PIN_DIRECTION *dir) +{ + SG_Pin *This = (SG_Pin *)iface; + TRACE("(%p)->(%p)\n", This, dir); + if (!dir) + return E_POINTER; + *dir = This->dir; + return S_OK; +} + +/* IPin */ +static HRESULT WINAPI +SampleGrabber_IPin_QueryId(IPin *iface, LPWSTR *id) +{ + SG_Pin *This = (SG_Pin *)iface; + int len; + TRACE("(%p)->(%p)\n", This, id); + if (!id) + return E_POINTER; + len = sizeof(WCHAR)*(1+lstrlenW(This->name)); + *id = CoTaskMemAlloc(len); + CopyMemory(*id, This->name, len); + return S_OK; +} + +/* IPin */ +static HRESULT WINAPI +SampleGrabber_IPin_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *mtype) +{ + TRACE("(%p)\n", mtype); + return S_OK; +} + +/* IPin */ +static HRESULT WINAPI +SampleGrabber_IPin_EnumMediaTypes(IPin *iface, IEnumMediaTypes **mtypes) +{ + SG_Pin *This = (SG_Pin *)iface; + TRACE("(%p)->(%p)\n", This, mtypes); + if (!mtypes) + return E_POINTER; + *mtypes = mediaenum_create(This->sg->pin_in.pair ? &This->sg->mtype : (const AM_MEDIA_TYPE *)NULL); + return *mtypes ? S_OK : E_OUTOFMEMORY; +} + +/* IPin - input pin */ +static HRESULT WINAPI +SampleGrabber_In_IPin_QueryInternalConnections(IPin *iface, IPin **pins, ULONG *nPins) +{ + SG_Pin *This = (SG_Pin *)iface; + TRACE("(%p)->(%p, %p) size = %u\n", This, pins, nPins, (nPins ? *nPins : 0)); + if (!nPins) + return E_POINTER; + if (*nPins) { + if (!pins) + return E_POINTER; + IPin_AddRef((IPin*)&This->sg->pin_out.lpVtbl); + *pins = (IPin*)&This->sg->pin_out.lpVtbl; + *nPins = 1; + return S_OK; + } + *nPins = 1; + return S_FALSE; +} + +/* IPin - output pin */ +static HRESULT WINAPI +SampleGrabber_Out_IPin_QueryInternalConnections(IPin *iface, IPin **pins, ULONG *nPins) +{ + WARN("(%p, %p): unexpected\n", pins, nPins); + if (nPins) + *nPins = 0; + return E_NOTIMPL; +} + +/* IPin */ +static HRESULT WINAPI +SampleGrabber_IPin_EndOfStream(IPin *iface) +{ + FIXME(": stub\n"); + return S_OK; +} + +/* IPin */ +static HRESULT WINAPI +SampleGrabber_IPin_BeginFlush(IPin *iface) +{ + FIXME(": stub\n"); + return S_OK; +} + +/* IPin */ +static HRESULT WINAPI +SampleGrabber_IPin_EndFlush(IPin *iface) +{ + FIXME(": stub\n"); + return S_OK; +} + +/* IPin */ +static HRESULT WINAPI +SampleGrabber_IPin_NewSegment(IPin *iface, REFERENCE_TIME tStart, REFERENCE_TIME tStop, double rate) +{ + FIXME(": stub\n"); + return S_OK; +} + + +/* SampleGrabber vtables and constructor */ + +static const IBaseFilterVtbl IBaseFilter_VTable = +{ + SampleGrabber_IBaseFilter_QueryInterface, + SampleGrabber_IBaseFilter_AddRef, + SampleGrabber_IBaseFilter_Release, + SampleGrabber_IBaseFilter_GetClassID, + SampleGrabber_IBaseFilter_Stop, + SampleGrabber_IBaseFilter_Pause, + SampleGrabber_IBaseFilter_Run, + SampleGrabber_IBaseFilter_GetState, + SampleGrabber_IBaseFilter_SetSyncSource, + SampleGrabber_IBaseFilter_GetSyncSource, + SampleGrabber_IBaseFilter_EnumPins, + SampleGrabber_IBaseFilter_FindPin, + SampleGrabber_IBaseFilter_QueryFilterInfo, + SampleGrabber_IBaseFilter_JoinFilterGraph, + SampleGrabber_IBaseFilter_QueryVendorInfo, +}; + +static const ISampleGrabberVtbl ISampleGrabber_VTable = +{ + SampleGrabber_ISampleGrabber_QueryInterface, + SampleGrabber_ISampleGrabber_AddRef, + SampleGrabber_ISampleGrabber_Release, + SampleGrabber_ISampleGrabber_SetOneShot, + SampleGrabber_ISampleGrabber_SetMediaType, + SampleGrabber_ISampleGrabber_GetConnectedMediaType, + SampleGrabber_ISampleGrabber_SetBufferSamples, + SampleGrabber_ISampleGrabber_GetCurrentBuffer, + SampleGrabber_ISampleGrabber_GetCurrentSample, + SampleGrabber_ISampleGrabber_SetCallback, +}; + +static const IMemInputPinVtbl IMemInputPin_VTable = +{ + SampleGrabber_IMemInputPin_QueryInterface, + SampleGrabber_IMemInputPin_AddRef, + SampleGrabber_IMemInputPin_Release, + SampleGrabber_IMemInputPin_GetAllocator, + SampleGrabber_IMemInputPin_NotifyAllocator, + SampleGrabber_IMemInputPin_GetAllocatorRequirements, + SampleGrabber_IMemInputPin_Receive, + SampleGrabber_IMemInputPin_ReceiveMultiple, + SampleGrabber_IMemInputPin_ReceiveCanBlock, +}; + +static const IPinVtbl IPin_In_VTable = +{ + SampleGrabber_IPin_QueryInterface, + SampleGrabber_IPin_AddRef, + SampleGrabber_IPin_Release, + SampleGrabber_In_IPin_Connect, + SampleGrabber_In_IPin_ReceiveConnection, + SampleGrabber_In_IPin_Disconnect, + SampleGrabber_IPin_ConnectedTo, + SampleGrabber_IPin_ConnectionMediaType, + SampleGrabber_IPin_QueryPinInfo, + SampleGrabber_IPin_QueryDirection, + SampleGrabber_IPin_QueryId, + SampleGrabber_IPin_QueryAccept, + SampleGrabber_IPin_EnumMediaTypes, + SampleGrabber_In_IPin_QueryInternalConnections, + SampleGrabber_IPin_EndOfStream, + SampleGrabber_IPin_BeginFlush, + SampleGrabber_IPin_EndFlush, + SampleGrabber_IPin_NewSegment, +}; + +static const IPinVtbl IPin_Out_VTable = +{ + SampleGrabber_IPin_QueryInterface, + SampleGrabber_IPin_AddRef, + SampleGrabber_IPin_Release, + SampleGrabber_Out_IPin_Connect, + SampleGrabber_Out_IPin_ReceiveConnection, + SampleGrabber_Out_IPin_Disconnect, + SampleGrabber_IPin_ConnectedTo, + SampleGrabber_IPin_ConnectionMediaType, + SampleGrabber_IPin_QueryPinInfo, + SampleGrabber_IPin_QueryDirection, + SampleGrabber_IPin_QueryId, + SampleGrabber_IPin_QueryAccept, + SampleGrabber_IPin_EnumMediaTypes, + SampleGrabber_Out_IPin_QueryInternalConnections, + SampleGrabber_IPin_EndOfStream, + SampleGrabber_IPin_BeginFlush, + SampleGrabber_IPin_EndFlush, + SampleGrabber_IPin_NewSegment, +}; + +HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv) +{ + SG_Impl* obj = NULL; + + TRACE("(%p,%p)\n", ppv, pUnkOuter); + + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + obj = CoTaskMemAlloc(sizeof(SG_Impl)); + if (NULL == obj) { + *ppv = NULL; + return E_OUTOFMEMORY; + } + ZeroMemory(obj, sizeof(SG_Impl)); + + obj->refCount = 1; + obj->IBaseFilter_Vtbl = &IBaseFilter_VTable; + obj->ISampleGrabber_Vtbl = &ISampleGrabber_VTable; + obj->IMemInputPin_Vtbl = &IMemInputPin_VTable; + obj->pin_in.lpVtbl = &IPin_In_VTable; + obj->pin_in.dir = PINDIR_INPUT; + obj->pin_in.name = pin_in_name; + obj->pin_in.sg = obj; + obj->pin_in.pair = NULL; + obj->pin_out.lpVtbl = &IPin_Out_VTable; + obj->pin_out.dir = PINDIR_OUTPUT; + obj->pin_out.name = pin_out_name; + obj->pin_out.sg = obj; + obj->pin_out.pair = NULL; + InitializeCriticalSection(&obj->critSect); + obj->critSect.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": SG_Impl.critSect"); + obj->info.achName[0] = 0; + obj->info.pGraph = NULL; + obj->state = State_Stopped; + obj->mtype.majortype = GUID_NULL; + obj->mtype.subtype = MEDIASUBTYPE_None; + obj->mtype.formattype = FORMAT_None; + obj->allocator = NULL; + obj->refClock = NULL; + obj->memOutput = NULL; + obj->grabberIface = NULL; + obj->grabberMethod = -1; + obj->oneShot = OneShot_None; + obj->bufferLen = -1; + obj->bufferData = NULL; + *ppv = obj; + + return S_OK; +} diff --git a/reactos/dll/directx/quartz/dsoundrender.c b/reactos/dll/directx/quartz/dsoundrender.c index edb170da136..1d87a7f0047 100644 --- a/reactos/dll/directx/quartz/dsoundrender.c +++ b/reactos/dll/directx/quartz/dsoundrender.c @@ -32,6 +32,7 @@ #include "evcode.h" #include "strmif.h" #include "dsound.h" +#include "amaudio.h" #include "wine/unicode.h" #include "wine/debug.h" @@ -45,12 +46,14 @@ static const IPinVtbl DSoundRender_InputPin_Vtbl; static const IBasicAudioVtbl IBasicAudio_Vtbl; static const IReferenceClockVtbl IReferenceClock_Vtbl; static const IMediaSeekingVtbl IMediaSeeking_Vtbl; +static const IAMDirectSoundVtbl IAMDirectSound_Vtbl; typedef struct DSoundRenderImpl { const IBaseFilterVtbl * lpVtbl; const IBasicAudioVtbl *IBasicAudio_vtbl; const IReferenceClockVtbl *IReferenceClock_vtbl; + const IAMDirectSoundVtbl *IAMDirectSound_vtbl; LONG refCount; CRITICAL_SECTION csFilter; @@ -404,6 +407,7 @@ HRESULT DSoundRender_create(IUnknown * pUnkOuter, LPVOID * ppv) pDSoundRender->lpVtbl = &DSoundRender_Vtbl; pDSoundRender->IBasicAudio_vtbl = &IBasicAudio_Vtbl; pDSoundRender->IReferenceClock_vtbl = &IReferenceClock_Vtbl; + pDSoundRender->IAMDirectSound_vtbl = &IAMDirectSound_Vtbl; pDSoundRender->refCount = 1; InitializeCriticalSection(&pDSoundRender->csFilter); pDSoundRender->csFilter.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": DSoundRenderImpl.csFilter"); @@ -473,6 +477,8 @@ static HRESULT WINAPI DSoundRender_QueryInterface(IBaseFilter * iface, REFIID ri *ppv = &This->IReferenceClock_vtbl; else if (IsEqualIID(riid, &IID_IMediaSeeking)) *ppv = &This->mediaSeeking.lpVtbl; + else if (IsEqualIID(riid, &IID_IAMDirectSound)) + *ppv = &This->IAMDirectSound_vtbl; if (*ppv) { @@ -1328,3 +1334,121 @@ static const IMediaSeekingVtbl IMediaSeeking_Vtbl = MediaSeekingImpl_GetRate, MediaSeekingImpl_GetPreroll }; + +/*** IUnknown methods ***/ +static HRESULT WINAPI AMDirectSound_QueryInterface(IAMDirectSound *iface, + REFIID riid, + LPVOID*ppvObj) +{ + ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface); + + TRACE("(%p/%p)->(%s (%p), %p)\n", This, iface, debugstr_guid(riid), riid, ppvObj); + + return DSoundRender_QueryInterface((IBaseFilter*)This, riid, ppvObj); +} + +static ULONG WINAPI AMDirectSound_AddRef(IAMDirectSound *iface) +{ + ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface); + + TRACE("(%p/%p)->()\n", This, iface); + + return DSoundRender_AddRef((IBaseFilter*)This); +} + +static ULONG WINAPI AMDirectSound_Release(IAMDirectSound *iface) +{ + ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface); + + TRACE("(%p/%p)->()\n", This, iface); + + return DSoundRender_Release((IBaseFilter*)This); +} + +/*** IAMDirectSound methods ***/ +static HRESULT WINAPI AMDirectSound_GetDirectSoundInterface(IAMDirectSound *iface, IDirectSound **ds) +{ + ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface); + + FIXME("(%p/%p)->(%p): stub\n", This, iface, ds); + + return E_NOTIMPL; +} + +static HRESULT WINAPI AMDirectSound_GetPrimaryBufferInterface(IAMDirectSound *iface, IDirectSoundBuffer **buf) +{ + ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface); + + FIXME("(%p/%p)->(%p): stub\n", This, iface, buf); + + return E_NOTIMPL; +} + +static HRESULT WINAPI AMDirectSound_GetSecondaryBufferInterface(IAMDirectSound *iface, IDirectSoundBuffer **buf) +{ + ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface); + + FIXME("(%p/%p)->(%p): stub\n", This, iface, buf); + + return E_NOTIMPL; +} + +static HRESULT WINAPI AMDirectSound_ReleaseDirectSoundInterface(IAMDirectSound *iface, IDirectSound *ds) +{ + ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface); + + FIXME("(%p/%p)->(%p): stub\n", This, iface, ds); + + return E_NOTIMPL; +} + +static HRESULT WINAPI AMDirectSound_ReleasePrimaryBufferInterface(IAMDirectSound *iface, IDirectSoundBuffer *buf) +{ + ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface); + + FIXME("(%p/%p)->(%p): stub\n", This, iface, buf); + + return E_NOTIMPL; +} + +static HRESULT WINAPI AMDirectSound_ReleaseSecondaryBufferInterface(IAMDirectSound *iface, IDirectSoundBuffer *buf) +{ + ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface); + + FIXME("(%p/%p)->(%p): stub\n", This, iface, buf); + + return E_NOTIMPL; +} + +static HRESULT WINAPI AMDirectSound_SetFocusWindow(IAMDirectSound *iface, HWND hwnd, BOOL bgsilent) +{ + ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface); + + FIXME("(%p/%p)->(%p,%d): stub\n", This, iface, hwnd, bgsilent); + + return E_NOTIMPL; +} + +static HRESULT WINAPI AMDirectSound_GetFocusWindow(IAMDirectSound *iface, HWND hwnd) +{ + ICOM_THIS_MULTI(DSoundRenderImpl, IAMDirectSound_vtbl, iface); + + FIXME("(%p/%p)->(%p): stub\n", This, iface, hwnd); + + return E_NOTIMPL; +} + +static const IAMDirectSoundVtbl IAMDirectSound_Vtbl = +{ + AMDirectSound_QueryInterface, + AMDirectSound_AddRef, + AMDirectSound_Release, + AMDirectSound_GetDirectSoundInterface, + AMDirectSound_GetPrimaryBufferInterface, + AMDirectSound_GetSecondaryBufferInterface, + AMDirectSound_ReleaseDirectSoundInterface, + AMDirectSound_ReleasePrimaryBufferInterface, + AMDirectSound_ReleaseSecondaryBufferInterface, + AMDirectSound_SetFocusWindow, + AMDirectSound_GetFocusWindow +}; diff --git a/reactos/dll/directx/quartz/filesource.c b/reactos/dll/directx/quartz/filesource.c index 5f6350fb99f..cb9282c8bb5 100644 --- a/reactos/dll/directx/quartz/filesource.c +++ b/reactos/dll/directx/quartz/filesource.c @@ -395,7 +395,8 @@ static HRESULT WINAPI AsyncReader_QueryInterface(IBaseFilter * iface, REFIID rii return S_OK; } - if (!IsEqualIID(riid, &IID_IPin) && !IsEqualIID(riid, &IID_IMediaSeeking) && !IsEqualIID(riid, &IID_IVideoWindow)) + if (!IsEqualIID(riid, &IID_IPin) && !IsEqualIID(riid, &IID_IMediaSeeking) && + !IsEqualIID(riid, &IID_IVideoWindow) && !IsEqualIID(riid, &IID_IBasicAudio)) FIXME("No interface for %s!\n", qzdebugstr_guid(riid)); return E_NOINTERFACE; diff --git a/reactos/dll/directx/quartz/filtermapper.c b/reactos/dll/directx/quartz/filtermapper.c index 7b8d95430bf..bacb72950d6 100644 --- a/reactos/dll/directx/quartz/filtermapper.c +++ b/reactos/dll/directx/quartz/filtermapper.c @@ -479,11 +479,16 @@ static HRESULT WINAPI FilterMapper2_UnregisterFilter( static HRESULT FM2_WriteFriendlyName(IPropertyBag * pPropBag, LPCWSTR szName) { VARIANT var; + HRESULT ret; + BSTR value; V_VT(&var) = VT_BSTR; - V_UNION(&var, bstrVal) = (BSTR)szName; + V_UNION(&var, bstrVal) = value = SysAllocString(szName); - return IPropertyBag_Write(pPropBag, wszFriendlyName, &var); + ret = IPropertyBag_Write(pPropBag, wszFriendlyName, &var); + SysFreeString(value); + + return ret; } static HRESULT FM2_WriteClsid(IPropertyBag * pPropBag, REFCLSID clsid) diff --git a/reactos/dll/directx/quartz/pin.c b/reactos/dll/directx/quartz/pin.c index 2e24d520667..ca34d9331c5 100644 --- a/reactos/dll/directx/quartz/pin.c +++ b/reactos/dll/directx/quartz/pin.c @@ -765,9 +765,6 @@ HRESULT WINAPI OutputPin_Connect(IPin * iface, IPin * pReceivePin, const AM_MEDI { assert(pmtCandidate); dump_AM_MEDIA_TYPE(pmtCandidate); - if (!IsEqualGUID(&FORMAT_None, &pmtCandidate->formattype) - && !IsEqualGUID(&GUID_NULL, &pmtCandidate->formattype)) - assert(pmtCandidate->pbFormat); if (( !pmt || CompareMediaTypes(pmt, pmtCandidate, TRUE) ) && (This->pConnectSpecific(iface, pReceivePin, pmtCandidate) == S_OK)) { diff --git a/reactos/dll/directx/quartz/quartz.rbuild b/reactos/dll/directx/quartz/quartz.rbuild index 982a73dd425..b7097f6ff1f 100644 --- a/reactos/dll/directx/quartz/quartz.rbuild +++ b/reactos/dll/directx/quartz/quartz.rbuild @@ -60,4 +60,5 @@ quartz_strmif.idl - \ No newline at end of file + + \ No newline at end of file diff --git a/reactos/dll/directx/wine/d3d8/d3d8_main.c b/reactos/dll/directx/wine/d3d8/d3d8_main.c index 6300371842a..c471049714b 100644 --- a/reactos/dll/directx/wine/d3d8/d3d8_main.c +++ b/reactos/dll/directx/wine/d3d8/d3d8_main.c @@ -35,7 +35,7 @@ void WINAPI DebugSetMute(void) { /* nothing to do */ } -IDirect3D8* WINAPI Direct3DCreate8(UINT SDKVersion) { +IDirect3D8* WINAPI DECLSPEC_HOTPATCH Direct3DCreate8(UINT SDKVersion) { IDirect3D8Impl* object; TRACE("SDKVersion = %x\n", SDKVersion); @@ -79,7 +79,12 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) HRESULT WINAPI ValidateVertexShader(DWORD* vertexshader, DWORD* reserved1, DWORD* reserved2, BOOL bool, DWORD* toto) { HRESULT ret; - FIXME("(%p %p %p %d %p): stub\n", vertexshader, reserved1, reserved2, bool, toto); + static BOOL warned; + + if (TRACE_ON(d3d8) || !warned) { + FIXME("(%p %p %p %d %p): stub\n", vertexshader, reserved1, reserved2, bool, toto); + warned = TRUE; + } if (!vertexshader) return E_FAIL; @@ -109,7 +114,12 @@ HRESULT WINAPI ValidateVertexShader(DWORD* vertexshader, DWORD* reserved1, DWORD HRESULT WINAPI ValidatePixelShader(DWORD* pixelshader, DWORD* reserved1, BOOL bool, DWORD* toto) { HRESULT ret; - FIXME("(%p %p %d %p): stub\n", pixelshader, reserved1, bool, toto); + static BOOL warned; + + if (TRACE_ON(d3d8) || !warned) { + FIXME("(%p %p %d %p): stub\n", pixelshader, reserved1, bool, toto); + warned = TRUE; + } if (!pixelshader) return E_FAIL; diff --git a/reactos/dll/directx/wine/d3d8/d3d8_private.h b/reactos/dll/directx/wine/d3d8/d3d8_private.h index 2c5f66f1d5f..4ba399b5d92 100644 --- a/reactos/dll/directx/wine/d3d8/d3d8_private.h +++ b/reactos/dll/directx/wine/d3d8/d3d8_private.h @@ -275,18 +275,6 @@ HRESULT surface_init(IDirect3DSurface8Impl *surface, IDirect3DDevice8Impl *devic UINT width, UINT height, D3DFORMAT format, BOOL lockable, BOOL discard, UINT level, DWORD usage, D3DPOOL pool, D3DMULTISAMPLE_TYPE multisample_type, DWORD multisample_quality) DECLSPEC_HIDDEN; -/* ------------------ */ -/* IDirect3DResource8 */ -/* ------------------ */ - -/***************************************************************************** - * Predeclare the interface implementation structures - */ -extern const IDirect3DResource8Vtbl Direct3DResource8_Vtbl DECLSPEC_HIDDEN; - -/***************************************************************************** - * IDirect3DResource8 implementation structure - */ struct IDirect3DResource8Impl { /* IUnknown fields */ diff --git a/reactos/dll/directx/wine/d3d8/device.c b/reactos/dll/directx/wine/d3d8/device.c index 5365640fd06..11697b2ff26 100644 --- a/reactos/dll/directx/wine/d3d8/device.c +++ b/reactos/dll/directx/wine/d3d8/device.c @@ -1047,7 +1047,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_BeginScene(LPDIRECT3DDEVICE8 iface) { return hr; } -static HRESULT WINAPI IDirect3DDevice8Impl_EndScene(LPDIRECT3DDEVICE8 iface) { +static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice8Impl_EndScene(LPDIRECT3DDEVICE8 iface) { IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; HRESULT hr; diff --git a/reactos/dll/directx/wine/d3d9/d3d9_main.c b/reactos/dll/directx/wine/d3d9/d3d9_main.c index 339cc61c3be..c405a5747d7 100644 --- a/reactos/dll/directx/wine/d3d9/d3d9_main.c +++ b/reactos/dll/directx/wine/d3d9/d3d9_main.c @@ -33,7 +33,7 @@ void WINAPI DebugSetMute(void) { /* nothing to do */ } -IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion) { +IDirect3D9* WINAPI DECLSPEC_HOTPATCH Direct3DCreate9(UINT SDKVersion) { IDirect3D9Impl* object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D9Impl)); object->lpVtbl = &Direct3D9_Vtbl; @@ -53,7 +53,7 @@ IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion) { return (IDirect3D9*) object; } -HRESULT WINAPI Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex **direct3d9ex) { +HRESULT WINAPI DECLSPEC_HOTPATCH Direct3DCreate9Ex(UINT SDKVersion, IDirect3D9Ex **direct3d9ex) { IDirect3D9 *ret; IDirect3D9Impl* object; diff --git a/reactos/dll/directx/wine/d3d9/d3d9_private.h b/reactos/dll/directx/wine/d3d9/d3d9_private.h index 7736beace67..eb3a032f18b 100644 --- a/reactos/dll/directx/wine/d3d9/d3d9_private.h +++ b/reactos/dll/directx/wine/d3d9/d3d9_private.h @@ -187,11 +187,6 @@ HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapte extern HRESULT WINAPI IDirect3DDevice9Impl_GetSwapChain(IDirect3DDevice9Ex *iface, UINT iSwapChain, IDirect3DSwapChain9 **pSwapChain) DECLSPEC_HIDDEN; extern UINT WINAPI IDirect3DDevice9Impl_GetNumberOfSwapChains(IDirect3DDevice9Ex *iface) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(IDirect3DDevice9Ex *iface, - D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9 **ppSB) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(IDirect3DDevice9Ex *iface) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(IDirect3DDevice9Ex *iface, - IDirect3DStateBlock9 **ppSB) DECLSPEC_HIDDEN; extern HRESULT WINAPI IDirect3DDevice9Impl_SetVertexDeclaration(IDirect3DDevice9Ex *iface, IDirect3DVertexDeclaration9 *pDecl) DECLSPEC_HIDDEN; extern HRESULT WINAPI IDirect3DDevice9Impl_GetVertexDeclaration(IDirect3DDevice9Ex *iface, @@ -228,9 +223,6 @@ extern HRESULT WINAPI IDirect3DDevice9Impl_SetPixelShaderConstantB(IDirect3DDevi UINT StartRegister, const BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN; extern HRESULT WINAPI IDirect3DDevice9Impl_GetPixelShaderConstantB(IDirect3DDevice9Ex *iface, UINT StartRegister, BOOL *pConstantData, UINT BoolCount) DECLSPEC_HIDDEN; -extern HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(IDirect3DDevice9Ex *iface, - D3DQUERYTYPE Type, IDirect3DQuery9 **ppQuery) DECLSPEC_HIDDEN; - /* ---------------- */ /* IDirect3DVolume9 */ @@ -470,6 +462,8 @@ typedef struct IDirect3DStateBlock9Impl { LPDIRECT3DDEVICE9EX parentDevice; } IDirect3DStateBlock9Impl; +HRESULT stateblock_init(IDirect3DStateBlock9Impl *stateblock, IDirect3DDevice9Impl *device, + D3DSTATEBLOCKTYPE type, IWineD3DStateBlock *wined3d_stateblock) DECLSPEC_HIDDEN; /* --------------------------- */ /* IDirect3DVertexDeclaration9 */ @@ -564,4 +558,7 @@ typedef struct IDirect3DQuery9Impl { LPDIRECT3DDEVICE9EX parentDevice; } IDirect3DQuery9Impl; +HRESULT query_init(IDirect3DQuery9Impl *query, IDirect3DDevice9Impl *device, + D3DQUERYTYPE type) DECLSPEC_HIDDEN; + #endif /* __WINE_D3D9_PRIVATE_H */ diff --git a/reactos/dll/directx/wine/d3d9/device.c b/reactos/dll/directx/wine/d3d9/device.c index 6b70c84cf27..79a9ba01834 100644 --- a/reactos/dll/directx/wine/d3d9/device.c +++ b/reactos/dll/directx/wine/d3d9/device.c @@ -248,7 +248,7 @@ static ULONG WINAPI IDirect3DDevice9Impl_AddRef(LPDIRECT3DDEVICE9EX iface) { return ref; } -static ULONG WINAPI IDirect3DDevice9Impl_Release(LPDIRECT3DDEVICE9EX iface) { +static ULONG WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Release(LPDIRECT3DDEVICE9EX iface) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; ULONG ref; @@ -452,7 +452,7 @@ static BOOL WINAPI IDirect3DDevice9Impl_ShowCursor(LPDIRECT3DDEVICE9EX ifac return ret; } -static HRESULT WINAPI IDirect3DDevice9Impl_CreateAdditionalSwapChain(IDirect3DDevice9Ex *iface, +static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_CreateAdditionalSwapChain(IDirect3DDevice9Ex *iface, D3DPRESENT_PARAMETERS *present_parameters, IDirect3DSwapChain9 **swapchain) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; @@ -541,7 +541,7 @@ static HRESULT WINAPI reset_enum_callback(IWineD3DResource *resource, void *data return ret; } -static HRESULT WINAPI IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3DPRESENT_PARAMETERS* pPresentationParameters) { +static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3DPRESENT_PARAMETERS* pPresentationParameters) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; WINED3DPRESENT_PARAMETERS localParameters; HRESULT hr; @@ -619,7 +619,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_Reset(LPDIRECT3DDEVICE9EX iface, D3DP return hr; } -static HRESULT WINAPI IDirect3DDevice9Impl_Present(LPDIRECT3DDEVICE9EX iface, CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA* +static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Present(LPDIRECT3DDEVICE9EX iface, CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; HRESULT hr; @@ -1182,7 +1182,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_BeginScene(LPDIRECT3DDEVICE9EX ifac return hr; } -static HRESULT WINAPI IDirect3DDevice9Impl_EndScene(LPDIRECT3DDEVICE9EX iface) { +static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_EndScene(LPDIRECT3DDEVICE9EX iface) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; HRESULT hr; @@ -1388,7 +1388,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetClipPlane(LPDIRECT3DDEVICE9EX if return hr; } -static HRESULT WINAPI IDirect3DDevice9Impl_SetRenderState(LPDIRECT3DDEVICE9EX iface, D3DRENDERSTATETYPE State, DWORD Value) { +static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_SetRenderState(LPDIRECT3DDEVICE9EX iface, D3DRENDERSTATETYPE State, DWORD Value) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; HRESULT hr; @@ -1414,6 +1414,97 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetRenderState(LPDIRECT3DDEVICE9EX return hr; } +static HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(IDirect3DDevice9Ex *iface, + D3DSTATEBLOCKTYPE type, IDirect3DStateBlock9 **stateblock) +{ + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + IDirect3DStateBlock9Impl *object; + HRESULT hr; + + TRACE("iface %p, type %#x, stateblock %p.\n", iface, type, stateblock); + + if (type != D3DSBT_ALL && type != D3DSBT_PIXELSTATE && type != D3DSBT_VERTEXSTATE) + { + WARN("Unexpected stateblock type, returning D3DERR_INVALIDCALL.\n"); + return D3DERR_INVALIDCALL; + } + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate stateblock memory.\n"); + return E_OUTOFMEMORY; + } + + hr = stateblock_init(object, This, type, NULL); + if (FAILED(hr)) + { + WARN("Failed to initialize stateblock, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created stateblock %p.\n", object); + *stateblock = (IDirect3DStateBlock9 *)object; + + return D3D_OK; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(IDirect3DDevice9Ex *iface) +{ + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + HRESULT hr; + + TRACE("iface %p.\n", iface); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_BeginStateBlock(This->WineD3DDevice); + wined3d_mutex_unlock(); + + return hr; +} + +static HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(IDirect3DDevice9Ex *iface, IDirect3DStateBlock9 **stateblock) +{ + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + IWineD3DStateBlock *wined3d_stateblock; + IDirect3DStateBlock9Impl *object; + HRESULT hr; + + TRACE("iface %p, stateblock %p.\n", iface, stateblock); + + wined3d_mutex_lock(); + hr = IWineD3DDevice_EndStateBlock(This->WineD3DDevice, &wined3d_stateblock); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("IWineD3DDevice_EndStateBlock() failed, hr %#x.\n", hr); + return hr; + } + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate stateblock memory.\n"); + IWineD3DStateBlock_Release(wined3d_stateblock); + return E_OUTOFMEMORY; + } + + hr = stateblock_init(object, This, 0, wined3d_stateblock); + if (FAILED(hr)) + { + WARN("Failed to initialize stateblock, hr %#x.\n", hr); + IWineD3DStateBlock_Release(wined3d_stateblock); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created stateblock %p.\n", object); + *stateblock = (IDirect3DStateBlock9 *)object; + + return D3D_OK; +} + static HRESULT WINAPI IDirect3DDevice9Impl_SetClipStatus(LPDIRECT3DDEVICE9EX iface, CONST D3DCLIPSTATUS9* pClipStatus) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; HRESULT hr; @@ -1559,7 +1650,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetSamplerState(IDirect3DDevice9Ex *i return hr; } -static HRESULT WINAPI IDirect3DDevice9Impl_SetSamplerState(LPDIRECT3DDEVICE9EX iface, DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value) { +static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_SetSamplerState(LPDIRECT3DDEVICE9EX iface, DWORD Sampler, D3DSAMPLERSTATETYPE Type, DWORD Value) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; HRESULT hr; @@ -2178,6 +2269,37 @@ static HRESULT WINAPI IDirect3DDevice9Impl_DeletePatch(LPDIRECT3DDEVICE9EX ifa return hr; } +static HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(IDirect3DDevice9Ex *iface, + D3DQUERYTYPE type, IDirect3DQuery9 **query) +{ + IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; + IDirect3DQuery9Impl *object; + HRESULT hr; + + TRACE("iface %p, type %#x, query %p.\n", iface, type, query); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate query memory.\n"); + return E_OUTOFMEMORY; + } + + hr = query_init(object, This, type); + if (FAILED(hr)) + { + WARN("Failed to initialize query, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); + return hr; + } + + TRACE("Created query %p.\n", object); + if (query) *query = (IDirect3DQuery9 *)object; + else IDirect3DQuery9_Release((IDirect3DQuery9 *)object); + + return D3D_OK; +} + static HRESULT WINAPI IDirect3DDevice9ExImpl_SetConvolutionMonoKernel(IDirect3DDevice9Ex *iface, UINT width, UINT height, float *rows, float *columns) { diff --git a/reactos/dll/directx/wine/d3d9/directx.c b/reactos/dll/directx/wine/d3d9/directx.c index 5f5e8f913d4..1fcc8c47fcf 100644 --- a/reactos/dll/directx/wine/d3d9/directx.c +++ b/reactos/dll/directx/wine/d3d9/directx.c @@ -407,7 +407,7 @@ static HMONITOR WINAPI IDirect3D9Impl_GetAdapterMonitor(LPDIRECT3D9EX iface, UIN return ret; } -static HRESULT WINAPI IDirect3D9Impl_CreateDevice(IDirect3D9Ex *iface, UINT adapter, +static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3D9Impl_CreateDevice(IDirect3D9Ex *iface, UINT adapter, D3DDEVTYPE device_type, HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters, IDirect3DDevice9 **device) { @@ -465,7 +465,7 @@ static HRESULT WINAPI IDirect3D9ExImpl_GetAdapterDisplayModeEx(IDirect3D9Ex *ifa return D3DERR_DRIVERINTERNALERROR; } -static HRESULT WINAPI IDirect3D9ExImpl_CreateDeviceEx(IDirect3D9Ex *iface, +static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3D9ExImpl_CreateDeviceEx(IDirect3D9Ex *iface, UINT adapter, D3DDEVTYPE device_type, HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters, D3DDISPLAYMODEEX *mode, IDirect3DDevice9Ex **device) { diff --git a/reactos/dll/directx/wine/d3d9/query.c b/reactos/dll/directx/wine/d3d9/query.c index ecb2e718eeb..a38dc9d15fb 100644 --- a/reactos/dll/directx/wine/d3d9/query.c +++ b/reactos/dll/directx/wine/d3d9/query.c @@ -150,49 +150,24 @@ static const IDirect3DQuery9Vtbl Direct3DQuery9_Vtbl = IDirect3DQuery9Impl_GetData }; +HRESULT query_init(IDirect3DQuery9Impl *query, IDirect3DDevice9Impl *device, D3DQUERYTYPE type) +{ + HRESULT hr; -/* IDirect3DDevice9 IDirect3DQuery9 Methods follow: */ -HRESULT WINAPI IDirect3DDevice9Impl_CreateQuery(LPDIRECT3DDEVICE9EX iface, D3DQUERYTYPE Type, IDirect3DQuery9** ppQuery) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - IDirect3DQuery9Impl *object = NULL; - HRESULT hr = D3D_OK; + query->lpVtbl = &Direct3DQuery9_Vtbl; + query->ref = 1; - TRACE("iface %p, type %#x, query %p.\n", iface, Type, ppQuery); - - if (!ppQuery) + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateQuery(device->WineD3DDevice, type, &query->wineD3DQuery, (IUnknown *)query); + wined3d_mutex_unlock(); + if (FAILED(hr)) { - wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateQuery(This->WineD3DDevice, Type, NULL, NULL); - wined3d_mutex_unlock(); - + WARN("Failed to create wined3d query, hr %#x.\n", hr); return hr; } - /* Allocate the storage for the device */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DQuery9Impl)); - if (NULL == object) { - ERR("Allocation of memory failed, returning D3DERR_OUTOFVIDEOMEMORY\n"); - return D3DERR_OUTOFVIDEOMEMORY; - } + query->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(query->parentDevice); - object->lpVtbl = &Direct3DQuery9_Vtbl; - object->ref = 1; - - wined3d_mutex_lock(); - hr = IWineD3DDevice_CreateQuery(This->WineD3DDevice, Type, &object->wineD3DQuery, (IUnknown *)object); - wined3d_mutex_unlock(); - - if (FAILED(hr)) { - - /* free up object */ - WARN("(%p) call to IWineD3DDevice_CreateQuery failed\n", This); - HeapFree(GetProcessHeap(), 0, object); - } else { - IDirect3DDevice9Ex_AddRef(iface); - object->parentDevice = iface; - *ppQuery = (LPDIRECT3DQUERY9) object; - TRACE("(%p) : Created query %p\n", This , object); - } - TRACE("(%p) : returning %x\n", This, hr); - return hr; + return D3D_OK; } diff --git a/reactos/dll/directx/wine/d3d9/stateblock.c b/reactos/dll/directx/wine/d3d9/stateblock.c index 7cd3ba629e0..c4941db254b 100644 --- a/reactos/dll/directx/wine/d3d9/stateblock.c +++ b/reactos/dll/directx/wine/d3d9/stateblock.c @@ -123,87 +123,33 @@ static const IDirect3DStateBlock9Vtbl Direct3DStateBlock9_Vtbl = IDirect3DStateBlock9Impl_Apply }; - -/* IDirect3DDevice9 IDirect3DStateBlock9 Methods follow: */ -HRESULT WINAPI IDirect3DDevice9Impl_CreateStateBlock(LPDIRECT3DDEVICE9EX iface, D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9** ppStateBlock) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - IDirect3DStateBlock9Impl* object; - HRESULT hrc = D3D_OK; - - TRACE("iface %p, type %#x, stateblock %p.\n", iface, Type, ppStateBlock); - - if(Type != D3DSBT_ALL && Type != D3DSBT_PIXELSTATE && - Type != D3DSBT_VERTEXSTATE ) { - WARN("Unexpected stateblock type, returning D3DERR_INVALIDCALL\n"); - return D3DERR_INVALIDCALL; - } - - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DStateBlock9Impl)); - if (NULL == object) return E_OUTOFMEMORY; - object->lpVtbl = &Direct3DStateBlock9_Vtbl; - object->ref = 1; - - wined3d_mutex_lock(); - hrc = IWineD3DDevice_CreateStateBlock(This->WineD3DDevice, (WINED3DSTATEBLOCKTYPE)Type, &object->wineD3DStateBlock, (IUnknown*)object); - wined3d_mutex_unlock(); - - if(hrc != D3D_OK){ - FIXME("(%p) Call to IWineD3DDevice_CreateStateBlock failed.\n", This); - HeapFree(GetProcessHeap(), 0, object); - } else { - IDirect3DDevice9Ex_AddRef(iface); - object->parentDevice = iface; - *ppStateBlock = (IDirect3DStateBlock9*)object; - TRACE("(%p) : Created stateblock %p\n", This, object); - } - TRACE("(%p) returning token (ptr to stateblock) of %p\n", This, object); - return hrc; -} - -HRESULT WINAPI IDirect3DDevice9Impl_BeginStateBlock(IDirect3DDevice9Ex *iface) +HRESULT stateblock_init(IDirect3DStateBlock9Impl *stateblock, IDirect3DDevice9Impl *device, + D3DSTATEBLOCKTYPE type, IWineD3DStateBlock *wined3d_stateblock) { - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; HRESULT hr; - TRACE("iface %p.\n", iface); + stateblock->lpVtbl = &Direct3DStateBlock9_Vtbl; + stateblock->ref = 1; - wined3d_mutex_lock(); - hr = IWineD3DDevice_BeginStateBlock(This->WineD3DDevice); - wined3d_mutex_unlock(); - - return hr; -} - -HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(IDirect3DDevice9Ex *iface, IDirect3DStateBlock9 **ppSB) -{ - IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; - IWineD3DStateBlock *wineD3DStateBlock; - IDirect3DStateBlock9Impl *object; - HRESULT hr; - - TRACE("iface %p, stateblock %p.\n", iface, ppSB); - - /* Tell wineD3D to endstateblock before anything else (in case we run out - * of memory later and cause locking problems) */ - wined3d_mutex_lock(); - hr=IWineD3DDevice_EndStateBlock(This->WineD3DDevice,&wineD3DStateBlock); - wined3d_mutex_unlock(); - - if (hr!= D3D_OK) + if (wined3d_stateblock) { - WARN("IWineD3DDevice_EndStateBlock returned an error\n"); - return hr; + stateblock->wineD3DStateBlock = wined3d_stateblock; + } + else + { + wined3d_mutex_lock(); + hr = IWineD3DDevice_CreateStateBlock(device->WineD3DDevice, (WINED3DSTATEBLOCKTYPE)type, + &stateblock->wineD3DStateBlock, (IUnknown *)stateblock); + wined3d_mutex_unlock(); + if (FAILED(hr)) + { + WARN("Failed to create wined3d stateblock, hr %#x.\n", hr); + return hr; + } } - /* allocate a new IDirectD3DStateBlock */ - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DStateBlock9Impl)); - if (!object) return E_OUTOFMEMORY; - object->ref = 1; - object->lpVtbl = &Direct3DStateBlock9_Vtbl; - object->wineD3DStateBlock = wineD3DStateBlock; - IDirect3DDevice9Ex_AddRef(iface); - object->parentDevice = iface; - *ppSB=(IDirect3DStateBlock9*)object; - TRACE("(%p) Returning *ppSB %p, wineD3DStateBlock %p\n", This, *ppSB, wineD3DStateBlock); + stateblock->parentDevice = (IDirect3DDevice9Ex *)device; + IDirect3DDevice9Ex_AddRef(stateblock->parentDevice); + return D3D_OK; } diff --git a/reactos/dll/directx/wine/d3d9/swapchain.c b/reactos/dll/directx/wine/d3d9/swapchain.c index 207504559ee..c692371a258 100644 --- a/reactos/dll/directx/wine/d3d9/swapchain.c +++ b/reactos/dll/directx/wine/d3d9/swapchain.c @@ -79,7 +79,7 @@ static ULONG WINAPI IDirect3DSwapChain9Impl_Release(LPDIRECT3DSWAPCHAIN9 iface) } /* IDirect3DSwapChain9 parts follow: */ -static HRESULT WINAPI IDirect3DSwapChain9Impl_Present(LPDIRECT3DSWAPCHAIN9 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion, DWORD dwFlags) { +static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DSwapChain9Impl_Present(LPDIRECT3DSWAPCHAIN9 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion, DWORD dwFlags) { IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface; HRESULT hr; @@ -269,7 +269,7 @@ HRESULT swapchain_init(IDirect3DSwapChain9Impl *swapchain, IDirect3DDevice9Impl return D3D_OK; } -HRESULT WINAPI IDirect3DDevice9Impl_GetSwapChain(LPDIRECT3DDEVICE9EX iface, UINT iSwapChain, IDirect3DSwapChain9** pSwapChain) { +HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_GetSwapChain(LPDIRECT3DDEVICE9EX iface, UINT iSwapChain, IDirect3DSwapChain9** pSwapChain) { IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; HRESULT hrc = D3D_OK; IWineD3DSwapChain *swapchain = NULL; diff --git a/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.rbuild b/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.rbuild index a09c4055f10..52fc95074c7 100644 --- a/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.rbuild +++ b/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.rbuild @@ -22,6 +22,7 @@ shader.c sprite.c surface.c + texture.c util.c version.rc diff --git a/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.spec b/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.spec index 08bb7f5db60..792408194d2 100644 --- a/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.spec +++ b/reactos/dll/directx/wine/d3dx9_36/d3dx9_36.spec @@ -11,7 +11,7 @@ @ stub D3DXCleanMesh @ stdcall D3DXColorAdjustContrast(ptr ptr long) @ stdcall D3DXColorAdjustSaturation(ptr ptr long) -@ stub D3DXCompileShader +@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) @ stub D3DXCompileShaderFromFileA @ stub D3DXCompileShaderFromFileW @ stub D3DXCompileShaderFromResourceA @@ -92,7 +92,7 @@ @ stub D3DXCreateTeapot @ stub D3DXCreateTextA @ stub D3DXCreateTextW -@ stub D3DXCreateTexture +@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) @ stub D3DXCreateTextureFromFileA @ stub D3DXCreateTextureFromFileExA @ stub D3DXCreateTextureFromFileExW @@ -129,7 +129,7 @@ @ stub D3DXFillVolumeTexture @ stub D3DXFillVolumeTextureTX @ stub D3DXFilterTexture -@ stub D3DXFindShaderComment +@ stdcall D3DXFindShaderComment(ptr long ptr ptr) @ stub D3DXFloat16To32Array @ stub D3DXFloat32To16Array @ stub D3DXFrameAppendChild @@ -157,8 +157,8 @@ @ stdcall D3DXGetImageInfoFromResourceA(long str ptr) @ stdcall D3DXGetImageInfoFromResourceW(long wstr ptr) @ stdcall D3DXGetPixelShaderProfile(ptr) -@ stub D3DXGetShaderConstantTable -@ stub D3DXGetShaderConstantTableEx +@ stdcall D3DXGetShaderConstantTable(ptr ptr) +@ stdcall D3DXGetShaderConstantTableEx(ptr long ptr) @ stub D3DXGetShaderInputSemantics @ stub D3DXGetShaderOutputSemantics @ stub D3DXGetShaderSamplers diff --git a/reactos/dll/directx/wine/d3dx9_36/shader.c b/reactos/dll/directx/wine/d3dx9_36/shader.c index c05f7b74d90..e4de6b32dca 100644 --- a/reactos/dll/directx/wine/d3dx9_36/shader.c +++ b/reactos/dll/directx/wine/d3dx9_36/shader.c @@ -23,6 +23,7 @@ #include "windef.h" #include "wingdi.h" #include "d3dx9.h" +#include "d3dx9shader.h" #include "d3dx9_36_private.h" WINE_DEFAULT_DEBUG_CHANNEL(d3dx); @@ -134,6 +135,41 @@ LPCSTR WINAPI D3DXGetVertexShaderProfile(LPDIRECT3DDEVICE9 device) return NULL; } +HRESULT WINAPI D3DXFindShaderComment(CONST DWORD* byte_code, DWORD fourcc, LPCVOID* data, UINT* size) +{ + CONST DWORD *ptr = byte_code; + + TRACE("(%p, %x, %p, %p)", byte_code, fourcc, data, size); + + if (!byte_code) + return D3DERR_INVALIDCALL; + + while (*++ptr != D3DSIO_END) + { + /* Check if it is a comment */ + if ((*ptr & D3DSI_OPCODE_MASK) == D3DSIO_COMMENT) + { + DWORD comment_size = (*ptr & D3DSI_COMMENTSIZE_MASK) >> D3DSI_COMMENTSIZE_SHIFT; + + /* Check if this is the comment we are looking for */ + if (*(ptr + 1) == fourcc) + { + UINT ctab_size = (comment_size - 1) * sizeof(DWORD); + LPCVOID ctab_data = ptr + 2; + if (size) + *size = ctab_size; + if (data) + *data = ctab_data; + TRACE("Returning comment data at %p with size %d\n", ctab_data, ctab_size); + return D3D_OK; + } + ptr += comment_size; + } + } + + return S_FALSE; +} + HRESULT WINAPI D3DXAssembleShader(LPCSTR data, UINT data_len, CONST D3DXMACRO* defines, @@ -142,7 +178,7 @@ HRESULT WINAPI D3DXAssembleShader(LPCSTR data, LPD3DXBUFFER* shader, LPD3DXBUFFER* error_messages) { - FIXME("stub\n"); + FIXME("(%p, %d, %p, %p, %x, %p, %p): stub\n", data, data_len, defines, include, flags, shader, error_messages); return D3DERR_INVALIDCALL; } @@ -177,7 +213,7 @@ HRESULT WINAPI D3DXAssembleShaderFromFileW(LPCWSTR filename, LPD3DXBUFFER* shader, LPD3DXBUFFER* error_messages) { - FIXME("stub\n"); + FIXME("(%s, %p, %p, %x, %p, %p): stub\n", debugstr_w(filename), defines, include, flags, shader, error_messages); return D3DERR_INVALIDCALL; } @@ -220,3 +256,382 @@ HRESULT WINAPI D3DXAssembleShaderFromResourceW(HMODULE module, return D3DXAssembleShader(buffer, len, defines, include, flags, shader, error_messages); } + +HRESULT WINAPI D3DXCompileShader(LPCSTR pSrcData, + UINT srcDataLen, + CONST D3DXMACRO* pDefines, + LPD3DXINCLUDE pInclude, + LPCSTR pFunctionName, + LPCSTR pProfile, + DWORD Flags, + LPD3DXBUFFER* ppShader, + LPD3DXBUFFER* ppErrorMsgs, + LPD3DXCONSTANTTABLE * ppConstantTable) +{ + FIXME("(%p, %d, %p, %p, %p, %p, %d, %p, %p, %p): stub\n", + pSrcData, srcDataLen, pDefines, pInclude, pFunctionName, + pProfile, Flags, ppShader, ppErrorMsgs, ppConstantTable); + return D3DERR_INVALIDCALL; +} + +static const struct ID3DXConstantTableVtbl ID3DXConstantTable_Vtbl; + +typedef struct ID3DXConstantTableImpl { + const ID3DXConstantTableVtbl *lpVtbl; + LONG ref; + LPVOID ctab; + DWORD size; +} ID3DXConstantTableImpl; + +/*** IUnknown methods ***/ +static HRESULT WINAPI ID3DXConstantTableImpl_QueryInterface(ID3DXConstantTable* iface, REFIID riid, void** ppvObject) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppvObject); + + if (IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_ID3DXConstantTable)) + { + ID3DXConstantTable_AddRef(iface); + *ppvObject = This; + return S_OK; + } + + ERR("Interface %s not found\n", debugstr_guid(riid)); + + return E_NOINTERFACE; +} + +static ULONG WINAPI ID3DXConstantTableImpl_AddRef(ID3DXConstantTable* iface) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + TRACE("(%p)->(): AddRef from %d\n", This, This->ref); + + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI ID3DXConstantTableImpl_Release(ID3DXConstantTable* iface) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(): Release from %d\n", This, ref + 1); + + if (!ref) + { + HeapFree(GetProcessHeap(), 0, This->ctab); + HeapFree(GetProcessHeap(), 0, This); + } + + return ref; +} + +/*** ID3DXBuffer methods ***/ +static LPVOID WINAPI ID3DXConstantTableImpl_GetBufferPointer(ID3DXConstantTable* iface) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + TRACE("(%p)->()\n", This); + + return This->ctab; +} + +static DWORD WINAPI ID3DXConstantTableImpl_GetBufferSize(ID3DXConstantTable* iface) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + TRACE("(%p)->()\n", This); + + return This->size; +} + +/*** ID3DXConstantTable methods ***/ +static HRESULT WINAPI ID3DXConstantTableImpl_GetDesc(ID3DXConstantTable* iface, D3DXCONSTANTTABLE_DESC *desc) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p): stub\n", This, desc); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_GetConstantDesc(ID3DXConstantTable* iface, D3DXHANDLE constant, + D3DXCONSTANT_DESC *desc, UINT *count) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %p): stub\n", This, constant, desc, count); + + return E_NOTIMPL; +} + +static D3DXHANDLE WINAPI ID3DXConstantTableImpl_GetConstant(ID3DXConstantTable* iface, D3DXHANDLE constant, UINT index) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %d): stub\n", This, constant, index); + + return NULL; +} + +static D3DXHANDLE WINAPI ID3DXConstantTableImpl_GetConstantByName(ID3DXConstantTable* iface, D3DXHANDLE constant, LPCSTR name) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %s): stub\n", This, constant, name); + + return NULL; +} + +static D3DXHANDLE WINAPI ID3DXConstantTableImpl_GetConstantByElement(ID3DXConstantTable* iface, D3DXHANDLE constant, UINT index) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %d): stub\n", This, constant, index); + + return NULL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetDefaults(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p): stub\n", This, device); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetValue(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, + D3DXHANDLE constant, LPCVOID data, UINT bytes) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, data, bytes); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetBool(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, + D3DXHANDLE constant, BOOL b) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %d): stub\n", This, device, constant, b); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetBoolArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, + D3DXHANDLE constant, CONST BOOL* b, UINT count) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, b, count); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetInt(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, D3DXHANDLE constant, INT n) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %d): stub\n", This, device, constant, n); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetIntArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, + D3DXHANDLE constant, CONST INT* n, UINT count) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, n, count); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetFloat(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, + D3DXHANDLE constant, FLOAT f) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %f): stub\n", This, device, constant, f); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetFloatArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, + D3DXHANDLE constant, CONST FLOAT* f, UINT count) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, f, count); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetVector(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, + D3DXHANDLE constant, CONST D3DXVECTOR4* vector) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %p): stub\n", This, device, constant, vector); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetVectorArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, + D3DXHANDLE constant, CONST D3DXVECTOR4* vector, UINT count) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, vector, count); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrix(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, + D3DXHANDLE constant, CONST D3DXMATRIX* matrix) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %p): stub\n", This, device, constant, matrix); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, + D3DXHANDLE constant, CONST D3DXMATRIX* matrix, UINT count) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, matrix, count); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixPointerArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, + D3DXHANDLE constant, CONST D3DXMATRIX** matrix, UINT count) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, matrix, count); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixTranspose(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, + D3DXHANDLE constant, CONST D3DXMATRIX* matrix) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %p): stub\n", This, device, constant, matrix); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixTransposeArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, + D3DXHANDLE constant, CONST D3DXMATRIX* matrix, UINT count) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, matrix, count); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ID3DXConstantTableImpl_SetMatrixTransposePointerArray(ID3DXConstantTable* iface, LPDIRECT3DDEVICE9 device, + D3DXHANDLE constant, CONST D3DXMATRIX** matrix, UINT count) +{ + ID3DXConstantTableImpl *This = (ID3DXConstantTableImpl *)iface; + + FIXME("(%p)->(%p, %p, %p, %d): stub\n", This, device, constant, matrix, count); + + return E_NOTIMPL; +} + +static const struct ID3DXConstantTableVtbl ID3DXConstantTable_Vtbl = +{ + /*** IUnknown methods ***/ + ID3DXConstantTableImpl_QueryInterface, + ID3DXConstantTableImpl_AddRef, + ID3DXConstantTableImpl_Release, + /*** ID3DXBuffer methods ***/ + ID3DXConstantTableImpl_GetBufferPointer, + ID3DXConstantTableImpl_GetBufferSize, + /*** ID3DXConstantTable methods ***/ + ID3DXConstantTableImpl_GetDesc, + ID3DXConstantTableImpl_GetConstantDesc, + ID3DXConstantTableImpl_GetConstant, + ID3DXConstantTableImpl_GetConstantByName, + ID3DXConstantTableImpl_GetConstantByElement, + ID3DXConstantTableImpl_SetDefaults, + ID3DXConstantTableImpl_SetValue, + ID3DXConstantTableImpl_SetBool, + ID3DXConstantTableImpl_SetBoolArray, + ID3DXConstantTableImpl_SetInt, + ID3DXConstantTableImpl_SetIntArray, + ID3DXConstantTableImpl_SetFloat, + ID3DXConstantTableImpl_SetFloatArray, + ID3DXConstantTableImpl_SetVector, + ID3DXConstantTableImpl_SetVectorArray, + ID3DXConstantTableImpl_SetMatrix, + ID3DXConstantTableImpl_SetMatrixArray, + ID3DXConstantTableImpl_SetMatrixPointerArray, + ID3DXConstantTableImpl_SetMatrixTranspose, + ID3DXConstantTableImpl_SetMatrixTransposeArray, + ID3DXConstantTableImpl_SetMatrixTransposePointerArray +}; + +HRESULT WINAPI D3DXGetShaderConstantTableEx(CONST DWORD* pFunction, + DWORD flags, + LPD3DXCONSTANTTABLE* ppConstantTable) +{ + ID3DXConstantTableImpl* object; + HRESULT hr; + LPCVOID data; + UINT size; + + FIXME("(%p, %x, %p): semi-stub\n", pFunction, flags, ppConstantTable); + + if (!pFunction || !ppConstantTable) + return D3DERR_INVALIDCALL; + + hr = D3DXFindShaderComment(pFunction, MAKEFOURCC('C','T','A','B'), &data, &size); + if (hr != D3D_OK) + return D3DXERR_INVALIDDATA; + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ID3DXConstantTableImpl)); + if (!object) + { + ERR("Out of memory\n"); + return E_OUTOFMEMORY; + } + + object->lpVtbl = &ID3DXConstantTable_Vtbl; + object->ref = 1; + + object->ctab = HeapAlloc(GetProcessHeap(), 0, size); + if (!object->ctab) + { + HeapFree(GetProcessHeap(), 0, object); + ERR("Out of memory\n"); + return E_OUTOFMEMORY; + } + object->size = size; + memcpy(object->ctab, data, object->size); + + *ppConstantTable = (LPD3DXCONSTANTTABLE)object; + + return D3D_OK; +} + +HRESULT WINAPI D3DXGetShaderConstantTable(CONST DWORD* pFunction, + LPD3DXCONSTANTTABLE* ppConstantTable) +{ + TRACE("(%p, %p): Forwarded to D3DXGetShaderConstantTableEx\n", pFunction, ppConstantTable); + + return D3DXGetShaderConstantTableEx(pFunction, 0, ppConstantTable); +} diff --git a/reactos/dll/directx/wine/d3dx9_36/surface.c b/reactos/dll/directx/wine/d3dx9_36/surface.c index 4d8d1f61346..6de6de77ab2 100644 --- a/reactos/dll/directx/wine/d3dx9_36/surface.c +++ b/reactos/dll/directx/wine/d3dx9_36/surface.c @@ -47,7 +47,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3dx); */ HRESULT WINAPI D3DXGetImageInfoFromFileInMemory(LPCVOID data, UINT datasize, D3DXIMAGE_INFO *info) { - FIXME("stub\n"); + FIXME("(%p, %d, %p): stub\n", data, datasize, info); if(data && datasize && !info) return D3D_OK; if( !data || !datasize ) return D3DERR_INVALIDCALL; @@ -193,7 +193,9 @@ HRESULT WINAPI D3DXLoadSurfaceFromFileInMemory(LPDIRECT3DSURFACE9 pDestSurface, D3DCOLOR Colorkey, D3DXIMAGE_INFO *pSrcInfo) { - FIXME("stub\n"); + FIXME("(%p, %p, %p, %p, %d, %p, %d, %x, %p): stub\n", pDestSurface, pDestPalette, + pDestRect, pSrcData, SrcDataSize, pSrcRect, dwFilter, Colorkey, pSrcInfo); + if( !pDestSurface || !pSrcData | !SrcDataSize ) return D3DERR_INVALIDCALL; return E_NOTIMPL; } diff --git a/reactos/dll/directx/wine/d3dx9_36/texture.c b/reactos/dll/directx/wine/d3dx9_36/texture.c new file mode 100644 index 00000000000..f47853a89df --- /dev/null +++ b/reactos/dll/directx/wine/d3dx9_36/texture.c @@ -0,0 +1,37 @@ +/* + * Copyright 2010 Christian Costa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "wine/debug.h" +#include "d3dx9_36_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3dx); + +HRESULT WINAPI D3DXCreateTexture(LPDIRECT3DDEVICE9 pDevice, + UINT width, + UINT height, + UINT miplevels, + DWORD usage, + D3DFORMAT format, + D3DPOOL pool, + LPDIRECT3DTEXTURE9 *ppTexture) +{ + FIXME("(%p, %d, %d, %d, %x, %x, %x, %p): semi-stub\n", pDevice, width, height, miplevels, usage, format, + pool, ppTexture); + + return IDirect3DDevice9_CreateTexture(pDevice, width, height, miplevels, usage, format, pool, ppTexture, NULL); +} diff --git a/reactos/dll/directx/wine/ddraw/device.c b/reactos/dll/directx/wine/ddraw/device.c index 67fc6f5e266..13ecfa133ac 100644 --- a/reactos/dll/directx/wine/ddraw/device.c +++ b/reactos/dll/directx/wine/ddraw/device.c @@ -1705,13 +1705,13 @@ IDirect3DDeviceImpl_7_EndScene(IDirect3DDevice7 *iface) else return D3DERR_SCENE_NOT_IN_SCENE; } -static HRESULT WINAPI +static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDeviceImpl_7_EndScene_FPUSetup(IDirect3DDevice7 *iface) { return IDirect3DDeviceImpl_7_EndScene(iface); } -static HRESULT WINAPI +static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDeviceImpl_7_EndScene_FPUPreserve(IDirect3DDevice7 *iface) { HRESULT hr; @@ -1724,7 +1724,7 @@ IDirect3DDeviceImpl_7_EndScene_FPUPreserve(IDirect3DDevice7 *iface) return hr; } -static HRESULT WINAPI +static HRESULT WINAPI DECLSPEC_HOTPATCH Thunk_IDirect3DDeviceImpl_3_EndScene(IDirect3DDevice3 *iface) { IDirect3DDeviceImpl *This = device_from_device3(iface); @@ -1732,7 +1732,7 @@ Thunk_IDirect3DDeviceImpl_3_EndScene(IDirect3DDevice3 *iface) return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This); } -static HRESULT WINAPI +static HRESULT WINAPI DECLSPEC_HOTPATCH Thunk_IDirect3DDeviceImpl_2_EndScene(IDirect3DDevice2 *iface) { IDirect3DDeviceImpl *This = device_from_device2(iface); @@ -1740,7 +1740,7 @@ Thunk_IDirect3DDeviceImpl_2_EndScene(IDirect3DDevice2 *iface) return IDirect3DDevice7_EndScene((IDirect3DDevice7 *)This); } -static HRESULT WINAPI +static HRESULT WINAPI DECLSPEC_HOTPATCH Thunk_IDirect3DDeviceImpl_1_EndScene(IDirect3DDevice *iface) { IDirect3DDeviceImpl *This = device_from_device1(iface); @@ -2580,7 +2580,8 @@ IDirect3DDeviceImpl_3_GetRenderState(IDirect3DDevice3 *iface, } if (!(colorop == WINED3DTOP_MODULATE && colorarg1 == WINED3DTA_TEXTURE && colorarg2 == WINED3DTA_CURRENT && - alphaop == WINED3DTOP_SELECTARG1 && alphaarg1 == (tex_alpha ? WINED3DTA_TEXTURE : WINED3DTA_CURRENT))) + alphaop == (tex_alpha ? WINED3DTOP_SELECTARG1 : WINED3DTOP_SELECTARG2) && + alphaarg1 == WINED3DTA_TEXTURE && alphaarg2 == WINED3DTA_CURRENT)) { ERR("Unexpected texture stage state setup, returning D3DTBLEND_MODULATE - likely erroneous\n"); } @@ -2852,16 +2853,12 @@ IDirect3DDeviceImpl_3_SetRenderState(IDirect3DDevice3 *iface, IWineD3DBaseTexture_Release(tex); } - IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG1); if (tex_alpha) - { - IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_TEXTURE); - } + IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG1); else - { - IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_CURRENT); - } - + IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG2); + IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_TEXTURE); + IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG2, WINED3DTA_CURRENT); IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_COLORARG1, WINED3DTA_TEXTURE); IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_COLORARG2, WINED3DTA_CURRENT); IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_COLOROP, WINED3DTOP_MODULATE); @@ -4664,15 +4661,11 @@ IDirect3DDeviceImpl_3_SetTexture(IDirect3DDevice3 *iface, IWineD3DBaseTexture_Release(tex); } - /* alphaop is WINED3DTOP_SELECTARG1 if it's D3DTBLEND_MODULATE, so only modify alphaarg1 */ + /* Arg 1/2 are already set to WINED3DTA_TEXTURE/WINED3DTA_CURRENT in case of D3DTBLEND_MODULATE */ if (tex_alpha) - { - IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_TEXTURE); - } + IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG1); else - { - IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAARG1, WINED3DTA_CURRENT); - } + IWineD3DDevice_SetTextureStageState(This->wineD3DDevice, 0, WINED3DTSS_ALPHAOP, WINED3DTOP_SELECTARG2); } LeaveCriticalSection(&ddraw_cs); diff --git a/reactos/dll/directx/wine/ddraw/main.c b/reactos/dll/directx/wine/ddraw/main.c index 079800d9a2b..bc23987ed81 100644 --- a/reactos/dll/directx/wine/ddraw/main.c +++ b/reactos/dll/directx/wine/ddraw/main.c @@ -302,7 +302,7 @@ err_out: * Arguments, return values: See DDRAW_Create * ***********************************************************************/ -HRESULT WINAPI +HRESULT WINAPI DECLSPEC_HOTPATCH DirectDrawCreate(GUID *GUID, LPDIRECTDRAW *DD, IUnknown *UnkOuter) @@ -325,7 +325,7 @@ DirectDrawCreate(GUID *GUID, * Arguments, return values: See DDRAW_Create * ***********************************************************************/ -HRESULT WINAPI +HRESULT WINAPI DECLSPEC_HOTPATCH DirectDrawCreateEx(GUID *GUID, LPVOID *DD, REFIID iid, @@ -742,14 +742,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) */ HRESULT WINAPI DllCanUnloadNow(void) { - HRESULT hr; - FIXME("(void): stub\n"); - - EnterCriticalSection(&ddraw_cs); - hr = S_FALSE; - LeaveCriticalSection(&ddraw_cs); - - return hr; + return S_FALSE; } /******************************************************************************* diff --git a/reactos/dll/directx/wine/ddraw/vertexbuffer.c b/reactos/dll/directx/wine/ddraw/vertexbuffer.c index df7528b45cb..f16cf124392 100644 --- a/reactos/dll/directx/wine/ddraw/vertexbuffer.c +++ b/reactos/dll/directx/wine/ddraw/vertexbuffer.c @@ -236,8 +236,17 @@ IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface, IDirect3DVertexBufferImpl *This = (IDirect3DVertexBufferImpl *)iface; WINED3DBUFFER_DESC Desc; HRESULT hr; + DWORD wined3d_flags = 0; TRACE("(%p)->(%08x,%p,%p)\n", This, Flags, Data, Size); + /* Writeonly: Pointless. Event: Unsupported by native according to the sdk + * nosyslock: Not applicable + */ + if(!(Flags & DDLOCK_WAIT)) wined3d_flags |= WINED3DLOCK_DONOTWAIT; + if(Flags & DDLOCK_READONLY) wined3d_flags |= WINED3DLOCK_READONLY; + if(Flags & DDLOCK_NOOVERWRITE) wined3d_flags |= WINED3DLOCK_NOOVERWRITE; + if(Flags & DDLOCK_DISCARDCONTENTS) wined3d_flags |= WINED3DLOCK_DISCARD; + EnterCriticalSection(&ddraw_cs); if(Size) { @@ -253,7 +262,7 @@ IDirect3DVertexBufferImpl_Lock(IDirect3DVertexBuffer7 *iface, } hr = IWineD3DBuffer_Map(This->wineD3DVertexBuffer, 0 /* OffsetToLock */, - 0 /* SizeToLock, 0 == Full lock */, (BYTE **)Data, Flags); + 0 /* SizeToLock, 0 == Full lock */, (BYTE **)Data, wined3d_flags); LeaveCriticalSection(&ddraw_cs); return hr; } diff --git a/reactos/dll/directx/wine/ddraw/viewport.c b/reactos/dll/directx/wine/ddraw/viewport.c index 9b0698903f5..b637df1b0f5 100644 --- a/reactos/dll/directx/wine/ddraw/viewport.c +++ b/reactos/dll/directx/wine/ddraw/viewport.c @@ -255,14 +255,25 @@ IDirect3DViewportImpl_GetViewport(IDirect3DViewport3 *iface, TRACE("(%p/%p)->(%p)\n", This, iface, lpData); EnterCriticalSection(&ddraw_cs); - if (This->use_vp2 != 0) { - ERR(" Requesting to get a D3DVIEWPORT struct where a D3DVIEWPORT2 was set !\n"); - LeaveCriticalSection(&ddraw_cs); - return DDERR_INVALIDPARAMS; - } dwSize = lpData->dwSize; memset(lpData, 0, dwSize); - memcpy(lpData, &(This->viewports.vp1), dwSize); + if (!This->use_vp2) + memcpy(lpData, &(This->viewports.vp1), dwSize); + else { + D3DVIEWPORT vp1; + vp1.dwSize = sizeof(vp1); + vp1.dwX = This->viewports.vp2.dwX; + vp1.dwY = This->viewports.vp2.dwY; + vp1.dwWidth = This->viewports.vp2.dwWidth; + vp1.dwHeight = This->viewports.vp2.dwHeight; + vp1.dvMaxX = 0.0; + vp1.dvMaxY = 0.0; + vp1.dvScaleX = 0.0; + vp1.dvScaleY = 0.0; + vp1.dvMinZ = This->viewports.vp2.dvMinZ; + vp1.dvMaxZ = This->viewports.vp2.dvMaxZ; + memcpy(lpData, &vp1, dwSize); + } if (TRACE_ON(d3d7)) { TRACE(" returning D3DVIEWPORT :\n"); @@ -908,14 +919,25 @@ IDirect3DViewportImpl_GetViewport2(IDirect3DViewport3 *iface, TRACE("(%p)->(%p)\n", This, lpData); EnterCriticalSection(&ddraw_cs); - if (This->use_vp2 != 1) { - ERR(" Requesting to get a D3DVIEWPORT2 struct where a D3DVIEWPORT was set !\n"); - LeaveCriticalSection(&ddraw_cs); - return DDERR_INVALIDPARAMS; - } dwSize = lpData->dwSize; memset(lpData, 0, dwSize); - memcpy(lpData, &(This->viewports.vp2), dwSize); + if (This->use_vp2) + memcpy(lpData, &(This->viewports.vp2), dwSize); + else { + D3DVIEWPORT2 vp2; + vp2.dwSize = sizeof(vp2); + vp2.dwX = This->viewports.vp1.dwX; + vp2.dwY = This->viewports.vp1.dwY; + vp2.dwWidth = This->viewports.vp1.dwWidth; + vp2.dwHeight = This->viewports.vp1.dwHeight; + vp2.dvClipX = 0.0; + vp2.dvClipY = 0.0; + vp2.dvClipWidth = 0.0; + vp2.dvClipHeight = 0.0; + vp2.dvMinZ = This->viewports.vp1.dvMinZ; + vp2.dvMaxZ = This->viewports.vp1.dvMaxZ; + memcpy(lpData, &vp2, dwSize); + } if (TRACE_ON(d3d7)) { TRACE(" returning D3DVIEWPORT2 :\n"); diff --git a/reactos/dll/directx/wine/wined3d/arb_program_shader.c b/reactos/dll/directx/wine/wined3d/arb_program_shader.c index 1fdae2a4105..cf7638605eb 100644 --- a/reactos/dll/directx/wine/wined3d/arb_program_shader.c +++ b/reactos/dll/directx/wine/wined3d/arb_program_shader.c @@ -41,6 +41,45 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d); #define GLINFO_LOCATION (*gl_info) +/* Extract a line. Note that this modifies the source string. */ +static char *get_line(char **ptr) +{ + char *p, *q; + + p = *ptr; + if (!(q = strstr(p, "\n"))) + { + if (!*p) return NULL; + *ptr += strlen(p); + return p; + } + *q = '\0'; + *ptr = q + 1; + + return p; +} + +static void shader_arb_dump_program_source(const char *source) +{ + unsigned long source_size; + char *ptr, *line, *tmp; + + source_size = strlen(source) + 1; + tmp = HeapAlloc(GetProcessHeap(), 0, source_size); + if (!tmp) + { + ERR("Failed to allocate %lu bytes for shader source.\n", source_size); + return; + } + memcpy(tmp, source, source_size); + + ptr = tmp; + while ((line = get_line(&ptr))) FIXME(" %s\n", line); + FIXME("\n"); + + HeapFree(GetProcessHeap(), 0, tmp); +} + /* GL locking for state handlers is done by the caller. */ static BOOL need_mova_const(IWineD3DBaseShader *shader, const struct wined3d_gl_info *gl_info) { @@ -1122,10 +1161,10 @@ static void gen_color_correction(struct wined3d_shader_buffer *buffer, const cha { DWORD mask; - if (is_yuv_fixup(fixup)) + if (is_complex_fixup(fixup)) { - enum yuv_fixup yuv_fixup = get_yuv_fixup(fixup); - FIXME("YUV fixup (%#x) not supported\n", yuv_fixup); + enum complex_fixup complex_fixup = get_complex_fixup(fixup); + FIXME("Complex fixup (%#x) not supported\n", complex_fixup); return; } @@ -1761,8 +1800,8 @@ static void pshader_hw_texkill(const struct wined3d_shader_instruction *ins) static void pshader_hw_tex(const struct wined3d_shader_instruction *ins) { - IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader; - IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; + IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device; const struct wined3d_shader_dst_param *dst = &ins->dst[0]; DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major, ins->ctx->reg_maps->shader_version.minor); @@ -1856,8 +1895,8 @@ static void pshader_hw_texcoord(const struct wined3d_shader_instruction *ins) static void pshader_hw_texreg2ar(const struct wined3d_shader_instruction *ins) { struct wined3d_shader_buffer *buffer = ins->ctx->buffer; - IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader; - IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; + IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device; DWORD flags; DWORD reg1 = ins->dst[0].reg.idx; @@ -1904,7 +1943,8 @@ static void pshader_hw_texreg2rgb(const struct wined3d_shader_instruction *ins) static void pshader_hw_texbem(const struct wined3d_shader_instruction *ins) { - IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device; const struct wined3d_shader_dst_param *dst = &ins->dst[0]; struct wined3d_shader_buffer *buffer = ins->ctx->buffer; char reg_coord[40], dst_reg[50], src_reg[50]; @@ -1936,8 +1976,8 @@ static void pshader_hw_texbem(const struct wined3d_shader_instruction *ins) /* with projective textures, texbem only divides the static texture coord, not the displacement, * so we can't let the GL handle this. */ - if (((IWineD3DDeviceImpl*) This->baseShader.device)->stateBlock->textureState[reg_dest_code][WINED3DTSS_TEXTURETRANSFORMFLAGS] - & WINED3DTTFF_PROJECTED) { + if (device->stateBlock->textureState[reg_dest_code][WINED3DTSS_TEXTURETRANSFORMFLAGS] & WINED3DTTFF_PROJECTED) + { shader_addline(buffer, "RCP TB.w, %s.w;\n", reg_coord); shader_addline(buffer, "MUL TB.xy, %s, TB.w;\n", reg_coord); shader_addline(buffer, "ADD TA.xy, TA, TB;\n"); @@ -1975,8 +2015,8 @@ static void pshader_hw_texm3x2pad(const struct wined3d_shader_instruction *ins) static void pshader_hw_texm3x2tex(const struct wined3d_shader_instruction *ins) { - IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader; - IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; + IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device; DWORD flags; DWORD reg = ins->dst[0].reg.idx; struct wined3d_shader_buffer *buffer = ins->ctx->buffer; @@ -1997,10 +2037,10 @@ static void pshader_hw_texm3x2tex(const struct wined3d_shader_instruction *ins) static void pshader_hw_texm3x3pad(const struct wined3d_shader_instruction *ins) { - IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; + SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state; DWORD reg = ins->dst[0].reg.idx; struct wined3d_shader_buffer *buffer = ins->ctx->buffer; - SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state; char src0_name[50], dst_name[50]; struct wined3d_shader_register tmp_reg = ins->dst[0].reg; BOOL is_color; @@ -2020,12 +2060,12 @@ static void pshader_hw_texm3x3pad(const struct wined3d_shader_instruction *ins) static void pshader_hw_texm3x3tex(const struct wined3d_shader_instruction *ins) { - IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader; - IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; + IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device; + SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state; DWORD flags; DWORD reg = ins->dst[0].reg.idx; struct wined3d_shader_buffer *buffer = ins->ctx->buffer; - SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state; char dst_str[50]; char src0_name[50], dst_name[50]; BOOL is_color; @@ -2043,12 +2083,12 @@ static void pshader_hw_texm3x3tex(const struct wined3d_shader_instruction *ins) static void pshader_hw_texm3x3vspec(const struct wined3d_shader_instruction *ins) { - IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader; - IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; + IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device; + SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state; DWORD flags; DWORD reg = ins->dst[0].reg.idx; struct wined3d_shader_buffer *buffer = ins->ctx->buffer; - SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state; char dst_str[50]; char src0_name[50]; char dst_reg[50]; @@ -2085,11 +2125,11 @@ static void pshader_hw_texm3x3vspec(const struct wined3d_shader_instruction *ins static void pshader_hw_texm3x3spec(const struct wined3d_shader_instruction *ins) { - IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader; - IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; + IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device; + SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state; DWORD flags; DWORD reg = ins->dst[0].reg.idx; - SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state; struct wined3d_shader_buffer *buffer = ins->ctx->buffer; char dst_str[50]; char src0_name[50]; @@ -3046,8 +3086,9 @@ static GLuint create_arb_blt_vertex_program(const struct wined3d_gl_info *gl_inf glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); if (pos != -1) { - FIXME("Vertex program error at position %d: %s\n", pos, + FIXME("Vertex program error at position %d: %s\n\n", pos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); + shader_arb_dump_program_source(blt_vprogram); } else { @@ -3108,8 +3149,9 @@ static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_i glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); if (pos != -1) { - FIXME("Fragment program error at position %d: %s\n", pos, + FIXME("Fragment program error at position %d: %s\n\n", pos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); + shader_arb_dump_program_source(blt_fprograms[tex_type]); } else { @@ -3564,8 +3606,9 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos); if (errPos != -1) { - FIXME("HW PixelShader Error at position %d: %s\n", + FIXME("HW PixelShader Error at position %d: %s\n\n", errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); + shader_arb_dump_program_source(buffer->buffer); retval = 0; } else @@ -3974,8 +4017,9 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos); if (errPos != -1) { - FIXME("HW VertexShader Error at position %d: %s\n", + FIXME("HW VertexShader Error at position %d: %s\n\n", errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); + shader_arb_dump_program_source(buffer->buffer); ret = -1; } else @@ -4448,8 +4492,7 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) { if (shader_is_pshader_version(baseShader->baseShader.reg_maps.shader_version.type)) { - IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *) iface; - struct arb_pshader_private *shader_data = This->baseShader.backend_data; + struct arb_pshader_private *shader_data = baseShader->baseShader.backend_data; UINT i; if(!shader_data) return; /* This can happen if a shader was never compiled */ @@ -4471,10 +4514,11 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) { HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders); HeapFree(GetProcessHeap(), 0, shader_data); - This->baseShader.backend_data = NULL; - } else { - IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *) iface; - struct arb_vshader_private *shader_data = This->baseShader.backend_data; + baseShader->baseShader.backend_data = NULL; + } + else + { + struct arb_vshader_private *shader_data = baseShader->baseShader.backend_data; UINT i; if(!shader_data) return; /* This can happen if a shader was never compiled */ @@ -4496,7 +4540,7 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) { HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders); HeapFree(GetProcessHeap(), 0, shader_data); - This->baseShader.backend_data = NULL; + baseShader->baseShader.backend_data = NULL; } } @@ -4565,8 +4609,7 @@ static BOOL shader_arb_dirty_const(IWineD3DDevice *iface) { return TRUE; } -static void shader_arb_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, - struct shader_caps *pCaps) +static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps) { DWORD vs_consts = min(gl_info->limits.arb_vs_float_constants, gl_info->limits.arb_vs_native_constants); DWORD ps_consts = min(gl_info->limits.arb_ps_float_constants, gl_info->limits.arb_ps_native_constants); @@ -4574,7 +4617,7 @@ static void shader_arb_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_ /* We don't have an ARB fixed function pipeline yet, so let the none backend set its caps, * then overwrite the shader specific ones */ - none_shader_backend.shader_get_caps(devtype, gl_info, pCaps); + none_shader_backend.shader_get_caps(gl_info, pCaps); if (gl_info->supported[ARB_VERTEX_PROGRAM]) { @@ -4630,8 +4673,8 @@ static BOOL shader_arb_color_fixup_supported(struct color_fixup_desc fixup) dump_color_fixup_desc(fixup); } - /* We support everything except YUV conversions. */ - if (!is_yuv_fixup(fixup)) + /* We support everything except complex conversions. */ + if (!is_complex_fixup(fixup)) { TRACE("[OK]\n"); return TRUE; @@ -4678,6 +4721,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL /* WINED3DSIH_CMP */ pshader_hw_cmp, /* WINED3DSIH_CND */ pshader_hw_cnd, /* WINED3DSIH_CRS */ shader_hw_map2gl, + /* WINED3DSIH_CUT */ NULL, /* WINED3DSIH_DCL */ NULL, /* WINED3DSIH_DEF */ NULL, /* WINED3DSIH_DEFB */ NULL, @@ -4689,20 +4733,24 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL /* WINED3DSIH_DSX */ shader_hw_map2gl, /* WINED3DSIH_DSY */ shader_hw_dsy, /* WINED3DSIH_ELSE */ shader_hw_else, + /* WINED3DSIH_EMIT */ NULL, /* WINED3DSIH_ENDIF */ shader_hw_endif, /* WINED3DSIH_ENDLOOP */ shader_hw_endloop, /* WINED3DSIH_ENDREP */ shader_hw_endrep, /* WINED3DSIH_EXP */ shader_hw_scalar_op, /* WINED3DSIH_EXPP */ shader_hw_scalar_op, /* WINED3DSIH_FRC */ shader_hw_map2gl, + /* WINED3DSIH_IADD */ NULL, /* WINED3DSIH_IF */ NULL /* Hardcoded into the shader */, /* WINED3DSIH_IFC */ shader_hw_ifc, + /* WINED3DSIH_IGE */ NULL, /* WINED3DSIH_LABEL */ shader_hw_label, /* WINED3DSIH_LIT */ shader_hw_map2gl, /* WINED3DSIH_LOG */ shader_hw_log_pow, /* WINED3DSIH_LOGP */ shader_hw_log_pow, /* WINED3DSIH_LOOP */ shader_hw_loop, /* WINED3DSIH_LRP */ shader_hw_lrp, + /* WINED3DSIH_LT */ NULL, /* WINED3DSIH_M3x2 */ shader_hw_mnxn, /* WINED3DSIH_M3x3 */ shader_hw_mnxn, /* WINED3DSIH_M3x4 */ shader_hw_mnxn, @@ -5229,7 +5277,7 @@ static void arbfp_free(IWineD3DDevice *iface) { } } -static void arbfp_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct fragment_caps *caps) +static void arbfp_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps) { caps->TextureOpCaps = WINED3DTEXOPCAPS_DISABLE | WINED3DTEXOPCAPS_SELECTARG1 | @@ -5858,8 +5906,9 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); if (pos != -1) { - FIXME("Fragment program error at position %d: %s\n", pos, + FIXME("Fragment program error at position %d: %s\n\n", pos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); + shader_arb_dump_program_source(buffer.buffer); } else { @@ -6180,6 +6229,7 @@ struct arbfp_blit_priv { GLenum yuy2_rect_shader, yuy2_2d_shader; GLenum uyvy_rect_shader, uyvy_2d_shader; GLenum yv12_rect_shader, yv12_2d_shader; + GLenum p8_rect_shader, p8_2d_shader; }; static HRESULT arbfp_blit_alloc(IWineD3DDevice *iface) { @@ -6204,20 +6254,22 @@ static void arbfp_blit_free(IWineD3DDevice *iface) { GL_EXTCALL(glDeleteProgramsARB(1, &priv->uyvy_2d_shader)); GL_EXTCALL(glDeleteProgramsARB(1, &priv->yv12_rect_shader)); GL_EXTCALL(glDeleteProgramsARB(1, &priv->yv12_2d_shader)); - checkGLcall("Delete yuv programs"); + GL_EXTCALL(glDeleteProgramsARB(1, &priv->p8_rect_shader)); + GL_EXTCALL(glDeleteProgramsARB(1, &priv->p8_2d_shader)); + checkGLcall("Delete yuv and p8 programs"); LEAVE_GL(); HeapFree(GetProcessHeap(), 0, device->blit_priv); device->blit_priv = NULL; } -static BOOL gen_planar_yuv_read(struct wined3d_shader_buffer *buffer, enum yuv_fixup yuv_fixup, +static BOOL gen_planar_yuv_read(struct wined3d_shader_buffer *buffer, enum complex_fixup fixup, GLenum textype, char *luminance) { char chroma; const char *tex, *texinstr; - if (yuv_fixup == YUV_FIXUP_UYVY) { + if (fixup == COMPLEX_FIXUP_UYVY) { chroma = 'x'; *luminance = 'w'; } else { @@ -6445,8 +6497,74 @@ static BOOL gen_yv12_read(struct wined3d_shader_buffer *buffer, GLenum textype, return TRUE; } +static GLuint gen_p8_shader(IWineD3DDeviceImpl *device, GLenum textype) +{ + GLenum shader; + struct wined3d_shader_buffer buffer; + struct arbfp_blit_priv *priv = device->blit_priv; + GLint pos; + + /* Shader header */ + if (!shader_buffer_init(&buffer)) + { + ERR("Failed to initialize shader buffer.\n"); + return 0; + } + + ENTER_GL(); + GL_EXTCALL(glGenProgramsARB(1, &shader)); + GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, shader)); + LEAVE_GL(); + if(!shader) { + shader_buffer_free(&buffer); + return 0; + } + + shader_addline(&buffer, "!!ARBfp1.0\n"); + shader_addline(&buffer, "TEMP index;\n"); + + /* { 255/256, 0.5/255*255/256, 0, 0 } */ + shader_addline(&buffer, "PARAM constants = { 0.996, 0.00195, 0, 0 };\n"); + + /* The alpha-component contains the palette index */ + if(textype == GL_TEXTURE_RECTANGLE_ARB) + shader_addline(&buffer, "TXP index, fragment.texcoord[0], texture[0], RECT;\n"); + else + shader_addline(&buffer, "TEX index, fragment.texcoord[0], texture[0], 2D;\n"); + + /* Scale the index by 255/256 and add a bias of '0.5' in order to sample in the middle */ + shader_addline(&buffer, "MAD index.a, index.a, constants.x, constants.y;\n"); + + /* Use the alpha-component as an index in the palette to get the final color */ + shader_addline(&buffer, "TEX result.color, index.a, texture[1], 1D;\n"); + shader_addline(&buffer, "END\n"); + + ENTER_GL(); + GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, + strlen(buffer.buffer), buffer.buffer)); + checkGLcall("glProgramStringARB()"); + + glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); + if (pos != -1) + { + FIXME("Fragment program error at position %d: %s\n\n", pos, + debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); + shader_arb_dump_program_source(buffer.buffer); + } + + if (textype == GL_TEXTURE_RECTANGLE_ARB) + priv->p8_rect_shader = shader; + else + priv->p8_2d_shader = shader; + + shader_buffer_free(&buffer); + LEAVE_GL(); + + return shader; +} + /* Context activation is done by the caller. */ -static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixup, GLenum textype) +static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum complex_fixup yuv_fixup, GLenum textype) { GLenum shader; struct wined3d_shader_buffer buffer; @@ -6519,8 +6637,8 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu switch (yuv_fixup) { - case YUV_FIXUP_UYVY: - case YUV_FIXUP_YUY2: + case COMPLEX_FIXUP_UYVY: + case COMPLEX_FIXUP_YUY2: if (!gen_planar_yuv_read(&buffer, yuv_fixup, textype, &luminance_component)) { shader_buffer_free(&buffer); @@ -6528,7 +6646,7 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu } break; - case YUV_FIXUP_YV12: + case COMPLEX_FIXUP_YV12: if (!gen_yv12_read(&buffer, textype, &luminance_component)) { shader_buffer_free(&buffer); @@ -6562,8 +6680,9 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); if (pos != -1) { - FIXME("Fragment program error at position %d: %s\n", pos, + FIXME("Fragment program error at position %d: %s\n\n", pos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); + shader_arb_dump_program_source(buffer.buffer); } else { @@ -6579,20 +6698,22 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum yuv_fixup yuv_fixu switch (yuv_fixup) { - case YUV_FIXUP_YUY2: + case COMPLEX_FIXUP_YUY2: if (textype == GL_TEXTURE_RECTANGLE_ARB) priv->yuy2_rect_shader = shader; else priv->yuy2_2d_shader = shader; break; - case YUV_FIXUP_UYVY: + case COMPLEX_FIXUP_UYVY: if (textype == GL_TEXTURE_RECTANGLE_ARB) priv->uyvy_rect_shader = shader; else priv->uyvy_2d_shader = shader; break; - case YUV_FIXUP_YV12: + case COMPLEX_FIXUP_YV12: if (textype == GL_TEXTURE_RECTANGLE_ARB) priv->yv12_rect_shader = shader; else priv->yv12_2d_shader = shader; break; + default: + ERR("Unsupported complex fixup: %d\n", yuv_fixup); } return shader; @@ -6606,9 +6727,9 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface; float size[4] = {width, height, 1, 1}; struct arbfp_blit_priv *priv = device->blit_priv; - enum yuv_fixup yuv_fixup; + enum complex_fixup fixup; - if (!is_yuv_fixup(format_desc->color_fixup)) + if (!is_complex_fixup(format_desc->color_fixup)) { TRACE("Fixup:\n"); dump_color_fixup_desc(format_desc->color_fixup); @@ -6620,24 +6741,29 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD return WINED3D_OK; } - yuv_fixup = get_yuv_fixup(format_desc->color_fixup); + fixup = get_complex_fixup(format_desc->color_fixup); - switch(yuv_fixup) + switch(fixup) { - case YUV_FIXUP_YUY2: + case COMPLEX_FIXUP_YUY2: shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->yuy2_rect_shader : priv->yuy2_2d_shader; break; - case YUV_FIXUP_UYVY: + case COMPLEX_FIXUP_UYVY: shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->uyvy_rect_shader : priv->uyvy_2d_shader; break; - case YUV_FIXUP_YV12: + case COMPLEX_FIXUP_YV12: shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->yv12_rect_shader : priv->yv12_2d_shader; break; + case COMPLEX_FIXUP_P8: + shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->p8_rect_shader : priv->p8_2d_shader; + if (!shader) shader = gen_p8_shader(device, textype); + break; + default: - FIXME("Unsupported YUV fixup %#x, not setting a shader\n", yuv_fixup); + FIXME("Unsupported complex fixup %#x, not setting a shader\n", fixup); ENTER_GL(); glEnable(textype); checkGLcall("glEnable(textype)"); @@ -6645,7 +6771,7 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD return E_NOTIMPL; } - if (!shader) shader = gen_yuv_shader(device, yuv_fixup, textype); + if (!shader) shader = gen_yuv_shader(device, fixup, textype); ENTER_GL(); glEnable(GL_FRAGMENT_PROGRAM_ARB); @@ -6684,7 +6810,7 @@ static void arbfp_blit_unset(IWineD3DDevice *iface) { static BOOL arbfp_blit_color_fixup_supported(struct color_fixup_desc fixup) { - enum yuv_fixup yuv_fixup; + enum complex_fixup complex_fixup; if (TRACE_ON(d3d_shader) && TRACE_ON(d3d)) { @@ -6699,23 +6825,24 @@ static BOOL arbfp_blit_color_fixup_supported(struct color_fixup_desc fixup) } /* We only support YUV conversions. */ - if (!is_yuv_fixup(fixup)) + if (!is_complex_fixup(fixup)) { TRACE("[FAILED]\n"); return FALSE; } - yuv_fixup = get_yuv_fixup(fixup); - switch(yuv_fixup) + complex_fixup = get_complex_fixup(fixup); + switch(complex_fixup) { - case YUV_FIXUP_YUY2: - case YUV_FIXUP_UYVY: - case YUV_FIXUP_YV12: + case COMPLEX_FIXUP_YUY2: + case COMPLEX_FIXUP_UYVY: + case COMPLEX_FIXUP_YV12: + case COMPLEX_FIXUP_P8: TRACE("[OK]\n"); return TRUE; default: - FIXME("Unsupported YUV fixup %#x\n", yuv_fixup); + FIXME("Unsupported YUV fixup %#x\n", complex_fixup); TRACE("[FAILED]\n"); return FALSE; } diff --git a/reactos/dll/directx/wine/wined3d/ati_fragment_shader.c b/reactos/dll/directx/wine/wined3d/ati_fragment_shader.c index becd4475d0a..0f911e9dc15 100644 --- a/reactos/dll/directx/wine/wined3d/ati_fragment_shader.c +++ b/reactos/dll/directx/wine/wined3d/ati_fragment_shader.c @@ -1061,7 +1061,7 @@ static void atifs_enable(IWineD3DDevice *iface, BOOL enable) { LEAVE_GL(); } -static void atifs_get_caps(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct fragment_caps *caps) +static void atifs_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps) { caps->TextureOpCaps = WINED3DTEXOPCAPS_DISABLE | WINED3DTEXOPCAPS_SELECTARG1 | diff --git a/reactos/dll/directx/wine/wined3d/baseshader.c b/reactos/dll/directx/wine/wined3d/baseshader.c deleted file mode 100644 index 14416c47197..00000000000 --- a/reactos/dll/directx/wine/wined3d/baseshader.c +++ /dev/null @@ -1,1439 +0,0 @@ -/* - * shaders implementation - * - * Copyright 2002-2003 Jason Edmeades - * Copyright 2002-2003 Raphael Junqueira - * Copyright 2004 Christian Costa - * Copyright 2005 Oliver Stieber - * Copyright 2006 Ivan Gyurdiev - * Copyright 2007-2008 Stefan Dösinger for CodeWeavers - * Copyright 2009 Henri Verbeet for CodeWeavers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include -#include -#include "wined3d_private.h" - -WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); -WINE_DECLARE_DEBUG_CHANNEL(d3d); - -static const char *shader_opcode_names[] = -{ - /* WINED3DSIH_ABS */ "abs", - /* WINED3DSIH_ADD */ "add", - /* WINED3DSIH_BEM */ "bem", - /* WINED3DSIH_BREAK */ "break", - /* WINED3DSIH_BREAKC */ "breakc", - /* WINED3DSIH_BREAKP */ "breakp", - /* WINED3DSIH_CALL */ "call", - /* WINED3DSIH_CALLNZ */ "callnz", - /* WINED3DSIH_CMP */ "cmp", - /* WINED3DSIH_CND */ "cnd", - /* WINED3DSIH_CRS */ "crs", - /* WINED3DSIH_DCL */ "dcl", - /* WINED3DSIH_DEF */ "def", - /* WINED3DSIH_DEFB */ "defb", - /* WINED3DSIH_DEFI */ "defi", - /* WINED3DSIH_DP2ADD */ "dp2add", - /* WINED3DSIH_DP3 */ "dp3", - /* WINED3DSIH_DP4 */ "dp4", - /* WINED3DSIH_DST */ "dst", - /* WINED3DSIH_DSX */ "dsx", - /* WINED3DSIH_DSY */ "dsy", - /* WINED3DSIH_ELSE */ "else", - /* WINED3DSIH_ENDIF */ "endif", - /* WINED3DSIH_ENDLOOP */ "endloop", - /* WINED3DSIH_ENDREP */ "endrep", - /* WINED3DSIH_EXP */ "exp", - /* WINED3DSIH_EXPP */ "expp", - /* WINED3DSIH_FRC */ "frc", - /* WINED3DSIH_IF */ "if", - /* WINED3DSIH_IFC */ "ifc", - /* WINED3DSIH_LABEL */ "label", - /* WINED3DSIH_LIT */ "lit", - /* WINED3DSIH_LOG */ "log", - /* WINED3DSIH_LOGP */ "logp", - /* WINED3DSIH_LOOP */ "loop", - /* WINED3DSIH_LRP */ "lrp", - /* WINED3DSIH_M3x2 */ "m3x2", - /* WINED3DSIH_M3x3 */ "m3x3", - /* WINED3DSIH_M3x4 */ "m3x4", - /* WINED3DSIH_M4x3 */ "m4x3", - /* WINED3DSIH_M4x4 */ "m4x4", - /* WINED3DSIH_MAD */ "mad", - /* WINED3DSIH_MAX */ "max", - /* WINED3DSIH_MIN */ "min", - /* WINED3DSIH_MOV */ "mov", - /* WINED3DSIH_MOVA */ "mova", - /* WINED3DSIH_MUL */ "mul", - /* WINED3DSIH_NOP */ "nop", - /* WINED3DSIH_NRM */ "nrm", - /* WINED3DSIH_PHASE */ "phase", - /* WINED3DSIH_POW */ "pow", - /* WINED3DSIH_RCP */ "rcp", - /* WINED3DSIH_REP */ "rep", - /* WINED3DSIH_RET */ "ret", - /* WINED3DSIH_RSQ */ "rsq", - /* WINED3DSIH_SETP */ "setp", - /* WINED3DSIH_SGE */ "sge", - /* WINED3DSIH_SGN */ "sgn", - /* WINED3DSIH_SINCOS */ "sincos", - /* WINED3DSIH_SLT */ "slt", - /* WINED3DSIH_SUB */ "sub", - /* WINED3DSIH_TEX */ "texld", - /* WINED3DSIH_TEXBEM */ "texbem", - /* WINED3DSIH_TEXBEML */ "texbeml", - /* WINED3DSIH_TEXCOORD */ "texcrd", - /* WINED3DSIH_TEXDEPTH */ "texdepth", - /* WINED3DSIH_TEXDP3 */ "texdp3", - /* WINED3DSIH_TEXDP3TEX */ "texdp3tex", - /* WINED3DSIH_TEXKILL */ "texkill", - /* WINED3DSIH_TEXLDD */ "texldd", - /* WINED3DSIH_TEXLDL */ "texldl", - /* WINED3DSIH_TEXM3x2DEPTH */ "texm3x2depth", - /* WINED3DSIH_TEXM3x2PAD */ "texm3x2pad", - /* WINED3DSIH_TEXM3x2TEX */ "texm3x2tex", - /* WINED3DSIH_TEXM3x3 */ "texm3x3", - /* WINED3DSIH_TEXM3x3DIFF */ "texm3x3diff", - /* WINED3DSIH_TEXM3x3PAD */ "texm3x3pad", - /* WINED3DSIH_TEXM3x3SPEC */ "texm3x3spec", - /* WINED3DSIH_TEXM3x3TEX */ "texm3x3tex", - /* WINED3DSIH_TEXM3x3VSPEC */ "texm3x3vspec", - /* WINED3DSIH_TEXREG2AR */ "texreg2ar", - /* WINED3DSIH_TEXREG2GB */ "texreg2gb", - /* WINED3DSIH_TEXREG2RGB */ "texreg2rgb", -}; - -const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token) -{ - switch (version_token >> 16) - { - case WINED3D_SM1_VS: - case WINED3D_SM1_PS: - return &sm1_shader_frontend; - - case WINED3D_SM4_PS: - case WINED3D_SM4_VS: - case WINED3D_SM4_GS: - return &sm4_shader_frontend; - - default: - FIXME("Unrecognised version token %#x\n", version_token); - return NULL; - } -} - -void shader_buffer_clear(struct wined3d_shader_buffer *buffer) -{ - buffer->buffer[0] = '\0'; - buffer->bsize = 0; - buffer->lineNo = 0; - buffer->newline = TRUE; -} - -BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer) -{ - buffer->buffer = HeapAlloc(GetProcessHeap(), 0, SHADER_PGMSIZE); - if (!buffer->buffer) - { - ERR("Failed to allocate shader buffer memory.\n"); - return FALSE; - } - - shader_buffer_clear(buffer); - return TRUE; -} - -void shader_buffer_free(struct wined3d_shader_buffer *buffer) -{ - HeapFree(GetProcessHeap(), 0, buffer->buffer); -} - -int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *format, va_list args) -{ - char* base = buffer->buffer + buffer->bsize; - int rc; - - rc = vsnprintf(base, SHADER_PGMSIZE - 1 - buffer->bsize, format, args); - - if (rc < 0 /* C89 */ || (unsigned int)rc > SHADER_PGMSIZE - 1 - buffer->bsize /* C99 */) - { - ERR("The buffer allocated for the shader program string " - "is too small at %d bytes.\n", SHADER_PGMSIZE); - buffer->bsize = SHADER_PGMSIZE - 1; - return -1; - } - - if (buffer->newline) { - TRACE("GL HW (%u, %u) : %s", buffer->lineNo + 1, buffer->bsize, base); - buffer->newline = FALSE; - } else { - TRACE("%s", base); - } - - buffer->bsize += rc; - if (buffer->buffer[buffer->bsize-1] == '\n') { - buffer->lineNo++; - buffer->newline = TRUE; - } - return 0; -} - -int shader_addline(struct wined3d_shader_buffer *buffer, const char *format, ...) -{ - int ret; - va_list args; - - va_start(args, format); - ret = shader_vaddline(buffer, format, args); - va_end(args); - - return ret; -} - -void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) -{ - shader->ref = 1; - shader->device = (IWineD3DDevice *)device; - shader->parent = parent; - shader->parent_ops = parent_ops; - list_init(&shader->linked_programs); - list_add_head(&device->shaders, &shader->shader_list_entry); -} - -/* Convert floating point offset relative - * to a register file to an absolute offset for float constants */ -static unsigned int shader_get_float_offset(WINED3DSHADER_PARAM_REGISTER_TYPE register_type, UINT register_idx) -{ - switch (register_type) - { - case WINED3DSPR_CONST: return register_idx; - case WINED3DSPR_CONST2: return 2048 + register_idx; - case WINED3DSPR_CONST3: return 4096 + register_idx; - case WINED3DSPR_CONST4: return 6144 + register_idx; - default: - FIXME("Unsupported register type: %d\n", register_type); - return register_idx; - } -} - -static void shader_delete_constant_list(struct list* clist) { - - struct list *ptr; - struct local_constant* constant; - - ptr = list_head(clist); - while (ptr) { - constant = LIST_ENTRY(ptr, struct local_constant, entry); - ptr = list_next(clist, ptr); - HeapFree(GetProcessHeap(), 0, constant); - } - list_init(clist); -} - -static inline void set_bitmap_bit(DWORD *bitmap, DWORD bit) -{ - DWORD idx, shift; - idx = bit >> 5; - shift = bit & 0x1f; - bitmap[idx] |= (1 << shift); -} - -static void shader_record_register_usage(IWineD3DBaseShaderImpl *This, struct shader_reg_maps *reg_maps, - const struct wined3d_shader_register *reg, enum wined3d_shader_type shader_type) -{ - switch (reg->type) - { - case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */ - if (shader_type == WINED3D_SHADER_TYPE_PIXEL) reg_maps->texcoord |= 1 << reg->idx; - else reg_maps->address |= 1 << reg->idx; - break; - - case WINED3DSPR_TEMP: - reg_maps->temporary |= 1 << reg->idx; - break; - - case WINED3DSPR_INPUT: - if (shader_type == WINED3D_SHADER_TYPE_PIXEL) - { - if (reg->rel_addr) - { - /* If relative addressing is used, we must assume that all registers - * are used. Even if it is a construct like v3[aL], we can't assume - * that v0, v1 and v2 aren't read because aL can be negative */ - unsigned int i; - for (i = 0; i < MAX_REG_INPUT; ++i) - { - ((IWineD3DPixelShaderImpl *)This)->input_reg_used[i] = TRUE; - } - } - else - { - ((IWineD3DPixelShaderImpl *)This)->input_reg_used[reg->idx] = TRUE; - } - } - else reg_maps->input_registers |= 1 << reg->idx; - break; - - case WINED3DSPR_RASTOUT: - if (reg->idx == 1) reg_maps->fog = 1; - break; - - case WINED3DSPR_MISCTYPE: - if (shader_type == WINED3D_SHADER_TYPE_PIXEL) - { - if (reg->idx == 0) reg_maps->vpos = 1; - else if (reg->idx == 1) reg_maps->usesfacing = 1; - } - break; - - case WINED3DSPR_CONST: - if (reg->rel_addr) - { - if (shader_type != WINED3D_SHADER_TYPE_PIXEL) - { - if (reg->idx < ((IWineD3DVertexShaderImpl *)This)->min_rel_offset) - { - ((IWineD3DVertexShaderImpl *)This)->min_rel_offset = reg->idx; - } - if (reg->idx > ((IWineD3DVertexShaderImpl *)This)->max_rel_offset) - { - ((IWineD3DVertexShaderImpl *)This)->max_rel_offset = reg->idx; - } - } - reg_maps->usesrelconstF = TRUE; - } - else - { - set_bitmap_bit(reg_maps->constf, reg->idx); - } - break; - - case WINED3DSPR_CONSTINT: - reg_maps->integer_constants |= (1 << reg->idx); - break; - - case WINED3DSPR_CONSTBOOL: - reg_maps->boolean_constants |= (1 << reg->idx); - break; - - case WINED3DSPR_COLOROUT: - reg_maps->highest_render_target = max(reg_maps->highest_render_target, reg->idx); - break; - - default: - TRACE("Not recording register of type %#x and idx %u\n", reg->type, reg->idx); - break; - } -} - -static unsigned int get_instr_extra_regcount(enum WINED3D_SHADER_INSTRUCTION_HANDLER instr, unsigned int param) -{ - switch(instr) - { - case WINED3DSIH_M4x4: - case WINED3DSIH_M3x4: - return param == 1 ? 3 : 0; - - case WINED3DSIH_M4x3: - case WINED3DSIH_M3x3: - return param == 1 ? 2 : 0; - - case WINED3DSIH_M3x2: - return param == 1 ? 1 : 0; - - default: - return 0; - } -} - -static const char *semantic_names[] = -{ - /* WINED3DDECLUSAGE_POSITION */ "SV_POSITION", - /* WINED3DDECLUSAGE_BLENDWEIGHT */ "BLENDWEIGHT", - /* WINED3DDECLUSAGE_BLENDINDICES */ "BLENDINDICES", - /* WINED3DDECLUSAGE_NORMAL */ "NORMAL", - /* WINED3DDECLUSAGE_PSIZE */ "PSIZE", - /* WINED3DDECLUSAGE_TEXCOORD */ "TEXCOORD", - /* WINED3DDECLUSAGE_TANGENT */ "TANGENT", - /* WINED3DDECLUSAGE_BINORMAL */ "BINORMAL", - /* WINED3DDECLUSAGE_TESSFACTOR */ "TESSFACTOR", - /* WINED3DDECLUSAGE_POSITIONT */ "POSITIONT", - /* WINED3DDECLUSAGE_COLOR */ "COLOR", - /* WINED3DDECLUSAGE_FOG */ "FOG", - /* WINED3DDECLUSAGE_DEPTH */ "DEPTH", - /* WINED3DDECLUSAGE_SAMPLE */ "SAMPLE", -}; - -static const char *shader_semantic_name_from_usage(WINED3DDECLUSAGE usage) -{ - if (usage >= sizeof(semantic_names) / sizeof(*semantic_names)) - { - FIXME("Unrecognized usage %#x\n", usage); - return "UNRECOGNIZED"; - } - - return semantic_names[usage]; -} - -WINED3DDECLUSAGE shader_usage_from_semantic_name(const char *name) -{ - unsigned int i; - - for (i = 0; i < sizeof(semantic_names) / sizeof(*semantic_names); ++i) - { - if (!strcmp(name, semantic_names[i])) return i; - } - - return ~0U; -} - -BOOL shader_match_semantic(const char *semantic_name, WINED3DDECLUSAGE usage) -{ - return !strcmp(semantic_name, shader_semantic_name_from_usage(usage)); -} - -static void shader_signature_from_semantic(struct wined3d_shader_signature_element *e, - const struct wined3d_shader_semantic *s) -{ - e->semantic_name = shader_semantic_name_from_usage(s->usage); - e->semantic_idx = s->usage_idx; - e->sysval_semantic = 0; - e->component_type = 0; - e->register_idx = s->reg.reg.idx; - e->mask = s->reg.write_mask; -} - -/* Note that this does not count the loop register - * as an address register. */ - -HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3d_shader_frontend *fe, - struct shader_reg_maps *reg_maps, struct wined3d_shader_signature_element *input_signature, - struct wined3d_shader_signature_element *output_signature, const DWORD *byte_code, DWORD constf_size) -{ - IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface; - void *fe_data = This->baseShader.frontend_data; - struct wined3d_shader_version shader_version; - unsigned int cur_loop_depth = 0, max_loop_depth = 0; - const DWORD* pToken = byte_code; - - /* There are some minor differences between pixel and vertex shaders */ - - memset(reg_maps, 0, sizeof(*reg_maps)); - - /* get_registers_used is called on every compile on some 1.x shaders, which can result - * in stacking up a collection of local constants. Delete the old constants if existing - */ - shader_delete_constant_list(&This->baseShader.constantsF); - shader_delete_constant_list(&This->baseShader.constantsB); - shader_delete_constant_list(&This->baseShader.constantsI); - - fe->shader_read_header(fe_data, &pToken, &shader_version); - reg_maps->shader_version = shader_version; - - reg_maps->constf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - sizeof(*reg_maps->constf) * ((constf_size + 31) / 32)); - if(!reg_maps->constf) { - ERR("Out of memory\n"); - return E_OUTOFMEMORY; - } - - while (!fe->shader_is_end(fe_data, &pToken)) - { - struct wined3d_shader_instruction ins; - const char *comment; - UINT param_size; - - /* Skip comments */ - fe->shader_read_comment(&pToken, &comment); - if (comment) continue; - - /* Fetch opcode */ - fe->shader_read_opcode(fe_data, &pToken, &ins, ¶m_size); - - /* Unhandled opcode, and its parameters */ - if (ins.handler_idx == WINED3DSIH_TABLE_SIZE) - { - TRACE("Skipping unrecognized instruction.\n"); - pToken += param_size; - continue; - } - - /* Handle declarations */ - if (ins.handler_idx == WINED3DSIH_DCL) - { - struct wined3d_shader_semantic semantic; - - fe->shader_read_semantic(&pToken, &semantic); - - switch (semantic.reg.reg.type) - { - /* Mark input registers used. */ - case WINED3DSPR_INPUT: - reg_maps->input_registers |= 1 << semantic.reg.reg.idx; - shader_signature_from_semantic(&input_signature[semantic.reg.reg.idx], &semantic); - break; - - /* Vshader: mark 3.0 output registers used, save token */ - case WINED3DSPR_OUTPUT: - reg_maps->output_registers |= 1 << semantic.reg.reg.idx; - shader_signature_from_semantic(&output_signature[semantic.reg.reg.idx], &semantic); - if (semantic.usage == WINED3DDECLUSAGE_FOG) reg_maps->fog = 1; - break; - - /* Save sampler usage token */ - case WINED3DSPR_SAMPLER: - reg_maps->sampler_type[semantic.reg.reg.idx] = semantic.sampler_type; - break; - - default: - TRACE("Not recording DCL register type %#x.\n", semantic.reg.reg.type); - break; - } - } - else if (ins.handler_idx == WINED3DSIH_DEF) - { - struct wined3d_shader_dst_param dst; - struct wined3d_shader_src_param rel_addr; - - local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant)); - if (!lconst) return E_OUTOFMEMORY; - - fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr); - lconst->idx = dst.reg.idx; - - memcpy(lconst->value, pToken, 4 * sizeof(DWORD)); - pToken += 4; - - /* In pixel shader 1.X shaders, the constants are clamped between [-1;1] */ - if (shader_version.major == 1 && shader_version.type == WINED3D_SHADER_TYPE_PIXEL) - { - float *value = (float *) lconst->value; - if (value[0] < -1.0f) value[0] = -1.0f; - else if (value[0] > 1.0f) value[0] = 1.0f; - if (value[1] < -1.0f) value[1] = -1.0f; - else if (value[1] > 1.0f) value[1] = 1.0f; - if (value[2] < -1.0f) value[2] = -1.0f; - else if (value[2] > 1.0f) value[2] = 1.0f; - if (value[3] < -1.0f) value[3] = -1.0f; - else if (value[3] > 1.0f) value[3] = 1.0f; - } - - list_add_head(&This->baseShader.constantsF, &lconst->entry); - } - else if (ins.handler_idx == WINED3DSIH_DEFI) - { - struct wined3d_shader_dst_param dst; - struct wined3d_shader_src_param rel_addr; - - local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant)); - if (!lconst) return E_OUTOFMEMORY; - - fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr); - lconst->idx = dst.reg.idx; - - memcpy(lconst->value, pToken, 4 * sizeof(DWORD)); - pToken += 4; - - list_add_head(&This->baseShader.constantsI, &lconst->entry); - reg_maps->local_int_consts |= (1 << dst.reg.idx); - } - else if (ins.handler_idx == WINED3DSIH_DEFB) - { - struct wined3d_shader_dst_param dst; - struct wined3d_shader_src_param rel_addr; - - local_constant* lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant)); - if (!lconst) return E_OUTOFMEMORY; - - fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr); - lconst->idx = dst.reg.idx; - - memcpy(lconst->value, pToken, sizeof(DWORD)); - ++pToken; - - list_add_head(&This->baseShader.constantsB, &lconst->entry); - reg_maps->local_bool_consts |= (1 << dst.reg.idx); - } - /* If there's a loop in the shader */ - else if (ins.handler_idx == WINED3DSIH_LOOP - || ins.handler_idx == WINED3DSIH_REP) - { - struct wined3d_shader_src_param src, rel_addr; - - fe->shader_read_src_param(fe_data, &pToken, &src, &rel_addr); - - /* Rep and Loop always use an integer constant for the control parameters */ - if (ins.handler_idx == WINED3DSIH_REP) - { - reg_maps->integer_constants |= 1 << src.reg.idx; - } - else - { - fe->shader_read_src_param(fe_data, &pToken, &src, &rel_addr); - reg_maps->integer_constants |= 1 << src.reg.idx; - } - - cur_loop_depth++; - if(cur_loop_depth > max_loop_depth) - max_loop_depth = cur_loop_depth; - } - else if (ins.handler_idx == WINED3DSIH_ENDLOOP - || ins.handler_idx == WINED3DSIH_ENDREP) - { - cur_loop_depth--; - } - /* For subroutine prototypes */ - else if (ins.handler_idx == WINED3DSIH_LABEL) - { - struct wined3d_shader_src_param src, rel_addr; - - fe->shader_read_src_param(fe_data, &pToken, &src, &rel_addr); - reg_maps->labels |= 1 << src.reg.idx; - } - /* Set texture, address, temporary registers */ - else - { - int i, limit; - BOOL color0_mov = FALSE; - - /* This will loop over all the registers and try to - * make a bitmask of the ones we're interested in. - * - * Relative addressing tokens are ignored, but that's - * okay, since we'll catch any address registers when - * they are initialized (required by spec) */ - - if (ins.dst_count) - { - struct wined3d_shader_dst_param dst_param; - struct wined3d_shader_src_param dst_rel_addr; - - fe->shader_read_dst_param(fe_data, &pToken, &dst_param, &dst_rel_addr); - - shader_record_register_usage(This, reg_maps, &dst_param.reg, shader_version.type); - - /* WINED3DSPR_TEXCRDOUT is the same as WINED3DSPR_OUTPUT. _OUTPUT can be > MAX_REG_TEXCRD and - * is used in >= 3.0 shaders. Filter 3.0 shaders to prevent overflows, and also filter pixel - * shaders because TECRDOUT isn't used in them, but future register types might cause issues */ - if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX && shader_version.major < 3 - && dst_param.reg.type == WINED3DSPR_TEXCRDOUT) - { - reg_maps->texcoord_mask[dst_param.reg.idx] |= dst_param.write_mask; - } - - if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL) - { - IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)This; - - if(dst_param.reg.type == WINED3DSPR_COLOROUT && dst_param.reg.idx == 0) - { - /* Many 2.0 and 3.0 pixel shaders end with a MOV from a temp register to - * COLOROUT 0. If we know this in advance, the ARB shader backend can skip - * the mov and perform the sRGB write correction from the source register. - * - * However, if the mov is only partial, we can't do this, and if the write - * comes from an instruction other than MOV it is hard to do as well. If - * COLOROUT 0 is overwritten partially later, the marker is dropped again. */ - - ps->color0_mov = FALSE; - if (ins.handler_idx == WINED3DSIH_MOV) - { - /* Used later when the source register is read. */ - color0_mov = TRUE; - } - } - /* Also drop the MOV marker if the source register is overwritten prior to the shader - * end - */ - else if(dst_param.reg.type == WINED3DSPR_TEMP && dst_param.reg.idx == ps->color0_reg) - { - ps->color0_mov = FALSE; - } - } - - /* Declare 1.X samplers implicitly, based on the destination reg. number */ - if (shader_version.major == 1 - && (ins.handler_idx == WINED3DSIH_TEX - || ins.handler_idx == WINED3DSIH_TEXBEM - || ins.handler_idx == WINED3DSIH_TEXBEML - || ins.handler_idx == WINED3DSIH_TEXDP3TEX - || ins.handler_idx == WINED3DSIH_TEXM3x2TEX - || ins.handler_idx == WINED3DSIH_TEXM3x3SPEC - || ins.handler_idx == WINED3DSIH_TEXM3x3TEX - || ins.handler_idx == WINED3DSIH_TEXM3x3VSPEC - || ins.handler_idx == WINED3DSIH_TEXREG2AR - || ins.handler_idx == WINED3DSIH_TEXREG2GB - || ins.handler_idx == WINED3DSIH_TEXREG2RGB)) - { - /* Fake sampler usage, only set reserved bit and ttype */ - DWORD sampler_code = dst_param.reg.idx; - - TRACE("Setting fake 2D sampler for 1.x pixelshader\n"); - reg_maps->sampler_type[sampler_code] = WINED3DSTT_2D; - - /* texbem is only valid with < 1.4 pixel shaders */ - if (ins.handler_idx == WINED3DSIH_TEXBEM - || ins.handler_idx == WINED3DSIH_TEXBEML) - { - reg_maps->bumpmat |= 1 << dst_param.reg.idx; - if (ins.handler_idx == WINED3DSIH_TEXBEML) - { - reg_maps->luminanceparams |= 1 << dst_param.reg.idx; - } - } - } - else if (ins.handler_idx == WINED3DSIH_BEM) - { - reg_maps->bumpmat |= 1 << dst_param.reg.idx; - } - } - - if (ins.handler_idx == WINED3DSIH_NRM) - { - reg_maps->usesnrm = 1; - } - else if (ins.handler_idx == WINED3DSIH_DSY) - { - reg_maps->usesdsy = 1; - } - else if (ins.handler_idx == WINED3DSIH_DSX) - { - reg_maps->usesdsx = 1; - } - else if(ins.handler_idx == WINED3DSIH_TEXLDD) - { - reg_maps->usestexldd = 1; - } - else if(ins.handler_idx == WINED3DSIH_TEXLDL) - { - reg_maps->usestexldl = 1; - } - else if(ins.handler_idx == WINED3DSIH_MOVA) - { - reg_maps->usesmova = 1; - } - else if(ins.handler_idx == WINED3DSIH_IFC) - { - reg_maps->usesifc = 1; - } - else if(ins.handler_idx == WINED3DSIH_CALL) - { - reg_maps->usescall = 1; - } - - limit = ins.src_count + (ins.predicate ? 1 : 0); - for (i = 0; i < limit; ++i) - { - struct wined3d_shader_src_param src_param, src_rel_addr; - unsigned int count; - - fe->shader_read_src_param(fe_data, &pToken, &src_param, &src_rel_addr); - count = get_instr_extra_regcount(ins.handler_idx, i); - - shader_record_register_usage(This, reg_maps, &src_param.reg, shader_version.type); - while (count) - { - ++src_param.reg.idx; - shader_record_register_usage(This, reg_maps, &src_param.reg, shader_version.type); - --count; - } - - if(color0_mov) - { - IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) This; - if(src_param.reg.type == WINED3DSPR_TEMP && - src_param.swizzle == WINED3DSP_NOSWIZZLE) - { - ps->color0_mov = TRUE; - ps->color0_reg = src_param.reg.idx; - } - } - } - } - } - reg_maps->loop_depth = max_loop_depth; - - This->baseShader.functionLength = ((const char *)pToken - (const char *)byte_code); - - return WINED3D_OK; -} - -unsigned int shader_find_free_input_register(const struct shader_reg_maps *reg_maps, unsigned int max) -{ - DWORD map = 1 << max; - map |= map - 1; - map &= reg_maps->shader_version.major < 3 ? ~reg_maps->texcoord : ~reg_maps->input_registers; - - return wined3d_log2i(map); -} - -static void shader_dump_decl_usage(const struct wined3d_shader_semantic *semantic, - const struct wined3d_shader_version *shader_version) -{ - TRACE("dcl"); - - if (semantic->reg.reg.type == WINED3DSPR_SAMPLER) - { - switch (semantic->sampler_type) - { - case WINED3DSTT_2D: TRACE("_2d"); break; - case WINED3DSTT_CUBE: TRACE("_cube"); break; - case WINED3DSTT_VOLUME: TRACE("_volume"); break; - default: TRACE("_unknown_ttype(0x%08x)", semantic->sampler_type); - } - } - else - { - /* Pixel shaders 3.0 don't have usage semantics */ - if (shader_version->major < 3 && shader_version->type == WINED3D_SHADER_TYPE_PIXEL) - return; - else - TRACE("_"); - - switch (semantic->usage) - { - case WINED3DDECLUSAGE_POSITION: - TRACE("position%d", semantic->usage_idx); - break; - case WINED3DDECLUSAGE_BLENDINDICES: - TRACE("blend"); - break; - case WINED3DDECLUSAGE_BLENDWEIGHT: - TRACE("weight"); - break; - case WINED3DDECLUSAGE_NORMAL: - TRACE("normal%d", semantic->usage_idx); - break; - case WINED3DDECLUSAGE_PSIZE: - TRACE("psize"); - break; - case WINED3DDECLUSAGE_COLOR: - if (semantic->usage_idx == 0) TRACE("color"); - else TRACE("specular%d", (semantic->usage_idx - 1)); - break; - case WINED3DDECLUSAGE_TEXCOORD: - TRACE("texture%d", semantic->usage_idx); - break; - case WINED3DDECLUSAGE_TANGENT: - TRACE("tangent"); - break; - case WINED3DDECLUSAGE_BINORMAL: - TRACE("binormal"); - break; - case WINED3DDECLUSAGE_TESSFACTOR: - TRACE("tessfactor"); - break; - case WINED3DDECLUSAGE_POSITIONT: - TRACE("positionT%d", semantic->usage_idx); - break; - case WINED3DDECLUSAGE_FOG: - TRACE("fog"); - break; - case WINED3DDECLUSAGE_DEPTH: - TRACE("depth"); - break; - case WINED3DDECLUSAGE_SAMPLE: - TRACE("sample"); - break; - default: - FIXME("unknown_semantics(0x%08x)", semantic->usage); - } - } -} - -static void shader_dump_register(const struct wined3d_shader_register *reg, - const struct wined3d_shader_version *shader_version) -{ - static const char * const rastout_reg_names[] = {"oPos", "oFog", "oPts"}; - static const char * const misctype_reg_names[] = {"vPos", "vFace"}; - UINT offset = reg->idx; - - switch (reg->type) - { - case WINED3DSPR_TEMP: - TRACE("r"); - break; - - case WINED3DSPR_INPUT: - TRACE("v"); - break; - - case WINED3DSPR_CONST: - case WINED3DSPR_CONST2: - case WINED3DSPR_CONST3: - case WINED3DSPR_CONST4: - TRACE("c"); - offset = shader_get_float_offset(reg->type, reg->idx); - break; - - case WINED3DSPR_TEXTURE: /* vs: case WINED3DSPR_ADDR */ - TRACE("%c", shader_version->type == WINED3D_SHADER_TYPE_PIXEL ? 't' : 'a'); - break; - - case WINED3DSPR_RASTOUT: - TRACE("%s", rastout_reg_names[reg->idx]); - break; - - case WINED3DSPR_COLOROUT: - TRACE("oC"); - break; - - case WINED3DSPR_DEPTHOUT: - TRACE("oDepth"); - break; - - case WINED3DSPR_ATTROUT: - TRACE("oD"); - break; - - case WINED3DSPR_TEXCRDOUT: - /* Vertex shaders >= 3.0 use general purpose output registers - * (WINED3DSPR_OUTPUT), which can include an address token */ - if (shader_version->major >= 3) TRACE("o"); - else TRACE("oT"); - break; - - case WINED3DSPR_CONSTINT: - TRACE("i"); - break; - - case WINED3DSPR_CONSTBOOL: - TRACE("b"); - break; - - case WINED3DSPR_LABEL: - TRACE("l"); - break; - - case WINED3DSPR_LOOP: - TRACE("aL"); - break; - - case WINED3DSPR_SAMPLER: - TRACE("s"); - break; - - case WINED3DSPR_MISCTYPE: - if (reg->idx > 1) FIXME("Unhandled misctype register %d\n", reg->idx); - else TRACE("%s", misctype_reg_names[reg->idx]); - break; - - case WINED3DSPR_PREDICATE: - TRACE("p"); - break; - - case WINED3DSPR_IMMCONST: - TRACE("l"); - break; - - case WINED3DSPR_CONSTBUFFER: - TRACE("cb"); - break; - - default: - TRACE("unhandled_rtype(%#x)", reg->type); - break; - } - - if (reg->type == WINED3DSPR_IMMCONST) - { - TRACE("("); - switch (reg->immconst_type) - { - case WINED3D_IMMCONST_FLOAT: - TRACE("%.8e", *(const float *)reg->immconst_data); - break; - - case WINED3D_IMMCONST_FLOAT4: - TRACE("%.8e, %.8e, %.8e, %.8e", - *(const float *)®->immconst_data[0], *(const float *)®->immconst_data[1], - *(const float *)®->immconst_data[2], *(const float *)®->immconst_data[3]); - break; - - default: - TRACE("", reg->immconst_type); - break; - } - TRACE(")"); - } - else if (reg->type != WINED3DSPR_RASTOUT && reg->type != WINED3DSPR_MISCTYPE) - { - if (reg->array_idx != ~0U) - { - TRACE("%u[%u", offset, reg->array_idx); - if (reg->rel_addr) - { - TRACE(" + "); - shader_dump_src_param(reg->rel_addr, shader_version); - } - TRACE("]"); - } - else - { - if (reg->rel_addr) - { - TRACE("["); - shader_dump_src_param(reg->rel_addr, shader_version); - TRACE(" + "); - } - TRACE("%u", offset); - if (reg->rel_addr) TRACE("]"); - } - } -} - -void shader_dump_dst_param(const struct wined3d_shader_dst_param *param, - const struct wined3d_shader_version *shader_version) -{ - DWORD write_mask = param->write_mask; - - shader_dump_register(¶m->reg, shader_version); - - if (write_mask != WINED3DSP_WRITEMASK_ALL) - { - static const char *write_mask_chars = "xyzw"; - - TRACE("."); - if (write_mask & WINED3DSP_WRITEMASK_0) TRACE("%c", write_mask_chars[0]); - if (write_mask & WINED3DSP_WRITEMASK_1) TRACE("%c", write_mask_chars[1]); - if (write_mask & WINED3DSP_WRITEMASK_2) TRACE("%c", write_mask_chars[2]); - if (write_mask & WINED3DSP_WRITEMASK_3) TRACE("%c", write_mask_chars[3]); - } -} - -void shader_dump_src_param(const struct wined3d_shader_src_param *param, - const struct wined3d_shader_version *shader_version) -{ - DWORD src_modifier = param->modifiers; - DWORD swizzle = param->swizzle; - - if (src_modifier == WINED3DSPSM_NEG - || src_modifier == WINED3DSPSM_BIASNEG - || src_modifier == WINED3DSPSM_SIGNNEG - || src_modifier == WINED3DSPSM_X2NEG - || src_modifier == WINED3DSPSM_ABSNEG) - TRACE("-"); - else if (src_modifier == WINED3DSPSM_COMP) - TRACE("1-"); - else if (src_modifier == WINED3DSPSM_NOT) - TRACE("!"); - - if (src_modifier == WINED3DSPSM_ABS || src_modifier == WINED3DSPSM_ABSNEG) - TRACE("abs("); - - shader_dump_register(¶m->reg, shader_version); - - if (src_modifier) - { - switch (src_modifier) - { - case WINED3DSPSM_NONE: break; - case WINED3DSPSM_NEG: break; - case WINED3DSPSM_NOT: break; - case WINED3DSPSM_BIAS: TRACE("_bias"); break; - case WINED3DSPSM_BIASNEG: TRACE("_bias"); break; - case WINED3DSPSM_SIGN: TRACE("_bx2"); break; - case WINED3DSPSM_SIGNNEG: TRACE("_bx2"); break; - case WINED3DSPSM_COMP: break; - case WINED3DSPSM_X2: TRACE("_x2"); break; - case WINED3DSPSM_X2NEG: TRACE("_x2"); break; - case WINED3DSPSM_DZ: TRACE("_dz"); break; - case WINED3DSPSM_DW: TRACE("_dw"); break; - case WINED3DSPSM_ABSNEG: TRACE(")"); break; - case WINED3DSPSM_ABS: TRACE(")"); break; - default: - TRACE("_unknown_modifier(%#x)", src_modifier); - } - } - - if (swizzle != WINED3DSP_NOSWIZZLE) - { - static const char *swizzle_chars = "xyzw"; - DWORD swizzle_x = swizzle & 0x03; - DWORD swizzle_y = (swizzle >> 2) & 0x03; - DWORD swizzle_z = (swizzle >> 4) & 0x03; - DWORD swizzle_w = (swizzle >> 6) & 0x03; - - if (swizzle_x == swizzle_y - && swizzle_x == swizzle_z - && swizzle_x == swizzle_w) - { - TRACE(".%c", swizzle_chars[swizzle_x]); - } - else - { - TRACE(".%c%c%c%c", swizzle_chars[swizzle_x], swizzle_chars[swizzle_y], - swizzle_chars[swizzle_z], swizzle_chars[swizzle_w]); - } - } -} - -/* Shared code in order to generate the bulk of the shader string. - * NOTE: A description of how to parse tokens can be found on msdn */ -void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffer *buffer, - const shader_reg_maps *reg_maps, const DWORD *pFunction, void *backend_ctx) -{ - IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface; - IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device; /* To access shader backend callbacks */ - const struct wined3d_shader_frontend *fe = This->baseShader.frontend; - void *fe_data = This->baseShader.frontend_data; - struct wined3d_shader_src_param src_rel_addr[4]; - struct wined3d_shader_src_param src_param[4]; - struct wined3d_shader_version shader_version; - struct wined3d_shader_src_param dst_rel_addr; - struct wined3d_shader_dst_param dst_param; - struct wined3d_shader_instruction ins; - struct wined3d_shader_context ctx; - const DWORD *pToken = pFunction; - DWORD i; - - /* Initialize current parsing state */ - ctx.shader = iface; - ctx.reg_maps = reg_maps; - ctx.buffer = buffer; - ctx.backend_data = backend_ctx; - - ins.ctx = &ctx; - ins.dst = &dst_param; - ins.src = src_param; - This->baseShader.parse_state.current_row = 0; - - fe->shader_read_header(fe_data, &pToken, &shader_version); - - while (!fe->shader_is_end(fe_data, &pToken)) - { - const char *comment; - UINT param_size; - - /* Skip comment tokens */ - fe->shader_read_comment(&pToken, &comment); - if (comment) continue; - - /* Read opcode */ - fe->shader_read_opcode(fe_data, &pToken, &ins, ¶m_size); - - /* Unknown opcode and its parameters */ - if (ins.handler_idx == WINED3DSIH_TABLE_SIZE) - { - TRACE("Skipping unrecognized instruction.\n"); - pToken += param_size; - continue; - } - - /* Nothing to do */ - if (ins.handler_idx == WINED3DSIH_DCL - || ins.handler_idx == WINED3DSIH_NOP - || ins.handler_idx == WINED3DSIH_DEF - || ins.handler_idx == WINED3DSIH_DEFI - || ins.handler_idx == WINED3DSIH_DEFB - || ins.handler_idx == WINED3DSIH_PHASE) - { - pToken += param_size; - continue; - } - - /* Destination token */ - if (ins.dst_count) fe->shader_read_dst_param(fe_data, &pToken, &dst_param, &dst_rel_addr); - - /* Predication token */ - if (ins.predicate) ins.predicate = *pToken++; - - /* Other source tokens */ - for (i = 0; i < ins.src_count; ++i) - { - fe->shader_read_src_param(fe_data, &pToken, &src_param[i], &src_rel_addr[i]); - } - - /* Call appropriate function for output target */ - device->shader_backend->shader_handle_instruction(&ins); - } -} - -static void shader_dump_ins_modifiers(const struct wined3d_shader_dst_param *dst) -{ - DWORD mmask = dst->modifiers; - - switch (dst->shift) - { - case 0: break; - case 13: TRACE("_d8"); break; - case 14: TRACE("_d4"); break; - case 15: TRACE("_d2"); break; - case 1: TRACE("_x2"); break; - case 2: TRACE("_x4"); break; - case 3: TRACE("_x8"); break; - default: TRACE("_unhandled_shift(%d)", dst->shift); break; - } - - if (mmask & WINED3DSPDM_SATURATE) TRACE("_sat"); - if (mmask & WINED3DSPDM_PARTIALPRECISION) TRACE("_pp"); - if (mmask & WINED3DSPDM_MSAMPCENTROID) TRACE("_centroid"); - - mmask &= ~(WINED3DSPDM_SATURATE | WINED3DSPDM_PARTIALPRECISION | WINED3DSPDM_MSAMPCENTROID); - if (mmask) - FIXME("_unrecognized_modifier(%#x)", mmask); -} - -void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *pFunction) -{ - struct wined3d_shader_version shader_version; - const DWORD* pToken = pFunction; - const char *type_prefix; - DWORD i; - - TRACE("Parsing %p\n", pFunction); - - fe->shader_read_header(fe_data, &pToken, &shader_version); - - switch (shader_version.type) - { - case WINED3D_SHADER_TYPE_VERTEX: - type_prefix = "vs"; - break; - - case WINED3D_SHADER_TYPE_GEOMETRY: - type_prefix = "gs"; - break; - - case WINED3D_SHADER_TYPE_PIXEL: - type_prefix = "ps"; - break; - - default: - FIXME("Unhandled shader type %#x.\n", shader_version.type); - type_prefix = "unknown"; - break; - } - - TRACE("%s_%u_%u\n", type_prefix, shader_version.major, shader_version.minor); - - while (!fe->shader_is_end(fe_data, &pToken)) - { - struct wined3d_shader_instruction ins; - const char *comment; - UINT param_size; - - /* comment */ - fe->shader_read_comment(&pToken, &comment); - if (comment) - { - TRACE("//%s\n", comment); - continue; - } - - fe->shader_read_opcode(fe_data, &pToken, &ins, ¶m_size); - if (ins.handler_idx == WINED3DSIH_TABLE_SIZE) - { - TRACE("Skipping unrecognized instruction.\n"); - pToken += param_size; - continue; - } - - if (ins.handler_idx == WINED3DSIH_DCL) - { - struct wined3d_shader_semantic semantic; - - fe->shader_read_semantic(&pToken, &semantic); - - shader_dump_decl_usage(&semantic, &shader_version); - shader_dump_ins_modifiers(&semantic.reg); - TRACE(" "); - shader_dump_dst_param(&semantic.reg, &shader_version); - } - else if (ins.handler_idx == WINED3DSIH_DEF) - { - struct wined3d_shader_dst_param dst; - struct wined3d_shader_src_param rel_addr; - - fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr); - - TRACE("def c%u = %f, %f, %f, %f", shader_get_float_offset(dst.reg.type, dst.reg.idx), - *(const float *)(pToken), - *(const float *)(pToken + 1), - *(const float *)(pToken + 2), - *(const float *)(pToken + 3)); - pToken += 4; - } - else if (ins.handler_idx == WINED3DSIH_DEFI) - { - struct wined3d_shader_dst_param dst; - struct wined3d_shader_src_param rel_addr; - - fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr); - - TRACE("defi i%u = %d, %d, %d, %d", dst.reg.idx, - *(pToken), - *(pToken + 1), - *(pToken + 2), - *(pToken + 3)); - pToken += 4; - } - else if (ins.handler_idx == WINED3DSIH_DEFB) - { - struct wined3d_shader_dst_param dst; - struct wined3d_shader_src_param rel_addr; - - fe->shader_read_dst_param(fe_data, &pToken, &dst, &rel_addr); - - TRACE("defb b%u = %s", dst.reg.idx, *pToken ? "true" : "false"); - ++pToken; - } - else - { - struct wined3d_shader_src_param dst_rel_addr, src_rel_addr; - struct wined3d_shader_dst_param dst_param; - struct wined3d_shader_src_param src_param; - - if (ins.dst_count) - { - fe->shader_read_dst_param(fe_data, &pToken, &dst_param, &dst_rel_addr); - } - - /* Print out predication source token first - it follows - * the destination token. */ - if (ins.predicate) - { - fe->shader_read_src_param(fe_data, &pToken, &src_param, &src_rel_addr); - TRACE("("); - shader_dump_src_param(&src_param, &shader_version); - TRACE(") "); - } - - /* PixWin marks instructions with the coissue flag with a '+' */ - if (ins.coissue) TRACE("+"); - - TRACE("%s", shader_opcode_names[ins.handler_idx]); - - if (ins.handler_idx == WINED3DSIH_IFC - || ins.handler_idx == WINED3DSIH_BREAKC) - { - switch (ins.flags) - { - case COMPARISON_GT: TRACE("_gt"); break; - case COMPARISON_EQ: TRACE("_eq"); break; - case COMPARISON_GE: TRACE("_ge"); break; - case COMPARISON_LT: TRACE("_lt"); break; - case COMPARISON_NE: TRACE("_ne"); break; - case COMPARISON_LE: TRACE("_le"); break; - default: TRACE("_(%u)", ins.flags); - } - } - else if (ins.handler_idx == WINED3DSIH_TEX - && shader_version.major >= 2 - && (ins.flags & WINED3DSI_TEXLD_PROJECT)) - { - TRACE("p"); - } - - /* We already read the destination token, print it. */ - if (ins.dst_count) - { - shader_dump_ins_modifiers(&dst_param); - TRACE(" "); - shader_dump_dst_param(&dst_param, &shader_version); - } - - /* Other source tokens */ - for (i = ins.dst_count; i < (ins.dst_count + ins.src_count); ++i) - { - fe->shader_read_src_param(fe_data, &pToken, &src_param, &src_rel_addr); - TRACE(!i ? " " : ", "); - shader_dump_src_param(&src_param, &shader_version); - } - } - TRACE("\n"); - } -} - -void shader_cleanup(IWineD3DBaseShader *iface) -{ - IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)iface; - - ((IWineD3DDeviceImpl *)This->baseShader.device)->shader_backend->shader_destroy(iface); - HeapFree(GetProcessHeap(), 0, This->baseShader.reg_maps.constf); - HeapFree(GetProcessHeap(), 0, This->baseShader.function); - shader_delete_constant_list(&This->baseShader.constantsF); - shader_delete_constant_list(&This->baseShader.constantsB); - shader_delete_constant_list(&This->baseShader.constantsI); - list_remove(&This->baseShader.shader_list_entry); - - if (This->baseShader.frontend && This->baseShader.frontend_data) - { - This->baseShader.frontend->shader_free(This->baseShader.frontend_data); - } -} - -static void shader_none_handle_instruction(const struct wined3d_shader_instruction *ins) {} -static void shader_none_select(const struct wined3d_context *context, BOOL usePS, BOOL useVS) {} -static void shader_none_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) {} -static void shader_none_deselect_depth_blt(IWineD3DDevice *iface) {} -static void shader_none_update_float_vertex_constants(IWineD3DDevice *iface, UINT start, UINT count) {} -static void shader_none_update_float_pixel_constants(IWineD3DDevice *iface, UINT start, UINT count) {} -static void shader_none_load_constants(const struct wined3d_context *context, char usePS, char useVS) {} -static void shader_none_load_np2fixup_constants(IWineD3DDevice *iface, char usePS, char useVS) {} -static void shader_none_destroy(IWineD3DBaseShader *iface) {} -static HRESULT shader_none_alloc(IWineD3DDevice *iface) {return WINED3D_OK;} -static void shader_none_free(IWineD3DDevice *iface) {} -static BOOL shader_none_dirty_const(IWineD3DDevice *iface) {return FALSE;} - -static void shader_none_get_caps(WINED3DDEVTYPE devtype, - const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps) -{ - /* Set the shader caps to 0 for the none shader backend */ - pCaps->VertexShaderVersion = 0; - pCaps->PixelShaderVersion = 0; - pCaps->PixelShader1xMaxValue = 0.0f; -} - -static BOOL shader_none_color_fixup_supported(struct color_fixup_desc fixup) -{ - if (TRACE_ON(d3d_shader) && TRACE_ON(d3d)) - { - TRACE("Checking support for fixup:\n"); - dump_color_fixup_desc(fixup); - } - - /* Faked to make some apps happy. */ - if (!is_yuv_fixup(fixup)) - { - TRACE("[OK]\n"); - return TRUE; - } - - TRACE("[FAILED]\n"); - return FALSE; -} - -const shader_backend_t none_shader_backend = { - shader_none_handle_instruction, - shader_none_select, - shader_none_select_depth_blt, - shader_none_deselect_depth_blt, - shader_none_update_float_vertex_constants, - shader_none_update_float_pixel_constants, - shader_none_load_constants, - shader_none_load_np2fixup_constants, - shader_none_destroy, - shader_none_alloc, - shader_none_free, - shader_none_dirty_const, - shader_none_get_caps, - shader_none_color_fixup_supported, -}; diff --git a/reactos/dll/directx/wine/wined3d/buffer.c b/reactos/dll/directx/wine/wined3d/buffer.c index 20201b12eb3..e22d311beb9 100644 --- a/reactos/dll/directx/wine/wined3d/buffer.c +++ b/reactos/dll/directx/wine/wined3d/buffer.c @@ -3,7 +3,7 @@ * Copyright 2002-2005 Raphael Junqueira * Copyright 2004 Christian Costa * Copyright 2005 Oliver Stieber - * Copyright 2007 Stefan Dösinger for CodeWeavers + * Copyright 2007-2010 Stefan Dösinger for CodeWeavers * Copyright 2009 Henri Verbeet for CodeWeavers * * This library is free software; you can redistribute it and/or @@ -56,7 +56,13 @@ static inline BOOL buffer_add_dirty_area(struct wined3d_buffer *This, UINT offse } } - if(!offset && !size) + if(offset > This->resource.size || offset + size > This->resource.size) + { + WARN("Invalid range dirtified, marking entire buffer dirty\n"); + offset = 0; + size = This->resource.size; + } + else if(!offset && !size) { size = This->resource.size; } @@ -145,11 +151,6 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This) { TRACE("Gl usage = GL_STREAM_DRAW_ARB\n"); gl_usage = GL_STREAM_DRAW_ARB; - } - else - { - TRACE("Gl usage = GL_DYNAMIC_DRAW_ARB\n"); - gl_usage = GL_DYNAMIC_DRAW_ARB; if(gl_info->supported[APPLE_FLUSH_BUFFER_RANGE]) { @@ -157,6 +158,12 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This) checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE)"); This->flags |= WINED3D_BUFFER_FLUSH; } + /* No setup is needed here for GL_ARB_map_buffer_range */ + } + else + { + TRACE("Gl usage = GL_DYNAMIC_DRAW_ARB\n"); + gl_usage = GL_DYNAMIC_DRAW_ARB; } /* Reserve memory for the buffer. The amount of data won't change @@ -483,7 +490,7 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This) * FLOAT16s if not supported. Also, we can't iterate over the array, so use macros to generate code for all * the attributes that our current fixed function pipeline implementation cares for. */ - BOOL support_d3dcolor = gl_info->supported[EXT_VERTEX_ARRAY_BGRA]; + BOOL support_d3dcolor = gl_info->supported[ARB_VERTEX_ARRAY_BGRA]; ret = buffer_check_attribute(This, si, WINED3D_FFP_POSITION, TRUE, TRUE, FALSE, &stride_this_run, &float16_used) || ret; ret = buffer_check_attribute(This, si, WINED3D_FFP_NORMAL, @@ -1026,6 +1033,51 @@ static WINED3DRESOURCETYPE STDMETHODCALLTYPE buffer_GetType(IWineD3DBuffer *ifac /* IWineD3DBuffer methods */ +static DWORD buffer_sanitize_flags(DWORD flags) +{ + /* Not all flags make sense together, but Windows never returns an error. Catch the + * cases that could cause issues */ + if(flags & WINED3DLOCK_READONLY) + { + if(flags & WINED3DLOCK_DISCARD) + { + WARN("WINED3DLOCK_READONLY combined with WINED3DLOCK_DISCARD, ignoring flags\n"); + return 0; + } + if(flags & WINED3DLOCK_NOOVERWRITE) + { + WARN("WINED3DLOCK_READONLY combined with WINED3DLOCK_NOOVERWRITE, ignoring flags\n"); + return 0; + } + } + else if((flags & (WINED3DLOCK_DISCARD | WINED3DLOCK_NOOVERWRITE)) == (WINED3DLOCK_DISCARD | WINED3DLOCK_NOOVERWRITE)) + { + WARN("WINED3DLOCK_DISCARD and WINED3DLOCK_NOOVERWRITE used together, ignoring\n"); + return 0; + } + + return flags; +} + +static GLbitfield buffer_gl_map_flags(DWORD d3d_flags) +{ + GLbitfield ret = 0; + + if (!(d3d_flags & WINED3DLOCK_READONLY)) ret = GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT; + + if (d3d_flags & (WINED3DLOCK_DISCARD | WINED3DLOCK_NOOVERWRITE)) + { + if(d3d_flags & WINED3DLOCK_DISCARD) ret |= GL_MAP_INVALIDATE_BUFFER_BIT; + ret |= GL_MAP_UNSYNCHRONIZED_BIT; + } + else + { + ret |= GL_MAP_READ_BIT; + } + + return ret; +} + static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset, UINT size, BYTE **data, DWORD flags) { struct wined3d_buffer *This = (struct wined3d_buffer *)iface; @@ -1033,7 +1085,11 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset, TRACE("iface %p, offset %u, size %u, data %p, flags %#x\n", iface, offset, size, data, flags); - if (!buffer_add_dirty_area(This, offset, size)) return E_OUTOFMEMORY; + flags = buffer_sanitize_flags(flags); + if (!(flags & WINED3DLOCK_READONLY)) + { + if (!buffer_add_dirty_area(This, offset, size)) return E_OUTOFMEMORY; + } count = InterlockedIncrement(&This->lock_count); @@ -1043,6 +1099,7 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset, { IWineD3DDeviceImpl *device = This->resource.device; struct wined3d_context *context; + const struct wined3d_gl_info *gl_info; if(This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB) { @@ -1050,9 +1107,20 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset, } context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD); + gl_info = context->gl_info; ENTER_GL(); GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object)); - This->resource.allocatedMemory = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_READ_WRITE_ARB)); + + if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) + { + GLbitfield mapflags = buffer_gl_map_flags(flags); + This->resource.allocatedMemory = GL_EXTCALL(glMapBufferRange(This->buffer_type_hint, 0, + This->resource.size, mapflags)); + } + else + { + This->resource.allocatedMemory = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_READ_WRITE_ARB)); + } LEAVE_GL(); context_release(context); } @@ -1093,6 +1161,7 @@ static HRESULT STDMETHODCALLTYPE buffer_Unmap(IWineD3DBuffer *iface) if(!(This->flags & WINED3D_BUFFER_DOUBLEBUFFER) && This->buffer_object) { IWineD3DDeviceImpl *device = This->resource.device; + const struct wined3d_gl_info *gl_info; struct wined3d_context *context; if(This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB) @@ -1101,10 +1170,21 @@ static HRESULT STDMETHODCALLTYPE buffer_Unmap(IWineD3DBuffer *iface) } context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD); + gl_info = context->gl_info; ENTER_GL(); GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object)); - if(This->flags & WINED3D_BUFFER_FLUSH) + if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) + { + for(i = 0; i < This->modified_areas; i++) + { + GL_EXTCALL(glFlushMappedBufferRange(This->buffer_type_hint, + This->maps[i].offset, + This->maps[i].size)); + checkGLcall("glFlushMappedBufferRange"); + } + } + else if (This->flags & WINED3D_BUFFER_FLUSH) { for(i = 0; i < This->modified_areas; i++) { @@ -1196,8 +1276,7 @@ HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device, TRACE("size %#x, usage %#x, format %s, memory @ %p, iface @ %p.\n", buffer->resource.size, buffer->resource.usage, debug_d3dformat(buffer->resource.format_desc->format), buffer->resource.allocatedMemory, buffer); - /* TODO: GL_ARB_map_buffer_range */ - dynamic_buffer_ok = gl_info->supported[APPLE_FLUSH_BUFFER_RANGE]; + dynamic_buffer_ok = gl_info->supported[APPLE_FLUSH_BUFFER_RANGE] || gl_info->supported[ARB_MAP_BUFFER_RANGE]; /* Observations show that drawStridedSlow is faster on dynamic VBs than converting + * drawStridedFast (half-life 2 and others). diff --git a/reactos/dll/directx/wine/wined3d/context.c b/reactos/dll/directx/wine/wined3d/context.c index 2aec7d6bfd3..08789855812 100644 --- a/reactos/dll/directx/wine/wined3d/context.c +++ b/reactos/dll/directx/wine/wined3d/context.c @@ -114,7 +114,7 @@ static void context_destroy_fbo(struct wined3d_context *context, GLuint *fbo) } /* GL locking is done by the caller */ -static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOOL force_preload) +static void context_apply_attachment_filter_states(IWineD3DSurface *surface) { const IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface; IWineD3DDeviceImpl *device = surface_impl->resource.device; @@ -148,7 +148,7 @@ static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOO IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture_impl); } - if (update_minfilter || update_magfilter || force_preload) + if (update_minfilter || update_magfilter) { GLenum target, bind_target; GLint old_binding; @@ -166,8 +166,6 @@ static void context_apply_attachment_filter_states(IWineD3DSurface *surface, BOO glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARB, &old_binding); } - surface_internal_preload(surface, SRGB_RGB); - glBindTexture(bind_target, surface_impl->texture_name); if (update_minfilter) glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); if (update_magfilter) glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); @@ -208,7 +206,8 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context, } else { - context_apply_attachment_filter_states(depth_stencil, TRUE); + surface_prepare_texture(depth_stencil_impl, FALSE); + context_apply_attachment_filter_states(depth_stencil); if (format_flags & WINED3DFMT_FLAG_DEPTH) { @@ -253,14 +252,15 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context, void context_attach_surface_fbo(const struct wined3d_context *context, GLenum fbo_target, DWORD idx, IWineD3DSurface *surface) { - const IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface; + IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface; const struct wined3d_gl_info *gl_info = context->gl_info; TRACE("Attach surface %p to %u\n", surface, idx); if (surface) { - context_apply_attachment_filter_states(surface, TRUE); + surface_prepare_texture(surface_impl, FALSE); + context_apply_attachment_filter_states(surface); gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx, surface_impl->texture_target, surface_impl->texture_name, surface_impl->texture_level); @@ -431,10 +431,10 @@ static void context_apply_fbo_entry(struct wined3d_context *context, struct fbo_ for (i = 0; i < gl_info->limits.buffers; ++i) { if (device->render_targets[i]) - context_apply_attachment_filter_states(device->render_targets[i], FALSE); + context_apply_attachment_filter_states(device->render_targets[i]); } if (device->stencilBufferTarget) - context_apply_attachment_filter_states(device->stencilBufferTarget, FALSE); + context_apply_attachment_filter_states(device->stencilBufferTarget); } for (i = 0; i < gl_info->limits.buffers; ++i) @@ -532,32 +532,38 @@ void context_alloc_event_query(struct wined3d_context *context, struct wined3d_e if (context->free_event_query_count) { - query->id = context->free_event_queries[--context->free_event_query_count]; + query->object = context->free_event_queries[--context->free_event_query_count]; } else { - if (gl_info->supported[APPLE_FENCE]) + if (gl_info->supported[ARB_SYNC]) + { + /* Using ARB_sync, not much to do here. */ + query->object.sync = NULL; + TRACE("Allocated event query %p in context %p.\n", query->object.sync, context); + } + else if (gl_info->supported[APPLE_FENCE]) { ENTER_GL(); - GL_EXTCALL(glGenFencesAPPLE(1, &query->id)); + GL_EXTCALL(glGenFencesAPPLE(1, &query->object.id)); checkGLcall("glGenFencesAPPLE"); LEAVE_GL(); - TRACE("Allocated event query %u in context %p.\n", query->id, context); + TRACE("Allocated event query %u in context %p.\n", query->object.id, context); } else if(gl_info->supported[NV_FENCE]) { ENTER_GL(); - GL_EXTCALL(glGenFencesNV(1, &query->id)); + GL_EXTCALL(glGenFencesNV(1, &query->object.id)); checkGLcall("glGenFencesNV"); LEAVE_GL(); - TRACE("Allocated event query %u in context %p.\n", query->id, context); + TRACE("Allocated event query %u in context %p.\n", query->object.id, context); } else { WARN("Event queries not supported, not allocating query id.\n"); - query->id = 0; + query->object.id = 0; } } @@ -575,12 +581,12 @@ void context_free_event_query(struct wined3d_event_query *query) if (context->free_event_query_count >= context->free_event_query_size - 1) { UINT new_size = context->free_event_query_size << 1; - GLuint *new_data = HeapReAlloc(GetProcessHeap(), 0, context->free_event_queries, + union wined3d_gl_query_object *new_data = HeapReAlloc(GetProcessHeap(), 0, context->free_event_queries, new_size * sizeof(*context->free_event_queries)); if (!new_data) { - ERR("Failed to grow free list, leaking query %u in context %p.\n", query->id, context); + ERR("Failed to grow free list, leaking query %u in context %p.\n", query->object.id, context); return; } @@ -588,7 +594,7 @@ void context_free_event_query(struct wined3d_event_query *query) context->free_event_queries = new_data; } - context->free_event_queries[context->free_event_query_count++] = query->id; + context->free_event_queries[context->free_event_query_count++] = query->object; } void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource, WINED3DRESOURCETYPE type) @@ -661,6 +667,7 @@ static void context_destroy_gl_resources(struct wined3d_context *context) struct fbo_entry *entry, *entry2; HGLRC restore_ctx; HDC restore_dc; + unsigned int i; restore_ctx = pwglGetCurrentContext(); restore_dc = pwglGetCurrentDC(); @@ -682,8 +689,12 @@ static void context_destroy_gl_resources(struct wined3d_context *context) { if (context->valid) { - if (gl_info->supported[APPLE_FENCE]) GL_EXTCALL(glDeleteFencesAPPLE(1, &event_query->id)); - else if (gl_info->supported[NV_FENCE]) GL_EXTCALL(glDeleteFencesNV(1, &event_query->id)); + if (gl_info->supported[ARB_SYNC]) + { + if (event_query->object.sync) GL_EXTCALL(glDeleteSync(event_query->object.sync)); + } + else if (gl_info->supported[APPLE_FENCE]) GL_EXTCALL(glDeleteFencesAPPLE(1, &event_query->object.id)); + else if (gl_info->supported[NV_FENCE]) GL_EXTCALL(glDeleteFencesNV(1, &event_query->object.id)); } event_query->context = NULL; } @@ -720,10 +731,24 @@ static void context_destroy_gl_resources(struct wined3d_context *context) if (gl_info->supported[ARB_OCCLUSION_QUERY]) GL_EXTCALL(glDeleteQueriesARB(context->free_occlusion_query_count, context->free_occlusion_queries)); - if (gl_info->supported[APPLE_FENCE]) - GL_EXTCALL(glDeleteFencesAPPLE(context->free_event_query_count, context->free_event_queries)); + if (gl_info->supported[ARB_SYNC]) + { + if (event_query->object.sync) GL_EXTCALL(glDeleteSync(event_query->object.sync)); + } + else if (gl_info->supported[APPLE_FENCE]) + { + for (i = 0; i < context->free_event_query_count; ++i) + { + GL_EXTCALL(glDeleteFencesAPPLE(1, &context->free_event_queries[i].id)); + } + } else if (gl_info->supported[NV_FENCE]) - GL_EXTCALL(glDeleteFencesNV(context->free_event_query_count, context->free_event_queries)); + { + for (i = 0; i < context->free_event_query_count; ++i) + { + GL_EXTCALL(glDeleteFencesNV(1, &context->free_event_queries[i].id)); + } + } checkGLcall("context cleanup"); } @@ -2131,6 +2156,8 @@ static void context_apply_state(struct wined3d_context *context, IWineD3DDeviceI if (context->render_offscreen) { FIXME("Activating for CTXUSAGE_BLIT for an offscreen target with ORM_FBO. This should be avoided.\n"); + surface_internal_preload(context->current_rt, SRGB_RGB); + ENTER_GL(); context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo); context_attach_surface_fbo(context, GL_FRAMEBUFFER, 0, context->current_rt); @@ -2189,6 +2216,9 @@ static void context_apply_state(struct wined3d_context *context, IWineD3DDeviceI } IWineD3DDeviceImpl_FindTexUnitMap(device); + device_preload_textures(device); + if (isStateDirty(context, STATE_VDECL)) + device_update_stream_info(device, context->gl_info); ENTER_GL(); for (i = 0; i < context->numDirtyEntries; ++i) diff --git a/reactos/dll/directx/wine/wined3d/device.c b/reactos/dll/directx/wine/wined3d/device.c index 34495d396d9..6682aa4635e 100644 --- a/reactos/dll/directx/wine/wined3d/device.c +++ b/reactos/dll/directx/wine/wined3d/device.c @@ -179,8 +179,6 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, { /* We need to deal with frequency data! */ IWineD3DVertexDeclarationImpl *declaration = (IWineD3DVertexDeclarationImpl *)This->stateBlock->vertexDecl; - UINT stream_count = This->stateBlock->streamIsUP ? 0 : declaration->num_streams; - const DWORD *streams = declaration->streams; unsigned int i; stream_info->use_map = 0; @@ -298,7 +296,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, stream_info->elements[idx].stream_idx = element->input_slot; stream_info->elements[idx].buffer_object = buffer_object; - if (!This->adapter->gl_info.supported[EXT_VERTEX_ARRAY_BGRA] + if (!This->adapter->gl_info.supported[ARB_VERTEX_ARRAY_BGRA] && element->format_desc->format == WINED3DFMT_B8G8R8A8_UNORM) { stream_info->swizzle_map |= 1 << idx; @@ -307,17 +305,29 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, } } - /* Now call PreLoad on all the vertex buffers. In the very rare case - * that the buffers stopps converting PreLoad will dirtify the VDECL again. - * The vertex buffer can now use the strided structure in the device instead of finding its - * own again. - * - * NULL streams won't be recorded in the array, UP streams won't be either. A stream is only - * once in there. */ - for (i = 0; i < stream_count; ++i) + if (!This->stateBlock->streamIsUP) { - IWineD3DBuffer *vb = This->stateBlock->streamSource[streams[i]]; - if (vb) IWineD3DBuffer_PreLoad(vb); + WORD map = stream_info->use_map; + + /* PreLoad all the vertex buffers. */ + for (i = 0; map; map >>= 1, ++i) + { + struct wined3d_stream_info_element *element; + struct wined3d_buffer *buffer; + + if (!(map & 1)) continue; + + element = &stream_info->elements[i]; + buffer = (struct wined3d_buffer *)This->stateBlock->streamSource[element->stream_idx]; + IWineD3DBuffer_PreLoad((IWineD3DBuffer *)buffer); + + /* If PreLoad dropped the buffer object, update the stream info. */ + if (buffer->buffer_object != element->buffer_object) + { + element->buffer_object = 0; + element->data = buffer_get_sysmem(buffer) + (ptrdiff_t)element->data; + } + } } } @@ -332,7 +342,7 @@ static void stream_info_element_from_strided(const struct wined3d_gl_info *gl_in e->buffer_object = 0; } -void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info, +static void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info, const struct WineDirect3DVertexStridedData *strided, struct wined3d_stream_info *stream_info) { unsigned int i; @@ -361,7 +371,7 @@ void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info, { if (!stream_info->elements[i].format_desc) continue; - if (!gl_info->supported[EXT_VERTEX_ARRAY_BGRA] + if (!gl_info->supported[ARB_VERTEX_ARRAY_BGRA] && stream_info->elements[i].format_desc->format == WINED3DFMT_B8G8R8A8_UNORM) { stream_info->swizzle_map |= 1 << i; @@ -370,6 +380,120 @@ void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info, } } +static void device_trace_strided_stream_info(const struct wined3d_stream_info *stream_info) +{ + TRACE("Strided Data:\n"); + TRACE_STRIDED(stream_info, WINED3D_FFP_POSITION); + TRACE_STRIDED(stream_info, WINED3D_FFP_BLENDWEIGHT); + TRACE_STRIDED(stream_info, WINED3D_FFP_BLENDINDICES); + TRACE_STRIDED(stream_info, WINED3D_FFP_NORMAL); + TRACE_STRIDED(stream_info, WINED3D_FFP_PSIZE); + TRACE_STRIDED(stream_info, WINED3D_FFP_DIFFUSE); + TRACE_STRIDED(stream_info, WINED3D_FFP_SPECULAR); + TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD0); + TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD1); + TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD2); + TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD3); + TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD4); + TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD5); + TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD6); + TRACE_STRIDED(stream_info, WINED3D_FFP_TEXCOORD7); +} + +/* Context activation is done by the caller. */ +void device_update_stream_info(IWineD3DDeviceImpl *device, const struct wined3d_gl_info *gl_info) +{ + struct wined3d_stream_info *stream_info = &device->strided_streams; + IWineD3DStateBlockImpl *stateblock = device->stateBlock; + BOOL vs = stateblock->vertexShader && device->vs_selected_mode != SHADER_NONE; + BOOL fixup = FALSE; + + if (device->up_strided) + { + /* Note: this is a ddraw fixed-function code path. */ + TRACE("=============================== Strided Input ================================\n"); + device_stream_info_from_strided(gl_info, device->up_strided, stream_info); + if (TRACE_ON(d3d)) device_trace_strided_stream_info(stream_info); + } + else + { + TRACE("============================= Vertex Declaration =============================\n"); + device_stream_info_from_declaration(device, vs, stream_info, &fixup); + } + + if (vs && !stream_info->position_transformed) + { + if (((IWineD3DVertexDeclarationImpl *)stateblock->vertexDecl)->half_float_conv_needed && !fixup) + { + TRACE("Using drawStridedSlow with vertex shaders for FLOAT16 conversion.\n"); + device->useDrawStridedSlow = TRUE; + } + else + { + device->useDrawStridedSlow = FALSE; + } + } + else + { + WORD slow_mask = (1 << WINED3D_FFP_PSIZE); + slow_mask |= -!gl_info->supported[ARB_VERTEX_ARRAY_BGRA] + & ((1 << WINED3D_FFP_DIFFUSE) | (1 << WINED3D_FFP_SPECULAR)); + + if ((stream_info->position_transformed || (stream_info->use_map & slow_mask)) && !fixup) + { + device->useDrawStridedSlow = TRUE; + } + else + { + device->useDrawStridedSlow = FALSE; + } + } +} + +static void device_preload_texture(IWineD3DStateBlockImpl *stateblock, unsigned int idx) +{ + IWineD3DBaseTextureImpl *texture; + enum WINED3DSRGB srgb; + + if (!(texture = (IWineD3DBaseTextureImpl *)stateblock->textures[idx])) return; + srgb = stateblock->samplerState[idx][WINED3DSAMP_SRGBTEXTURE] ? SRGB_SRGB : SRGB_RGB; + texture->baseTexture.internal_preload((IWineD3DBaseTexture *)texture, srgb); +} + +void device_preload_textures(IWineD3DDeviceImpl *device) +{ + IWineD3DStateBlockImpl *stateblock = device->stateBlock; + unsigned int i; + + if (use_vs(stateblock)) + { + for (i = 0; i < MAX_VERTEX_SAMPLERS; ++i) + { + if (((IWineD3DBaseShaderImpl *)stateblock->vertexShader)->baseShader.reg_maps.sampler_type[i]) + device_preload_texture(stateblock, MAX_FRAGMENT_SAMPLERS + i); + } + } + + if (use_ps(stateblock)) + { + for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i) + { + if (((IWineD3DBaseShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.sampler_type[i]) + device_preload_texture(stateblock, i); + } + } + else + { + WORD ffu_map = device->fixed_function_usage_map; + + for (i = 0; ffu_map; ffu_map >>= 1, ++i) + { + if (ffu_map & 1) + device_preload_texture(stateblock, i); + } + } +} + /********************************************************** * IUnknown parts follows **********************************************************/ @@ -596,7 +720,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, UI IWineD3DSurfaceImpl *object; HRESULT hr; - TRACE("(%p) Create surface\n",This); + TRACE("iface %p, width %u, height %u, format %s (%#x), lockable %#x, discard %#x, level %u\n", + iface, Width, Height, debug_d3dformat(Format), Format, Lockable, Discard, Level); + TRACE("surface %p, usage %s (%#x), pool %s (%#x), multisample_type %#x, multisample_quality %u\n", + ppSurface, debug_d3dusage(Usage), Usage, debug_d3dpool(Pool), Pool, MultiSample, MultisampleQuality); + TRACE("surface_type %#x, parent %p, parent_ops %p.\n", Impl, parent, parent_ops); if (Impl == SURFACE_OPENGL && !This->adapter) { @@ -784,104 +912,33 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateCubeTexture(IWineD3DDevice *iface return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface, WINED3DQUERYTYPE Type, IWineD3DQuery **ppQuery, IUnknown* parent) { +static HRESULT WINAPI IWineD3DDeviceImpl_CreateQuery(IWineD3DDevice *iface, + WINED3DQUERYTYPE type, IWineD3DQuery **query, IUnknown *parent) +{ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; - const struct wined3d_gl_info *gl_info = &This->adapter->gl_info; - IWineD3DQueryImpl *object; /*NOTE: impl ref allowed since this is a create function */ - HRESULT hr = WINED3DERR_NOTAVAILABLE; - const IWineD3DQueryVtbl *vtable; + IWineD3DQueryImpl *object; + HRESULT hr; - /* Just a check to see if we support this type of query */ - switch(Type) { - case WINED3DQUERYTYPE_OCCLUSION: - TRACE("(%p) occlusion query\n", This); - if (gl_info->supported[ARB_OCCLUSION_QUERY]) - hr = WINED3D_OK; - else - WARN("Unsupported in local OpenGL implementation: ARB_OCCLUSION_QUERY/NV_OCCLUSION_QUERY\n"); + TRACE("iface %p, type %#x, query %p, parent %p.\n", iface, type, query, parent); - vtable = &IWineD3DOcclusionQuery_Vtbl; - break; - - case WINED3DQUERYTYPE_EVENT: - if (!gl_info->supported[NV_FENCE] && !gl_info->supported[APPLE_FENCE]) - { - /* Half-Life 2 needs this query. It does not render the main menu correctly otherwise - * Pretend to support it, faking this query does not do much harm except potentially lowering performance - */ - FIXME("(%p) Event query: Unimplemented, but pretending to be supported\n", This); - } - vtable = &IWineD3DEventQuery_Vtbl; - hr = WINED3D_OK; - break; - - case WINED3DQUERYTYPE_VCACHE: - case WINED3DQUERYTYPE_RESOURCEMANAGER: - case WINED3DQUERYTYPE_VERTEXSTATS: - case WINED3DQUERYTYPE_TIMESTAMP: - case WINED3DQUERYTYPE_TIMESTAMPDISJOINT: - case WINED3DQUERYTYPE_TIMESTAMPFREQ: - case WINED3DQUERYTYPE_PIPELINETIMINGS: - case WINED3DQUERYTYPE_INTERFACETIMINGS: - case WINED3DQUERYTYPE_VERTEXTIMINGS: - case WINED3DQUERYTYPE_PIXELTIMINGS: - case WINED3DQUERYTYPE_BANDWIDTHTIMINGS: - case WINED3DQUERYTYPE_CACHEUTILIZATION: - default: - /* Use the base Query vtable until we have a special one for each query */ - vtable = &IWineD3DQuery_Vtbl; - FIXME("(%p) Unhandled query type %d\n", This, Type); + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); + if (!object) + { + ERR("Failed to allocate query memory.\n"); + return E_OUTOFMEMORY; } - if(NULL == ppQuery || hr != WINED3D_OK) { + + hr = query_init(object, This, type, parent); + if (FAILED(hr)) + { + WARN("Failed to initialize query, hr %#x.\n", hr); + HeapFree(GetProcessHeap(), 0, object); return hr; } - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); - if(!object) - { - ERR("Out of memory\n"); - *ppQuery = NULL; - return WINED3DERR_OUTOFVIDEOMEMORY; - } + TRACE("Created query %p.\n", object); + *query = (IWineD3DQuery *)object; - object->lpVtbl = vtable; - object->type = Type; - object->state = QUERY_CREATED; - object->device = This; - object->parent = parent; - object->ref = 1; - - *ppQuery = (IWineD3DQuery *)object; - - /* allocated the 'extended' data based on the type of query requested */ - switch(Type){ - case WINED3DQUERYTYPE_OCCLUSION: - object->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_occlusion_query)); - ((struct wined3d_occlusion_query *)object->extendedData)->context = NULL; - break; - - case WINED3DQUERYTYPE_EVENT: - object->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_event_query)); - ((struct wined3d_event_query *)object->extendedData)->context = NULL; - break; - - case WINED3DQUERYTYPE_VCACHE: - case WINED3DQUERYTYPE_RESOURCEMANAGER: - case WINED3DQUERYTYPE_VERTEXSTATS: - case WINED3DQUERYTYPE_TIMESTAMP: - case WINED3DQUERYTYPE_TIMESTAMPDISJOINT: - case WINED3DQUERYTYPE_TIMESTAMPFREQ: - case WINED3DQUERYTYPE_PIPELINETIMINGS: - case WINED3DQUERYTYPE_INTERFACETIMINGS: - case WINED3DQUERYTYPE_VERTEXTIMINGS: - case WINED3DQUERYTYPE_PIXELTIMINGS: - case WINED3DQUERYTYPE_BANDWIDTHTIMINGS: - case WINED3DQUERYTYPE_CACHEUTILIZATION: - default: - object->extendedData = 0; - FIXME("(%p) Unhandled query type %d\n",This , Type); - } - TRACE("(%p) : Created Query %p\n", This, object); return WINED3D_OK; } @@ -1663,14 +1720,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, } } - /* Delete the palette conversion shader if it is around */ - if(This->paletteConversionShader) { - ENTER_GL(); - GL_EXTCALL(glDeleteProgramsARB(1, &This->paletteConversionShader)); - LEAVE_GL(); - This->paletteConversionShader = 0; - } - /* Delete the pbuffer context if there is any */ if(This->pbufferContext) context_destroy(This, This->pbufferContext); @@ -3054,15 +3103,17 @@ static void device_update_fixed_function_usage_map(IWineD3DDeviceImpl *This) { } } -static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This) { +static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This, const struct wined3d_gl_info *gl_info) +{ unsigned int i, tex; WORD ffu_map; device_update_fixed_function_usage_map(This); ffu_map = This->fixed_function_usage_map; - if (This->max_ffp_textures == This->max_ffp_texture_stages || - This->stateBlock->lowest_disabled_stage <= This->max_ffp_textures) { + if (This->max_ffp_textures == gl_info->limits.texture_stages + || This->stateBlock->lowest_disabled_stage <= This->max_ffp_textures) + { for (i = 0; ffu_map; ffu_map >>= 1, ++i) { if (!(ffu_map & 1)) continue; @@ -3092,7 +3143,8 @@ static void device_map_fixed_function_samplers(IWineD3DDeviceImpl *This) { } } -static void device_map_psamplers(IWineD3DDeviceImpl *This) { +static void device_map_psamplers(IWineD3DDeviceImpl *This, const struct wined3d_gl_info *gl_info) +{ const WINED3DSAMPLER_TEXTURE_TYPE *sampler_type = ((IWineD3DPixelShaderImpl *)This->stateBlock->pixelShader)->baseShader.reg_maps.sampler_type; unsigned int i; @@ -3102,7 +3154,8 @@ static void device_map_psamplers(IWineD3DDeviceImpl *This) { { device_map_stage(This, i, i); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SAMPLER(i)); - if (i < MAX_TEXTURES) { + if (i < gl_info->limits.texture_stages) + { markTextureStagesDirty(This, i); } } @@ -3133,11 +3186,12 @@ static BOOL device_unit_free_for_vs(IWineD3DDeviceImpl *This, const DWORD *pshad return !vshader_sampler_tokens[current_mapping - MAX_FRAGMENT_SAMPLERS]; } -static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps) { +static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps, const struct wined3d_gl_info *gl_info) +{ const WINED3DSAMPLER_TEXTURE_TYPE *vshader_sampler_type = ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->baseShader.reg_maps.sampler_type; const WINED3DSAMPLER_TEXTURE_TYPE *pshader_sampler_type = NULL; - int start = min(MAX_COMBINED_SAMPLERS, This->adapter->gl_info.limits.combined_samplers) - 1; + int start = min(MAX_COMBINED_SAMPLERS, gl_info->limits.combined_samplers) - 1; int i; if (ps) { @@ -3174,7 +3228,9 @@ static void device_map_vsamplers(IWineD3DDeviceImpl *This, BOOL ps) { } } -void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) { +void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) +{ + const struct wined3d_gl_info *gl_info = &This->adapter->gl_info; BOOL vs = use_vs(This->stateBlock); BOOL ps = use_ps(This->stateBlock); /* @@ -3184,15 +3240,10 @@ void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) { * -> When the mapping of a stage is changed, sampler and ALL texture stage states have * to be reset. Because of that try to work with a 1:1 mapping as much as possible */ - if (ps) { - device_map_psamplers(This); - } else { - device_map_fixed_function_samplers(This); - } + if (ps) device_map_psamplers(This, gl_info); + else device_map_fixed_function_samplers(This, gl_info); - if (vs) { - device_map_vsamplers(This, ps); - } + if (vs) device_map_vsamplers(This, ps, gl_info); } static HRESULT WINAPI IWineD3DDeviceImpl_SetPixelShader(IWineD3DDevice *iface, IWineD3DPixelShader *pShader) { @@ -3806,11 +3857,14 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface, static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *iface, DWORD Stage, WINED3DTEXTURESTAGESTATETYPE Type, DWORD Value) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; DWORD oldValue = This->updateStateBlock->textureState[Stage][Type]; + const struct wined3d_gl_info *gl_info = &This->adapter->gl_info; TRACE("(%p) : Stage=%d, Type=%s(%d), Value=%d\n", This, Stage, debug_d3dtexturestate(Type), Type, Value); - if (Stage >= MAX_TEXTURES) { - WARN("Attempting to set stage %u which is higher than the max stage %u, ignoring\n", Stage, MAX_TEXTURES - 1); + if (Stage >= gl_info->limits.texture_stages) + { + WARN("Attempting to set stage %u which is higher than the max stage %u, ignoring.\n", + Stage, gl_info->limits.texture_stages - 1); return WINED3D_OK; } @@ -3891,6 +3945,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface, DWORD stage, IWineD3DBaseTexture *texture) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + const struct wined3d_gl_info *gl_info = &This->adapter->gl_info; IWineD3DBaseTexture *prev; TRACE("iface %p, stage %u, texture %p.\n", iface, stage, texture); @@ -3949,7 +4004,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface, IWineD3DDeviceImpl_MarkStateDirty(This, STATE_PIXELSHADER); } - if (!prev && stage < MAX_TEXTURES) + if (!prev && stage < gl_info->limits.texture_stages) { /* The source arguments for color and alpha ops have different * meanings when a NULL texture is bound, so the COLOROP and @@ -3968,7 +4023,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTexture(IWineD3DDevice *iface, IWineD3DBaseTexture_Release(prev); - if (!texture && stage < MAX_TEXTURES) + if (!texture && stage < gl_info->limits.texture_stages) { IWineD3DDeviceImpl_MarkStateDirty(This, STATE_TEXTURESTAGE(stage, WINED3DTSS_COLOROP)); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_TEXTURESTAGE(stage, WINED3DTSS_ALPHAOP)); @@ -4206,7 +4261,6 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa const WINED3DVIEWPORT *vp = &This->stateBlock->viewport; UINT drawable_width, drawable_height; IWineD3DSurfaceImpl *depth_stencil = (IWineD3DSurfaceImpl *) This->stencilBufferTarget; - IWineD3DSwapChainImpl *swapchain = NULL; struct wined3d_context *context; /* When we're clearing parts of the drawable, make sure that the target surface is well up to date in the @@ -4376,12 +4430,7 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa LEAVE_GL(); - if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)target, &IID_IWineD3DSwapChain, (void **)&swapchain))) { - if (target == (IWineD3DSurfaceImpl*) swapchain->frontBuffer) { - wglFlush(); - } - IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); - } + wglFlush(); /* Flush to ensure ordering across contexts. */ context_release(context); @@ -5340,6 +5389,9 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface, IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; struct wined3d_context *context; + if (rect) IWineD3DSurface_LoadLocation(surface, SFLAG_INDRAWABLE, NULL); + IWineD3DSurface_ModifyLocation(surface, SFLAG_INDRAWABLE, TRUE); + if (!surface_is_offscreen(surface)) { TRACE("Surface %p is onscreen\n", surface); @@ -5386,6 +5438,9 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface, checkGLcall("glClear"); LEAVE_GL(); + + wglFlush(); /* Flush to ensure ordering across contexts. */ + context_release(context); } @@ -5685,6 +5740,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetFrontBackBuffers(IWineD3DDevice *ifa if(Swapchain->backBuffer[0]) { IWineD3DSurface_SetContainer(Swapchain->backBuffer[0], (IWineD3DBase *) Swapchain); ((IWineD3DSurfaceImpl *)Swapchain->backBuffer[0])->Flags |= SFLAG_SWAPCHAIN; + Swapchain->presentParms.BackBufferWidth = BackImpl->currentDesc.Width; + Swapchain->presentParms.BackBufferHeight = BackImpl->currentDesc.Height; + Swapchain->presentParms.BackBufferFormat = BackImpl->resource.format_desc->format; } else { HeapFree(GetProcessHeap(), 0, Swapchain->backBuffer); Swapchain->backBuffer = NULL; @@ -5738,6 +5796,12 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED break; } + /* Make sure the drawables are up-to-date. Note that loading the + * destination surface isn't strictly required if we overwrite the + * entire surface. */ + IWineD3DSurface_LoadLocation(src_surface, SFLAG_INDRAWABLE, NULL); + IWineD3DSurface_LoadLocation(dst_surface, SFLAG_INDRAWABLE, NULL); + /* Attach src surface to src fbo */ src_swapchain = get_swapchain(src_surface); dst_swapchain = get_swapchain(dst_surface); @@ -5753,9 +5817,6 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED GLenum buffer = surface_get_gl_buffer(src_surface); TRACE("Source surface %p is onscreen\n", src_surface); - /* Make sure the drawable is up to date. In the offscreen case - * attach_surface_fbo() implicitly takes care of this. */ - IWineD3DSurface_LoadLocation(src_surface, SFLAG_INDRAWABLE, NULL); if(buffer == GL_FRONT) { RECT windowsize; @@ -5792,9 +5853,6 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED GLenum buffer = surface_get_gl_buffer(dst_surface); TRACE("Destination surface %p is onscreen\n", dst_surface); - /* Make sure the drawable is up to date. In the offscreen case - * attach_surface_fbo() implicitly takes care of this. */ - IWineD3DSurface_LoadLocation(dst_surface, SFLAG_INDRAWABLE, NULL); if(buffer == GL_FRONT) { RECT windowsize; @@ -5839,6 +5897,9 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED } LEAVE_GL(); + + wglFlush(); /* Flush to ensure ordering across contexts. */ + context_release(context); IWineD3DSurface_ModifyLocation(dst_surface, SFLAG_INDRAWABLE, TRUE); @@ -6982,20 +7043,19 @@ HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d, for (i = 0; i < PATCHMAP_SIZE; ++i) list_init(&device->patches[i]); select_shader_mode(&adapter->gl_info, &device->ps_selected_mode, &device->vs_selected_mode); - device->shader_backend = select_shader_backend(adapter, device_type); + device->shader_backend = adapter->shader_backend; memset(&shader_caps, 0, sizeof(shader_caps)); - device->shader_backend->shader_get_caps(device_type, &adapter->gl_info, &shader_caps); + device->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps); device->d3d_vshader_constantF = shader_caps.MaxVertexShaderConst; device->d3d_pshader_constantF = shader_caps.MaxPixelShaderConst; device->vs_clipping = shader_caps.VSClipping; memset(&ffp_caps, 0, sizeof(ffp_caps)); - fragment_pipeline = select_fragment_implementation(adapter, device_type); + fragment_pipeline = adapter->fragment_pipe; device->frag_pipe = fragment_pipeline; - fragment_pipeline->get_caps(device_type, &adapter->gl_info, &ffp_caps); + fragment_pipeline->get_caps(&adapter->gl_info, &ffp_caps); device->max_ffp_textures = ffp_caps.MaxSimultaneousTextures; - device->max_ffp_texture_stages = ffp_caps.MaxTextureBlendStages; hr = compile_state_table(device->StateTable, device->multistate_funcs, &adapter->gl_info, ffp_vertexstate_template, fragment_pipeline, misc_state_template); @@ -7006,7 +7066,7 @@ HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d, return hr; } - device->blitter = select_blit_implementation(adapter, device_type); + device->blitter = adapter->blitter; return WINED3D_OK; } diff --git a/reactos/dll/directx/wine/wined3d/directx.c b/reactos/dll/directx/wine/wined3d/directx.c index 855f97ffdda..812e5ccc9e8 100644 --- a/reactos/dll/directx/wine/wined3d/directx.c +++ b/reactos/dll/directx/wine/wined3d/directx.c @@ -30,6 +30,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d); WINE_DECLARE_DEBUG_CHANNEL(d3d_caps); #define GLINFO_LOCATION (*gl_info) +#define WINE_DEFAULT_VIDMEM (64 * 1024 * 1024) +#define MAKEDWORD_VERSION(maj, min) ((maj & 0xffff) << 16) | (min & 0xffff) /* The d3d device ID */ static const GUID IID_D3DDEVICE_D3DUID = { 0xaeb2cdd4, 0x6e41, 0x43ea, { 0x94,0x1c,0x83,0x61,0xcc,0x76,0x07,0x81 } }; @@ -43,17 +45,10 @@ static const struct { /* APPLE */ {"GL_APPLE_client_storage", APPLE_CLIENT_STORAGE, 0 }, {"GL_APPLE_fence", APPLE_FENCE, 0 }, - {"GL_APPLE_flush_render", APPLE_FLUSH_RENDER, 0 }, - {"GL_APPLE_ycbcr_422", APPLE_YCBCR_422, 0 }, {"GL_APPLE_float_pixels", APPLE_FLOAT_PIXELS, 0 }, {"GL_APPLE_flush_buffer_range", APPLE_FLUSH_BUFFER_RANGE, 0 }, - - /* ATI */ - {"GL_ATI_separate_stencil", ATI_SEPARATE_STENCIL, 0 }, - {"GL_ATI_texture_env_combine3", ATI_TEXTURE_ENV_COMBINE3, 0 }, - {"GL_ATI_texture_mirror_once", ATI_TEXTURE_MIRROR_ONCE, 0 }, - {"GL_ATI_fragment_shader", ATI_FRAGMENT_SHADER, 0 }, - {"GL_ATI_texture_compression_3dc", ATI_TEXTURE_COMPRESSION_3DC, 0 }, + {"GL_APPLE_flush_render", APPLE_FLUSH_RENDER, 0 }, + {"GL_APPLE_ycbcr_422", APPLE_YCBCR_422, 0 }, /* ARB */ {"GL_ARB_color_buffer_float", ARB_COLOR_BUFFER_FLOAT, 0 }, @@ -66,7 +61,9 @@ static const struct { {"GL_ARB_framebuffer_object", ARB_FRAMEBUFFER_OBJECT, 0 }, {"GL_ARB_geometry_shader4", ARB_GEOMETRY_SHADER4, 0 }, {"GL_ARB_half_float_pixel", ARB_HALF_FLOAT_PIXEL, 0 }, + {"GL_ARB_half_float_vertex", ARB_HALF_FLOAT_VERTEX, 0 }, {"GL_ARB_imaging", ARB_IMAGING, 0 }, + {"GL_ARB_map_buffer_range", ARB_MAP_BUFFER_RANGE, 0 }, {"GL_ARB_multisample", ARB_MULTISAMPLE, 0 }, /* needs GLX_ARB_MULTISAMPLE as well */ {"GL_ARB_multitexture", ARB_MULTITEXTURE, 0 }, {"GL_ARB_occlusion_query", ARB_OCCLUSION_QUERY, 0 }, @@ -74,6 +71,10 @@ static const struct { {"GL_ARB_point_parameters", ARB_POINT_PARAMETERS, 0 }, {"GL_ARB_point_sprite", ARB_POINT_SPRITE, 0 }, {"GL_ARB_provoking_vertex", ARB_PROVOKING_VERTEX, 0 }, + {"GL_ARB_shader_objects", ARB_SHADER_OBJECTS, 0 }, + {"GL_ARB_shader_texture_lod", ARB_SHADER_TEXTURE_LOD, 0 }, + {"GL_ARB_shading_language_100", ARB_SHADING_LANGUAGE_100, 0 }, + {"GL_ARB_sync", ARB_SYNC, 0 }, {"GL_ARB_texture_border_clamp", ARB_TEXTURE_BORDER_CLAMP, 0 }, {"GL_ARB_texture_compression", ARB_TEXTURE_COMPRESSION, 0 }, {"GL_ARB_texture_cube_map", ARB_TEXTURE_CUBE_MAP, 0 }, @@ -85,23 +86,30 @@ static const struct { {"GL_ARB_texture_non_power_of_two", ARB_TEXTURE_NON_POWER_OF_TWO, MAKEDWORD_VERSION(2, 0) }, {"GL_ARB_texture_rectangle", ARB_TEXTURE_RECTANGLE, 0 }, {"GL_ARB_texture_rg", ARB_TEXTURE_RG, 0 }, + {"GL_ARB_vertex_array_bgra", ARB_VERTEX_ARRAY_BGRA, 0 }, {"GL_ARB_vertex_blend", ARB_VERTEX_BLEND, 0 }, {"GL_ARB_vertex_buffer_object", ARB_VERTEX_BUFFER_OBJECT, 0 }, {"GL_ARB_vertex_program", ARB_VERTEX_PROGRAM, 0 }, {"GL_ARB_vertex_shader", ARB_VERTEX_SHADER, 0 }, - {"GL_ARB_shader_objects", ARB_SHADER_OBJECTS, 0 }, - {"GL_ARB_shader_texture_lod", ARB_SHADER_TEXTURE_LOD, 0 }, - {"GL_ARB_half_float_vertex", ARB_HALF_FLOAT_VERTEX, 0 }, + + /* ATI */ + {"GL_ATI_fragment_shader", ATI_FRAGMENT_SHADER, 0 }, + {"GL_ATI_separate_stencil", ATI_SEPARATE_STENCIL, 0 }, + {"GL_ATI_texture_compression_3dc", ATI_TEXTURE_COMPRESSION_3DC, 0 }, + {"GL_ATI_texture_env_combine3", ATI_TEXTURE_ENV_COMBINE3, 0 }, + {"GL_ATI_texture_mirror_once", ATI_TEXTURE_MIRROR_ONCE, 0 }, /* EXT */ {"GL_EXT_blend_color", EXT_BLEND_COLOR, 0 }, - {"GL_EXT_blend_minmax", EXT_BLEND_MINMAX, 0 }, {"GL_EXT_blend_equation_separate", EXT_BLEND_EQUATION_SEPARATE, 0 }, {"GL_EXT_blend_func_separate", EXT_BLEND_FUNC_SEPARATE, 0 }, + {"GL_EXT_blend_minmax", EXT_BLEND_MINMAX, 0 }, {"GL_EXT_fog_coord", EXT_FOG_COORD, 0 }, {"GL_EXT_framebuffer_blit", EXT_FRAMEBUFFER_BLIT, 0 }, {"GL_EXT_framebuffer_multisample", EXT_FRAMEBUFFER_MULTISAMPLE, 0 }, {"GL_EXT_framebuffer_object", EXT_FRAMEBUFFER_OBJECT, 0 }, + {"GL_EXT_gpu_program_parameters", EXT_GPU_PROGRAM_PARAMETERS, 0 }, + {"GL_EXT_gpu_shader4", EXT_GPU_SHADER4, 0 }, {"GL_EXT_packed_depth_stencil", EXT_PACKED_DEPTH_STENCIL, 0 }, {"GL_EXT_paletted_texture", EXT_PALETTED_TEXTURE, 0 }, {"GL_EXT_point_parameters", EXT_POINT_PARAMETERS, 0 }, @@ -110,42 +118,36 @@ static const struct { {"GL_EXT_stencil_two_side", EXT_STENCIL_TWO_SIDE, 0 }, {"GL_EXT_stencil_wrap", EXT_STENCIL_WRAP, 0 }, {"GL_EXT_texture3D", EXT_TEXTURE3D, MAKEDWORD_VERSION(1, 2) }, - {"GL_EXT_texture_compression_s3tc", EXT_TEXTURE_COMPRESSION_S3TC, 0 }, {"GL_EXT_texture_compression_rgtc", EXT_TEXTURE_COMPRESSION_RGTC, 0 }, + {"GL_EXT_texture_compression_s3tc", EXT_TEXTURE_COMPRESSION_S3TC, 0 }, {"GL_EXT_texture_env_add", EXT_TEXTURE_ENV_ADD, 0 }, {"GL_EXT_texture_env_combine", EXT_TEXTURE_ENV_COMBINE, 0 }, {"GL_EXT_texture_env_dot3", EXT_TEXTURE_ENV_DOT3, 0 }, - {"GL_EXT_texture_sRGB", EXT_TEXTURE_SRGB, 0 }, - {"GL_EXT_texture_swizzle", EXT_TEXTURE_SWIZZLE, 0 }, {"GL_EXT_texture_filter_anisotropic", EXT_TEXTURE_FILTER_ANISOTROPIC, 0 }, - {"GL_EXT_texture_lod", EXT_TEXTURE_LOD, 0 }, {"GL_EXT_texture_lod_bias", EXT_TEXTURE_LOD_BIAS, 0 }, + {"GL_EXT_texture_sRGB", EXT_TEXTURE_SRGB, 0 }, {"GL_EXT_vertex_array_bgra", EXT_VERTEX_ARRAY_BGRA, 0 }, - {"GL_EXT_vertex_shader", EXT_VERTEX_SHADER, 0 }, - {"GL_EXT_gpu_program_parameters", EXT_GPU_PROGRAM_PARAMETERS, 0 }, /* NV */ - {"GL_NV_half_float", NV_HALF_FLOAT, 0 }, + {"GL_NV_depth_clamp", NV_DEPTH_CLAMP, 0 }, {"GL_NV_fence", NV_FENCE, 0 }, {"GL_NV_fog_distance", NV_FOG_DISTANCE, 0 }, {"GL_NV_fragment_program", NV_FRAGMENT_PROGRAM, 0 }, {"GL_NV_fragment_program2", NV_FRAGMENT_PROGRAM2, 0 }, + {"GL_NV_fragment_program_option", NV_FRAGMENT_PROGRAM_OPTION, 0 }, + {"GL_NV_half_float", NV_HALF_FLOAT, 0 }, + {"GL_NV_light_max_exponent", NV_LIGHT_MAX_EXPONENT, 0 }, {"GL_NV_register_combiners", NV_REGISTER_COMBINERS, 0 }, {"GL_NV_register_combiners2", NV_REGISTER_COMBINERS2, 0 }, {"GL_NV_texgen_reflection", NV_TEXGEN_REFLECTION, 0 }, {"GL_NV_texture_env_combine4", NV_TEXTURE_ENV_COMBINE4, 0 }, {"GL_NV_texture_shader", NV_TEXTURE_SHADER, 0 }, {"GL_NV_texture_shader2", NV_TEXTURE_SHADER2, 0 }, - {"GL_NV_texture_shader3", NV_TEXTURE_SHADER3, 0 }, - {"GL_NV_occlusion_query", NV_OCCLUSION_QUERY, 0 }, {"GL_NV_vertex_program", NV_VERTEX_PROGRAM, 0 }, {"GL_NV_vertex_program1_1", NV_VERTEX_PROGRAM1_1, 0 }, {"GL_NV_vertex_program2", NV_VERTEX_PROGRAM2, 0 }, {"GL_NV_vertex_program2_option", NV_VERTEX_PROGRAM2_OPTION, 0 }, {"GL_NV_vertex_program3", NV_VERTEX_PROGRAM3, 0 }, - {"GL_NV_fragment_program_option", NV_FRAGMENT_PROGRAM_OPTION, 0 }, - {"GL_NV_depth_clamp", NV_DEPTH_CLAMP, 0 }, - {"GL_NV_light_max_exponent", NV_LIGHT_MAX_EXPONENT, 0 }, /* SGI */ {"GL_SGIS_generate_mipmap", SGIS_GENERATE_MIPMAP, 0 }, @@ -435,9 +437,9 @@ static DWORD ver_for_ext(GL_SupportedExt ext) } static BOOL match_ati_r300_to_500(const struct wined3d_gl_info *gl_info, const char *gl_renderer, - enum wined3d_pci_vendor vendor, enum wined3d_pci_device device) + enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device) { - if (vendor != VENDOR_ATI) return FALSE; + if (card_vendor != HW_VENDOR_ATI) return FALSE; if (device == CARD_ATI_RADEON_9500) return TRUE; if (device == CARD_ATI_RADEON_X700) return TRUE; if (device == CARD_ATI_RADEON_X1600) return TRUE; @@ -445,9 +447,9 @@ static BOOL match_ati_r300_to_500(const struct wined3d_gl_info *gl_info, const c } static BOOL match_geforce5(const struct wined3d_gl_info *gl_info, const char *gl_renderer, - enum wined3d_pci_vendor vendor, enum wined3d_pci_device device) + enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device) { - if (vendor == VENDOR_NVIDIA) + if (card_vendor == HW_VENDOR_NVIDIA) { if (device == CARD_NVIDIA_GEFORCEFX_5800 || device == CARD_NVIDIA_GEFORCEFX_5600) { @@ -458,7 +460,7 @@ static BOOL match_geforce5(const struct wined3d_gl_info *gl_info, const char *gl } static BOOL match_apple(const struct wined3d_gl_info *gl_info, const char *gl_renderer, - enum wined3d_pci_vendor vendor, enum wined3d_pci_device device) + enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device) { /* MacOS has various specialities in the extensions it advertises. Some have to be loaded from * the opengl 1.2+ core, while other extensions are advertised, but software emulated. So try to @@ -470,18 +472,15 @@ static BOOL match_apple(const struct wined3d_gl_info *gl_info, const char *gl_re * like client storage might be supported on other implementations too, but GL_APPLE_flush_render * is specific to the Mac OS X window management, and GL_APPLE_ycbcr_422 is QuickTime specific. So * the chance that other implementations support them is rather small since Win32 QuickTime uses - * DirectDraw, not OpenGL. */ - if (gl_info->supported[APPLE_FENCE] - && gl_info->supported[APPLE_CLIENT_STORAGE] - && gl_info->supported[APPLE_FLUSH_RENDER] - && gl_info->supported[APPLE_YCBCR_422]) + * DirectDraw, not OpenGL. + * + * This test has been moved into wined3d_guess_gl_vendor() + */ + if (gl_vendor == GL_VENDOR_APPLE) { return TRUE; } - else - { - return FALSE; - } + return FALSE; } /* Context activation is done by the caller. */ @@ -554,31 +553,29 @@ static void test_pbo_functionality(struct wined3d_gl_info *gl_info) } static BOOL match_apple_intel(const struct wined3d_gl_info *gl_info, const char *gl_renderer, - enum wined3d_pci_vendor vendor, enum wined3d_pci_device device) + enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device) { - return vendor == VENDOR_INTEL && match_apple(gl_info, gl_renderer, vendor, device); + return (card_vendor == HW_VENDOR_INTEL) && (gl_vendor == GL_VENDOR_APPLE); } static BOOL match_apple_nonr500ati(const struct wined3d_gl_info *gl_info, const char *gl_renderer, - enum wined3d_pci_vendor vendor, enum wined3d_pci_device device) + enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device) { - if (!match_apple(gl_info, gl_renderer, vendor, device)) return FALSE; - if (vendor != VENDOR_ATI) return FALSE; + if (gl_vendor != GL_VENDOR_APPLE) return FALSE; + if (card_vendor != HW_VENDOR_ATI) return FALSE; if (device == CARD_ATI_RADEON_X1600) return FALSE; return TRUE; } static BOOL match_fglrx(const struct wined3d_gl_info *gl_info, const char *gl_renderer, - enum wined3d_pci_vendor vendor, enum wined3d_pci_device device) + enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device) { - if (vendor != VENDOR_ATI) return FALSE; - if (match_apple(gl_info, gl_renderer, vendor, device)) return FALSE; - if (strstr(gl_renderer, "DRI")) return FALSE; /* Filter out Mesa DRI drivers. */ - return TRUE; + return (gl_vendor == GL_VENDOR_ATI); + } static BOOL match_dx10_capable(const struct wined3d_gl_info *gl_info, const char *gl_renderer, - enum wined3d_pci_vendor vendor, enum wined3d_pci_device device) + enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device) { /* DX9 cards support 40 single float varyings in hardware, most drivers report 32. ATI misreports * 44 varyings. So assume that if we have more than 44 varyings we have a dx10 card. @@ -592,7 +589,7 @@ static BOOL match_dx10_capable(const struct wined3d_gl_info *gl_info, const char /* A GL context is provided by the caller */ static BOOL match_allows_spec_alpha(const struct wined3d_gl_info *gl_info, const char *gl_renderer, - enum wined3d_pci_vendor vendor, enum wined3d_pci_device device) + enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device) { GLenum error; DWORD data[16]; @@ -619,15 +616,15 @@ static BOOL match_allows_spec_alpha(const struct wined3d_gl_info *gl_info, const } static BOOL match_apple_nvts(const struct wined3d_gl_info *gl_info, const char *gl_renderer, - enum wined3d_pci_vendor vendor, enum wined3d_pci_device device) + enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device) { - if (!match_apple(gl_info, gl_renderer, vendor, device)) return FALSE; + if (!match_apple(gl_info, gl_renderer, gl_vendor, card_vendor, device)) return FALSE; return gl_info->supported[NV_TEXTURE_SHADER]; } /* A GL context is provided by the caller */ static BOOL match_broken_nv_clip(const struct wined3d_gl_info *gl_info, const char *gl_renderer, - enum wined3d_pci_vendor vendor, enum wined3d_pci_device device) + enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device) { GLuint prog; BOOL ret = FALSE; @@ -793,7 +790,6 @@ static void quirk_apple_nvts(struct wined3d_gl_info *gl_info) { gl_info->supported[NV_TEXTURE_SHADER] = FALSE; gl_info->supported[NV_TEXTURE_SHADER2] = FALSE; - gl_info->supported[NV_TEXTURE_SHADER3] = FALSE; } static void quirk_disable_nvvp_clip(struct wined3d_gl_info *gl_info) @@ -804,7 +800,7 @@ static void quirk_disable_nvvp_clip(struct wined3d_gl_info *gl_info) struct driver_quirk { BOOL (*match)(const struct wined3d_gl_info *gl_info, const char *gl_renderer, - enum wined3d_pci_vendor vendor, enum wined3d_pci_device device); + enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device); void (*apply)(struct wined3d_gl_info *gl_info); const char *description; }; @@ -923,51 +919,51 @@ static const struct driver_version_information driver_version_table[] = * TNT/Geforce1/2 up to 71.x - driver uses numbering 7.1.8.6 for 71.86 * * All version numbers used below are from the Linux nvidia drivers. */ - {VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT, "NVIDIA RIVA TNT", 1, 8, 6 }, - {VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT2, "NVIDIA RIVA TNT2/TNT2 Pro", 1, 8, 6 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE, "NVIDIA GeForce 256", 1, 8, 6 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2_MX, "NVIDIA GeForce2 MX/MX 400", 6, 4, 3 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2, "NVIDIA GeForce2 GTS/GeForce2 Pro", 1, 8, 6 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE3, "NVIDIA GeForce3", 6, 10, 9371 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_MX, "NVIDIA GeForce4 MX 460", 6, 10, 9371 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_TI4200, "NVIDIA GeForce4 Ti 4200", 6, 10, 9371 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5200, "NVIDIA GeForce FX 5200", 15, 11, 7516 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5600, "NVIDIA GeForce FX 5600", 15, 11, 7516 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5800, "NVIDIA GeForce FX 5800", 15, 11, 7516 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6200, "NVIDIA GeForce 6200", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6600GT, "NVIDIA GeForce 6600 GT", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6800, "NVIDIA GeForce 6800", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7300, "NVIDIA GeForce Go 7300", 15, 11, 8585 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7400, "NVIDIA GeForce Go 7400", 15, 11, 8585 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7600, "NVIDIA GeForce 7600 GT", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7800GT, "NVIDIA GeForce 7800 GT", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8300GS, "NVIDIA GeForce 8300 GS", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600GT, "NVIDIA GeForce 8600 GT", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600MGT, "NVIDIA GeForce 8600M GT", 15, 11, 8585 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8800GTS, "NVIDIA GeForce 8800 GTS", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9200, "NVIDIA GeForce 9200", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9400GT, "NVIDIA GeForce 9400 GT", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9500GT, "NVIDIA GeForce 9500 GT", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9600GT, "NVIDIA GeForce 9600 GT", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9800GT, "NVIDIA GeForce 9800 GT", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX260, "NVIDIA GeForce GTX 260", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX275, "NVIDIA GeForce GTX 275", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX280, "NVIDIA GeForce GTX 280", 15, 11, 8618 }, - {VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT240, "NVIDIA GeForce GT 240", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT, "NVIDIA RIVA TNT", 1, 8, 6 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_RIVA_TNT2, "NVIDIA RIVA TNT2/TNT2 Pro", 1, 8, 6 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE, "NVIDIA GeForce 256", 1, 8, 6 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2_MX, "NVIDIA GeForce2 MX/MX 400", 6, 4, 3 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE2, "NVIDIA GeForce2 GTS/GeForce2 Pro", 1, 8, 6 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE3, "NVIDIA GeForce3", 6, 10, 9371 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_MX, "NVIDIA GeForce4 MX 460", 6, 10, 9371 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE4_TI4200, "NVIDIA GeForce4 Ti 4200", 6, 10, 9371 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5200, "NVIDIA GeForce FX 5200", 15, 11, 7516 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5600, "NVIDIA GeForce FX 5600", 15, 11, 7516 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCEFX_5800, "NVIDIA GeForce FX 5800", 15, 11, 7516 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6200, "NVIDIA GeForce 6200", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6600GT, "NVIDIA GeForce 6600 GT", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_6800, "NVIDIA GeForce 6800", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7300, "NVIDIA GeForce Go 7300", 15, 11, 8585 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7400, "NVIDIA GeForce Go 7400", 15, 11, 8585 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7600, "NVIDIA GeForce 7600 GT", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_7800GT, "NVIDIA GeForce 7800 GT", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8300GS, "NVIDIA GeForce 8300 GS", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600GT, "NVIDIA GeForce 8600 GT", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8600MGT, "NVIDIA GeForce 8600M GT", 15, 11, 8585 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_8800GTS, "NVIDIA GeForce 8800 GTS", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9200, "NVIDIA GeForce 9200", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9400GT, "NVIDIA GeForce 9400 GT", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9500GT, "NVIDIA GeForce 9500 GT", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9600GT, "NVIDIA GeForce 9600 GT", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_9800GT, "NVIDIA GeForce 9800 GT", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX260, "NVIDIA GeForce GTX 260", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX275, "NVIDIA GeForce GTX 275", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GTX280, "NVIDIA GeForce GTX 280", 15, 11, 8618 }, + {HW_VENDOR_NVIDIA, CARD_NVIDIA_GEFORCE_GT240, "NVIDIA GeForce GT 240", 15, 11, 8618 }, /* ATI cards. The driver versions are somewhat similar, but not quite the same. Let's hardcode. */ - {VENDOR_ATI, CARD_ATI_RADEON_9500, "ATI Radeon 9500", 14, 10, 6764 }, - {VENDOR_ATI, CARD_ATI_RADEON_X700, "ATI Radeon X700 SE", 14, 10, 6764 }, - {VENDOR_ATI, CARD_ATI_RADEON_X1600, "ATI Radeon X1600 Series", 14, 10, 6764 }, - {VENDOR_ATI, CARD_ATI_RADEON_HD2300, "ATI Mobility Radeon HD 2300", 14, 10, 6764 }, - {VENDOR_ATI, CARD_ATI_RADEON_HD2600, "ATI Mobility Radeon HD 2600", 14, 10, 6764 }, - {VENDOR_ATI, CARD_ATI_RADEON_HD2900, "ATI Radeon HD 2900 XT", 14, 10, 6764 }, - {VENDOR_ATI, CARD_ATI_RADEON_HD4350, "ATI Radeon HD 4350", 14, 10, 6764 }, - {VENDOR_ATI, CARD_ATI_RADEON_HD4600, "ATI Radeon HD 4600 Series", 14, 10, 6764 }, - {VENDOR_ATI, CARD_ATI_RADEON_HD4700, "ATI Radeon HD 4700 Series", 14, 10, 6764 }, - {VENDOR_ATI, CARD_ATI_RADEON_HD4800, "ATI Radeon HD 4800 Series", 14, 10, 6764 }, - {VENDOR_ATI, CARD_ATI_RADEON_HD5700, "ATI Radeon HD 5700 Series", 14, 10, 8681 }, - {VENDOR_ATI, CARD_ATI_RADEON_HD5800, "ATI Radeon HD 5800 Series", 14, 10, 8681 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_9500, "ATI Radeon 9500", 14, 10, 6764 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_X700, "ATI Radeon X700 SE", 14, 10, 6764 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_X1600, "ATI Radeon X1600 Series", 14, 10, 6764 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD2300, "ATI Mobility Radeon HD 2300", 14, 10, 6764 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD2600, "ATI Mobility Radeon HD 2600", 14, 10, 6764 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD2900, "ATI Radeon HD 2900 XT", 14, 10, 6764 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4350, "ATI Radeon HD 4350", 14, 10, 6764 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4600, "ATI Radeon HD 4600 Series", 14, 10, 6764 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4700, "ATI Radeon HD 4700 Series", 14, 10, 6764 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD4800, "ATI Radeon HD 4800 Series", 14, 10, 6764 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD5700, "ATI Radeon HD 5700 Series", 14, 10, 8681 }, + {HW_VENDOR_ATI, CARD_ATI_RADEON_HD5800, "ATI Radeon HD 5800 Series", 14, 10, 8681 }, /* TODO: Add information about legacy ATI hardware, Intel and other cards. */ }; @@ -995,14 +991,15 @@ static void init_driver_info(struct wined3d_driver_info *driver_info, switch (vendor) { - case VENDOR_ATI: + case HW_VENDOR_ATI: driver_info->name = "ati2dvag.dll"; break; - case VENDOR_NVIDIA: + case HW_VENDOR_NVIDIA: driver_info->name = "nv4_disp.dll"; break; + case HW_VENDOR_INTEL: default: FIXME_(d3d_caps)("Unhandled vendor %04x.\n", vendor); driver_info->name = "Display"; @@ -1077,13 +1074,13 @@ static void init_driver_info(struct wined3d_driver_info *driver_info, /* Context activation is done by the caller. */ static void fixup_extensions(struct wined3d_gl_info *gl_info, const char *gl_renderer, - enum wined3d_pci_vendor vendor, enum wined3d_pci_device device) + enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device) { unsigned int i; for (i = 0; i < (sizeof(quirk_table) / sizeof(*quirk_table)); ++i) { - if (!quirk_table[i].match(gl_info, gl_renderer, vendor, device)) continue; + if (!quirk_table[i].match(gl_info, gl_renderer, gl_vendor, card_vendor, device)) continue; TRACE_(d3d_caps)("Applying driver quirk \"%s\".\n", quirk_table[i].description); quirk_table[i].apply(gl_info); } @@ -1110,34 +1107,760 @@ static DWORD wined3d_parse_gl_version(const char *gl_version) return MAKEDWORD_VERSION(major, minor); } -static enum wined3d_pci_vendor wined3d_guess_vendor(const char *gl_vendor, const char *gl_renderer) +static enum wined3d_gl_vendor wined3d_guess_gl_vendor(struct wined3d_gl_info *gl_info, const char *gl_vendor_string, const char *gl_renderer) { - if (strstr(gl_vendor, "NVIDIA")) - return VENDOR_NVIDIA; - if (strstr(gl_vendor, "ATI")) - return VENDOR_ATI; + /* MacOS has various specialities in the extensions it advertises. Some have to be loaded from + * the opengl 1.2+ core, while other extensions are advertised, but software emulated. So try to + * detect the Apple OpenGL implementation to apply some extension fixups afterwards. + * + * Detecting this isn't really easy. The vendor string doesn't mention Apple. Compile-time checks + * aren't sufficient either because a Linux binary may display on a macos X server via remote X11. + * So try to detect the GL implementation by looking at certain Apple extensions. Some extensions + * like client storage might be supported on other implementations too, but GL_APPLE_flush_render + * is specific to the Mac OS X window management, and GL_APPLE_ycbcr_422 is QuickTime specific. So + * the chance that other implementations support them is rather small since Win32 QuickTime uses + * DirectDraw, not OpenGL. */ + if (gl_info->supported[APPLE_FENCE] + && gl_info->supported[APPLE_CLIENT_STORAGE] + && gl_info->supported[APPLE_FLUSH_RENDER] + && gl_info->supported[APPLE_YCBCR_422]) + return GL_VENDOR_APPLE; - if (strstr(gl_vendor, "Intel(R)") + if (strstr(gl_vendor_string, "NVIDIA")) + return GL_VENDOR_NVIDIA; + + if (strstr(gl_vendor_string, "ATI")) + return GL_VENDOR_ATI; + + if (strstr(gl_vendor_string, "Intel(R)") || strstr(gl_renderer, "Intel(R)") - || strstr(gl_vendor, "Intel Inc.")) - return VENDOR_INTEL; + || strstr(gl_vendor_string, "Intel Inc.")) + return GL_VENDOR_INTEL; - if (strstr(gl_vendor, "Mesa") - || strstr(gl_vendor, "DRI R300 Project") - || strstr(gl_vendor, "Tungsten Graphics, Inc") - || strstr(gl_vendor, "VMware, Inc.")) - return VENDOR_MESA; + if (strstr(gl_vendor_string, "Mesa") + || strstr(gl_vendor_string, "Advanced Micro Devices, Inc.") + || strstr(gl_vendor_string, "DRI R300 Project") + || strstr(gl_vendor_string, "X.Org R300 Project") + || strstr(gl_vendor_string, "Tungsten Graphics, Inc") + || strstr(gl_vendor_string, "VMware, Inc.") + || strstr(gl_renderer, "Mesa") + || strstr(gl_renderer, "Gallium")) + return GL_VENDOR_MESA; - FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning VENDOR_WINE.\n", debugstr_a(gl_vendor)); + FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning GL_VENDOR_WINE.\n", debugstr_a(gl_vendor_string)); - return VENDOR_WINE; + return GL_VENDOR_WINE; } -static enum wined3d_pci_device wined3d_guess_card(const struct wined3d_gl_info *gl_info, const char *gl_renderer, - enum wined3d_pci_vendor *vendor, unsigned int *vidmem) +static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_string, const char *gl_renderer) { - /* Below is a list of Nvidia and ATI GPUs. Both vendors have dozens of + if (strstr(gl_vendor_string, "NVIDIA")) + return HW_VENDOR_NVIDIA; + + if (strstr(gl_vendor_string, "ATI") + || strstr(gl_vendor_string, "Advanced Micro Devices, Inc.") + || strstr(gl_vendor_string, "X.Org R300 Project") + || strstr(gl_vendor_string, "DRI R300 Project")) + return HW_VENDOR_ATI; + + if (strstr(gl_vendor_string, "Intel(R)") + || strstr(gl_renderer, "Intel(R)") + || strstr(gl_vendor_string, "Intel Inc.")) + return HW_VENDOR_INTEL; + + if (strstr(gl_vendor_string, "Mesa") + || strstr(gl_vendor_string, "Tungsten Graphics, Inc") + || strstr(gl_vendor_string, "VMware, Inc.")) + return HW_VENDOR_WINE; + + FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning HW_VENDOR_NVIDIA.\n", debugstr_a(gl_vendor_string)); + + return HW_VENDOR_NVIDIA; +} + + + +enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer, + unsigned int *vidmem ) +{ + /* Both the GeforceFX, 6xxx and 7xxx series support D3D9. The last two types have more + * shader capabilities, so we use the shader capabilities to distinguish between FX and 6xxx/7xxx. + */ + if (WINE_D3D9_CAPABLE(gl_info) && gl_info->supported[NV_VERTEX_PROGRAM3]) + { + /* Geforce 200 - highend */ + if (strstr(gl_renderer, "GTX 280") + || strstr(gl_renderer, "GTX 285") + || strstr(gl_renderer, "GTX 295")) + { + *vidmem = 1024; + return CARD_NVIDIA_GEFORCE_GTX280; + } + + /* Geforce 200 - midend high */ + if (strstr(gl_renderer, "GTX 275")) + { + *vidmem = 896; + return CARD_NVIDIA_GEFORCE_GTX275; + } + + /* Geforce 200 - midend */ + if (strstr(gl_renderer, "GTX 260")) + { + *vidmem = 1024; + return CARD_NVIDIA_GEFORCE_GTX260; + } + /* Geforce 200 - midend */ + if (strstr(gl_renderer, "GT 240")) + { + *vidmem = 512; + return CARD_NVIDIA_GEFORCE_GT240; + } + + /* Geforce9 - highend / Geforce 200 - midend (GTS 150/250 are based on the same core) */ + if (strstr(gl_renderer, "9800") + || strstr(gl_renderer, "GTS 150") + || strstr(gl_renderer, "GTS 250")) + { + *vidmem = 512; + return CARD_NVIDIA_GEFORCE_9800GT; + } + + /* Geforce9 - midend */ + if (strstr(gl_renderer, "9600")) + { + *vidmem = 384; /* The 9600GSO has 384MB, the 9600GT has 512-1024MB */ + return CARD_NVIDIA_GEFORCE_9600GT; + } + + /* Geforce9 - midend low / Geforce 200 - low */ + if (strstr(gl_renderer, "9500") + || strstr(gl_renderer, "GT 120") + || strstr(gl_renderer, "GT 130")) + { + *vidmem = 256; /* The 9500GT has 256-1024MB */ + return CARD_NVIDIA_GEFORCE_9500GT; + } + + /* Geforce9 - lowend */ + if (strstr(gl_renderer, "9400")) + { + *vidmem = 256; /* The 9400GT has 256-1024MB */ + return CARD_NVIDIA_GEFORCE_9400GT; + } + + /* Geforce9 - lowend low */ + if (strstr(gl_renderer, "9100") + || strstr(gl_renderer, "9200") + || strstr(gl_renderer, "9300") + || strstr(gl_renderer, "G 100")) + { + *vidmem = 256; /* The 9100-9300 cards have 256MB */ + return CARD_NVIDIA_GEFORCE_9200; + } + + /* Geforce8 - highend */ + if (strstr(gl_renderer, "8800")) + { + *vidmem = 320; /* The 8800GTS uses 320MB, a 8800GTX can have 768MB */ + return CARD_NVIDIA_GEFORCE_8800GTS; + } + + /* Geforce8 - midend mobile */ + if (strstr(gl_renderer, "8600 M")) + { + *vidmem = 512; + return CARD_NVIDIA_GEFORCE_8600MGT; + } + + /* Geforce8 - midend */ + if (strstr(gl_renderer, "8600") + || strstr(gl_renderer, "8700")) + { + *vidmem = 256; + return CARD_NVIDIA_GEFORCE_8600GT; + } + + /* Geforce8 - lowend */ + if (strstr(gl_renderer, "8100") + || strstr(gl_renderer, "8200") + || strstr(gl_renderer, "8300") + || strstr(gl_renderer, "8400") + || strstr(gl_renderer, "8500")) + { + *vidmem = 128; /* 128-256MB for a 8300, 256-512MB for a 8400 */ + return CARD_NVIDIA_GEFORCE_8300GS; + } + + /* Geforce7 - highend */ + if (strstr(gl_renderer, "7800") + || strstr(gl_renderer, "7900") + || strstr(gl_renderer, "7950") + || strstr(gl_renderer, "Quadro FX 4") + || strstr(gl_renderer, "Quadro FX 5")) + { + *vidmem = 256; /* A 7800GT uses 256MB while highend 7900 cards can use 512MB */ + return CARD_NVIDIA_GEFORCE_7800GT; + } + + /* Geforce7 midend */ + if (strstr(gl_renderer, "7600") + || strstr(gl_renderer, "7700")) + { + *vidmem = 256; /* The 7600 uses 256-512MB */ + return CARD_NVIDIA_GEFORCE_7600; + } + + /* Geforce7 lower medium */ + if (strstr(gl_renderer, "7400")) + { + *vidmem = 256; /* The 7400 uses 256-512MB */ + return CARD_NVIDIA_GEFORCE_7400; + } + + /* Geforce7 lowend */ + if (strstr(gl_renderer, "7300")) + { + *vidmem = 256; /* Mac Pros with this card have 256 MB */ + return CARD_NVIDIA_GEFORCE_7300; + } + + /* Geforce6 highend */ + if (strstr(gl_renderer, "6800")) + { + *vidmem = 128; /* The 6800 uses 128-256MB, the 7600 uses 256-512MB */ + return CARD_NVIDIA_GEFORCE_6800; + } + + /* Geforce6 - midend */ + if (strstr(gl_renderer, "6600") + || strstr(gl_renderer, "6610") + || strstr(gl_renderer, "6700")) + { + *vidmem = 128; /* A 6600GT has 128-256MB */ + return CARD_NVIDIA_GEFORCE_6600GT; + } + + /* Geforce6/7 lowend */ + *vidmem = 64; /* */ + return CARD_NVIDIA_GEFORCE_6200; /* Geforce 6100/6150/6200/7300/7400/7500 */ + } + + if (WINE_D3D9_CAPABLE(gl_info)) + { + /* GeforceFX - highend */ + if (strstr(gl_renderer, "5800") + || strstr(gl_renderer, "5900") + || strstr(gl_renderer, "5950") + || strstr(gl_renderer, "Quadro FX")) + { + *vidmem = 256; /* 5800-5900 cards use 256MB */ + return CARD_NVIDIA_GEFORCEFX_5800; + } + + /* GeforceFX - midend */ + if (strstr(gl_renderer, "5600") + || strstr(gl_renderer, "5650") + || strstr(gl_renderer, "5700") + || strstr(gl_renderer, "5750")) + { + *vidmem = 128; /* A 5600 uses 128-256MB */ + return CARD_NVIDIA_GEFORCEFX_5600; + } + + /* GeforceFX - lowend */ + *vidmem = 64; /* Normal FX5200 cards use 64-256MB; laptop (non-standard) can have less */ + return CARD_NVIDIA_GEFORCEFX_5200; /* GeforceFX 5100/5200/5250/5300/5500 */ + } + + if (WINE_D3D8_CAPABLE(gl_info)) + { + if (strstr(gl_renderer, "GeForce4 Ti") || strstr(gl_renderer, "Quadro4")) + { + *vidmem = 64; /* Geforce4 Ti cards have 64-128MB */ + return CARD_NVIDIA_GEFORCE4_TI4200; /* Geforce4 Ti4200/Ti4400/Ti4600/Ti4800, Quadro4 */ + } + + *vidmem = 64; /* Geforce3 cards have 64-128MB */ + return CARD_NVIDIA_GEFORCE3; /* Geforce3 standard/Ti200/Ti500, Quadro DCC */ + } + + if (WINE_D3D7_CAPABLE(gl_info)) + { + if (strstr(gl_renderer, "GeForce4 MX")) + { + /* Most Geforce4MX GPUs have at least 64MB of memory, some + * early models had 32MB but most have 64MB or even 128MB. */ + *vidmem = 64; + return CARD_NVIDIA_GEFORCE4_MX; /* MX420/MX440/MX460/MX4000 */ + } + + if (strstr(gl_renderer, "GeForce2 MX") || strstr(gl_renderer, "Quadro2 MXR")) + { + *vidmem = 32; /* Geforce2MX GPUs have 32-64MB of video memory */ + return CARD_NVIDIA_GEFORCE2_MX; /* Geforce2 standard/MX100/MX200/MX400, Quadro2 MXR */ + } + + if (strstr(gl_renderer, "GeForce2") || strstr(gl_renderer, "Quadro2")) + { + *vidmem = 32; /* Geforce2 GPUs have 32-64MB of video memory */ + return CARD_NVIDIA_GEFORCE2; /* Geforce2 GTS/Pro/Ti/Ultra, Quadro2 */ + } + + /* Most Geforce1 cards have 32MB, there are also some rare 16 + * and 64MB (Dell) models. */ + *vidmem = 32; + return CARD_NVIDIA_GEFORCE; /* Geforce 256/DDR, Quadro */ + } + + if (strstr(gl_renderer, "TNT2")) + { + *vidmem = 32; /* Most TNT2 boards have 32MB, though there are 16MB boards too */ + return CARD_NVIDIA_RIVA_TNT2; /* Riva TNT2 standard/M64/Pro/Ultra */ + } + + *vidmem = 16; /* Most TNT boards have 16MB, some rare models have 8MB */ + return CARD_NVIDIA_RIVA_TNT; /* Riva TNT, Vanta */ + +} + +enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer, + unsigned int *vidmem ) +{ + /* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx + * + * Beware: renderer string do not match exact card model, + * eg HD 4800 is returned for multiple cards, even for RV790 based ones. */ + if (WINE_D3D9_CAPABLE(gl_info)) + { + /* Radeon EG CYPRESS XT / PRO HD5800 - highend */ + if (strstr(gl_renderer, "HD 5800") /* Radeon EG CYPRESS HD58xx generic renderer string */ + || strstr(gl_renderer, "HD 5850") /* Radeon EG CYPRESS XT */ + || strstr(gl_renderer, "HD 5870")) /* Radeon EG CYPRESS PRO */ + { + *vidmem = 1024; /* note: HD58xx cards use 1024MB */ + return CARD_ATI_RADEON_HD5800; + } + + /* Radeon EG JUNIPER XT / LE HD5700 - midend */ + if (strstr(gl_renderer, "HD 5700") /* Radeon EG JUNIPER HD57xx generic renderer string */ + || strstr(gl_renderer, "HD 5750") /* Radeon EG JUNIPER LE */ + || strstr(gl_renderer, "HD 5770")) /* Radeon EG JUNIPER XT */ + { + *vidmem = 512; /* note: HD5770 cards use 1024MB and HD5750 cards use 512MB or 1024MB */ + return CARD_ATI_RADEON_HD5700; + } + + /* Radeon R7xx HD4800 - highend */ + if (strstr(gl_renderer, "HD 4800") /* Radeon RV7xx HD48xx generic renderer string */ + || strstr(gl_renderer, "HD 4830") /* Radeon RV770 */ + || strstr(gl_renderer, "HD 4850") /* Radeon RV770 */ + || strstr(gl_renderer, "HD 4870") /* Radeon RV770 */ + || strstr(gl_renderer, "HD 4890")) /* Radeon RV790 */ + { + *vidmem = 512; /* note: HD4890 cards use 1024MB */ + return CARD_ATI_RADEON_HD4800; + } + + /* Radeon R740 HD4700 - midend */ + if (strstr(gl_renderer, "HD 4700") /* Radeon RV770 */ + || strstr(gl_renderer, "HD 4770")) /* Radeon RV740 */ + { + *vidmem = 512; + return CARD_ATI_RADEON_HD4700; + } + + /* Radeon R730 HD4600 - midend */ + if (strstr(gl_renderer, "HD 4600") /* Radeon RV730 */ + || strstr(gl_renderer, "HD 4650") /* Radeon RV730 */ + || strstr(gl_renderer, "HD 4670")) /* Radeon RV730 */ + { + *vidmem = 512; + return CARD_ATI_RADEON_HD4600; + } + + /* Radeon R710 HD4500/HD4350 - lowend */ + if (strstr(gl_renderer, "HD 4350") /* Radeon RV710 */ + || strstr(gl_renderer, "HD 4550")) /* Radeon RV710 */ + { + *vidmem = 256; + return CARD_ATI_RADEON_HD4350; + } + + /* Radeon R6xx HD2900/HD3800 - highend */ + if (strstr(gl_renderer, "HD 2900") + || strstr(gl_renderer, "HD 3870") + || strstr(gl_renderer, "HD 3850")) + { + *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */ + return CARD_ATI_RADEON_HD2900; + } + + /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */ + if (strstr(gl_renderer, "HD 2600") + || strstr(gl_renderer, "HD 3830") + || strstr(gl_renderer, "HD 3690") + || strstr(gl_renderer, "HD 3650")) + { + *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */ + return CARD_ATI_RADEON_HD2600; + } + + /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */ + if (strstr(gl_renderer, "HD 2300") + || strstr(gl_renderer, "HD 2400") + || strstr(gl_renderer, "HD 3470") + || strstr(gl_renderer, "HD 3450") + || strstr(gl_renderer, "HD 3430") + || strstr(gl_renderer, "HD 3400")) + { + *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */ + return CARD_ATI_RADEON_HD2300; + } + + /* Radeon R6xx/R7xx integrated */ + if (strstr(gl_renderer, "HD 3100") + || strstr(gl_renderer, "HD 3200") + || strstr(gl_renderer, "HD 3300")) + { + *vidmem = 128; /* 128MB */ + return CARD_ATI_RADEON_HD3200; + } + + /* Radeon R5xx */ + if (strstr(gl_renderer, "X1600") + || strstr(gl_renderer, "X1650") + || strstr(gl_renderer, "X1800") + || strstr(gl_renderer, "X1900") + || strstr(gl_renderer, "X1950")) + { + *vidmem = 128; /* X1600 uses 128-256MB, >=X1800 uses 256MB */ + return CARD_ATI_RADEON_X1600; + } + + /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300 (lowend R5xx) */ + if (strstr(gl_renderer, "X700") + || strstr(gl_renderer, "X800") + || strstr(gl_renderer, "X850") + || strstr(gl_renderer, "X1300") + || strstr(gl_renderer, "X1400") + || strstr(gl_renderer, "X1450") + || strstr(gl_renderer, "X1550")) + { + *vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */ + return CARD_ATI_RADEON_X700; + } + + /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400MHz */ + if (strstr(gl_renderer, "Radeon Xpress")) + { + *vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */ + return CARD_ATI_RADEON_XPRESS_200M; + } + + /* Radeon R3xx */ + *vidmem = 64; /* Radeon 9500 uses 64MB, higher models use up to 256MB */ + return CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */ + } + + if (WINE_D3D8_CAPABLE(gl_info)) + { + *vidmem = 64; /* 8500/9000 cards use mostly 64MB, though there are 32MB and 128MB models */ + return CARD_ATI_RADEON_8500; /* Radeon 8500/9000/9100/9200/9300 */ + } + + if (WINE_D3D7_CAPABLE(gl_info)) + { + *vidmem = 32; /* There are models with up to 64MB */ + return CARD_ATI_RADEON_7200; /* Radeon 7000/7100/7200/7500 */ + } + + *vidmem = 16; /* There are 16-32MB models */ + return CARD_ATI_RAGE_128PRO; + +} + +enum wined3d_pci_device select_card_intel_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer, + unsigned int *vidmem ) +{ + if (strstr(gl_renderer, "X3100")) + { + /* MacOS calls the card GMA X3100, Google findings also suggest the name GM965 */ + *vidmem = 128; + return CARD_INTEL_X3100; + } + + if (strstr(gl_renderer, "GMA 950") || strstr(gl_renderer, "945GM")) + { + /* MacOS calls the card GMA 950, but everywhere else the PCI ID is named 945GM */ + *vidmem = 64; + return CARD_INTEL_I945GM; + } + + if (strstr(gl_renderer, "915GM")) return CARD_INTEL_I915GM; + if (strstr(gl_renderer, "915G")) return CARD_INTEL_I915G; + if (strstr(gl_renderer, "865G")) return CARD_INTEL_I865G; + if (strstr(gl_renderer, "855G")) return CARD_INTEL_I855G; + if (strstr(gl_renderer, "830G")) return CARD_INTEL_I830G; + return CARD_INTEL_I915G; + +} + +enum wined3d_pci_device (select_card_ati_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer, + unsigned int *vidmem ) +{ + /* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx + * + * Beware: renderer string do not match exact card model, + * eg HD 4800 is returned for multiple cards, even for RV790 based ones. */ + if (strstr(gl_renderer, "Gallium")) + { + /* Radeon R7xx HD4800 - highend */ + if (strstr(gl_renderer, "R700") /* Radeon R7xx HD48xx generic renderer string */ + || strstr(gl_renderer, "RV770") /* Radeon RV770 */ + || strstr(gl_renderer, "RV790")) /* Radeon RV790 */ + { + *vidmem = 512; /* note: HD4890 cards use 1024MB */ + return CARD_ATI_RADEON_HD4800; + } + + /* Radeon R740 HD4700 - midend */ + if (strstr(gl_renderer, "RV740")) /* Radeon RV740 */ + { + *vidmem = 512; + return CARD_ATI_RADEON_HD4700; + } + + /* Radeon R730 HD4600 - midend */ + if (strstr(gl_renderer, "RV730")) /* Radeon RV730 */ + { + *vidmem = 512; + return CARD_ATI_RADEON_HD4600; + } + + /* Radeon R710 HD4500/HD4350 - lowend */ + if (strstr(gl_renderer, "RV710")) /* Radeon RV710 */ + { + *vidmem = 256; + return CARD_ATI_RADEON_HD4350; + } + + /* Radeon R6xx HD2900/HD3800 - highend */ + if (strstr(gl_renderer, "R600") + || strstr(gl_renderer, "RV670") + || strstr(gl_renderer, "R680")) + { + *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */ + return CARD_ATI_RADEON_HD2900; + } + + /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */ + if (strstr(gl_renderer, "RV630") + || strstr(gl_renderer, "RV635")) + { + *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */ + return CARD_ATI_RADEON_HD2600; + } + + /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */ + if (strstr(gl_renderer, "RV610") + || strstr(gl_renderer, "RV620")) + { + *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */ + return CARD_ATI_RADEON_HD2300; + } + + /* Radeon R6xx/R7xx integrated */ + if (strstr(gl_renderer, "RS780") + || strstr(gl_renderer, "RS880")) + { + *vidmem = 128; /* 128MB */ + return CARD_ATI_RADEON_HD3200; + } + + /* Radeon R5xx */ + if (strstr(gl_renderer, "RV530") + || strstr(gl_renderer, "RV535") + || strstr(gl_renderer, "RV560") + || strstr(gl_renderer, "R520") + || strstr(gl_renderer, "RV570") + || strstr(gl_renderer, "R580")) + { + *vidmem = 128; /* X1600 uses 128-256MB, >=X1800 uses 256MB */ + return CARD_ATI_RADEON_X1600; + } + + /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300 (lowend R5xx) */ + if (strstr(gl_renderer, "R410") + || strstr(gl_renderer, "R420") + || strstr(gl_renderer, "R423") + || strstr(gl_renderer, "R430") + || strstr(gl_renderer, "R480") + || strstr(gl_renderer, "R481") + || strstr(gl_renderer, "RV410") + || strstr(gl_renderer, "RV515") + || strstr(gl_renderer, "RV516")) + { + *vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */ + return CARD_ATI_RADEON_X700; + } + + /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400MHz */ + if (strstr(gl_renderer, "RS400") + || strstr(gl_renderer, "RS480") + || strstr(gl_renderer, "RS482") + || strstr(gl_renderer, "RS485") + || strstr(gl_renderer, "RS600") + || strstr(gl_renderer, "RS690") + || strstr(gl_renderer, "RS740")) + { + *vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */ + return CARD_ATI_RADEON_XPRESS_200M; + } + + /* Radeon R3xx */ + if (strstr(gl_renderer, "R300") + || strstr(gl_renderer, "RV350") + || strstr(gl_renderer, "RV351") + || strstr(gl_renderer, "RV360") + || strstr(gl_renderer, "RV370") + || strstr(gl_renderer, "R350") + || strstr(gl_renderer, "R360")) + { + *vidmem = 64; /* Radeon 9500 uses 64MB, higher models use up to 256MB */ + return CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */ + } + } + + if (WINE_D3D9_CAPABLE(gl_info)) + { + /* Radeon R7xx HD4800 - highend */ + if (strstr(gl_renderer, "(R700") /* Radeon R7xx HD48xx generic renderer string */ + || strstr(gl_renderer, "(RV770") /* Radeon RV770 */ + || strstr(gl_renderer, "(RV790")) /* Radeon RV790 */ + { + *vidmem = 512; /* note: HD4890 cards use 1024MB */ + return CARD_ATI_RADEON_HD4800; + } + + /* Radeon R740 HD4700 - midend */ + if (strstr(gl_renderer, "(RV740")) /* Radeon RV740 */ + { + *vidmem = 512; + return CARD_ATI_RADEON_HD4700; + } + + /* Radeon R730 HD4600 - midend */ + if (strstr(gl_renderer, "(RV730")) /* Radeon RV730 */ + { + *vidmem = 512; + return CARD_ATI_RADEON_HD4600; + } + + /* Radeon R710 HD4500/HD4350 - lowend */ + if (strstr(gl_renderer, "(RV710")) /* Radeon RV710 */ + { + *vidmem = 256; + return CARD_ATI_RADEON_HD4350; + } + + /* Radeon R6xx HD2900/HD3800 - highend */ + if (strstr(gl_renderer, "(R600") + || strstr(gl_renderer, "(RV670") + || strstr(gl_renderer, "(R680")) + { + *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */ + return CARD_ATI_RADEON_HD2900; + } + + /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */ + if (strstr(gl_renderer, "(RV630") + || strstr(gl_renderer, "(RV635")) + { + *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */ + return CARD_ATI_RADEON_HD2600; + } + + /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */ + if (strstr(gl_renderer, "(RV610") + || strstr(gl_renderer, "(RV620")) + { + *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */ + return CARD_ATI_RADEON_HD2300; + } + + /* Radeon R6xx/R7xx integrated */ + if (strstr(gl_renderer, "(RS780") + || strstr(gl_renderer, "(RS880")) + { + *vidmem = 128; /* 128MB */ + return CARD_ATI_RADEON_HD3200; + } + } + + if (WINE_D3D8_CAPABLE(gl_info)) + { + *vidmem = 64; /* 8500/9000 cards use mostly 64MB, though there are 32MB and 128MB models */ + return CARD_ATI_RADEON_8500; /* Radeon 8500/9000/9100/9200/9300 */ + } + + if (WINE_D3D7_CAPABLE(gl_info)) + { + *vidmem = 32; /* There are models with up to 64MB */ + return CARD_ATI_RADEON_7200; /* Radeon 7000/7100/7200/7500 */ + } + + *vidmem = 16; /* There are 16-32MB models */ + return CARD_ATI_RAGE_128PRO; + +} + +enum wined3d_pci_device (select_card_nvidia_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer, + unsigned int *vidmem ) +{ + FIXME_(d3d_caps)("Card selection not handled for Mesa Nouveau driver\n"); + if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600; + if (WINE_D3D8_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE3; + if (WINE_D3D7_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE; + if (WINE_D3D6_CAPABLE(gl_info)) return CARD_NVIDIA_RIVA_TNT; + return CARD_NVIDIA_RIVA_128; +} + +enum wined3d_pci_device (select_card_intel_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer, + unsigned int *vidmem ) +{ + FIXME_(d3d_caps)("Card selection not handled for Mesa Intel driver\n"); + return CARD_INTEL_I915G; +} + + +struct vendor_card_selection +{ + enum wined3d_gl_vendor gl_vendor; + enum wined3d_pci_vendor card_vendor; + const char *description; /* Description of the card selector i.e. Apple OS/X Intel */ + enum wined3d_pci_device (*select_card)(const struct wined3d_gl_info *gl_info, const char *gl_renderer, + unsigned int *vidmem ); +}; + +static const struct vendor_card_selection vendor_card_select_table[] = +{ + {GL_VENDOR_NVIDIA, HW_VENDOR_NVIDIA, "Nvidia binary driver", select_card_nvidia_binary}, + {GL_VENDOR_APPLE, HW_VENDOR_NVIDIA, "Apple OSX NVidia binary driver", select_card_nvidia_binary}, + {GL_VENDOR_APPLE, HW_VENDOR_ATI, "Apple OSX AMD/ATI binary driver", select_card_ati_binary}, + {GL_VENDOR_APPLE, HW_VENDOR_INTEL, "Apple OSX Intel binary driver", select_card_intel_binary}, + {GL_VENDOR_ATI, HW_VENDOR_ATI, "AMD/ATI binary driver", select_card_ati_binary}, + {GL_VENDOR_MESA, HW_VENDOR_ATI, "Mesa AMD/ATI driver", select_card_ati_mesa}, + {GL_VENDOR_MESA, HW_VENDOR_NVIDIA, "Mesa Nouveau driver", select_card_nvidia_mesa}, + {GL_VENDOR_MESA, HW_VENDOR_INTEL, "Mesa Intel driver", select_card_intel_mesa} +}; + + +static enum wined3d_pci_device wined3d_guess_card(const struct wined3d_gl_info *gl_info, const char *gl_renderer, + enum wined3d_gl_vendor *gl_vendor, enum wined3d_pci_vendor *card_vendor, unsigned int *vidmem) +{ + /* Above is a list of Nvidia and ATI GPUs. Both vendors have dozens of * different GPUs with roughly the same features. In most cases GPUs from a * certain family differ in clockspeeds, the amount of video memory and the * number of shader pipelines. @@ -1192,451 +1915,84 @@ static enum wined3d_pci_device wined3d_guess_card(const struct wined3d_gl_info * * memory behind our backs if really needed. Note that the amount of video * memory can be overruled using a registry setting. */ - switch (*vendor) + int i; + + for (i = 0; i < (sizeof(vendor_card_select_table) / sizeof(*vendor_card_select_table)); ++i) { - case VENDOR_NVIDIA: - /* Both the GeforceFX, 6xxx and 7xxx series support D3D9. The last two types have more - * shader capabilities, so we use the shader capabilities to distinguish between FX and 6xxx/7xxx. - */ - if (WINE_D3D9_CAPABLE(gl_info) && gl_info->supported[NV_VERTEX_PROGRAM3]) - { - /* Geforce 200 - highend */ - if (strstr(gl_renderer, "GTX 280") - || strstr(gl_renderer, "GTX 285") - || strstr(gl_renderer, "GTX 295")) - { - *vidmem = 1024; - return CARD_NVIDIA_GEFORCE_GTX280; - } - - /* Geforce 200 - midend high */ - if (strstr(gl_renderer, "GTX 275")) - { - *vidmem = 896; - return CARD_NVIDIA_GEFORCE_GTX275; - } - - /* Geforce 200 - midend */ - if (strstr(gl_renderer, "GTX 260")) - { - *vidmem = 1024; - return CARD_NVIDIA_GEFORCE_GTX260; - } - /* Geforce 200 - midend */ - if (strstr(gl_renderer, "GT 240")) - { - *vidmem = 512; - return CARD_NVIDIA_GEFORCE_GT240; - } - - /* Geforce9 - highend / Geforce 200 - midend (GTS 150/250 are based on the same core) */ - if (strstr(gl_renderer, "9800") - || strstr(gl_renderer, "GTS 150") - || strstr(gl_renderer, "GTS 250")) - { - *vidmem = 512; - return CARD_NVIDIA_GEFORCE_9800GT; - } - - /* Geforce9 - midend */ - if (strstr(gl_renderer, "9600")) - { - *vidmem = 384; /* The 9600GSO has 384MB, the 9600GT has 512-1024MB */ - return CARD_NVIDIA_GEFORCE_9600GT; - } - - /* Geforce9 - midend low / Geforce 200 - low */ - if (strstr(gl_renderer, "9500") - || strstr(gl_renderer, "GT 120") - || strstr(gl_renderer, "GT 130")) - { - *vidmem = 256; /* The 9500GT has 256-1024MB */ - return CARD_NVIDIA_GEFORCE_9500GT; - } - - /* Geforce9 - lowend */ - if (strstr(gl_renderer, "9400")) - { - *vidmem = 256; /* The 9400GT has 256-1024MB */ - return CARD_NVIDIA_GEFORCE_9400GT; - } - - /* Geforce9 - lowend low */ - if (strstr(gl_renderer, "9100") - || strstr(gl_renderer, "9200") - || strstr(gl_renderer, "9300") - || strstr(gl_renderer, "G 100")) - { - *vidmem = 256; /* The 9100-9300 cards have 256MB */ - return CARD_NVIDIA_GEFORCE_9200; - } - - /* Geforce8 - highend */ - if (strstr(gl_renderer, "8800")) - { - *vidmem = 320; /* The 8800GTS uses 320MB, a 8800GTX can have 768MB */ - return CARD_NVIDIA_GEFORCE_8800GTS; - } - - /* Geforce8 - midend mobile */ - if (strstr(gl_renderer, "8600 M")) - { - *vidmem = 512; - return CARD_NVIDIA_GEFORCE_8600MGT; - } - - /* Geforce8 - midend */ - if (strstr(gl_renderer, "8600") - || strstr(gl_renderer, "8700")) - { - *vidmem = 256; - return CARD_NVIDIA_GEFORCE_8600GT; - } - - /* Geforce8 - lowend */ - if (strstr(gl_renderer, "8100") - || strstr(gl_renderer, "8200") - || strstr(gl_renderer, "8300") - || strstr(gl_renderer, "8400") - || strstr(gl_renderer, "8500")) - { - *vidmem = 128; /* 128-256MB for a 8300, 256-512MB for a 8400 */ - return CARD_NVIDIA_GEFORCE_8300GS; - } - - /* Geforce7 - highend */ - if (strstr(gl_renderer, "7800") - || strstr(gl_renderer, "7900") - || strstr(gl_renderer, "7950") - || strstr(gl_renderer, "Quadro FX 4") - || strstr(gl_renderer, "Quadro FX 5")) - { - *vidmem = 256; /* A 7800GT uses 256MB while highend 7900 cards can use 512MB */ - return CARD_NVIDIA_GEFORCE_7800GT; - } - - /* Geforce7 midend */ - if (strstr(gl_renderer, "7600") - || strstr(gl_renderer, "7700")) - { - *vidmem = 256; /* The 7600 uses 256-512MB */ - return CARD_NVIDIA_GEFORCE_7600; - } - - /* Geforce7 lower medium */ - if (strstr(gl_renderer, "7400")) - { - *vidmem = 256; /* The 7400 uses 256-512MB */ - return CARD_NVIDIA_GEFORCE_7400; - } - - /* Geforce7 lowend */ - if (strstr(gl_renderer, "7300")) - { - *vidmem = 256; /* Mac Pros with this card have 256 MB */ - return CARD_NVIDIA_GEFORCE_7300; - } - - /* Geforce6 highend */ - if (strstr(gl_renderer, "6800")) - { - *vidmem = 128; /* The 6800 uses 128-256MB, the 7600 uses 256-512MB */ - return CARD_NVIDIA_GEFORCE_6800; - } - - /* Geforce6 - midend */ - if (strstr(gl_renderer, "6600") - || strstr(gl_renderer, "6610") - || strstr(gl_renderer, "6700")) - { - *vidmem = 128; /* A 6600GT has 128-256MB */ - return CARD_NVIDIA_GEFORCE_6600GT; - } - - /* Geforce6/7 lowend */ - *vidmem = 64; /* */ - return CARD_NVIDIA_GEFORCE_6200; /* Geforce 6100/6150/6200/7300/7400/7500 */ - } - - if (WINE_D3D9_CAPABLE(gl_info)) - { - /* GeforceFX - highend */ - if (strstr(gl_renderer, "5800") - || strstr(gl_renderer, "5900") - || strstr(gl_renderer, "5950") - || strstr(gl_renderer, "Quadro FX")) - { - *vidmem = 256; /* 5800-5900 cards use 256MB */ - return CARD_NVIDIA_GEFORCEFX_5800; - } - - /* GeforceFX - midend */ - if (strstr(gl_renderer, "5600") - || strstr(gl_renderer, "5650") - || strstr(gl_renderer, "5700") - || strstr(gl_renderer, "5750")) - { - *vidmem = 128; /* A 5600 uses 128-256MB */ - return CARD_NVIDIA_GEFORCEFX_5600; - } - - /* GeforceFX - lowend */ - *vidmem = 64; /* Normal FX5200 cards use 64-256MB; laptop (non-standard) can have less */ - return CARD_NVIDIA_GEFORCEFX_5200; /* GeforceFX 5100/5200/5250/5300/5500 */ - } - - if (WINE_D3D8_CAPABLE(gl_info)) - { - if (strstr(gl_renderer, "GeForce4 Ti") || strstr(gl_renderer, "Quadro4")) - { - *vidmem = 64; /* Geforce4 Ti cards have 64-128MB */ - return CARD_NVIDIA_GEFORCE4_TI4200; /* Geforce4 Ti4200/Ti4400/Ti4600/Ti4800, Quadro4 */ - } - - *vidmem = 64; /* Geforce3 cards have 64-128MB */ - return CARD_NVIDIA_GEFORCE3; /* Geforce3 standard/Ti200/Ti500, Quadro DCC */ - } - - if (WINE_D3D7_CAPABLE(gl_info)) - { - if (strstr(gl_renderer, "GeForce4 MX")) - { - /* Most Geforce4MX GPUs have at least 64MB of memory, some - * early models had 32MB but most have 64MB or even 128MB. */ - *vidmem = 64; - return CARD_NVIDIA_GEFORCE4_MX; /* MX420/MX440/MX460/MX4000 */ - } - - if (strstr(gl_renderer, "GeForce2 MX") || strstr(gl_renderer, "Quadro2 MXR")) - { - *vidmem = 32; /* Geforce2MX GPUs have 32-64MB of video memory */ - return CARD_NVIDIA_GEFORCE2_MX; /* Geforce2 standard/MX100/MX200/MX400, Quadro2 MXR */ - } - - if (strstr(gl_renderer, "GeForce2") || strstr(gl_renderer, "Quadro2")) - { - *vidmem = 32; /* Geforce2 GPUs have 32-64MB of video memory */ - return CARD_NVIDIA_GEFORCE2; /* Geforce2 GTS/Pro/Ti/Ultra, Quadro2 */ - } - - /* Most Geforce1 cards have 32MB, there are also some rare 16 - * and 64MB (Dell) models. */ - *vidmem = 32; - return CARD_NVIDIA_GEFORCE; /* Geforce 256/DDR, Quadro */ - } - - if (strstr(gl_renderer, "TNT2")) - { - *vidmem = 32; /* Most TNT2 boards have 32MB, though there are 16MB boards too */ - return CARD_NVIDIA_RIVA_TNT2; /* Riva TNT2 standard/M64/Pro/Ultra */ - } - - *vidmem = 16; /* Most TNT boards have 16MB, some rare models have 8MB */ - return CARD_NVIDIA_RIVA_TNT; /* Riva TNT, Vanta */ - - case VENDOR_ATI: - /* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx - * - * Beware: renderer string do not match exact card model, - * eg HD 4800 is returned for multiple cards, even for RV790 based ones. */ - if (WINE_D3D9_CAPABLE(gl_info)) - { - /* Radeon EG CYPRESS XT / PRO HD5800 - highend */ - if (strstr(gl_renderer, "HD 5800") /* Radeon EG CYPRESS HD58xx generic renderer string */ - || strstr(gl_renderer, "HD 5850") /* Radeon EG CYPRESS XT */ - || strstr(gl_renderer, "HD 5870")) /* Radeon EG CYPRESS PRO */ - { - *vidmem = 1024; /* note: HD58xx cards use 1024MB */ - return CARD_ATI_RADEON_HD5800; - } - - /* Radeon EG JUNIPER XT / LE HD5700 - midend */ - if (strstr(gl_renderer, "HD 5700") /* Radeon EG JUNIPER HD57xx generic renderer string */ - || strstr(gl_renderer, "HD 5750") /* Radeon EG JUNIPER LE */ - || strstr(gl_renderer, "HD 5770")) /* Radeon EG JUNIPER XT */ - { - *vidmem = 512; /* note: HD5770 cards use 1024MB and HD5750 cards use 512MB or 1024MB */ - return CARD_ATI_RADEON_HD5700; - } - - /* Radeon R7xx HD4800 - highend */ - if (strstr(gl_renderer, "HD 4800") /* Radeon RV7xx HD48xx generic renderer string */ - || strstr(gl_renderer, "HD 4830") /* Radeon RV770 */ - || strstr(gl_renderer, "HD 4850") /* Radeon RV770 */ - || strstr(gl_renderer, "HD 4870") /* Radeon RV770 */ - || strstr(gl_renderer, "HD 4890")) /* Radeon RV790 */ - { - *vidmem = 512; /* note: HD4890 cards use 1024MB */ - return CARD_ATI_RADEON_HD4800; - } - - /* Radeon R740 HD4700 - midend */ - if (strstr(gl_renderer, "HD 4700") /* Radeon RV770 */ - || strstr(gl_renderer, "HD 4770")) /* Radeon RV740 */ - { - *vidmem = 512; - return CARD_ATI_RADEON_HD4700; - } - - /* Radeon R730 HD4600 - midend */ - if (strstr(gl_renderer, "HD 4600") /* Radeon RV730 */ - || strstr(gl_renderer, "HD 4650") /* Radeon RV730 */ - || strstr(gl_renderer, "HD 4670")) /* Radeon RV730 */ - { - *vidmem = 512; - return CARD_ATI_RADEON_HD4600; - } - - /* Radeon R710 HD4500/HD4350 - lowend */ - if (strstr(gl_renderer, "HD 4350") /* Radeon RV710 */ - || strstr(gl_renderer, "HD 4550")) /* Radeon RV710 */ - { - *vidmem = 256; - return CARD_ATI_RADEON_HD4350; - } - - /* Radeon R6xx HD2900/HD3800 - highend */ - if (strstr(gl_renderer, "HD 2900") - || strstr(gl_renderer, "HD 3870") - || strstr(gl_renderer, "HD 3850")) - { - *vidmem = 512; /* HD2900/HD3800 uses 256-1024MB */ - return CARD_ATI_RADEON_HD2900; - } - - /* Radeon R6xx HD2600/HD3600 - midend; HD3830 is China-only midend */ - if (strstr(gl_renderer, "HD 2600") - || strstr(gl_renderer, "HD 3830") - || strstr(gl_renderer, "HD 3690") - || strstr(gl_renderer, "HD 3650")) - { - *vidmem = 256; /* HD2600/HD3600 uses 256-512MB */ - return CARD_ATI_RADEON_HD2600; - } - - /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */ - if (strstr(gl_renderer, "HD 2300") - || strstr(gl_renderer, "HD 2400") - || strstr(gl_renderer, "HD 3470") - || strstr(gl_renderer, "HD 3450") - || strstr(gl_renderer, "HD 3430") - || strstr(gl_renderer, "HD 3400")) - { - *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */ - return CARD_ATI_RADEON_HD2300; - } - - /* Radeon R6xx/R7xx integrated */ - if (strstr(gl_renderer, "HD 3100") - || strstr(gl_renderer, "HD 3200") - || strstr(gl_renderer, "HD 3300")) - { - *vidmem = 128; /* 128MB */ - return CARD_ATI_RADEON_HD3200; - } - - /* Radeon R5xx */ - if (strstr(gl_renderer, "X1600") - || strstr(gl_renderer, "X1650") - || strstr(gl_renderer, "X1800") - || strstr(gl_renderer, "X1900") - || strstr(gl_renderer, "X1950")) - { - *vidmem = 128; /* X1600 uses 128-256MB, >=X1800 uses 256MB */ - return CARD_ATI_RADEON_X1600; - } - - /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300 (lowend R5xx) */ - if (strstr(gl_renderer, "X700") - || strstr(gl_renderer, "X800") - || strstr(gl_renderer, "X850") - || strstr(gl_renderer, "X1300") - || strstr(gl_renderer, "X1400") - || strstr(gl_renderer, "X1450") - || strstr(gl_renderer, "X1550")) - { - *vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */ - return CARD_ATI_RADEON_X700; - } - - /* Radeon Xpress Series - onboard, DX9b, Shader 2.0, 300-400MHz */ - if (strstr(gl_renderer, "Radeon Xpress")) - { - *vidmem = 64; /* Shared RAM, BIOS configurable, 64-256M */ - return CARD_ATI_RADEON_XPRESS_200M; - } - - /* Radeon R3xx */ - *vidmem = 64; /* Radeon 9500 uses 64MB, higher models use up to 256MB */ - return CARD_ATI_RADEON_9500; /* Radeon 9500/9550/9600/9700/9800/X300/X550/X600 */ - } - - if (WINE_D3D8_CAPABLE(gl_info)) - { - *vidmem = 64; /* 8500/9000 cards use mostly 64MB, though there are 32MB and 128MB models */ - return CARD_ATI_RADEON_8500; /* Radeon 8500/9000/9100/9200/9300 */ - } - - if (WINE_D3D7_CAPABLE(gl_info)) - { - *vidmem = 32; /* There are models with up to 64MB */ - return CARD_ATI_RADEON_7200; /* Radeon 7000/7100/7200/7500 */ - } - - *vidmem = 16; /* There are 16-32MB models */ - return CARD_ATI_RAGE_128PRO; - - case VENDOR_INTEL: - if (strstr(gl_renderer, "X3100")) - { - /* MacOS calls the card GMA X3100, Google findings also suggest the name GM965 */ - *vidmem = 128; - return CARD_INTEL_X3100; - } - - if (strstr(gl_renderer, "GMA 950") || strstr(gl_renderer, "945GM")) - { - /* MacOS calls the card GMA 950, but everywhere else the PCI ID is named 945GM */ - *vidmem = 64; - return CARD_INTEL_I945GM; - } - - if (strstr(gl_renderer, "915GM")) return CARD_INTEL_I915GM; - if (strstr(gl_renderer, "915G")) return CARD_INTEL_I915G; - if (strstr(gl_renderer, "865G")) return CARD_INTEL_I865G; - if (strstr(gl_renderer, "855G")) return CARD_INTEL_I855G; - if (strstr(gl_renderer, "830G")) return CARD_INTEL_I830G; - return CARD_INTEL_I915G; - - case VENDOR_MESA: - case VENDOR_WINE: - default: - /* Default to generic Nvidia hardware based on the supported OpenGL extensions. The choice - * for Nvidia was because the hardware and drivers they make are of good quality. This makes - * them a good generic choice. */ - *vendor = VENDOR_NVIDIA; - if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600; - if (WINE_D3D8_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE3; - if (WINE_D3D7_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE; - if (WINE_D3D6_CAPABLE(gl_info)) return CARD_NVIDIA_RIVA_TNT; - return CARD_NVIDIA_RIVA_128; + if ((vendor_card_select_table[i].gl_vendor != *gl_vendor) + || (vendor_card_select_table[i].card_vendor != *card_vendor)) + continue; + TRACE_(d3d_caps)("Applying card_selector \"%s\".\n", vendor_card_select_table[i].description); + return vendor_card_select_table[i].select_card(gl_info, gl_renderer, vidmem); } + + FIXME_(d3d_caps)("No card selector available for GL vendor %d and card vendor %04x.\n", + *gl_vendor, *card_vendor); + + /* Default to generic Nvidia hardware based on the supported OpenGL extensions. The choice + * for Nvidia was because the hardware and drivers they make are of good quality. This makes + * them a good generic choice. */ + *card_vendor = HW_VENDOR_NVIDIA; + if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600; + if (WINE_D3D8_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE3; + if (WINE_D3D7_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCE; + if (WINE_D3D6_CAPABLE(gl_info)) return CARD_NVIDIA_RIVA_TNT; + return CARD_NVIDIA_RIVA_128; +} + +static const struct fragment_pipeline *select_fragment_implementation(struct wined3d_adapter *adapter) +{ + const struct wined3d_gl_info *gl_info = &adapter->gl_info; + int vs_selected_mode, ps_selected_mode; + + select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode); + if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL) + && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_fragment_pipeline; + else if (ps_selected_mode == SHADER_ATI) return &atifs_fragment_pipeline; + else if (gl_info->supported[NV_REGISTER_COMBINERS] + && gl_info->supported[NV_TEXTURE_SHADER2]) return &nvts_fragment_pipeline; + else if (gl_info->supported[NV_REGISTER_COMBINERS]) return &nvrc_fragment_pipeline; + else return &ffp_fragment_pipeline; +} + +static const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter) +{ + int vs_selected_mode, ps_selected_mode; + + select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode); + if (vs_selected_mode == SHADER_GLSL || ps_selected_mode == SHADER_GLSL) return &glsl_shader_backend; + if (vs_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_ARB) return &arb_program_shader_backend; + return &none_shader_backend; +} + +static const struct blit_shader *select_blit_implementation(struct wined3d_adapter *adapter) +{ + const struct wined3d_gl_info *gl_info = &adapter->gl_info; + int vs_selected_mode, ps_selected_mode; + + select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode); + if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL) + && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_blit; + else return &ffp_blit; } /* Context activation is done by the caller. */ -static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, struct wined3d_gl_info *gl_info) +static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter) { + struct wined3d_driver_info *driver_info = &adapter->driver_info; + struct wined3d_gl_info *gl_info = &adapter->gl_info; const char *GL_Extensions = NULL; const char *WGL_Extensions = NULL; - const char *gl_string = NULL; - enum wined3d_pci_vendor vendor; + const char *gl_vendor_str, *gl_renderer_str, *gl_version_str; + struct fragment_caps fragment_caps; + enum wined3d_gl_vendor gl_vendor; + enum wined3d_pci_vendor card_vendor; enum wined3d_pci_device device; GLint gl_max; GLfloat gl_floatv[2]; unsigned i; HDC hdc; unsigned int vidmem=0; - char *gl_renderer; DWORD gl_version; size_t len; @@ -1644,48 +2000,34 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str ENTER_GL(); - gl_string = (const char *)glGetString(GL_RENDERER); - TRACE_(d3d_caps)("GL_RENDERER: %s.\n", debugstr_a(gl_string)); - if (!gl_string) + gl_renderer_str = (const char *)glGetString(GL_RENDERER); + TRACE_(d3d_caps)("GL_RENDERER: %s.\n", debugstr_a(gl_renderer_str)); + if (!gl_renderer_str) { LEAVE_GL(); ERR_(d3d_caps)("Received a NULL GL_RENDERER.\n"); return FALSE; } - len = strlen(gl_string) + 1; - gl_renderer = HeapAlloc(GetProcessHeap(), 0, len); - if (!gl_renderer) - { - LEAVE_GL(); - ERR_(d3d_caps)("Failed to allocate gl_renderer memory.\n"); - return FALSE; - } - memcpy(gl_renderer, gl_string, len); - - gl_string = (const char *)glGetString(GL_VENDOR); - TRACE_(d3d_caps)("GL_VENDOR: %s.\n", debugstr_a(gl_string)); - if (!gl_string) + gl_vendor_str = (const char *)glGetString(GL_VENDOR); + TRACE_(d3d_caps)("GL_VENDOR: %s.\n", debugstr_a(gl_vendor_str)); + if (!gl_vendor_str) { LEAVE_GL(); ERR_(d3d_caps)("Received a NULL GL_VENDOR.\n"); - HeapFree(GetProcessHeap(), 0, gl_renderer); return FALSE; } - vendor = wined3d_guess_vendor(gl_string, gl_renderer); - TRACE_(d3d_caps)("found GL_VENDOR (%s)->(0x%04x)\n", debugstr_a(gl_string), vendor); /* Parse the GL_VERSION field into major and minor information */ - gl_string = (const char *)glGetString(GL_VERSION); - TRACE_(d3d_caps)("GL_VERSION: %s.\n", debugstr_a(gl_string)); - if (!gl_string) + gl_version_str = (const char *)glGetString(GL_VERSION); + TRACE_(d3d_caps)("GL_VERSION: %s.\n", debugstr_a(gl_version_str)); + if (!gl_version_str) { LEAVE_GL(); ERR_(d3d_caps)("Received a NULL GL_VERSION.\n"); - HeapFree(GetProcessHeap(), 0, gl_renderer); return FALSE; } - gl_version = wined3d_parse_gl_version(gl_string); + gl_version = wined3d_parse_gl_version(gl_version_str); /* * Initialize openGL extension related variables @@ -1694,7 +2036,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str memset(gl_info->supported, 0, sizeof(gl_info->supported)); gl_info->limits.buffers = 1; gl_info->limits.textures = 1; - gl_info->limits.texture_stages = 1; gl_info->limits.fragment_samplers = 1; gl_info->limits.vertex_samplers = 0; gl_info->limits.combined_samplers = gl_info->limits.fragment_samplers + gl_info->limits.vertex_samplers; @@ -1734,7 +2075,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str { LEAVE_GL(); ERR_(d3d_caps)("Received a NULL GL_EXTENSIONS.\n"); - HeapFree(GetProcessHeap(), 0, gl_renderer); return FALSE; } @@ -1831,6 +2171,12 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str gl_info->supported[ARB_HALF_FLOAT_PIXEL] = TRUE; } } + if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) + { + /* GL_ARB_map_buffer_range and GL_APPLE_flush_buffer_range provide the same + * functionality. Prefer the ARB extension */ + gl_info->supported[APPLE_FLUSH_BUFFER_RANGE] = FALSE; + } if (gl_info->supported[ARB_TEXTURE_CUBE_MAP]) { TRACE_(d3d_caps)(" IMPLIED: NVIDIA (NV) Texture Gen Reflection support.\n"); @@ -1841,6 +2187,11 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str TRACE_(d3d_caps)(" IMPLIED: ARB_depth_clamp support (by NV_depth_clamp).\n"); gl_info->supported[ARB_DEPTH_CLAMP] = TRUE; } + if (!gl_info->supported[ARB_VERTEX_ARRAY_BGRA] && gl_info->supported[EXT_VERTEX_ARRAY_BGRA]) + { + TRACE_(d3d_caps)(" IMPLIED: ARB_vertex_array_bgra support (by EXT_vertex_array_bgra).\n"); + gl_info->supported[ARB_VERTEX_ARRAY_BGRA] = TRUE; + } if (gl_info->supported[NV_TEXTURE_SHADER2]) { if (gl_info->supported[NV_REGISTER_COMBINERS]) @@ -1851,6 +2202,13 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str gl_info->supported[ATI_FRAGMENT_SHADER] = FALSE; } } + + if (gl_info->supported[NV_REGISTER_COMBINERS]) + { + glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &gl_max); + gl_info->limits.general_combiners = gl_max; + TRACE_(d3d_caps)("Max general combiners: %d.\n", gl_max); + } if (gl_info->supported[ARB_DRAW_BUFFERS]) { glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &gl_max); @@ -1863,18 +2221,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str gl_info->limits.textures = min(MAX_TEXTURES, gl_max); TRACE_(d3d_caps)("Max textures: %d.\n", gl_info->limits.textures); - if (gl_info->supported[NV_REGISTER_COMBINERS]) - { - GLint tmp; - glGetIntegerv(GL_MAX_GENERAL_COMBINERS_NV, &tmp); - gl_info->limits.texture_stages = min(MAX_TEXTURES, tmp); - } - else - { - gl_info->limits.texture_stages = min(MAX_TEXTURES, gl_max); - } - TRACE_(d3d_caps)("Max texture stages: %d.\n", gl_info->limits.texture_stages); - if (gl_info->supported[ARB_FRAGMENT_PROGRAM]) { GLint tmp; @@ -1998,6 +2344,11 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str gl_info->limits.glsl_varyings = gl_max; TRACE_(d3d_caps)("Max GLSL varyings: %u (%u 4 component varyings).\n", gl_max, gl_max / 4); } + if (gl_info->supported[ARB_SHADING_LANGUAGE_100]) + { + const char *str = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION_ARB); + TRACE_(d3d_caps)("GLSL version string: %s.\n", debugstr_a(str)); + } if (gl_info->supported[NV_LIGHT_MAX_EXPONENT]) { glGetFloatv(GL_MAX_SHININESS_NV, &gl_info->limits.shininess); @@ -2024,7 +2375,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str gl_info->supported[NV_REGISTER_COMBINERS2] = FALSE; gl_info->supported[NV_TEXTURE_SHADER] = FALSE; gl_info->supported[NV_TEXTURE_SHADER2] = FALSE; - gl_info->supported[NV_TEXTURE_SHADER3] = FALSE; } if (gl_info->supported[NV_HALF_FLOAT]) { @@ -2043,6 +2393,14 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str LEAVE_GL(); + adapter->fragment_pipe = select_fragment_implementation(adapter); + adapter->shader_backend = select_shader_backend(adapter); + adapter->blitter = select_blit_implementation(adapter); + + adapter->fragment_pipe->get_caps(gl_info, &fragment_caps); + gl_info->limits.texture_stages = fragment_caps.MaxTextureBlendStages; + TRACE_(d3d_caps)("Max texture stages: %u.\n", gl_info->limits.texture_stages); + /* In some cases the number of texture stages can be larger than the number * of samplers. The GF4 for example can use only 2 samplers (no fragment * shaders), but 8 texture stages (register combiners). */ @@ -2113,8 +2471,12 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str gl_info->limits.buffers = 1; } - device = wined3d_guess_card(gl_info, gl_renderer, &vendor, &vidmem); - TRACE_(d3d_caps)("FOUND (fake) card: 0x%x (vendor id), 0x%x (device id)\n", vendor, device); + gl_vendor = wined3d_guess_gl_vendor(gl_info, gl_vendor_str, gl_renderer_str); + card_vendor = wined3d_guess_card_vendor(gl_vendor_str, gl_renderer_str); + TRACE_(d3d_caps)("found GL_VENDOR (%s)->(0x%04x/0x%04x)\n", debugstr_a(gl_vendor_str), gl_vendor, card_vendor); + + device = wined3d_guess_card(gl_info, gl_renderer_str, &gl_vendor, &card_vendor, &vidmem); + TRACE_(d3d_caps)("FOUND (fake) card: 0x%x (vendor id), 0x%x (device id)\n", card_vendor, device); /* If we have an estimate use it, else default to 64MB; */ if(vidmem) @@ -2176,11 +2538,10 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_driver_info *driver_info, str } } - fixup_extensions(gl_info, gl_renderer, vendor, device); - init_driver_info(driver_info, vendor, device); + fixup_extensions(gl_info, gl_renderer_str, gl_vendor, card_vendor, device); + init_driver_info(driver_info, card_vendor, device); add_gl_compat_wrappers(gl_info); - HeapFree(GetProcessHeap(), 0, gl_renderer); return TRUE; } @@ -2644,7 +3005,10 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, U continue; if(cfgs[i].blueSize != blueSize) continue; - if(cfgs[i].alphaSize != alphaSize) + /* Not all drivers report alpha-less formats since they use 32-bit anyway, so accept alpha even if we didn't ask for it. */ + if(alphaSize && cfgs[i].alphaSize != alphaSize) + continue; + if(cfgs[i].colorSize != (glDesc->byte_count << 3)) continue; TRACE("Found iPixelFormat=%d to support MultiSampleType=%d for format %s\n", cfgs[i].iPixelFormat, MultiSampleType, debug_d3dformat(SurfaceFormat)); @@ -2748,8 +3112,6 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceType(IWineD3D *iface, UINT Adapter static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter, WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc) { - const struct fragment_pipeline *fp; - switch(format_desc->format) { case WINED3DFMT_R8G8_SNORM: @@ -2760,8 +3122,7 @@ static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter, /* Ask the fixed function pipeline implementation if it can deal * with the conversion. If we've got a GL extension giving native * support this will be an identity conversion. */ - fp = select_fragment_implementation(adapter, DeviceType); - if (fp->color_fixup_supported(format_desc->color_fixup)) + if (adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup)) { TRACE_(d3d_caps)("[OK]\n"); return TRUE; @@ -2951,8 +3312,6 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter, WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc) { const struct wined3d_gl_info *gl_info = &adapter->gl_info; - const shader_backend_t *shader_backend; - const struct fragment_pipeline *fp; switch (format_desc->format) { @@ -3030,8 +3389,7 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter, /* Ask the shader backend if it can deal with the conversion. If * we've got a GL extension giving native support this will be an * identity conversion. */ - shader_backend = select_shader_backend(adapter, DeviceType); - if (shader_backend->shader_color_fixup_supported(format_desc->color_fixup)) + if (adapter->shader_backend->shader_color_fixup_supported(format_desc->color_fixup)) { TRACE_(d3d_caps)("[OK]\n"); return TRUE; @@ -3147,10 +3505,8 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter, if (gl_info->supported[ATI_TEXTURE_COMPRESSION_3DC] || gl_info->supported[EXT_TEXTURE_COMPRESSION_RGTC]) { - shader_backend = select_shader_backend(adapter, DeviceType); - fp = select_fragment_implementation(adapter, DeviceType); - if (shader_backend->shader_color_fixup_supported(format_desc->color_fixup) - && fp->color_fixup_supported(format_desc->color_fixup)) + if (adapter->shader_backend->shader_color_fixup_supported(format_desc->color_fixup) + && adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup)) { TRACE_(d3d_caps)("[OK]\n"); return TRUE; @@ -3186,8 +3542,6 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter, static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, const struct GlPixelFormatDesc *adapter_format_desc, WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *check_format_desc, WINED3DSURFTYPE SurfaceType) { - const struct blit_shader *blitter; - if(SurfaceType == SURFACE_GDI) { switch(check_format_desc->format) { @@ -3223,8 +3577,7 @@ static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, const struct if (CheckDepthStencilCapability(adapter, adapter_format_desc, check_format_desc)) return TRUE; /* If opengl can't process the format natively, the blitter may be able to convert it */ - blitter = select_blit_implementation(adapter, DeviceType); - if (blitter->color_fixup_supported(check_format_desc->color_fixup)) + if (adapter->blitter->color_fixup_supported(check_format_desc->color_fixup)) { TRACE_(d3d_caps)("[OK]\n"); return TRUE; @@ -3789,8 +4142,6 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, int ps_selected_mode; struct shader_caps shader_caps; struct fragment_caps fragment_caps; - const shader_backend_t *shader_backend; - const struct fragment_pipeline *frag_pipeline = NULL; DWORD ckey_caps, blit_caps, fx_caps; TRACE_(d3d_caps)("(%p)->(Adptr:%d, DevType: %x, pCaps: %p)\n", This, Adapter, DeviceType, pCaps); @@ -4167,12 +4518,10 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, pCaps->VertexTextureFilterCaps = 0; memset(&shader_caps, 0, sizeof(shader_caps)); - shader_backend = select_shader_backend(adapter, DeviceType); - shader_backend->shader_get_caps(DeviceType, &adapter->gl_info, &shader_caps); + adapter->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps); memset(&fragment_caps, 0, sizeof(fragment_caps)); - frag_pipeline = select_fragment_implementation(adapter, DeviceType); - frag_pipeline->get_caps(DeviceType, &adapter->gl_info, &fragment_caps); + adapter->fragment_pipe->get_caps(&adapter->gl_info, &fragment_caps); /* Add shader misc caps. Only some of them belong to the shader parts of the pipeline */ pCaps->PrimitiveMiscCaps |= fragment_caps.PrimitiveMiscCaps; @@ -4697,7 +5046,7 @@ BOOL InitAdapters(IWineD3DImpl *This) goto nogl_adapter; } - ret = IWineD3DImpl_FillGLCaps(&adapter->driver_info, &adapter->gl_info); + ret = IWineD3DImpl_FillGLCaps(adapter); if(!ret) { ERR("Failed to initialize gl caps for default adapter\n"); WineD3D_ReleaseFakeGLContext(&fake_gl_ctx); @@ -4729,8 +5078,8 @@ BOOL InitAdapters(IWineD3DImpl *This) if (gl_info->supported[WGL_ARB_PIXEL_FORMAT]) { int attribute; - int attribs[10]; - int values[10]; + int attribs[11]; + int values[11]; int nAttribs = 0; attribute = WGL_NUMBER_PIXEL_FORMATS_ARB; @@ -4742,6 +5091,7 @@ BOOL InitAdapters(IWineD3DImpl *This) attribs[nAttribs++] = WGL_GREEN_BITS_ARB; attribs[nAttribs++] = WGL_BLUE_BITS_ARB; attribs[nAttribs++] = WGL_ALPHA_BITS_ARB; + attribs[nAttribs++] = WGL_COLOR_BITS_ARB; attribs[nAttribs++] = WGL_DEPTH_BITS_ARB; attribs[nAttribs++] = WGL_STENCIL_BITS_ARB; attribs[nAttribs++] = WGL_DRAW_TO_WINDOW_ARB; @@ -4762,12 +5112,13 @@ BOOL InitAdapters(IWineD3DImpl *This) cfgs->greenSize = values[1]; cfgs->blueSize = values[2]; cfgs->alphaSize = values[3]; - cfgs->depthSize = values[4]; - cfgs->stencilSize = values[5]; - cfgs->windowDrawable = values[6]; - cfgs->iPixelType = values[7]; - cfgs->doubleBuffer = values[8]; - cfgs->auxBuffers = values[9]; + cfgs->colorSize = values[4]; + cfgs->depthSize = values[5]; + cfgs->stencilSize = values[6]; + cfgs->windowDrawable = values[7]; + cfgs->iPixelType = values[8]; + cfgs->doubleBuffer = values[9]; + cfgs->auxBuffers = values[10]; cfgs->pbufferDrawable = FALSE; /* Check for pbuffer support when it is around as @@ -4794,7 +5145,7 @@ BOOL InitAdapters(IWineD3DImpl *This) } } - TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, depth=%d, stencil=%d, windowDrawable=%d, pbufferDrawable=%d\n", cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer, cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize, cfgs->depthSize, cfgs->stencilSize, cfgs->windowDrawable, cfgs->pbufferDrawable); + TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, depth=%d, stencil=%d, samples=%d, windowDrawable=%d, pbufferDrawable=%d\n", cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer, cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize, cfgs->depthSize, cfgs->stencilSize, cfgs->numSamples, cfgs->windowDrawable, cfgs->pbufferDrawable); cfgs++; } } @@ -4828,6 +5179,7 @@ BOOL InitAdapters(IWineD3DImpl *This) cfgs->greenSize = ppfd.cGreenBits; cfgs->blueSize = ppfd.cBlueBits; cfgs->alphaSize = ppfd.cAlphaBits; + cfgs->colorSize = ppfd.cColorBits; cfgs->depthSize = ppfd.cDepthBits; cfgs->stencilSize = ppfd.cStencilBits; cfgs->pbufferDrawable = 0; diff --git a/reactos/dll/directx/wine/wined3d/drawprim.c b/reactos/dll/directx/wine/wined3d/drawprim.c index dbeb7993f9f..b29d012b9d1 100644 --- a/reactos/dll/directx/wine/wined3d/drawprim.c +++ b/reactos/dll/directx/wine/wined3d/drawprim.c @@ -334,7 +334,7 @@ static inline void send_attribute(IWineD3DDeviceImpl *This, WINED3DFORMAT format GL_EXTCALL(glVertexAttrib4ubvARB(index, ptr)); break; case WINED3DFMT_B8G8R8A8_UNORM: - if (gl_info->supported[EXT_VERTEX_ARRAY_BGRA]) + if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA]) { const DWORD *src = ptr; DWORD c = *src & 0xff00ff00; @@ -690,6 +690,9 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT /* Finished updating the screen, restore lock */ LEAVE_GL(); + + wglFlush(); /* Flush to ensure ordering across contexts. */ + context_release(context); TRACE("Done all gl drawing\n"); @@ -1100,7 +1103,7 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This, if(patch->has_texcoords) { vtxStride += 4 * sizeof(float); } - memset(&patch->strided, 0, sizeof(&patch->strided)); + memset(&patch->strided, 0, sizeof(patch->strided)); patch->strided.position.format = WINED3DFMT_R32G32B32_FLOAT; patch->strided.position.lpData = (BYTE *) patch->mem; patch->strided.position.dwStride = vtxStride; diff --git a/reactos/dll/directx/wine/wined3d/glsl_shader.c b/reactos/dll/directx/wine/wined3d/glsl_shader.c index 90b5092d38f..cb23ee6aa0e 100644 --- a/reactos/dll/directx/wine/wined3d/glsl_shader.c +++ b/reactos/dll/directx/wine/wined3d/glsl_shader.c @@ -156,6 +156,20 @@ struct glsl_vshader_private UINT num_gl_shaders, shader_array_size; }; +static const char *debug_gl_shader_type(GLenum type) +{ + switch (type) + { +#define WINED3D_TO_STR(u) case u: return #u + WINED3D_TO_STR(GL_VERTEX_SHADER_ARB); + WINED3D_TO_STR(GL_GEOMETRY_SHADER_ARB); + WINED3D_TO_STR(GL_FRAGMENT_SHADER_ARB); +#undef WINED3D_TO_STR + default: + return wine_dbg_sprintf("UNKNOWN(%#x)", type); + } +} + /* Extract a line from the info log. * Note that this modifies the source string. */ static char *get_info_log_line(char **ptr) @@ -238,6 +252,81 @@ static void print_glsl_info_log(const struct wined3d_gl_info *gl_info, GLhandleA } } +/* GL locking is done by the caller. */ +static void shader_glsl_dump_program_source(const struct wined3d_gl_info *gl_info, GLhandleARB program) +{ + GLint i, object_count, source_size; + GLhandleARB *objects; + char *source = NULL; + + GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_ATTACHED_OBJECTS_ARB, &object_count)); + objects = HeapAlloc(GetProcessHeap(), 0, object_count * sizeof(*objects)); + if (!objects) + { + ERR("Failed to allocate object array memory.\n"); + return; + } + + GL_EXTCALL(glGetAttachedObjectsARB(program, object_count, NULL, objects)); + for (i = 0; i < object_count; ++i) + { + char *ptr, *line; + GLint tmp; + + GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_SHADER_SOURCE_LENGTH_ARB, &tmp)); + + if (!source || source_size < tmp) + { + HeapFree(GetProcessHeap(), 0, source); + + source = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, tmp); + if (!source) + { + ERR("Failed to allocate %d bytes for shader source.\n", tmp); + HeapFree(GetProcessHeap(), 0, objects); + return; + } + source_size = tmp; + } + + FIXME("Object %u:\n", objects[i]); + GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_SUBTYPE_ARB, &tmp)); + FIXME(" GL_OBJECT_SUBTYPE_ARB: %s.\n", debug_gl_shader_type(tmp)); + GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_COMPILE_STATUS_ARB, &tmp)); + FIXME(" GL_OBJECT_COMPILE_STATUS_ARB: %d.\n", tmp); + FIXME("\n"); + + ptr = source; + GL_EXTCALL(glGetShaderSourceARB(objects[i], source_size, NULL, source)); + while ((line = get_info_log_line(&ptr))) FIXME(" %s\n", line); + FIXME("\n"); + } + + HeapFree(GetProcessHeap(), 0, source); + HeapFree(GetProcessHeap(), 0, objects); +} + +/* GL locking is done by the caller. */ +static void shader_glsl_validate_link(const struct wined3d_gl_info *gl_info, GLhandleARB program) +{ + GLint tmp; + + if (!TRACE_ON(d3d_shader) && !FIXME_ON(d3d_shader)) return; + + GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_TYPE_ARB, &tmp)); + if (tmp == GL_PROGRAM_OBJECT_ARB) + { + GL_EXTCALL(glGetObjectParameterivARB(program, GL_OBJECT_LINK_STATUS_ARB, &tmp)); + if (!tmp) + { + FIXME("Program %u link status invalid.\n", program); + shader_glsl_dump_program_source(gl_info, program); + } + } + + print_glsl_info_log(gl_info, program); +} + /** * Loads (pixel shader) samplers */ @@ -1083,6 +1172,8 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont } } + shader_addline(buffer, "const float FLT_MAX = 1e38;\n"); + /* Start the main program */ shader_addline(buffer, "void main() {\n"); if(pshader && reg_maps->vpos) { @@ -1194,8 +1285,7 @@ static void shader_glsl_get_register_name(const struct wined3d_shader_register * static const char * const hwrastout_reg_names[] = { "gl_Position", "gl_FogFragCoord", "gl_PointSize" }; IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader; - IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device; - const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info; + const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; char pshader = shader_is_pshader_version(This->baseShader.reg_maps.shader_version.type); *is_color = FALSE; @@ -1552,7 +1642,8 @@ static inline const char *shader_get_comp_op(DWORD op) } } -static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, glsl_sample_function_t *sample_function) +static void shader_glsl_get_sample_function(const struct wined3d_gl_info *gl_info, + DWORD sampler_type, DWORD flags, glsl_sample_function_t *sample_function) { BOOL projected = flags & WINED3D_GLSL_SAMPLE_PROJECTED; BOOL texrect = flags & WINED3D_GLSL_SAMPLE_RECT; @@ -1564,9 +1655,21 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls case WINED3DSTT_1D: if(lod) { sample_function->name = projected ? "texture1DProjLod" : "texture1DLod"; - } else if(grad) { - sample_function->name = projected ? "texture1DProjGradARB" : "texture1DGradARB"; - } else { + } + else if (grad) + { + if (gl_info->supported[EXT_GPU_SHADER4]) + sample_function->name = projected ? "texture1DProjGrad" : "texture1DGrad"; + else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD]) + sample_function->name = projected ? "texture1DProjGradARB" : "texture1DGradARB"; + else + { + FIXME("Unsupported 1D grad function.\n"); + sample_function->name = "unsupported1DGrad"; + } + } + else + { sample_function->name = projected ? "texture1DProj" : "texture1D"; } sample_function->coord_mask = WINED3DSP_WRITEMASK_0; @@ -1575,20 +1678,41 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls if(texrect) { if(lod) { sample_function->name = projected ? "texture2DRectProjLod" : "texture2DRectLod"; - } else if(grad) { - /* What good are texrect grad functions? I don't know, but GL_EXT_gpu_shader4 defines them. - * There is no GL_ARB_shader_texture_lod spec yet, so I don't know if they're defined there - */ - sample_function->name = projected ? "shadow2DRectProjGradARB" : "shadow2DRectGradARB"; - } else { + } + else if (grad) + { + if (gl_info->supported[EXT_GPU_SHADER4]) + sample_function->name = projected ? "texture2DRectProjGrad" : "texture2DRectGrad"; + else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD]) + sample_function->name = projected ? "texture2DRectProjGradARB" : "texture2DRectGradARB"; + else + { + FIXME("Unsupported RECT grad function.\n"); + sample_function->name = "unsupported2DRectGrad"; + } + } + else + { sample_function->name = projected ? "texture2DRectProj" : "texture2DRect"; } } else { if(lod) { sample_function->name = projected ? "texture2DProjLod" : "texture2DLod"; - } else if(grad) { - sample_function->name = projected ? "texture2DProjGradARB" : "texture2DGradARB"; - } else { + } + else if (grad) + { + if (gl_info->supported[EXT_GPU_SHADER4]) + sample_function->name = projected ? "texture2DProjGrad" : "texture2DGrad"; + else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD]) + sample_function->name = projected ? "texture2DProjGradARB" : "texture2DGradARB"; + else + { + FIXME("Unsupported 2D grad function.\n"); + sample_function->name = "unsupported2DGrad"; + } + } + else + { sample_function->name = projected ? "texture2DProj" : "texture2D"; } } @@ -1597,9 +1721,21 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls case WINED3DSTT_CUBE: if(lod) { sample_function->name = "textureCubeLod"; - } else if(grad) { - sample_function->name = "textureCubeGradARB"; - } else { + } + else if (grad) + { + if (gl_info->supported[EXT_GPU_SHADER4]) + sample_function->name = "textureCubeGrad"; + else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD]) + sample_function->name = "textureCubeGradARB"; + else + { + FIXME("Unsupported Cube grad function.\n"); + sample_function->name = "unsupportedCubeGrad"; + } + } + else + { sample_function->name = "textureCube"; } sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2; @@ -1607,9 +1743,21 @@ static void shader_glsl_get_sample_function(DWORD sampler_type, DWORD flags, gls case WINED3DSTT_VOLUME: if(lod) { sample_function->name = projected ? "texture3DProjLod" : "texture3DLod"; - } else if(grad) { - sample_function->name = projected ? "texture3DProjGradARB" : "texture3DGradARB"; - } else { + } + else if (grad) + { + if (gl_info->supported[EXT_GPU_SHADER4]) + sample_function->name = projected ? "texture3DProjGrad" : "texture3DGrad"; + else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD]) + sample_function->name = projected ? "texture3DProjGradARB" : "texture3DGradARB"; + else + { + FIXME("Unsupported 3D grad function.\n"); + sample_function->name = "unsupported3DGrad"; + } + } + else + { sample_function->name = projected ? "texture3DProj" : "texture3D"; } sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2; @@ -1681,10 +1829,10 @@ static void shader_glsl_color_correction(const struct wined3d_shader_instruction if (!mask) return; /* Nothing to do */ - if (is_yuv_fixup(fixup)) + if (is_complex_fixup(fixup)) { - enum yuv_fixup yuv_fixup = get_yuv_fixup(fixup); - FIXME("YUV fixup (%#x) not supported\n", yuv_fixup); + enum complex_fixup complex_fixup = get_complex_fixup(fixup); + FIXME("Complex fixup (%#x) not supported\n",complex_fixup); return; } @@ -1822,6 +1970,7 @@ static void shader_glsl_arith(const struct wined3d_shader_instruction *ins) /* Process the WINED3DSIO_MOV opcode using GLSL (dst = src) */ static void shader_glsl_mov(const struct wined3d_shader_instruction *ins) { + const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; struct wined3d_shader_buffer *buffer = ins->ctx->buffer; glsl_src_param_t src0_param; DWORD write_mask; @@ -1847,12 +1996,26 @@ static void shader_glsl_mov(const struct wined3d_shader_instruction *ins) { /* We need to *round* to the nearest int here. */ unsigned int mask_size = shader_glsl_get_write_mask_size(write_mask); - if (mask_size > 1) { - shader_addline(buffer, "ivec%d(floor(abs(%s) + vec%d(0.5)) * sign(%s)));\n", mask_size, src0_param.param_str, mask_size, src0_param.param_str); - } else { - shader_addline(buffer, "int(floor(abs(%s) + 0.5) * sign(%s)));\n", src0_param.param_str, src0_param.param_str); + + if (gl_info->supported[EXT_GPU_SHADER4]) + { + if (mask_size > 1) + shader_addline(buffer, "ivec%d(round(%s)));\n", mask_size, src0_param.param_str); + else + shader_addline(buffer, "int(round(%s)));\n", src0_param.param_str); } - } else { + else + { + if (mask_size > 1) + shader_addline(buffer, "ivec%d(floor(abs(%s) + vec%d(0.5)) * sign(%s)));\n", + mask_size, src0_param.param_str, mask_size, src0_param.param_str); + else + shader_addline(buffer, "int(floor(abs(%s) + 0.5) * sign(%s)));\n", + src0_param.param_str, src0_param.param_str); + } + } + else + { shader_addline(buffer, "%s);\n", src0_param.param_str); } } @@ -1942,10 +2105,15 @@ static void shader_glsl_log(const struct wined3d_shader_instruction *ins) shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_0, &src0_param); - if (dst_size > 1) { - shader_addline(buffer, "vec%d(log2(abs(%s))));\n", dst_size, src0_param.param_str); - } else { - shader_addline(buffer, "log2(abs(%s)));\n", src0_param.param_str); + if (dst_size > 1) + { + shader_addline(buffer, "vec%d(%s == 0.0 ? -FLT_MAX : log2(abs(%s))));\n", + dst_size, src0_param.param_str, src0_param.param_str); + } + else + { + shader_addline(buffer, "%s == 0.0 ? -FLT_MAX : log2(abs(%s)));\n", + src0_param.param_str, src0_param.param_str); } } @@ -1966,7 +2134,6 @@ static void shader_glsl_map2gl(const struct wined3d_shader_instruction *ins) case WINED3DSIH_MAX: instruction = "max"; break; case WINED3DSIH_ABS: instruction = "abs"; break; case WINED3DSIH_FRC: instruction = "fract"; break; - case WINED3DSIH_NRM: instruction = "normalize"; break; case WINED3DSIH_EXP: instruction = "exp2"; break; case WINED3DSIH_DSX: instruction = "dFdx"; break; case WINED3DSIH_DSY: instruction = "ycorrection.y * dFdy"; break; @@ -1993,6 +2160,22 @@ static void shader_glsl_map2gl(const struct wined3d_shader_instruction *ins) shader_addline(buffer, "));\n"); } +static void shader_glsl_nrm(const struct wined3d_shader_instruction *ins) +{ + struct wined3d_shader_buffer *buffer = ins->ctx->buffer; + glsl_src_param_t src_param; + DWORD write_mask; + char dst_mask[6]; + + write_mask = shader_glsl_get_write_mask(ins->dst, dst_mask); + shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src_param); + + shader_addline(buffer, "tmp0.x = length(%s);\n", src_param.param_str); + shader_glsl_append_dst(buffer, ins); + shader_addline(buffer, "tmp0.x == 0.0 ? (%s * FLT_MAX) : (%s / tmp0.x));", + src_param.param_str, src_param.param_str); +} + /** Process the WINED3DSIO_EXPP instruction in GLSL: * For shader model 1.x, do the following (and honor the writemask, so use a temporary variable): * dst.x = 2^(floor(src)) @@ -2046,10 +2229,15 @@ static void shader_glsl_rcp(const struct wined3d_shader_instruction *ins) mask_size = shader_glsl_get_write_mask_size(write_mask); shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &src_param); - if (mask_size > 1) { - shader_addline(ins->ctx->buffer, "vec%d(1.0 / %s));\n", mask_size, src_param.param_str); - } else { - shader_addline(ins->ctx->buffer, "1.0 / %s);\n", src_param.param_str); + if (mask_size > 1) + { + shader_addline(ins->ctx->buffer, "vec%d(%s == 0.0 ? FLT_MAX : 1.0 / %s));\n", + mask_size, src_param.param_str, src_param.param_str); + } + else + { + shader_addline(ins->ctx->buffer, "%s == 0.0 ? FLT_MAX : 1.0 / %s);\n", + src_param.param_str, src_param.param_str); } } @@ -2065,10 +2253,15 @@ static void shader_glsl_rsq(const struct wined3d_shader_instruction *ins) shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &src_param); - if (mask_size > 1) { - shader_addline(buffer, "vec%d(inversesqrt(%s)));\n", mask_size, src_param.param_str); - } else { - shader_addline(buffer, "inversesqrt(%s));\n", src_param.param_str); + if (mask_size > 1) + { + shader_addline(buffer, "vec%d(%s == 0.0 ? FLT_MAX : inversesqrt(abs(%s))));\n", + mask_size, src_param.param_str, src_param.param_str); + } + else + { + shader_addline(buffer, "%s == 0.0 ? FLT_MAX : inversesqrt(abs(%s)));\n", + src_param.param_str, src_param.param_str); } } @@ -2671,10 +2864,11 @@ static void shader_glsl_ret(const struct wined3d_shader_instruction *ins) ********************************************/ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins) { - IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader; - IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; + IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device; DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major, ins->ctx->reg_maps->shader_version.minor); + const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; glsl_sample_function_t sample_function; DWORD sample_flags = 0; WINED3DSAMPLER_TEXTURE_TYPE sampler_type; @@ -2728,7 +2922,7 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins) sample_flags |= WINED3D_GLSL_SAMPLE_RECT; } - shader_glsl_get_sample_function(sampler_type, sample_flags, &sample_function); + shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function); mask |= sample_function.coord_mask; if (shader_version < WINED3D_SHADER_VERSION(2,0)) swizzle = WINED3DSP_NOSWIZZLE; @@ -2762,7 +2956,7 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins) { IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader; IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device; - const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info; + const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; glsl_sample_function_t sample_function; glsl_src_param_t coord_param, dx_param, dy_param; DWORD sample_flags = WINED3D_GLSL_SAMPLE_GRAD; @@ -2770,7 +2964,7 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins) DWORD sampler_idx; DWORD swizzle = ins->src[1].swizzle; - if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD]) + if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD] && !gl_info->supported[EXT_GPU_SHADER4]) { FIXME("texldd used, but not supported by hardware. Falling back to regular tex\n"); return shader_glsl_tex(ins); @@ -2783,7 +2977,7 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins) sample_flags |= WINED3D_GLSL_SAMPLE_RECT; } - shader_glsl_get_sample_function(sampler_type, sample_flags, &sample_function); + shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function); shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &coord_param); shader_glsl_add_src_param(ins, &ins->src[2], sample_function.coord_mask, &dx_param); shader_glsl_add_src_param(ins, &ins->src[3], sample_function.coord_mask, &dy_param); @@ -2796,7 +2990,7 @@ static void shader_glsl_texldl(const struct wined3d_shader_instruction *ins) { IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader; IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device; - const struct wined3d_gl_info *gl_info = &deviceImpl->adapter->gl_info; + const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; glsl_sample_function_t sample_function; glsl_src_param_t coord_param, lod_param; DWORD sample_flags = WINED3D_GLSL_SAMPLE_LOD; @@ -2810,12 +3004,12 @@ static void shader_glsl_texldl(const struct wined3d_shader_instruction *ins) IWineD3DBaseTexture_GetTextureDimensions(deviceImpl->stateBlock->textures[sampler_idx]) == GL_TEXTURE_RECTANGLE_ARB) { sample_flags |= WINED3D_GLSL_SAMPLE_RECT; } - shader_glsl_get_sample_function(sampler_type, sample_flags, &sample_function); + shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function); shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &coord_param); shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &lod_param); - if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD] + if (!gl_info->supported[ARB_SHADER_TEXTURE_LOD] && !gl_info->supported[EXT_GPU_SHADER4] && shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type)) { /* The GLSL spec claims the Lod sampling functions are only supported in vertex shaders. @@ -2877,6 +3071,7 @@ static void shader_glsl_texcoord(const struct wined3d_shader_instruction *ins) * then perform a 1D texture lookup from stage dstregnum, place into dst. */ static void shader_glsl_texdp3tex(const struct wined3d_shader_instruction *ins) { + const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; glsl_src_param_t src0_param; glsl_sample_function_t sample_function; DWORD sampler_idx = ins->dst[0].reg.idx; @@ -2891,7 +3086,7 @@ static void shader_glsl_texdp3tex(const struct wined3d_shader_instruction *ins) * * It is a dependent read - not valid with conditional NP2 textures */ - shader_glsl_get_sample_function(sampler_type, 0, &sample_function); + shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function); mask_size = shader_glsl_get_write_mask_size(sample_function.coord_mask); switch(mask_size) @@ -2990,7 +3185,7 @@ static void shader_glsl_texm3x2pad(const struct wined3d_shader_instruction *ins) * Calculate the 1st or 2nd row of a 3-row matrix multiplication. */ static void shader_glsl_texm3x3pad(const struct wined3d_shader_instruction *ins) { - IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)ins->ctx->shader; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2; DWORD reg = ins->dst[0].reg.idx; struct wined3d_shader_buffer *buffer = ins->ctx->buffer; @@ -3004,6 +3199,7 @@ static void shader_glsl_texm3x3pad(const struct wined3d_shader_instruction *ins) static void shader_glsl_texm3x2tex(const struct wined3d_shader_instruction *ins) { + const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2; DWORD reg = ins->dst[0].reg.idx; struct wined3d_shader_buffer *buffer = ins->ctx->buffer; @@ -3014,7 +3210,7 @@ static void shader_glsl_texm3x2tex(const struct wined3d_shader_instruction *ins) shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param); shader_addline(buffer, "tmp0.y = dot(T%u.xyz, %s);\n", reg, src0_param.param_str); - shader_glsl_get_sample_function(sampler_type, 0, &sample_function); + shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function); /* Sample the texture using the calculated coordinates */ shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xy"); @@ -3025,10 +3221,11 @@ static void shader_glsl_texm3x2tex(const struct wined3d_shader_instruction *ins) static void shader_glsl_texm3x3tex(const struct wined3d_shader_instruction *ins) { DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; + SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state; + const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; glsl_src_param_t src0_param; DWORD reg = ins->dst[0].reg.idx; - IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader; - SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state; WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[reg]; glsl_sample_function_t sample_function; @@ -3036,7 +3233,7 @@ static void shader_glsl_texm3x3tex(const struct wined3d_shader_instruction *ins) shader_addline(ins->ctx->buffer, "tmp0.z = dot(T%u.xyz, %s);\n", reg, src0_param.param_str); /* Dependent read, not valid with conditional NP2 */ - shader_glsl_get_sample_function(sampler_type, 0, &sample_function); + shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function); /* Sample the texture using the calculated coordinates */ shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz"); @@ -3049,11 +3246,11 @@ static void shader_glsl_texm3x3tex(const struct wined3d_shader_instruction *ins) static void shader_glsl_texm3x3(const struct wined3d_shader_instruction *ins) { DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; + SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state; glsl_src_param_t src0_param; char dst_mask[6]; DWORD reg = ins->dst[0].reg.idx; - IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader; - SHADER_PARSE_STATE* current_state = &This->baseShader.parse_state; shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param); @@ -3068,7 +3265,8 @@ static void shader_glsl_texm3x3(const struct wined3d_shader_instruction *ins) * Perform the final texture lookup based on the previous 2 3x3 matrix multiplies */ static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins) { - IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)ins->ctx->shader; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; + const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; DWORD reg = ins->dst[0].reg.idx; glsl_src_param_t src0_param; glsl_src_param_t src1_param; @@ -3087,7 +3285,7 @@ static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins shader_addline(buffer, "tmp0.xyz = -reflect((%s), normalize(tmp0.xyz));\n", src1_param.param_str); /* Dependent read, not valid with conditional NP2 */ - shader_glsl_get_sample_function(stype, 0, &sample_function); + shader_glsl_get_sample_function(gl_info, stype, 0, &sample_function); /* Sample the texture */ shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz"); @@ -3099,7 +3297,8 @@ static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins * Perform the final texture lookup based on the previous 2 3x3 matrix multiplies */ static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *ins) { - IWineD3DPixelShaderImpl *shader = (IWineD3DPixelShaderImpl *)ins->ctx->shader; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; + const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; DWORD reg = ins->dst[0].reg.idx; struct wined3d_shader_buffer *buffer = ins->ctx->buffer; SHADER_PARSE_STATE* current_state = &shader->baseShader.parse_state; @@ -3119,7 +3318,7 @@ static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *in shader_addline(buffer, "tmp0.xyz = -reflect(tmp1.xyz, normalize(tmp0.xyz));\n"); /* Dependent read, not valid with conditional NP2 */ - shader_glsl_get_sample_function(sampler_type, 0, &sample_function); + shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function); /* Sample the texture using the calculated coordinates */ shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz"); @@ -3133,8 +3332,9 @@ static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *in */ static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins) { - IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)ins->ctx->shader; - IWineD3DDeviceImpl* deviceImpl = (IWineD3DDeviceImpl*) This->baseShader.device; + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader; + IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device; + const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; glsl_sample_function_t sample_function; glsl_src_param_t coord_param; WINED3DSAMPLER_TEXTURE_TYPE sampler_type; @@ -3148,7 +3348,7 @@ static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins) sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx]; /* Dependent read, not valid with conditional NP2 */ - shader_glsl_get_sample_function(sampler_type, 0, &sample_function); + shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function); mask = sample_function.coord_mask; shader_glsl_write_mask_to_str(mask, coord_mask); @@ -3207,6 +3407,7 @@ static void shader_glsl_bem(const struct wined3d_shader_instruction *ins) * Sample 2D texture at dst using the alpha & red (wx) components of src as texture coordinates */ static void shader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins) { + const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; glsl_src_param_t src0_param; DWORD sampler_idx = ins->dst[0].reg.idx; WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx]; @@ -3214,7 +3415,7 @@ static void shader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins) shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_ALL, &src0_param); - shader_glsl_get_sample_function(sampler_type, 0, &sample_function); + shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function); shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "%s.wx", src0_param.reg_name); } @@ -3223,6 +3424,7 @@ static void shader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins) * Sample 2D texture at dst using the green & blue (yz) components of src as texture coordinates */ static void shader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins) { + const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; glsl_src_param_t src0_param; DWORD sampler_idx = ins->dst[0].reg.idx; WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx]; @@ -3230,7 +3432,7 @@ static void shader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins) shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_ALL, &src0_param); - shader_glsl_get_sample_function(sampler_type, 0, &sample_function); + shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function); shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "%s.yz", src0_param.reg_name); } @@ -3239,13 +3441,14 @@ static void shader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins) * Sample texture at dst using the rgb (xyz) components of src as texture coordinates */ static void shader_glsl_texreg2rgb(const struct wined3d_shader_instruction *ins) { + const struct wined3d_gl_info *gl_info = ins->ctx->gl_info; glsl_src_param_t src0_param; DWORD sampler_idx = ins->dst[0].reg.idx; WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx]; glsl_sample_function_t sample_function; /* Dependent read, not valid with conditional NP2 */ - shader_glsl_get_sample_function(sampler_type, 0, &sample_function); + shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function); shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &src0_param); shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, @@ -3759,6 +3962,10 @@ static GLuint shader_glsl_generate_pshader(const struct wined3d_context *context */ shader_addline(buffer, "#extension GL_ARB_texture_rectangle : enable\n"); } + if (gl_info->supported[EXT_GPU_SHADER4]) + { + shader_addline(buffer, "#extension GL_EXT_gpu_shader4 : enable\n"); + } /* Base Declarations */ shader_generate_glsl_declarations(context, buffer, (IWineD3DBaseShader *)This, reg_maps, &priv_ctx); @@ -3846,6 +4053,11 @@ static GLuint shader_glsl_generate_vshader(const struct wined3d_context *context shader_addline(buffer, "#version 120\n"); + if (gl_info->supported[EXT_GPU_SHADER4]) + { + shader_addline(buffer, "#extension GL_EXT_gpu_shader4 : enable\n"); + } + memset(&priv_ctx, 0, sizeof(priv_ctx)); priv_ctx.cur_vs_args = args; @@ -4149,7 +4361,7 @@ static void set_glsl_shader_program(const struct wined3d_context *context, /* Link the program */ TRACE("Linking GLSL shader program %u\n", programId); GL_EXTCALL(glLinkProgramARB(programId)); - print_glsl_info_log(gl_info, programId); + shader_glsl_validate_link(gl_info, programId); entry->vuniformF_locations = HeapAlloc(GetProcessHeap(), 0, sizeof(GLhandleARB) * gl_info->limits.glsl_vs_float_constants); @@ -4230,10 +4442,12 @@ static void set_glsl_shader_program(const struct wined3d_context *context, * load them now to have them hardcoded in the GLSL program. This saves some CPU cycles * later */ - if(pshader && !((IWineD3DPixelShaderImpl*)pshader)->baseShader.load_local_constsF) { + if (pshader && !((IWineD3DBaseShaderImpl *)pshader)->baseShader.load_local_constsF) + { hardcode_local_constants((IWineD3DBaseShaderImpl *) pshader, gl_info, programId, 'P'); } - if(vshader && !((IWineD3DVertexShaderImpl*)vshader)->baseShader.load_local_constsF) { + if (vshader && !((IWineD3DBaseShaderImpl *)vshader)->baseShader.load_local_constsF) + { hardcode_local_constants((IWineD3DBaseShaderImpl *) vshader, gl_info, programId, 'V'); } } @@ -4303,7 +4517,7 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info, GL_EXTCALL(glAttachObjectARB(program_id, pshader_id)); GL_EXTCALL(glLinkProgramARB(program_id)); - print_glsl_info_log(gl_info, program_id); + shader_glsl_validate_link(gl_info, program_id); /* Once linked we can mark the shaders for deletion. They will be deleted once the program * is destroyed @@ -4394,8 +4608,6 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)This->baseShader.device; struct shader_glsl_priv *priv = device->shader_priv; const struct wined3d_gl_info *gl_info; - IWineD3DPixelShaderImpl *ps = NULL; - IWineD3DVertexShaderImpl *vs = NULL; struct wined3d_context *context; /* Note: Do not use QueryInterface here to find out which shader type this is because this code @@ -4405,12 +4617,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { if(pshader) { struct glsl_pshader_private *shader_data; - ps = (IWineD3DPixelShaderImpl *) This; - shader_data = ps->baseShader.backend_data; + shader_data = This->baseShader.backend_data; if(!shader_data || shader_data->num_gl_shaders == 0) { HeapFree(GetProcessHeap(), 0, shader_data); - ps->baseShader.backend_data = NULL; + This->baseShader.backend_data = NULL; return; } @@ -4425,12 +4636,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { } } else { struct glsl_vshader_private *shader_data; - vs = (IWineD3DVertexShaderImpl *) This; - shader_data = vs->baseShader.backend_data; + shader_data = This->baseShader.backend_data; if(!shader_data || shader_data->num_gl_shaders == 0) { HeapFree(GetProcessHeap(), 0, shader_data); - vs->baseShader.backend_data = NULL; + This->baseShader.backend_data = NULL; return; } @@ -4466,7 +4676,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { if(pshader) { UINT i; - struct glsl_pshader_private *shader_data = ps->baseShader.backend_data; + struct glsl_pshader_private *shader_data = This->baseShader.backend_data; ENTER_GL(); for(i = 0; i < shader_data->num_gl_shaders; i++) { @@ -4476,11 +4686,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { } LEAVE_GL(); HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders); - HeapFree(GetProcessHeap(), 0, shader_data); - ps->baseShader.backend_data = NULL; - } else { + } + else + { UINT i; - struct glsl_vshader_private *shader_data = vs->baseShader.backend_data; + struct glsl_vshader_private *shader_data = This->baseShader.backend_data; ENTER_GL(); for(i = 0; i < shader_data->num_gl_shaders; i++) { @@ -4490,10 +4700,11 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { } LEAVE_GL(); HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders); - HeapFree(GetProcessHeap(), 0, shader_data); - vs->baseShader.backend_data = NULL; } + HeapFree(GetProcessHeap(), 0, This->baseShader.backend_data); + This->baseShader.backend_data = NULL; + context_release(context); } @@ -4632,8 +4843,7 @@ static BOOL shader_glsl_dirty_const(IWineD3DDevice *iface) { return FALSE; } -static void shader_glsl_get_caps(WINED3DDEVTYPE devtype, - const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps) +static void shader_glsl_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps) { /* Nvidia Geforce6/7 or Ati R4xx/R5xx cards with GLSL support, support VS 3.0 but older Nvidia/Ati * models with GLSL support only support 2.0. In case of nvidia we can detect VS 2.0 support based @@ -4697,7 +4907,7 @@ static BOOL shader_glsl_color_fixup_supported(struct color_fixup_desc fixup) } /* We support everything except YUV conversions. */ - if (!is_yuv_fixup(fixup)) + if (!is_complex_fixup(fixup)) { TRACE("[OK]\n"); return TRUE; @@ -4720,6 +4930,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB /* WINED3DSIH_CMP */ shader_glsl_cmp, /* WINED3DSIH_CND */ shader_glsl_cnd, /* WINED3DSIH_CRS */ shader_glsl_cross, + /* WINED3DSIH_CUT */ NULL, /* WINED3DSIH_DCL */ NULL, /* WINED3DSIH_DEF */ NULL, /* WINED3DSIH_DEFB */ NULL, @@ -4731,20 +4942,24 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB /* WINED3DSIH_DSX */ shader_glsl_map2gl, /* WINED3DSIH_DSY */ shader_glsl_map2gl, /* WINED3DSIH_ELSE */ shader_glsl_else, + /* WINED3DSIH_EMIT */ NULL, /* WINED3DSIH_ENDIF */ shader_glsl_end, /* WINED3DSIH_ENDLOOP */ shader_glsl_end, /* WINED3DSIH_ENDREP */ shader_glsl_end, /* WINED3DSIH_EXP */ shader_glsl_map2gl, /* WINED3DSIH_EXPP */ shader_glsl_expp, /* WINED3DSIH_FRC */ shader_glsl_map2gl, + /* WINED3DSIH_IADD */ NULL, /* WINED3DSIH_IF */ shader_glsl_if, /* WINED3DSIH_IFC */ shader_glsl_ifc, + /* WINED3DSIH_IGE */ NULL, /* WINED3DSIH_LABEL */ shader_glsl_label, /* WINED3DSIH_LIT */ shader_glsl_lit, /* WINED3DSIH_LOG */ shader_glsl_log, /* WINED3DSIH_LOGP */ shader_glsl_log, /* WINED3DSIH_LOOP */ shader_glsl_loop, /* WINED3DSIH_LRP */ shader_glsl_lrp, + /* WINED3DSIH_LT */ NULL, /* WINED3DSIH_M3x2 */ shader_glsl_mnxn, /* WINED3DSIH_M3x3 */ shader_glsl_mnxn, /* WINED3DSIH_M3x4 */ shader_glsl_mnxn, @@ -4757,7 +4972,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB /* WINED3DSIH_MOVA */ shader_glsl_mov, /* WINED3DSIH_MUL */ shader_glsl_arith, /* WINED3DSIH_NOP */ NULL, - /* WINED3DSIH_NRM */ shader_glsl_map2gl, + /* WINED3DSIH_NRM */ shader_glsl_nrm, /* WINED3DSIH_PHASE */ NULL, /* WINED3DSIH_POW */ shader_glsl_pow, /* WINED3DSIH_RCP */ shader_glsl_rcp, diff --git a/reactos/dll/directx/wine/wined3d/nvidia_texture_shader.c b/reactos/dll/directx/wine/wined3d/nvidia_texture_shader.c index 82a71dab3b9..64bb883d6c8 100644 --- a/reactos/dll/directx/wine/wined3d/nvidia_texture_shader.c +++ b/reactos/dll/directx/wine/wined3d/nvidia_texture_shader.c @@ -627,8 +627,7 @@ static void nvts_enable(IWineD3DDevice *iface, BOOL enable) { LEAVE_GL(); } -static void nvrc_fragment_get_caps(WINED3DDEVTYPE devtype, - const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps) +static void nvrc_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps) { pCaps->TextureOpCaps = WINED3DTEXOPCAPS_ADD | WINED3DTEXOPCAPS_ADDSIGNED | @@ -671,7 +670,7 @@ static void nvrc_fragment_get_caps(WINED3DDEVTYPE devtype, WINED3DTEXOPCAPS_PREMODULATE */ #endif - pCaps->MaxTextureBlendStages = gl_info->limits.texture_stages; + pCaps->MaxTextureBlendStages = min(MAX_TEXTURES, gl_info->limits.general_combiners); pCaps->MaxSimultaneousTextures = gl_info->limits.textures; pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_TSSARGTEMP; diff --git a/reactos/dll/directx/wine/wined3d/query.c b/reactos/dll/directx/wine/wined3d/query.c index 1280a3b629d..3860e2c95b5 100644 --- a/reactos/dll/directx/wine/wined3d/query.c +++ b/reactos/dll/directx/wine/wined3d/query.c @@ -24,15 +24,164 @@ #include "config.h" #include "wined3d_private.h" +WINE_DEFAULT_DEBUG_CHANNEL(d3d); +#define GLINFO_LOCATION (*gl_info) + +static HRESULT wined3d_event_query_init(const struct wined3d_gl_info *gl_info, struct wined3d_event_query **query) +{ + struct wined3d_event_query *ret; + *query = NULL; + if (!gl_info->supported[ARB_SYNC] && !gl_info->supported[NV_FENCE] + && !gl_info->supported[APPLE_FENCE]) return E_NOTIMPL; + + ret = HeapAlloc(GetProcessHeap(), 0, sizeof(*ret)); + if (!ret) + { + ERR("Failed to allocate a wined3d event query structure.\n"); + return E_OUTOFMEMORY; + } + ret->context = NULL; + *query = ret; + return WINED3D_OK; +} + +static void wined3d_event_query_destroy(struct wined3d_event_query *query) +{ + if (query->context) context_free_event_query(query); + HeapFree(GetProcessHeap(), 0, query); +} + +static enum wined3d_event_query_result wined3d_event_query_test(struct wined3d_event_query *query, IWineD3DDeviceImpl *device) +{ + struct wined3d_context *context; + const struct wined3d_gl_info *gl_info; + enum wined3d_event_query_result ret; + BOOL fence_result; + + TRACE("(%p) : device %p\n", query, device); + + if (query->context == NULL) + { + TRACE("Query not started\n"); + return WINED3D_EVENT_QUERY_NOT_STARTED; + } + + if (!query->context->gl_info->supported[ARB_SYNC] && query->context->tid != GetCurrentThreadId()) + { + WARN("Event query tested from wrong thread\n"); + return WINED3D_EVENT_QUERY_WRONG_THREAD; + } + + context = context_acquire(device, query->context->current_rt, CTXUSAGE_RESOURCELOAD); + gl_info = context->gl_info; + + ENTER_GL(); + + if (gl_info->supported[ARB_SYNC]) + { + GLenum gl_ret = GL_EXTCALL(glClientWaitSync(query->object.sync, 0, 0)); + checkGLcall("glClientWaitSync"); + + switch (gl_ret) + { + case GL_ALREADY_SIGNALED: + case GL_CONDITION_SATISFIED: + ret = WINED3D_EVENT_QUERY_OK; + break; + + case GL_TIMEOUT_EXPIRED: + ret = WINED3D_EVENT_QUERY_WAITING; + break; + + case GL_WAIT_FAILED: + default: + ERR("glClientWaitSync returned %#x.\n", gl_ret); + ret = WINED3D_EVENT_QUERY_ERROR; + } + } + else if (gl_info->supported[APPLE_FENCE]) + { + fence_result = GL_EXTCALL(glTestFenceAPPLE(query->object.id)); + checkGLcall("glTestFenceAPPLE"); + if (fence_result) ret = WINED3D_EVENT_QUERY_OK; + else ret = WINED3D_EVENT_QUERY_WAITING; + } + else if (gl_info->supported[NV_FENCE]) + { + fence_result = GL_EXTCALL(glTestFenceNV(query->object.id)); + checkGLcall("glTestFenceNV"); + if (fence_result) ret = WINED3D_EVENT_QUERY_OK; + else ret = WINED3D_EVENT_QUERY_WAITING; + } + else + { + ERR("Event query created despite lack of GL support\n"); + ret = WINED3D_EVENT_QUERY_ERROR; + } + + LEAVE_GL(); + + context_release(context); + return ret; +} + +static void wined3d_event_query_issue(struct wined3d_event_query *query, IWineD3DDeviceImpl *device) +{ + const struct wined3d_gl_info *gl_info; + struct wined3d_context *context; + + if (query->context) + { + if (!query->context->gl_info->supported[ARB_SYNC] && query->context->tid != GetCurrentThreadId()) + { + context_free_event_query(query); + context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD); + context_alloc_event_query(context, query); + } + else + { + context = context_acquire(device, query->context->current_rt, CTXUSAGE_RESOURCELOAD); + } + } + else + { + context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD); + context_alloc_event_query(context, query); + } + + gl_info = context->gl_info; + + ENTER_GL(); + + if (gl_info->supported[ARB_SYNC]) + { + if (query->object.sync) GL_EXTCALL(glDeleteSync(query->object.sync)); + checkGLcall("glDeleteSync"); + query->object.sync = GL_EXTCALL(glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0)); + checkGLcall("glFenceSync"); + } + else if (gl_info->supported[APPLE_FENCE]) + { + GL_EXTCALL(glSetFenceAPPLE(query->object.id)); + checkGLcall("glSetFenceAPPLE"); + } + else if (gl_info->supported[NV_FENCE]) + { + GL_EXTCALL(glSetFenceNV(query->object.id, GL_ALL_COMPLETED_NV)); + checkGLcall("glSetFenceNV"); + } + + LEAVE_GL(); + + context_release(context); +} + /* * Occlusion Queries: * http://www.gris.uni-tuebingen.de/~bartz/Publications/paper/hww98.pdf * http://oss.sgi.com/projects/ogl-sample/registry/ARB/occlusion_query.txt */ -WINE_DEFAULT_DEBUG_CHANNEL(d3d); -#define GLINFO_LOCATION This->device->adapter->gl_info - /* ******************************************* IWineD3DQuery IUnknown parts follow ******************************************* */ @@ -70,17 +219,16 @@ static ULONG WINAPI IWineD3DQueryImpl_Release(IWineD3DQuery *iface) { if (This->type == WINED3DQUERYTYPE_EVENT) { struct wined3d_event_query *query = This->extendedData; - - if (query->context) context_free_event_query(query); + if (query) wined3d_event_query_destroy(query); } else if (This->type == WINED3DQUERYTYPE_OCCLUSION) { struct wined3d_occlusion_query *query = This->extendedData; if (query->context) context_free_occlusion_query(query); + HeapFree(GetProcessHeap(), 0, This->extendedData); } - HeapFree(GetProcessHeap(), 0, This->extendedData); HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -101,168 +249,6 @@ static HRESULT WINAPI IWineD3DQueryImpl_GetParent(IWineD3DQuery *iface, IUnknown return WINED3D_OK; } -static HRESULT WINAPI IWineD3DQueryImpl_GetData(IWineD3DQuery* iface, void* pData, DWORD dwSize, DWORD dwGetDataFlags){ - IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface; - HRESULT res = S_OK; - - TRACE("(%p) : type %#x, pData %p, dwSize %#x, dwGetDataFlags %#x\n", This, This->type, pData, dwSize, dwGetDataFlags); - - switch (This->type){ - - case WINED3DQUERYTYPE_VCACHE: - { - - WINED3DDEVINFO_VCACHE *data = pData; - FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_VCACHE\n", This); - if(pData == NULL || dwSize == 0) break; - data->Pattern = WINEMAKEFOURCC('C','A','C','H'); - data->OptMethod = 0; /*0 get longest strips, 1 optimize vertex cache*/ - data->CacheSize = 0; /*cache size, only required if OptMethod == 1*/ - data->MagicNumber = 0; /*only required if OptMethod == 1 (used internally)*/ - - } - break; - case WINED3DQUERYTYPE_RESOURCEMANAGER: - { - WINED3DDEVINFO_RESOURCEMANAGER *data = pData; - int i; - FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_RESOURCEMANAGER\n", This); - if(pData == NULL || dwSize == 0) break; - for(i = 0; i < WINED3DRTYPECOUNT; i++){ - /*I'm setting the default values to 1 so as to reduce the risk of a div/0 in the caller*/ - /* isTextureResident could be used to get some of this information */ - data->stats[i].bThrashing = FALSE; - data->stats[i].ApproxBytesDownloaded = 1; - data->stats[i].NumEvicts = 1; - data->stats[i].NumVidCreates = 1; - data->stats[i].LastPri = 1; - data->stats[i].NumUsed = 1; - data->stats[i].NumUsedInVidMem = 1; - data->stats[i].WorkingSet = 1; - data->stats[i].WorkingSetBytes = 1; - data->stats[i].TotalManaged = 1; - data->stats[i].TotalBytes = 1; - } - - } - break; - case WINED3DQUERYTYPE_VERTEXSTATS: - { - WINED3DDEVINFO_VERTEXSTATS *data = pData; - FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_VERTEXSTATS\n", This); - if(pData == NULL || dwSize == 0) break; - data->NumRenderedTriangles = 1; - data->NumExtraClippingTriangles = 1; - - } - break; - case WINED3DQUERYTYPE_TIMESTAMP: - { - UINT64* data = pData; - FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_TIMESTAMP\n", This); - if(pData == NULL || dwSize == 0) break; - *data = 1; /*Don't know what this is supposed to be*/ - } - break; - case WINED3DQUERYTYPE_TIMESTAMPDISJOINT: - { - BOOL* data = pData; - FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_TIMESTAMPDISJOINT\n", This); - if(pData == NULL || dwSize == 0) break; - *data = FALSE; /*Don't know what this is supposed to be*/ - } - break; - case WINED3DQUERYTYPE_TIMESTAMPFREQ: - { - UINT64* data = pData; - FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_TIMESTAMPFREQ\n", This); - if(pData == NULL || dwSize == 0) break; - *data = 1; /*Don't know what this is supposed to be*/ - } - break; - case WINED3DQUERYTYPE_PIPELINETIMINGS: - { - WINED3DDEVINFO_PIPELINETIMINGS *data = pData; - FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_PIPELINETIMINGS\n", This); - if(pData == NULL || dwSize == 0) break; - - data->VertexProcessingTimePercent = 1.0f; - data->PixelProcessingTimePercent = 1.0f; - data->OtherGPUProcessingTimePercent = 97.0f; - data->GPUIdleTimePercent = 1.0f; - } - break; - case WINED3DQUERYTYPE_INTERFACETIMINGS: - { - WINED3DDEVINFO_INTERFACETIMINGS *data = pData; - FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_INTERFACETIMINGS\n", This); - - if(pData == NULL || dwSize == 0) break; - data->WaitingForGPUToUseApplicationResourceTimePercent = 1.0f; - data->WaitingForGPUToAcceptMoreCommandsTimePercent = 1.0f; - data->WaitingForGPUToStayWithinLatencyTimePercent = 1.0f; - data->WaitingForGPUExclusiveResourceTimePercent = 1.0f; - data->WaitingForGPUOtherTimePercent = 96.0f; - } - - break; - case WINED3DQUERYTYPE_VERTEXTIMINGS: - { - WINED3DDEVINFO_STAGETIMINGS *data = pData; - FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_VERTEXTIMINGS\n", This); - - if(pData == NULL || dwSize == 0) break; - data->MemoryProcessingPercent = 50.0f; - data->ComputationProcessingPercent = 50.0f; - - } - break; - case WINED3DQUERYTYPE_PIXELTIMINGS: - { - WINED3DDEVINFO_STAGETIMINGS *data = pData; - FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_PIXELTIMINGS\n", This); - - if(pData == NULL || dwSize == 0) break; - data->MemoryProcessingPercent = 50.0f; - data->ComputationProcessingPercent = 50.0f; - } - break; - case WINED3DQUERYTYPE_BANDWIDTHTIMINGS: - { - WINED3DDEVINFO_BANDWIDTHTIMINGS *data = pData; - FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_BANDWIDTHTIMINGS\n", This); - - if(pData == NULL || dwSize == 0) break; - data->MaxBandwidthUtilized = 1.0f; - data->FrontEndUploadMemoryUtilizedPercent = 1.0f; - data->VertexRateUtilizedPercent = 1.0f; - data->TriangleSetupRateUtilizedPercent = 1.0f; - data->FillRateUtilizedPercent = 97.0f; - } - break; - case WINED3DQUERYTYPE_CACHEUTILIZATION: - { - WINED3DDEVINFO_CACHEUTILIZATION *data = pData; - FIXME("(%p): Unimplemented query WINED3DQUERYTYPE_CACHEUTILIZATION\n", This); - - if(pData == NULL || dwSize == 0) break; - data->TextureCacheHitRate = 1.0f; - data->PostTransformVertexCacheHitRate = 1.0f; - } - - - break; - default: - FIXME("(%p) Unhandled query type %d\n",This , This->type); - - }; - - /*dwGetDataFlags = 0 || D3DGETDATA_FLUSH - D3DGETDATA_FLUSH may return WINED3DERR_DEVICELOST if the device is lost - */ - return res; /* S_OK if the query data is available*/ -} - static HRESULT WINAPI IWineD3DOcclusionQueryImpl_GetData(IWineD3DQuery* iface, void* pData, DWORD dwSize, DWORD dwGetDataFlags) { IWineD3DQueryImpl *This = (IWineD3DQueryImpl *) iface; struct wined3d_occlusion_query *query = This->extendedData; @@ -341,108 +327,44 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_GetData(IWineD3DQuery* iface, static HRESULT WINAPI IWineD3DEventQueryImpl_GetData(IWineD3DQuery* iface, void* pData, DWORD dwSize, DWORD dwGetDataFlags) { IWineD3DQueryImpl *This = (IWineD3DQueryImpl *) iface; struct wined3d_event_query *query = This->extendedData; - struct wined3d_context *context; BOOL *data = pData; + enum wined3d_event_query_result ret; TRACE("(%p) : type D3DQUERY_EVENT, pData %p, dwSize %#x, dwGetDataFlags %#x\n", This, pData, dwSize, dwGetDataFlags); if (!pData || !dwSize) return S_OK; - - if (!query->context) + if (!query) { - TRACE("Query not started, returning TRUE.\n"); + WARN("(%p): Event query not supported by GL, reporting GPU idle\n", This); *data = TRUE; - return S_OK; } - if (query->context->tid != GetCurrentThreadId()) + ret = wined3d_event_query_test(query, This->device); + switch(ret) { - /* See comment in IWineD3DQuery::Issue, event query codeblock */ - FIXME("Wrong thread, reporting GPU idle.\n"); - *data = TRUE; + case WINED3D_EVENT_QUERY_OK: + case WINED3D_EVENT_QUERY_NOT_STARTED: + *data = TRUE; + break; - return S_OK; + case WINED3D_EVENT_QUERY_WAITING: + *data = FALSE; + break; + + case WINED3D_EVENT_QUERY_WRONG_THREAD: + FIXME("(%p) Wrong thread, reporting GPU idle.\n", This); + *data = TRUE; + break; + + case WINED3D_EVENT_QUERY_ERROR: + ERR("The GL event query failed, returning D3DERR_INVALIDCALL\n"); + return WINED3DERR_INVALIDCALL; } - context = context_acquire(This->device, query->context->current_rt, CTXUSAGE_RESOURCELOAD); - - ENTER_GL(); - - if (context->gl_info->supported[APPLE_FENCE]) - { - *data = GL_EXTCALL(glTestFenceAPPLE(query->id)); - checkGLcall("glTestFenceAPPLE"); - } - else if (context->gl_info->supported[NV_FENCE]) - { - *data = GL_EXTCALL(glTestFenceNV(query->id)); - checkGLcall("glTestFenceNV"); - } - else - { - WARN("(%p): reporting GPU idle\n", This); - *data = TRUE; - } - - LEAVE_GL(); - - context_release(context); - return S_OK; } -static DWORD WINAPI IWineD3DQueryImpl_GetDataSize(IWineD3DQuery* iface){ - IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface; - int dataSize = 0; - TRACE("(%p) : type %#x\n", This, This->type); - switch(This->type){ - case WINED3DQUERYTYPE_VCACHE: - dataSize = sizeof(WINED3DDEVINFO_VCACHE); - break; - case WINED3DQUERYTYPE_RESOURCEMANAGER: - dataSize = sizeof(WINED3DDEVINFO_RESOURCEMANAGER); - break; - case WINED3DQUERYTYPE_VERTEXSTATS: - dataSize = sizeof(WINED3DDEVINFO_VERTEXSTATS); - break; - case WINED3DQUERYTYPE_EVENT: - dataSize = sizeof(BOOL); - break; - case WINED3DQUERYTYPE_TIMESTAMP: - dataSize = sizeof(UINT64); - break; - case WINED3DQUERYTYPE_TIMESTAMPDISJOINT: - dataSize = sizeof(BOOL); - break; - case WINED3DQUERYTYPE_TIMESTAMPFREQ: - dataSize = sizeof(UINT64); - break; - case WINED3DQUERYTYPE_PIPELINETIMINGS: - dataSize = sizeof(WINED3DDEVINFO_PIPELINETIMINGS); - break; - case WINED3DQUERYTYPE_INTERFACETIMINGS: - dataSize = sizeof(WINED3DDEVINFO_INTERFACETIMINGS); - break; - case WINED3DQUERYTYPE_VERTEXTIMINGS: - dataSize = sizeof(WINED3DDEVINFO_STAGETIMINGS); - break; - case WINED3DQUERYTYPE_PIXELTIMINGS: - dataSize = sizeof(WINED3DDEVINFO_STAGETIMINGS); - break; - case WINED3DQUERYTYPE_BANDWIDTHTIMINGS: - dataSize = sizeof(WINED3DQUERYTYPE_BANDWIDTHTIMINGS); - break; - case WINED3DQUERYTYPE_CACHEUTILIZATION: - dataSize = sizeof(WINED3DDEVINFO_CACHEUTILIZATION); - break; - default: - FIXME("(%p) Unhandled query type %d\n",This , This->type); - dataSize = 0; - } - return dataSize; -} - static DWORD WINAPI IWineD3DEventQueryImpl_GetDataSize(IWineD3DQuery* iface){ TRACE("(%p) : type D3DQUERY_EVENT\n", iface); @@ -460,7 +382,6 @@ static WINED3DQUERYTYPE WINAPI IWineD3DQueryImpl_GetType(IWineD3DQuery* iface){ return This->type; } - static HRESULT WINAPI IWineD3DEventQueryImpl_Issue(IWineD3DQuery* iface, DWORD dwIssueFlags) { IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface; @@ -468,43 +389,11 @@ static HRESULT WINAPI IWineD3DEventQueryImpl_Issue(IWineD3DQuery* iface, DWORD if (dwIssueFlags & WINED3DISSUE_END) { struct wined3d_event_query *query = This->extendedData; - struct wined3d_context *context; - if (query->context) - { - if (query->context->tid != GetCurrentThreadId()) - { - context_free_event_query(query); - context = context_acquire(This->device, NULL, CTXUSAGE_RESOURCELOAD); - context_alloc_event_query(context, query); - } - else - { - context = context_acquire(This->device, query->context->current_rt, CTXUSAGE_RESOURCELOAD); - } - } - else - { - context = context_acquire(This->device, NULL, CTXUSAGE_RESOURCELOAD); - context_alloc_event_query(context, query); - } + /* Faked event query support */ + if (!query) return WINED3D_OK; - ENTER_GL(); - - if (context->gl_info->supported[APPLE_FENCE]) - { - GL_EXTCALL(glSetFenceAPPLE(query->id)); - checkGLcall("glSetFenceAPPLE"); - } - else if (context->gl_info->supported[NV_FENCE]) - { - GL_EXTCALL(glSetFenceNV(query->id, GL_ALL_COMPLETED_NV)); - checkGLcall("glSetFenceNV"); - } - - LEAVE_GL(); - - context_release(context); + wined3d_event_query_issue(query, This->device); } else if(dwIssueFlags & WINED3DISSUE_BEGIN) { @@ -604,43 +493,7 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_Issue(IWineD3DQuery* iface, D return WINED3D_OK; /* can be WINED3DERR_INVALIDCALL. */ } -static HRESULT WINAPI IWineD3DQueryImpl_Issue(IWineD3DQuery* iface, DWORD dwIssueFlags){ - IWineD3DQueryImpl *This = (IWineD3DQueryImpl *)iface; - - TRACE("(%p) : dwIssueFlags %#x, type %#x\n", This, dwIssueFlags, This->type); - - /* The fixme is printed when the app asks for the resulting data */ - WARN("(%p) : Unhandled query type %#x\n", This, This->type); - - if(dwIssueFlags & WINED3DISSUE_BEGIN) { - This->state = QUERY_BUILDING; - } else { - This->state = QUERY_SIGNALLED; - } - - return WINED3D_OK; /* can be WINED3DERR_INVALIDCALL. */ -} - - -/********************************************************** - * IWineD3DQuery VTbl follows - **********************************************************/ - -const IWineD3DQueryVtbl IWineD3DQuery_Vtbl = -{ - /*** IUnknown methods ***/ - IWineD3DQueryImpl_QueryInterface, - IWineD3DQueryImpl_AddRef, - IWineD3DQueryImpl_Release, - /*** IWineD3Dquery methods ***/ - IWineD3DQueryImpl_GetParent, - IWineD3DQueryImpl_GetData, - IWineD3DQueryImpl_GetDataSize, - IWineD3DQueryImpl_GetType, - IWineD3DQueryImpl_Issue -}; - -const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl = +static const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl = { /*** IUnknown methods ***/ IWineD3DQueryImpl_QueryInterface, @@ -654,7 +507,7 @@ const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl = IWineD3DEventQueryImpl_Issue }; -const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl = +static const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl = { /*** IUnknown methods ***/ IWineD3DQueryImpl_QueryInterface, @@ -667,3 +520,72 @@ const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl = IWineD3DQueryImpl_GetType, IWineD3DOcclusionQueryImpl_Issue }; + +HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device, + WINED3DQUERYTYPE type, IUnknown *parent) +{ + const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; + HRESULT hr; + + switch (type) + { + case WINED3DQUERYTYPE_OCCLUSION: + TRACE("Occlusion query.\n"); + if (!gl_info->supported[ARB_OCCLUSION_QUERY]) + { + WARN("Unsupported in local OpenGL implementation: ARB_OCCLUSION_QUERY.\n"); + return WINED3DERR_NOTAVAILABLE; + } + query->lpVtbl = &IWineD3DOcclusionQuery_Vtbl; + query->extendedData = HeapAlloc(GetProcessHeap(), 0, sizeof(struct wined3d_occlusion_query)); + if (!query->extendedData) + { + ERR("Failed to allocate occlusion query extended data.\n"); + return E_OUTOFMEMORY; + } + ((struct wined3d_occlusion_query *)query->extendedData)->context = NULL; + break; + + case WINED3DQUERYTYPE_EVENT: + TRACE("Event query.\n"); + query->lpVtbl = &IWineD3DEventQuery_Vtbl; + hr = wined3d_event_query_init(gl_info, (struct wined3d_event_query **) &query->extendedData); + if (hr == E_NOTIMPL) + { + /* Half-Life 2 needs this query. It does not render the main + * menu correctly otherwise. Pretend to support it, faking + * this query does not do much harm except potentially + * lowering performance. */ + FIXME("Event query: Unimplemented, but pretending to be supported.\n"); + } + else if(FAILED(hr)) + { + return hr; + } + break; + + case WINED3DQUERYTYPE_VCACHE: + case WINED3DQUERYTYPE_RESOURCEMANAGER: + case WINED3DQUERYTYPE_VERTEXSTATS: + case WINED3DQUERYTYPE_TIMESTAMP: + case WINED3DQUERYTYPE_TIMESTAMPDISJOINT: + case WINED3DQUERYTYPE_TIMESTAMPFREQ: + case WINED3DQUERYTYPE_PIPELINETIMINGS: + case WINED3DQUERYTYPE_INTERFACETIMINGS: + case WINED3DQUERYTYPE_VERTEXTIMINGS: + case WINED3DQUERYTYPE_PIXELTIMINGS: + case WINED3DQUERYTYPE_BANDWIDTHTIMINGS: + case WINED3DQUERYTYPE_CACHEUTILIZATION: + default: + FIXME("Unhandled query type %#x.\n", type); + return WINED3DERR_NOTAVAILABLE; + } + + query->type = type; + query->state = QUERY_CREATED; + query->device = device; + query->parent = parent; + query->ref = 1; + + return WINED3D_OK; +} diff --git a/reactos/dll/directx/wine/wined3d/shader.c b/reactos/dll/directx/wine/wined3d/shader.c index 398ea641835..307cadf804c 100644 --- a/reactos/dll/directx/wine/wined3d/shader.c +++ b/reactos/dll/directx/wine/wined3d/shader.c @@ -26,10 +26,1433 @@ #include #include +#include #include "wined3d_private.h" WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); +WINE_DECLARE_DEBUG_CHANNEL(d3d); + +static const char *shader_opcode_names[] = +{ + /* WINED3DSIH_ABS */ "abs", + /* WINED3DSIH_ADD */ "add", + /* WINED3DSIH_BEM */ "bem", + /* WINED3DSIH_BREAK */ "break", + /* WINED3DSIH_BREAKC */ "breakc", + /* WINED3DSIH_BREAKP */ "breakp", + /* WINED3DSIH_CALL */ "call", + /* WINED3DSIH_CALLNZ */ "callnz", + /* WINED3DSIH_CMP */ "cmp", + /* WINED3DSIH_CND */ "cnd", + /* WINED3DSIH_CRS */ "crs", + /* WINED3DSIH_CUT */ "cut", + /* WINED3DSIH_DCL */ "dcl", + /* WINED3DSIH_DEF */ "def", + /* WINED3DSIH_DEFB */ "defb", + /* WINED3DSIH_DEFI */ "defi", + /* WINED3DSIH_DP2ADD */ "dp2add", + /* WINED3DSIH_DP3 */ "dp3", + /* WINED3DSIH_DP4 */ "dp4", + /* WINED3DSIH_DST */ "dst", + /* WINED3DSIH_DSX */ "dsx", + /* WINED3DSIH_DSY */ "dsy", + /* WINED3DSIH_ELSE */ "else", + /* WINED3DSIH_EMIT */ "emit", + /* WINED3DSIH_ENDIF */ "endif", + /* WINED3DSIH_ENDLOOP */ "endloop", + /* WINED3DSIH_ENDREP */ "endrep", + /* WINED3DSIH_EXP */ "exp", + /* WINED3DSIH_EXPP */ "expp", + /* WINED3DSIH_FRC */ "frc", + /* WINED3DSIH_IADD */ "iadd", + /* WINED3DSIH_IF */ "if", + /* WINED3DSIH_IFC */ "ifc", + /* WINED3DSIH_IGE */ "ige", + /* WINED3DSIH_LABEL */ "label", + /* WINED3DSIH_LIT */ "lit", + /* WINED3DSIH_LOG */ "log", + /* WINED3DSIH_LOGP */ "logp", + /* WINED3DSIH_LOOP */ "loop", + /* WINED3DSIH_LRP */ "lrp", + /* WINED3DSIH_LT */ "lt", + /* WINED3DSIH_M3x2 */ "m3x2", + /* WINED3DSIH_M3x3 */ "m3x3", + /* WINED3DSIH_M3x4 */ "m3x4", + /* WINED3DSIH_M4x3 */ "m4x3", + /* WINED3DSIH_M4x4 */ "m4x4", + /* WINED3DSIH_MAD */ "mad", + /* WINED3DSIH_MAX */ "max", + /* WINED3DSIH_MIN */ "min", + /* WINED3DSIH_MOV */ "mov", + /* WINED3DSIH_MOVA */ "mova", + /* WINED3DSIH_MUL */ "mul", + /* WINED3DSIH_NOP */ "nop", + /* WINED3DSIH_NRM */ "nrm", + /* WINED3DSIH_PHASE */ "phase", + /* WINED3DSIH_POW */ "pow", + /* WINED3DSIH_RCP */ "rcp", + /* WINED3DSIH_REP */ "rep", + /* WINED3DSIH_RET */ "ret", + /* WINED3DSIH_RSQ */ "rsq", + /* WINED3DSIH_SETP */ "setp", + /* WINED3DSIH_SGE */ "sge", + /* WINED3DSIH_SGN */ "sgn", + /* WINED3DSIH_SINCOS */ "sincos", + /* WINED3DSIH_SLT */ "slt", + /* WINED3DSIH_SUB */ "sub", + /* WINED3DSIH_TEX */ "texld", + /* WINED3DSIH_TEXBEM */ "texbem", + /* WINED3DSIH_TEXBEML */ "texbeml", + /* WINED3DSIH_TEXCOORD */ "texcrd", + /* WINED3DSIH_TEXDEPTH */ "texdepth", + /* WINED3DSIH_TEXDP3 */ "texdp3", + /* WINED3DSIH_TEXDP3TEX */ "texdp3tex", + /* WINED3DSIH_TEXKILL */ "texkill", + /* WINED3DSIH_TEXLDD */ "texldd", + /* WINED3DSIH_TEXLDL */ "texldl", + /* WINED3DSIH_TEXM3x2DEPTH */ "texm3x2depth", + /* WINED3DSIH_TEXM3x2PAD */ "texm3x2pad", + /* WINED3DSIH_TEXM3x2TEX */ "texm3x2tex", + /* WINED3DSIH_TEXM3x3 */ "texm3x3", + /* WINED3DSIH_TEXM3x3DIFF */ "texm3x3diff", + /* WINED3DSIH_TEXM3x3PAD */ "texm3x3pad", + /* WINED3DSIH_TEXM3x3SPEC */ "texm3x3spec", + /* WINED3DSIH_TEXM3x3TEX */ "texm3x3tex", + /* WINED3DSIH_TEXM3x3VSPEC */ "texm3x3vspec", + /* WINED3DSIH_TEXREG2AR */ "texreg2ar", + /* WINED3DSIH_TEXREG2GB */ "texreg2gb", + /* WINED3DSIH_TEXREG2RGB */ "texreg2rgb", +}; + +static const char *semantic_names[] = +{ + /* WINED3DDECLUSAGE_POSITION */ "SV_POSITION", + /* WINED3DDECLUSAGE_BLENDWEIGHT */ "BLENDWEIGHT", + /* WINED3DDECLUSAGE_BLENDINDICES */ "BLENDINDICES", + /* WINED3DDECLUSAGE_NORMAL */ "NORMAL", + /* WINED3DDECLUSAGE_PSIZE */ "PSIZE", + /* WINED3DDECLUSAGE_TEXCOORD */ "TEXCOORD", + /* WINED3DDECLUSAGE_TANGENT */ "TANGENT", + /* WINED3DDECLUSAGE_BINORMAL */ "BINORMAL", + /* WINED3DDECLUSAGE_TESSFACTOR */ "TESSFACTOR", + /* WINED3DDECLUSAGE_POSITIONT */ "POSITIONT", + /* WINED3DDECLUSAGE_COLOR */ "COLOR", + /* WINED3DDECLUSAGE_FOG */ "FOG", + /* WINED3DDECLUSAGE_DEPTH */ "DEPTH", + /* WINED3DDECLUSAGE_SAMPLE */ "SAMPLE", +}; + +static const char *shader_semantic_name_from_usage(WINED3DDECLUSAGE usage) +{ + if (usage >= sizeof(semantic_names) / sizeof(*semantic_names)) + { + FIXME("Unrecognized usage %#x.\n", usage); + return "UNRECOGNIZED"; + } + + return semantic_names[usage]; +} + +static WINED3DDECLUSAGE shader_usage_from_semantic_name(const char *name) +{ + unsigned int i; + + for (i = 0; i < sizeof(semantic_names) / sizeof(*semantic_names); ++i) + { + if (!strcmp(name, semantic_names[i])) return i; + } + + return ~0U; +} + +BOOL shader_match_semantic(const char *semantic_name, WINED3DDECLUSAGE usage) +{ + return !strcmp(semantic_name, shader_semantic_name_from_usage(usage)); +} + +static void shader_signature_from_semantic(struct wined3d_shader_signature_element *e, + const struct wined3d_shader_semantic *s) +{ + e->semantic_name = shader_semantic_name_from_usage(s->usage); + e->semantic_idx = s->usage_idx; + e->sysval_semantic = 0; + e->component_type = 0; + e->register_idx = s->reg.reg.idx; + e->mask = s->reg.write_mask; +} + +static const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token) +{ + switch (version_token >> 16) + { + case WINED3D_SM1_VS: + case WINED3D_SM1_PS: + return &sm1_shader_frontend; + + case WINED3D_SM4_PS: + case WINED3D_SM4_VS: + case WINED3D_SM4_GS: + return &sm4_shader_frontend; + + default: + FIXME("Unrecognised version token %#x\n", version_token); + return NULL; + } +} + +void shader_buffer_clear(struct wined3d_shader_buffer *buffer) +{ + buffer->buffer[0] = '\0'; + buffer->bsize = 0; + buffer->lineNo = 0; + buffer->newline = TRUE; +} + +BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer) +{ + buffer->buffer = HeapAlloc(GetProcessHeap(), 0, SHADER_PGMSIZE); + if (!buffer->buffer) + { + ERR("Failed to allocate shader buffer memory.\n"); + return FALSE; + } + + shader_buffer_clear(buffer); + return TRUE; +} + +void shader_buffer_free(struct wined3d_shader_buffer *buffer) +{ + HeapFree(GetProcessHeap(), 0, buffer->buffer); +} + +int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *format, va_list args) +{ + char *base = buffer->buffer + buffer->bsize; + int rc; + + rc = vsnprintf(base, SHADER_PGMSIZE - 1 - buffer->bsize, format, args); + + if (rc < 0 /* C89 */ || (unsigned int)rc > SHADER_PGMSIZE - 1 - buffer->bsize /* C99 */) + { + ERR("The buffer allocated for the shader program string " + "is too small at %d bytes.\n", SHADER_PGMSIZE); + buffer->bsize = SHADER_PGMSIZE - 1; + return -1; + } + + if (buffer->newline) + { + TRACE("GL HW (%u, %u) : %s", buffer->lineNo + 1, buffer->bsize, base); + buffer->newline = FALSE; + } + else + { + TRACE("%s", base); + } + + buffer->bsize += rc; + if (buffer->buffer[buffer->bsize-1] == '\n') + { + ++buffer->lineNo; + buffer->newline = TRUE; + } + + return 0; +} + +int shader_addline(struct wined3d_shader_buffer *buffer, const char *format, ...) +{ + va_list args; + int ret; + + va_start(args, format); + ret = shader_vaddline(buffer, format, args); + va_end(args); + + return ret; +} + +static void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device, + IUnknown *parent, const struct wined3d_parent_ops *parent_ops) +{ + shader->ref = 1; + shader->device = (IWineD3DDevice *)device; + shader->parent = parent; + shader->parent_ops = parent_ops; + list_init(&shader->linked_programs); + list_add_head(&device->shaders, &shader->shader_list_entry); +} + +/* Convert floating point offset relative to a register file to an absolute + * offset for float constants. */ +static unsigned int shader_get_float_offset(WINED3DSHADER_PARAM_REGISTER_TYPE register_type, UINT register_idx) +{ + switch (register_type) + { + case WINED3DSPR_CONST: return register_idx; + case WINED3DSPR_CONST2: return 2048 + register_idx; + case WINED3DSPR_CONST3: return 4096 + register_idx; + case WINED3DSPR_CONST4: return 6144 + register_idx; + default: + FIXME("Unsupported register type: %u.\n", register_type); + return register_idx; + } +} + +static void shader_delete_constant_list(struct list *clist) +{ + struct local_constant *constant; + struct list *ptr; + + ptr = list_head(clist); + while (ptr) + { + constant = LIST_ENTRY(ptr, struct local_constant, entry); + ptr = list_next(clist, ptr); + HeapFree(GetProcessHeap(), 0, constant); + } + list_init(clist); +} + +static inline void set_bitmap_bit(DWORD *bitmap, DWORD bit) +{ + DWORD idx, shift; + idx = bit >> 5; + shift = bit & 0x1f; + bitmap[idx] |= (1 << shift); +} + +static void shader_record_register_usage(IWineD3DBaseShaderImpl *shader, struct shader_reg_maps *reg_maps, + const struct wined3d_shader_register *reg, enum wined3d_shader_type shader_type) +{ + switch (reg->type) + { + case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */ + if (shader_type == WINED3D_SHADER_TYPE_PIXEL) reg_maps->texcoord |= 1 << reg->idx; + else reg_maps->address |= 1 << reg->idx; + break; + + case WINED3DSPR_TEMP: + reg_maps->temporary |= 1 << reg->idx; + break; + + case WINED3DSPR_INPUT: + if (shader_type == WINED3D_SHADER_TYPE_PIXEL) + { + if (reg->rel_addr) + { + /* If relative addressing is used, we must assume that all registers + * are used. Even if it is a construct like v3[aL], we can't assume + * that v0, v1 and v2 aren't read because aL can be negative */ + unsigned int i; + for (i = 0; i < MAX_REG_INPUT; ++i) + { + ((IWineD3DPixelShaderImpl *)shader)->input_reg_used[i] = TRUE; + } + } + else + { + ((IWineD3DPixelShaderImpl *)shader)->input_reg_used[reg->idx] = TRUE; + } + } + else reg_maps->input_registers |= 1 << reg->idx; + break; + + case WINED3DSPR_RASTOUT: + if (reg->idx == 1) reg_maps->fog = 1; + break; + + case WINED3DSPR_MISCTYPE: + if (shader_type == WINED3D_SHADER_TYPE_PIXEL) + { + if (reg->idx == 0) reg_maps->vpos = 1; + else if (reg->idx == 1) reg_maps->usesfacing = 1; + } + break; + + case WINED3DSPR_CONST: + if (reg->rel_addr) + { + if (shader_type != WINED3D_SHADER_TYPE_PIXEL) + { + if (reg->idx < ((IWineD3DVertexShaderImpl *)shader)->min_rel_offset) + { + ((IWineD3DVertexShaderImpl *)shader)->min_rel_offset = reg->idx; + } + if (reg->idx > ((IWineD3DVertexShaderImpl *)shader)->max_rel_offset) + { + ((IWineD3DVertexShaderImpl *)shader)->max_rel_offset = reg->idx; + } + } + reg_maps->usesrelconstF = TRUE; + } + else + { + set_bitmap_bit(reg_maps->constf, reg->idx); + } + break; + + case WINED3DSPR_CONSTINT: + reg_maps->integer_constants |= (1 << reg->idx); + break; + + case WINED3DSPR_CONSTBOOL: + reg_maps->boolean_constants |= (1 << reg->idx); + break; + + case WINED3DSPR_COLOROUT: + reg_maps->highest_render_target = max(reg_maps->highest_render_target, reg->idx); + break; + + default: + TRACE("Not recording register of type %#x and idx %u\n", reg->type, reg->idx); + break; + } +} + +static unsigned int get_instr_extra_regcount(enum WINED3D_SHADER_INSTRUCTION_HANDLER instr, unsigned int param) +{ + switch (instr) + { + case WINED3DSIH_M4x4: + case WINED3DSIH_M3x4: + return param == 1 ? 3 : 0; + + case WINED3DSIH_M4x3: + case WINED3DSIH_M3x3: + return param == 1 ? 2 : 0; + + case WINED3DSIH_M3x2: + return param == 1 ? 1 : 0; + + default: + return 0; + } +} + +/* Note that this does not count the loop register as an address register. */ +static HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3d_shader_frontend *fe, + struct shader_reg_maps *reg_maps, struct wined3d_shader_signature_element *input_signature, + struct wined3d_shader_signature_element *output_signature, const DWORD *byte_code, DWORD constf_size) +{ + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface; + unsigned int cur_loop_depth = 0, max_loop_depth = 0; + void *fe_data = shader->baseShader.frontend_data; + struct wined3d_shader_version shader_version; + const DWORD *ptr = byte_code; + + memset(reg_maps, 0, sizeof(*reg_maps)); + + /* get_registers_used() is called on every compile on some 1.x shaders, + * which can result in stacking up a collection of local constants. + * Delete the old constants if existing. */ + shader_delete_constant_list(&shader->baseShader.constantsF); + shader_delete_constant_list(&shader->baseShader.constantsB); + shader_delete_constant_list(&shader->baseShader.constantsI); + + fe->shader_read_header(fe_data, &ptr, &shader_version); + reg_maps->shader_version = shader_version; + + reg_maps->constf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + sizeof(*reg_maps->constf) * ((constf_size + 31) / 32)); + if (!reg_maps->constf) + { + ERR("Failed to allocate constant map memory.\n"); + return E_OUTOFMEMORY; + } + + while (!fe->shader_is_end(fe_data, &ptr)) + { + struct wined3d_shader_instruction ins; + const char *comment; + UINT comment_size; + UINT param_size; + + /* Skip comments. */ + fe->shader_read_comment(&ptr, &comment, &comment_size); + if (comment) continue; + + /* Fetch opcode. */ + fe->shader_read_opcode(fe_data, &ptr, &ins, ¶m_size); + + /* Unhandled opcode, and its parameters. */ + if (ins.handler_idx == WINED3DSIH_TABLE_SIZE) + { + TRACE("Skipping unrecognized instruction.\n"); + ptr += param_size; + continue; + } + + /* Handle declarations. */ + if (ins.handler_idx == WINED3DSIH_DCL) + { + struct wined3d_shader_semantic semantic; + + fe->shader_read_semantic(&ptr, &semantic); + + switch (semantic.reg.reg.type) + { + /* Mark input registers used. */ + case WINED3DSPR_INPUT: + reg_maps->input_registers |= 1 << semantic.reg.reg.idx; + shader_signature_from_semantic(&input_signature[semantic.reg.reg.idx], &semantic); + break; + + /* Vertex shader: mark 3.0 output registers used, save token. */ + case WINED3DSPR_OUTPUT: + reg_maps->output_registers |= 1 << semantic.reg.reg.idx; + shader_signature_from_semantic(&output_signature[semantic.reg.reg.idx], &semantic); + if (semantic.usage == WINED3DDECLUSAGE_FOG) reg_maps->fog = 1; + break; + + /* Save sampler usage token. */ + case WINED3DSPR_SAMPLER: + reg_maps->sampler_type[semantic.reg.reg.idx] = semantic.sampler_type; + break; + + default: + TRACE("Not recording DCL register type %#x.\n", semantic.reg.reg.type); + break; + } + } + else if (ins.handler_idx == WINED3DSIH_DEF) + { + struct wined3d_shader_src_param rel_addr; + struct wined3d_shader_dst_param dst; + + local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant)); + if (!lconst) return E_OUTOFMEMORY; + + fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr); + lconst->idx = dst.reg.idx; + + memcpy(lconst->value, ptr, 4 * sizeof(DWORD)); + ptr += 4; + + /* In pixel shader 1.X shaders, the constants are clamped between [-1;1] */ + if (shader_version.major == 1 && shader_version.type == WINED3D_SHADER_TYPE_PIXEL) + { + float *value = (float *)lconst->value; + if (value[0] < -1.0f) value[0] = -1.0f; + else if (value[0] > 1.0f) value[0] = 1.0f; + if (value[1] < -1.0f) value[1] = -1.0f; + else if (value[1] > 1.0f) value[1] = 1.0f; + if (value[2] < -1.0f) value[2] = -1.0f; + else if (value[2] > 1.0f) value[2] = 1.0f; + if (value[3] < -1.0f) value[3] = -1.0f; + else if (value[3] > 1.0f) value[3] = 1.0f; + } + + list_add_head(&shader->baseShader.constantsF, &lconst->entry); + } + else if (ins.handler_idx == WINED3DSIH_DEFI) + { + struct wined3d_shader_src_param rel_addr; + struct wined3d_shader_dst_param dst; + + local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant)); + if (!lconst) return E_OUTOFMEMORY; + + fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr); + lconst->idx = dst.reg.idx; + + memcpy(lconst->value, ptr, 4 * sizeof(DWORD)); + ptr += 4; + + list_add_head(&shader->baseShader.constantsI, &lconst->entry); + reg_maps->local_int_consts |= (1 << dst.reg.idx); + } + else if (ins.handler_idx == WINED3DSIH_DEFB) + { + struct wined3d_shader_src_param rel_addr; + struct wined3d_shader_dst_param dst; + + local_constant *lconst = HeapAlloc(GetProcessHeap(), 0, sizeof(local_constant)); + if (!lconst) return E_OUTOFMEMORY; + + fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr); + lconst->idx = dst.reg.idx; + + memcpy(lconst->value, ptr, sizeof(DWORD)); + ++ptr; + + list_add_head(&shader->baseShader.constantsB, &lconst->entry); + reg_maps->local_bool_consts |= (1 << dst.reg.idx); + } + /* If there's a loop in the shader. */ + else if (ins.handler_idx == WINED3DSIH_LOOP + || ins.handler_idx == WINED3DSIH_REP) + { + struct wined3d_shader_src_param src, rel_addr; + + fe->shader_read_src_param(fe_data, &ptr, &src, &rel_addr); + + /* Rep and Loop always use an integer constant for the control parameters. */ + if (ins.handler_idx == WINED3DSIH_REP) + { + reg_maps->integer_constants |= 1 << src.reg.idx; + } + else + { + fe->shader_read_src_param(fe_data, &ptr, &src, &rel_addr); + reg_maps->integer_constants |= 1 << src.reg.idx; + } + + cur_loop_depth++; + if (cur_loop_depth > max_loop_depth) max_loop_depth = cur_loop_depth; + } + else if (ins.handler_idx == WINED3DSIH_ENDLOOP + || ins.handler_idx == WINED3DSIH_ENDREP) + { + cur_loop_depth--; + } + /* For subroutine prototypes. */ + else if (ins.handler_idx == WINED3DSIH_LABEL) + { + struct wined3d_shader_src_param src, rel_addr; + + fe->shader_read_src_param(fe_data, &ptr, &src, &rel_addr); + reg_maps->labels |= 1 << src.reg.idx; + } + /* Set texture, address, temporary registers. */ + else + { + BOOL color0_mov = FALSE; + int i, limit; + + /* This will loop over all the registers and try to + * make a bitmask of the ones we're interested in. + * + * Relative addressing tokens are ignored, but that's + * okay, since we'll catch any address registers when + * they are initialized (required by spec). */ + if (ins.dst_count) + { + struct wined3d_shader_src_param dst_rel_addr; + struct wined3d_shader_dst_param dst_param; + + fe->shader_read_dst_param(fe_data, &ptr, &dst_param, &dst_rel_addr); + + shader_record_register_usage(shader, reg_maps, &dst_param.reg, shader_version.type); + + /* WINED3DSPR_TEXCRDOUT is the same as WINED3DSPR_OUTPUT. _OUTPUT can be > MAX_REG_TEXCRD and + * is used in >= 3.0 shaders. Filter 3.0 shaders to prevent overflows, and also filter pixel + * shaders because TECRDOUT isn't used in them, but future register types might cause issues */ + if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX && shader_version.major < 3 + && dst_param.reg.type == WINED3DSPR_TEXCRDOUT) + { + reg_maps->texcoord_mask[dst_param.reg.idx] |= dst_param.write_mask; + } + + if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL) + { + IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)shader; + + if (dst_param.reg.type == WINED3DSPR_COLOROUT && dst_param.reg.idx == 0) + { + /* Many 2.0 and 3.0 pixel shaders end with a MOV from a temp register to + * COLOROUT 0. If we know this in advance, the ARB shader backend can skip + * the mov and perform the sRGB write correction from the source register. + * + * However, if the mov is only partial, we can't do this, and if the write + * comes from an instruction other than MOV it is hard to do as well. If + * COLOROUT 0 is overwritten partially later, the marker is dropped again. */ + + ps->color0_mov = FALSE; + if (ins.handler_idx == WINED3DSIH_MOV) + { + /* Used later when the source register is read. */ + color0_mov = TRUE; + } + } + /* Also drop the MOV marker if the source register is overwritten prior to the shader + * end + */ + else if (dst_param.reg.type == WINED3DSPR_TEMP && dst_param.reg.idx == ps->color0_reg) + { + ps->color0_mov = FALSE; + } + } + + /* Declare 1.x samplers implicitly, based on the destination reg. number. */ + if (shader_version.major == 1 + && (ins.handler_idx == WINED3DSIH_TEX + || ins.handler_idx == WINED3DSIH_TEXBEM + || ins.handler_idx == WINED3DSIH_TEXBEML + || ins.handler_idx == WINED3DSIH_TEXDP3TEX + || ins.handler_idx == WINED3DSIH_TEXM3x2TEX + || ins.handler_idx == WINED3DSIH_TEXM3x3SPEC + || ins.handler_idx == WINED3DSIH_TEXM3x3TEX + || ins.handler_idx == WINED3DSIH_TEXM3x3VSPEC + || ins.handler_idx == WINED3DSIH_TEXREG2AR + || ins.handler_idx == WINED3DSIH_TEXREG2GB + || ins.handler_idx == WINED3DSIH_TEXREG2RGB)) + { + /* Fake sampler usage, only set reserved bit and type. */ + DWORD sampler_code = dst_param.reg.idx; + + TRACE("Setting fake 2D sampler for 1.x pixelshader.\n"); + reg_maps->sampler_type[sampler_code] = WINED3DSTT_2D; + + /* texbem is only valid with < 1.4 pixel shaders */ + if (ins.handler_idx == WINED3DSIH_TEXBEM + || ins.handler_idx == WINED3DSIH_TEXBEML) + { + reg_maps->bumpmat |= 1 << dst_param.reg.idx; + if (ins.handler_idx == WINED3DSIH_TEXBEML) + { + reg_maps->luminanceparams |= 1 << dst_param.reg.idx; + } + } + } + else if (ins.handler_idx == WINED3DSIH_BEM) + { + reg_maps->bumpmat |= 1 << dst_param.reg.idx; + } + } + + if (ins.handler_idx == WINED3DSIH_NRM) reg_maps->usesnrm = 1; + else if (ins.handler_idx == WINED3DSIH_DSY) reg_maps->usesdsy = 1; + else if (ins.handler_idx == WINED3DSIH_DSX) reg_maps->usesdsx = 1; + else if (ins.handler_idx == WINED3DSIH_TEXLDD) reg_maps->usestexldd = 1; + else if (ins.handler_idx == WINED3DSIH_TEXLDL) reg_maps->usestexldl = 1; + else if (ins.handler_idx == WINED3DSIH_MOVA) reg_maps->usesmova = 1; + else if (ins.handler_idx == WINED3DSIH_IFC) reg_maps->usesifc = 1; + else if (ins.handler_idx == WINED3DSIH_CALL) reg_maps->usescall = 1; + + limit = ins.src_count + (ins.predicate ? 1 : 0); + for (i = 0; i < limit; ++i) + { + struct wined3d_shader_src_param src_param, src_rel_addr; + unsigned int count; + + fe->shader_read_src_param(fe_data, &ptr, &src_param, &src_rel_addr); + count = get_instr_extra_regcount(ins.handler_idx, i); + + shader_record_register_usage(shader, reg_maps, &src_param.reg, shader_version.type); + while (count) + { + ++src_param.reg.idx; + shader_record_register_usage(shader, reg_maps, &src_param.reg, shader_version.type); + --count; + } + + if (color0_mov) + { + IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)shader; + if (src_param.reg.type == WINED3DSPR_TEMP + && src_param.swizzle == WINED3DSP_NOSWIZZLE) + { + ps->color0_mov = TRUE; + ps->color0_reg = src_param.reg.idx; + } + } + } + } + } + reg_maps->loop_depth = max_loop_depth; + + shader->baseShader.functionLength = ((const char *)ptr - (const char *)byte_code); + + return WINED3D_OK; +} + +unsigned int shader_find_free_input_register(const struct shader_reg_maps *reg_maps, unsigned int max) +{ + DWORD map = 1 << max; + map |= map - 1; + map &= reg_maps->shader_version.major < 3 ? ~reg_maps->texcoord : ~reg_maps->input_registers; + + return wined3d_log2i(map); +} + +static void shader_dump_decl_usage(const struct wined3d_shader_semantic *semantic, + const struct wined3d_shader_version *shader_version) +{ + TRACE("dcl"); + + if (semantic->reg.reg.type == WINED3DSPR_SAMPLER) + { + switch (semantic->sampler_type) + { + case WINED3DSTT_2D: TRACE("_2d"); break; + case WINED3DSTT_CUBE: TRACE("_cube"); break; + case WINED3DSTT_VOLUME: TRACE("_volume"); break; + default: TRACE("_unknown_ttype(0x%08x)", semantic->sampler_type); + } + } + else + { + /* Pixel shaders 3.0 don't have usage semantics. */ + if (shader_version->major < 3 && shader_version->type == WINED3D_SHADER_TYPE_PIXEL) return; + else TRACE("_"); + + switch (semantic->usage) + { + case WINED3DDECLUSAGE_POSITION: + TRACE("position%u", semantic->usage_idx); + break; + + case WINED3DDECLUSAGE_BLENDINDICES: + TRACE("blend"); + break; + + case WINED3DDECLUSAGE_BLENDWEIGHT: + TRACE("weight"); + break; + + case WINED3DDECLUSAGE_NORMAL: + TRACE("normal%u", semantic->usage_idx); + break; + + case WINED3DDECLUSAGE_PSIZE: + TRACE("psize"); + break; + + case WINED3DDECLUSAGE_COLOR: + if (semantic->usage_idx == 0) TRACE("color"); + else TRACE("specular%u", (semantic->usage_idx - 1)); + break; + + case WINED3DDECLUSAGE_TEXCOORD: + TRACE("texture%u", semantic->usage_idx); + break; + + case WINED3DDECLUSAGE_TANGENT: + TRACE("tangent"); + break; + + case WINED3DDECLUSAGE_BINORMAL: + TRACE("binormal"); + break; + + case WINED3DDECLUSAGE_TESSFACTOR: + TRACE("tessfactor"); + break; + + case WINED3DDECLUSAGE_POSITIONT: + TRACE("positionT%u", semantic->usage_idx); + break; + + case WINED3DDECLUSAGE_FOG: + TRACE("fog"); + break; + + case WINED3DDECLUSAGE_DEPTH: + TRACE("depth"); + break; + + case WINED3DDECLUSAGE_SAMPLE: + TRACE("sample"); + break; + + default: + FIXME("unknown_semantics(0x%08x)", semantic->usage); + } + } +} + +static void shader_dump_register(const struct wined3d_shader_register *reg, + const struct wined3d_shader_version *shader_version) +{ + static const char * const rastout_reg_names[] = {"oPos", "oFog", "oPts"}; + static const char * const misctype_reg_names[] = {"vPos", "vFace"}; + UINT offset = reg->idx; + + switch (reg->type) + { + case WINED3DSPR_TEMP: + TRACE("r"); + break; + + case WINED3DSPR_INPUT: + TRACE("v"); + break; + + case WINED3DSPR_CONST: + case WINED3DSPR_CONST2: + case WINED3DSPR_CONST3: + case WINED3DSPR_CONST4: + TRACE("c"); + offset = shader_get_float_offset(reg->type, reg->idx); + break; + + case WINED3DSPR_TEXTURE: /* vs: case WINED3DSPR_ADDR */ + TRACE("%c", shader_version->type == WINED3D_SHADER_TYPE_PIXEL ? 't' : 'a'); + break; + + case WINED3DSPR_RASTOUT: + TRACE("%s", rastout_reg_names[reg->idx]); + break; + + case WINED3DSPR_COLOROUT: + TRACE("oC"); + break; + + case WINED3DSPR_DEPTHOUT: + TRACE("oDepth"); + break; + + case WINED3DSPR_ATTROUT: + TRACE("oD"); + break; + + case WINED3DSPR_TEXCRDOUT: + /* Vertex shaders >= 3.0 use general purpose output registers + * (WINED3DSPR_OUTPUT), which can include an address token. */ + if (shader_version->major >= 3) TRACE("o"); + else TRACE("oT"); + break; + + case WINED3DSPR_CONSTINT: + TRACE("i"); + break; + + case WINED3DSPR_CONSTBOOL: + TRACE("b"); + break; + + case WINED3DSPR_LABEL: + TRACE("l"); + break; + + case WINED3DSPR_LOOP: + TRACE("aL"); + break; + + case WINED3DSPR_SAMPLER: + TRACE("s"); + break; + + case WINED3DSPR_MISCTYPE: + if (reg->idx > 1) FIXME("Unhandled misctype register %u.\n", reg->idx); + else TRACE("%s", misctype_reg_names[reg->idx]); + break; + + case WINED3DSPR_PREDICATE: + TRACE("p"); + break; + + case WINED3DSPR_IMMCONST: + TRACE("l"); + break; + + case WINED3DSPR_CONSTBUFFER: + TRACE("cb"); + break; + + default: + TRACE("unhandled_rtype(%#x)", reg->type); + break; + } + + if (reg->type == WINED3DSPR_IMMCONST) + { + TRACE("("); + switch (reg->immconst_type) + { + case WINED3D_IMMCONST_FLOAT: + TRACE("%.8e", *(const float *)reg->immconst_data); + break; + + case WINED3D_IMMCONST_FLOAT4: + TRACE("%.8e, %.8e, %.8e, %.8e", + *(const float *)®->immconst_data[0], *(const float *)®->immconst_data[1], + *(const float *)®->immconst_data[2], *(const float *)®->immconst_data[3]); + break; + + default: + TRACE("", reg->immconst_type); + break; + } + TRACE(")"); + } + else if (reg->type != WINED3DSPR_RASTOUT && reg->type != WINED3DSPR_MISCTYPE) + { + if (reg->array_idx != ~0U) + { + TRACE("%u[%u", offset, reg->array_idx); + if (reg->rel_addr) + { + TRACE(" + "); + shader_dump_src_param(reg->rel_addr, shader_version); + } + TRACE("]"); + } + else + { + if (reg->rel_addr) + { + TRACE("["); + shader_dump_src_param(reg->rel_addr, shader_version); + TRACE(" + "); + } + TRACE("%u", offset); + if (reg->rel_addr) TRACE("]"); + } + } +} + +void shader_dump_dst_param(const struct wined3d_shader_dst_param *param, + const struct wined3d_shader_version *shader_version) +{ + DWORD write_mask = param->write_mask; + + shader_dump_register(¶m->reg, shader_version); + + if (write_mask != WINED3DSP_WRITEMASK_ALL) + { + static const char *write_mask_chars = "xyzw"; + + TRACE("."); + if (write_mask & WINED3DSP_WRITEMASK_0) TRACE("%c", write_mask_chars[0]); + if (write_mask & WINED3DSP_WRITEMASK_1) TRACE("%c", write_mask_chars[1]); + if (write_mask & WINED3DSP_WRITEMASK_2) TRACE("%c", write_mask_chars[2]); + if (write_mask & WINED3DSP_WRITEMASK_3) TRACE("%c", write_mask_chars[3]); + } +} + +void shader_dump_src_param(const struct wined3d_shader_src_param *param, + const struct wined3d_shader_version *shader_version) +{ + DWORD src_modifier = param->modifiers; + DWORD swizzle = param->swizzle; + + if (src_modifier == WINED3DSPSM_NEG + || src_modifier == WINED3DSPSM_BIASNEG + || src_modifier == WINED3DSPSM_SIGNNEG + || src_modifier == WINED3DSPSM_X2NEG + || src_modifier == WINED3DSPSM_ABSNEG) + TRACE("-"); + else if (src_modifier == WINED3DSPSM_COMP) + TRACE("1-"); + else if (src_modifier == WINED3DSPSM_NOT) + TRACE("!"); + + if (src_modifier == WINED3DSPSM_ABS || src_modifier == WINED3DSPSM_ABSNEG) + TRACE("abs("); + + shader_dump_register(¶m->reg, shader_version); + + if (src_modifier) + { + switch (src_modifier) + { + case WINED3DSPSM_NONE: break; + case WINED3DSPSM_NEG: break; + case WINED3DSPSM_NOT: break; + case WINED3DSPSM_BIAS: TRACE("_bias"); break; + case WINED3DSPSM_BIASNEG: TRACE("_bias"); break; + case WINED3DSPSM_SIGN: TRACE("_bx2"); break; + case WINED3DSPSM_SIGNNEG: TRACE("_bx2"); break; + case WINED3DSPSM_COMP: break; + case WINED3DSPSM_X2: TRACE("_x2"); break; + case WINED3DSPSM_X2NEG: TRACE("_x2"); break; + case WINED3DSPSM_DZ: TRACE("_dz"); break; + case WINED3DSPSM_DW: TRACE("_dw"); break; + case WINED3DSPSM_ABSNEG: TRACE(")"); break; + case WINED3DSPSM_ABS: TRACE(")"); break; + default: TRACE("_unknown_modifier(%#x)", src_modifier); + } + } + + if (swizzle != WINED3DSP_NOSWIZZLE) + { + static const char *swizzle_chars = "xyzw"; + DWORD swizzle_x = swizzle & 0x03; + DWORD swizzle_y = (swizzle >> 2) & 0x03; + DWORD swizzle_z = (swizzle >> 4) & 0x03; + DWORD swizzle_w = (swizzle >> 6) & 0x03; + + if (swizzle_x == swizzle_y + && swizzle_x == swizzle_z + && swizzle_x == swizzle_w) + { + TRACE(".%c", swizzle_chars[swizzle_x]); + } + else + { + TRACE(".%c%c%c%c", swizzle_chars[swizzle_x], swizzle_chars[swizzle_y], + swizzle_chars[swizzle_z], swizzle_chars[swizzle_w]); + } + } +} + +/* Shared code in order to generate the bulk of the shader string. + * NOTE: A description of how to parse tokens can be found on MSDN. */ +void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffer *buffer, + const shader_reg_maps *reg_maps, const DWORD *byte_code, void *backend_ctx) +{ + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface; + IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device; + const struct wined3d_shader_frontend *fe = shader->baseShader.frontend; + void *fe_data = shader->baseShader.frontend_data; + struct wined3d_shader_src_param src_rel_addr[4]; + struct wined3d_shader_src_param src_param[4]; + struct wined3d_shader_version shader_version; + struct wined3d_shader_src_param dst_rel_addr; + struct wined3d_shader_dst_param dst_param; + struct wined3d_shader_instruction ins; + struct wined3d_shader_context ctx; + const DWORD *ptr = byte_code; + DWORD i; + + /* Initialize current parsing state. */ + ctx.shader = iface; + ctx.gl_info = &device->adapter->gl_info; + ctx.reg_maps = reg_maps; + ctx.buffer = buffer; + ctx.backend_data = backend_ctx; + + ins.ctx = &ctx; + ins.dst = &dst_param; + ins.src = src_param; + shader->baseShader.parse_state.current_row = 0; + + fe->shader_read_header(fe_data, &ptr, &shader_version); + + while (!fe->shader_is_end(fe_data, &ptr)) + { + const char *comment; + UINT comment_size; + UINT param_size; + + /* Skip comment tokens. */ + fe->shader_read_comment(&ptr, &comment, &comment_size); + if (comment) continue; + + /* Read opcode. */ + fe->shader_read_opcode(fe_data, &ptr, &ins, ¶m_size); + + /* Unknown opcode and its parameters. */ + if (ins.handler_idx == WINED3DSIH_TABLE_SIZE) + { + TRACE("Skipping unrecognized instruction.\n"); + ptr += param_size; + continue; + } + + /* Nothing to do. */ + if (ins.handler_idx == WINED3DSIH_DCL + || ins.handler_idx == WINED3DSIH_NOP + || ins.handler_idx == WINED3DSIH_DEF + || ins.handler_idx == WINED3DSIH_DEFI + || ins.handler_idx == WINED3DSIH_DEFB + || ins.handler_idx == WINED3DSIH_PHASE) + { + ptr += param_size; + continue; + } + + /* Destination token */ + if (ins.dst_count) fe->shader_read_dst_param(fe_data, &ptr, &dst_param, &dst_rel_addr); + + /* Predication token */ + if (ins.predicate) ins.predicate = *ptr++; + + /* Other source tokens */ + for (i = 0; i < ins.src_count; ++i) + { + fe->shader_read_src_param(fe_data, &ptr, &src_param[i], &src_rel_addr[i]); + } + + /* Call appropriate function for output target */ + device->shader_backend->shader_handle_instruction(&ins); + } +} + +static void shader_dump_ins_modifiers(const struct wined3d_shader_dst_param *dst) +{ + DWORD mmask = dst->modifiers; + + switch (dst->shift) + { + case 0: break; + case 13: TRACE("_d8"); break; + case 14: TRACE("_d4"); break; + case 15: TRACE("_d2"); break; + case 1: TRACE("_x2"); break; + case 2: TRACE("_x4"); break; + case 3: TRACE("_x8"); break; + default: TRACE("_unhandled_shift(%d)", dst->shift); break; + } + + if (mmask & WINED3DSPDM_SATURATE) TRACE("_sat"); + if (mmask & WINED3DSPDM_PARTIALPRECISION) TRACE("_pp"); + if (mmask & WINED3DSPDM_MSAMPCENTROID) TRACE("_centroid"); + + mmask &= ~(WINED3DSPDM_SATURATE | WINED3DSPDM_PARTIALPRECISION | WINED3DSPDM_MSAMPCENTROID); + if (mmask) FIXME("_unrecognized_modifier(%#x)", mmask); +} + +static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *byte_code) +{ + struct wined3d_shader_version shader_version; + const DWORD *ptr = byte_code; + const char *type_prefix; + DWORD i; + + TRACE("Parsing %p.\n", byte_code); + + fe->shader_read_header(fe_data, &ptr, &shader_version); + + switch (shader_version.type) + { + case WINED3D_SHADER_TYPE_VERTEX: + type_prefix = "vs"; + break; + + case WINED3D_SHADER_TYPE_GEOMETRY: + type_prefix = "gs"; + break; + + case WINED3D_SHADER_TYPE_PIXEL: + type_prefix = "ps"; + break; + + default: + FIXME("Unhandled shader type %#x.\n", shader_version.type); + type_prefix = "unknown"; + break; + } + + TRACE("%s_%u_%u\n", type_prefix, shader_version.major, shader_version.minor); + + while (!fe->shader_is_end(fe_data, &ptr)) + { + struct wined3d_shader_instruction ins; + const char *comment; + UINT comment_size; + UINT param_size; + + /* comment */ + fe->shader_read_comment(&ptr, &comment, &comment_size); + if (comment) + { + if (comment_size > 4 && *(const DWORD *)comment == WINEMAKEFOURCC('T', 'E', 'X', 'T')) + { + const char *end = comment + comment_size; + const char *ptr = comment + 4; + const char *line = ptr; + + TRACE("// TEXT\n"); + while (ptr != end) + { + if (*ptr == '\n') + { + UINT len = ptr - line; + if (len && *(ptr - 1) == '\r') --len; + TRACE("// %s\n", debugstr_an(line, len)); + line = ++ptr; + } + else ++ptr; + } + if (line != ptr) TRACE("// %s\n", debugstr_an(line, ptr - line)); + } + else TRACE("// %s\n", debugstr_an(comment, comment_size)); + continue; + } + + fe->shader_read_opcode(fe_data, &ptr, &ins, ¶m_size); + if (ins.handler_idx == WINED3DSIH_TABLE_SIZE) + { + TRACE("Skipping unrecognized instruction.\n"); + ptr += param_size; + continue; + } + + if (ins.handler_idx == WINED3DSIH_DCL) + { + struct wined3d_shader_semantic semantic; + + fe->shader_read_semantic(&ptr, &semantic); + + shader_dump_decl_usage(&semantic, &shader_version); + shader_dump_ins_modifiers(&semantic.reg); + TRACE(" "); + shader_dump_dst_param(&semantic.reg, &shader_version); + } + else if (ins.handler_idx == WINED3DSIH_DEF) + { + struct wined3d_shader_src_param rel_addr; + struct wined3d_shader_dst_param dst; + + fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr); + + TRACE("def c%u = %f, %f, %f, %f", shader_get_float_offset(dst.reg.type, dst.reg.idx), + *(const float *)(ptr), + *(const float *)(ptr + 1), + *(const float *)(ptr + 2), + *(const float *)(ptr + 3)); + ptr += 4; + } + else if (ins.handler_idx == WINED3DSIH_DEFI) + { + struct wined3d_shader_src_param rel_addr; + struct wined3d_shader_dst_param dst; + + fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr); + + TRACE("defi i%u = %d, %d, %d, %d", dst.reg.idx, + *(ptr), + *(ptr + 1), + *(ptr + 2), + *(ptr + 3)); + ptr += 4; + } + else if (ins.handler_idx == WINED3DSIH_DEFB) + { + struct wined3d_shader_src_param rel_addr; + struct wined3d_shader_dst_param dst; + + fe->shader_read_dst_param(fe_data, &ptr, &dst, &rel_addr); + + TRACE("defb b%u = %s", dst.reg.idx, *ptr ? "true" : "false"); + ++ptr; + } + else + { + struct wined3d_shader_src_param dst_rel_addr, src_rel_addr; + struct wined3d_shader_dst_param dst_param; + struct wined3d_shader_src_param src_param; + + if (ins.dst_count) + { + fe->shader_read_dst_param(fe_data, &ptr, &dst_param, &dst_rel_addr); + } + + /* Print out predication source token first - it follows + * the destination token. */ + if (ins.predicate) + { + fe->shader_read_src_param(fe_data, &ptr, &src_param, &src_rel_addr); + TRACE("("); + shader_dump_src_param(&src_param, &shader_version); + TRACE(") "); + } + + /* PixWin marks instructions with the coissue flag with a '+' */ + if (ins.coissue) TRACE("+"); + + TRACE("%s", shader_opcode_names[ins.handler_idx]); + + if (ins.handler_idx == WINED3DSIH_IFC + || ins.handler_idx == WINED3DSIH_BREAKC) + { + switch (ins.flags) + { + case COMPARISON_GT: TRACE("_gt"); break; + case COMPARISON_EQ: TRACE("_eq"); break; + case COMPARISON_GE: TRACE("_ge"); break; + case COMPARISON_LT: TRACE("_lt"); break; + case COMPARISON_NE: TRACE("_ne"); break; + case COMPARISON_LE: TRACE("_le"); break; + default: TRACE("_(%u)", ins.flags); + } + } + else if (ins.handler_idx == WINED3DSIH_TEX + && shader_version.major >= 2 + && (ins.flags & WINED3DSI_TEXLD_PROJECT)) + { + TRACE("p"); + } + + /* We already read the destination token, print it. */ + if (ins.dst_count) + { + shader_dump_ins_modifiers(&dst_param); + TRACE(" "); + shader_dump_dst_param(&dst_param, &shader_version); + } + + /* Other source tokens */ + for (i = ins.dst_count; i < (ins.dst_count + ins.src_count); ++i) + { + fe->shader_read_src_param(fe_data, &ptr, &src_param, &src_rel_addr); + TRACE(!i ? " " : ", "); + shader_dump_src_param(&src_param, &shader_version); + } + } + TRACE("\n"); + } +} + +static void shader_cleanup(IWineD3DBaseShader *iface) +{ + IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)iface; + + ((IWineD3DDeviceImpl *)shader->baseShader.device)->shader_backend->shader_destroy(iface); + HeapFree(GetProcessHeap(), 0, shader->baseShader.reg_maps.constf); + HeapFree(GetProcessHeap(), 0, shader->baseShader.function); + shader_delete_constant_list(&shader->baseShader.constantsF); + shader_delete_constant_list(&shader->baseShader.constantsB); + shader_delete_constant_list(&shader->baseShader.constantsI); + list_remove(&shader->baseShader.shader_list_entry); + + if (shader->baseShader.frontend && shader->baseShader.frontend_data) + { + shader->baseShader.frontend->shader_free(shader->baseShader.frontend_data); + } +} + +static void shader_none_handle_instruction(const struct wined3d_shader_instruction *ins) {} +static void shader_none_select(const struct wined3d_context *context, BOOL usePS, BOOL useVS) {} +static void shader_none_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) {} +static void shader_none_deselect_depth_blt(IWineD3DDevice *iface) {} +static void shader_none_update_float_vertex_constants(IWineD3DDevice *iface, UINT start, UINT count) {} +static void shader_none_update_float_pixel_constants(IWineD3DDevice *iface, UINT start, UINT count) {} +static void shader_none_load_constants(const struct wined3d_context *context, char usePS, char useVS) {} +static void shader_none_load_np2fixup_constants(IWineD3DDevice *iface, char usePS, char useVS) {} +static void shader_none_destroy(IWineD3DBaseShader *iface) {} +static HRESULT shader_none_alloc(IWineD3DDevice *iface) {return WINED3D_OK;} +static void shader_none_free(IWineD3DDevice *iface) {} +static BOOL shader_none_dirty_const(IWineD3DDevice *iface) {return FALSE;} + +static void shader_none_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *caps) +{ + /* Set the shader caps to 0 for the none shader backend */ + caps->VertexShaderVersion = 0; + caps->PixelShaderVersion = 0; + caps->PixelShader1xMaxValue = 0.0f; +} + +static BOOL shader_none_color_fixup_supported(struct color_fixup_desc fixup) +{ + if (TRACE_ON(d3d_shader) && TRACE_ON(d3d)) + { + TRACE("Checking support for fixup:\n"); + dump_color_fixup_desc(fixup); + } + + /* Faked to make some apps happy. */ + if (!is_complex_fixup(fixup)) + { + TRACE("[OK]\n"); + return TRUE; + } + + TRACE("[FAILED]\n"); + return FALSE; +} + +const shader_backend_t none_shader_backend = { + shader_none_handle_instruction, + shader_none_select, + shader_none_select_depth_blt, + shader_none_deselect_depth_blt, + shader_none_update_float_vertex_constants, + shader_none_update_float_pixel_constants, + shader_none_load_constants, + shader_none_load_np2fixup_constants, + shader_none_destroy, + shader_none_alloc, + shader_none_free, + shader_none_dirty_const, + shader_none_get_caps, + shader_none_color_fixup_supported, +}; static void shader_get_parent(IWineD3DBaseShaderImpl *shader, IUnknown **parent) { diff --git a/reactos/dll/directx/wine/wined3d/shader_sm1.c b/reactos/dll/directx/wine/wined3d/shader_sm1.c index 64876b38032..aa1da56c5ba 100644 --- a/reactos/dll/directx/wine/wined3d/shader_sm1.c +++ b/reactos/dll/directx/wine/wined3d/shader_sm1.c @@ -641,9 +641,10 @@ static void shader_sm1_read_semantic(const DWORD **ptr, struct wined3d_shader_se shader_parse_dst_param(dst_token, NULL, &semantic->reg); } -static void shader_sm1_read_comment(const DWORD **ptr, const char **comment) +static void shader_sm1_read_comment(const DWORD **ptr, const char **comment, UINT *comment_size) { DWORD token = **ptr; + UINT size; if ((token & WINED3DSI_OPCODE_MASK) != WINED3D_SM1_OP_COMMENT) { @@ -651,8 +652,10 @@ static void shader_sm1_read_comment(const DWORD **ptr, const char **comment) return; } + size = (token & WINED3DSI_COMMENTSIZE_MASK) >> WINED3DSI_COMMENTSIZE_SHIFT; *comment = (const char *)++(*ptr); - *ptr += (token & WINED3DSI_COMMENTSIZE_MASK) >> WINED3DSI_COMMENTSIZE_SHIFT; + *comment_size = size * sizeof(DWORD); + *ptr += size; } static BOOL shader_sm1_is_end(void *data, const DWORD **ptr) diff --git a/reactos/dll/directx/wine/wined3d/shader_sm4.c b/reactos/dll/directx/wine/wined3d/shader_sm4.c index 91aa882c888..b4637904f10 100644 --- a/reactos/dll/directx/wine/wined3d/shader_sm4.c +++ b/reactos/dll/directx/wine/wined3d/shader_sm4.c @@ -49,10 +49,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); enum wined3d_sm4_opcode { WINED3D_SM4_OP_ADD = 0x00, + WINED3D_SM4_OP_BREAK = 0x02, + WINED3D_SM4_OP_BREAKC = 0x03, + WINED3D_SM4_OP_CUT = 0x09, WINED3D_SM4_OP_DP3 = 0x10, WINED3D_SM4_OP_DP4 = 0x11, + WINED3D_SM4_OP_EMIT = 0x13, + WINED3D_SM4_OP_ENDIF = 0x15, + WINED3D_SM4_OP_ENDLOOP = 0x16, WINED3D_SM4_OP_EXP = 0x19, + WINED3D_SM4_OP_IADD = 0x1e, + WINED3D_SM4_OP_IF = 0x1f, + WINED3D_SM4_OP_IGE = 0x21, WINED3D_SM4_OP_LOG = 0x2f, + WINED3D_SM4_OP_LT = 0x31, WINED3D_SM4_OP_MIN = 0x33, WINED3D_SM4_OP_MAX = 0x34, WINED3D_SM4_OP_MOV = 0x36, @@ -102,10 +112,20 @@ struct sysval_map static const struct wined3d_sm4_opcode_info opcode_table[] = { {WINED3D_SM4_OP_ADD, WINED3DSIH_ADD, 1, 2}, + {WINED3D_SM4_OP_BREAK, WINED3DSIH_BREAK, 0, 0}, + {WINED3D_SM4_OP_BREAKC, WINED3DSIH_BREAKP, 0, 1}, + {WINED3D_SM4_OP_CUT, WINED3DSIH_CUT, 0, 0}, {WINED3D_SM4_OP_DP3, WINED3DSIH_DP3, 1, 2}, {WINED3D_SM4_OP_DP4, WINED3DSIH_DP4, 1, 2}, + {WINED3D_SM4_OP_EMIT, WINED3DSIH_EMIT, 0, 0}, + {WINED3D_SM4_OP_ENDIF, WINED3DSIH_ENDIF, 0, 0}, + {WINED3D_SM4_OP_ENDLOOP,WINED3DSIH_ENDLOOP, 0, 0}, {WINED3D_SM4_OP_EXP, WINED3DSIH_EXP, 1, 1}, + {WINED3D_SM4_OP_IADD, WINED3DSIH_IADD, 1, 2}, + {WINED3D_SM4_OP_IF, WINED3DSIH_IF, 0, 1}, + {WINED3D_SM4_OP_IGE, WINED3DSIH_IGE, 1, 2}, {WINED3D_SM4_OP_LOG, WINED3DSIH_LOG, 1, 1}, + {WINED3D_SM4_OP_LT, WINED3DSIH_LT, 1, 2}, {WINED3D_SM4_OP_MIN, WINED3DSIH_MIN, 1, 2}, {WINED3D_SM4_OP_MAX, WINED3DSIH_MAX, 1, 2}, {WINED3D_SM4_OP_MOV, WINED3DSIH_MOV, 1, 1}, @@ -386,9 +406,9 @@ static void shader_sm4_read_semantic(const DWORD **ptr, struct wined3d_shader_se FIXME("ptr %p, semantic %p stub!\n", ptr, semantic); } -static void shader_sm4_read_comment(const DWORD **ptr, const char **comment) +static void shader_sm4_read_comment(const DWORD **ptr, const char **comment, UINT *comment_size) { - FIXME("ptr %p, comment %p stub!\n", ptr, comment); + FIXME("ptr %p, comment %p, comment_size %p stub!\n", ptr, comment, comment_size); *comment = NULL; } diff --git a/reactos/dll/directx/wine/wined3d/state.c b/reactos/dll/directx/wine/wined3d/state.c index adb426b904b..5efe069bb19 100644 --- a/reactos/dll/directx/wine/wined3d/state.c +++ b/reactos/dll/directx/wine/wined3d/state.c @@ -584,6 +584,10 @@ static void state_clipping(DWORD state, IWineD3DStateBlockImpl *stateblock, stru glEnable(GL_DEPTH_CLAMP); checkGLcall("glEnable(GL_DEPTH_CLAMP)"); } + else + { + FIXME("Clipping disabled, but ARB_depth_clamp isn't supported.\n"); + } } if (enable & WINED3DCLIPPLANE0) { glEnable(GL_CLIP_PLANE0); checkGLcall("glEnable(clip plane 0)"); } @@ -3523,7 +3527,6 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wine if(stateblock->textures[sampler]) { BOOL srgb = stateblock->samplerState[sampler][WINED3DSAMP_SRGBTEXTURE]; IWineD3DBaseTextureImpl *tex_impl = (IWineD3DBaseTextureImpl *) stateblock->textures[sampler]; - tex_impl->baseTexture.internal_preload(stateblock->textures[sampler], srgb ? SRGB_SRGB : SRGB_RGB); IWineD3DBaseTexture_BindTexture(stateblock->textures[sampler], srgb); basetexture_apply_state_changes(stateblock->textures[sampler], stateblock->textureState[sampler], stateblock->samplerState[sampler], gl_info); @@ -3597,9 +3600,9 @@ void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, struct w } } else { /* Disabled the pixel shader - color ops weren't applied - * while it was enabled, so re-apply them. - */ - for(i=0; i < MAX_TEXTURES; i++) { + * while it was enabled, so re-apply them. */ + for (i = 0; i < context->gl_info->limits.texture_stages; ++i) + { if(!isStateDirty(context, STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP))) { device->StateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP)].apply (STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP), stateblock, context); @@ -3880,62 +3883,18 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock glLoadIdentity(); checkGLcall("glLoadIdentity"); - if(context->last_was_rhw) { - double X, Y, height, width, minZ, maxZ; + if (context->last_was_rhw) + { + double x = stateblock->viewport.X; + double y = stateblock->viewport.Y; + double w = stateblock->viewport.Width; + double h = stateblock->viewport.Height; - X = stateblock->viewport.X; - Y = stateblock->viewport.Y; - height = stateblock->viewport.Height; - width = stateblock->viewport.Width; - minZ = stateblock->viewport.MinZ; - maxZ = stateblock->viewport.MaxZ; - - if (!stateblock->device->untransformed) - { - /* Transformed vertices are supposed to bypass the whole transform pipeline including - * frustum clipping. This can't be done in opengl, so this code adjusts the Z range to - * suppress depth clipping. This can be done because it is an orthogonal projection and - * the Z coordinate does not affect the size of the primitives. Half Life 1 and Prince of - * Persia 3D need this. - * - * Note that using minZ and maxZ here doesn't entirely fix the problem, since view frustum - * clipping is still enabled, but it seems to fix it for all apps tested so far. A minor - * problem can be witnessed in half-life 1 engine based games, the weapon is clipped close - * to the viewer. - * - * Also note that this breaks z comparison against z values filled in with clear, - * but no app depending on that and disabled clipping has been found yet. Comparing - * primitives against themselves works, so the Z buffer is still intact for normal hidden - * surface removal. - * - * We could disable clipping entirely by setting the near to infinity and far to -infinity, - * but this would break Z buffer operation. Raising the range to something less than - * infinity would help a bit at the cost of Z precision, but it wouldn't eliminate the - * problem either. - */ - TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ); - if (context->render_offscreen) - { - glOrtho(X, X + width, -Y, -Y - height, -minZ, -maxZ); - } else { - glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ); - } - } else { - /* If the app mixes transformed and untransformed primitives we can't use the coordinate system - * trick above because this would mess up transformed and untransformed Z order. Pass the z position - * unmodified to opengl. - * - * If the app depends on mixed types and disabled clipping we're out of luck without a pipeline - * replacement shader. - */ - TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, 1.0, -1.0); - if (context->render_offscreen) - { - glOrtho(X, X + width, -Y, -Y - height, 0.0, -1.0); - } else { - glOrtho(X, X + width, Y + height, Y, 0.0, -1.0); - } - } + TRACE("Calling glOrtho with x %.8e, y %.8e, w %.8e, h %.8e.\n", x, y, w, h); + if (context->render_offscreen) + glOrtho(x, x + w, -y, -y - h, 0.0, -1.0); + else + glOrtho(x, x + w, y + h, y, 0.0, -1.0); checkGLcall("glOrtho"); /* Window Coord 0 is the middle of the first pixel, so translate by 1/2 pixels */ @@ -4167,7 +4126,7 @@ static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock, GL_EXTCALL(glVertexAttrib4NubvARB(i, ptr)); break; case WINED3DFMT_B8G8R8A8_UNORM: - if (gl_info->supported[EXT_VERTEX_ARRAY_BGRA]) + if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA]) { const DWORD *src = (const DWORD *)ptr; DWORD c = *src & 0xff00ff00; @@ -4479,87 +4438,11 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB loadTexCoords(context, stateblock, si, &curVBO); } -static inline void drawPrimitiveTraceDataLocations(const struct wined3d_stream_info *dataLocations) -{ - /* Dump out what parts we have supplied */ - TRACE("Strided Data:\n"); - TRACE_STRIDED((dataLocations), WINED3D_FFP_POSITION); - TRACE_STRIDED((dataLocations), WINED3D_FFP_BLENDWEIGHT); - TRACE_STRIDED((dataLocations), WINED3D_FFP_BLENDINDICES); - TRACE_STRIDED((dataLocations), WINED3D_FFP_NORMAL); - TRACE_STRIDED((dataLocations), WINED3D_FFP_PSIZE); - TRACE_STRIDED((dataLocations), WINED3D_FFP_DIFFUSE); - TRACE_STRIDED((dataLocations), WINED3D_FFP_SPECULAR); - TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD0); - TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD1); - TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD2); - TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD3); - TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD4); - TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD5); - TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD6); - TRACE_STRIDED((dataLocations), WINED3D_FFP_TEXCOORD7); -} - static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context) { - const struct wined3d_gl_info *gl_info = context->gl_info; IWineD3DDeviceImpl *device = stateblock->device; - BOOL fixup = FALSE; - struct wined3d_stream_info *dataLocations = &device->strided_streams; - BOOL useVertexShaderFunction; - BOOL load_numbered = FALSE; - BOOL load_named = FALSE; - - useVertexShaderFunction = (device->vs_selected_mode != SHADER_NONE && stateblock->vertexShader) ? TRUE : FALSE; - - if(device->up_strided) { - /* Note: this is a ddraw fixed-function code path */ - TRACE("================ Strided Input ===================\n"); - device_stream_info_from_strided(gl_info, device->up_strided, dataLocations); - - if(TRACE_ON(d3d)) { - drawPrimitiveTraceDataLocations(dataLocations); - } - } else { - /* Note: This is a fixed function or shader codepath. - * This means it must handle both types of strided data. - * Shaders must go through here to zero the strided data, even if they - * don't set any declaration at all - */ - TRACE("================ Vertex Declaration ===================\n"); - device_stream_info_from_declaration(device, useVertexShaderFunction, dataLocations, &fixup); - } - - if (dataLocations->position_transformed) useVertexShaderFunction = FALSE; - - if(useVertexShaderFunction) { - if(((IWineD3DVertexDeclarationImpl *) stateblock->vertexDecl)->half_float_conv_needed && !fixup) { - TRACE("Using drawStridedSlow with vertex shaders for FLOAT16 conversion\n"); - device->useDrawStridedSlow = TRUE; - } else { - load_numbered = TRUE; - device->useDrawStridedSlow = FALSE; - } - } - else - { - WORD slow_mask = (1 << WINED3D_FFP_PSIZE); - slow_mask |= -!gl_info->supported[EXT_VERTEX_ARRAY_BGRA] - & ((1 << WINED3D_FFP_DIFFUSE) | (1 << WINED3D_FFP_SPECULAR)); - - if (fixup || (!dataLocations->position_transformed - && !(dataLocations->use_map & slow_mask))) - { - /* Load the vertex data using named arrays */ - load_named = TRUE; - device->useDrawStridedSlow = FALSE; - } - else - { - TRACE("Not loading vertex data\n"); - device->useDrawStridedSlow = TRUE; - } - } + BOOL load_numbered = use_vs(stateblock) && !device->useDrawStridedSlow; + BOOL load_named = !use_vs(stateblock) && !device->useDrawStridedSlow; if (context->numberedArraysLoaded && !load_numbered) { @@ -4576,13 +4459,13 @@ static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wi if (load_numbered) { TRACE("Loading numbered arrays\n"); - loadNumberedArrays(stateblock, dataLocations, context); + loadNumberedArrays(stateblock, &device->strided_streams, context); context->numberedArraysLoaded = TRUE; } else if (load_named) { TRACE("Loading vertex data\n"); - loadVertexData(context, stateblock, dataLocations); + loadVertexData(context, stateblock, &device->strided_streams); context->namedArraysLoaded = TRUE; } } @@ -5634,8 +5517,7 @@ static const struct StateEntryTemplate ffp_fragmentstate_template[] = { /* Context activation is done by the caller. */ static void ffp_enable(IWineD3DDevice *iface, BOOL enable) { } -static void ffp_fragment_get_caps(WINED3DDEVTYPE devtype, - const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps) +static void ffp_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps) { pCaps->TextureOpCaps = WINED3DTEXOPCAPS_ADD | WINED3DTEXOPCAPS_ADDSIGNED | @@ -5670,7 +5552,7 @@ static void ffp_fragment_get_caps(WINED3DDEVTYPE devtype, if (gl_info->supported[ARB_TEXTURE_ENV_DOT3]) pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_DOTPRODUCT3; - pCaps->MaxTextureBlendStages = gl_info->limits.texture_stages; + pCaps->MaxTextureBlendStages = gl_info->limits.textures; pCaps->MaxSimultaneousTextures = gl_info->limits.textures; } @@ -5725,6 +5607,43 @@ static void multistate_apply_3(DWORD state, IWineD3DStateBlockImpl *stateblock, stateblock->device->multistate_funcs[state][2](state, stateblock, context); } +static void prune_invalid_states(struct StateEntry *state_table, const struct wined3d_gl_info *gl_info) +{ + unsigned int start, last, i; + + start = STATE_TEXTURESTAGE(gl_info->limits.texture_stages, 0); + last = STATE_TEXTURESTAGE(MAX_TEXTURES - 1, WINED3D_HIGHEST_TEXTURE_STATE); + for (i = start; i <= last; ++i) + { + state_table[i].representative = 0; + state_table[i].apply = state_undefined; + } + + start = STATE_TRANSFORM(WINED3DTS_TEXTURE0 + gl_info->limits.texture_stages); + last = STATE_TRANSFORM(WINED3DTS_TEXTURE0 + MAX_TEXTURES - 1); + for (i = start; i <= last; ++i) + { + state_table[i].representative = 0; + state_table[i].apply = state_undefined; + } +} + +static void validate_state_table(struct StateEntry *state_table) +{ + unsigned int i; + + for (i = 0; i < STATE_HIGHEST + 1; ++i) + { + DWORD rep = state_table[i].representative; + if (rep && !state_table[rep].representative) + { + ERR("State %s (%#x) has invalid representative %s (%#x).\n", + debug_d3dstate(i), i, debug_d3dstate(rep), rep); + state_table[i].representative = 0; + } + } +} + HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_multistate_funcs, const struct wined3d_gl_info *gl_info, const struct StateEntryTemplate *vertex, const struct fragment_pipeline *fragment, const struct StateEntryTemplate *misc) @@ -5824,6 +5743,9 @@ HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_ } } + prune_invalid_states(StateTable, gl_info); + validate_state_table(StateTable); + return WINED3D_OK; out_of_mem: diff --git a/reactos/dll/directx/wine/wined3d/surface.c b/reactos/dll/directx/wine/wined3d/surface.c index 8dcc6915bbf..d17d35cc16d 100644 --- a/reactos/dll/directx/wine/wined3d/surface.c +++ b/reactos/dll/directx/wine/wined3d/surface.c @@ -1253,6 +1253,37 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb) TRACE("Updated target %d\n", This->texture_target); } +/* Context activation is done by the caller. */ +void surface_prepare_texture(IWineD3DSurfaceImpl *surface, BOOL srgb) +{ + DWORD alloc_flag = srgb ? SFLAG_SRGBALLOCATED : SFLAG_ALLOCATED; + GLenum format, internal, type; + GLsizei width, height; + CONVERT_TYPES convert; + int bpp; + + if (surface->Flags & alloc_flag) return; + + d3dfmt_get_conv(surface, TRUE, TRUE, &format, &internal, &type, &convert, &bpp, srgb); + if(convert != NO_CONVERSION) surface->Flags |= SFLAG_CONVERTED; + else surface->Flags &= ~SFLAG_CONVERTED; + + if ((surface->Flags & SFLAG_NONPOW2) && !(surface->Flags & SFLAG_OVERSIZE)) + { + width = surface->pow2Width; + height = surface->pow2Height; + } + else + { + width = surface->glRect.right - surface->glRect.left; + height = surface->glRect.bottom - surface->glRect.top; + } + + surface_bind_and_dirtify(surface, srgb); + surface_allocate_surface(surface, internal, width, height, format, type); + surface->Flags |= alloc_flag; +} + static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This) { IWineD3DDeviceImpl *device = This->resource.device; @@ -1822,7 +1853,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ * in which the main render target uses p8. Some games like GTA Vice City use P8 for texturing which * conflicts with this. */ - if (!(gl_info->supported[EXT_PALETTED_TEXTURE] || (gl_info->supported[ARB_FRAGMENT_PROGRAM] + if (!(gl_info->supported[EXT_PALETTED_TEXTURE] || (device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup) && device->render_targets && This == (IWineD3DSurfaceImpl*)device->render_targets[0])) || colorkey_active || !use_texturing) { @@ -1836,7 +1867,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ *convert = CONVERT_PALETTED; } } - else if (!gl_info->supported[EXT_PALETTED_TEXTURE] && gl_info->supported[ARB_FRAGMENT_PROGRAM]) + else if (!gl_info->supported[EXT_PALETTED_TEXTURE] && device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup)) { *format = GL_ALPHA; *type = GL_UNSIGNED_BYTE; @@ -2553,34 +2584,10 @@ static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES conve * The 8bit pixel data will be used as an index in this palette texture to retrieve the final color. */ TRACE("Using fragment shaders for emulating 8-bit paletted texture support\n"); + device->blitter->set_shader((IWineD3DDevice *) device, This->resource.format_desc, + This->texture_target, This->pow2Width, This->pow2Height); + ENTER_GL(); - - /* Create the fragment program if we don't have it */ - if(!device->paletteConversionShader) - { - const char *fragment_palette_conversion = - "!!ARBfp1.0\n" - "TEMP index;\n" - /* { 255/256, 0.5/255*255/256, 0, 0 } */ - "PARAM constants = { 0.996, 0.00195, 0, 0 };\n" - /* The alpha-component contains the palette index */ - "TEX index, fragment.texcoord[0], texture[0], 2D;\n" - /* Scale the index by 255/256 and add a bias of '0.5' in order to sample in the middle */ - "MAD index.a, index.a, constants.x, constants.y;\n" - /* Use the alpha-component as an index in the palette to get the final color */ - "TEX result.color, index.a, texture[1], 1D;\n" - "END"; - - glEnable(GL_FRAGMENT_PROGRAM_ARB); - GL_EXTCALL(glGenProgramsARB(1, &device->paletteConversionShader)); - GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, device->paletteConversionShader)); - GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(fragment_palette_conversion), fragment_palette_conversion)); - glDisable(GL_FRAGMENT_PROGRAM_ARB); - } - - glEnable(GL_FRAGMENT_PROGRAM_ARB); - GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, device->paletteConversionShader)); - GL_EXTCALL(glActiveTextureARB(GL_TEXTURE1)); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); @@ -2594,7 +2601,6 @@ static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES conve /* Rebind the texture because it isn't bound anymore */ glBindTexture(This->texture_target, This->texture_name); - LEAVE_GL(); } } @@ -2700,7 +2706,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadTexture(IWineD3DSurface *iface, BO static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL srgb) { /* TODO: check for locks */ IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; - IWineD3DDeviceImpl *device = This->resource.device; IWineD3DBaseTexture *baseTexture = NULL; TRACE("(%p)Checking to see if the container is a base texture\n", This); @@ -2711,13 +2716,11 @@ static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL } else { - struct wined3d_context *context = NULL; GLuint *name; TRACE("(%p) : Binding surface\n", This); name = srgb ? &This->texture_name_srgb : &This->texture_name; - if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD); ENTER_GL(); @@ -2751,8 +2754,6 @@ static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL checkGLcall("glBindTexture"); LEAVE_GL(); - - if (context) context_release(context); } } @@ -3447,6 +3448,9 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine } LEAVE_GL(); + + wglFlush(); /* Flush to ensure ordering across contexts. */ + context_release(context); /* The texture is now most up to date - If the surface is a render target and has a drawable, this @@ -3921,9 +3925,7 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const /* Leave the opengl state valid for blitting */ myDevice->blitter->unset_shader((IWineD3DDevice *) myDevice); - /* Flush in case the drawable is used by multiple GL contexts */ - if(dstSwapchain && (This == (IWineD3DSurfaceImpl *) dstSwapchain->frontBuffer || dstSwapchain->num_contexts >= 2)) - wglFlush(); + wglFlush(); /* Flush to ensure ordering across contexts. */ context_release(context); @@ -4552,7 +4554,11 @@ void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *co else context_bind_fbo(context, GL_FRAMEBUFFER, NULL); LEAVE_GL(); - } else { + + wglFlush(); /* Flush to ensure ordering across contexts. */ + } + else + { FIXME("No up to date depth stencil location\n"); } } else if (location == SFLAG_DS_ONSCREEN) { @@ -4569,7 +4575,11 @@ void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *co if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER, &context->current_fbo->id); LEAVE_GL(); - } else { + + wglFlush(); /* Flush to ensure ordering across contexts. */ + } + else + { FIXME("No up to date depth stencil location\n"); } } else { @@ -4656,11 +4666,10 @@ static inline void cube_coords_float(const RECT *r, UINT w, UINT h, struct float static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT *rect_in) { IWineD3DDeviceImpl *device = This->resource.device; + IWineD3DBaseTextureImpl *texture; struct wined3d_context *context; struct coords coords[4]; RECT rect; - IWineD3DSwapChain *swapchain; - IWineD3DBaseTexture *texture; GLenum bind_target; struct float_rect f; @@ -4802,25 +4811,16 @@ static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT LEAVE_GL(); - if(SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface*)This, &IID_IWineD3DSwapChain, (void **) &swapchain))) - { - /* Make sure to flush the buffers. This is needed in apps like Red Alert II and Tiberian SUN that use multiple WGL contexts. */ - if(((IWineD3DSwapChainImpl*)swapchain)->frontBuffer == (IWineD3DSurface*)This || - ((IWineD3DSwapChainImpl*)swapchain)->num_contexts >= 2) - wglFlush(); + wglFlush(); /* Flush to ensure ordering across contexts. */ - IWineD3DSwapChain_Release(swapchain); - } else { - /* We changed the filtering settings on the texture. Inform the container about this to get the filters - * reset properly next draw - */ - if(SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface*)This, &IID_IWineD3DBaseTexture, (void **) &texture))) - { - ((IWineD3DBaseTextureImpl *) texture)->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT; - ((IWineD3DBaseTextureImpl *) texture)->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; - ((IWineD3DBaseTextureImpl *) texture)->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE; - IWineD3DBaseTexture_Release(texture); - } + /* We changed the filtering settings on the texture. Inform the + * container about this to get the filters reset properly next draw. */ + if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)This, &IID_IWineD3DBaseTexture, (void **)&texture))) + { + texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT; + texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT; + texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE; + IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture); } context_release(context); @@ -4977,7 +4977,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D { /* Upload from system memory */ BOOL srgb = flag == SFLAG_INSRGBTEX; - DWORD alloc_flag = srgb ? SFLAG_SRGBALLOCATED : SFLAG_ALLOCATED; struct wined3d_context *context = NULL; d3dfmt_get_conv(This, TRUE /* We need color keying */, TRUE /* We will use textures */, @@ -5004,6 +5003,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D } if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD); + + surface_prepare_texture(This, srgb); surface_bind_and_dirtify(This, srgb); if(This->CKeyFlags & WINEDDSD_CKSRCBLT) { @@ -5037,17 +5038,13 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D return WINED3DERR_OUTOFVIDEOMEMORY; } d3dfmt_convert_surface(This->resource.allocatedMemory, mem, pitch, width, height, outpitch, convert, This); - - This->Flags |= SFLAG_CONVERTED; } else if (This->resource.format_desc->format == WINED3DFMT_P8_UINT - && (gl_info->supported[EXT_PALETTED_TEXTURE] || gl_info->supported[ARB_FRAGMENT_PROGRAM])) + && (gl_info->supported[EXT_PALETTED_TEXTURE] || device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup))) { d3dfmt_p8_upload_palette(iface, convert); - This->Flags &= ~SFLAG_CONVERTED; mem = This->resource.allocatedMemory; } else { - This->Flags &= ~SFLAG_CONVERTED; mem = This->resource.allocatedMemory; } @@ -5058,10 +5055,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D if ((This->Flags & SFLAG_NONPOW2) && !(This->Flags & SFLAG_OVERSIZE)) { TRACE("non power of two support\n"); - if(!(This->Flags & alloc_flag)) { - surface_allocate_surface(This, internal, This->pow2Width, This->pow2Height, format, type); - This->Flags |= alloc_flag; - } if (mem || (This->Flags & SFLAG_PBO)) { surface_upload_data(This, internal, This->currentDesc.Width, This->currentDesc.Height, format, type, mem); } @@ -5069,10 +5062,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D /* When making the realloc conditional, keep in mind that GL_APPLE_client_storage may be in use, and This->resource.allocatedMemory * changed. So also keep track of memory changes. In this case the texture has to be reallocated */ - if(!(This->Flags & alloc_flag)) { - surface_allocate_surface(This, internal, This->glRect.right - This->glRect.left, This->glRect.bottom - This->glRect.top, format, type); - This->Flags |= alloc_flag; - } if (mem || (This->Flags & SFLAG_PBO)) { surface_upload_data(This, internal, This->glRect.right - This->glRect.left, This->glRect.bottom - This->glRect.top, format, type, mem); } diff --git a/reactos/dll/directx/wine/wined3d/swapchain.c b/reactos/dll/directx/wine/wined3d/swapchain.c index 6493704014b..cbdb961f705 100644 --- a/reactos/dll/directx/wine/wined3d/swapchain.c +++ b/reactos/dll/directx/wine/wined3d/swapchain.c @@ -217,6 +217,8 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO unsigned int sync; int retval; + IWineD3DSwapChain_SetDestWindowOverride(iface, hDestWindowOverride); + context = context_acquire(This->device, This->backBuffer[0], CTXUSAGE_RESOURCELOAD); /* Render the cursor onto the back buffer, using our nifty directdraw blitting code :-) */ @@ -272,12 +274,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO IWineD3DSurface_BltFast(This->backBuffer[0], 0, 0, This->device->logo_surface, NULL, WINEDDBLTFAST_SRCCOLORKEY); } - TRACE("presetting HDC %p\n", This->context[0]->hdc); - - /* Don't call checkGLcall, as glGetError is not applicable here */ - if (hDestWindowOverride && This->win_handle != hDestWindowOverride) { - IWineD3DSwapChain_SetDestWindowOverride(iface, hDestWindowOverride); - } + TRACE("Presenting HDC %p.\n", context->hdc); render_to_fbo = This->render_to_fbo; @@ -343,7 +340,8 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO swapchain_blit(This, context, &src_rect, &dst_rect); } - SwapBuffers(This->context[0]->hdc); /* TODO: cycle through the swapchain buffers */ + if (This->num_contexts > 1) wglFinish(); + SwapBuffers(context->hdc); /* TODO: cycle through the swapchain buffers */ TRACE("SwapBuffers called, Starting new frame\n"); /* FPS support */ @@ -521,7 +519,7 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_SetDestWindowOverride(IWineD3DSwapCh WINED3DLOCKED_RECT r; BYTE *mem; - if(window == This->win_handle) return WINED3D_OK; + if (!window || window == This->win_handle) return WINED3D_OK; TRACE("Performing dest override of swapchain %p from window %p to %p\n", This, This->win_handle, window); if (This->context[0] == This->device->contexts[0]) @@ -913,10 +911,15 @@ err: HeapFree(GetProcessHeap(), 0, swapchain->backBuffer); } - if (swapchain->context && swapchain->context[0]) + if (swapchain->context) { - context_release(swapchain->context[0]); - context_destroy(device, swapchain->context[0]); + if (swapchain->context[0]) + { + context_release(swapchain->context[0]); + context_destroy(device, swapchain->context[0]); + swapchain->num_contexts = 0; + } + HeapFree(GetProcessHeap(), 0, swapchain->context); } if (swapchain->frontBuffer) IWineD3DSurface_Release(swapchain->frontBuffer); diff --git a/reactos/dll/directx/wine/wined3d/utils.c b/reactos/dll/directx/wine/wined3d/utils.c index c1e921da976..2ff16752c33 100644 --- a/reactos/dll/directx/wine/wined3d/utils.c +++ b/reactos/dll/directx/wine/wined3d/utils.c @@ -387,7 +387,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = { GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R16G16_UNORM, GL_RGB16_EXT, GL_RGB16_EXT, GL_RGBA16_EXT, + {WINED3DFMT_R16G16_UNORM, GL_RGB16, GL_RGB16, GL_RGBA16, GL_RGB, GL_UNSIGNED_SHORT, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, @@ -395,7 +395,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = { GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_R16G16B16A16_UNORM, GL_RGBA16_EXT, GL_RGBA16_EXT, 0, + {WINED3DFMT_R16G16B16A16_UNORM, GL_RGBA16, GL_RGBA16, 0, GL_RGBA, GL_UNSIGNED_SHORT, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET, WINED3D_GL_EXT_NONE}, @@ -445,7 +445,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = { GL_RGBA, GL_BYTE, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, NV_TEXTURE_SHADER}, - {WINED3DFMT_R16G16_SNORM, GL_RGB16_EXT, GL_RGB16_EXT, 0, + {WINED3DFMT_R16G16_SNORM, GL_RGB16, GL_RGB16, 0, GL_BGR, GL_UNSIGNED_SHORT, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, @@ -506,7 +506,7 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = { GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH, ARB_DEPTH_TEXTURE}, - {WINED3DFMT_L16_UNORM, GL_LUMINANCE16_EXT, GL_LUMINANCE16_EXT, 0, + {WINED3DFMT_L16_UNORM, GL_LUMINANCE16, GL_LUMINANCE16, 0, GL_LUMINANCE, GL_UNSIGNED_SHORT, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, @@ -950,7 +950,7 @@ static void init_format_filter_info(struct wined3d_gl_info *gl_info, enum wined3 if(wined3d_settings.offscreen_rendering_mode != ORM_FBO) { WARN("No FBO support, or no FBO ORM, guessing filter info from GL caps\n"); - if (vendor == VENDOR_NVIDIA && gl_info->supported[ARB_TEXTURE_FLOAT]) + if (vendor == HW_VENDOR_NVIDIA && gl_info->supported[ARB_TEXTURE_FLOAT]) { TRACE("Nvidia card with texture_float support: Assuming float16 blending\n"); filtered = TRUE; @@ -1088,17 +1088,20 @@ static void apply_format_fixups(struct wined3d_gl_info *gl_info) if (!gl_info->supported[APPLE_YCBCR_422]) { idx = getFmtIdx(WINED3DFMT_YUY2); - gl_info->gl_formats[idx].color_fixup = create_yuv_fixup_desc(YUV_FIXUP_YUY2); + gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YUY2); idx = getFmtIdx(WINED3DFMT_UYVY); - gl_info->gl_formats[idx].color_fixup = create_yuv_fixup_desc(YUV_FIXUP_UYVY); + gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_UYVY); } idx = getFmtIdx(WINED3DFMT_YV12); gl_info->gl_formats[idx].heightscale = 1.5f; - gl_info->gl_formats[idx].color_fixup = create_yuv_fixup_desc(YUV_FIXUP_YV12); + gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YV12); - if (gl_info->supported[EXT_VERTEX_ARRAY_BGRA]) + idx = getFmtIdx(WINED3DFMT_P8_UINT); + gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_P8); + + if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA]) { idx = getFmtIdx(WINED3DFMT_B8G8R8A8_UNORM); gl_info->gl_formats[idx].gl_vtx_format = GL_BGRA; @@ -1786,6 +1789,51 @@ const char* debug_d3dtstype(WINED3DTRANSFORMSTATETYPE tstype) { } } +const char *debug_d3dstate(DWORD state) +{ + if (STATE_IS_RENDER(state)) + return wine_dbg_sprintf("STATE_RENDER(%s)", debug_d3drenderstate(state - STATE_RENDER(0))); + if (STATE_IS_TEXTURESTAGE(state)) + { + DWORD texture_stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1); + DWORD texture_state = state - STATE_TEXTURESTAGE(texture_stage, 0); + return wine_dbg_sprintf("STATE_TEXTURESTAGE(%#x, %s)", + texture_stage, debug_d3dtexturestate(texture_state)); + } + if (STATE_IS_SAMPLER(state)) + return wine_dbg_sprintf("STATE_SAMPLER(%#x)", state - STATE_SAMPLER(0)); + if (STATE_IS_PIXELSHADER(state)) + return "STATE_PIXELSHADER"; + if (STATE_IS_TRANSFORM(state)) + return wine_dbg_sprintf("STATE_TRANSFORM(%s)", debug_d3dtstype(state - STATE_TRANSFORM(0))); + if (STATE_IS_STREAMSRC(state)) + return "STATE_STREAMSRC"; + if (STATE_IS_INDEXBUFFER(state)) + return "STATE_INDEXBUFFER"; + if (STATE_IS_VDECL(state)) + return "STATE_VDECL"; + if (STATE_IS_VSHADER(state)) + return "STATE_VSHADER"; + if (STATE_IS_VIEWPORT(state)) + return "STATE_VIEWPORT"; + if (STATE_IS_VERTEXSHADERCONSTANT(state)) + return "STATE_VERTEXSHADERCONSTANT"; + if (STATE_IS_PIXELSHADERCONSTANT(state)) + return "STATE_PIXELSHADERCONSTANT"; + if (STATE_IS_ACTIVELIGHT(state)) + return wine_dbg_sprintf("STATE_ACTIVELIGHT(%#x)", state - STATE_ACTIVELIGHT(0)); + if (STATE_IS_SCISSORRECT(state)) + return "STATE_SCISSORRECT"; + if (STATE_IS_CLIPPLANE(state)) + return wine_dbg_sprintf("STATE_CLIPPLANE(%#x)", state - STATE_CLIPPLANE(0)); + if (STATE_IS_MATERIAL(state)) + return "STATE_MATERIAL"; + if (STATE_IS_FRONTFACE(state)) + return "STATE_FRONTFACE"; + + return wine_dbg_sprintf("UNKNOWN_STATE(%#x)", state); +} + const char* debug_d3dpool(WINED3DPOOL Pool) { switch (Pool) { #define POOL_TO_STR(p) case p: return #p @@ -1868,8 +1916,8 @@ static const char *debug_fixup_channel_source(enum fixup_channel_source source) WINED3D_TO_STR(CHANNEL_SOURCE_Y); WINED3D_TO_STR(CHANNEL_SOURCE_Z); WINED3D_TO_STR(CHANNEL_SOURCE_W); - WINED3D_TO_STR(CHANNEL_SOURCE_YUV0); - WINED3D_TO_STR(CHANNEL_SOURCE_YUV1); + WINED3D_TO_STR(CHANNEL_SOURCE_COMPLEX0); + WINED3D_TO_STR(CHANNEL_SOURCE_COMPLEX1); #undef WINED3D_TO_STR default: FIXME("Unrecognized fixup_channel_source %#x\n", source); @@ -1877,26 +1925,27 @@ static const char *debug_fixup_channel_source(enum fixup_channel_source source) } } -static const char *debug_yuv_fixup(enum yuv_fixup yuv_fixup) +static const char *debug_complex_fixup(enum complex_fixup fixup) { - switch(yuv_fixup) + switch(fixup) { #define WINED3D_TO_STR(x) case x: return #x - WINED3D_TO_STR(YUV_FIXUP_YUY2); - WINED3D_TO_STR(YUV_FIXUP_UYVY); - WINED3D_TO_STR(YUV_FIXUP_YV12); + WINED3D_TO_STR(COMPLEX_FIXUP_YUY2); + WINED3D_TO_STR(COMPLEX_FIXUP_UYVY); + WINED3D_TO_STR(COMPLEX_FIXUP_YV12); + WINED3D_TO_STR(COMPLEX_FIXUP_P8); #undef WINED3D_TO_STR default: - FIXME("Unrecognized YUV fixup %#x\n", yuv_fixup); + FIXME("Unrecognized complex fixup %#x\n", fixup); return "unrecognized"; } } void dump_color_fixup_desc(struct color_fixup_desc fixup) { - if (is_yuv_fixup(fixup)) + if (is_complex_fixup(fixup)) { - TRACE("\tYUV: %s\n", debug_yuv_fixup(get_yuv_fixup(fixup))); + TRACE("\tComplex: %s\n", debug_complex_fixup(get_complex_fixup(fixup))); return; } @@ -2795,40 +2844,3 @@ void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected, else if (gl_info->supported[ATI_FRAGMENT_SHADER]) *ps_selected = SHADER_ATI; else *ps_selected = SHADER_NONE; } - -const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter, WINED3DDEVTYPE device_type) -{ - int vs_selected_mode, ps_selected_mode; - - select_shader_mode(&adapter->gl_info, &ps_selected_mode, &vs_selected_mode); - if (vs_selected_mode == SHADER_GLSL || ps_selected_mode == SHADER_GLSL) return &glsl_shader_backend; - if (vs_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_ARB) return &arb_program_shader_backend; - return &none_shader_backend; -} - -const struct fragment_pipeline *select_fragment_implementation(struct wined3d_adapter *adapter, - WINED3DDEVTYPE device_type) -{ - const struct wined3d_gl_info *gl_info = &adapter->gl_info; - int vs_selected_mode, ps_selected_mode; - - select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode); - if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL) - && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_fragment_pipeline; - else if (ps_selected_mode == SHADER_ATI) return &atifs_fragment_pipeline; - else if (gl_info->supported[NV_REGISTER_COMBINERS] - && gl_info->supported[NV_TEXTURE_SHADER2]) return &nvts_fragment_pipeline; - else if (gl_info->supported[NV_REGISTER_COMBINERS]) return &nvrc_fragment_pipeline; - else return &ffp_fragment_pipeline; -} - -const struct blit_shader *select_blit_implementation(struct wined3d_adapter *adapter, WINED3DDEVTYPE device_type) -{ - const struct wined3d_gl_info *gl_info = &adapter->gl_info; - int vs_selected_mode, ps_selected_mode; - - select_shader_mode(gl_info, &ps_selected_mode, &vs_selected_mode); - if ((ps_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_GLSL) - && gl_info->supported[ARB_FRAGMENT_PROGRAM]) return &arbfp_blit; - else return &ffp_blit; -} diff --git a/reactos/dll/directx/wine/wined3d/wined3d.rbuild b/reactos/dll/directx/wine/wined3d/wined3d.rbuild index 7262e66e4b5..5a42ff6064a 100644 --- a/reactos/dll/directx/wine/wined3d/wined3d.rbuild +++ b/reactos/dll/directx/wine/wined3d/wined3d.rbuild @@ -16,7 +16,6 @@ ati_fragment_shader.c arb_program_shader.c - baseshader.c basetexture.c buffer.c clipper.c diff --git a/reactos/dll/directx/wine/wined3d/wined3d_gl.h b/reactos/dll/directx/wine/wined3d/wined3d_gl.h index d6d9794933f..f8097d65cb9 100644 --- a/reactos/dll/directx/wine/wined3d/wined3d_gl.h +++ b/reactos/dll/directx/wine/wined3d/wined3d_gl.h @@ -75,6 +75,9 @@ typedef double GLclampd; typedef void GLvoid; typedef ptrdiff_t GLintptr; typedef ptrdiff_t GLsizeiptr; +typedef INT64 GLint64; +typedef UINT64 GLuint64; +typedef struct __GLsync *GLsync; /* Booleans */ #define GL_FALSE 0x0 @@ -804,6 +807,197 @@ typedef ptrdiff_t GLsizeiptr; #define GL_SAMPLE_COVERAGE_INVERT 0x80AB #define GL_MULTISAMPLE_BIT 0x20000000 +/* GL_VERSION_2_0 */ +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882a +#define GL_DRAW_BUFFER6 0x882b +#define GL_DRAW_BUFFER7 0x882c +#define GL_DRAW_BUFFER8 0x882d +#define GL_DRAW_BUFFER9 0x882e +#define GL_DRAW_BUFFER10 0x882f +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883d +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886a +#define GL_MAX_TEXTURE_COORDS 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8b30 +#define GL_VERTEX_SHADER 0x8b31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8b49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8b4a +#define GL_MAX_VARYING_FLOATS 0x8b4b +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8b4c +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8b4d +#define GL_SHADER_TYPE 0x8b4f +#define GL_FLOAT_VEC2 0x8b50 +#define GL_FLOAT_VEC3 0x8b51 +#define GL_FLOAT_VEC4 0x8b52 +#define GL_INT_VEC2 0x8b53 +#define GL_INT_VEC3 0x8b54 +#define GL_INT_VEC4 0x8b55 +#define GL_BOOL 0x8b56 +#define GL_BOOL_VEC2 0x8b57 +#define GL_BOOL_VEC3 0x8b58 +#define GL_BOOL_VEC4 0x8b59 +#define GL_FLOAT_MAT2 0x8b5a +#define GL_FLOAT_MAT3 0x8b5b +#define GL_FLOAT_MAT4 0x8b5c +#define GL_SAMPLER_1D 0x8b5d +#define GL_SAMPLER_2D 0x8b5e +#define GL_SAMPLER_3D 0x8b5f +#define GL_SAMPLER_CUBE 0x8b60 +#define GL_SAMPLER_1D_SHADOW 0x8b61 +#define GL_SAMPLER_2D_SHADOW 0x8b62 +#define GL_DELETE_STATUS 0x8b80 +#define GL_COMPILE_STATUS 0x8b81 +#define GL_LINK_STATUS 0x8b82 +#define GL_VALIDATE_STATUS 0x8b83 +#define GL_INFO_LOG_LENGTH 0x8b84 +#define GL_ATTACHED_SHADERS 0x8b85 +#define GL_ACTIVE_UNIFORMS 0x8b86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8b87 +#define GL_SHADER_SOURCE_LENGTH 0x8b88 +#define GL_ACTIVE_ATTRIBUTES 0x8b89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8b8a +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8b8b +#define GL_SHADING_LANGUAGE_VERSION 0x8b8c +#define GL_CURRENT_PROGRAM 0x8b8d +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8ca0 +#define GL_LOWER_LEFT 0x8ca1 +#define GL_UPPER_LEFT 0x8ca2 +#define GL_STENCIL_BACK_REF 0x8ca3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8ca4 +#define GL_STENCIL_BACK_WRITEMASK 0x8ca5 +typedef char GLchar; +#endif +typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha); +typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSPROC)(GLsizei n, const GLenum *bufs); +typedef void (WINE_GLAPI *PGLFNSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (WINE_GLAPI *PGLFNSTENCILFUNCSEPARATEPROC)(GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +typedef void (WINE_GLAPI *PGLFNSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask); +typedef void (WINE_GLAPI *PGLFNATTACHSHADERPROC)(GLuint program, GLuint shader); +typedef void (WINE_GLAPI *PGLFNBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar *name); +typedef void (WINE_GLAPI *PGLFNCOMPILESHADERPROC)(GLuint shader); +typedef GLuint (WINE_GLAPI *PGLFNCREATEPROGRAMPROC)(void); +typedef GLuint (WINE_GLAPI *PGLFNCREATESHADERPROC)(GLenum type); +typedef void (WINE_GLAPI *PGLFNDELETEPROGRAMPROC)(GLuint program); +typedef void (WINE_GLAPI *PGLFNDELETESHADERPROC)(GLuint shader); +typedef void (WINE_GLAPI *PGLFNDETACHSHADERPROC)(GLuint program, GLuint shader); +typedef void (WINE_GLAPI *PGLFNDISABLEVERTEXATTRIBARRAYPROC)(GLuint index); +typedef void (WINE_GLAPI *PGLFNENABLEVERTEXATTRIBARRAYPROC)(GLuint index); +typedef void (WINE_GLAPI *PGLFNGETACTIVEATTRIBPROC)(GLuint program, + GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (WINE_GLAPI *PGLFNGETACTIVEUNIFORMPROC)(GLuint program, + GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (WINE_GLAPI *PGLFNGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); +typedef GLint (WINE_GLAPI *PGLFNGETATTRIBLOCATIONPROC)(GLuint program, const GLchar *name); +typedef void (WINE_GLAPI *PGLFNGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint *params); +typedef void (WINE_GLAPI *PGLFNGETPROGRAMINFOLOGPROC)(GLuint program, + GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (WINE_GLAPI *PGLFNGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint *params); +typedef void (WINE_GLAPI *PGLFNGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (WINE_GLAPI *PGLFNGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef GLint (WINE_GLAPI *PGLFNGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar *name); +typedef void (WINE_GLAPI *PGLFNGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat *params); +typedef void (WINE_GLAPI *PGLFNGETUNIFORMIVPROC)(GLuint program, GLint location, GLint *params); +typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble *params); +typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat *params); +typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint *params); +typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (WINE_GLAPI *PGLFNISPROGRAMPROC)(GLuint program); +typedef GLboolean (WINE_GLAPI *PGLFNISSHADERPROC)(GLuint shader); +typedef void (WINE_GLAPI *PGLFNLINKPROGRAMPROC)(GLuint program); +typedef void (WINE_GLAPI *PGLFNSHADERSOURCEPROC)(GLuint shader, + GLsizei count, const GLchar* *string, const GLint *length); +typedef void (WINE_GLAPI *PGLFNUSEPROGRAMPROC)(GLuint program); +typedef void (WINE_GLAPI *PGLFNUNIFORM1FPROC)(GLint location, GLfloat v0); +typedef void (WINE_GLAPI *PGLFNUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1); +typedef void (WINE_GLAPI *PGLFNUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (WINE_GLAPI *PGLFNUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (WINE_GLAPI *PGLFNUNIFORM1IPROC)(GLint location, GLint v0); +typedef void (WINE_GLAPI *PGLFNUNIFORM2IPROC)(GLint location, GLint v0, GLint v1); +typedef void (WINE_GLAPI *PGLFNUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2); +typedef void (WINE_GLAPI *PGLFNUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (WINE_GLAPI *PGLFNUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat *value); +typedef void (WINE_GLAPI *PGLFNUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat *value); +typedef void (WINE_GLAPI *PGLFNUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat *value); +typedef void (WINE_GLAPI *PGLFNUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat *value); +typedef void (WINE_GLAPI *PGLFNUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint *value); +typedef void (WINE_GLAPI *PGLFNUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint *value); +typedef void (WINE_GLAPI *PGLFNUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint *value); +typedef void (WINE_GLAPI *PGLFNUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint *value); +typedef void (WINE_GLAPI *PGLFNUNIFORMMATRIX2FVPROC)(GLint location, + GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (WINE_GLAPI *PGLFNUNIFORMMATRIX3FVPROC)(GLint location, + GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (WINE_GLAPI *PGLFNUNIFORMMATRIX4FVPROC)(GLint location, + GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (WINE_GLAPI *PGLFNVALIDATEPROGRAMPROC)(GLuint program); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DPROC)(GLuint index, GLdouble x); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FPROC)(GLuint index, GLfloat x); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SPROC)(GLuint index, GLshort x); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SVPROC)(GLuint index, const GLshort *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SVPROC)(GLuint index, const GLshort *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SVPROC)(GLuint index, const GLshort *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NIVPROC)(GLuint index, const GLint *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4IVPROC)(GLuint index, const GLint *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SVPROC)(GLuint index, const GLshort *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4USVPROC)(GLuint index, const GLushort *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBPOINTERPROC)(GLuint index, + GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); + void (WINE_GLAPI *glAccum)(GLenum op, GLfloat value) DECLSPEC_HIDDEN; void (WINE_GLAPI *glAlphaFunc)(GLenum func, GLclampf ref) DECLSPEC_HIDDEN; GLboolean (WINE_GLAPI *glAreTexturesResident)(GLsizei n, const GLuint *textures, GLboolean *residences) DECLSPEC_HIDDEN; @@ -1524,68 +1718,273 @@ BOOL (WINAPI *pwglShareLists)(HGLRC, HGLRC) DECLSPEC_HIDDEN; USE_WGL_FUNC(wglMakeCurrent) \ USE_WGL_FUNC(wglShareLists) +/* OpenGL extensions. */ +typedef enum wined3d_gl_extension +{ + WINED3D_GL_EXT_NONE, -/**************************************************** - * OpenGL Extensions (EXT and ARB) - * #defines and functions pointer - ****************************************************/ + /* APPLE */ + APPLE_CLIENT_STORAGE, + APPLE_FENCE, + APPLE_FLOAT_PIXELS, + APPLE_FLUSH_BUFFER_RANGE, + APPLE_FLUSH_RENDER, + APPLE_YCBCR_422, + /* ARB */ + ARB_COLOR_BUFFER_FLOAT, + ARB_DEPTH_BUFFER_FLOAT, + ARB_DEPTH_CLAMP, + ARB_DEPTH_TEXTURE, + ARB_DRAW_BUFFERS, + ARB_FRAGMENT_PROGRAM, + ARB_FRAGMENT_SHADER, + ARB_FRAMEBUFFER_OBJECT, + ARB_GEOMETRY_SHADER4, + ARB_HALF_FLOAT_PIXEL, + ARB_HALF_FLOAT_VERTEX, + ARB_IMAGING, + ARB_MAP_BUFFER_RANGE, + ARB_MULTISAMPLE, + ARB_MULTITEXTURE, + ARB_OCCLUSION_QUERY, + ARB_PIXEL_BUFFER_OBJECT, + ARB_POINT_PARAMETERS, + ARB_POINT_SPRITE, + ARB_PROVOKING_VERTEX, + ARB_SHADER_OBJECTS, + ARB_SHADER_TEXTURE_LOD, + ARB_SHADING_LANGUAGE_100, + ARB_SYNC, + ARB_TEXTURE_BORDER_CLAMP, + ARB_TEXTURE_COMPRESSION, + ARB_TEXTURE_CUBE_MAP, + ARB_TEXTURE_ENV_ADD, + ARB_TEXTURE_ENV_COMBINE, + ARB_TEXTURE_ENV_DOT3, + ARB_TEXTURE_FLOAT, + ARB_TEXTURE_MIRRORED_REPEAT, + ARB_TEXTURE_NON_POWER_OF_TWO, + ARB_TEXTURE_RECTANGLE, + ARB_TEXTURE_RG, + ARB_VERTEX_ARRAY_BGRA, + ARB_VERTEX_BLEND, + ARB_VERTEX_BUFFER_OBJECT, + ARB_VERTEX_PROGRAM, + ARB_VERTEX_SHADER, + /* ATI */ + ATI_FRAGMENT_SHADER, + ATI_SEPARATE_STENCIL, + ATI_TEXTURE_COMPRESSION_3DC, + ATI_TEXTURE_ENV_COMBINE3, + ATI_TEXTURE_MIRROR_ONCE, + /* EXT */ + EXT_BLEND_COLOR, + EXT_BLEND_EQUATION_SEPARATE, + EXT_BLEND_FUNC_SEPARATE, + EXT_BLEND_MINMAX, + EXT_FOG_COORD, + EXT_FRAMEBUFFER_BLIT, + EXT_FRAMEBUFFER_MULTISAMPLE, + EXT_FRAMEBUFFER_OBJECT, + EXT_GPU_PROGRAM_PARAMETERS, + EXT_GPU_SHADER4, + EXT_PACKED_DEPTH_STENCIL, + EXT_PALETTED_TEXTURE, + EXT_POINT_PARAMETERS, + EXT_PROVOKING_VERTEX, + EXT_SECONDARY_COLOR, + EXT_STENCIL_TWO_SIDE, + EXT_STENCIL_WRAP, + EXT_TEXTURE3D, + EXT_TEXTURE_COMPRESSION_RGTC, + EXT_TEXTURE_COMPRESSION_S3TC, + EXT_TEXTURE_ENV_ADD, + EXT_TEXTURE_ENV_COMBINE, + EXT_TEXTURE_ENV_DOT3, + EXT_TEXTURE_FILTER_ANISOTROPIC, + EXT_TEXTURE_LOD_BIAS, + EXT_TEXTURE_SRGB, + EXT_VERTEX_ARRAY_BGRA, + /* NVIDIA */ + NV_DEPTH_CLAMP, + NV_FENCE, + NV_FOG_DISTANCE, + NV_FRAGMENT_PROGRAM, + NV_FRAGMENT_PROGRAM2, + NV_FRAGMENT_PROGRAM_OPTION, + NV_HALF_FLOAT, + NV_LIGHT_MAX_EXPONENT, + NV_REGISTER_COMBINERS, + NV_REGISTER_COMBINERS2, + NV_TEXGEN_REFLECTION, + NV_TEXTURE_ENV_COMBINE4, + NV_TEXTURE_SHADER, + NV_TEXTURE_SHADER2, + NV_VERTEX_PROGRAM, + NV_VERTEX_PROGRAM1_1, + NV_VERTEX_PROGRAM2, + NV_VERTEX_PROGRAM2_OPTION, + NV_VERTEX_PROGRAM3, + /* SGI */ + SGIS_GENERATE_MIPMAP, + SGI_VIDEO_SYNC, + /* WGL extensions */ + WGL_ARB_PBUFFER, + WGL_ARB_PIXEL_FORMAT, + WGL_WINE_PIXEL_FORMAT_PASSTHROUGH, + /* Internally used */ + WINE_NORMALIZED_TEXRECT, + + WINED3D_GL_EXT_COUNT, +} GL_SupportedExt; + +/* GL_APPLE_client_storage */ +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85b2 +#endif + +/* GL_APPLE_fence */ +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#define GL_DRAW_PIXELS_APPLE 0x8a0a +#define GL_FENCE_APPLE 0x8a0b +#endif +typedef void (WINE_GLAPI *PGLFNGENFENCESAPPLEPROC)(GLsizei, GLuint *); +typedef void (WINE_GLAPI *PGLFNDELETEFENCESAPPLEPROC)(GLuint, const GLuint *); +typedef void (WINE_GLAPI *PGLFNSETFENCEAPPLEPROC)(GLuint); +typedef GLboolean (WINE_GLAPI *PGLFNTESTFENCEAPPLEPROC)(GLuint); +typedef void (WINE_GLAPI *PGLFNFINISHFENCEAPPLEPROC)(GLuint); +typedef GLboolean (WINE_GLAPI *PGLFNISFENCEAPPLEPROC)(GLuint); +typedef GLboolean (WINE_GLAPI *PGLFNTESTOBJECTAPPLEPROC)(GLenum, GLuint); +typedef void (WINE_GLAPI *PGLFNFINISHOBJECTAPPLEPROC)(GLenum, GLuint); + +/* GL_APPLE_float_pixels */ +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 +#define GL_HALF_APPLE 0x140b +#define GL_COLOR_FLOAT_APPLE 0x8a0f +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881a +#define GL_RGB_FLOAT16_APPLE 0x881b +#define GL_ALPHA_FLOAT16_APPLE 0x881c +#define GL_INTENSITY_FLOAT16_APPLE 0x881d +#define GL_LUMINANCE_FLOAT16_APPLE 0x881e +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881f +#endif + +/* GL_APPLE_flush_buffer_range */ +#ifndef GL_APPLE_flush_buffer_range +#define GL_APPLE_flush_buffer_range 1 +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8a12 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8a13 +typedef void (WINE_GLAPI *PGLFNBUFFERPARAMETERIAPPLE)(GLenum target, GLenum pname, GLint param); +typedef void (WINE_GLAPI *PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE)(GLenum target, GLintptr offset, GLsizeiptr size); +#endif + +/* GL_APPLE_flush_render */ +typedef void (WINE_GLAPI *PGLFNFLUSHRENDERAPPLEPROC)(void); +typedef void (WINE_GLAPI *PGLFNFINISHRENDERAPPLEPROC)(void); + +/* GL_APPLE_ycbcr_422 */ +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#define GL_YCBCR_422_APPLE 0x85b9 +#define UNSIGNED_SHORT_8_8_APPLE 0x85ba +#define UNSIGNED_SHORT_8_8_REV_APPLE 0x85bb +#endif /* GL_ARB_color_buffer_float */ #ifndef GL_ARB_color_buffer_float -#define GL_RGBA_FLOAT_MODE_ARB 0x8820 -#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A -#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B -#define GL_CLAMP_READ_COLOR_ARB 0x891C -#define GL_FIXED_ONLY_ARB 0x891D +#define GL_ARB_color_buffer_float 1 +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891a +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891b +#define GL_CLAMP_READ_COLOR_ARB 0x891c +#define GL_FIXED_ONLY_ARB 0x891d #endif -typedef void (WINE_GLAPI *PGLFNCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +typedef void (WINE_GLAPI *PGLFNCLAMPCOLORARBPROC)(GLenum target, GLenum clamp); /* GL_ARB_depth_buffer_float */ #ifndef GL_ARB_depth_buffer_float #define GL_ARB_depth_buffer_float 1 -#define GL_DEPTH_COMPONENT32F 0x8cac -#define GL_DEPTH32F_STENCIL8 0x8cad -#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8dad +#define GL_DEPTH_COMPONENT32F 0x8cac +#define GL_DEPTH32F_STENCIL8 0x8cad +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8dad #endif /* GL_ARB_depth_clamp */ #ifndef GL_ARB_depth_clamp #define GL_ARB_depth_clamp 1 -#define GL_DEPTH_CLAMP 0x864f +#define GL_DEPTH_CLAMP 0x864f #endif /* GL_ARB_depth_texture */ #ifndef GL_ARB_depth_texture #define GL_ARB_depth_texture 1 -#define GL_DEPTH_COMPONENT16_ARB 0x81A5 -#define GL_DEPTH_COMPONENT24_ARB 0x81A6 -#define GL_DEPTH_COMPONENT32_ARB 0x81A7 -#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A -#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#define GL_DEPTH_COMPONENT16_ARB 0x81a5 +#define GL_DEPTH_COMPONENT24_ARB 0x81a6 +#define GL_DEPTH_COMPONENT32_ARB 0x81a7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884a +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884b #endif /* GL_ARB_draw_buffers */ #ifndef GL_ARB_draw_buffers #define GL_ARB_draw_buffers 1 -#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 -#define GL_DRAW_BUFFER0_ARB 0x8825 -#define GL_DRAW_BUFFER1_ARB 0x8826 -#define GL_DRAW_BUFFER2_ARB 0x8827 -#define GL_DRAW_BUFFER3_ARB 0x8828 -#define GL_DRAW_BUFFER4_ARB 0x8829 -#define GL_DRAW_BUFFER5_ARB 0x882A -#define GL_DRAW_BUFFER6_ARB 0x882B -#define GL_DRAW_BUFFER7_ARB 0x882C -#define GL_DRAW_BUFFER8_ARB 0x882D -#define GL_DRAW_BUFFER9_ARB 0x882E -#define GL_DRAW_BUFFER10_ARB 0x882F -#define GL_DRAW_BUFFER11_ARB 0x8830 -#define GL_DRAW_BUFFER12_ARB 0x8831 -#define GL_DRAW_BUFFER13_ARB 0x8832 -#define GL_DRAW_BUFFER14_ARB 0x8833 -#define GL_DRAW_BUFFER15_ARB 0x8834 +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882a +#define GL_DRAW_BUFFER6_ARB 0x882b +#define GL_DRAW_BUFFER7_ARB 0x882c +#define GL_DRAW_BUFFER8_ARB 0x882d +#define GL_DRAW_BUFFER9_ARB 0x882e +#define GL_DRAW_BUFFER10_ARB 0x882f +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +#endif +typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSARBPROC)(GLsizei n, const GLenum *bufs); + +/* GL_ARB_fragment_program */ +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880a +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880b +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880c +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880d +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880e +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880f +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ +#endif + +/* GL_ARB_fragment_shader */ +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#define GL_FRAGMENT_SHADER_ARB 0x8b30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8b49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8b8b #endif -typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); /* GL_ARB_framebuffer_object */ #ifndef GL_ARB_framebuffer_object @@ -1665,58 +2064,59 @@ typedef void (WINE_GLAPI *PGLFNDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *buf #define GL_DEPTH24_STENCIL8 0x88f0 #define GL_TEXTURE_STENCIL_SIZE 0x88f1 #endif -typedef GLboolean (WINE_GLAPI * PGLFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); -typedef void (WINE_GLAPI * PGLFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); -typedef void (WINE_GLAPI * PGLFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint *renderbuffers); -typedef void (WINE_GLAPI * PGLFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint *renderbuffers); -typedef void (WINE_GLAPI * PGLFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, +typedef GLboolean (WINE_GLAPI *PGLFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); +typedef void (WINE_GLAPI *PGLFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); +typedef void (WINE_GLAPI *PGLFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint *renderbuffers); +typedef void (WINE_GLAPI *PGLFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint *renderbuffers); +typedef void (WINE_GLAPI *PGLFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (WINE_GLAPI * PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, +typedef void (WINE_GLAPI *PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (WINE_GLAPI * PGLFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); -typedef GLboolean (WINE_GLAPI * PGLFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); -typedef void (WINE_GLAPI * PGLFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); -typedef void (WINE_GLAPI * PGLFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint *framebuffers); -typedef void (WINE_GLAPI * PGLFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint *framebuffers); -typedef GLenum (WINE_GLAPI * PGLFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); -typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, +typedef void (WINE_GLAPI *PGLFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); +typedef GLboolean (WINE_GLAPI *PGLFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); +typedef void (WINE_GLAPI *PGLFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); +typedef void (WINE_GLAPI *PGLFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint *framebuffers); +typedef void (WINE_GLAPI *PGLFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint *framebuffers); +typedef GLenum (WINE_GLAPI *PGLFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); +typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, +typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, +typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer); -typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, +typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); -typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, +typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (WINE_GLAPI * PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, +typedef void (WINE_GLAPI *PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (WINE_GLAPI * PGLFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, +typedef void (WINE_GLAPI *PGLFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); -typedef void (WINE_GLAPI * PGLFNGLGENERATEMIPMAPPROC)(GLenum target); +typedef void (WINE_GLAPI *PGLFNGLGENERATEMIPMAPPROC)(GLenum target); /* GL_ARB_geometry_shader4 */ #ifndef GL_ARB_geometry_shader4 -#define GL_GEOMETRY_SHADER_ARB 0x8dd9 -#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8dda -#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8ddb -#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8ddc -#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8c29 -#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8ddd -#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8dde -#define GL_MAX_VARYING_COMPONENTS_ARB 0x8b4b -#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8ddf -#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8de0 -#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8de1 -#define GL_LINES_ADJACENCY_ARB 0x000a -#define GL_LINE_STRIP_ADJACENCY_ARB 0x000b -#define GL_TRIANGLES_ADJACENCY_ARB 0x000c -#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000d -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8da8 -#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8da9 -#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8da7 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8cd4 -#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_ARB_geometry_shader4 1 +#define GL_GEOMETRY_SHADER_ARB 0x8dd9 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8dda +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8ddb +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8ddc +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8c29 +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8ddd +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8dde +#define GL_MAX_VARYING_COMPONENTS_ARB 0x8b4b +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8ddf +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8de0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8de1 +#define GL_LINES_ADJACENCY_ARB 0x000a +#define GL_LINE_STRIP_ADJACENCY_ARB 0x000b +#define GL_TRIANGLES_ADJACENCY_ARB 0x000c +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000d +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8da8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8da9 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8da7 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8cd4 +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 #endif typedef void (WINE_GLAPI *PGLFNPROGRAMPARAMETERIARBPROC)(GLuint program, GLenum pname, GLint value); typedef void (WINE_GLAPI *PGLFNFRAMEBUFFERTEXTUREARBPROC)(GLenum target, GLenum attachment, @@ -1726,380 +2126,1067 @@ typedef void (WINE_GLAPI *PGLFNFRAMEBUFFERTEXTURELAYERARBPROC)(GLenum target, GL typedef void (WINE_GLAPI *PGLFNFRAMEBUFFERTEXTUREFACEARBPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +/* GL_ARB_half_float_pixel */ +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 +#define GL_HALF_FLOAT_ARB 0x140b +#endif + +/* GL_ARB_half_float_vertex */ +#ifndef GL_ARB_half_float_vertex +#define GL_ARB_half_float_vertex 1 +/* No _ARB, see extension spec */ +#define GL_HALF_FLOAT 0x140b +#endif + /* GL_ARB_imaging */ #ifndef GL_ARB_imaging #define GL_ARB_imaging 1 -#define GL_CONSTANT_COLOR 0x8001 -#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 -#define GL_CONSTANT_ALPHA 0x8003 -#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 -#define GL_BLEND_COLOR 0x8005 -#define GL_FUNC_ADD 0x8006 -#define GL_MIN 0x8007 -#define GL_MAX 0x8008 -#define GL_BLEND_EQUATION 0x8009 -#define GL_FUNC_SUBTRACT 0x800A -#define GL_FUNC_REVERSE_SUBTRACT 0x800B -#define GL_CONVOLUTION_1D 0x8010 -#define GL_CONVOLUTION_2D 0x8011 -#define GL_SEPARABLE_2D 0x8012 -#define GL_CONVOLUTION_BORDER_MODE 0x8013 -#define GL_CONVOLUTION_FILTER_SCALE 0x8014 -#define GL_CONVOLUTION_FILTER_BIAS 0x8015 -#define GL_REDUCE 0x8016 -#define GL_CONVOLUTION_FORMAT 0x8017 -#define GL_CONVOLUTION_WIDTH 0x8018 -#define GL_CONVOLUTION_HEIGHT 0x8019 -#define GL_MAX_CONVOLUTION_WIDTH 0x801A -#define GL_MAX_CONVOLUTION_HEIGHT 0x801B -#define GL_POST_CONVOLUTION_RED_SCALE 0x801C -#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D -#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E -#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F -#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 -#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 -#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 -#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 -#define GL_HISTOGRAM 0x8024 -#define GL_PROXY_HISTOGRAM 0x8025 -#define GL_HISTOGRAM_WIDTH 0x8026 -#define GL_HISTOGRAM_FORMAT 0x8027 -#define GL_HISTOGRAM_RED_SIZE 0x8028 -#define GL_HISTOGRAM_GREEN_SIZE 0x8029 -#define GL_HISTOGRAM_BLUE_SIZE 0x802A -#define GL_HISTOGRAM_ALPHA_SIZE 0x802B -#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C -#define GL_HISTOGRAM_SINK 0x802D -#define GL_MINMAX 0x802E -#define GL_MINMAX_FORMAT 0x802F -#define GL_MINMAX_SINK 0x8030 -#define GL_TABLE_TOO_LARGE 0x8031 -#define GL_COLOR_MATRIX 0x80B1 -#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 -#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 -#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 -#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 -#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 -#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 -#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 -#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 -#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA -#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB -#define GL_COLOR_TABLE 0x80D0 -#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 -#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 -#define GL_PROXY_COLOR_TABLE 0x80D3 -#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 -#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 -#define GL_COLOR_TABLE_SCALE 0x80D6 -#define GL_COLOR_TABLE_BIAS 0x80D7 -#define GL_COLOR_TABLE_FORMAT 0x80D8 -#define GL_COLOR_TABLE_WIDTH 0x80D9 -#define GL_COLOR_TABLE_RED_SIZE 0x80DA -#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB -#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC -#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD -#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE -#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF -#define GL_CONSTANT_BORDER 0x8151 -#define GL_REPLICATE_BORDER 0x8153 -#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#define GL_FUNC_ADD 0x8006 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BLEND_EQUATION 0x8009 +#define GL_FUNC_SUBTRACT 0x800a +#define GL_FUNC_REVERSE_SUBTRACT 0x800b +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801a +#define GL_MAX_CONVOLUTION_HEIGHT 0x801b +#define GL_POST_CONVOLUTION_RED_SCALE 0x801d +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801f +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801e +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801f +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802a +#define GL_HISTOGRAM_ALPHA_SIZE 0x802b +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802c +#define GL_HISTOGRAM_SINK 0x802d +#define GL_MINMAX 0x802e +#define GL_MINMAX_FORMAT 0x802f +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80b1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80b2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80b3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80b4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80b5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80b6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80b7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80b8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80b9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80ba +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80bb +#define GL_COLOR_TABLE 0x80d0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80d1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80d2 +#define GL_PROXY_COLOR_TABLE 0x80d3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80d4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80d5 +#define GL_COLOR_TABLE_SCALE 0x80d6 +#define GL_COLOR_TABLE_BIAS 0x80d7 +#define GL_COLOR_TABLE_FORMAT 0x80d8 +#define GL_COLOR_TABLE_WIDTH 0x80d9 +#define GL_COLOR_TABLE_RED_SIZE 0x80da +#define GL_COLOR_TABLE_GREEN_SIZE 0x80db +#define GL_COLOR_TABLE_BLUE_SIZE 0x80dc +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80dd +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80de +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80df +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 #endif -typedef void (WINE_GLAPI *PGLFNBLENDCOLORPROC) (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONPROC) (GLenum mode); +typedef void (WINE_GLAPI *PGLFNBLENDCOLORPROC)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); +typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONPROC)(GLenum mode); + +/* GL_ARB_map_buffer_range */ +#ifndef GL_ARB_map_buffer_range +#define GL_ARB_map_buffer_range 1 +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#endif +typedef GLvoid *(WINE_GLAPI *PGLFNMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (WINE_GLAPI *PGLFNFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length); + +/* GL_ARB_multisample */ +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#define GL_MULTISAMPLE_ARB 0x809d +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809e +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809f +#define GL_SAMPLE_COVERAGE_ARB 0x80a0 +#define GL_SAMPLE_BUFFERS_ARB 0x80a8 +#define GL_SAMPLES_ARB 0x80a9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80aa +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80ab +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +#endif +typedef void (WINE_GLAPI *WINED3D_PFNGLSAMPLECOVERAGEARBPROC)(GLclampf value, GLboolean invert); + /* GL_ARB_multitexture */ #ifndef GL_ARB_multitexture #define GL_ARB_multitexture 1 -#define GL_TEXTURE0_ARB 0x84C0 -#define GL_TEXTURE1_ARB 0x84C1 -#define GL_TEXTURE2_ARB 0x84C2 -#define GL_TEXTURE3_ARB 0x84C3 -#define GL_TEXTURE4_ARB 0x84C4 -#define GL_TEXTURE5_ARB 0x84C5 -#define GL_TEXTURE6_ARB 0x84C6 -#define GL_TEXTURE7_ARB 0x84C7 -#define GL_TEXTURE8_ARB 0x84C8 -#define GL_TEXTURE9_ARB 0x84C9 -#define GL_TEXTURE10_ARB 0x84CA -#define GL_TEXTURE11_ARB 0x84CB -#define GL_TEXTURE12_ARB 0x84CC -#define GL_TEXTURE13_ARB 0x84CD -#define GL_TEXTURE14_ARB 0x84CE -#define GL_TEXTURE15_ARB 0x84CF -#define GL_TEXTURE16_ARB 0x84D0 -#define GL_TEXTURE17_ARB 0x84D1 -#define GL_TEXTURE18_ARB 0x84D2 -#define GL_TEXTURE19_ARB 0x84D3 -#define GL_TEXTURE20_ARB 0x84D4 -#define GL_TEXTURE21_ARB 0x84D5 -#define GL_TEXTURE22_ARB 0x84D6 -#define GL_TEXTURE23_ARB 0x84D7 -#define GL_TEXTURE24_ARB 0x84D8 -#define GL_TEXTURE25_ARB 0x84D9 -#define GL_TEXTURE26_ARB 0x84DA -#define GL_TEXTURE27_ARB 0x84DB -#define GL_TEXTURE28_ARB 0x84DC -#define GL_TEXTURE29_ARB 0x84DD -#define GL_TEXTURE30_ARB 0x84DE -#define GL_TEXTURE31_ARB 0x84DF -#define GL_ACTIVE_TEXTURE_ARB 0x84E0 -#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 -#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +#define GL_TEXTURE0_ARB 0x84c0 +#define GL_TEXTURE1_ARB 0x84c1 +#define GL_TEXTURE2_ARB 0x84c2 +#define GL_TEXTURE3_ARB 0x84c3 +#define GL_TEXTURE4_ARB 0x84c4 +#define GL_TEXTURE5_ARB 0x84c5 +#define GL_TEXTURE6_ARB 0x84c6 +#define GL_TEXTURE7_ARB 0x84c7 +#define GL_TEXTURE8_ARB 0x84c8 +#define GL_TEXTURE9_ARB 0x84c9 +#define GL_TEXTURE10_ARB 0x84ca +#define GL_TEXTURE11_ARB 0x84cb +#define GL_TEXTURE12_ARB 0x84cc +#define GL_TEXTURE13_ARB 0x84cd +#define GL_TEXTURE14_ARB 0x84ce +#define GL_TEXTURE15_ARB 0x84cf +#define GL_TEXTURE16_ARB 0x84d0 +#define GL_TEXTURE17_ARB 0x84d1 +#define GL_TEXTURE18_ARB 0x84d2 +#define GL_TEXTURE19_ARB 0x84d3 +#define GL_TEXTURE20_ARB 0x84d4 +#define GL_TEXTURE21_ARB 0x84d5 +#define GL_TEXTURE22_ARB 0x84d6 +#define GL_TEXTURE23_ARB 0x84d7 +#define GL_TEXTURE24_ARB 0x84d8 +#define GL_TEXTURE25_ARB 0x84d9 +#define GL_TEXTURE26_ARB 0x84da +#define GL_TEXTURE27_ARB 0x84db +#define GL_TEXTURE28_ARB 0x84dc +#define GL_TEXTURE29_ARB 0x84dd +#define GL_TEXTURE30_ARB 0x84de +#define GL_TEXTURE31_ARB 0x84df +#define GL_ACTIVE_TEXTURE_ARB 0x84e0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84e1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84e2 #endif -typedef void (WINE_GLAPI *WINED3D_PFNGLACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (WINE_GLAPI *WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); -typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); -typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); -typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); -typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); -typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); -typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); -typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +typedef void (WINE_GLAPI *WINED3D_PFNGLACTIVETEXTUREARBPROC)(GLenum texture); +typedef void (WINE_GLAPI *WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC)(GLenum texture); +typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FARBPROC)(GLenum target, GLfloat s); +typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD1FVARBPROC)(GLenum target, const GLfloat *v); +typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FARBPROC)(GLenum target, GLfloat s, GLfloat t); +typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2FVARBPROC)(GLenum target, const GLfloat *v); +typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FARBPROC)(GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD3FVARBPROC)(GLenum target, const GLfloat *v); +typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FARBPROC)(GLenum target, + GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4FVARBPROC)(GLenum target, const GLfloat *v); +typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD2SVARBPROC)(GLenum target, const GLshort *v); +typedef void (WINE_GLAPI *WINED3D_PFNGLMULTITEXCOORD4SVARBPROC)(GLenum target, const GLshort *v); -/* GL_ARB_texture_cube_map */ -#ifndef GL_ARB_texture_cube_map -#define GL_ARB_texture_cube_map 1 -#define GL_NORMAL_MAP_ARB 0x8511 -#define GL_REFLECTION_MAP_ARB 0x8512 -#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 -#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 -#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 -#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A -#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B -#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C +/* GL_ARB_occlusion_query */ +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#define GL_SAMPLES_PASSED_ARB 0x8914 +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#endif +typedef void (WINE_GLAPI *PGLFNGENQUERIESARBPROC)(GLsizei n, GLuint *queries); +typedef void (WINE_GLAPI *PGLFNDELETEQUERIESARBPROC)(GLsizei n, const GLuint *queries); +typedef GLboolean (WINE_GLAPI *PGLFNISQUERYARBPROC)(GLuint query); +typedef void (WINE_GLAPI *PGLFNBEGINQUERYARBPROC)(GLenum target, GLuint query); +typedef void (WINE_GLAPI *PGLFNENDQUERYARBPROC)(GLenum target); +typedef void (WINE_GLAPI *PGLFNGETQUERYIVARBPROC)(GLenum target, GLenum pname, GLint *params); +typedef void (WINE_GLAPI *PGLFNGETQUERYOBJECTIVARBPROC)(GLuint query, GLenum pname, GLint *params); +typedef void (WINE_GLAPI *PGLFNGETQUERYOBJECTUIVARBPROC)(GLuint query, GLenum pname, GLuint *params); + +/* GL_ARB_pixel_buffer_object */ +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_ARB 0x88eb +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88ec +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ed +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88ef #endif /* GL_ARB_point_parameters */ #ifndef GL_ARB_point_parameters #define GL_ARB_point_parameters 1 -#define GL_POINT_SIZE_MIN_ARB 0x8126 -#define GL_POINT_SIZE_MAX_ARB 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 -#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +#endif +typedef void (WINE_GLAPI *PGLFNGLPOINTPARAMETERFARBPROC)(GLenum pname, GLfloat param); +typedef void (WINE_GLAPI *PGLFNGLPOINTPARAMETERFVARBPROC)(GLenum pname, const GLfloat *params); + +/* GL_ARB_point_sprite */ +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 #endif -typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); -typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); /* GL_ARB_provoking_vertex */ #ifndef GL_ARB_provoking_vertex #define GL_ARB_provoking_vertex 1 -#define GL_FIRST_VERTEX_CONVENTION 0x8e4d -#define GL_LAST_VERTEX_CONVENTION 0x8e4e -#define GL_PROVOKING_VERTEX 0x8e4f -#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8e4c +#define GL_FIRST_VERTEX_CONVENTION 0x8e4d +#define GL_LAST_VERTEX_CONVENTION 0x8e4e +#define GL_PROVOKING_VERTEX 0x8e4f +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8e4c +#endif +typedef void (WINE_GLAPI *PGLFNGLPROVOKINGVERTEXPROC)(GLenum mode); + +/* GL_ARB_shader_objects */ +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +typedef char GLcharARB; +typedef unsigned int GLhandleARB; +#define GL_PROGRAM_OBJECT_ARB 0x8b40 +#define GL_OBJECT_TYPE_ARB 0x8b4e +#define GL_OBJECT_SUBTYPE_ARB 0x8b4f +#define GL_OBJECT_DELETE_STATUS_ARB 0x8b80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8b81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8b82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8b83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8b84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8b85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8b86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8b87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8b88 +#define GL_SHADER_OBJECT_ARB 0x8b48 +#define GL_FLOAT_VEC2_ARB 0x8b50 +#define GL_FLOAT_VEC3_ARB 0x8b51 +#define GL_FLOAT_VEC4_ARB 0x8b52 +#define GL_INT_VEC2_ARB 0x8b53 +#define GL_INT_VEC3_ARB 0x8b54 +#define GL_INT_VEC4_ARB 0x8b55 +#define GL_BOOL_ARB 0x8b56 +#define GL_BOOL_VEC2_ARB 0x8b57 +#define GL_BOOL_VEC3_ARB 0x8b58 +#define GL_BOOL_VEC4_ARB 0x8b59 +#define GL_FLOAT_MAT2_ARB 0x8b5a +#define GL_FLOAT_MAT3_ARB 0x8b5b +#define GL_FLOAT_MAT4_ARB 0x8b5c +#define GL_SAMPLER_1D_ARB 0x8b5d +#define GL_SAMPLER_2D_ARB 0x8b5e +#define GL_SAMPLER_3D_ARB 0x8b5f +#define GL_SAMPLER_CUBE_ARB 0x8b60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8b61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8b62 +#define GL_SAMPLER_2D_RECT_ARB 0x8b63 +#define GL_SAMPELR_2D_RECT_SHADOW_ARB 0x8b64 +#endif + +/* GL_ARB_shading_language_100 */ +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8b8c +#endif + +/* GL_ARB_sync */ +#ifndef GL_ARB_sync +#define GL_ARB_sync 1 +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_TIMEOUT_IGNORED 0xffffffffffffffffULL +#define GL_ALREADY_SIGNALED 0x911a +#define GL_TIMEOUT_EXPIRED 0x911b +#define GL_CONDITION_SATISFIED 0x911c +#define GL_WAIT_FAILED 0x911d +#endif +typedef GLsync (WINE_GLAPI *PGLFNFENCESYNCPROC)(GLenum condition, GLbitfield flags); +typedef GLboolean (WINE_GLAPI *PGLFNISSYNCPROC)(GLsync sync); +typedef GLvoid (WINE_GLAPI *PGLFNDELETESYNCPROC)(GLsync sync); +typedef GLenum (WINE_GLAPI *PGLFNCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef GLvoid (WINE_GLAPI *PGLFNWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef GLvoid (WINE_GLAPI *PGLFNGETINTEGER64VPROC)(GLenum pname, GLint64 *params); +typedef GLvoid (WINE_GLAPI *PGLFNGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei bufsize, + GLsizei *length, GLint *values); + +/* GL_ARB_texture_border_clamp */ +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#define GL_CLAMP_TO_BORDER_ARB 0x812d +#endif + +/* GL_ARB_texture_cube_map */ +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851a +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851b +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851c +#endif + +/* GL_ARB_texture_env_dot3 */ +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#define GL_DOT3_RGB_ARB 0x86ae +#define GL_DOT3_RGBA_ARB 0x86af +#endif + +/* GL_ARB_texture_float */ +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_RGBA16F_ARB 0x881a +#define GL_RGB16F_ARB 0x881b +#endif + +/* GL_ARB_texture_mirrored_repeat */ +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif + +/* GL_ARB_texture_rectangle */ +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 +#define GL_TEXTURE_RECTANGLE_ARB 0x84f5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84f6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84f7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84f8 +#define GL_SAMPLER_2D_RECT_ARB 0x8b63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8b64 +#endif + +/* GL_ARB_texture_rg */ +#ifndef GL_ARB_texture_rg +#define GL_ARB_texture_rg 1 +#define GL_RG 0x8227 +#define GL_RG_INTEGER 0x8228 +#define GL_R8 0x8229 +#define GL_R16 0x822a +#define GL_RG8 0x822b +#define GL_RG16 0x822c +#define GL_R16F 0x822d +#define GL_R32F 0x822e +#define GL_RG16F 0x822f +#define GL_RG32F 0x8230 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823a +#define GL_RG32I 0x823b +#define GL_RG32UI 0x823c #endif -typedef void (WINE_GLAPI * PGLFNGLPROVOKINGVERTEXPROC)(GLenum mode); /* GL_ARB_vertex_blend */ #ifndef GL_ARB_vertex_blend #define GL_ARB_vertex_blend 1 -#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 -#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 -#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 -#define GL_VERTEX_BLEND_ARB 0x86A7 -#define GL_CURRENT_WEIGHT_ARB 0x86A8 -#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 -#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA -#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB -#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC -#define GL_WEIGHT_ARRAY_ARB 0x86AD -#define GL_MODELVIEW0_ARB 0x1700 -#define GL_MODELVIEW1_ARB 0x850A -#define GL_MODELVIEW2_ARB 0x8722 -#define GL_MODELVIEW3_ARB 0x8723 -#define GL_MODELVIEW4_ARB 0x8724 -#define GL_MODELVIEW5_ARB 0x8725 -#define GL_MODELVIEW6_ARB 0x8726 -#define GL_MODELVIEW7_ARB 0x8727 -#define GL_MODELVIEW8_ARB 0x8728 -#define GL_MODELVIEW9_ARB 0x8729 -#define GL_MODELVIEW10_ARB 0x872A -#define GL_MODELVIEW11_ARB 0x872B -#define GL_MODELVIEW12_ARB 0x872C -#define GL_MODELVIEW13_ARB 0x872D -#define GL_MODELVIEW14_ARB 0x872E -#define GL_MODELVIEW15_ARB 0x872F -#define GL_MODELVIEW16_ARB 0x8730 -#define GL_MODELVIEW17_ARB 0x8731 -#define GL_MODELVIEW18_ARB 0x8732 -#define GL_MODELVIEW19_ARB 0x8733 -#define GL_MODELVIEW20_ARB 0x8734 -#define GL_MODELVIEW21_ARB 0x8735 -#define GL_MODELVIEW22_ARB 0x8736 -#define GL_MODELVIEW23_ARB 0x8737 -#define GL_MODELVIEW24_ARB 0x8738 -#define GL_MODELVIEW25_ARB 0x8739 -#define GL_MODELVIEW26_ARB 0x873A -#define GL_MODELVIEW27_ARB 0x873B -#define GL_MODELVIEW28_ARB 0x873C -#define GL_MODELVIEW29_ARB 0x873D -#define GL_MODELVIEW30_ARB 0x873E -#define GL_MODELVIEW31_ARB 0x873F +#define GL_MAX_VERTEX_UNITS_ARB 0x86a4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86a5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86a6 +#define GL_VERTEX_BLEND_ARB 0x86a7 +#define GL_CURRENT_WEIGHT_ARB 0x86a8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86a9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86aa +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86ab +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86ac +#define GL_WEIGHT_ARRAY_ARB 0x86ad +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850a +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872a +#define GL_MODELVIEW11_ARB 0x872b +#define GL_MODELVIEW12_ARB 0x872c +#define GL_MODELVIEW13_ARB 0x872d +#define GL_MODELVIEW14_ARB 0x872e +#define GL_MODELVIEW15_ARB 0x872f +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873a +#define GL_MODELVIEW27_ARB 0x873b +#define GL_MODELVIEW28_ARB 0x873c +#define GL_MODELVIEW29_ARB 0x873d +#define GL_MODELVIEW30_ARB 0x873e +#define GL_MODELVIEW31_ARB 0x873f #endif -typedef void (WINE_GLAPI * PGLFNGLWEIGHTPOINTERARB) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -typedef void (WINE_GLAPI * PGLFNGLWEIGHTBV) (GLint size, const GLbyte *weights); -typedef void (WINE_GLAPI * PGLFNGLWEIGHTSV) (GLint size, const GLshort *weights); -typedef void (WINE_GLAPI * PGLFNGLWEIGHTIV) (GLint size, const GLint *weights); -typedef void (WINE_GLAPI * PGLFNGLWEIGHTFV) (GLint size, const GLfloat *weights); -typedef void (WINE_GLAPI * PGLFNGLWEIGHTDV) (GLint size, const GLdouble *weights); -typedef void (WINE_GLAPI * PGLFNGLWEIGHTUBV) (GLint size, const GLubyte *weights); -typedef void (WINE_GLAPI * PGLFNGLWEIGHTUSV) (GLint size, const GLushort *weights); -typedef void (WINE_GLAPI * PGLFNGLWEIGHTUIV) (GLint size, const GLuint *weights); -typedef void (WINE_GLAPI * PGLFNGLVERTEXBLENDARB) (GLint count); -/* GL_ARB_pixel_buffer_object */ -#ifndef GL_ARB_pixel_buffer_object -#define GL_ARB_pixel_buffer_object 1 -#endif -#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF -/* GL_EXT_framebuffer_object */ -#ifndef GL_EXT_framebuffer_object -#define GL_EXT_framebuffer_object 1 -#define GL_FRAMEBUFFER_EXT 0x8D40 -#define GL_RENDERBUFFER_EXT 0x8D41 -#define GL_STENCIL_INDEX1_EXT 0x8D46 -#define GL_STENCIL_INDEX4_EXT 0x8D47 -#define GL_STENCIL_INDEX8_EXT 0x8D48 -#define GL_STENCIL_INDEX16_EXT 0x8D49 -#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 -#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 -#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 -#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 -#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 -#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 -#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 -#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 -#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 -#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 -#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 -#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 -#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 -#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 -#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 -#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 -#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 -#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 -#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 -#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 -#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA -#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB -#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC -#define GL_COLOR_ATTACHMENT13_EXT 0x8CED -#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE -#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF -#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 -#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 -#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 -#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD -#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 -#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF -#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 -#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +typedef void (WINE_GLAPI *PGLFNGLWEIGHTPOINTERARB)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); +typedef void (WINE_GLAPI *PGLFNGLWEIGHTBV)(GLint size, const GLbyte *weights); +typedef void (WINE_GLAPI *PGLFNGLWEIGHTSV)(GLint size, const GLshort *weights); +typedef void (WINE_GLAPI *PGLFNGLWEIGHTIV)(GLint size, const GLint *weights); +typedef void (WINE_GLAPI *PGLFNGLWEIGHTFV)(GLint size, const GLfloat *weights); +typedef void (WINE_GLAPI *PGLFNGLWEIGHTDV)(GLint size, const GLdouble *weights); +typedef void (WINE_GLAPI *PGLFNGLWEIGHTUBV)(GLint size, const GLubyte *weights); +typedef void (WINE_GLAPI *PGLFNGLWEIGHTUSV)(GLint size, const GLushort *weights); +typedef void (WINE_GLAPI *PGLFNGLWEIGHTUIV)(GLint size, const GLuint *weights); +typedef void (WINE_GLAPI *PGLFNGLVERTEXBLENDARB)(GLint count); +/* GL_ARB_vertex_buffer_object */ +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889a +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889b +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889c +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889d +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889e +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889f +#define GL_READ_ONLY_ARB 0x88b8 +#define GL_WRITE_ONLY_ARB 0x88b9 +#define GL_READ_WRITE_ARB 0x88ba +#define GL_BUFFER_ACCESS_ARB 0x88bb +#define GL_BUFFER_MAPPED_ARB 0x88bc +#define GL_BUFFER_MAP_POINTER_ARB 0x88bd +#define GL_STREAM_DRAW_ARB 0x88e0 +#define GL_STREAM_READ_ARB 0x88e1 +#define GL_STREAM_COPY_ARB 0x88e2 +#define GL_STATIC_DRAW_ARB 0x88e4 +#define GL_STATIC_READ_ARB 0x88e5 +#define GL_STATIC_COPY_ARB 0x88e6 +#define GL_DYNAMIC_DRAW_ARB 0x88e8 +#define GL_DYNAMIC_READ_ARB 0x88e9 +#define GL_DYNAMIC_COPY_ARB 0x88ea #endif -typedef GLboolean (WINE_GLAPI * PGLFNGLISRENDERBUFFEREXTPROC)(GLuint renderbuffer); -typedef void (WINE_GLAPI * PGLFNGLBINDRENDERBUFFEREXTPROC)(GLenum target, GLuint renderbuffer); -typedef void (WINE_GLAPI * PGLFNGLDELETERENDERBUFFERSEXTPROC)(GLsizei n, const GLuint *renderbuffers); -typedef void (WINE_GLAPI * PGLFNGLGENRENDERBUFFERSEXTPROC)(GLsizei n, GLuint *renderbuffers); -typedef void (WINE_GLAPI * PGLFNGLRENDERBUFFERSTORAGEEXTPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); -typedef void (WINE_GLAPI * PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint *params); -typedef GLboolean (WINE_GLAPI * PGLFNGLISFRAMEBUFFEREXTPROC)(GLuint framebuffer); -typedef void (WINE_GLAPI * PGLFNGLBINDFRAMEBUFFEREXTPROC)(GLenum target, GLuint framebuffer); -typedef void (WINE_GLAPI * PGLFNGLDELETEFRAMEBUFFERSEXTPROC)(GLsizei n, const GLuint *framebuffers); -typedef void (WINE_GLAPI * PGLFNGLGENFRAMEBUFFERSEXTPROC)(GLsizei n, GLuint *framebuffers); -typedef GLenum (WINE_GLAPI * PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(GLenum target); -typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); -typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); -typedef void (WINE_GLAPI * PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); -typedef void (WINE_GLAPI * PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLenum target, GLenum attachment, GLenum pname, GLint *params); -typedef void (WINE_GLAPI * PGLFNGLGENERATEMIPMAPEXTPROC)(GLenum target); +typedef void (WINE_GLAPI *PGLFNBINDBUFFERARBPROC)(GLenum target, GLuint buffer); +typedef void (WINE_GLAPI *PGLFNDELETEBUFFERSARBPROC)(GLsizei n, const GLuint *buffers); +typedef void (WINE_GLAPI *PGLFNGENBUFFERSARBPROC)(GLsizei n, GLuint *buffers); +typedef GLboolean (WINE_GLAPI *PGLFNISBUFFERARBPROC)(GLuint buffer); +typedef void (WINE_GLAPI *PGLFNBUFFERDATAARBPROC)(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); +typedef void (WINE_GLAPI *PGLFNBUFFERSUBDATAARBPROC)(GLenum target, + GLintptr offset, GLsizeiptr size, const GLvoid *data); +typedef void (WINE_GLAPI *PGLFNGETBUFFERSUBDATAARBPROC)(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); +typedef GLvoid* (WINE_GLAPI *PGLFNMAPBUFFERARBPROC)(GLenum target, GLenum access); +typedef GLboolean (WINE_GLAPI *PGLFNUNMAPBUFFERARBPROC)(GLenum target); +typedef void (WINE_GLAPI *PGLFNGETBUFFERPARAMETERIVARBPROC)(GLenum target, GLenum pname, GLint *params); +typedef void (WINE_GLAPI *PGLFNGETBUFFERPOINTERVARBPROC)(GLenum target, GLenum pname, GLvoid* *params); + +/* GL_ARB_vertex_program */ +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886a +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88a0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88a1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88a2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88a3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88a4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88a5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88a6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88a7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88a8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88a9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88aa +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88ab +#define GL_PROGRAM_ATTRIBS_ARB 0x88ac +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88ad +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88ae +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88af +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88b0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88b1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88b2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88b3 +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88b4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88b5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88b6 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864b +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88b7 +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862f +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862e +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_MATRIX0_ARB 0x88c0 +#define GL_MATRIX1_ARB 0x88c1 +#define GL_MATRIX2_ARB 0x88c2 +#define GL_MATRIX3_ARB 0x88c3 +#define GL_MATRIX4_ARB 0x88c4 +#define GL_MATRIX5_ARB 0x88c5 +#define GL_MATRIX6_ARB 0x88c6 +#define GL_MATRIX7_ARB 0x88c7 +#define GL_MATRIX8_ARB 0x88c8 +#define GL_MATRIX9_ARB 0x88c9 +#define GL_MATRIX10_ARB 0x88ca +#define GL_MATRIX11_ARB 0x88cb +#define GL_MATRIX12_ARB 0x88cc +#define GL_MATRIX13_ARB 0x88cd +#define GL_MATRIX14_ARB 0x88ce +#define GL_MATRIX15_ARB 0x88cf +#define GL_MATRIX16_ARB 0x88d0 +#define GL_MATRIX17_ARB 0x88d1 +#define GL_MATRIX18_ARB 0x88d2 +#define GL_MATRIX19_ARB 0x88d3 +#define GL_MATRIX20_ARB 0x88d4 +#define GL_MATRIX21_ARB 0x88d5 +#define GL_MATRIX22_ARB 0x88d6 +#define GL_MATRIX23_ARB 0x88d7 +#define GL_MATRIX24_ARB 0x88d8 +#define GL_MATRIX25_ARB 0x88d9 +#define GL_MATRIX26_ARB 0x88da +#define GL_MATRIX27_ARB 0x88db +#define GL_MATRIX28_ARB 0x88dc +#define GL_MATRIX29_ARB 0x88dd +#define GL_MATRIX30_ARB 0x88de +#define GL_MATRIX31_ARB 0x88df +#endif +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DARBPROC)(GLuint index, GLdouble x); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1DVARBPROC)(GLuint index, const GLdouble *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FARBPROC)(GLuint index, GLfloat x); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1FVARBPROC)(GLuint index, const GLfloat *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SARBPROC)(GLuint index, GLshort x); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1SVARBPROC)(GLuint index, const GLshort *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DARBPROC)(GLuint index, GLdouble x, GLdouble y); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2DVARBPROC)(GLuint index, const GLdouble *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FARBPROC)(GLuint index, GLfloat x, GLfloat y); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2FVARBPROC)(GLuint index, const GLfloat *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SARBPROC)(GLuint index, GLshort x, GLshort y); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2SVARBPROC)(GLuint index, const GLshort *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3DVARBPROC)(GLuint index, const GLdouble *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3FVARBPROC)(GLuint index, const GLfloat *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3SVARBPROC)(GLuint index, const GLshort *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NBVARBPROC)(GLuint index, const GLbyte *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NIVARBPROC)(GLuint index, const GLint *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NSVARBPROC)(GLuint index, const GLshort *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBARBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUBVARBPROC)(GLuint index, const GLubyte *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUIVARBPROC)(GLuint index, const GLuint *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4NUSVARBPROC)(GLuint index, const GLushort *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4BVARBPROC)(GLuint index, const GLbyte *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DARBPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4DVARBPROC)(GLuint index, const GLdouble *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FARBPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4FVARBPROC)(GLuint index, const GLfloat *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4IVARBPROC)(GLuint index, const GLint *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SARBPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4SVARBPROC)(GLuint index, const GLshort *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UBVARBPROC)(GLuint index, const GLubyte *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4UIVARBPROC)(GLuint index, const GLuint *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4USVARBPROC)(GLuint index, const GLushort *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBPOINTERARBPROC)(GLuint index, GLint size, + GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); +typedef void (WINE_GLAPI *PGLFNENABLEVERTEXATTRIBARRAYARBPROC)(GLuint index); +typedef void (WINE_GLAPI *PGLFNDISABLEVERTEXATTRIBARRAYARBPROC)(GLuint index); +typedef void (WINE_GLAPI *PGLFNPROGRAMSTRINGARBPROC)(GLenum target, GLenum format, GLsizei len, const GLvoid *string); +typedef void (WINE_GLAPI *PGLFNBINDPROGRAMARBPROC)(GLenum target, GLuint program); +typedef void (WINE_GLAPI *PGLFNDELETEPROGRAMSARBPROC)(GLsizei n, const GLuint *programs); +typedef void (WINE_GLAPI *PGLFNGENPROGRAMSARBPROC)(GLsizei n, GLuint *programs); +typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4DARBPROC)(GLenum target, + GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble *params); +typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4FARBPROC)(GLenum target, + GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat *params); +typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4DARBPROC)(GLenum target, + GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4DVARBPROC)(GLenum target, GLuint index, const GLdouble *params); +typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4FARBPROC)(GLenum target, + GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETER4FVARBPROC)(GLenum target, GLuint index, const GLfloat *params); +typedef void (WINE_GLAPI *PGLFNGETPROGRAMENVPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble *params); +typedef void (WINE_GLAPI *PGLFNGETPROGRAMENVPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat *params); +typedef void (WINE_GLAPI *PGLFNGETPROGRAMLOCALPARAMETERDVARBPROC)(GLenum target, GLuint index, GLdouble *params); +typedef void (WINE_GLAPI *PGLFNGETPROGRAMLOCALPARAMETERFVARBPROC)(GLenum target, GLuint index, GLfloat *params); +typedef void (WINE_GLAPI *PGLFNGETPROGRAMIVARBPROC)(GLenum target, GLenum pname, GLint *params); +typedef void (WINE_GLAPI *PGLFNGETPROGRAMSTRINGARBPROC)(GLenum target, GLenum pname, GLvoid *string); +typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBDVARBPROC)(GLuint index, GLenum pname, GLdouble *params); +typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBFVARBPROC)(GLuint index, GLenum pname, GLfloat *params); +typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBIVARBPROC)(GLuint index, GLenum pname, GLint *params); +typedef void (WINE_GLAPI *PGLFNGETVERTEXATTRIBPOINTERVARBPROC)(GLuint index, GLenum pname, GLvoid* *pointer); +typedef GLboolean (WINE_GLAPI *PGLFNISPROGRAMARBPROC)(GLuint program); + +/* GL_ARB_vertex_shader */ +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#define GL_VERTEX_SHADER_ARB 0x8b31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8b4a +#define GL_MAX_VARYING_FLOATS_ARB 0x8b4b +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8b4c +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8b4d +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8b89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8b8a +#endif +typedef void (WINE_GLAPI *WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC)(GLhandleARB obj, GLenum pname, GLint *params); +typedef void (WINE_GLAPI *WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC)(GLhandleARB obj, GLenum pname, GLfloat *params); +typedef GLint (WINE_GLAPI *WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB *name); +typedef void (WINE_GLAPI *WINED3D_PFNGLGETACTIVEUNIFORMARBPROC)(GLhandleARB programObj, GLuint index, + GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1IARBPROC)(GLint location, GLint v0); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2IARBPROC)(GLint location, GLint v0, GLint v1); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4IARBPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1FARBPROC)(GLint location, GLfloat v0); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2FARBPROC)(GLint location, GLfloat v0, GLfloat v1); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3FARBPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4FARBPROC)(GLint location, + GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1IVARBPROC)(GLint location, GLsizei count, const GLint *value); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2IVARBPROC)(GLint location, GLsizei count, const GLint *value); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3IVARBPROC)(GLint location, GLsizei count, const GLint *value); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4IVARBPROC)(GLint location, GLsizei count, const GLint *value); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM1FVARBPROC)(GLint location, GLsizei count, const GLfloat *value); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM2FVARBPROC)(GLint location, GLsizei count, const GLfloat *value); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM3FVARBPROC)(GLint location, GLsizei count, const GLfloat *value); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORM4FVARBPROC)(GLint location, GLsizei count, const GLfloat *value); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC)(GLint location, + GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC)(GLint location, + GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (WINE_GLAPI *WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC)(GLint location, + GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (WINE_GLAPI *WINED3D_PFNGLGETUNIFORMFVARBPROC)(GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (WINE_GLAPI *WINED3D_PFNGLGETUNIFORMIVARBPROC)(GLhandleARB programObj, GLint location, GLint *params); +typedef void (WINE_GLAPI *WINED3D_PFNGLGETINFOLOGARBPROC)(GLhandleARB obj, + GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (WINE_GLAPI *WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC)(GLhandleARB programObj); +typedef GLhandleARB (WINE_GLAPI *WINED3D_PFNGLCREATESHADEROBJECTARBPROC)(GLenum shaderType); +typedef void (WINE_GLAPI *WINED3D_PFNGLSHADERSOURCEARBPROC)(GLhandleARB shaderObj, + GLsizei count, const GLcharARB* *string, const GLint *length); +typedef void (WINE_GLAPI *WINED3D_PFNGLCOMPILESHADERARBPROC)(GLhandleARB shaderObj); +typedef GLhandleARB (WINE_GLAPI *WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC)(void); +typedef void (WINE_GLAPI *WINED3D_PFNGLATTACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB obj); +typedef void (WINE_GLAPI *WINED3D_PFNGLLINKPROGRAMARBPROC)(GLhandleARB programObj); +typedef void (WINE_GLAPI *WINED3D_PFNGLDETACHOBJECTARBPROC)(GLhandleARB containerObj, GLhandleARB attachedObj); +typedef void (WINE_GLAPI *WINED3D_PFNGLDELETEOBJECTARBPROC)(GLhandleARB obj); +typedef void (WINE_GLAPI *WINED3D_PFNGLVALIDATEPROGRAMARBPROC)(GLhandleARB programObj); +typedef void (WINE_GLAPI *WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC)(GLhandleARB containerObj, + GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLhandleARB (WINE_GLAPI *WINED3D_PFNGLGETHANDLEARBPROC)(GLenum pname); +typedef void (WINE_GLAPI *WINED3D_PFNGLGETSHADERSOURCEARBPROC)(GLhandleARB obj, + GLsizei maxLength, GLsizei *length, GLcharARB *source); +typedef void (WINE_GLAPI *WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC)(GLhandleARB programObj, + GLuint index, const GLcharARB *name); +typedef GLint (WINE_GLAPI *WINED3D_PFNGLGETATTRIBLOCATIONARBPROC)(GLhandleARB programObj, const GLcharARB *name); + +/* GL_ATI_fragment_shader */ +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896a +#define GL_CND0_ATI 0x896b +#define GL_DOT2_ADD_ATI 0x896c +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896d +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#endif +typedef GLuint (WINE_GLAPI *PGLFNGENFRAGMENTSHADERSATI)(GLuint range); +typedef void (WINE_GLAPI *PGLFNBINDFRAGMENTSHADERATI)(GLuint id); +typedef void (WINE_GLAPI *PGLFNDELETEFRAGMENTSHADERATI)(GLuint id); +typedef void (WINE_GLAPI *PGLFNBEGINFRAGMENTSHADERATI)(void); +typedef void (WINE_GLAPI *PGLFNENDFRAGMENTSHADERATI)(void); +typedef void (WINE_GLAPI *PGLFNPASSTEXCOORDATI)(GLuint dst, GLuint coord, GLenum swizzle); +typedef void (WINE_GLAPI *PGLFNSAMPLEMAPATI)(GLuint dst, GLuint interp, GLenum swizzle); +typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP1ATI)(GLenum op, GLuint dst, GLuint dstMask, + GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP2ATI)(GLenum op, GLuint dst, GLuint dstMask, + GLuint dstMod, GLuint arg1, GLuint arg1Rep, + GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, + GLuint arg2Mod); +typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP3ATI)(GLenum op, GLuint dst, GLuint dstMask, + GLuint dstMod, GLuint arg1, GLuint arg1Rep, + GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, + GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, + GLuint arg3Mod); +typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP1ATI)(GLenum op, GLuint dst, GLuint dstMod, + GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP2ATI)(GLenum op, GLuint dst, GLuint dstMod, + GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, + GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP3ATI)(GLenum op, GLuint dst, GLuint dstMod, + GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, + GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, + GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (WINE_GLAPI *PGLFNSETFRAGMENTSHADERCONSTANTATI)(GLuint dst, const GLfloat *value); + +/* GL_ATI_separate_stencil */ +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +#endif +typedef void (WINE_GLAPI *PGLFNSTENCILOPSEPARATEATIPROC)(GLenum, GLenum, GLenum, GLenum); +typedef void (WINE_GLAPI *PGLFNSTENCILFUNCSEPARATEATIPROC)(GLenum, GLenum, GLint, GLuint); + +/* GL_ATI_texture_compression_3dc */ +#ifndef GL_ATI_texture_compression_3dc +#define GL_ATI_texture_compression_3dc 1 +#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837 +#endif + +/* GL_ATI_texture_env_combine3 */ +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +/* #define ONE */ +/* #define ZERO */ +#endif + +/* GL_ATI_texture_mirror_once */ +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif + +/* GL_EXT_blend_equation_separate */ +typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONSEPARATEEXTPROC)(GLenum modeRGB, GLenum modeAlpha); + +/* GL_EXT_blend_func_separate */ +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#define GL_BLEND_DST_RGB_EXT 0x80c8 +#define GL_BLEND_SRC_RGB_EXT 0x80c9 +#define GL_BLEND_DST_ALPHA_EXT 0x80ca +#define GL_BLEND_SRC_ALPHA_EXT 0x80cb +#endif +typedef void (WINE_GLAPI *PGLFNBLENDFUNCSEPARATEEXTPROC)(GLenum sfactorRGB, GLenum dfactorRGB, + GLenum sfactorAlpha, GLenum dfactorAlpha); + +/* GL_EXT_fog_coord */ +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +#endif +typedef void (WINE_GLAPI *PGLFNGLFOGCOORDFEXTPROC)(GLfloat coord); +typedef void (WINE_GLAPI *PGLFNGLFOGCOORDFVEXTPROC)(const GLfloat *coord); +typedef void (WINE_GLAPI *PGLFNGLFOGCOORDDEXTPROC)(GLdouble coord); +typedef void (WINE_GLAPI *PGLFNGLFOGCOORDDVEXTPROC)(const GLdouble *coord); +typedef void (WINE_GLAPI *PGLFNGLFOGCOORDPOINTEREXTPROC)(GLenum type, GLsizei stride, GLvoid *data); + /* GL_EXT_framebuffer_blit */ #ifndef GL_EXT_framebuffer_blit #define GL_EXT_framebuffer_blit 1 -#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 -#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 -#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 -#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA +#define GL_READ_FRAMEBUFFER_EXT 0x8ca8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8ca9 +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8ca6 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8caa #endif -typedef void (WINE_GLAPI * PGLFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (WINE_GLAPI *PGLFNGLBLITFRAMEBUFFEREXTPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, + GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); /* GL_EXT_framebuffer_multisample */ #ifndef GL_EXT_framebuffer_multisample #define GL_EXT_framebuffer_multisample 1 -#define GL_RENDERBUFFER_SAMPLES_EXT 0x8cab -#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8d56 -#define GL_MAX_SAMPLES_EXT 0x8d57 +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8cab +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8d56 +#define GL_MAX_SAMPLES_EXT 0x8d57 #endif -typedef void (WINE_GLAPI * PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (WINE_GLAPI *PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC)(GLenum target, GLsizei samples, + GLenum internalformat, GLsizei width, GLsizei height); + +/* GL_EXT_framebuffer_object */ +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 +#define GL_FRAMEBUFFER_EXT 0x8d40 +#define GL_RENDERBUFFER_EXT 0x8d41 +#define GL_STENCIL_INDEX1_EXT 0x8d46 +#define GL_STENCIL_INDEX4_EXT 0x8d47 +#define GL_STENCIL_INDEX8_EXT 0x8d48 +#define GL_STENCIL_INDEX16_EXT 0x8d49 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8d42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8d43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8d44 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8d50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8d51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8d52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8d53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8d54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8d55 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8cd0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8cd1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8cd2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8cd3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8cd4 +#define GL_COLOR_ATTACHMENT0_EXT 0x8ce0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8ce1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8ce2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8ce3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8ce4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8ce5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8ce6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8ce7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8ce8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8ce9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8cea +#define GL_COLOR_ATTACHMENT11_EXT 0x8ceb +#define GL_COLOR_ATTACHMENT12_EXT 0x8cec +#define GL_COLOR_ATTACHMENT13_EXT 0x8ced +#define GL_COLOR_ATTACHMENT14_EXT 0x8cee +#define GL_COLOR_ATTACHMENT15_EXT 0x8cef +#define GL_DEPTH_ATTACHMENT_EXT 0x8d00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8d20 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8cd5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8cd6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8cd7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8cd9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8cda +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8cdb +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8cdc +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8cdd +#define GL_FRAMEBUFFER_BINDING_EXT 0x8ca6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8ca7 +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8cdF +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84e8 +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#endif +typedef GLboolean (WINE_GLAPI *PGLFNGLISRENDERBUFFEREXTPROC)(GLuint renderbuffer); +typedef void (WINE_GLAPI *PGLFNGLBINDRENDERBUFFEREXTPROC)(GLenum target, GLuint renderbuffer); +typedef void (WINE_GLAPI *PGLFNGLDELETERENDERBUFFERSEXTPROC)(GLsizei n, const GLuint *renderbuffers); +typedef void (WINE_GLAPI *PGLFNGLGENRENDERBUFFERSEXTPROC)(GLsizei n, GLuint *renderbuffers); +typedef void (WINE_GLAPI *PGLFNGLRENDERBUFFERSTORAGEEXTPROC)(GLenum target, + GLenum internalformat, GLsizei width, GLsizei height); +typedef void (WINE_GLAPI *PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC)(GLenum target, GLenum pname, GLint *params); +typedef GLboolean (WINE_GLAPI *PGLFNGLISFRAMEBUFFEREXTPROC)(GLuint framebuffer); +typedef void (WINE_GLAPI *PGLFNGLBINDFRAMEBUFFEREXTPROC)(GLenum target, GLuint framebuffer); +typedef void (WINE_GLAPI *PGLFNGLDELETEFRAMEBUFFERSEXTPROC)(GLsizei n, const GLuint *framebuffers); +typedef void (WINE_GLAPI *PGLFNGLGENFRAMEBUFFERSEXTPROC)(GLsizei n, GLuint *framebuffers); +typedef GLenum (WINE_GLAPI *PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)(GLenum target); +typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC)(GLenum target, GLenum attachment, + GLenum textarget, GLuint texture, GLint level); +typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC)(GLenum target, GLenum attachment, + GLenum textarget, GLuint texture, GLint level); +typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC)(GLenum target, GLenum attachment, + GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (WINE_GLAPI *PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC)(GLenum target, GLenum attachment, + GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (WINE_GLAPI *PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC)(GLenum target, + GLenum attachment, GLenum pname, GLint *params); +typedef void (WINE_GLAPI *PGLFNGLGENERATEMIPMAPEXTPROC)(GLenum target); + +/* GL_EXT_gpu_program_parameters */ +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 +typedef void (WINE_GLAPI *PGLFNPROGRAMENVPARAMETERS4FVEXTPROC)(GLenum target, + GLuint index, GLsizei count, const float *params); +typedef void (WINE_GLAPI *PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC)(GLenum target, + GLuint index, GLsizei count, const float *params); +#endif + +/* GL_EXT_gpu_shader4 */ +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88fd +#define GL_SAMPLER_1D_ARRAY_EXT 0x8dc0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8dc1 +#define GL_SAMPLER_BUFFER_EXT 0x8dc2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8dc3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8dc4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8dc5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8dc6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8dc7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8dc8 +#define GL_INT_SAMPLER_1D_EXT 0x8dc9 +#define GL_INT_SAMPLER_2D_EXT 0x8dca +#define GL_INT_SAMPLER_3D_EXT 0x8dcb +#define GL_INT_SAMPLER_CUBE_EXT 0x8dcc +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8dcd +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8dce +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8dcf +#define GL_INT_SAMPLER_BUFFER_EXT 0x8dd0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8dd1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8dd2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8dd3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8dd4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8dd5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8dd6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8dd7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8dd8 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905 +#endif +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1IEXTPROC)(GLuint index, GLint x); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2IEXTPROC)(GLuint index, GLint x, GLint y); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3IEXTPROC)(GLuint index, GLint x, GLint y, GLint z); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4IEXTPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1UIEXTPROC)(GLuint index, GLuint x); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2UIEXTPROC)(GLuint index, GLuint x, GLuint y); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3UIEXTPROC)(GLuint index, GLuint x, GLuint y, GLuint z); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4UIEXTPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1IVEXTPROC)(GLuint index, const GLint *v); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2IVEXTPROC)(GLuint index, const GLint *v); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3IVEXTPROC)(GLuint index, const GLint *v); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4IVEXTPROC)(GLuint index, const GLint *v); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI1UIVEXTPROC)(GLuint index, const GLuint *v); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI2UIVEXTPROC)(GLuint index, const GLuint *v); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI3UIVEXTPROC)(GLuint index, const GLuint *v); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4UIVEXTPROC)(GLuint index, const GLuint *v); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4BVEXTPROC)(GLuint index, const GLbyte *v); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4SVEXTPROC)(GLuint index, const GLshort *v); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4UBVEXTPROC)(GLuint index, const GLubyte *v); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBI4USVEXTPROC)(GLuint index, const GLushort *v); +typedef GLvoid (WINE_GLAPI *PGLFNVERTEXATTRIBIPOINTEREXTPROC)(GLuint index, GLint size, GLenum type, + GLsizei stride, const GLvoid *pointer); +typedef GLvoid (WINE_GLAPI *PGLFNGETVERTEXATTRIBIIVEXTPROC)(GLuint index, GLenum pname, GLint *params); +typedef GLvoid (WINE_GLAPI *PGLFNGETVERTEXATTRIBIUIVEXTPROC)(GLuint index, GLenum pname, GLuint *params); +typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM1UIEXTPROC)(GLint location, GLuint v0); +typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM2UIEXTPROC)(GLint location, GLuint v0, GLuint v1); +typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM3UIEXTPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM4UIEXTPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM1UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value); +typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM2UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value); +typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM3UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value); +typedef GLvoid (WINE_GLAPI *PGLFNUNIFORM4UIVEXTPROC)(GLint location, GLsizei count, const GLuint *value); +typedef GLvoid (WINE_GLAPI *PGLFNGETUNIFORMUIVEXTPROC)(GLuint program, GLint location, const GLuint *params); +typedef GLvoid (WINE_GLAPI *PGLFNBINDFRAGDATALOCATIONEXTPROC)(GLuint program, GLuint color_number, const GLchar *name); +typedef GLint (WINE_GLAPI *PGLFNGETFRAGDATALOCATIONEXTPROC)(GLuint program, const GLchar *name); /* GL_EXT_packed_depth_stencil */ #ifndef GL_EXT_packed_depth_stencil #define GL_EXT_packed_depth_stencil 1 -#define GL_DEPTH_STENCIL_EXT 0x84f9 -#define GL_UNSIGNED_INT_24_8_EXT 0x84fa -#define GL_DEPTH24_STENCIL8_EXT 0x88f0 -#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88f1 +#define GL_DEPTH_STENCIL_EXT 0x84f9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84fa +#define GL_DEPTH24_STENCIL8_EXT 0x88f0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88f1 #endif -/* GL_EXT_secondary_color */ -#ifndef GL_EXT_secondary_color -#define GL_EXT_secondary_color 1 -#define GL_COLOR_SUM_EXT 0x8458 -#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 -#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A -#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B -#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C -#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D -#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E -#endif -typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); -typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); -typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); -typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); -typedef void (WINE_GLAPI * PGLFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); /* GL_EXT_paletted_texture */ #ifndef GL_EXT_paletted_texture #define GL_EXT_paletted_texture 1 -#define GL_COLOR_INDEX1_EXT 0x80E2 -#define GL_COLOR_INDEX2_EXT 0x80E3 -#define GL_COLOR_INDEX4_EXT 0x80E4 -#define GL_COLOR_INDEX8_EXT 0x80E5 -#define GL_COLOR_INDEX12_EXT 0x80E6 -#define GL_COLOR_INDEX16_EXT 0x80E7 -#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +#define GL_COLOR_INDEX1_EXT 0x80e2 +#define GL_COLOR_INDEX2_EXT 0x80e3 +#define GL_COLOR_INDEX4_EXT 0x80e4 +#define GL_COLOR_INDEX8_EXT 0x80e5 +#define GL_COLOR_INDEX12_EXT 0x80e6 +#define GL_COLOR_INDEX16_EXT 0x80e7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ed #endif -typedef void (WINE_GLAPI * PGLFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid *table); +typedef void (WINE_GLAPI *PGLFNGLCOLORTABLEEXTPROC)(GLenum target, GLenum internalFormat, + GLsizei width, GLenum format, GLenum type, const GLvoid *table); + /* GL_EXT_point_parameters */ #ifndef GL_EXT_point_parameters #define GL_EXT_point_parameters 1 -#define GL_POINT_SIZE_MIN_EXT 0x8126 -#define GL_POINT_SIZE_MAX_EXT 0x8127 -#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 -#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 #endif -typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); -typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); +typedef void (WINE_GLAPI *PGLFNGLPOINTPARAMETERFEXTPROC)(GLenum pname, GLfloat param); +typedef void (WINE_GLAPI *PGLFNGLPOINTPARAMETERFVEXTPROC)(GLenum pname, const GLfloat *params); /* GL_EXT_provoking_vertex */ #ifndef GL_EXT_provoking_vertex @@ -2109,2025 +3196,1304 @@ typedef void (WINE_GLAPI * PGLFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const #define GL_PROVOKING_VERTEX_EXT 0x8e4f #define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8e4c #endif -typedef void (WINE_GLAPI * PGLFNGLPROVOKINGVERTEXEXTPROC)(GLenum mode); +typedef void (WINE_GLAPI *PGLFNGLPROVOKINGVERTEXEXTPROC)(GLenum mode); + +/* GL_EXT_secondary_color */ +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845a +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845b +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845c +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845d +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845e +#endif +typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3FEXTPROC)(GLfloat red, GLfloat green, GLfloat blue); +typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3FVEXTPROC)(const GLfloat *v); +typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3UBEXTPROC)(GLubyte red, GLubyte green, GLubyte blue); +typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLOR3UBVEXTPROC)(const GLubyte *v); +typedef void (WINE_GLAPI *PGLFNGLSECONDARYCOLORPOINTEREXTPROC)(GLint size, GLenum type, + GLsizei stride, const GLvoid *pointer); + +/* GL_EXT_stencil_two_side */ +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +#endif +typedef void (WINE_GLAPI *PGLFNACTIVESTENCILFACEEXTPROC)(GLenum face); + +/* GL_EXT_stencil_wrap */ +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif /* GL_EXT_texture3D */ #ifndef GL_EXT_texture3D #define GL_EXT_texture3D 1 -#define GL_PACK_SKIP_IMAGES_EXT 0x806B -#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C -#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D -#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E -#define GL_TEXTURE_3D_EXT 0x806F -#define GL_PROXY_TEXTURE_3D_EXT 0x8070 -#define GL_TEXTURE_DEPTH_EXT 0x8071 -#define GL_TEXTURE_WRAP_R_EXT 0x8072 -#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +#define GL_PACK_SKIP_IMAGES_EXT 0x806b +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806c +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806d +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806e +#define GL_TEXTURE_3D_EXT 0x806f +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 #endif -typedef void (WINE_GLAPI * PGLFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -typedef void (WINE_GLAPI * PGLFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); -/* GL_EXT_texture_env_combine */ -#ifndef GL_EXT_texture_env_combine -#define GL_EXT_texture_env_combine 1 -#define GL_COMBINE_EXT 0x8570 -#define GL_COMBINE_RGB_EXT 0x8571 -#define GL_COMBINE_ALPHA_EXT 0x8572 -#define GL_RGB_SCALE_EXT 0x8573 -#define GL_ADD_SIGNED_EXT 0x8574 -#define GL_INTERPOLATE_EXT 0x8575 -#define GL_SUBTRACT_EXT 0x84E7 -#define GL_CONSTANT_EXT 0x8576 -#define GL_PRIMARY_COLOR_EXT 0x8577 -#define GL_PREVIOUS_EXT 0x8578 -#define GL_SOURCE0_RGB_EXT 0x8580 -#define GL_SOURCE1_RGB_EXT 0x8581 -#define GL_SOURCE2_RGB_EXT 0x8582 -#define GL_SOURCE3_RGB_EXT 0x8583 -#define GL_SOURCE4_RGB_EXT 0x8584 -#define GL_SOURCE5_RGB_EXT 0x8585 -#define GL_SOURCE6_RGB_EXT 0x8586 -#define GL_SOURCE7_RGB_EXT 0x8587 -#define GL_SOURCE0_ALPHA_EXT 0x8588 -#define GL_SOURCE1_ALPHA_EXT 0x8589 -#define GL_SOURCE2_ALPHA_EXT 0x858A -#define GL_SOURCE3_ALPHA_EXT 0x858B -#define GL_SOURCE4_ALPHA_EXT 0x858C -#define GL_SOURCE5_ALPHA_EXT 0x858D -#define GL_SOURCE6_ALPHA_EXT 0x858E -#define GL_SOURCE7_ALPHA_EXT 0x858F -#define GL_OPERAND0_RGB_EXT 0x8590 -#define GL_OPERAND1_RGB_EXT 0x8591 -#define GL_OPERAND2_RGB_EXT 0x8592 -#define GL_OPERAND3_RGB_EXT 0x8593 -#define GL_OPERAND4_RGB_EXT 0x8594 -#define GL_OPERAND5_RGB_EXT 0x8595 -#define GL_OPERAND6_RGB_EXT 0x8596 -#define GL_OPERAND7_RGB_EXT 0x8597 -#define GL_OPERAND0_ALPHA_EXT 0x8598 -#define GL_OPERAND1_ALPHA_EXT 0x8599 -#define GL_OPERAND2_ALPHA_EXT 0x859A -#define GL_OPERAND3_ALPHA_EXT 0x859B -#define GL_OPERAND4_ALPHA_EXT 0x859C -#define GL_OPERAND5_ALPHA_EXT 0x859D -#define GL_OPERAND6_ALPHA_EXT 0x859E -#define GL_OPERAND7_ALPHA_EXT 0x859F -#endif -/* GL_EXT_texture_env_dot3 */ -#ifndef GL_EXT_texture_env_dot3 -#define GL_EXT_texture_env_dot3 1 -#define GL_DOT3_RGB_EXT 0x8740 -#define GL_DOT3_RGBA_EXT 0x8741 -#endif -/* GL_EXT_texture_lod_bias */ -#ifndef GL_EXT_texture_lod_bias -#define GL_EXT_texture_lod_bias 1 -#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD -#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 -#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 -#endif -/* GL_ARB_texture_border_clamp */ -#ifndef GL_ARB_texture_border_clamp -#define GL_ARB_texture_border_clamp 1 -#define GL_CLAMP_TO_BORDER_ARB 0x812D -#endif -/* GL_EXT_texture_filter_anisotropic */ -#ifndef GL_EXT_texture_filter_anisotropic -#define GL_EXT_texture_filter_anisotropic 1 -#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE -#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF -#endif -/* GL_ARB_texture_mirrored_repeat (full support GL1.4) */ -#ifndef GL_ARB_texture_mirrored_repeat -#define GL_ARB_texture_mirrored_repeat 1 -#define GL_MIRRORED_REPEAT_ARB 0x8370 -#endif -/* GL_ATI_texture_mirror_once */ -#ifndef GL_ATI_texture_mirror_once -#define GL_ATI_texture_mirror_once 1 -#define GL_MIRROR_CLAMP_ATI 0x8742 -#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 -#endif -/* GL_ARB_texture_env_dot3 */ -#ifndef GL_ARB_texture_env_dot3 -#define GL_ARB_texture_env_dot3 1 -#define GL_DOT3_RGB_ARB 0x86AE -#define GL_DOT3_RGBA_ARB 0x86AF -#endif -/* GL_EXT_texture_env_dot3 */ -#ifndef GL_EXT_texture_env_dot3 -#define GL_EXT_texture_env_dot3 1 -#define GL_DOT3_RGB_EXT 0x8740 -#define GL_DOT3_RGBA_EXT 0x8741 -#endif -/* GL_EXT_texture_sRGB */ -#ifndef GL_EXT_texture_sRGB -#define GL_EXT_texture_sRGB 1 -#define GL_SRGB_EXT 0x8C40 -#define GL_SRGB8_EXT 0x8C41 -#define GL_SRGB_ALPHA_EXT 0x8C42 -#define GL_SRGB8_ALPHA8_EXT 0x8C43 -#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 -#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 -#define GL_SLUMINANCE_EXT 0x8C46 -#define GL_SLUMINANCE8_EXT 0x8C47 -#define GL_COMPRESSED_SRGB_EXT 0x8C48 -#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 -#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A -#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B -#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E -#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F -#endif -/* GL_ARB_texture_float */ -#ifndef GL_ARB_texture_float -#define GL_ARB_texture_float 1 -#define GL_RGBA32F_ARB 0x8814 -#define GL_RGB32F_ARB 0x8815 -#define GL_RGBA16F_ARB 0x881A -#define GL_RGB16F_ARB 0x881B -#endif -/* GL_ARB_texture_rg */ -#ifndef GL_ARB_texture_rg -#define GL_RG 0x8227 -#define GL_RG_INTEGER 0x8228 -#define GL_R8 0x8229 -#define GL_R16 0x822A -#define GL_RG8 0x822B -#define GL_RG16 0x822C -#define GL_R16F 0x822D -#define GL_R32F 0x822E -#define GL_RG16F 0x822F -#define GL_RG32F 0x8230 -#define GL_R8I 0x8231 -#define GL_R8UI 0x8232 -#define GL_R16I 0x8233 -#define GL_R16UI 0x8234 -#define GL_R32I 0x8235 -#define GL_R32UI 0x8236 -#define GL_RG8I 0x8237 -#define GL_RG8UI 0x8238 -#define GL_RG16I 0x8239 -#define GL_RG16UI 0x823A -#define GL_RG32I 0x823B -#define GL_RG32UI 0x823C -#endif -/* GL_EXT_texture_swizzle */ -#ifndef GL_EXT_texture_swizzle -#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 -#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 -#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 -#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 -#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 -#endif -/* GL_ARB_half_float_pixel */ -#ifndef GL_ARB_half_float_pixel -#define GL_ARB_half_float_pixel -#define GL_HALF_FLOAT_ARB 0x140B -#endif -/* GL_ARB_vertex_program */ -#ifndef GL_ARB_vertex_program -#define GL_ARB_vertex_program 1 -#define GL_VERTEX_PROGRAM_ARB 0x8620 -#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 -#define GL_COLOR_SUM_ARB 0x8458 -#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A -#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 -#define GL_PROGRAM_LENGTH_ARB 0x8627 -#define GL_PROGRAM_FORMAT_ARB 0x8876 -#define GL_PROGRAM_BINDING_ARB 0x8677 -#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 -#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 -#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 -#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 -#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 -#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 -#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 -#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 -#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 -#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 -#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA -#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB -#define GL_PROGRAM_ATTRIBS_ARB 0x88AC -#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD -#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE -#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF -#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 -#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 -#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 -#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 -#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 -#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 -#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 -#define GL_PROGRAM_STRING_ARB 0x8628 -#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B -#define GL_CURRENT_MATRIX_ARB 0x8641 -#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 -#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 -#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 -#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F -#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E -#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 -#define GL_MATRIX0_ARB 0x88C0 -#define GL_MATRIX1_ARB 0x88C1 -#define GL_MATRIX2_ARB 0x88C2 -#define GL_MATRIX3_ARB 0x88C3 -#define GL_MATRIX4_ARB 0x88C4 -#define GL_MATRIX5_ARB 0x88C5 -#define GL_MATRIX6_ARB 0x88C6 -#define GL_MATRIX7_ARB 0x88C7 -#define GL_MATRIX8_ARB 0x88C8 -#define GL_MATRIX9_ARB 0x88C9 -#define GL_MATRIX10_ARB 0x88CA -#define GL_MATRIX11_ARB 0x88CB -#define GL_MATRIX12_ARB 0x88CC -#define GL_MATRIX13_ARB 0x88CD -#define GL_MATRIX14_ARB 0x88CE -#define GL_MATRIX15_ARB 0x88CF -#define GL_MATRIX16_ARB 0x88D0 -#define GL_MATRIX17_ARB 0x88D1 -#define GL_MATRIX18_ARB 0x88D2 -#define GL_MATRIX19_ARB 0x88D3 -#define GL_MATRIX20_ARB 0x88D4 -#define GL_MATRIX21_ARB 0x88D5 -#define GL_MATRIX22_ARB 0x88D6 -#define GL_MATRIX23_ARB 0x88D7 -#define GL_MATRIX24_ARB 0x88D8 -#define GL_MATRIX25_ARB 0x88D9 -#define GL_MATRIX26_ARB 0x88DA -#define GL_MATRIX27_ARB 0x88DB -#define GL_MATRIX28_ARB 0x88DC -#define GL_MATRIX29_ARB 0x88DD -#define GL_MATRIX30_ARB 0x88DE -#define GL_MATRIX31_ARB 0x88DF -#endif -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); -typedef void (WINE_GLAPI * PGLFNENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (WINE_GLAPI * PGLFNDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); -typedef void (WINE_GLAPI * PGLFNPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const GLvoid *string); -typedef void (WINE_GLAPI * PGLFNBINDPROGRAMARBPROC) (GLenum target, GLuint program); -typedef void (WINE_GLAPI * PGLFNDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); -typedef void (WINE_GLAPI * PGLFNGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); -typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); -typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); -typedef void (WINE_GLAPI * PGLFNGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (WINE_GLAPI * PGLFNGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (WINE_GLAPI * PGLFNGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); -typedef void (WINE_GLAPI * PGLFNGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); -typedef void (WINE_GLAPI * PGLFNGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (WINE_GLAPI * PGLFNGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, GLvoid *string); -typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (WINE_GLAPI * PGLFNISPROGRAMARBPROC) (GLuint program); -#ifndef GL_ARB_fragment_program -#define GL_ARB_fragment_program 1 -#define GL_FRAGMENT_PROGRAM_ARB 0x8804 -#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 -#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 -#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 -#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 -#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 -#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A -#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B -#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C -#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D -#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E -#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F -#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 -#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 -/* All ARB_fragment_program entry points are shared with ARB_vertex_program. */ -#endif -/* GL_ARB_multisample */ -#ifndef GL_ARB_multisample -#define GL_ARB_multisample 1 -#define GL_MULTISAMPLE_ARB 0x809D -#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E -#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F -#define GL_SAMPLE_COVERAGE_ARB 0x80A0 -#define GL_SAMPLE_BUFFERS_ARB 0x80A8 -#define GL_SAMPLES_ARB 0x80A9 -#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA -#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB -#define GL_MULTISAMPLE_BIT_ARB 0x20000000 -#endif -typedef void (WINE_GLAPI * WINED3D_PFNGLSAMPLECOVERAGEARBPROC) (GLclampf value, GLboolean invert); -/* GL_ARB_vertex_buffer_object */ -#ifndef GL_ARB_vertex_buffer_object -#define GL_ARB_vertex_buffer_object 1 -#define GL_BUFFER_SIZE_ARB 0x8764 -#define GL_BUFFER_USAGE_ARB 0x8765 -#define GL_ARRAY_BUFFER_ARB 0x8892 -#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 -#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 -#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 -#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 -#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 -#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 -#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 -#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A -#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B -#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C -#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D -#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E -#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F -#define GL_READ_ONLY_ARB 0x88B8 -#define GL_WRITE_ONLY_ARB 0x88B9 -#define GL_READ_WRITE_ARB 0x88BA -#define GL_BUFFER_ACCESS_ARB 0x88BB -#define GL_BUFFER_MAPPED_ARB 0x88BC -#define GL_BUFFER_MAP_POINTER_ARB 0x88BD -#define GL_STREAM_DRAW_ARB 0x88E0 -#define GL_STREAM_READ_ARB 0x88E1 -#define GL_STREAM_COPY_ARB 0x88E2 -#define GL_STATIC_DRAW_ARB 0x88E4 -#define GL_STATIC_READ_ARB 0x88E5 -#define GL_STATIC_COPY_ARB 0x88E6 -#define GL_DYNAMIC_DRAW_ARB 0x88E8 -#define GL_DYNAMIC_READ_ARB 0x88E9 -#define GL_DYNAMIC_COPY_ARB 0x88EA -#endif -typedef void (WINE_GLAPI * PGLFNBINDBUFFERARBPROC) (GLenum target, GLuint buffer); -typedef void (WINE_GLAPI * PGLFNDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); -typedef void (WINE_GLAPI * PGLFNGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); -typedef GLboolean (WINE_GLAPI * PGLFNISBUFFERARBPROC) (GLuint buffer); -typedef void (WINE_GLAPI * PGLFNBUFFERDATAARBPROC) (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage); -typedef void (WINE_GLAPI * PGLFNBUFFERSUBDATAARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid *data); -typedef void (WINE_GLAPI * PGLFNGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLvoid *data); -typedef GLvoid* (WINE_GLAPI * PGLFNMAPBUFFERARBPROC) (GLenum target, GLenum access); -typedef GLboolean (WINE_GLAPI * PGLFNUNMAPBUFFERARBPROC) (GLenum target); -typedef void (WINE_GLAPI * PGLFNGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (WINE_GLAPI * PGLFNGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, GLvoid* *params); -/* GL_EXT_blend_equation_separate */ -typedef void (WINE_GLAPI * PGLFNBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); -/* GL_EXT_blend_func_separate */ -#ifndef GL_EXT_blend_func_separate -#define GL_BLEND_DST_RGB_EXT 0x80C8 -#define GL_BLEND_SRC_RGB_EXT 0x80C9 -#define GL_BLEND_DST_ALPHA_EXT 0x80CA -#define GL_BLEND_SRC_ALPHA_EXT 0x80CB -#endif -typedef void (WINE_GLAPI * PGLFNBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); -/* GL_EXT_fog_coord */ -#ifndef GL_EXT_fog_coord -#define GL_EXT_fog_coord 1 -#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 -#define GL_FOG_COORDINATE_EXT 0x8451 -#define GL_FRAGMENT_DEPTH_EXT 0x8452 -#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 -#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 -#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 -#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 -#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 -#endif /* GL_EXT_fog_coord */ -typedef void (WINE_GLAPI * PGLFNGLFOGCOORDFEXTPROC) (GLfloat coord); -typedef void (WINE_GLAPI * PGLFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); -typedef void (WINE_GLAPI * PGLFNGLFOGCOORDDEXTPROC) (GLdouble coord); -typedef void (WINE_GLAPI * PGLFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); -typedef void (WINE_GLAPI * PGLFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, GLvoid *data); -/* GL_ARB_shader_objects (GLSL) */ -#ifndef GL_ARB_shader_objects -#define GL_ARB_shader_objects 1 -typedef char GLcharARB; -typedef unsigned int GLhandleARB; -#define GL_PROGRAM_OBJECT_ARB 0x8B40 -#define GL_OBJECT_TYPE_ARB 0x8B4E -#define GL_OBJECT_SUBTYPE_ARB 0x8B4F -#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 -#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 -#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 -#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 -#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 -#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 -#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 -#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 -#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 -#define GL_SHADER_OBJECT_ARB 0x8B48 -#define GL_FLOAT_VEC2_ARB 0x8B50 -#define GL_FLOAT_VEC3_ARB 0x8B51 -#define GL_FLOAT_VEC4_ARB 0x8B52 -#define GL_INT_VEC2_ARB 0x8B53 -#define GL_INT_VEC3_ARB 0x8B54 -#define GL_INT_VEC4_ARB 0x8B55 -#define GL_BOOL_ARB 0x8B56 -#define GL_BOOL_VEC2_ARB 0x8B57 -#define GL_BOOL_VEC3_ARB 0x8B58 -#define GL_BOOL_VEC4_ARB 0x8B59 -#define GL_FLOAT_MAT2_ARB 0x8B5A -#define GL_FLOAT_MAT3_ARB 0x8B5B -#define GL_FLOAT_MAT4_ARB 0x8B5C -#define GL_SAMPLER_1D_ARB 0x8B5D -#define GL_SAMPLER_2D_ARB 0x8B5E -#define GL_SAMPLER_3D_ARB 0x8B5F -#define GL_SAMPLER_CUBE_ARB 0x8B60 -#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 -#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPELR_2D_RECT_SHADOW_ARB 0x8B64 -#endif -#ifndef GL_ARB_shading_language_100 -#define GL_ARB_shading_language_100 1 -#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C -#endif -#ifndef GL_ARB_fragment_shader -#define GL_ARB_fragment_shader 1 -#define GL_FRAGMENT_SHADER_ARB 0x8B30 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B -#endif -#ifndef GL_ARB_vertex_shader -#define GL_ARB_vertex_shader 1 -#define GL_VERTEX_SHADER_ARB 0x8B31 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A -#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D -#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 -#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A -#endif -typedef void (WINE_GLAPI * WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); -typedef void (WINE_GLAPI * WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); -typedef GLint (WINE_GLAPI * WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -typedef void (WINE_GLAPI * WINED3D_PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (WINE_GLAPI * WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (WINE_GLAPI * WINED3D_PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); -typedef void (WINE_GLAPI * WINED3D_PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); -typedef void (WINE_GLAPI * WINED3D_PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); -typedef void (WINE_GLAPI * WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); -typedef GLhandleARB (WINE_GLAPI * WINED3D_PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); -typedef void (WINE_GLAPI * WINED3D_PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB* *string, const GLint *length); -typedef void (WINE_GLAPI * WINED3D_PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); -typedef GLhandleARB (WINE_GLAPI * WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC) (void); -typedef void (WINE_GLAPI * WINED3D_PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); -typedef void (WINE_GLAPI * WINED3D_PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (WINE_GLAPI * WINED3D_PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); -typedef void (WINE_GLAPI * WINED3D_PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); -typedef void (WINE_GLAPI * WINED3D_PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); -typedef void (WINE_GLAPI * WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); -typedef GLhandleARB (WINE_GLAPI * WINED3D_PFNGLGETHANDLEARBPROC) (GLenum pname); -typedef void (WINE_GLAPI * WINED3D_PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); -typedef void (WINE_GLAPI * WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); -typedef GLint (WINE_GLAPI * WINED3D_PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); -/* GL_ARB_pixel_buffer_object */ -#ifndef GL_ARB_pixel_buffer_object -#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB -#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC -#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED -#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF -#endif -/* GL_EXT_texture */ -#ifndef GL_EXT_texture -#define GL_EXT_texture 1 -#define GL_ALPHA4_EXT 0x803B -#define GL_ALPHA8_EXT 0x803C -#define GL_ALPHA12_EXT 0x803D -#define GL_ALPHA16_EXT 0x803E -#define GL_LUMINANCE4_EXT 0x803F -#define GL_LUMINANCE8_EXT 0x8040 -#define GL_LUMINANCE12_EXT 0x8041 -#define GL_LUMINANCE16_EXT 0x8042 -#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 -#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 -#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 -#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 -#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 -#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 -#define GL_INTENSITY_EXT 0x8049 -#define GL_INTENSITY4_EXT 0x804A -#define GL_INTENSITY8_EXT 0x804B -#define GL_INTENSITY12_EXT 0x804C -#define GL_INTENSITY16_EXT 0x804D -#define GL_RGB2_EXT 0x804E -#define GL_RGB4_EXT 0x804F -#define GL_RGB5_EXT 0x8050 -#define GL_RGB8_EXT 0x8051 -#define GL_RGB10_EXT 0x8052 -#define GL_RGB12_EXT 0x8053 -#define GL_RGB16_EXT 0x8054 -#define GL_RGBA2_EXT 0x8055 -#define GL_RGBA4_EXT 0x8056 -#define GL_RGB5_A1_EXT 0x8057 -#define GL_RGBA8_EXT 0x8058 -#define GL_RGB10_A2_EXT 0x8059 -#define GL_RGBA12_EXT 0x805A -#define GL_RGBA16_EXT 0x805B -#define GL_TEXTURE_RED_SIZE_EXT 0x805C -#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D -#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E -#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 -#define GL_REPLACE_EXT 0x8062 -#define GL_PROXY_TEXTURE_1D_EXT 0x8063 -#define GL_PROXY_TEXTURE_2D_EXT 0x8064 -#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +typedef void (WINE_GLAPI *PGLFNGLTEXIMAGE3DEXTPROC)(GLenum target, GLint level, GLenum internalformat, + GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +typedef void (WINE_GLAPI *PGLFNGLTEXSUBIMAGE3DEXTPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, + GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels); + +/* GL_EXT_texture_compression_rgtc */ +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8dbb +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8dbc +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8dbd +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8dbe #endif + /* GL_EXT_texture_compression_s3tc */ #ifndef GL_EXT_texture_compression_s3tc #define GL_EXT_texture_compression_s3tc 1 -#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 -#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 -#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 -#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83f0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83f1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83f2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83f3 #endif -typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); -typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (WINE_GLAPI * PGLFNCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); -typedef void (WINE_GLAPI * PGLFNGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); -/* GL_EXT_stencil_wrap */ -#ifndef GL_EXT_stencil_wrap -#define GL_EXT_stencil_wrap 1 -#define GL_INCR_WRAP_EXT 0x8507 -#define GL_DECR_WRAP_EXT 0x8508 +typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat, + GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, + GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, + GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level, + GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, + GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, + GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (WINE_GLAPI *PGLFNCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, + GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (WINE_GLAPI *PGLFNGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void *img); + +/* GL_EXT_texture_env_combine */ +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_SUBTRACT_EXT 0x84e7 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE3_RGB_EXT 0x8583 +#define GL_SOURCE4_RGB_EXT 0x8584 +#define GL_SOURCE5_RGB_EXT 0x8585 +#define GL_SOURCE6_RGB_EXT 0x8586 +#define GL_SOURCE7_RGB_EXT 0x8587 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858a +#define GL_SOURCE3_ALPHA_EXT 0x858b +#define GL_SOURCE4_ALPHA_EXT 0x858c +#define GL_SOURCE5_ALPHA_EXT 0x858d +#define GL_SOURCE6_ALPHA_EXT 0x858e +#define GL_SOURCE7_ALPHA_EXT 0x858f +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND3_RGB_EXT 0x8593 +#define GL_OPERAND4_RGB_EXT 0x8594 +#define GL_OPERAND5_RGB_EXT 0x8595 +#define GL_OPERAND6_RGB_EXT 0x8596 +#define GL_OPERAND7_RGB_EXT 0x8597 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859a +#define GL_OPERAND3_ALPHA_EXT 0x859b +#define GL_OPERAND4_ALPHA_EXT 0x859c +#define GL_OPERAND5_ALPHA_EXT 0x859d +#define GL_OPERAND6_ALPHA_EXT 0x859e +#define GL_OPERAND7_ALPHA_EXT 0x859f #endif -/* GL_ARB_half_float_vertex */ -#ifndef GL_ARB_half_float_vertex -#define GL_ARB_half_float_vertex -/* No _ARB, see extension spec */ -#define GL_HALF_FLOAT 0x140B +/* GL_EXT_texture_env_dot3 */ +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 #endif -/* GL_NV_half_float */ -#ifndef GL_NV_half_float -#define GL_NV_half_float 1 -typedef unsigned short GLhalfNV; -#define GL_HALF_FLOAT_NV 0x140B + +/* GL_EXT_texture_filter_anisotropic */ +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84fe +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84ff #endif -typedef void (WINE_GLAPI * PGLFNVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); -typedef void (WINE_GLAPI * PGLFNVERTEX2HVNVPROC) (const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (WINE_GLAPI * PGLFNVERTEX3HVNVPROC) (const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (WINE_GLAPI * PGLFNVERTEX4HVNVPROC) (const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); -typedef void (WINE_GLAPI * PGLFNNORMAL3HVNVPROC) (const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (WINE_GLAPI * PGLFNCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); -typedef void (WINE_GLAPI * PGLFNCOLOR4HVNVPROC) (const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNTEXCOORD1HNVPROC) (GLhalfNV s); -typedef void (WINE_GLAPI * PGLFNTEXCOORD1HVNVPROC) (const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); -typedef void (WINE_GLAPI * PGLFNTEXCOORD2HVNVPROC) (const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (WINE_GLAPI * PGLFNTEXCOORD3HVNVPROC) (const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (WINE_GLAPI * PGLFNTEXCOORD4HVNVPROC) (const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); -typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); -typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); -typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); -typedef void (WINE_GLAPI * PGLFNMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNFOGCOORDHNVPROC) (GLhalfNV fog); -typedef void (WINE_GLAPI * PGLFNFOGCOORDHVNVPROC) (const GLhalfNV *fog); -typedef void (WINE_GLAPI * PGLFNSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); -typedef void (WINE_GLAPI * PGLFNSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNVERTEXWEIGHTHNVPROC) (GLhalfNV weight); -typedef void (WINE_GLAPI * PGLFNVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); + +/* GL_EXT_texture_lod_bias */ +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84fd +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif + +/* GL_EXT_texture_sRGB */ +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 +#define GL_SRGB_EXT 0x8c40 +#define GL_SRGB8_EXT 0x8c41 +#define GL_SRGB_ALPHA_EXT 0x8c42 +#define GL_SRGB8_ALPHA8_EXT 0x8c43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8c44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8c45 +#define GL_SLUMINANCE_EXT 0x8c46 +#define GL_SLUMINANCE8_EXT 0x8c47 +#define GL_COMPRESSED_SRGB_EXT 0x8c48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8c49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8c4a +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8c4b +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8c4c +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8c4d +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8c4e +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8c4f +#endif + +/* GL_NV_depth_clamp */ +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 +#define GL_DEPTH_CLAMP_NV 0x864f +#endif + +/* GL_NV_fence */ +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#define GL_ALL_COMPLETED_NV 0x84f2 +#define GL_FENCE_STATUS_NV 0x84f3 +#define GL_FENCE_CONDITION_NV 0x84f4 +#endif +typedef void (WINE_GLAPI *PGLFNGENFENCESNVPROC)(GLsizei, GLuint *); +typedef void (WINE_GLAPI *PGLFNDELETEFENCESNVPROC)(GLuint, const GLuint *); +typedef void (WINE_GLAPI *PGLFNSETFENCENVPROC)(GLuint, GLenum); +typedef GLboolean (WINE_GLAPI *PGLFNTESTFENCENVPROC)(GLuint); +typedef void (WINE_GLAPI *PGLFNFINISHFENCENVPROC)(GLuint); +typedef GLboolean (WINE_GLAPI *PGLFNISFENCENVPROC)(GLuint); +typedef void (WINE_GLAPI *PGLFNGETFENCEIVNVPROC)(GLuint, GLenum, GLint *); /* GL_NV_fog_distance */ #ifndef GL_NV_fog_distance #define GL_NV_fog_distance 1 -#define GL_FOG_DISTANCE_MODE_NV 0x855A -#define GL_EYE_RADIAL_NV 0x855B -#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +#define GL_FOG_DISTANCE_MODE_NV 0x855a +#define GL_EYE_RADIAL_NV 0x855b +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855c /* reuse GL_EYE_PLANE */ #endif -/* GL_NV_texgen_reflection */ -#ifndef GL_NV_texgen_reflection -#define GL_NV_texgen_reflection 1 -#define GL_NORMAL_MAP_NV 0x8511 -#define GL_REFLECTION_MAP_NV 0x8512 + +/* GL_NV_half_float */ +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +typedef unsigned short GLhalfNV; +#define GL_HALF_FLOAT_NV 0x140b #endif -/* GL_NV_texture_env_combine4 */ -#ifndef GL_NV_texture_env_combine4 -#define GL_NV_texture_env_combine4 1 -#define GL_COMBINE4_NV 0x8503 -#define GL_SOURCE3_RGB_NV 0x8583 -#define GL_SOURCE3_ALPHA_NV 0x858B -#define GL_OPERAND3_RGB_NV 0x8593 -#define GL_OPERAND3_ALPHA_NV 0x859B +typedef void (WINE_GLAPI *PGLFNVERTEX2HNVPROC)(GLhalfNV x, GLhalfNV y); +typedef void (WINE_GLAPI *PGLFNVERTEX2HVNVPROC)(const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNVERTEX3HNVPROC)(GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (WINE_GLAPI *PGLFNVERTEX3HVNVPROC)(const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNVERTEX4HNVPROC)(GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (WINE_GLAPI *PGLFNVERTEX4HVNVPROC)(const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNNORMAL3HNVPROC)(GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (WINE_GLAPI *PGLFNNORMAL3HVNVPROC)(const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNCOLOR3HNVPROC)(GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (WINE_GLAPI *PGLFNCOLOR3HVNVPROC)(const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNCOLOR4HNVPROC)(GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (WINE_GLAPI *PGLFNCOLOR4HVNVPROC)(const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNTEXCOORD1HNVPROC)(GLhalfNV s); +typedef void (WINE_GLAPI *PGLFNTEXCOORD1HVNVPROC)(const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNTEXCOORD2HNVPROC)(GLhalfNV s, GLhalfNV t); +typedef void (WINE_GLAPI *PGLFNTEXCOORD2HVNVPROC)(const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNTEXCOORD3HNVPROC)(GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (WINE_GLAPI *PGLFNTEXCOORD3HVNVPROC)(const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNTEXCOORD4HNVPROC)(GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (WINE_GLAPI *PGLFNTEXCOORD4HVNVPROC)(const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD1HNVPROC)(GLenum target, GLhalfNV s); +typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD1HVNVPROC)(GLenum target, const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD2HNVPROC)(GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD2HVNVPROC)(GLenum target, const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD3HNVPROC)(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD3HVNVPROC)(GLenum target, const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD4HNVPROC)(GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (WINE_GLAPI *PGLFNMULTITEXCOORD4HVNVPROC)(GLenum target, const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNFOGCOORDHNVPROC)(GLhalfNV fog); +typedef void (WINE_GLAPI *PGLFNFOGCOORDHVNVPROC)(const GLhalfNV *fog); +typedef void (WINE_GLAPI *PGLFNSECONDARYCOLOR3HNVPROC)(GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (WINE_GLAPI *PGLFNSECONDARYCOLOR3HVNVPROC)(const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNVERTEXWEIGHTHNVPROC)(GLhalfNV weight); +typedef void (WINE_GLAPI *PGLFNVERTEXWEIGHTHVNVPROC)(const GLhalfNV *weight); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1HNVPROC)(GLuint index, GLhalfNV x); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB1HVNVPROC)(GLuint index, const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2HNVPROC)(GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB2HVNVPROC)(GLuint index, const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3HNVPROC)(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB3HVNVPROC)(GLuint index, const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4HNVPROC)(GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIB4HVNVPROC)(GLuint index, const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS1HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS2HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS3HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (WINE_GLAPI *PGLFNVERTEXATTRIBS4HVNVPROC)(GLuint index, GLsizei n, const GLhalfNV *v); + +/* GL_NV_light_max_exponent */ +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 #endif + /* GL_NV_register_combiners */ #ifndef GL_NV_register_combiners #define GL_NV_register_combiners 1 -#define GL_REGISTER_COMBINERS_NV 0x8522 -#define GL_VARIABLE_A_NV 0x8523 -#define GL_VARIABLE_B_NV 0x8524 -#define GL_VARIABLE_C_NV 0x8525 -#define GL_VARIABLE_D_NV 0x8526 -#define GL_VARIABLE_E_NV 0x8527 -#define GL_VARIABLE_F_NV 0x8528 -#define GL_VARIABLE_G_NV 0x8529 -#define GL_CONSTANT_COLOR0_NV 0x852A -#define GL_CONSTANT_COLOR1_NV 0x852B -#define GL_PRIMARY_COLOR_NV 0x852C -#define GL_SECONDARY_COLOR_NV 0x852D -#define GL_SPARE0_NV 0x852E -#define GL_SPARE1_NV 0x852F -#define GL_DISCARD_NV 0x8530 -#define GL_E_TIMES_F_NV 0x8531 -#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 -#define GL_UNSIGNED_IDENTITY_NV 0x8536 -#define GL_UNSIGNED_INVERT_NV 0x8537 -#define GL_EXPAND_NORMAL_NV 0x8538 -#define GL_EXPAND_NEGATE_NV 0x8539 -#define GL_HALF_BIAS_NORMAL_NV 0x853A -#define GL_HALF_BIAS_NEGATE_NV 0x853B -#define GL_SIGNED_IDENTITY_NV 0x853C -#define GL_SIGNED_NEGATE_NV 0x853D -#define GL_SCALE_BY_TWO_NV 0x853E -#define GL_SCALE_BY_FOUR_NV 0x853F -#define GL_SCALE_BY_ONE_HALF_NV 0x8540 -#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 -#define GL_COMBINER_INPUT_NV 0x8542 -#define GL_COMBINER_MAPPING_NV 0x8543 -#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 -#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 -#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 -#define GL_COMBINER_MUX_SUM_NV 0x8547 -#define GL_COMBINER_SCALE_NV 0x8548 -#define GL_COMBINER_BIAS_NV 0x8549 -#define GL_COMBINER_AB_OUTPUT_NV 0x854A -#define GL_COMBINER_CD_OUTPUT_NV 0x854B -#define GL_COMBINER_SUM_OUTPUT_NV 0x854C -#define GL_MAX_GENERAL_COMBINERS_NV 0x854D -#define GL_NUM_GENERAL_COMBINERS_NV 0x854E -#define GL_COLOR_SUM_CLAMP_NV 0x854F -#define GL_COMBINER0_NV 0x8550 -#define GL_COMBINER1_NV 0x8551 -#define GL_COMBINER2_NV 0x8552 -#define GL_COMBINER3_NV 0x8553 -#define GL_COMBINER4_NV 0x8554 -#define GL_COMBINER5_NV 0x8555 -#define GL_COMBINER6_NV 0x8556 -#define GL_COMBINER7_NV 0x8557 +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852a +#define GL_CONSTANT_COLOR1_NV 0x852b +#define GL_PRIMARY_COLOR_NV 0x852c +#define GL_SECONDARY_COLOR_NV 0x852d +#define GL_SPARE0_NV 0x852e +#define GL_SPARE1_NV 0x852f +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853a +#define GL_HALF_BIAS_NEGATE_NV 0x853b +#define GL_SIGNED_IDENTITY_NV 0x853c +#define GL_SIGNED_NEGATE_NV 0x853d +#define GL_SCALE_BY_TWO_NV 0x853e +#define GL_SCALE_BY_FOUR_NV 0x853f +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854a +#define GL_COMBINER_CD_OUTPUT_NV 0x854b +#define GL_COMBINER_SUM_OUTPUT_NV 0x854c +#define GL_MAX_GENERAL_COMBINERS_NV 0x854d +#define GL_NUM_GENERAL_COMBINERS_NV 0x854e +#define GL_COLOR_SUM_CLAMP_NV 0x854f +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 /* reuse GL_TEXTURE0_ARB */ /* reuse GL_TEXTURE1_ARB */ /* reuse GL_ZERO */ /* reuse GL_NONE */ /* reuse GL_FOG */ #endif -typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); -typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); -typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); -typedef void (WINE_GLAPI * PGLFNCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); -typedef void (WINE_GLAPI * PGLFNCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (WINE_GLAPI * PGLFNCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); -typedef void (WINE_GLAPI * PGLFNFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); -typedef void (WINE_GLAPI * PGLFNGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); -typedef void (WINE_GLAPI * PGLFNGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); -typedef void (WINE_GLAPI * PGLFNGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); -typedef void (WINE_GLAPI * PGLFNGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); -typedef void (WINE_GLAPI * PGLFNGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); -typedef void (WINE_GLAPI * PGLFNGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERFVNVPROC)(GLenum pname, const GLfloat *params); +typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERFNVPROC)(GLenum pname, GLfloat param); +typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERIVNVPROC)(GLenum pname, const GLint *params); +typedef void (WINE_GLAPI *PGLFNCOMBINERPARAMETERINVPROC)(GLenum pname, GLint param); +typedef void (WINE_GLAPI *PGLFNCOMBINERINPUTNVPROC)(GLenum stage, GLenum portion, + GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (WINE_GLAPI *PGLFNCOMBINEROUTPUTNVPROC)(GLenum stage, GLenum portion, + GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, + GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (WINE_GLAPI *PGLFNFINALCOMBINERINPUTNVPROC)(GLenum variable, GLenum input, + GLenum mapping, GLenum componentUsage); +typedef void (WINE_GLAPI *PGLFNGETCOMBINERINPUTPARAMETERFVNVPROC)(GLenum stage, GLenum portion, + GLenum variable, GLenum pname, GLfloat *params); +typedef void (WINE_GLAPI *PGLFNGETCOMBINERINPUTPARAMETERIVNVPROC)(GLenum stage, GLenum portion, + GLenum variable, GLenum pname, GLint *params); +typedef void (WINE_GLAPI *PGLFNGETCOMBINEROUTPUTPARAMETERFVNVPROC)(GLenum stage, GLenum portion, + GLenum pname, GLfloat *params); +typedef void (WINE_GLAPI *PGLFNGETCOMBINEROUTPUTPARAMETERIVNVPROC)(GLenum stage, GLenum portion, + GLenum pname, GLint *params); +typedef void (WINE_GLAPI *PGLFNGETFINALCOMBINERINPUTPARAMETERFVNVPROC)(GLenum variable, GLenum pname, GLfloat *params); +typedef void (WINE_GLAPI *PGLFNGETFINALCOMBINERINPUTPARAMETERIVNVPROC)(GLenum variable, GLenum pname, GLint *params); + /* GL_NV_register_combiners2 */ #ifndef GL_NV_register_combiners2 #define GL_NV_register_combiners2 1 -#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 #endif -typedef void (WINE_GLAPI * PGLFNCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); -typedef void (WINE_GLAPI * PGLFNGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +typedef void (WINE_GLAPI *PGLFNCOMBINERSTAGEPARAMETERFVNVPROC)(GLenum stage, GLenum pname, const GLfloat *params); +typedef void (WINE_GLAPI *PGLFNGETCOMBINERSTAGEPARAMETERFVNVPROC)(GLenum stage, GLenum pname, GLfloat *params); + +/* GL_NV_texgen_reflection */ +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif + +/* GL_NV_texture_env_combine4 */ +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858b +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859b +#endif + /* GL_NV_texture_shader */ #ifndef GL_NV_texture_shader #define GL_NV_texture_shader 1 -#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C -#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D -#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E -#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 -#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA -#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB -#define GL_DSDT_MAG_INTENSITY_NV 0x86DC -#define GL_SHADER_CONSISTENT_NV 0x86DD -#define GL_TEXTURE_SHADER_NV 0x86DE -#define GL_SHADER_OPERATION_NV 0x86DF -#define GL_CULL_MODES_NV 0x86E0 -#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 -#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 -#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 -#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV -#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV -#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV -#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 -#define GL_CONST_EYE_NV 0x86E5 -#define GL_PASS_THROUGH_NV 0x86E6 -#define GL_CULL_FRAGMENT_NV 0x86E7 -#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 -#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 -#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA -#define GL_DOT_PRODUCT_NV 0x86EC -#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED -#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE -#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 -#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 -#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 -#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 -#define GL_HILO_NV 0x86F4 -#define GL_DSDT_NV 0x86F5 -#define GL_DSDT_MAG_NV 0x86F6 -#define GL_DSDT_MAG_VIB_NV 0x86F7 -#define GL_HILO16_NV 0x86F8 -#define GL_SIGNED_HILO_NV 0x86F9 -#define GL_SIGNED_HILO16_NV 0x86FA -#define GL_SIGNED_RGBA_NV 0x86FB -#define GL_SIGNED_RGBA8_NV 0x86FC -#define GL_SIGNED_RGB_NV 0x86FE -#define GL_SIGNED_RGB8_NV 0x86FF -#define GL_SIGNED_LUMINANCE_NV 0x8701 -#define GL_SIGNED_LUMINANCE8_NV 0x8702 -#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 -#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 -#define GL_SIGNED_ALPHA_NV 0x8705 -#define GL_SIGNED_ALPHA8_NV 0x8706 -#define GL_SIGNED_INTENSITY_NV 0x8707 -#define GL_SIGNED_INTENSITY8_NV 0x8708 -#define GL_DSDT8_NV 0x8709 -#define GL_DSDT8_MAG8_NV 0x870A -#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B -#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C -#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D -#define GL_HI_SCALE_NV 0x870E -#define GL_LO_SCALE_NV 0x870F -#define GL_DS_SCALE_NV 0x8710 -#define GL_DT_SCALE_NV 0x8711 -#define GL_MAGNITUDE_SCALE_NV 0x8712 -#define GL_VIBRANCE_SCALE_NV 0x8713 -#define GL_HI_BIAS_NV 0x8714 -#define GL_LO_BIAS_NV 0x8715 -#define GL_DS_BIAS_NV 0x8716 -#define GL_DT_BIAS_NV 0x8717 -#define GL_MAGNITUDE_BIAS_NV 0x8718 -#define GL_VIBRANCE_BIAS_NV 0x8719 -#define GL_TEXTURE_BORDER_VALUES_NV 0x871A -#define GL_TEXTURE_HI_SIZE_NV 0x871B -#define GL_TEXTURE_LO_SIZE_NV 0x871C -#define GL_TEXTURE_DS_SIZE_NV 0x871D -#define GL_TEXTURE_DT_SIZE_NV 0x871E -#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864c +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864d +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864e +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86d9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86da +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86db +#define GL_DSDT_MAG_INTENSITY_NV 0x86dc +#define GL_SHADER_CONSISTENT_NV 0x86dd +#define GL_TEXTURE_SHADER_NV 0x86de +#define GL_SHADER_OPERATION_NV 0x86df +#define GL_CULL_MODES_NV 0x86e0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86e1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86e2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86e3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV GL_OFFSET_TEXTURE_MATRIX_NV +#define GL_OFFSET_TEXTURE_2D_SCALE_NV GL_OFFSET_TEXTURE_SCALE_NV +#define GL_OFFSET_TEXTURE_2D_BIAS_NV GL_OFFSET_TEXTURE_BIAS_NV +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86e4 +#define GL_CONST_EYE_NV 0x86e5 +#define GL_PASS_THROUGH_NV 0x86e6 +#define GL_CULL_FRAGMENT_NV 0x86e7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86e8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86e9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86ea +#define GL_DOT_PRODUCT_NV 0x86ec +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ed +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86ee +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86f0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86f1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86f2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86f3 +#define GL_HILO_NV 0x86f4 +#define GL_DSDT_NV 0x86f5 +#define GL_DSDT_MAG_NV 0x86f6 +#define GL_DSDT_MAG_VIB_NV 0x86f7 +#define GL_HILO16_NV 0x86f8 +#define GL_SIGNED_HILO_NV 0x86f9 +#define GL_SIGNED_HILO16_NV 0x86fa +#define GL_SIGNED_RGBA_NV 0x86fb +#define GL_SIGNED_RGBA8_NV 0x86fc +#define GL_SIGNED_RGB_NV 0x86fe +#define GL_SIGNED_RGB8_NV 0x86ff +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870a +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870b +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870c +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870d +#define GL_HI_SCALE_NV 0x870e +#define GL_LO_SCALE_NV 0x870f +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871a +#define GL_TEXTURE_HI_SIZE_NV 0x871b +#define GL_TEXTURE_LO_SIZE_NV 0x871c +#define GL_TEXTURE_DS_SIZE_NV 0x871d +#define GL_TEXTURE_DT_SIZE_NV 0x871e +#define GL_TEXTURE_MAG_SIZE_NV 0x871f #endif + /* GL_NV_texture_shader2 */ #ifndef GL_NV_texture_shader2 #define GL_NV_texture_shader2 1 -#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF -#endif -/* GL_NV_texture_shader3 */ -#ifndef GL_NV_texture_shader3 -#define GL_NV_texture_shader3 1 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 -#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 -#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 -#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 -#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 -#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 -#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 -#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 -#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A -#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B -#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C -#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D -#define GL_HILO8_NV 0x885E -#define GL_SIGNED_HILO8_NV 0x885F -#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 -#endif -/* GL_ATI_texture_env_combine3 */ -#ifndef GL_ATI_texture_env_combine3 -#define GL_ATI_texture_env_combine3 1 -#define GL_MODULATE_ADD_ATI 0x8744 -#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 -#define GL_MODULATE_SUBTRACT_ATI 0x8746 -/* #define ONE */ -/* #define ZERO */ -#endif - -/** - * Point sprites - */ -/* GL_ARB_point_sprite */ -#ifndef GL_ARB_point_sprite -#define GL_ARB_point_sprite 1 -#define GL_POINT_SPRITE_ARB 0x8861 -#define GL_COORD_REPLACE_ARB 0x8862 -#endif -/** - * @TODO: GL_NV_point_sprite - */ - -/** - * Occlusion Queries - */ -/* GL_ARB_occlusion_query */ -#ifndef GL_ARB_occlusion_query -#define GL_ARB_occlusion_query 1 -#define GL_SAMPLES_PASSED_ARB 0x8914 -#define GL_QUERY_COUNTER_BITS_ARB 0x8864 -#define GL_CURRENT_QUERY_ARB 0x8865 -#define GL_QUERY_RESULT_ARB 0x8866 -#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 -#endif -typedef void (WINE_GLAPI * PGLFNGENQUERIESARBPROC) (GLsizei n, GLuint *queries); -typedef void (WINE_GLAPI * PGLFNDELETEQUERIESARBPROC) (GLsizei n, const GLuint *queries); -typedef GLboolean (WINE_GLAPI * PGLFNISQUERYARBPROC) (GLuint query); -typedef void (WINE_GLAPI * PGLFNBEGINQUERYARBPROC) (GLenum target, GLuint query); -typedef void (WINE_GLAPI * PGLFNENDQUERYARBPROC) (GLenum target); -typedef void (WINE_GLAPI * PGLFNGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); -typedef void (WINE_GLAPI * PGLFNGETQUERYOBJECTIVARBPROC) (GLuint query, GLenum pname, GLint *params); -typedef void (WINE_GLAPI * PGLFNGETQUERYOBJECTUIVARBPROC) (GLuint query, GLenum pname, GLuint *params); -/* GL_HP_occlusion_test isn't complete, but it's constants are used by GL_NV_occlusion_query */ -#ifndef GL_HP_occlusion_test -#define GL_HP_occlusion_test 1 -#define GL_OCCLUSION_TEST_HP 0x8165 -#define GL_OCCLUSION_TEST_RESULT_HP 0x8165 -#endif -/* GL_NV_occlusion_query */ -#ifndef GL_NV_occlusion_query -#define GL_NV_occlusion_query 1 -#define GL_PIXEL_COUNTER_BITS_NV 0x8864 -#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 -#define GL_PIXEL_COUNT_NV 0x8866 -#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 -#endif -typedef void (WINE_GLAPI * PGLFNGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); -typedef void (WINE_GLAPI * PGLFNDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); -typedef GLboolean (WINE_GLAPI * PGLFNISOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (WINE_GLAPI * PGLFNBEGINOCCLUSIONQUERYNVPROC) (GLuint id); -typedef void (WINE_GLAPI * PGLFNENDOCCLUSIONQUERYNVPROC) (void); -typedef void (WINE_GLAPI * PGLFNGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); -typedef void (WINE_GLAPI * PGLFNGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); -/* GL_EXT_stencil_two_side */ -#ifndef GL_EXT_stencil_two_side -#define GL_EXT_stencil_two_side 1 -#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 -#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 -#endif -typedef void (WINE_GLAPI * PGLFNACTIVESTENCILFACEEXTPROC) (GLenum face); -/* GL_ATI_separate_stencil */ -#ifndef GL_ATI_separate_stencil -#define GL_ATI_separate_stencil 1 -#define GL_STENCIL_BACK_FUNC_ATI 0x8800 -#define GL_STENCIL_BACK_FAIL_ATI 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 -#endif -typedef void (WINE_GLAPI * PGLFNSTENCILOPSEPARATEATIPROC) (GLenum, GLenum, GLenum, GLenum); -typedef void (WINE_GLAPI * PGLFNSTENCILFUNCSEPARATEATIPROC) (GLenum, GLenum, GLint, GLuint); -/* GL_NV_fence */ -#ifndef GL_NV_fence -#define GL_NV_fence 1 -#define GL_ALL_COMPLETED_NV 0x84F2 -#define GL_FENCE_STATUS_NV 0x84F3 -#define GL_FENCE_CONDITION_NV 0x84F4 -#endif -typedef void (WINE_GLAPI * PGLFNGENFENCESNVPROC) (GLsizei, GLuint *); -typedef void (WINE_GLAPI * PGLFNDELETEFENCESNVPROC) (GLuint, const GLuint *); -typedef void (WINE_GLAPI * PGLFNSETFENCENVPROC) (GLuint, GLenum); -typedef GLboolean (WINE_GLAPI * PGLFNTESTFENCENVPROC) (GLuint); -typedef void (WINE_GLAPI * PGLFNFINISHFENCENVPROC) (GLuint); -typedef GLboolean (WINE_GLAPI * PGLFNISFENCENVPROC) (GLuint); -typedef void (WINE_GLAPI * PGLFNGETFENCEIVNVPROC) (GLuint, GLenum, GLint *); -/* GL_APPLE_fence */ -#ifndef GL_APPLE_fence -#define GL_APPLE_fence 1 -#define GL_DRAW_PIXELS_APPLE 0x8A0A -#define GL_FENCE_APPLE 0x8A0B -#endif -typedef void (WINE_GLAPI * PGLFNGENFENCESAPPLEPROC) (GLsizei, GLuint *); -typedef void (WINE_GLAPI * PGLFNDELETEFENCESAPPLEPROC) (GLuint, const GLuint *); -typedef void (WINE_GLAPI * PGLFNSETFENCEAPPLEPROC) (GLuint); -typedef GLboolean (WINE_GLAPI * PGLFNTESTFENCEAPPLEPROC) (GLuint); -typedef void (WINE_GLAPI * PGLFNFINISHFENCEAPPLEPROC) (GLuint); -typedef GLboolean (WINE_GLAPI * PGLFNISFENCEAPPLEPROC) (GLuint); -typedef GLboolean (WINE_GLAPI * PGLFNTESTOBJECTAPPLEPROC) (GLenum, GLuint); -typedef void (WINE_GLAPI * PGLFNFINISHOBJECTAPPLEPROC) (GLenum, GLuint); -/* GL_APPLE_client_storage */ -#ifndef GL_APPLE_client_storage -#define GL_APPLE_client_storage 1 -#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 -#endif -/* GLX_SGI_video_sync */ -typedef int (WINE_GLAPI * PGLXFNGETVIDEOSYNCSGIPROC) (unsigned int *); -typedef int (WINE_GLAPI * PGLXFNWAITVIDEOSYNCSGIPROC) (int, int, unsigned int *); - -/* GL_SGIS_generate_mipmap */ -#ifndef GLX_SGIS_generate_mipmap -#define GL_GENERATE_MIPMAP_SGIS 0x8191 -#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 -#define GLX_SGIS_generate_mipmap -#endif - -/* GL_NV_depth_clamp */ -#ifndef GL_NV_depth_clamp -#define GL_DEPTH_CLAMP_NV 0x864F -#endif - -/* GL_APPLE_flush_render */ -typedef void (WINE_GLAPI * PGLFNFLUSHRENDERAPPLEPROC) (void); -typedef void (WINE_GLAPI * PGLFNFINISHRENDERAPPLEPROC) (void); - -/* GL_APPLE_ycbcr_422 */ -#ifndef GL_APPLE_ycbcr_422 -#define GL_APPLE_ycbcr_422 -#define GL_YCBCR_422_APPLE 0x85B9 -#define UNSIGNED_SHORT_8_8_APPLE 0x85BA -#define UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB -#endif - -/* GL_ARB_texture_rectangle */ -#ifndef GL_ARB_texture_rectangle -#define GL_ARB_texture_rectangle -#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 -#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 -#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 -#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 -#define GL_SAMPLER_2D_RECT_ARB 0x8B63 -#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 -#endif - -/* GL_APPLE_float_pixels */ -#ifndef GL_APPLE_float_pixels -#define GL_APPLE_float_pixels -#define GL_HALF_APPLE 0x140B -#define GL_COLOR_FLOAT_APPLE 0x8A0F -#define GL_RGBA_FLOAT32_APPLE 0x8814 -#define GL_RGB_FLOAT32_APPLE 0x8815 -#define GL_ALPHA_FLOAT32_APPLE 0x8816 -#define GL_INTENSITY_FLOAT32_APPLE 0x8817 -#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 -#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 -#define GL_RGBA_FLOAT16_APPLE 0x881A -#define GL_RGB_FLOAT16_APPLE 0x881B -#define GL_ALPHA_FLOAT16_APPLE 0x881C -#define GL_INTENSITY_FLOAT16_APPLE 0x881D -#define GL_LUMINANCE_FLOAT16_APPLE 0x881E -#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F -#endif - -/* GL_EXT_gpu_program_parameters */ -#ifndef GL_EXT_gpu_program_parameters -#define GL_EXT_gpu_program_parameters -typedef void (WINE_GLAPI * PGLFNPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const float *params); -typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const float *params); -#endif - -/* GL_NV_light_max_exponent */ -#ifndef GL_NV_light_max_exponent -#define GL_NV_light_max_exponent -#define GL_MAX_SHININESS_NV 0x8504 -#define GL_MAX_SPOT_EXPONENT_NV 0x8505 -#endif - -/* GL_ATI_fragment_shader */ -#ifndef GL_ATI_fragment_shader -#define GL_ATI_fragment_shader -typedef GLuint (WINE_GLAPI *PGLFNGENFRAGMENTSHADERSATI) (GLuint range); -typedef void (WINE_GLAPI *PGLFNBINDFRAGMENTSHADERATI) (GLuint id); -typedef void (WINE_GLAPI *PGLFNDELETEFRAGMENTSHADERATI) (GLuint id); -typedef void (WINE_GLAPI *PGLFNBEGINFRAGMENTSHADERATI) (void); -typedef void (WINE_GLAPI *PGLFNENDFRAGMENTSHADERATI) (void); -typedef void (WINE_GLAPI *PGLFNPASSTEXCOORDATI) (GLuint dst, GLuint coord, GLenum swizzle); -typedef void (WINE_GLAPI *PGLFNSAMPLEMAPATI) (GLuint dst, GLuint interp, GLenum swizzle); -typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP1ATI) (GLenum op, GLuint dst, GLuint dstMask, - GLuint dstMod, GLuint arg1, GLuint arg1Rep, - GLuint arg1Mod); -typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP2ATI) (GLenum op, GLuint dst, GLuint dstMask, - GLuint dstMod, GLuint arg1, GLuint arg1Rep, - GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, - GLuint arg2Mod); -typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP3ATI) (GLenum op, GLuint dst, GLuint dstMask, - GLuint dstMod, GLuint arg1, GLuint arg1Rep, - GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, - GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, - GLuint arg3Mod); -typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP1ATI) (GLenum op, GLuint dst, GLuint dstMod, - GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); -typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP2ATI) (GLenum op, GLuint dst, GLuint dstMod, - GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, - GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); -typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP3ATI) (GLenum op, GLuint dst, GLuint dstMod, - GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, - GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, - GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); -typedef void (WINE_GLAPI *PGLFNSETFRAGMENTSHADERCONSTANTATI) (GLuint dst, const GLfloat *value); -#define GL_FRAGMENT_SHADER_ATI 0x8920 -#define GL_REG_0_ATI 0x8921 -#define GL_REG_1_ATI 0x8922 -#define GL_REG_2_ATI 0x8923 -#define GL_REG_3_ATI 0x8924 -#define GL_REG_4_ATI 0x8925 -#define GL_REG_5_ATI 0x8926 -#define GL_CON_0_ATI 0x8941 -#define GL_CON_1_ATI 0x8942 -#define GL_CON_2_ATI 0x8943 -#define GL_CON_3_ATI 0x8944 -#define GL_CON_4_ATI 0x8945 -#define GL_CON_5_ATI 0x8946 -#define GL_CON_6_ATI 0x8947 -#define GL_CON_7_ATI 0x8948 -#define GL_MOV_ATI 0x8961 -#define GL_ADD_ATI 0x8963 -#define GL_MUL_ATI 0x8964 -#define GL_SUB_ATI 0x8965 -#define GL_DOT3_ATI 0x8966 -#define GL_DOT4_ATI 0x8967 -#define GL_MAD_ATI 0x8968 -#define GL_LERP_ATI 0x8969 -#define GL_CND_ATI 0x896A -#define GL_CND0_ATI 0x896B -#define GL_DOT2_ADD_ATI 0x896C -#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D -#define GL_SWIZZLE_STR_ATI 0x8976 -#define GL_SWIZZLE_STQ_ATI 0x8977 -#define GL_SWIZZLE_STR_DR_ATI 0x8978 -#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 -#define GL_RED_BIT_ATI 0x00000001 -#define GL_GREEN_BIT_ATI 0x00000002 -#define GL_BLUE_BIT_ATI 0x00000004 -#define GL_2X_BIT_ATI 0x00000001 -#define GL_4X_BIT_ATI 0x00000002 -#define GL_8X_BIT_ATI 0x00000004 -#define GL_HALF_BIT_ATI 0x00000008 -#define GL_QUARTER_BIT_ATI 0x00000010 -#define GL_EIGHTH_BIT_ATI 0x00000020 -#define GL_SATURATE_BIT_ATI 0x00000040 -#define GL_2X_BIT_ATI 0x00000001 -#define GL_COMP_BIT_ATI 0x00000002 -#define GL_NEGATE_BIT_ATI 0x00000004 -#define GL_BIAS_BIT_ATI 0x00000008 -#endif -/* GL_ATI_texture_compression_3dc */ -#ifndef GL_ATI_texture_compression_3dc -#define GL_ATI_texture_compression_3dc -#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI 0x8837 -#endif -/* GL_EXT_texture_compression_rgtc */ -#ifndef GL_EXT_texture_compression_rgtc -#define GL_EXT_texture_compression_rgtc -#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB -#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC -#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD -#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86ef #endif /* GL_NV_vertex_program2_option */ #ifndef GL_NV_vertex_program2_option -#define GL_NV_vertex_program2_option -#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 -#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_NV_vertex_program2_option 1 +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88f4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88f5 #endif -/* GL_APPLE_flush_buffer_range */ -#ifndef GL_APPLE_flush_buffer_range -#define GL_APPLE_flush_buffer_range -#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 -#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 -typedef void (WINE_GLAPI *PGLFNBUFFERPARAMETERIAPPLE) (GLenum target, GLenum pname, GLint param); -typedef void (WINE_GLAPI *PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE) (GLenum target, GLintptr offset, GLsizeiptr size); +/* GL_SGIS_generate_mipmap */ +#ifndef GLX_SGIS_generate_mipmap +#define GLX_SGIS_generate_mipmap 1 +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 #endif -/* GL_VERSION_2_0 */ -#ifndef GL_VERSION_2_0 -#define GL_VERSION_2_0 1 -#define GL_BLEND_EQUATION_RGB GL_BLEND_EQUATION -#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 -#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 -#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 -#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 -#define GL_CURRENT_VERTEX_ATTRIB 0x8626 -#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 -#define GL_VERTEX_PROGRAM_TWO_SIDE 0x8643 -#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 -#define GL_STENCIL_BACK_FUNC 0x8800 -#define GL_STENCIL_BACK_FAIL 0x8801 -#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 -#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 -#define GL_MAX_DRAW_BUFFERS 0x8824 -#define GL_DRAW_BUFFER0 0x8825 -#define GL_DRAW_BUFFER1 0x8826 -#define GL_DRAW_BUFFER2 0x8827 -#define GL_DRAW_BUFFER3 0x8828 -#define GL_DRAW_BUFFER4 0x8829 -#define GL_DRAW_BUFFER5 0x882A -#define GL_DRAW_BUFFER6 0x882B -#define GL_DRAW_BUFFER7 0x882C -#define GL_DRAW_BUFFER8 0x882D -#define GL_DRAW_BUFFER9 0x882E -#define GL_DRAW_BUFFER10 0x882F -#define GL_DRAW_BUFFER11 0x8830 -#define GL_DRAW_BUFFER12 0x8831 -#define GL_DRAW_BUFFER13 0x8832 -#define GL_DRAW_BUFFER14 0x8833 -#define GL_DRAW_BUFFER15 0x8834 -#define GL_BLEND_EQUATION_ALPHA 0x883D -#define GL_POINT_SPRITE 0x8861 -#define GL_COORD_REPLACE 0x8862 -#define GL_MAX_VERTEX_ATTRIBS 0x8869 -#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A -#define GL_MAX_TEXTURE_COORDS 0x8871 -#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 -#define GL_FRAGMENT_SHADER 0x8B30 -#define GL_VERTEX_SHADER 0x8B31 -#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 -#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A -#define GL_MAX_VARYING_FLOATS 0x8B4B -#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C -#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D -#define GL_SHADER_TYPE 0x8B4F -#define GL_FLOAT_VEC2 0x8B50 -#define GL_FLOAT_VEC3 0x8B51 -#define GL_FLOAT_VEC4 0x8B52 -#define GL_INT_VEC2 0x8B53 -#define GL_INT_VEC3 0x8B54 -#define GL_INT_VEC4 0x8B55 -#define GL_BOOL 0x8B56 -#define GL_BOOL_VEC2 0x8B57 -#define GL_BOOL_VEC3 0x8B58 -#define GL_BOOL_VEC4 0x8B59 -#define GL_FLOAT_MAT2 0x8B5A -#define GL_FLOAT_MAT3 0x8B5B -#define GL_FLOAT_MAT4 0x8B5C -#define GL_SAMPLER_1D 0x8B5D -#define GL_SAMPLER_2D 0x8B5E -#define GL_SAMPLER_3D 0x8B5F -#define GL_SAMPLER_CUBE 0x8B60 -#define GL_SAMPLER_1D_SHADOW 0x8B61 -#define GL_SAMPLER_2D_SHADOW 0x8B62 -#define GL_DELETE_STATUS 0x8B80 -#define GL_COMPILE_STATUS 0x8B81 -#define GL_LINK_STATUS 0x8B82 -#define GL_VALIDATE_STATUS 0x8B83 -#define GL_INFO_LOG_LENGTH 0x8B84 -#define GL_ATTACHED_SHADERS 0x8B85 -#define GL_ACTIVE_UNIFORMS 0x8B86 -#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 -#define GL_SHADER_SOURCE_LENGTH 0x8B88 -#define GL_ACTIVE_ATTRIBUTES 0x8B89 -#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A -#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B -#define GL_SHADING_LANGUAGE_VERSION 0x8B8C -#define GL_CURRENT_PROGRAM 0x8B8D -#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 -#define GL_LOWER_LEFT 0x8CA1 -#define GL_UPPER_LEFT 0x8CA2 -#define GL_STENCIL_BACK_REF 0x8CA3 -#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 -#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 -typedef char GLchar; -#endif -typedef void (WINE_GLAPI * PGLFNBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); -typedef void (WINE_GLAPI * PGLFNDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); -typedef void (WINE_GLAPI * PGLFNSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); -typedef void (WINE_GLAPI * PGLFNSTENCILFUNCSEPARATEPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); -typedef void (WINE_GLAPI * PGLFNSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); -typedef void (WINE_GLAPI * PGLFNATTACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (WINE_GLAPI * PGLFNBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); -typedef void (WINE_GLAPI * PGLFNCOMPILESHADERPROC) (GLuint shader); -typedef GLuint (WINE_GLAPI * PGLFNCREATEPROGRAMPROC) (void); -typedef GLuint (WINE_GLAPI * PGLFNCREATESHADERPROC) (GLenum type); -typedef void (WINE_GLAPI * PGLFNDELETEPROGRAMPROC) (GLuint program); -typedef void (WINE_GLAPI * PGLFNDELETESHADERPROC) (GLuint shader); -typedef void (WINE_GLAPI * PGLFNDETACHSHADERPROC) (GLuint program, GLuint shader); -typedef void (WINE_GLAPI * PGLFNDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (WINE_GLAPI * PGLFNENABLEVERTEXATTRIBARRAYPROC) (GLuint index); -typedef void (WINE_GLAPI * PGLFNGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (WINE_GLAPI * PGLFNGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); -typedef void (WINE_GLAPI * PGLFNGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *obj); -typedef GLint (WINE_GLAPI * PGLFNGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (WINE_GLAPI * PGLFNGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); -typedef void (WINE_GLAPI * PGLFNGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (WINE_GLAPI * PGLFNGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); -typedef void (WINE_GLAPI * PGLFNGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); -typedef void (WINE_GLAPI * PGLFNGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); -typedef GLint (WINE_GLAPI * PGLFNGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); -typedef void (WINE_GLAPI * PGLFNGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); -typedef void (WINE_GLAPI * PGLFNGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); -typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); -typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); -typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); -typedef void (WINE_GLAPI * PGLFNGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, GLvoid* *pointer); -typedef GLboolean (WINE_GLAPI * PGLFNISPROGRAMPROC) (GLuint program); -typedef GLboolean (WINE_GLAPI * PGLFNISSHADERPROC) (GLuint shader); -typedef void (WINE_GLAPI * PGLFNLINKPROGRAMPROC) (GLuint program); -typedef void (WINE_GLAPI * PGLFNSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar* *string, const GLint *length); -typedef void (WINE_GLAPI * PGLFNUSEPROGRAMPROC) (GLuint program); -typedef void (WINE_GLAPI * PGLFNUNIFORM1FPROC) (GLint location, GLfloat v0); -typedef void (WINE_GLAPI * PGLFNUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); -typedef void (WINE_GLAPI * PGLFNUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); -typedef void (WINE_GLAPI * PGLFNUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); -typedef void (WINE_GLAPI * PGLFNUNIFORM1IPROC) (GLint location, GLint v0); -typedef void (WINE_GLAPI * PGLFNUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); -typedef void (WINE_GLAPI * PGLFNUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); -typedef void (WINE_GLAPI * PGLFNUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); -typedef void (WINE_GLAPI * PGLFNUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (WINE_GLAPI * PGLFNUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (WINE_GLAPI * PGLFNUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (WINE_GLAPI * PGLFNUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); -typedef void (WINE_GLAPI * PGLFNUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (WINE_GLAPI * PGLFNUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (WINE_GLAPI * PGLFNUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (WINE_GLAPI * PGLFNUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); -typedef void (WINE_GLAPI * PGLFNUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (WINE_GLAPI * PGLFNUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (WINE_GLAPI * PGLFNUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); -typedef void (WINE_GLAPI * PGLFNVALIDATEPROGRAMPROC) (GLuint program); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SPROC) (GLuint index, GLshort x); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); -typedef void (WINE_GLAPI * PGLFNVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer); - - -/**************************************************** - * OpenGL Official Version - * defines - ****************************************************/ -/* GL_VERSION_1_3 */ -#if !defined(GL_DOT3_RGBA) -# define GL_DOT3_RGBA 0x8741 -#endif -#if !defined(GL_SUBTRACT) -# define GL_SUBTRACT 0x84E7 -#endif - - -/**************************************************** - * Enumerated types - ****************************************************/ -#define WINE_DEFAULT_VIDMEM 64*1024*1024 - -#define MAKEDWORD_VERSION(maj, min) ((maj & 0x0000FFFF) << 16) | (min & 0x0000FFFF) - -/* OpenGL Supported Extensions (ARB and EXT) */ -typedef enum _GL_SupportedExt { - WINED3D_GL_EXT_NONE, - /* ARB */ - ARB_COLOR_BUFFER_FLOAT, - ARB_DEPTH_BUFFER_FLOAT, - ARB_DEPTH_CLAMP, - ARB_DEPTH_TEXTURE, - ARB_DRAW_BUFFERS, - ARB_FRAGMENT_PROGRAM, - ARB_FRAGMENT_SHADER, - ARB_FRAMEBUFFER_OBJECT, - ARB_GEOMETRY_SHADER4, - ARB_IMAGING, - ARB_MULTISAMPLE, - ARB_MULTITEXTURE, - ARB_OCCLUSION_QUERY, - ARB_POINT_PARAMETERS, - ARB_PROVOKING_VERTEX, - ARB_PIXEL_BUFFER_OBJECT, - ARB_POINT_SPRITE, - ARB_TEXTURE_COMPRESSION, - ARB_TEXTURE_CUBE_MAP, - ARB_TEXTURE_ENV_ADD, - ARB_TEXTURE_ENV_COMBINE, - ARB_TEXTURE_ENV_DOT3, - ARB_TEXTURE_FLOAT, - ARB_HALF_FLOAT_PIXEL, - ARB_TEXTURE_BORDER_CLAMP, - ARB_TEXTURE_MIRRORED_REPEAT, - ARB_TEXTURE_NON_POWER_OF_TWO, - ARB_TEXTURE_RECTANGLE, - ARB_TEXTURE_RG, - ARB_VERTEX_PROGRAM, - ARB_VERTEX_BLEND, - ARB_VERTEX_BUFFER_OBJECT, - ARB_VERTEX_SHADER, - ARB_SHADER_OBJECTS, - ARB_SHADER_TEXTURE_LOD, - ARB_HALF_FLOAT_VERTEX, - /* EXT */ - EXT_BLEND_COLOR, - EXT_BLEND_MINMAX, - EXT_BLEND_EQUATION_SEPARATE, - EXT_BLEND_FUNC_SEPARATE, - EXT_FOG_COORD, - EXT_FRAMEBUFFER_OBJECT, - EXT_FRAMEBUFFER_BLIT, - EXT_FRAMEBUFFER_MULTISAMPLE, - EXT_PACKED_DEPTH_STENCIL, - EXT_PALETTED_TEXTURE, - EXT_PIXEL_BUFFER_OBJECT, - EXT_POINT_PARAMETERS, - EXT_PROVOKING_VERTEX, - EXT_SECONDARY_COLOR, - EXT_STENCIL_TWO_SIDE, - EXT_STENCIL_WRAP, - EXT_TEXTURE3D, - EXT_TEXTURE_COMPRESSION_S3TC, - EXT_TEXTURE_COMPRESSION_RGTC, - EXT_TEXTURE_FILTER_ANISOTROPIC, - EXT_TEXTURE_LOD, - EXT_TEXTURE_LOD_BIAS, - EXT_TEXTURE_ENV_ADD, - EXT_TEXTURE_ENV_COMBINE, - EXT_TEXTURE_ENV_DOT3, - EXT_TEXTURE_SRGB, - EXT_TEXTURE_SWIZZLE, - EXT_GPU_PROGRAM_PARAMETERS, - EXT_VERTEX_ARRAY_BGRA, - /* NVIDIA */ - NV_HALF_FLOAT, - NV_FOG_DISTANCE, - NV_FRAGMENT_PROGRAM, - NV_FRAGMENT_PROGRAM2, - NV_OCCLUSION_QUERY, - NV_REGISTER_COMBINERS, - NV_REGISTER_COMBINERS2, - NV_TEXGEN_REFLECTION, - NV_TEXTURE_ENV_COMBINE4, - NV_TEXTURE_SHADER, - NV_TEXTURE_SHADER2, - NV_TEXTURE_SHADER3, - NV_VERTEX_PROGRAM, - NV_VERTEX_PROGRAM1_1, - NV_VERTEX_PROGRAM2, - NV_VERTEX_PROGRAM2_OPTION, - NV_VERTEX_PROGRAM3, - NV_FRAGMENT_PROGRAM_OPTION, - NV_FENCE, - NV_DEPTH_CLAMP, - NV_LIGHT_MAX_EXPONENT, - /* ATI */ - ATI_SEPARATE_STENCIL, - ATI_TEXTURE_ENV_COMBINE3, - ATI_TEXTURE_MIRROR_ONCE, - EXT_VERTEX_SHADER, - ATI_FRAGMENT_SHADER, - ATI_TEXTURE_COMPRESSION_3DC, - /* APPLE */ - APPLE_FENCE, - APPLE_CLIENT_STORAGE, - APPLE_FLUSH_RENDER, - APPLE_YCBCR_422, - APPLE_FLOAT_PIXELS, - APPLE_FLUSH_BUFFER_RANGE, - /* SGI */ - SGI_VIDEO_SYNC, - SGIS_GENERATE_MIPMAP, - - /* Internally used */ - WINE_NORMALIZED_TEXRECT, - - /* WGL extensions */ - WGL_ARB_PBUFFER, - WGL_ARB_PIXEL_FORMAT, - WGL_WINE_PIXEL_FORMAT_PASSTHROUGH, - - WINED3D_GL_EXT_COUNT, -} GL_SupportedExt; - - -/**************************************************** - * #Defines - ****************************************************/ -#define GL_EXT_FUNCS_GEN \ - /** ARB Extensions **/ \ - /* GL_ARB_color_buffer_float */ \ - USE_GL_FUNC(PGLFNCLAMPCOLORARBPROC, glClampColorARB, ARB_COLOR_BUFFER_FLOAT, NULL )\ - /* GL_ARB_draw_buffers */ \ - USE_GL_FUNC(PGLFNDRAWBUFFERSARBPROC, glDrawBuffersARB, ARB_DRAW_BUFFERS, NULL )\ - /* GL_ARB_framebuffer_object */ \ - USE_GL_FUNC(PGLFNGLISRENDERBUFFERPROC, glIsRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVPROC, glGetRenderbufferParameteriv, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLISFRAMEBUFFERPROC, glIsFramebuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DPROC, glFramebufferTexture1D, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DPROC, glFramebufferTexture3D, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURELAYERPROC, glFramebufferTextureLayer, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC, glGetFramebufferAttachmentParameteriv, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer, ARB_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLGENERATEMIPMAPPROC, glGenerateMipmap, ARB_FRAMEBUFFER_OBJECT, NULL )\ - /* GL_ARB_geometry_shader4 */ \ - USE_GL_FUNC(PGLFNPROGRAMPARAMETERIARBPROC, glProgramParameteriARB, ARB_GEOMETRY_SHADER4, NULL ) \ - USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREARBPROC, glFramebufferTextureARB, ARB_GEOMETRY_SHADER4, NULL ) \ - USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTURELAYERARBPROC, glFramebufferTextureLayerARB, ARB_GEOMETRY_SHADER4, NULL ) \ - USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREFACEARBPROC, glFramebufferTextureFaceARB, ARB_GEOMETRY_SHADER4, NULL ) \ - /* GL_ARB_imaging, GL_EXT_blend_minmax */ \ - USE_GL_FUNC(PGLFNBLENDCOLORPROC, glBlendColorEXT, EXT_BLEND_COLOR, NULL )\ - USE_GL_FUNC(PGLFNBLENDEQUATIONPROC, glBlendEquationEXT, EXT_BLEND_MINMAX, NULL )\ - /* GL_ARB_multisample */ \ - USE_GL_FUNC(WINED3D_PFNGLSAMPLECOVERAGEARBPROC, glSampleCoverageARB, ARB_MULTISAMPLE, NULL )\ - /* GL_ARB_multitexture */ \ - USE_GL_FUNC(WINED3D_PFNGLACTIVETEXTUREARBPROC, glActiveTextureARB, ARB_MULTITEXTURE, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC, glClientActiveTextureARB, ARB_MULTITEXTURE, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FARBPROC, glMultiTexCoord1fARB, ARB_MULTITEXTURE, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FVARBPROC, glMultiTexCoord1fvARB, ARB_MULTITEXTURE, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FARBPROC, glMultiTexCoord2fARB, ARB_MULTITEXTURE, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FVARBPROC, glMultiTexCoord2fvARB, ARB_MULTITEXTURE, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FARBPROC, glMultiTexCoord3fARB, ARB_MULTITEXTURE, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FVARBPROC, glMultiTexCoord3fvARB, ARB_MULTITEXTURE, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FARBPROC, glMultiTexCoord4fARB, ARB_MULTITEXTURE, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FVARBPROC, glMultiTexCoord4fvARB, ARB_MULTITEXTURE, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2SVARBPROC, glMultiTexCoord2svARB, ARB_MULTITEXTURE, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4SVARBPROC, glMultiTexCoord4svARB, ARB_MULTITEXTURE, NULL )\ - /* GL_ARB_occlusion_query */ \ - USE_GL_FUNC(PGLFNGENQUERIESARBPROC, glGenQueriesARB, ARB_OCCLUSION_QUERY, NULL )\ - USE_GL_FUNC(PGLFNDELETEQUERIESARBPROC, glDeleteQueriesARB, ARB_OCCLUSION_QUERY, NULL )\ - USE_GL_FUNC(PGLFNBEGINQUERYARBPROC, glBeginQueryARB, ARB_OCCLUSION_QUERY, NULL )\ - USE_GL_FUNC(PGLFNENDQUERYARBPROC, glEndQueryARB, ARB_OCCLUSION_QUERY, NULL )\ - USE_GL_FUNC(PGLFNGETQUERYOBJECTIVARBPROC, glGetQueryObjectivARB, ARB_OCCLUSION_QUERY, NULL )\ - USE_GL_FUNC(PGLFNGETQUERYOBJECTUIVARBPROC, glGetQueryObjectuivARB, ARB_OCCLUSION_QUERY, NULL )\ - /* GL_ARB_point_parameters */ \ - USE_GL_FUNC(PGLFNGLPOINTPARAMETERFARBPROC, glPointParameterfARB, ARB_POINT_PARAMETERS, NULL )\ - USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVARBPROC, glPointParameterfvARB, ARB_POINT_PARAMETERS, NULL )\ - /* GL_ARB_provoking_vertex */ \ - USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXPROC, glProvokingVertex, ARB_PROVOKING_VERTEX, NULL)\ - /* GL_ARB_texture_compression */ \ - USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE2DPROC, glCompressedTexImage2DARB, ARB_TEXTURE_COMPRESSION,NULL )\ - USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE3DPROC, glCompressedTexImage3DARB, ARB_TEXTURE_COMPRESSION,NULL )\ - USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC, glCompressedTexSubImage2DARB, ARB_TEXTURE_COMPRESSION,NULL )\ - USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC, glCompressedTexSubImage3DARB, ARB_TEXTURE_COMPRESSION,NULL )\ - USE_GL_FUNC(PGLFNGETCOMPRESSEDTEXIMAGEPROC, glGetCompressedTexImageARB, ARB_TEXTURE_COMPRESSION,NULL )\ - /* GL_ARB_vertex_blend */ \ - USE_GL_FUNC(PGLFNGLWEIGHTPOINTERARB, glWeightPointerARB, ARB_VERTEX_BLEND, NULL )\ - USE_GL_FUNC(PGLFNGLWEIGHTBV, glWeightbvARB, ARB_VERTEX_BLEND, NULL )\ - USE_GL_FUNC(PGLFNGLWEIGHTSV, glWeightsvARB, ARB_VERTEX_BLEND, NULL )\ - USE_GL_FUNC(PGLFNGLWEIGHTIV, glWeightivARB, ARB_VERTEX_BLEND, NULL )\ - USE_GL_FUNC(PGLFNGLWEIGHTFV, glWeightfvARB, ARB_VERTEX_BLEND, NULL )\ - USE_GL_FUNC(PGLFNGLWEIGHTDV, glWeightdvARB, ARB_VERTEX_BLEND, NULL )\ - USE_GL_FUNC(PGLFNGLWEIGHTUBV, glWeightubvARB, ARB_VERTEX_BLEND, NULL )\ - USE_GL_FUNC(PGLFNGLWEIGHTUSV, glWeightusvARB, ARB_VERTEX_BLEND, NULL )\ - USE_GL_FUNC(PGLFNGLWEIGHTUIV, glWeightuivARB, ARB_VERTEX_BLEND, NULL )\ - USE_GL_FUNC(PGLFNGLVERTEXBLENDARB, glVertexBlendARB, ARB_VERTEX_BLEND, NULL )\ - /* GL_ARB_vertex_buffer_object */ \ - USE_GL_FUNC(PGLFNBINDBUFFERARBPROC, glBindBufferARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\ - USE_GL_FUNC(PGLFNDELETEBUFFERSARBPROC, glDeleteBuffersARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\ - USE_GL_FUNC(PGLFNGENBUFFERSARBPROC, glGenBuffersARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\ - USE_GL_FUNC(PGLFNISBUFFERARBPROC, glIsBufferARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\ - USE_GL_FUNC(PGLFNBUFFERDATAARBPROC, glBufferDataARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\ - USE_GL_FUNC(PGLFNBUFFERSUBDATAARBPROC, glBufferSubDataARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\ - USE_GL_FUNC(PGLFNGETBUFFERSUBDATAARBPROC, glGetBufferSubDataARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\ - USE_GL_FUNC(PGLFNMAPBUFFERARBPROC, glMapBufferARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\ - USE_GL_FUNC(PGLFNUNMAPBUFFERARBPROC, glUnmapBufferARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\ - USE_GL_FUNC(PGLFNGETBUFFERPARAMETERIVARBPROC, glGetBufferParameterivARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\ - USE_GL_FUNC(PGLFNGETBUFFERPOINTERVARBPROC, glGetBufferPointervARB, ARB_VERTEX_BUFFER_OBJECT,NULL)\ - /** EXT Extensions **/ \ - /* GL_EXT_blend_equation_separate */ \ - USE_GL_FUNC(PGLFNBLENDFUNCSEPARATEEXTPROC, glBlendFuncSeparateEXT, EXT_BLEND_FUNC_SEPARATE, NULL)\ - /* GL_EXT_blend_func_separate */ \ - USE_GL_FUNC(PGLFNBLENDEQUATIONSEPARATEEXTPROC, glBlendEquationSeparateEXT, EXT_BLEND_EQUATION_SEPARATE, NULL)\ - /* GL_EXT_fog_coord */ \ - USE_GL_FUNC(PGLFNGLFOGCOORDFEXTPROC, glFogCoordfEXT, EXT_FOG_COORD, NULL )\ - USE_GL_FUNC(PGLFNGLFOGCOORDFVEXTPROC, glFogCoordfvEXT, EXT_FOG_COORD, NULL )\ - USE_GL_FUNC(PGLFNGLFOGCOORDDEXTPROC, glFogCoorddEXT, EXT_FOG_COORD, NULL )\ - USE_GL_FUNC(PGLFNGLFOGCOORDDVEXTPROC, glFogCoorddvEXT, EXT_FOG_COORD, NULL )\ - USE_GL_FUNC(PGLFNGLFOGCOORDPOINTEREXTPROC, glFogCoordPointerEXT, EXT_FOG_COORD, NULL )\ - /* GL_EXT_framebuffer_object */ \ - USE_GL_FUNC(PGLFNGLISRENDERBUFFEREXTPROC, glIsRenderbufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLBINDRENDERBUFFEREXTPROC, glBindRenderbufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSEXTPROC, glDeleteRenderbuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSEXTPROC, glGenRenderbuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEEXTPROC, glRenderbufferStorageEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLISFRAMEBUFFEREXTPROC, glIsFramebufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFEREXTPROC, glBindFramebufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSEXTPROC, glDeleteFramebuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSEXTPROC, glGenFramebuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, glCheckFramebufferStatusEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC, glFramebufferTexture1DEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC, glFramebufferTexture2DEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC, glFramebufferTexture3DEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, glFramebufferRenderbufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLGENERATEMIPMAPEXTPROC, glGenerateMipmapEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC, glGetRenderbufferParameterivEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC, glGetFramebufferAttachmentParameterivEXT, EXT_FRAMEBUFFER_OBJECT, NULL )\ - /* GL_EXT_framebuffer_blit */ \ - USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFEREXTPROC, glBlitFramebufferEXT, EXT_FRAMEBUFFER_BLIT, NULL )\ - /* GL_EXT_framebuffer_multisample */ \ - USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, glRenderbufferStorageMultisampleEXT, EXT_FRAMEBUFFER_MULTISAMPLE, NULL )\ - /* GL_EXT_paletted_texture */ \ - USE_GL_FUNC(PGLFNGLCOLORTABLEEXTPROC, glColorTableEXT, EXT_PALETTED_TEXTURE, NULL )\ - /* GL_EXT_point_parameters */ \ - USE_GL_FUNC(PGLFNGLPOINTPARAMETERFEXTPROC, glPointParameterfEXT, EXT_POINT_PARAMETERS, NULL )\ - USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVEXTPROC, glPointParameterfvEXT, EXT_POINT_PARAMETERS, NULL )\ - /* GL_EXT_provoking_vertex */ \ - USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXEXTPROC, glProvokingVertexEXT, EXT_PROVOKING_VERTEX, NULL)\ - /* GL_EXT_secondary_color */ \ - USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3UBEXTPROC, glSecondaryColor3ubEXT, EXT_SECONDARY_COLOR, NULL )\ - USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3UBVEXTPROC, glSecondaryColor3ubvEXT, EXT_SECONDARY_COLOR, NULL )\ - USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FEXTPROC, glSecondaryColor3fEXT, EXT_SECONDARY_COLOR, NULL )\ - USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FVEXTPROC, glSecondaryColor3fvEXT, EXT_SECONDARY_COLOR, NULL )\ - USE_GL_FUNC(PGLFNGLSECONDARYCOLORPOINTEREXTPROC, glSecondaryColorPointerEXT, EXT_SECONDARY_COLOR, NULL )\ - /* GL_EXT_texture3D */ \ - USE_GL_FUNC(PGLFNGLTEXIMAGE3DEXTPROC, glTexImage3DEXT, EXT_TEXTURE3D, glTexImage3D)\ - USE_GL_FUNC(PGLFNGLTEXSUBIMAGE3DEXTPROC, glTexSubImage3DEXT, EXT_TEXTURE3D, glTexSubImage3D)\ - /* GL_ARB_vertex_program */ \ - USE_GL_FUNC(PGLFNGENPROGRAMSARBPROC, glGenProgramsARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNBINDPROGRAMARBPROC, glBindProgramARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNPROGRAMSTRINGARBPROC, glProgramStringARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNDELETEPROGRAMSARBPROC, glDeleteProgramsARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNPROGRAMENVPARAMETER4FVARBPROC, glProgramEnvParameter4fvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETER4FVARBPROC, glProgramLocalParameter4fvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIBPOINTERARBPROC, glVertexAttribPointerARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNENABLEVERTEXATTRIBARRAYARBPROC, glEnableVertexAttribArrayARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNDISABLEVERTEXATTRIBARRAYARBPROC, glDisableVertexAttribArrayARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB1DARBPROC, glVertexAttrib1dARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB1DVARBPROC, glVertexAttrib1dvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB1FARBPROC, glVertexAttrib1fARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB1FVARBPROC, glVertexAttrib1fvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB1SARBPROC, glVertexAttrib1sARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB1SVARBPROC, glVertexAttrib1svARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB2DARBPROC, glVertexAttrib2dARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB2DVARBPROC, glVertexAttrib2dvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB2FARBPROC, glVertexAttrib2fARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB2FVARBPROC, glVertexAttrib2fvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB2SARBPROC, glVertexAttrib2sARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB2SVARBPROC, glVertexAttrib2svARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB3DARBPROC, glVertexAttrib3dARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB3DVARBPROC, glVertexAttrib3dvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB3FARBPROC, glVertexAttrib3fARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB3FVARBPROC, glVertexAttrib3fvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB3SARBPROC, glVertexAttrib3sARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB3SVARBPROC, glVertexAttrib3svARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4NBVARBPROC, glVertexAttrib4NbvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4NIVARBPROC, glVertexAttrib4NivARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4NSVARBPROC, glVertexAttrib4NsvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBARBPROC, glVertexAttrib4NubARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBVARBPROC, glVertexAttrib4NubvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4NUIVARBPROC, glVertexAttrib4NuivARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4NUSVARBPROC, glVertexAttrib4NusvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4BVARBPROC, glVertexAttrib4bvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4DARBPROC, glVertexAttrib4dARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4DVARBPROC, glVertexAttrib4dvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4FARBPROC, glVertexAttrib4fARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4FVARBPROC, glVertexAttrib4fvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4IVARBPROC, glVertexAttrib4ivARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4SARBPROC, glVertexAttrib4sARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4SVARBPROC, glVertexAttrib4svARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4UBVARBPROC, glVertexAttrib4ubvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4UIVARBPROC, glVertexAttrib4uivARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4USVARBPROC, glVertexAttrib4usvARB, ARB_VERTEX_PROGRAM, NULL )\ - USE_GL_FUNC(PGLFNGETPROGRAMIVARBPROC, glGetProgramivARB, ARB_VERTEX_PROGRAM, NULL )\ - /* GL_ARB_shader_objects */ \ - USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC, glGetObjectParameterivARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC, glGetObjectParameterfvARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC, glGetUniformLocationARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLGETACTIVEUNIFORMARBPROC, glGetActiveUniformARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC, glUniform1iARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IARBPROC, glUniform2iARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IARBPROC, glUniform3iARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IARBPROC, glUniform4iARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC, glUniform1fARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FARBPROC, glUniform2fARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FARBPROC, glUniform3fARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FARBPROC, glUniform4fARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM1FVARBPROC, glUniform1fvARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FVARBPROC, glUniform2fvARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FVARBPROC, glUniform3fvARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FVARBPROC, glUniform4fvARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IVARBPROC, glUniform1ivARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IVARBPROC, glUniform2ivARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IVARBPROC, glUniform3ivARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IVARBPROC, glUniform4ivARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC, glUniformMatrix2fvARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC, glUniformMatrix3fvARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC, glUniformMatrix4fvARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMFVARBPROC, glGetUniformfvARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMIVARBPROC, glGetUniformivARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLGETINFOLOGARBPROC, glGetInfoLogARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC, glUseProgramObjectARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLCREATESHADEROBJECTARBPROC, glCreateShaderObjectARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLSHADERSOURCEARBPROC, glShaderSourceARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLCOMPILESHADERARBPROC, glCompileShaderARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC, glCreateProgramObjectARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLATTACHOBJECTARBPROC, glAttachObjectARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLLINKPROGRAMARBPROC, glLinkProgramARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLDETACHOBJECTARBPROC, glDetachObjectARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLDELETEOBJECTARBPROC, glDeleteObjectARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLVALIDATEPROGRAMARBPROC, glValidateProgramARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC, glGetAttachedObjectsARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLGETHANDLEARBPROC, glGetHandleARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLGETSHADERSOURCEARBPROC, glGetShaderSourceARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC, glBindAttribLocationARB, ARB_SHADER_OBJECTS, NULL )\ - USE_GL_FUNC(WINED3D_PFNGLGETATTRIBLOCATIONARBPROC, glGetAttribLocationARB, ARB_SHADER_OBJECTS, NULL )\ - /* GL_EXT_stencil_two_side */ \ - USE_GL_FUNC(PGLFNACTIVESTENCILFACEEXTPROC, glActiveStencilFaceEXT, EXT_STENCIL_TWO_SIDE, NULL )\ - /* GL_ATI_separate_stencil */ \ - USE_GL_FUNC(PGLFNSTENCILOPSEPARATEATIPROC, glStencilOpSeparateATI, ATI_SEPARATE_STENCIL, NULL )\ - USE_GL_FUNC(PGLFNSTENCILFUNCSEPARATEATIPROC, glStencilFuncSeparateATI, ATI_SEPARATE_STENCIL, NULL )\ - /* GL_NV_half_float */ \ - USE_GL_FUNC(PGLFNVERTEX2HNVPROC, glVertex2hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEX2HVNVPROC, glVertex2hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEX3HNVPROC, glVertex3hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEX3HVNVPROC, glVertex3hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEX4HNVPROC, glVertex4hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEX4HVNVPROC, glVertex4hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNNORMAL3HNVPROC, glNormal3hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNNORMAL3HVNVPROC, glNormal3hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNCOLOR3HNVPROC, glColor3hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNCOLOR3HVNVPROC, glColor3hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNCOLOR4HNVPROC, glColor4hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNCOLOR4HVNVPROC, glColor4hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNTEXCOORD1HNVPROC, glTexCoord1hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNTEXCOORD1HVNVPROC, glTexCoord1hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNTEXCOORD2HNVPROC, glTexCoord2hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNTEXCOORD2HVNVPROC, glTexCoord2hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNTEXCOORD3HNVPROC, glTexCoord3hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNTEXCOORD3HVNVPROC, glTexCoord3hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNTEXCOORD4HNVPROC, glTexCoord4hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNTEXCOORD4HVNVPROC, glTexCoord4hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNMULTITEXCOORD1HNVPROC, glMultiTexCoord1hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNMULTITEXCOORD1HVNVPROC, glMultiTexCoord1hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNMULTITEXCOORD2HNVPROC, glMultiTexCoord2hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNMULTITEXCOORD2HVNVPROC, glMultiTexCoord2hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNMULTITEXCOORD3HNVPROC, glMultiTexCoord3hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNMULTITEXCOORD3HVNVPROC, glMultiTexCoord3hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNMULTITEXCOORD4HNVPROC, glMultiTexCoord4hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNMULTITEXCOORD4HVNVPROC, glMultiTexCoord4hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNFOGCOORDHNVPROC, glFogCoordhNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNFOGCOORDHVNVPROC, glFogCoordhvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNSECONDARYCOLOR3HNVPROC, glSecondaryColor3hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNSECONDARYCOLOR3HVNVPROC, glSecondaryColor3hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEXWEIGHTHNVPROC, glVertexWeighthNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEXWEIGHTHVNVPROC, glVertexWeighthvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB1HNVPROC, glVertexAttrib1hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB1HVNVPROC, glVertexAttrib1hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB2HNVPROC, glVertexAttrib2hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB2HVNVPROC, glVertexAttrib2hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB3HNVPROC, glVertexAttrib3hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB3HVNVPROC, glVertexAttrib3hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4HNVPROC, glVertexAttrib4hNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIB4HVNVPROC, glVertexAttrib4hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIBS1HVNVPROC, glVertexAttribs1hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIBS2HVNVPROC, glVertexAttribs2hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIBS3HVNVPROC, glVertexAttribs3hvNV, NV_HALF_FLOAT, NULL )\ - USE_GL_FUNC(PGLFNVERTEXATTRIBS4HVNVPROC, glVertexAttribs4hvNV, NV_HALF_FLOAT, NULL )\ - /* GL_NV_register_combiners */ \ - USE_GL_FUNC(PGLFNCOMBINERINPUTNVPROC, glCombinerInputNV, NV_REGISTER_COMBINERS, NULL )\ - USE_GL_FUNC(PGLFNCOMBINEROUTPUTNVPROC, glCombinerOutputNV, NV_REGISTER_COMBINERS, NULL )\ - USE_GL_FUNC(PGLFNCOMBINERPARAMETERFNVPROC, glCombinerParameterfNV, NV_REGISTER_COMBINERS, NULL )\ - USE_GL_FUNC(PGLFNCOMBINERPARAMETERFVNVPROC, glCombinerParameterfvNV, NV_REGISTER_COMBINERS, NULL )\ - USE_GL_FUNC(PGLFNCOMBINERPARAMETERINVPROC, glCombinerParameteriNV, NV_REGISTER_COMBINERS, NULL )\ - USE_GL_FUNC(PGLFNCOMBINERPARAMETERIVNVPROC, glCombinerParameterivNV, NV_REGISTER_COMBINERS, NULL )\ - USE_GL_FUNC(PGLFNFINALCOMBINERINPUTNVPROC, glFinalCombinerInputNV, NV_REGISTER_COMBINERS, NULL )\ - /* GL_NV_fence */ \ - USE_GL_FUNC(PGLFNGENFENCESNVPROC, glGenFencesNV, NV_FENCE, NULL )\ - USE_GL_FUNC(PGLFNDELETEFENCESNVPROC, glDeleteFencesNV, NV_FENCE, NULL )\ - USE_GL_FUNC(PGLFNSETFENCENVPROC, glSetFenceNV, NV_FENCE, NULL )\ - USE_GL_FUNC(PGLFNTESTFENCENVPROC, glTestFenceNV, NV_FENCE, NULL )\ - USE_GL_FUNC(PGLFNFINISHFENCENVPROC, glFinishFenceNV, NV_FENCE, NULL )\ - USE_GL_FUNC(PGLFNISFENCENVPROC, glIsFenceNV, NV_FENCE, NULL )\ - USE_GL_FUNC(PGLFNGETFENCEIVNVPROC, glGetFenceivNV, NV_FENCE, NULL )\ - /* GL_APPLE_fence */ \ - USE_GL_FUNC(PGLFNGENFENCESAPPLEPROC, glGenFencesAPPLE, APPLE_FENCE, NULL )\ - USE_GL_FUNC(PGLFNDELETEFENCESAPPLEPROC, glDeleteFencesAPPLE, APPLE_FENCE, NULL )\ - USE_GL_FUNC(PGLFNSETFENCEAPPLEPROC, glSetFenceAPPLE, APPLE_FENCE, NULL )\ - USE_GL_FUNC(PGLFNTESTFENCEAPPLEPROC, glTestFenceAPPLE, APPLE_FENCE, NULL )\ - USE_GL_FUNC(PGLFNFINISHFENCEAPPLEPROC, glFinishFenceAPPLE, APPLE_FENCE, NULL )\ - USE_GL_FUNC(PGLFNISFENCEAPPLEPROC, glIsFenceAPPLE, APPLE_FENCE, NULL )\ - USE_GL_FUNC(PGLFNTESTOBJECTAPPLEPROC, glTestObjectAPPLE, APPLE_FENCE, NULL )\ - USE_GL_FUNC(PGLFNFINISHOBJECTAPPLEPROC, glFinishObjectAPPLE, APPLE_FENCE, NULL )\ - /* GLX_SGI_video_sync */ \ - USE_GL_FUNC(PGLXFNGETVIDEOSYNCSGIPROC, glXGetVideoSyncSGI, SGI_VIDEO_SYNC, NULL )\ - USE_GL_FUNC(PGLXFNWAITVIDEOSYNCSGIPROC, glXWaitVideoSyncSGI, SGI_VIDEO_SYNC, NULL )\ - /* GL_APPLE_flush_render */ \ - USE_GL_FUNC(PGLFNFLUSHRENDERAPPLEPROC, glFlushRenderAPPLE, APPLE_FLUSH_RENDER, NULL )\ - USE_GL_FUNC(PGLFNFINISHRENDERAPPLEPROC, glFinishRenderAPPLE, APPLE_FLUSH_RENDER, NULL )\ - /* GL_EXT_gpu_program_parameters */ \ - USE_GL_FUNC(PGLFNPROGRAMENVPARAMETERS4FVEXTPROC, glProgramEnvParameters4fvEXT, EXT_GPU_PROGRAM_PARAMETERS,NULL )\ - USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC, glProgramLocalParameters4fvEXT, EXT_GPU_PROGRAM_PARAMETERS,NULL )\ - /* GL_ATI_fragment_shader */ \ - USE_GL_FUNC(PGLFNGENFRAGMENTSHADERSATI, glGenFragmentShadersATI, ATI_FRAGMENT_SHADER, NULL )\ - USE_GL_FUNC(PGLFNBINDFRAGMENTSHADERATI, glBindFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL )\ - USE_GL_FUNC(PGLFNDELETEFRAGMENTSHADERATI, glDeleteFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL )\ - USE_GL_FUNC(PGLFNBEGINFRAGMENTSHADERATI, glBeginFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL )\ - USE_GL_FUNC(PGLFNENDFRAGMENTSHADERATI, glEndFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL )\ - USE_GL_FUNC(PGLFNPASSTEXCOORDATI, glPassTexCoordATI, ATI_FRAGMENT_SHADER, NULL )\ - USE_GL_FUNC(PGLFNSAMPLEMAPATI, glSampleMapATI, ATI_FRAGMENT_SHADER, NULL )\ - USE_GL_FUNC(PGLFNCOLORFRAGMENTOP1ATI, glColorFragmentOp1ATI, ATI_FRAGMENT_SHADER, NULL )\ - USE_GL_FUNC(PGLFNCOLORFRAGMENTOP2ATI, glColorFragmentOp2ATI, ATI_FRAGMENT_SHADER, NULL )\ - USE_GL_FUNC(PGLFNCOLORFRAGMENTOP3ATI, glColorFragmentOp3ATI, ATI_FRAGMENT_SHADER, NULL )\ - USE_GL_FUNC(PGLFNALPHAFRAGMENTOP1ATI, glAlphaFragmentOp1ATI, ATI_FRAGMENT_SHADER, NULL )\ - USE_GL_FUNC(PGLFNALPHAFRAGMENTOP2ATI, glAlphaFragmentOp2ATI, ATI_FRAGMENT_SHADER, NULL )\ - USE_GL_FUNC(PGLFNALPHAFRAGMENTOP3ATI, glAlphaFragmentOp3ATI, ATI_FRAGMENT_SHADER, NULL )\ - USE_GL_FUNC(PGLFNSETFRAGMENTSHADERCONSTANTATI, glSetFragmentShaderConstantATI, ATI_FRAGMENT_SHADER, NULL )\ - /* GL_APPLE_flush_buffer_range */ \ - USE_GL_FUNC(PGLFNBUFFERPARAMETERIAPPLE, glBufferParameteriAPPLE, APPLE_FLUSH_BUFFER_RANGE,NULL)\ - USE_GL_FUNC(PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE, glFlushMappedBufferRangeAPPLE, APPLE_FLUSH_BUFFER_RANGE,NULL) - - -/**************************************************** - * OpenGL WGL defines and functions pointer - ****************************************************/ +/* GLX_SGI_video_sync */ +typedef int (WINE_GLAPI *PGLXFNGETVIDEOSYNCSGIPROC)(unsigned int *); +typedef int (WINE_GLAPI *PGLXFNWAITVIDEOSYNCSGIPROC)(int, int, unsigned int *); /* WGL_ARB_extensions_string */ -typedef const char * (WINAPI * WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); +typedef const char *(WINAPI *WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc); + /* WGL_ARB_multisample */ #ifndef WGL_ARB_multisample -#define WGL_SAMPLE_BUFFERS_ARB 0x2041 -#define WGL_SAMPLES_ARB 0x2042 +#define WGL_ARB_multisample 1 +#define WGL_SAMPLE_BUFFERS_ARB 0x2041 +#define WGL_SAMPLES_ARB 0x2042 #endif -/* WGL_ARB_pixel_format */ -#ifndef WGL_ARB_pixel_format -#define WGL_ARB_pixel_format 1 -#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 -#define WGL_DRAW_TO_WINDOW_ARB 0x2001 -#define WGL_DRAW_TO_BITMAP_ARB 0x2002 -#define WGL_ACCELERATION_ARB 0x2003 -#define WGL_NEED_PALETTE_ARB 0x2004 -#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 -#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 -#define WGL_SWAP_METHOD_ARB 0x2007 -#define WGL_NUMBER_OVERLAYS_ARB 0x2008 -#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 -#define WGL_TRANSPARENT_ARB 0x200A -#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 -#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 -#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 -#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A -#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B -#define WGL_SHARE_DEPTH_ARB 0x200C -#define WGL_SHARE_STENCIL_ARB 0x200D -#define WGL_SHARE_ACCUM_ARB 0x200E -#define WGL_SUPPORT_GDI_ARB 0x200F -#define WGL_SUPPORT_OPENGL_ARB 0x2010 -#define WGL_DOUBLE_BUFFER_ARB 0x2011 -#define WGL_STEREO_ARB 0x2012 -#define WGL_PIXEL_TYPE_ARB 0x2013 -#define WGL_COLOR_BITS_ARB 0x2014 -#define WGL_RED_BITS_ARB 0x2015 -#define WGL_RED_SHIFT_ARB 0x2016 -#define WGL_GREEN_BITS_ARB 0x2017 -#define WGL_GREEN_SHIFT_ARB 0x2018 -#define WGL_BLUE_BITS_ARB 0x2019 -#define WGL_BLUE_SHIFT_ARB 0x201A -#define WGL_ALPHA_BITS_ARB 0x201B -#define WGL_ALPHA_SHIFT_ARB 0x201C -#define WGL_ACCUM_BITS_ARB 0x201D -#define WGL_ACCUM_RED_BITS_ARB 0x201E -#define WGL_ACCUM_GREEN_BITS_ARB 0x201F -#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 -#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 -#define WGL_DEPTH_BITS_ARB 0x2022 -#define WGL_STENCIL_BITS_ARB 0x2023 -#define WGL_AUX_BUFFERS_ARB 0x2024 -#define WGL_NO_ACCELERATION_ARB 0x2025 -#define WGL_GENERIC_ACCELERATION_ARB 0x2026 -#define WGL_FULL_ACCELERATION_ARB 0x2027 -#define WGL_SWAP_EXCHANGE_ARB 0x2028 -#define WGL_SWAP_COPY_ARB 0x2029 -#define WGL_SWAP_UNDEFINED_ARB 0x202A -#define WGL_TYPE_RGBA_ARB 0x202B -#define WGL_TYPE_COLORINDEX_ARB 0x202C -#endif -typedef BOOL (WINAPI * WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); -typedef BOOL (WINAPI * WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); -typedef BOOL (WINAPI * WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); -/* WGL_ARB_make_current_read */ -typedef BOOL (WINAPI * WINED3D_PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); -typedef HDC (WINAPI * WINED3D_PFNWGLGETCURRENTREADDCARBPROC) (void); + /* WGL_ARB_pbuffer */ #ifndef WGL_ARB_pbuffer #define WGL_ARB_pbuffer 1 -#define WGL_DRAW_TO_PBUFFER_ARB 0x202D -#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E -#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F -#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 -#define WGL_PBUFFER_LARGEST_ARB 0x2033 -#define WGL_PBUFFER_WIDTH_ARB 0x2034 -#define WGL_PBUFFER_HEIGHT_ARB 0x2035 -#define WGL_PBUFFER_LOST_ARB 0x2036 +#define WGL_DRAW_TO_PBUFFER_ARB 0x202d +#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202e +#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202f +#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 +#define WGL_PBUFFER_LARGEST_ARB 0x2033 +#define WGL_PBUFFER_WIDTH_ARB 0x2034 +#define WGL_PBUFFER_HEIGHT_ARB 0x2035 +#define WGL_PBUFFER_LOST_ARB 0x2036 #endif DECLARE_HANDLE(HPBUFFERARB); -typedef HPBUFFERARB (WINAPI * WINED3D_PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList); -typedef HDC (WINAPI * WINED3D_PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); -typedef int (WINAPI * WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); -typedef BOOL (WINAPI * WINED3D_PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); -typedef BOOL (WINAPI * WINED3D_PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int *piValue); +typedef HPBUFFERARB (WINAPI *WINED3D_PFNWGLCREATEPBUFFERARBPROC)(HDC hDC, int iPixelFormat, + int iWidth, int iHeight, const int *piAttribList); +typedef HDC (WINAPI *WINED3D_PFNWGLGETPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer); +typedef int (WINAPI *WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer, HDC hDC); +typedef BOOL (WINAPI *WINED3D_PFNWGLDESTROYPBUFFERARBPROC)(HPBUFFERARB hPbuffer); +typedef BOOL (WINAPI *WINED3D_PFNWGLQUERYPBUFFERARBPROC)(HPBUFFERARB hPbuffer, int iAttribute, int *piValue); + +/* WGL_ARB_pixel_format */ +#ifndef WGL_ARB_pixel_format +#define WGL_ARB_pixel_format 1 +#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 +#define WGL_DRAW_TO_WINDOW_ARB 0x2001 +#define WGL_DRAW_TO_BITMAP_ARB 0x2002 +#define WGL_ACCELERATION_ARB 0x2003 +#define WGL_NEED_PALETTE_ARB 0x2004 +#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 +#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 +#define WGL_SWAP_METHOD_ARB 0x2007 +#define WGL_NUMBER_OVERLAYS_ARB 0x2008 +#define WGL_NUMBER_UNDERLAYS_ARB 0x2009 +#define WGL_TRANSPARENT_ARB 0x200a +#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 +#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 +#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 +#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203a +#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203b +#define WGL_SHARE_DEPTH_ARB 0x200c +#define WGL_SHARE_STENCIL_ARB 0x200d +#define WGL_SHARE_ACCUM_ARB 0x200e +#define WGL_SUPPORT_GDI_ARB 0x200f +#define WGL_SUPPORT_OPENGL_ARB 0x2010 +#define WGL_DOUBLE_BUFFER_ARB 0x2011 +#define WGL_STEREO_ARB 0x2012 +#define WGL_PIXEL_TYPE_ARB 0x2013 +#define WGL_COLOR_BITS_ARB 0x2014 +#define WGL_RED_BITS_ARB 0x2015 +#define WGL_RED_SHIFT_ARB 0x2016 +#define WGL_GREEN_BITS_ARB 0x2017 +#define WGL_GREEN_SHIFT_ARB 0x2018 +#define WGL_BLUE_BITS_ARB 0x2019 +#define WGL_BLUE_SHIFT_ARB 0x201a +#define WGL_ALPHA_BITS_ARB 0x201b +#define WGL_ALPHA_SHIFT_ARB 0x201c +#define WGL_ACCUM_BITS_ARB 0x201d +#define WGL_ACCUM_RED_BITS_ARB 0x201e +#define WGL_ACCUM_GREEN_BITS_ARB 0x201f +#define WGL_ACCUM_BLUE_BITS_ARB 0x2020 +#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 +#define WGL_DEPTH_BITS_ARB 0x2022 +#define WGL_STENCIL_BITS_ARB 0x2023 +#define WGL_AUX_BUFFERS_ARB 0x2024 +#define WGL_NO_ACCELERATION_ARB 0x2025 +#define WGL_GENERIC_ACCELERATION_ARB 0x2026 +#define WGL_FULL_ACCELERATION_ARB 0x2027 +#define WGL_SWAP_EXCHANGE_ARB 0x2028 +#define WGL_SWAP_COPY_ARB 0x2029 +#define WGL_SWAP_UNDEFINED_ARB 0x202a +#define WGL_TYPE_RGBA_ARB 0x202b +#define WGL_TYPE_COLORINDEX_ARB 0x202c +#endif +typedef BOOL (WINAPI *WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(HDC hdc, int iPixelFormat, + int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues); +typedef BOOL (WINAPI *WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC)(HDC hdc, int iPixelFormat, + int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues); +typedef BOOL (WINAPI *WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC)(HDC hdc, const int *piAttribIList, + const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); + +/* WGL_ARB_pixel_format_float */ #ifndef WGL_ARB_pixel_format_float #define WGL_ARB_pixel_format_float 1 -#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 +#define WGL_TYPE_RGBA_FLOAT_ARB 0x21a0 #endif + /* WGL_WINE_pixel_format_passthrough */ -typedef BOOL (WINAPI * WINED3D_PFNWGLSETPIXELFORMATWINE) (HDC hdc, int iPixelFormat, const PIXELFORMATDESCRIPTOR* ppfd); +typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelFormat, + const PIXELFORMATDESCRIPTOR *ppfd); + +#define GL_EXT_FUNCS_GEN \ + /* GL_APPLE_fence */ \ + USE_GL_FUNC(PGLFNGENFENCESAPPLEPROC, \ + glGenFencesAPPLE, APPLE_FENCE, NULL) \ + USE_GL_FUNC(PGLFNDELETEFENCESAPPLEPROC, \ + glDeleteFencesAPPLE, APPLE_FENCE, NULL) \ + USE_GL_FUNC(PGLFNSETFENCEAPPLEPROC, \ + glSetFenceAPPLE, APPLE_FENCE, NULL) \ + USE_GL_FUNC(PGLFNTESTFENCEAPPLEPROC, \ + glTestFenceAPPLE, APPLE_FENCE, NULL) \ + USE_GL_FUNC(PGLFNFINISHFENCEAPPLEPROC, \ + glFinishFenceAPPLE, APPLE_FENCE, NULL) \ + USE_GL_FUNC(PGLFNISFENCEAPPLEPROC, \ + glIsFenceAPPLE, APPLE_FENCE, NULL) \ + USE_GL_FUNC(PGLFNTESTOBJECTAPPLEPROC, \ + glTestObjectAPPLE, APPLE_FENCE, NULL) \ + USE_GL_FUNC(PGLFNFINISHOBJECTAPPLEPROC, \ + glFinishObjectAPPLE, APPLE_FENCE, NULL) \ + /* GL_APPLE_flush_buffer_range */ \ + USE_GL_FUNC(PGLFNBUFFERPARAMETERIAPPLE, \ + glBufferParameteriAPPLE, APPLE_FLUSH_BUFFER_RANGE, NULL) \ + USE_GL_FUNC(PGLFNFLUSHMAPPEDBUFFERRANGEAPPLE, \ + glFlushMappedBufferRangeAPPLE, APPLE_FLUSH_BUFFER_RANGE, NULL) \ + /* GL_APPLE_flush_render */ \ + USE_GL_FUNC(PGLFNFLUSHRENDERAPPLEPROC, \ + glFlushRenderAPPLE, APPLE_FLUSH_RENDER, NULL) \ + USE_GL_FUNC(PGLFNFINISHRENDERAPPLEPROC, \ + glFinishRenderAPPLE, APPLE_FLUSH_RENDER, NULL) \ + /* GL_ARB_color_buffer_float */ \ + USE_GL_FUNC(PGLFNCLAMPCOLORARBPROC, \ + glClampColorARB, ARB_COLOR_BUFFER_FLOAT, NULL) \ + /* GL_ARB_draw_buffers */ \ + USE_GL_FUNC(PGLFNDRAWBUFFERSARBPROC, \ + glDrawBuffersARB, ARB_DRAW_BUFFERS, NULL) \ + /* GL_ARB_framebuffer_object */ \ + USE_GL_FUNC(PGLFNGLISRENDERBUFFERPROC, \ + glIsRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLBINDRENDERBUFFERPROC, \ + glBindRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSPROC, \ + glDeleteRenderbuffers, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSPROC, \ + glGenRenderbuffers, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEPROC, \ + glRenderbufferStorage, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC, \ + glRenderbufferStorageMultisample, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVPROC, \ + glGetRenderbufferParameteriv, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLISFRAMEBUFFERPROC, \ + glIsFramebuffer, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFERPROC, \ + glBindFramebuffer, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSPROC, \ + glDeleteFramebuffers, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSPROC, \ + glGenFramebuffers, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSPROC, \ + glCheckFramebufferStatus, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DPROC, \ + glFramebufferTexture1D, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DPROC, \ + glFramebufferTexture2D, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DPROC, \ + glFramebufferTexture3D, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURELAYERPROC, \ + glFramebufferTextureLayer, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFERPROC, \ + glFramebufferRenderbuffer, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC, \ + glGetFramebufferAttachmentParameteriv, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFERPROC, \ + glBlitFramebuffer, ARB_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLGENERATEMIPMAPPROC, \ + glGenerateMipmap, ARB_FRAMEBUFFER_OBJECT, NULL) \ + /* GL_ARB_geometry_shader4 */ \ + USE_GL_FUNC(PGLFNPROGRAMPARAMETERIARBPROC, \ + glProgramParameteriARB, ARB_GEOMETRY_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREARBPROC, \ + glFramebufferTextureARB, ARB_GEOMETRY_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTURELAYERARBPROC, \ + glFramebufferTextureLayerARB, ARB_GEOMETRY_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNFRAMEBUFFERTEXTUREFACEARBPROC, \ + glFramebufferTextureFaceARB, ARB_GEOMETRY_SHADER4, NULL) \ + /* GL_ARB_imaging, GL_EXT_blend_minmax */ \ + USE_GL_FUNC(PGLFNBLENDCOLORPROC, \ + glBlendColorEXT, EXT_BLEND_COLOR, NULL) \ + USE_GL_FUNC(PGLFNBLENDEQUATIONPROC, \ + glBlendEquationEXT, EXT_BLEND_MINMAX, NULL) \ + /* GL_ARB_map_buffer_range */ \ + USE_GL_FUNC(PGLFNMAPBUFFERRANGEPROC, \ + glMapBufferRange, ARB_MAP_BUFFER_RANGE, NULL) \ + USE_GL_FUNC(PGLFNFLUSHMAPPEDBUFFERRANGEPROC, \ + glFlushMappedBufferRange, ARB_MAP_BUFFER_RANGE, NULL) \ + /* GL_ARB_multisample */ \ + USE_GL_FUNC(WINED3D_PFNGLSAMPLECOVERAGEARBPROC, \ + glSampleCoverageARB, ARB_MULTISAMPLE, NULL) \ + /* GL_ARB_multitexture */ \ + USE_GL_FUNC(WINED3D_PFNGLACTIVETEXTUREARBPROC, \ + glActiveTextureARB, ARB_MULTITEXTURE, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLCLIENTACTIVETEXTUREARBPROC, \ + glClientActiveTextureARB, ARB_MULTITEXTURE, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FARBPROC, \ + glMultiTexCoord1fARB, ARB_MULTITEXTURE, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD1FVARBPROC, \ + glMultiTexCoord1fvARB, ARB_MULTITEXTURE, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FARBPROC, \ + glMultiTexCoord2fARB, ARB_MULTITEXTURE, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2FVARBPROC, \ + glMultiTexCoord2fvARB, ARB_MULTITEXTURE, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FARBPROC, \ + glMultiTexCoord3fARB, ARB_MULTITEXTURE, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD3FVARBPROC, \ + glMultiTexCoord3fvARB, ARB_MULTITEXTURE, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FARBPROC, \ + glMultiTexCoord4fARB, ARB_MULTITEXTURE, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4FVARBPROC, \ + glMultiTexCoord4fvARB, ARB_MULTITEXTURE, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD2SVARBPROC, \ + glMultiTexCoord2svARB, ARB_MULTITEXTURE, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLMULTITEXCOORD4SVARBPROC, \ + glMultiTexCoord4svARB, ARB_MULTITEXTURE, NULL) \ + /* GL_ARB_occlusion_query */ \ + USE_GL_FUNC(PGLFNGENQUERIESARBPROC, \ + glGenQueriesARB, ARB_OCCLUSION_QUERY, NULL) \ + USE_GL_FUNC(PGLFNDELETEQUERIESARBPROC, \ + glDeleteQueriesARB, ARB_OCCLUSION_QUERY, NULL) \ + USE_GL_FUNC(PGLFNBEGINQUERYARBPROC, \ + glBeginQueryARB, ARB_OCCLUSION_QUERY, NULL) \ + USE_GL_FUNC(PGLFNENDQUERYARBPROC, \ + glEndQueryARB, ARB_OCCLUSION_QUERY, NULL) \ + USE_GL_FUNC(PGLFNGETQUERYOBJECTIVARBPROC, \ + glGetQueryObjectivARB, ARB_OCCLUSION_QUERY, NULL) \ + USE_GL_FUNC(PGLFNGETQUERYOBJECTUIVARBPROC, \ + glGetQueryObjectuivARB, ARB_OCCLUSION_QUERY, NULL) \ + /* GL_ARB_point_parameters */ \ + USE_GL_FUNC(PGLFNGLPOINTPARAMETERFARBPROC, \ + glPointParameterfARB, ARB_POINT_PARAMETERS, NULL) \ + USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVARBPROC, \ + glPointParameterfvARB, ARB_POINT_PARAMETERS, NULL) \ + /* GL_ARB_provoking_vertex */ \ + USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXPROC, \ + glProvokingVertex, ARB_PROVOKING_VERTEX, NULL) \ + /* GL_ARB_shader_objects */ \ + USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERIVARBPROC, \ + glGetObjectParameterivARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLGETOBJECTPARAMETERFVARBPROC, \ + glGetObjectParameterfvARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMLOCATIONARBPROC, \ + glGetUniformLocationARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLGETACTIVEUNIFORMARBPROC, \ + glGetActiveUniformARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC, \ + glUniform1iARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IARBPROC, \ + glUniform2iARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IARBPROC, \ + glUniform3iARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IARBPROC, \ + glUniform4iARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC, \ + glUniform1fARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FARBPROC, \ + glUniform2fARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FARBPROC, \ + glUniform3fARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FARBPROC, \ + glUniform4fARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM1FVARBPROC, \ + glUniform1fvARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FVARBPROC, \ + glUniform2fvARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM3FVARBPROC, \ + glUniform3fvARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM4FVARBPROC, \ + glUniform4fvARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IVARBPROC, \ + glUniform1ivARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM2IVARBPROC, \ + glUniform2ivARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM3IVARBPROC, \ + glUniform3ivARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IVARBPROC, \ + glUniform4ivARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX2FVARBPROC, \ + glUniformMatrix2fvARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX3FVARBPROC, \ + glUniformMatrix3fvARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUNIFORMMATRIX4FVARBPROC, \ + glUniformMatrix4fvARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMFVARBPROC, \ + glGetUniformfvARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLGETUNIFORMIVARBPROC, \ + glGetUniformivARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLGETINFOLOGARBPROC, \ + glGetInfoLogARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLUSEPROGRAMOBJECTARBPROC, \ + glUseProgramObjectARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLCREATESHADEROBJECTARBPROC, \ + glCreateShaderObjectARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLSHADERSOURCEARBPROC, \ + glShaderSourceARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLCOMPILESHADERARBPROC, \ + glCompileShaderARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLCREATEPROGRAMOBJECTARBPROC, \ + glCreateProgramObjectARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLATTACHOBJECTARBPROC, \ + glAttachObjectARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLLINKPROGRAMARBPROC, \ + glLinkProgramARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLDETACHOBJECTARBPROC, \ + glDetachObjectARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLDELETEOBJECTARBPROC, \ + glDeleteObjectARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLVALIDATEPROGRAMARBPROC, \ + glValidateProgramARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLGETATTACHEDOBJECTSARBPROC, \ + glGetAttachedObjectsARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLGETHANDLEARBPROC, \ + glGetHandleARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLGETSHADERSOURCEARBPROC, \ + glGetShaderSourceARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLBINDATTRIBLOCATIONARBPROC, \ + glBindAttribLocationARB, ARB_SHADER_OBJECTS, NULL) \ + USE_GL_FUNC(WINED3D_PFNGLGETATTRIBLOCATIONARBPROC, \ + glGetAttribLocationARB, ARB_SHADER_OBJECTS, NULL) \ + /* GL_ARB_sync */ \ + USE_GL_FUNC(PGLFNFENCESYNCPROC, \ + glFenceSync, ARB_SYNC, NULL) \ + USE_GL_FUNC(PGLFNISSYNCPROC, \ + glIsSync, ARB_SYNC, NULL) \ + USE_GL_FUNC(PGLFNDELETESYNCPROC, \ + glDeleteSync, ARB_SYNC, NULL) \ + USE_GL_FUNC(PGLFNCLIENTWAITSYNCPROC, \ + glClientWaitSync, ARB_SYNC, NULL) \ + USE_GL_FUNC(PGLFNWAITSYNCPROC, \ + glWaitSync, ARB_SYNC, NULL) \ + USE_GL_FUNC(PGLFNGETINTEGER64VPROC, \ + glGetInteger64v, ARB_SYNC, NULL) \ + USE_GL_FUNC(PGLFNGETSYNCIVPROC, \ + glGetSynciv, ARB_SYNC, NULL) \ + /* GL_ARB_texture_compression */ \ + USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE2DPROC, \ + glCompressedTexImage2DARB, ARB_TEXTURE_COMPRESSION, NULL) \ + USE_GL_FUNC(PGLFNCOMPRESSEDTEXIMAGE3DPROC, \ + glCompressedTexImage3DARB, ARB_TEXTURE_COMPRESSION, NULL) \ + USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE2DPROC, \ + glCompressedTexSubImage2DARB, ARB_TEXTURE_COMPRESSION, NULL) \ + USE_GL_FUNC(PGLFNCOMPRESSEDTEXSUBIMAGE3DPROC, \ + glCompressedTexSubImage3DARB, ARB_TEXTURE_COMPRESSION, NULL) \ + USE_GL_FUNC(PGLFNGETCOMPRESSEDTEXIMAGEPROC, \ + glGetCompressedTexImageARB, ARB_TEXTURE_COMPRESSION, NULL) \ + /* GL_ARB_vertex_blend */ \ + USE_GL_FUNC(PGLFNGLWEIGHTPOINTERARB, \ + glWeightPointerARB, ARB_VERTEX_BLEND, NULL) \ + USE_GL_FUNC(PGLFNGLWEIGHTBV, \ + glWeightbvARB, ARB_VERTEX_BLEND, NULL) \ + USE_GL_FUNC(PGLFNGLWEIGHTSV, \ + glWeightsvARB, ARB_VERTEX_BLEND, NULL) \ + USE_GL_FUNC(PGLFNGLWEIGHTIV, \ + glWeightivARB, ARB_VERTEX_BLEND, NULL) \ + USE_GL_FUNC(PGLFNGLWEIGHTFV, \ + glWeightfvARB, ARB_VERTEX_BLEND, NULL) \ + USE_GL_FUNC(PGLFNGLWEIGHTDV, \ + glWeightdvARB, ARB_VERTEX_BLEND, NULL) \ + USE_GL_FUNC(PGLFNGLWEIGHTUBV, \ + glWeightubvARB, ARB_VERTEX_BLEND, NULL) \ + USE_GL_FUNC(PGLFNGLWEIGHTUSV, \ + glWeightusvARB, ARB_VERTEX_BLEND, NULL) \ + USE_GL_FUNC(PGLFNGLWEIGHTUIV, \ + glWeightuivARB, ARB_VERTEX_BLEND, NULL) \ + USE_GL_FUNC(PGLFNGLVERTEXBLENDARB, \ + glVertexBlendARB, ARB_VERTEX_BLEND, NULL) \ + /* GL_ARB_vertex_buffer_object */ \ + USE_GL_FUNC(PGLFNBINDBUFFERARBPROC, \ + glBindBufferARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNDELETEBUFFERSARBPROC, \ + glDeleteBuffersARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGENBUFFERSARBPROC, \ + glGenBuffersARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNISBUFFERARBPROC, \ + glIsBufferARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNBUFFERDATAARBPROC, \ + glBufferDataARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNBUFFERSUBDATAARBPROC, \ + glBufferSubDataARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGETBUFFERSUBDATAARBPROC, \ + glGetBufferSubDataARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNMAPBUFFERARBPROC, \ + glMapBufferARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNUNMAPBUFFERARBPROC, \ + glUnmapBufferARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGETBUFFERPARAMETERIVARBPROC, \ + glGetBufferParameterivARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGETBUFFERPOINTERVARBPROC, \ + glGetBufferPointervARB, ARB_VERTEX_BUFFER_OBJECT, NULL) \ + /* GL_ARB_vertex_program */ \ + USE_GL_FUNC(PGLFNGENPROGRAMSARBPROC, \ + glGenProgramsARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNBINDPROGRAMARBPROC, \ + glBindProgramARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNPROGRAMSTRINGARBPROC, \ + glProgramStringARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNDELETEPROGRAMSARBPROC, \ + glDeleteProgramsARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNPROGRAMENVPARAMETER4FVARBPROC, \ + glProgramEnvParameter4fvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETER4FVARBPROC, \ + glProgramLocalParameter4fvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBPOINTERARBPROC, \ + glVertexAttribPointerARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNENABLEVERTEXATTRIBARRAYARBPROC, \ + glEnableVertexAttribArrayARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNDISABLEVERTEXATTRIBARRAYARBPROC, \ + glDisableVertexAttribArrayARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB1DARBPROC, \ + glVertexAttrib1dARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB1DVARBPROC, \ + glVertexAttrib1dvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB1FARBPROC, \ + glVertexAttrib1fARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB1FVARBPROC, \ + glVertexAttrib1fvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB1SARBPROC, \ + glVertexAttrib1sARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB1SVARBPROC, \ + glVertexAttrib1svARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB2DARBPROC, \ + glVertexAttrib2dARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB2DVARBPROC, \ + glVertexAttrib2dvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB2FARBPROC, \ + glVertexAttrib2fARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB2FVARBPROC, \ + glVertexAttrib2fvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB2SARBPROC, \ + glVertexAttrib2sARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB2SVARBPROC, \ + glVertexAttrib2svARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB3DARBPROC, \ + glVertexAttrib3dARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB3DVARBPROC, \ + glVertexAttrib3dvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB3FARBPROC, \ + glVertexAttrib3fARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB3FVARBPROC, \ + glVertexAttrib3fvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB3SARBPROC, \ + glVertexAttrib3sARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB3SVARBPROC, \ + glVertexAttrib3svARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4NBVARBPROC, \ + glVertexAttrib4NbvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4NIVARBPROC, \ + glVertexAttrib4NivARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4NSVARBPROC, \ + glVertexAttrib4NsvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBARBPROC, \ + glVertexAttrib4NubARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4NUBVARBPROC, \ + glVertexAttrib4NubvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4NUIVARBPROC, \ + glVertexAttrib4NuivARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4NUSVARBPROC, \ + glVertexAttrib4NusvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4BVARBPROC, \ + glVertexAttrib4bvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4DARBPROC, \ + glVertexAttrib4dARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4DVARBPROC, \ + glVertexAttrib4dvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4FARBPROC, \ + glVertexAttrib4fARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4FVARBPROC, \ + glVertexAttrib4fvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4IVARBPROC, \ + glVertexAttrib4ivARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4SARBPROC, \ + glVertexAttrib4sARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4SVARBPROC, \ + glVertexAttrib4svARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4UBVARBPROC, \ + glVertexAttrib4ubvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4UIVARBPROC, \ + glVertexAttrib4uivARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4USVARBPROC, \ + glVertexAttrib4usvARB, ARB_VERTEX_PROGRAM, NULL) \ + USE_GL_FUNC(PGLFNGETPROGRAMIVARBPROC, \ + glGetProgramivARB, ARB_VERTEX_PROGRAM, NULL) \ + /* GL_ATI_fragment_shader */ \ + USE_GL_FUNC(PGLFNGENFRAGMENTSHADERSATI, \ + glGenFragmentShadersATI, ATI_FRAGMENT_SHADER, NULL) \ + USE_GL_FUNC(PGLFNBINDFRAGMENTSHADERATI, \ + glBindFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL) \ + USE_GL_FUNC(PGLFNDELETEFRAGMENTSHADERATI, \ + glDeleteFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL) \ + USE_GL_FUNC(PGLFNBEGINFRAGMENTSHADERATI, \ + glBeginFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL) \ + USE_GL_FUNC(PGLFNENDFRAGMENTSHADERATI, \ + glEndFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL) \ + USE_GL_FUNC(PGLFNPASSTEXCOORDATI, \ + glPassTexCoordATI, ATI_FRAGMENT_SHADER, NULL) \ + USE_GL_FUNC(PGLFNSAMPLEMAPATI, \ + glSampleMapATI, ATI_FRAGMENT_SHADER, NULL) \ + USE_GL_FUNC(PGLFNCOLORFRAGMENTOP1ATI, \ + glColorFragmentOp1ATI, ATI_FRAGMENT_SHADER, NULL) \ + USE_GL_FUNC(PGLFNCOLORFRAGMENTOP2ATI, \ + glColorFragmentOp2ATI, ATI_FRAGMENT_SHADER, NULL) \ + USE_GL_FUNC(PGLFNCOLORFRAGMENTOP3ATI, \ + glColorFragmentOp3ATI, ATI_FRAGMENT_SHADER, NULL) \ + USE_GL_FUNC(PGLFNALPHAFRAGMENTOP1ATI, \ + glAlphaFragmentOp1ATI, ATI_FRAGMENT_SHADER, NULL) \ + USE_GL_FUNC(PGLFNALPHAFRAGMENTOP2ATI, \ + glAlphaFragmentOp2ATI, ATI_FRAGMENT_SHADER, NULL) \ + USE_GL_FUNC(PGLFNALPHAFRAGMENTOP3ATI, \ + glAlphaFragmentOp3ATI, ATI_FRAGMENT_SHADER, NULL) \ + USE_GL_FUNC(PGLFNSETFRAGMENTSHADERCONSTANTATI, \ + glSetFragmentShaderConstantATI, ATI_FRAGMENT_SHADER, NULL) \ + /* GL_ATI_separate_stencil */ \ + USE_GL_FUNC(PGLFNSTENCILOPSEPARATEATIPROC, \ + glStencilOpSeparateATI, ATI_SEPARATE_STENCIL, NULL) \ + USE_GL_FUNC(PGLFNSTENCILFUNCSEPARATEATIPROC, \ + glStencilFuncSeparateATI, ATI_SEPARATE_STENCIL, NULL) \ + /* GL_EXT_blend_equation_separate */ \ + USE_GL_FUNC(PGLFNBLENDFUNCSEPARATEEXTPROC, \ + glBlendFuncSeparateEXT, EXT_BLEND_FUNC_SEPARATE, NULL) \ + /* GL_EXT_blend_func_separate */ \ + USE_GL_FUNC(PGLFNBLENDEQUATIONSEPARATEEXTPROC, \ + glBlendEquationSeparateEXT, EXT_BLEND_EQUATION_SEPARATE, NULL) \ + /* GL_EXT_fog_coord */ \ + USE_GL_FUNC(PGLFNGLFOGCOORDFEXTPROC, \ + glFogCoordfEXT, EXT_FOG_COORD, NULL) \ + USE_GL_FUNC(PGLFNGLFOGCOORDFVEXTPROC, \ + glFogCoordfvEXT, EXT_FOG_COORD, NULL) \ + USE_GL_FUNC(PGLFNGLFOGCOORDDEXTPROC, \ + glFogCoorddEXT, EXT_FOG_COORD, NULL) \ + USE_GL_FUNC(PGLFNGLFOGCOORDDVEXTPROC, \ + glFogCoorddvEXT, EXT_FOG_COORD, NULL) \ + USE_GL_FUNC(PGLFNGLFOGCOORDPOINTEREXTPROC, \ + glFogCoordPointerEXT, EXT_FOG_COORD, NULL) \ + /* GL_EXT_framebuffer_blit */ \ + USE_GL_FUNC(PGLFNGLBLITFRAMEBUFFEREXTPROC, \ + glBlitFramebufferEXT, EXT_FRAMEBUFFER_BLIT, NULL) \ + /* GL_EXT_framebuffer_multisample */ \ + USE_GL_FUNC(PGLFNRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, \ + glRenderbufferStorageMultisampleEXT, EXT_FRAMEBUFFER_MULTISAMPLE, NULL) \ + /* GL_EXT_framebuffer_object */ \ + USE_GL_FUNC(PGLFNGLISRENDERBUFFEREXTPROC, \ + glIsRenderbufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLBINDRENDERBUFFEREXTPROC, \ + glBindRenderbufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLDELETERENDERBUFFERSEXTPROC, \ + glDeleteRenderbuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLGENRENDERBUFFERSEXTPROC, \ + glGenRenderbuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLRENDERBUFFERSTORAGEEXTPROC, \ + glRenderbufferStorageEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLISFRAMEBUFFEREXTPROC, \ + glIsFramebufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLBINDFRAMEBUFFEREXTPROC, \ + glBindFramebufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLDELETEFRAMEBUFFERSEXTPROC, \ + glDeleteFramebuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLGENFRAMEBUFFERSEXTPROC, \ + glGenFramebuffersEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLCHECKFRAMEBUFFERSTATUSEXTPROC, \ + glCheckFramebufferStatusEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE1DEXTPROC, \ + glFramebufferTexture1DEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE2DEXTPROC, \ + glFramebufferTexture2DEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLFRAMEBUFFERTEXTURE3DEXTPROC, \ + glFramebufferTexture3DEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLFRAMEBUFFERRENDERBUFFEREXTPROC, \ + glFramebufferRenderbufferEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLGENERATEMIPMAPEXTPROC, \ + glGenerateMipmapEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLGETRENDERBUFFERPARAMETERIVEXTPROC, \ + glGetRenderbufferParameterivEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + USE_GL_FUNC(PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC, \ + glGetFramebufferAttachmentParameterivEXT, EXT_FRAMEBUFFER_OBJECT, NULL) \ + /* GL_EXT_gpu_program_parameters */ \ + USE_GL_FUNC(PGLFNPROGRAMENVPARAMETERS4FVEXTPROC, \ + glProgramEnvParameters4fvEXT, EXT_GPU_PROGRAM_PARAMETERS, NULL) \ + USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC, \ + glProgramLocalParameters4fvEXT, EXT_GPU_PROGRAM_PARAMETERS, NULL) \ + /* GL_EXT_gpu_shader4 */\ + USE_GL_FUNC(PGLFNVERTEXATTRIBI1IEXTPROC, \ + glVertexAttribI1iEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI2IEXTPROC, \ + glVertexAttribI2iEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI3IEXTPROC, \ + glVertexAttribI3iEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI4IEXTPROC, \ + glVertexAttribI4iEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI1UIEXTPROC, \ + glVertexAttribI1uiEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI2UIEXTPROC, \ + glVertexAttribI2uiEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI3UIEXTPROC, \ + glVertexAttribI3uiEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI4UIEXTPROC, \ + glVertexAttribI4uiEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI1IVEXTPROC, \ + glVertexAttribI1ivEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI2IVEXTPROC, \ + glVertexAttribI2ivEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI3IVEXTPROC, \ + glVertexAttribI3ivEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI4IVEXTPROC, \ + glVertexAttribI4ivEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI1UIVEXTPROC, \ + glVertexAttribI1uivEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI2UIVEXTPROC, \ + glVertexAttribI2uivEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI3UIVEXTPROC, \ + glVertexAttribI3uivEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI4UIVEXTPROC, \ + glVertexAttribI4uivEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI4BVEXTPROC, \ + glVertexAttribI4bvEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI4SVEXTPROC, \ + glVertexAttribI4svEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI4UBVEXTPROC, \ + glVertexAttribI4ubvEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBI4USVEXTPROC, \ + glVertexAttribI4usvEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBIPOINTEREXTPROC, \ + glVertexAttribIPointerEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNGETVERTEXATTRIBIIVEXTPROC, \ + glVertexAttribIivEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNGETVERTEXATTRIBIUIVEXTPROC, \ + glVertexAttribIuivEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNUNIFORM1UIEXTPROC, \ + glUniform1uiEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNUNIFORM2UIEXTPROC, \ + glUniform2uiEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNUNIFORM3UIEXTPROC, \ + glUniform3uiEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNUNIFORM4UIEXTPROC, \ + glUniform4uiEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNUNIFORM1UIVEXTPROC, \ + glUniform1uivEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNUNIFORM2UIVEXTPROC, \ + glUniform2uivEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNUNIFORM3UIVEXTPROC, \ + glUniform3uivEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNUNIFORM4UIVEXTPROC, \ + glUniform4uivEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNGETUNIFORMUIVEXTPROC, \ + glGetUniformuivEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNBINDFRAGDATALOCATIONEXTPROC, \ + glBindFragDataLocationEXT, EXT_GPU_SHADER4, NULL) \ + USE_GL_FUNC(PGLFNGETFRAGDATALOCATIONEXTPROC, \ + glGetFragDataLocationEXT, EXT_GPU_SHADER4, NULL) \ + /* GL_EXT_paletted_texture */ \ + USE_GL_FUNC(PGLFNGLCOLORTABLEEXTPROC, \ + glColorTableEXT, EXT_PALETTED_TEXTURE, NULL) \ + /* GL_EXT_point_parameters */ \ + USE_GL_FUNC(PGLFNGLPOINTPARAMETERFEXTPROC, \ + glPointParameterfEXT, EXT_POINT_PARAMETERS, NULL) \ + USE_GL_FUNC(PGLFNGLPOINTPARAMETERFVEXTPROC, \ + glPointParameterfvEXT, EXT_POINT_PARAMETERS, NULL) \ + /* GL_EXT_provoking_vertex */ \ + USE_GL_FUNC(PGLFNGLPROVOKINGVERTEXEXTPROC, \ + glProvokingVertexEXT, EXT_PROVOKING_VERTEX, NULL) \ + /* GL_EXT_secondary_color */ \ + USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3UBEXTPROC, \ + glSecondaryColor3ubEXT, EXT_SECONDARY_COLOR, NULL) \ + USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3UBVEXTPROC, \ + glSecondaryColor3ubvEXT, EXT_SECONDARY_COLOR, NULL) \ + USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FEXTPROC, \ + glSecondaryColor3fEXT, EXT_SECONDARY_COLOR, NULL) \ + USE_GL_FUNC(PGLFNGLSECONDARYCOLOR3FVEXTPROC, \ + glSecondaryColor3fvEXT, EXT_SECONDARY_COLOR, NULL) \ + USE_GL_FUNC(PGLFNGLSECONDARYCOLORPOINTEREXTPROC, \ + glSecondaryColorPointerEXT, EXT_SECONDARY_COLOR, NULL) \ + /* GL_EXT_stencil_two_side */ \ + USE_GL_FUNC(PGLFNACTIVESTENCILFACEEXTPROC, \ + glActiveStencilFaceEXT, EXT_STENCIL_TWO_SIDE, NULL) \ + /* GL_EXT_texture3D */ \ + USE_GL_FUNC(PGLFNGLTEXIMAGE3DEXTPROC, \ + glTexImage3DEXT, EXT_TEXTURE3D, glTexImage3D) \ + USE_GL_FUNC(PGLFNGLTEXSUBIMAGE3DEXTPROC, \ + glTexSubImage3DEXT, EXT_TEXTURE3D, glTexSubImage3D) \ + /* GL_NV_fence */ \ + USE_GL_FUNC(PGLFNGENFENCESNVPROC, \ + glGenFencesNV, NV_FENCE, NULL) \ + USE_GL_FUNC(PGLFNDELETEFENCESNVPROC, \ + glDeleteFencesNV, NV_FENCE, NULL) \ + USE_GL_FUNC(PGLFNSETFENCENVPROC, \ + glSetFenceNV, NV_FENCE, NULL) \ + USE_GL_FUNC(PGLFNTESTFENCENVPROC, \ + glTestFenceNV, NV_FENCE, NULL) \ + USE_GL_FUNC(PGLFNFINISHFENCENVPROC, \ + glFinishFenceNV, NV_FENCE, NULL) \ + USE_GL_FUNC(PGLFNISFENCENVPROC, \ + glIsFenceNV, NV_FENCE, NULL) \ + USE_GL_FUNC(PGLFNGETFENCEIVNVPROC, \ + glGetFenceivNV, NV_FENCE, NULL) \ + /* GL_NV_half_float */ \ + USE_GL_FUNC(PGLFNVERTEX2HNVPROC, \ + glVertex2hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEX2HVNVPROC, \ + glVertex2hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEX3HNVPROC, \ + glVertex3hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEX3HVNVPROC, \ + glVertex3hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEX4HNVPROC, \ + glVertex4hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEX4HVNVPROC, \ + glVertex4hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNNORMAL3HNVPROC, \ + glNormal3hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNNORMAL3HVNVPROC, \ + glNormal3hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNCOLOR3HNVPROC, \ + glColor3hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNCOLOR3HVNVPROC, \ + glColor3hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNCOLOR4HNVPROC, \ + glColor4hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNCOLOR4HVNVPROC, \ + glColor4hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNTEXCOORD1HNVPROC, \ + glTexCoord1hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNTEXCOORD1HVNVPROC, \ + glTexCoord1hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNTEXCOORD2HNVPROC, \ + glTexCoord2hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNTEXCOORD2HVNVPROC, \ + glTexCoord2hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNTEXCOORD3HNVPROC, \ + glTexCoord3hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNTEXCOORD3HVNVPROC, \ + glTexCoord3hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNTEXCOORD4HNVPROC, \ + glTexCoord4hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNTEXCOORD4HVNVPROC, \ + glTexCoord4hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNMULTITEXCOORD1HNVPROC, \ + glMultiTexCoord1hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNMULTITEXCOORD1HVNVPROC, \ + glMultiTexCoord1hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNMULTITEXCOORD2HNVPROC, \ + glMultiTexCoord2hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNMULTITEXCOORD2HVNVPROC, \ + glMultiTexCoord2hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNMULTITEXCOORD3HNVPROC, \ + glMultiTexCoord3hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNMULTITEXCOORD3HVNVPROC, \ + glMultiTexCoord3hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNMULTITEXCOORD4HNVPROC, \ + glMultiTexCoord4hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNMULTITEXCOORD4HVNVPROC, \ + glMultiTexCoord4hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNFOGCOORDHNVPROC, \ + glFogCoordhNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNFOGCOORDHVNVPROC, \ + glFogCoordhvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNSECONDARYCOLOR3HNVPROC, \ + glSecondaryColor3hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNSECONDARYCOLOR3HVNVPROC, \ + glSecondaryColor3hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEXWEIGHTHNVPROC, \ + glVertexWeighthNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEXWEIGHTHVNVPROC, \ + glVertexWeighthvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB1HNVPROC, \ + glVertexAttrib1hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB1HVNVPROC, \ + glVertexAttrib1hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB2HNVPROC, \ + glVertexAttrib2hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB2HVNVPROC, \ + glVertexAttrib2hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB3HNVPROC, \ + glVertexAttrib3hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB3HVNVPROC, \ + glVertexAttrib3hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4HNVPROC, \ + glVertexAttrib4hNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIB4HVNVPROC, \ + glVertexAttrib4hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBS1HVNVPROC, \ + glVertexAttribs1hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBS2HVNVPROC, \ + glVertexAttribs2hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBS3HVNVPROC, \ + glVertexAttribs3hvNV, NV_HALF_FLOAT, NULL) \ + USE_GL_FUNC(PGLFNVERTEXATTRIBS4HVNVPROC, \ + glVertexAttribs4hvNV, NV_HALF_FLOAT, NULL) \ + /* GL_NV_register_combiners */ \ + USE_GL_FUNC(PGLFNCOMBINERINPUTNVPROC, \ + glCombinerInputNV, NV_REGISTER_COMBINERS, NULL) \ + USE_GL_FUNC(PGLFNCOMBINEROUTPUTNVPROC, \ + glCombinerOutputNV, NV_REGISTER_COMBINERS, NULL) \ + USE_GL_FUNC(PGLFNCOMBINERPARAMETERFNVPROC, \ + glCombinerParameterfNV, NV_REGISTER_COMBINERS, NULL) \ + USE_GL_FUNC(PGLFNCOMBINERPARAMETERFVNVPROC, \ + glCombinerParameterfvNV, NV_REGISTER_COMBINERS, NULL) \ + USE_GL_FUNC(PGLFNCOMBINERPARAMETERINVPROC, \ + glCombinerParameteriNV, NV_REGISTER_COMBINERS, NULL) \ + USE_GL_FUNC(PGLFNCOMBINERPARAMETERIVNVPROC, \ + glCombinerParameterivNV, NV_REGISTER_COMBINERS, NULL) \ + USE_GL_FUNC(PGLFNFINALCOMBINERINPUTNVPROC, \ + glFinalCombinerInputNV, NV_REGISTER_COMBINERS, NULL) \ + /* GLX_SGI_video_sync */ \ + USE_GL_FUNC(PGLXFNGETVIDEOSYNCSGIPROC, \ + glXGetVideoSyncSGI, SGI_VIDEO_SYNC, NULL) \ + USE_GL_FUNC(PGLXFNWAITVIDEOSYNCSGIPROC, \ + glXWaitVideoSyncSGI, SGI_VIDEO_SYNC, NULL) #define WGL_EXT_FUNCS_GEN \ - USE_GL_FUNC(WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC, wglGetExtensionsStringARB, 0, NULL) \ - USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC, wglGetPixelFormatAttribivARB, 0, NULL) \ - USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC, wglGetPixelFormatAttribfvARB, 0, NULL) \ - USE_GL_FUNC(WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC, wglChoosePixelFormatARB, 0, NULL) \ - USE_GL_FUNC(WINED3D_PFNWGLMAKECONTEXTCURRENTARBPROC, wglMakeContextCurrentARB, 0, NULL) \ - USE_GL_FUNC(WINED3D_PFNWGLGETCURRENTREADDCARBPROC, wglGetCurrentReadDCARB, 0, NULL) \ - USE_GL_FUNC(WINED3D_PFNWGLCREATEPBUFFERARBPROC, wglCreatePbufferARB, 0, NULL) \ - USE_GL_FUNC(WINED3D_PFNWGLGETPBUFFERDCARBPROC, wglGetPbufferDCARB, 0, NULL) \ - USE_GL_FUNC(WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC, wglReleasePbufferDCARB, 0, NULL) \ - USE_GL_FUNC(WINED3D_PFNWGLDESTROYPBUFFERARBPROC, wglDestroyPbufferARB, 0, NULL) \ - USE_GL_FUNC(WINED3D_PFNWGLQUERYPBUFFERARBPROC, wglQueryPbufferARB, 0, NULL) \ - USE_GL_FUNC(WINED3D_PFNWGLSETPIXELFORMATWINE, wglSetPixelFormatWINE, 0, NULL) - - -/**************************************************** - * Structures - ****************************************************/ - -struct wined3d_fbo_ops -{ - PGLFNGLISRENDERBUFFERPROC glIsRenderbuffer; - PGLFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; - PGLFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; - PGLFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; - PGLFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; - PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample; - PGLFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv; - PGLFNGLISFRAMEBUFFERPROC glIsFramebuffer; - PGLFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; - PGLFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; - PGLFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; - PGLFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; - PGLFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D; - PGLFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; - PGLFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D; - PGLFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; - PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv; - PGLFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; - PGLFNGLGENERATEMIPMAPPROC glGenerateMipmap; -}; - -struct wined3d_gl_limits -{ - UINT buffers; - UINT lights; - UINT textures; - UINT texture_stages; - UINT fragment_samplers; - UINT vertex_samplers; - UINT combined_samplers; - UINT sampler_stages; - UINT clipplanes; - UINT texture_size; - UINT texture3d_size; - float pointsize_max; - float pointsize_min; - UINT point_sprite_units; - UINT blends; - UINT anisotropy; - float shininess; - - UINT glsl_varyings; - UINT glsl_vs_float_constants; - UINT glsl_ps_float_constants; - - UINT arb_vs_float_constants; - UINT arb_vs_native_constants; - UINT arb_vs_instructions; - UINT arb_vs_temps; - UINT arb_ps_float_constants; - UINT arb_ps_local_constants; - UINT arb_ps_native_constants; - UINT arb_ps_instructions; - UINT arb_ps_temps; -}; - -#define USE_GL_FUNC(type, pfn, ext, replace) type pfn; - -struct wined3d_gl_info -{ - UINT vidmem; - struct wined3d_gl_limits limits; - DWORD reserved_glsl_constants; - DWORD quirks; - BOOL supported[WINED3D_GL_EXT_COUNT]; - GLint wrap_lookup[WINED3DTADDRESS_MIRRORONCE - WINED3DTADDRESS_WRAP + 1]; - - struct wined3d_fbo_ops fbo_ops; - /* GL function pointers */ - GL_EXT_FUNCS_GEN - /* WGL function pointers */ - WGL_EXT_FUNCS_GEN - - struct GlPixelFormatDesc *gl_formats; -}; - -#undef USE_GL_FUNC + USE_GL_FUNC(WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC, wglGetExtensionsStringARB, 0, NULL) \ + USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC, wglGetPixelFormatAttribivARB, 0, NULL) \ + USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC, wglGetPixelFormatAttribfvARB, 0, NULL) \ + USE_GL_FUNC(WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC, wglChoosePixelFormatARB, 0, NULL) \ + USE_GL_FUNC(WINED3D_PFNWGLCREATEPBUFFERARBPROC, wglCreatePbufferARB, 0, NULL) \ + USE_GL_FUNC(WINED3D_PFNWGLGETPBUFFERDCARBPROC, wglGetPbufferDCARB, 0, NULL) \ + USE_GL_FUNC(WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC, wglReleasePbufferDCARB, 0, NULL) \ + USE_GL_FUNC(WINED3D_PFNWGLDESTROYPBUFFERARBPROC, wglDestroyPbufferARB, 0, NULL) \ + USE_GL_FUNC(WINED3D_PFNWGLQUERYPBUFFERARBPROC, wglQueryPbufferARB, 0, NULL) \ + USE_GL_FUNC(WINED3D_PFNWGLSETPIXELFORMATWINE, wglSetPixelFormatWINE, 0, NULL) #endif /* __WINE_WINED3D_GL */ diff --git a/reactos/dll/directx/wine/wined3d/wined3d_private.h b/reactos/dll/directx/wine/wined3d/wined3d_private.h index de0bcdc2c54..1d5cd974645 100644 --- a/reactos/dll/directx/wine/wined3d/wined3d_private.h +++ b/reactos/dll/directx/wine/wined3d/wined3d_private.h @@ -61,15 +61,16 @@ enum fixup_channel_source CHANNEL_SOURCE_Y = 3, CHANNEL_SOURCE_Z = 4, CHANNEL_SOURCE_W = 5, - CHANNEL_SOURCE_YUV0 = 6, - CHANNEL_SOURCE_YUV1 = 7, + CHANNEL_SOURCE_COMPLEX0 = 6, + CHANNEL_SOURCE_COMPLEX1 = 7, }; -enum yuv_fixup +enum complex_fixup { - YUV_FIXUP_YUY2 = 0, - YUV_FIXUP_UYVY = 1, - YUV_FIXUP_YV12 = 2, + COMPLEX_FIXUP_YUY2 = 0, + COMPLEX_FIXUP_UYVY = 1, + COMPLEX_FIXUP_YV12 = 2, + COMPLEX_FIXUP_P8 = 3, }; #include @@ -103,14 +104,14 @@ static inline struct color_fixup_desc create_color_fixup_desc( return fixup; } -static inline struct color_fixup_desc create_yuv_fixup_desc(enum yuv_fixup yuv_fixup) +static inline struct color_fixup_desc create_complex_fixup_desc(enum complex_fixup complex_fixup) { struct color_fixup_desc fixup = { - 0, yuv_fixup & (1 << 0) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0, - 0, yuv_fixup & (1 << 1) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0, - 0, yuv_fixup & (1 << 2) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0, - 0, yuv_fixup & (1 << 3) ? CHANNEL_SOURCE_YUV1 : CHANNEL_SOURCE_YUV0, + 0, complex_fixup & (1 << 0) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0, + 0, complex_fixup & (1 << 1) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0, + 0, complex_fixup & (1 << 2) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0, + 0, complex_fixup & (1 << 3) ? CHANNEL_SOURCE_COMPLEX1 : CHANNEL_SOURCE_COMPLEX0, }; return fixup; } @@ -120,19 +121,19 @@ static inline BOOL is_identity_fixup(struct color_fixup_desc fixup) return !memcmp(&fixup, &COLOR_FIXUP_IDENTITY, sizeof(fixup)); } -static inline BOOL is_yuv_fixup(struct color_fixup_desc fixup) +static inline BOOL is_complex_fixup(struct color_fixup_desc fixup) { - return fixup.x_source == CHANNEL_SOURCE_YUV0 || fixup.x_source == CHANNEL_SOURCE_YUV1; + return fixup.x_source == CHANNEL_SOURCE_COMPLEX0 || fixup.x_source == CHANNEL_SOURCE_COMPLEX1; } -static inline enum yuv_fixup get_yuv_fixup(struct color_fixup_desc fixup) +static inline enum complex_fixup get_complex_fixup(struct color_fixup_desc fixup) { - enum yuv_fixup yuv_fixup = 0; - if (fixup.x_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 0); - if (fixup.y_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 1); - if (fixup.z_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 2); - if (fixup.w_source == CHANNEL_SOURCE_YUV1) yuv_fixup |= (1 << 3); - return yuv_fixup; + enum complex_fixup complex_fixup = 0; + if (fixup.x_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 0); + if (fixup.y_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 1); + if (fixup.z_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 2); + if (fixup.w_source == CHANNEL_SOURCE_COMPLEX1) complex_fixup |= (1 << 3); + return complex_fixup; } void *wined3d_rb_alloc(size_t size) DECLSPEC_HIDDEN; @@ -410,6 +411,7 @@ enum WINED3D_SHADER_INSTRUCTION_HANDLER WINED3DSIH_CMP, WINED3DSIH_CND, WINED3DSIH_CRS, + WINED3DSIH_CUT, WINED3DSIH_DCL, WINED3DSIH_DEF, WINED3DSIH_DEFB, @@ -421,20 +423,24 @@ enum WINED3D_SHADER_INSTRUCTION_HANDLER WINED3DSIH_DSX, WINED3DSIH_DSY, WINED3DSIH_ELSE, + WINED3DSIH_EMIT, WINED3DSIH_ENDIF, WINED3DSIH_ENDLOOP, WINED3DSIH_ENDREP, WINED3DSIH_EXP, WINED3DSIH_EXPP, WINED3DSIH_FRC, + WINED3DSIH_IADD, WINED3DSIH_IF, WINED3DSIH_IFC, + WINED3DSIH_IGE, WINED3DSIH_LABEL, WINED3DSIH_LIT, WINED3DSIH_LOG, WINED3DSIH_LOGP, WINED3DSIH_LOOP, WINED3DSIH_LRP, + WINED3DSIH_LT, WINED3DSIH_M3x2, WINED3DSIH_M3x3, WINED3DSIH_M3x4, @@ -544,6 +550,7 @@ typedef struct shader_reg_maps struct wined3d_shader_context { IWineD3DBaseShader *shader; + const struct wined3d_gl_info *gl_info; const struct shader_reg_maps *reg_maps; struct wined3d_shader_buffer *buffer; void *backend_data; @@ -619,7 +626,7 @@ struct wined3d_shader_frontend void (*shader_read_dst_param)(void *data, const DWORD **ptr, struct wined3d_shader_dst_param *dst_param, struct wined3d_shader_src_param *dst_rel_addr); void (*shader_read_semantic)(const DWORD **ptr, struct wined3d_shader_semantic *semantic); - void (*shader_read_comment)(const DWORD **ptr, const char **comment); + void (*shader_read_comment)(const DWORD **ptr, const char **comment, UINT *comment_size); BOOL (*shader_is_end)(void *data, const DWORD **ptr); }; @@ -714,7 +721,7 @@ typedef struct { HRESULT (*shader_alloc_private)(IWineD3DDevice *iface); void (*shader_free_private)(IWineD3DDevice *iface); BOOL (*shader_dirtifyable_constants)(IWineD3DDevice *iface); - void (*shader_get_caps)(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct shader_caps *caps); + void (*shader_get_caps)(const struct wined3d_gl_info *gl_info, struct shader_caps *caps); BOOL (*shader_color_fixup_supported)(struct color_fixup_desc fixup); void (*shader_add_instruction_modifiers)(const struct wined3d_shader_instruction *ins); } shader_backend_t; @@ -988,8 +995,10 @@ extern glMultiTexCoordFunc multi_texcoord_funcs[WINED3D_FFP_EMIT_COUNT] DECLSPEC #define STATE_IS_CLIPPLANE(a) ((a) >= STATE_CLIPPLANE(0) && (a) <= STATE_CLIPPLANE(MAX_CLIPPLANES - 1)) #define STATE_MATERIAL (STATE_CLIPPLANE(MAX_CLIPPLANES)) +#define STATE_IS_MATERIAL(a) ((a) == STATE_MATERIAL) #define STATE_FRONTFACE (STATE_MATERIAL + 1) +#define STATE_IS_FRONTFACE(a) ((a) == STATE_FRONTFACE) #define STATE_HIGHEST (STATE_FRONTFACE) @@ -1008,13 +1017,28 @@ struct wined3d_occlusion_query struct wined3d_context *context; }; +union wined3d_gl_query_object +{ + GLuint id; + GLsync sync; +}; + struct wined3d_event_query { struct list entry; - GLuint id; + union wined3d_gl_query_object object; struct wined3d_context *context; }; +enum wined3d_event_query_result +{ + WINED3D_EVENT_QUERY_OK, + WINED3D_EVENT_QUERY_WAITING, + WINED3D_EVENT_QUERY_NOT_STARTED, + WINED3D_EVENT_QUERY_WRONG_THREAD, + WINED3D_EVENT_QUERY_ERROR +}; + struct wined3d_context { const struct wined3d_gl_info *gl_info; @@ -1084,7 +1108,7 @@ struct wined3d_context UINT free_occlusion_query_count; struct list occlusion_queries; - GLuint *free_event_queries; + union wined3d_gl_query_object *free_event_queries; UINT free_event_query_size; UINT free_event_query_count; struct list event_queries; @@ -1122,7 +1146,7 @@ struct fragment_caps struct fragment_pipeline { void (*enable_extension)(IWineD3DDevice *iface, BOOL enable); - void (*get_caps)(WINED3DDEVTYPE devtype, const struct wined3d_gl_info *gl_info, struct fragment_caps *caps); + void (*get_caps)(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps); HRESULT (*alloc_private)(IWineD3DDevice *iface); void (*free_private)(IWineD3DDevice *iface); BOOL (*color_fixup_supported)(struct color_fixup_desc fixup); @@ -1224,7 +1248,7 @@ typedef struct WineD3D_PixelFormat { int iPixelFormat; /* WGL pixel format */ int iPixelType; /* WGL pixel type e.g. WGL_TYPE_RGBA_ARB, WGL_TYPE_RGBA_FLOAT_ARB or WGL_TYPE_COLORINDEX_ARB */ - int redSize, greenSize, blueSize, alphaSize; + int redSize, greenSize, blueSize, alphaSize, colorSize; int depthSize, stencilSize; BOOL windowDrawable; BOOL pbufferDrawable; @@ -1233,13 +1257,23 @@ typedef struct WineD3D_PixelFormat int numSamples; } WineD3D_PixelFormat; +enum wined3d_gl_vendor +{ + GL_VENDOR_WINE, + GL_VENDOR_APPLE, + GL_VENDOR_ATI, + GL_VENDOR_INTEL, + GL_VENDOR_MESA, + GL_VENDOR_NVIDIA, +}; + + enum wined3d_pci_vendor { - VENDOR_WINE = 0x0000, - VENDOR_MESA = 0x0001, - VENDOR_ATI = 0x1002, - VENDOR_NVIDIA = 0x10de, - VENDOR_INTEL = 0x8086, + HW_VENDOR_WINE = 0x0000, + HW_VENDOR_ATI = 0x1002, + HW_VENDOR_NVIDIA = 0x10de, + HW_VENDOR_INTEL = 0x8086, }; enum wined3d_pci_device @@ -1323,6 +1357,85 @@ enum wined3d_pci_device CARD_INTEL_X3100 = 0x2a02, /* Found in Macs. Same as GMA 965? */ }; +struct wined3d_fbo_ops +{ + PGLFNGLISRENDERBUFFERPROC glIsRenderbuffer; + PGLFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; + PGLFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; + PGLFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; + PGLFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; + PGLFNRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample; + PGLFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv; + PGLFNGLISFRAMEBUFFERPROC glIsFramebuffer; + PGLFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; + PGLFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; + PGLFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; + PGLFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; + PGLFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D; + PGLFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; + PGLFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D; + PGLFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; + PGLFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv; + PGLFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; + PGLFNGLGENERATEMIPMAPPROC glGenerateMipmap; +}; + +struct wined3d_gl_limits +{ + UINT buffers; + UINT lights; + UINT textures; + UINT texture_stages; + UINT fragment_samplers; + UINT vertex_samplers; + UINT combined_samplers; + UINT general_combiners; + UINT sampler_stages; + UINT clipplanes; + UINT texture_size; + UINT texture3d_size; + float pointsize_max; + float pointsize_min; + UINT point_sprite_units; + UINT blends; + UINT anisotropy; + float shininess; + + UINT glsl_varyings; + UINT glsl_vs_float_constants; + UINT glsl_ps_float_constants; + + UINT arb_vs_float_constants; + UINT arb_vs_native_constants; + UINT arb_vs_instructions; + UINT arb_vs_temps; + UINT arb_ps_float_constants; + UINT arb_ps_local_constants; + UINT arb_ps_native_constants; + UINT arb_ps_instructions; + UINT arb_ps_temps; +}; + +struct wined3d_gl_info +{ + UINT vidmem; + struct wined3d_gl_limits limits; + DWORD reserved_glsl_constants; + DWORD quirks; + BOOL supported[WINED3D_GL_EXT_COUNT]; + GLint wrap_lookup[WINED3DTADDRESS_MIRRORONCE - WINED3DTADDRESS_WRAP + 1]; + + struct wined3d_fbo_ops fbo_ops; +#define USE_GL_FUNC(type, pfn, ext, replace) type pfn; + /* GL function pointers */ + GL_EXT_FUNCS_GEN + /* WGL function pointers */ + WGL_EXT_FUNCS_GEN +#undef USE_GL_FUNC + + struct GlPixelFormatDesc *gl_formats; +}; + struct wined3d_driver_info { enum wined3d_pci_vendor vendor; @@ -1348,6 +1461,10 @@ struct wined3d_adapter unsigned int TextureRam; /* Amount of texture memory both video ram + AGP/TurboCache/HyperMemory/.. */ unsigned int UsedTextureRam; LUID luid; + + const struct fragment_pipeline *fragment_pipe; + const shader_backend_t *shader_backend; + const struct blit_shader *blitter; }; BOOL initPixelFormats(struct wined3d_gl_info *gl_info, enum wined3d_pci_vendor vendor) DECLSPEC_HIDDEN; @@ -1497,7 +1614,7 @@ struct IWineD3DDeviceImpl const struct fragment_pipeline *frag_pipe; const struct blit_shader *blitter; - unsigned int max_ffp_textures, max_ffp_texture_stages; + unsigned int max_ffp_textures; DWORD d3d_vshader_constantF, d3d_pshader_constantF; /* Advertised d3d caps, not GL ones */ DWORD vs_clipping; @@ -1547,7 +1664,6 @@ struct IWineD3DDeviceImpl UINT NumberOfPalettes; PALETTEENTRY **palettes; UINT currentPalette; - UINT paletteConversionShader; /* For rendering to a texture using glCopyTexImage */ GLenum *draw_buffers; @@ -1602,14 +1718,14 @@ struct IWineD3DDeviceImpl HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d, UINT adapter_idx, WINED3DDEVTYPE device_type, HWND focus_window, DWORD flags, IUnknown *parent, IWineD3DDeviceParent *device_parent) DECLSPEC_HIDDEN; +void device_preload_textures(IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN; LRESULT device_process_message(IWineD3DDeviceImpl *device, HWND window, UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc) DECLSPEC_HIDDEN; void device_resource_add(IWineD3DDeviceImpl *This, IWineD3DResource *resource) DECLSPEC_HIDDEN; void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resource) DECLSPEC_HIDDEN; void device_stream_info_from_declaration(IWineD3DDeviceImpl *This, BOOL use_vshader, struct wined3d_stream_info *stream_info, BOOL *fixup) DECLSPEC_HIDDEN; -void device_stream_info_from_strided(const struct wined3d_gl_info *gl_info, - const struct WineDirect3DVertexStridedData *strided, struct wined3d_stream_info *stream_info) DECLSPEC_HIDDEN; +void device_update_stream_info(IWineD3DDeviceImpl *device, const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN; HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, DWORD Count, const WINED3DRECT *pRects, DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil) DECLSPEC_HIDDEN; void IWineD3DDeviceImpl_FindTexUnitMap(IWineD3DDeviceImpl *This) DECLSPEC_HIDDEN; @@ -1745,6 +1861,7 @@ typedef struct IWineD3DBaseTextureClass void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb) DECLSPEC_HIDDEN; BOOL surface_init_sysmem(IWineD3DSurface *iface) DECLSPEC_HIDDEN; BOOL surface_is_offscreen(IWineD3DSurface *iface) DECLSPEC_HIDDEN; +void surface_prepare_texture(IWineD3DSurfaceImpl *surface, BOOL srgb) DECLSPEC_HIDDEN; typedef struct IWineD3DBaseTextureImpl { @@ -2342,9 +2459,8 @@ typedef struct IWineD3DQueryImpl void *extendedData; } IWineD3DQueryImpl; -extern const IWineD3DQueryVtbl IWineD3DQuery_Vtbl DECLSPEC_HIDDEN; -extern const IWineD3DQueryVtbl IWineD3DEventQuery_Vtbl DECLSPEC_HIDDEN; -extern const IWineD3DQueryVtbl IWineD3DOcclusionQuery_Vtbl DECLSPEC_HIDDEN; +HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device, + WINED3DQUERYTYPE type, IUnknown *parent) DECLSPEC_HIDDEN; /* IWineD3DBuffer */ @@ -2495,6 +2611,7 @@ const char *debug_d3ddeclusage(BYTE usage) DECLSPEC_HIDDEN; const char *debug_d3dprimitivetype(WINED3DPRIMITIVETYPE PrimitiveType) DECLSPEC_HIDDEN; const char *debug_d3drenderstate(DWORD state) DECLSPEC_HIDDEN; const char *debug_d3dsamplerstate(DWORD state) DECLSPEC_HIDDEN; +const char *debug_d3dstate(DWORD state) DECLSPEC_HIDDEN; const char *debug_d3dtexturefiltertype(WINED3DTEXTUREFILTERTYPE filter_type) DECLSPEC_HIDDEN; const char *debug_d3dtexturestate(DWORD state) DECLSPEC_HIDDEN; const char *debug_d3dtstype(WINED3DTRANSFORMSTATETYPE tstype) DECLSPEC_HIDDEN; @@ -2552,12 +2669,6 @@ void multiply_matrix(WINED3DMATRIX *dest, const WINED3DMATRIX *src1, const WINED UINT wined3d_log2i(UINT32 x) DECLSPEC_HIDDEN; unsigned int count_bits(unsigned int mask) DECLSPEC_HIDDEN; -const struct blit_shader *select_blit_implementation(struct wined3d_adapter *adapter, - WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN; -const struct fragment_pipeline *select_fragment_implementation(struct wined3d_adapter *adapter, - WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN; -const shader_backend_t *select_shader_backend(struct wined3d_adapter *adapter, - WINED3DDEVTYPE device_type) DECLSPEC_HIDDEN; void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected, int *vs_selected) DECLSPEC_HIDDEN; typedef struct local_constant { @@ -2601,8 +2712,6 @@ int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *fmt, va_li extern BOOL vshader_get_input(IWineD3DVertexShader *iface, BYTE usage_req, BYTE usage_idx_req, unsigned int *regnum) DECLSPEC_HIDDEN; -extern HRESULT allocate_shader_constants(IWineD3DStateBlockImpl* object) DECLSPEC_HIDDEN; - /***************************************************************************** * IDirect3DBaseShader implementation structure */ @@ -2651,7 +2760,6 @@ typedef struct IWineD3DBaseShaderImpl { void shader_buffer_clear(struct wined3d_shader_buffer *buffer) DECLSPEC_HIDDEN; BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer) DECLSPEC_HIDDEN; void shader_buffer_free(struct wined3d_shader_buffer *buffer) DECLSPEC_HIDDEN; -void shader_cleanup(IWineD3DBaseShader *iface) DECLSPEC_HIDDEN; void shader_dump_src_param(const struct wined3d_shader_src_param *param, const struct wined3d_shader_version *shader_version) DECLSPEC_HIDDEN; void shader_dump_dst_param(const struct wined3d_shader_dst_param *param, @@ -2659,16 +2767,7 @@ void shader_dump_dst_param(const struct wined3d_shader_dst_param *param, unsigned int shader_find_free_input_register(const struct shader_reg_maps *reg_maps, unsigned int max) DECLSPEC_HIDDEN; void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffer *buffer, const shader_reg_maps *reg_maps, const DWORD *pFunction, void *backend_ctx) DECLSPEC_HIDDEN; -HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3d_shader_frontend *fe, - struct shader_reg_maps *reg_maps, struct wined3d_shader_signature_element *input_signature, - struct wined3d_shader_signature_element *output_signature, - const DWORD *byte_code, DWORD constf_size) DECLSPEC_HIDDEN; -void shader_init(struct IWineD3DBaseShaderClass *shader, IWineD3DDeviceImpl *device, - IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN; BOOL shader_match_semantic(const char *semantic_name, WINED3DDECLUSAGE usage) DECLSPEC_HIDDEN; -const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token) DECLSPEC_HIDDEN; -void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe_data, const DWORD *pFunction) DECLSPEC_HIDDEN; -WINED3DDECLUSAGE shader_usage_from_semantic_name(const char *semantic_name) DECLSPEC_HIDDEN; static inline BOOL shader_is_pshader_version(enum wined3d_shader_type type) { diff --git a/reactos/dll/nls/normaliz_redist/normaliz_redist.rbuild b/reactos/dll/nls/normaliz_redist/normaliz_redist.rbuild index 988e654da33..47d3958a939 100644 --- a/reactos/dll/nls/normaliz_redist/normaliz_redist.rbuild +++ b/reactos/dll/nls/normaliz_redist/normaliz_redist.rbuild @@ -1,5 +1,6 @@ + icu/source/common icudt38.c @@ -16,3 +17,4 @@ normaliz.cpp + diff --git a/reactos/dll/ntdll/ldr/utils.c b/reactos/dll/ntdll/ldr/utils.c index 10b6ee572fc..ea208ce5eb9 100644 --- a/reactos/dll/ntdll/ldr/utils.c +++ b/reactos/dll/ntdll/ldr/utils.c @@ -1601,6 +1601,9 @@ LdrpProcessImportDirectoryEntry(PLDR_DATA_TABLE_ENTRY Module, IATSize++; } + /* No need to fixup anything if IAT is empty */ + if (IATSize == 0) return STATUS_SUCCESS; + /* Unprotect the region we are about to write into. */ IATBase = (PVOID)ImportAddressList; IATSize *= sizeof(PVOID*); diff --git a/reactos/dll/shellext/deskadp/deskadp.h b/reactos/dll/shellext/deskadp/deskadp.h index 2de98b3b697..11ab46a2318 100644 --- a/reactos/dll/shellext/deskadp/deskadp.h +++ b/reactos/dll/shellext/deskadp/deskadp.h @@ -1,5 +1,4 @@ -#ifndef __DESKADP__H -#define __DESKADP__H +#pragma once typedef struct _DESKDISPLAYADAPTER { @@ -59,5 +58,3 @@ IDeskDisplayAdapter_ReplacePage(PDESKDISPLAYADAPTER This, static const GUID CLSID_IDeskDisplayAdapter = {0x42071712,0x76d4,0x11d1,{0x8b,0x24,0x00,0xa0,0xc9,0x06,0x8f,0xf3}}; ULONG __cdecl DbgPrint(PCCH Format,...); - -#endif /* __DESKADP__H */ diff --git a/reactos/dll/shellext/deskadp/lang/de-DE.rc b/reactos/dll/shellext/deskadp/lang/de-DE.rc index 0ccade07207..a7881428f7c 100644 --- a/reactos/dll/shellext/deskadp/lang/de-DE.rc +++ b/reactos/dll/shellext/deskadp/lang/de-DE.rc @@ -8,7 +8,7 @@ BEGIN GROUPBOX "Adaptertyp", -1, 7, 3, 237, 50 LTEXT "", IDC_ADAPTERNAME, 40, 17, 190, 20 PUSHBUTTON "&Einstellungen", IDC_ADAPTERPROPERTIES, 177, 33, 59, 14 - GROUPBOX "Adapter Information", -1, 7, 56, 237, 75 + GROUPBOX "Adapter-Informationen", -1, 7, 56, 237, 75 LTEXT "Chiptyp:", -1, 13, 68, 58, 8 LTEXT "", IDC_CHIPTYPE, 71, 68, 160, 8, SS_NOPREFIX LTEXT "DAC Typ:", -1, 13, 80, 58, 8 @@ -17,7 +17,7 @@ BEGIN LTEXT "", IDC_MEMORYSIZE, 71, 92, 160, 8, SS_NOPREFIX LTEXT "Zeichenfolge:", -1, 13, 104, 58, 8 LTEXT "", IDC_ADAPTERSTRING, 71, 104, 160, 8, SS_NOPREFIX - LTEXT "BIOS Informationen:", -1, 13, 116, 58, 8 + LTEXT "BIOS-Informationen:", -1, 13, 116, 58, 8 LTEXT "", IDC_BIOSINFORMATION, 71, 116, 160, 8, SS_NOPREFIX PUSHBUTTON "Alle Modi auf&listen...", IDC_LISTALLMODES, 7, 139, 75, 14 END diff --git a/reactos/dll/shellext/deskadp/resource.h b/reactos/dll/shellext/deskadp/resource.h index 6268f48e3be..ab3d1fae66b 100644 --- a/reactos/dll/shellext/deskadp/resource.h +++ b/reactos/dll/shellext/deskadp/resource.h @@ -1,5 +1,4 @@ -#ifndef __RESOURCE__H -#define __RESOURCE__H +#pragma once #define IDD_DISPLAYADAPTER 100 #define IDD_LISTALLMODES 101 @@ -24,5 +23,3 @@ #define IDS_16BPP 107 #define IDS_24BPP 108 #define IDS_32BPP 109 - -#endif /* __RESOURCE__H */ diff --git a/reactos/dll/shellext/deskmon/deskmon.h b/reactos/dll/shellext/deskmon/deskmon.h index 36157005d9d..d2d381a7561 100644 --- a/reactos/dll/shellext/deskmon/deskmon.h +++ b/reactos/dll/shellext/deskmon/deskmon.h @@ -1,5 +1,4 @@ -#ifndef __DESKMON__H -#define __DESKMON__H +#pragma once typedef struct _DESKMONINFO { @@ -79,5 +78,3 @@ IDeskMonitor_ReplacePage(PDESKMONITOR This, static const GUID CLSID_IDeskMonitor = {0x42071713,0x76d4,0x11d1,{0x8b,0x24,0x00,0xa0,0xc9,0x06,0x8f,0xf3}}; ULONG __cdecl DbgPrint(PCCH Format,...); - -#endif /* __DESKMON__H */ diff --git a/reactos/dll/shellext/deskmon/lang/de-DE.rc b/reactos/dll/shellext/deskmon/lang/de-DE.rc index dc394c8b281..e6d7bd82492 100644 --- a/reactos/dll/shellext/deskmon/lang/de-DE.rc +++ b/reactos/dll/shellext/deskmon/lang/de-DE.rc @@ -17,6 +17,6 @@ END STRINGTABLE BEGIN - IDS_USEDEFFRQUENCY "Verwende Hardware Standardeinstellung." + IDS_USEDEFFRQUENCY "Verwende Hardware-Standardeinstellung." IDS_FREQFMT "%u Hertz" END diff --git a/reactos/dll/shellext/deskmon/resource.h b/reactos/dll/shellext/deskmon/resource.h index 17c564a42a2..dd3573bdb12 100644 --- a/reactos/dll/shellext/deskmon/resource.h +++ b/reactos/dll/shellext/deskmon/resource.h @@ -1,5 +1,4 @@ -#ifndef __RESOURCE__H -#define __RESOURCE__H +#pragma once #define IDD_MONITOR 100 @@ -13,5 +12,3 @@ #define IDS_USEDEFFRQUENCY 101 #define IDS_FREQFMT 102 - -#endif /* __RESOURCE__H */ diff --git a/reactos/dll/shellext/fontext/fontext.h b/reactos/dll/shellext/fontext/fontext.h index 21cd62d8099..c62ce1c49a0 100644 --- a/reactos/dll/shellext/fontext/fontext.h +++ b/reactos/dll/shellext/fontext/fontext.h @@ -1,5 +1,4 @@ -#ifndef __FONTEXT__H -#define __FONTEXT__H +#pragma once #define COBJMACROS #include @@ -8,5 +7,3 @@ #include #include - -#endif /* __FONTEXT__H */ diff --git a/reactos/dll/shellext/fontext/resource.h b/reactos/dll/shellext/fontext/resource.h index 3c2afa78abf..2fdfda08f9c 100644 --- a/reactos/dll/shellext/fontext/resource.h +++ b/reactos/dll/shellext/fontext/resource.h @@ -1,6 +1,3 @@ -#ifndef __RESOURCE__H -#define __RESOURCE__H +#pragma once #define IDS_REACTOS_FONTS_FOLDER 151 - -#endif /* __RESOURCE__H */ diff --git a/reactos/dll/shellext/shellext.rbuild b/reactos/dll/shellext/shellext.rbuild index fc06870684d..95598f57bfc 100644 --- a/reactos/dll/shellext/shellext.rbuild +++ b/reactos/dll/shellext/shellext.rbuild @@ -1,5 +1,5 @@ - + diff --git a/reactos/dll/shellext/slayer/resource.h b/reactos/dll/shellext/slayer/resource.h index a0f23b47fc3..f3312163484 100644 --- a/reactos/dll/shellext/slayer/resource.h +++ b/reactos/dll/shellext/slayer/resource.h @@ -1,5 +1,4 @@ -#ifndef __SLAYER_RESOURCE_H -#define __SLAYER_RESOURCE_H +#pragma once #define IDD_SLAYERSHEET 100 #define IDD_EDITCOMPATIBILITYMODES 101 @@ -19,6 +18,4 @@ #define IDS_SLAYER 100 #define IDS_DESCRIPTION 101 -#endif /* __SLAYER_RESOURCE_H */ - /* EOF */ diff --git a/reactos/dll/shellext/slayer/slayer.h b/reactos/dll/shellext/slayer/slayer.h index f48538e430a..6cad312a0bf 100644 --- a/reactos/dll/shellext/slayer/slayer.h +++ b/reactos/dll/shellext/slayer/slayer.h @@ -1,5 +1,4 @@ -#ifndef __SLAYER_H -#define __SLAYER_H +#pragma once extern HINSTANCE hInstance; @@ -120,7 +119,4 @@ HRESULT STDMETHODCALLTYPE ICompatibilityPage_fnCreateInstance(LPCOMPATIBILITYPAG HRESULT STDMETHODCALLTYPE ICompatibilityPage_fnLockServer(LPCOMPATIBILITYPAGE this, BOOL fLock); - -#endif /* __SLAYER_H */ - /* EOF */ diff --git a/reactos/drivers/base/beep/beep.c b/reactos/drivers/base/beep/beep.c index 324ad1622ae..45addc6f50f 100644 --- a/reactos/drivers/base/beep/beep.c +++ b/reactos/drivers/base/beep/beep.c @@ -393,7 +393,7 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject, DeviceExtension = DeviceObject->DeviceExtension; DeviceExtension->ReferenceCount = 0; DeviceExtension->TimerActive = FALSE; - IoInitializeDpcRequest(DeviceObject, BeepDPC); + IoInitializeDpcRequest(DeviceObject, (PIO_DPC_ROUTINE)BeepDPC); KeInitializeTimer(&DeviceExtension->Timer); ExInitializeFastMutex(&DeviceExtension->Mutex); diff --git a/reactos/drivers/base/bootvid/i386/bootvid.c b/reactos/drivers/base/bootvid/i386/bootvid.c index f6dce1cbec8..3d0ae503167 100644 --- a/reactos/drivers/base/bootvid/i386/bootvid.c +++ b/reactos/drivers/base/bootvid/i386/bootvid.c @@ -394,6 +394,7 @@ VidInitialize(IN BOOLEAN SetMode) { /* Translate the VGA Memory Address */ VgaAddress.LowPart = 0xA0000; + VgaAddress.HighPart = 0; AddressSpace = 0; Result = HalFindBusAddressTranslation(VgaAddress, &AddressSpace, diff --git a/reactos/drivers/base/bootvid/precomp.h b/reactos/drivers/base/bootvid/precomp.h index b74cf0d938a..c7d55e92f8c 100644 --- a/reactos/drivers/base/bootvid/precomp.h +++ b/reactos/drivers/base/bootvid/precomp.h @@ -1,4 +1,5 @@ #include "ntddk.h" +#include "ntifs.h" #include "arc/arc.h" #include "halfuncs.h" #include "drivers/bootvid/bootvid.h" diff --git a/reactos/drivers/base/kdcom/i386/kdbg.c b/reactos/drivers/base/kdcom/i386/kdbg.c index f81bcc69945..3d7ed1c0bf6 100644 --- a/reactos/drivers/base/kdcom/i386/kdbg.c +++ b/reactos/drivers/base/kdcom/i386/kdbg.c @@ -12,6 +12,7 @@ #define NOEXTAPI #include +#include #define NDEBUG #include #include diff --git a/reactos/drivers/base/kddll/kdcom.h b/reactos/drivers/base/kddll/kdcom.h index b7cc9af04b3..d6b6430e889 100644 --- a/reactos/drivers/base/kddll/kdcom.h +++ b/reactos/drivers/base/kddll/kdcom.h @@ -6,8 +6,7 @@ * PROGRAMMER: Timo Kreuzer (timo.kreuzer@ewactos.org) */ -#ifndef _KDCOM_H_ -#define _KDCOM_H_ +#pragma once #define COM_DAT 0x00 #define COM_IEN 0x01 /* interrupt enable register */ @@ -53,5 +52,3 @@ #define MSR_DSR 0x20 /* (complemented) state of data set ready (DSR). */ #define MSR_RI 0x40 /* (complemented) state of ring indicator (RI). */ #define MSR_DCD 0x80 /* (complemented) state of data carrier detect (DCD). */ - -#endif /* !_KDCOM_H_ */ diff --git a/reactos/drivers/base/kddll/kddll.h b/reactos/drivers/base/kddll/kddll.h index 81a20c5a1b5..76330922fc4 100644 --- a/reactos/drivers/base/kddll/kddll.h +++ b/reactos/drivers/base/kddll/kddll.h @@ -6,8 +6,7 @@ * PROGRAMMER: Timo Kreuzer (timo.kreuzer@ewactos.org) */ -#ifndef _KDDLL_H_ -#define _KDDLL_H_ +#pragma once #define NOEXTAPI #include @@ -80,6 +79,3 @@ NTAPI KdDebuggerInitialize0( IN PLOADER_PARAMETER_BLOCK LoaderBlock OPTIONAL); #endif - - -#endif /* !_KDDLL_H_ */ diff --git a/reactos/drivers/base/kddll/kddll.rbuild b/reactos/drivers/base/kddll/kddll.rbuild index 3fca485e8e7..6e01f2fa2b3 100644 --- a/reactos/drivers/base/kddll/kddll.rbuild +++ b/reactos/drivers/base/kddll/kddll.rbuild @@ -1,6 +1,6 @@ - + . ntoskrnl @@ -22,3 +22,4 @@ kdserial kdcom.c + diff --git a/reactos/drivers/battery/battc/battc.c b/reactos/drivers/battery/battc/battc.c new file mode 100644 index 00000000000..6a0b7220c1c --- /dev/null +++ b/reactos/drivers/battery/battc/battc.c @@ -0,0 +1,356 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: drivers/battery/battc/battc.c + * PURPOSE: Battery Class Driver + * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) + */ + +#include + +#define NDEBUG +#include + +NTSTATUS +NTAPI +DriverEntry(PDRIVER_OBJECT DriverObject, + PUNICODE_STRING RegistryPath) +{ + DPRINT("Battery class driver initialized\n"); + + return STATUS_SUCCESS; +} + +BCLASSAPI +NTSTATUS +DDKAPI +BatteryClassUnload(PVOID ClassData) +{ + PBATTERY_CLASS_DATA BattClass = ClassData; + + DPRINT("Battery 0x%x is being unloaded\n"); + + if (BattClass->InterfaceName.Length != 0) + { + IoSetDeviceInterfaceState(&BattClass->InterfaceName, FALSE); + RtlFreeUnicodeString(&BattClass->InterfaceName); + } + + ExFreePoolWithTag(BattClass, + BATTERY_CLASS_DATA_TAG); + + return STATUS_SUCCESS; +} + +BCLASSAPI +NTSTATUS +DDKAPI +BatteryClassSystemControl(PVOID ClassData, + PVOID WmiLibContext, + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + PVOID Disposition) +{ + UNIMPLEMENTED + + return STATUS_WMI_GUID_NOT_FOUND; +} + +BCLASSAPI +NTSTATUS +DDKAPI +BatteryClassQueryWmiDataBlock(PVOID ClassData, + PDEVICE_OBJECT DeviceObject, + PIRP Irp, + ULONG GuidIndex, + PULONG InstanceLengthArray, + ULONG OutBufferSize, + PUCHAR Buffer) +{ + UNIMPLEMENTED + + return STATUS_WMI_GUID_NOT_FOUND; +} + +BCLASSAPI +NTSTATUS +DDKAPI +BatteryClassStatusNotify(PVOID ClassData) +{ + PBATTERY_CLASS_DATA BattClass = ClassData; + PBATTERY_WAIT_STATUS BattWait = BattClass->EventTriggerContext; + BATTERY_STATUS BattStatus; + NTSTATUS Status; + + DPRINT("Received battery status notification from 0x%x\n", ClassData); + + ExAcquireFastMutex(&BattClass->Mutex); + if (!BattClass->Waiting) + { + ExReleaseFastMutex(&BattClass->Mutex); + return STATUS_SUCCESS; + } + + switch (BattClass->EventTrigger) + { + case EVENT_BATTERY_TAG: + ExReleaseFastMutex(&BattClass->Mutex); + DPRINT1("Waiting for battery is UNIMPLEMENTED!\n"); + break; + + case EVENT_BATTERY_STATUS: + ExReleaseFastMutex(&BattClass->Mutex); + Status = BattClass->MiniportInfo.QueryStatus(BattClass->MiniportInfo.Context, + BattWait->BatteryTag, + &BattStatus); + if (!NT_SUCCESS(Status)) + return Status; + + ExAcquireFastMutex(&BattClass->Mutex); + + if (!(BattWait->PowerState & BattStatus.PowerState) || + (BattWait->HighCapacity > BattStatus.Capacity) || + (BattWait->LowCapacity < BattStatus.Capacity)) + { + KeSetEvent(&BattClass->WaitEvent, IO_NO_INCREMENT, FALSE); + } + + ExReleaseFastMutex(&BattClass->Mutex); + break; + + default: + ExReleaseFastMutex(&BattClass->Mutex); + ASSERT(FALSE); + break; + } + + return STATUS_SUCCESS; +} + +BCLASSAPI +NTSTATUS +DDKAPI +BatteryClassInitializeDevice(PBATTERY_MINIPORT_INFO MiniportInfo, + PVOID *ClassData) +{ + NTSTATUS Status; + PBATTERY_CLASS_DATA BattClass = ExAllocatePoolWithTag(NonPagedPool, + sizeof(BATTERY_CLASS_DATA), + BATTERY_CLASS_DATA_TAG); + + if (!BattClass) + return STATUS_INSUFFICIENT_RESOURCES; + + RtlZeroMemory(BattClass, sizeof(BATTERY_CLASS_DATA)); + + RtlCopyMemory(&BattClass->MiniportInfo, + MiniportInfo, + sizeof(BattClass->MiniportInfo)); + + KeInitializeEvent(&BattClass->WaitEvent, SynchronizationEvent, FALSE); + + ExInitializeFastMutex(&BattClass->Mutex); + + Status = IoRegisterDeviceInterface(MiniportInfo->Pdo, + &GUID_DEVICE_BATTERY, + NULL, + &BattClass->InterfaceName); + if (NT_SUCCESS(Status)) + { + DPRINT("Initialized battery interface: %wZ\n", &BattClass->InterfaceName); + IoSetDeviceInterfaceState(&BattClass->InterfaceName, TRUE); + } + else + { + DPRINT1("IoRegisterDeviceInterface failed (0x%x)\n", Status); + } + + *ClassData = BattClass; + + return STATUS_SUCCESS; +} + +BCLASSAPI +NTSTATUS +DDKAPI +BatteryClassIoctl(PVOID ClassData, + PIRP Irp) +{ + PBATTERY_CLASS_DATA BattClass = ClassData; + PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); + NTSTATUS Status; + ULONG WaitTime; + PBATTERY_WAIT_STATUS BattWait; + PBATTERY_QUERY_INFORMATION BattQueryInfo; + PBATTERY_SET_INFORMATION BattSetInfo; + LARGE_INTEGER Timeout; + PBATTERY_STATUS BattStatus; + BATTERY_NOTIFY BattNotify; + + Irp->IoStatus.Information = 0; + + DPRINT("Received IOCTL %x for 0x%x\n", IrpSp->Parameters.DeviceIoControl.IoControlCode, + ClassData); + + switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) + { + case IOCTL_BATTERY_QUERY_TAG: + if (IrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(ULONG) || + IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(ULONG)) + { + Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + WaitTime = *(PULONG)Irp->AssociatedIrp.SystemBuffer; + + Timeout.QuadPart = Int32x32To64(WaitTime, -1000); + + Status = BattClass->MiniportInfo.QueryTag(BattClass->MiniportInfo.Context, + (PULONG)Irp->AssociatedIrp.SystemBuffer); + if (!NT_SUCCESS(Status)) + { + ExAcquireFastMutex(&BattClass->Mutex); + BattClass->EventTrigger = EVENT_BATTERY_TAG; + BattClass->Waiting = TRUE; + ExReleaseFastMutex(&BattClass->Mutex); + + Status = KeWaitForSingleObject(&BattClass->WaitEvent, + Executive, + KernelMode, + FALSE, + WaitTime != -1 ? &Timeout : NULL); + + ExAcquireFastMutex(&BattClass->Mutex); + BattClass->Waiting = FALSE; + ExReleaseFastMutex(&BattClass->Mutex); + + if (Status == STATUS_SUCCESS) + { + Status = BattClass->MiniportInfo.QueryTag(BattClass->MiniportInfo.Context, + (PULONG)Irp->AssociatedIrp.SystemBuffer); + if (NT_SUCCESS(Status)) + Irp->IoStatus.Information = sizeof(ULONG); + } + else + { + Status = STATUS_NO_SUCH_DEVICE; + } + } + else + Irp->IoStatus.Information = sizeof(ULONG); + break; + + case IOCTL_BATTERY_QUERY_STATUS: + if (IrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(*BattWait) || + IrpSp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(BATTERY_STATUS)) + { + Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + BattWait = Irp->AssociatedIrp.SystemBuffer; + + Timeout.QuadPart = Int32x32To64(BattWait->Timeout, -1000); + + Status = BattClass->MiniportInfo.QueryStatus(BattClass->MiniportInfo.Context, + BattWait->BatteryTag, + (PBATTERY_STATUS)Irp->AssociatedIrp.SystemBuffer); + + BattStatus = Irp->AssociatedIrp.SystemBuffer; + + if (!NT_SUCCESS(Status) || + ((BattWait->PowerState & BattStatus->PowerState) && + (BattWait->HighCapacity <= BattStatus->Capacity) && + (BattWait->LowCapacity >= BattStatus->Capacity))) + { + BattNotify.PowerState = BattWait->PowerState; + BattNotify.HighCapacity = BattWait->HighCapacity; + BattNotify.LowCapacity = BattWait->LowCapacity; + + BattClass->MiniportInfo.SetStatusNotify(BattClass->MiniportInfo.Context, + BattWait->BatteryTag, + &BattNotify); + + ExAcquireFastMutex(&BattClass->Mutex); + BattClass->EventTrigger = EVENT_BATTERY_STATUS; + BattClass->EventTriggerContext = BattWait; + BattClass->Waiting = TRUE; + ExReleaseFastMutex(&BattClass->Mutex); + + Status = KeWaitForSingleObject(&BattClass->WaitEvent, + Executive, + KernelMode, + FALSE, + BattWait->Timeout != -1 ? &Timeout : NULL); + + ExAcquireFastMutex(&BattClass->Mutex); + BattClass->Waiting = FALSE; + ExReleaseFastMutex(&BattClass->Mutex); + + BattClass->MiniportInfo.DisableStatusNotify(BattClass->MiniportInfo.Context); + + if (Status == STATUS_SUCCESS) + { + Status = BattClass->MiniportInfo.QueryStatus(BattClass->MiniportInfo.Context, + BattWait->BatteryTag, + (PBATTERY_STATUS)Irp->AssociatedIrp.SystemBuffer); + if (NT_SUCCESS(Status)) + Irp->IoStatus.Information = sizeof(ULONG); + } + else + { + Status = STATUS_NO_SUCH_DEVICE; + } + } + else + Irp->IoStatus.Information = sizeof(BATTERY_STATUS); + break; + + case IOCTL_BATTERY_QUERY_INFORMATION: + if (IrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(*BattQueryInfo)) + { + Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + BattQueryInfo = Irp->AssociatedIrp.SystemBuffer; + + Status = BattClass->MiniportInfo.QueryInformation(BattClass->MiniportInfo.Context, + BattQueryInfo->BatteryTag, + BattQueryInfo->InformationLevel, + BattQueryInfo->AtRate, + Irp->AssociatedIrp.SystemBuffer, + IrpSp->Parameters.DeviceIoControl.OutputBufferLength, + &Irp->IoStatus.Information); + if (!NT_SUCCESS(Status)) + DPRINT1("QueryInformation failed (0x%x)\n", Status); + break; + case IOCTL_BATTERY_SET_INFORMATION: + if (IrpSp->Parameters.DeviceIoControl.InputBufferLength < sizeof(*BattSetInfo)) + { + Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + BattSetInfo = Irp->AssociatedIrp.SystemBuffer; + + Status = BattClass->MiniportInfo.SetInformation(BattClass->MiniportInfo.Context, + BattSetInfo->BatteryTag, + BattSetInfo->InformationLevel, + BattSetInfo->Buffer); + if (!NT_SUCCESS(Status)) + DPRINT1("SetInformation failed (0x%x)\n", Status); + break; + + default: + DPRINT1("Received unsupported IRP %x\n", IrpSp->Parameters.DeviceIoControl.IoControlCode); + /* Do NOT complete the irp */ + return STATUS_NOT_SUPPORTED; + } + + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Status; +} diff --git a/reactos/drivers/battery/battc/battc.h b/reactos/drivers/battery/battc/battc.h new file mode 100644 index 00000000000..0839cea845e --- /dev/null +++ b/reactos/drivers/battery/battc/battc.h @@ -0,0 +1,31 @@ +/* +* PROJECT: ReactOS Kernel +* LICENSE: GPL - See COPYING in the top level directory +* FILE: drivers/battery/battc/battc.h +* PURPOSE: Battery Class Driver +* PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) +*/ + +#pragma once + +#include +#include +#include +#include + +typedef struct _BATTERY_CLASS_DATA { + BATTERY_MINIPORT_INFO MiniportInfo; + KEVENT WaitEvent; + BOOLEAN Waiting; + FAST_MUTEX Mutex; + UCHAR EventTrigger; + PVOID EventTriggerContext; + UNICODE_STRING InterfaceName; +} BATTERY_CLASS_DATA, *PBATTERY_CLASS_DATA; + +/* Memory tags */ +#define BATTERY_CLASS_DATA_TAG 'CtaB' + +/* Event triggers */ +#define EVENT_BATTERY_TAG 0x01 +#define EVENT_BATTERY_STATUS 0x02 diff --git a/reactos/drivers/battery/battc/battc.rbuild b/reactos/drivers/battery/battc/battc.rbuild new file mode 100644 index 00000000000..c0261344994 --- /dev/null +++ b/reactos/drivers/battery/battc/battc.rbuild @@ -0,0 +1,10 @@ + + + + ntoskrnl + hal + + . + battc.c + battc.rc + diff --git a/reactos/drivers/battery/battc/battc.rc b/reactos/drivers/battery/battc/battc.rc new file mode 100644 index 00000000000..2230092b4a4 --- /dev/null +++ b/reactos/drivers/battery/battc/battc.rc @@ -0,0 +1,5 @@ +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "Battery Class Driver\0" +#define REACTOS_STR_INTERNAL_NAME "battc\0" +#define REACTOS_STR_ORIGINAL_FILENAME "battc.sys\0" +#include diff --git a/reactos/drivers/battery/battc/battc.spec b/reactos/drivers/battery/battc/battc.spec new file mode 100644 index 00000000000..c2d21b7ec20 --- /dev/null +++ b/reactos/drivers/battery/battc/battc.spec @@ -0,0 +1,6 @@ +@ stdcall BatteryClassInitializeDevice(ptr ptr) +@ stdcall BatteryClassIoctl(ptr ptr) +@ stdcall BatteryClassQueryWmiDataBlock(ptr ptr ptr long ptr long ptr) +@ stdcall BatteryClassStatusNotify(ptr) +@ stdcall BatteryClassSystemControl(ptr ptr ptr ptr ptr) +@ stdcall BatteryClassUnload(ptr) diff --git a/reactos/drivers/battery/cmbatt/cmbatt.c b/reactos/drivers/battery/cmbatt/cmbatt.c new file mode 100644 index 00000000000..b85f3ebc504 --- /dev/null +++ b/reactos/drivers/battery/cmbatt/cmbatt.c @@ -0,0 +1,188 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: drivers/battery/cmbatt/cmbatt.c + * PURPOSE: Control Method Battery Miniclass Driver + * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) + */ + +#include + +#define NDEBUG +#include + +LIST_ENTRY BatteryList; +KSPIN_LOCK BatteryListLock; + +VOID +NTAPI +CmBattUnload(PDRIVER_OBJECT DriverObject) +{ + DPRINT("Control method battery miniclass driver unloaded\n"); +} + +NTSTATUS +NTAPI +CmBattDeviceControl(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + PCMBATT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; + NTSTATUS Status; + + Status = BatteryClassIoctl(DeviceExtension->BattClassHandle, + Irp); + + if (Status == STATUS_NOT_SUPPORTED) + { + Irp->IoStatus.Status = Status; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + + return Status; +} + +NTSTATUS +NTAPI +CmBattPnP(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + PCMBATT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; + + UNIMPLEMENTED + + IoSkipCurrentIrpStackLocation(Irp); + + return IoCallDriver(DeviceExtension->Ldo, Irp); +} + +NTSTATUS +NTAPI +CmBattSystemControl(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + UNIMPLEMENTED + + Irp->IoStatus.Status = STATUS_WMI_GUID_NOT_FOUND; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_WMI_GUID_NOT_FOUND; +} + +NTSTATUS +NTAPI +CmBattPower(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + PCMBATT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; + + UNIMPLEMENTED + + IoSkipCurrentIrpStackLocation(Irp); + + PoStartNextPowerIrp(Irp); + + return PoCallDriver(DeviceExtension->Ldo, Irp); +} + +NTSTATUS +NTAPI +CmBattCreateClose(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +{ + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +CmBattAddDevice(PDRIVER_OBJECT DriverObject, + PDEVICE_OBJECT PhysicalDeviceObject) +{ + NTSTATUS Status; + PDEVICE_OBJECT DeviceObject; + PCMBATT_DEVICE_EXTENSION DeviceExtension; + BATTERY_MINIPORT_INFO BattInfo; + + Status = IoCreateDevice(DriverObject, + sizeof(CMBATT_DEVICE_EXTENSION), + NULL, + FILE_DEVICE_BATTERY, + 0, + FALSE, + &DeviceObject); + if (!NT_SUCCESS(Status)) + return Status; + + DeviceExtension = DeviceObject->DeviceExtension; + + DeviceExtension->Pdo = PhysicalDeviceObject; + DeviceExtension->Fdo = DeviceObject; + DeviceExtension->Ldo = IoAttachDeviceToDeviceStack(DeviceObject, + PhysicalDeviceObject); + + DeviceObject->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE; + + /* We require an extra stack entry */ + DeviceObject->StackSize = PhysicalDeviceObject->StackSize + 2; + + BattInfo.MajorVersion = BATTERY_CLASS_MAJOR_VERSION; + BattInfo.MinorVersion = BATTERY_CLASS_MINOR_VERSION; + BattInfo.Context = DeviceExtension; + BattInfo.QueryTag = CmBattQueryTag; + BattInfo.QueryInformation = CmBattQueryInformation; + BattInfo.SetInformation = CmBattSetInformation; + BattInfo.QueryStatus = CmBattQueryStatus; + BattInfo.SetStatusNotify = CmBattSetStatusNotify; + BattInfo.DisableStatusNotify = CmBattDisableStatusNotify; + BattInfo.Pdo = PhysicalDeviceObject; + BattInfo.DeviceName = NULL; + + Status = BatteryClassInitializeDevice(&BattInfo, + &DeviceExtension->BattClassHandle); + if (!NT_SUCCESS(Status)) + { + IoDetachDevice(DeviceExtension->Ldo); + IoDeleteDevice(DeviceObject); + return Status; + } + + ExInterlockedInsertTailList(&BatteryList, + &DeviceExtension->ListEntry, + &BatteryListLock); + + DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; + + DPRINT("Successfully registered battery with battc (0x%x)\n", DeviceExtension->BattClassHandle); + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +DriverEntry(PDRIVER_OBJECT DriverObject, + PUNICODE_STRING RegistryPath) +{ + DPRINT("Control method battery miniclass driver initialized\n"); + + DriverObject->DriverUnload = CmBattUnload; + DriverObject->DriverExtension->AddDevice = CmBattAddDevice; + DriverObject->MajorFunction[IRP_MJ_POWER] = CmBattPower; + DriverObject->MajorFunction[IRP_MJ_PNP] = CmBattPnP; + DriverObject->MajorFunction[IRP_MJ_CREATE] = CmBattCreateClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = CmBattCreateClose; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = CmBattDeviceControl; + DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = CmBattSystemControl; + + KeInitializeSpinLock(&BatteryListLock); + InitializeListHead(&BatteryList); + + return STATUS_SUCCESS; +} diff --git a/reactos/drivers/battery/cmbatt/cmbatt.h b/reactos/drivers/battery/cmbatt/cmbatt.h new file mode 100644 index 00000000000..e70b561d3df --- /dev/null +++ b/reactos/drivers/battery/cmbatt/cmbatt.h @@ -0,0 +1,58 @@ +/* +* PROJECT: ReactOS Kernel +* LICENSE: GPL - See COPYING in the top level directory +* FILE: drivers/battery/cmbatt/cmbatt.h +* PURPOSE: Control Method Battery Miniclass Driver +* PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) +*/ + +#pragma once + +#include +#include + +typedef struct _CMBATT_DEVICE_EXTENSION { + PDEVICE_OBJECT Pdo; + PDEVICE_OBJECT Ldo; + PDEVICE_OBJECT Fdo; + PVOID BattClassHandle; + LIST_ENTRY ListEntry; +} CMBATT_DEVICE_EXTENSION, *PCMBATT_DEVICE_EXTENSION; + +NTSTATUS +NTAPI +CmBattQueryTag(PVOID Context, + PULONG BatteryTag); + +NTSTATUS +NTAPI +CmBattDisableStatusNotify(PVOID Context); + +NTSTATUS +NTAPI +CmBattSetStatusNotify(PVOID Context, + ULONG BatteryTag, + PBATTERY_NOTIFY BatteryNotify); + +NTSTATUS +NTAPI +CmBattQueryInformation(PVOID Context, + ULONG BatteryTag, + BATTERY_QUERY_INFORMATION_LEVEL Level, + OPTIONAL LONG AtRate, + PVOID Buffer, + ULONG BufferLength, + PULONG ReturnedLength); + +NTSTATUS +NTAPI +CmBattQueryStatus(PVOID Context, + ULONG BatteryTag, + PBATTERY_STATUS BatteryStatus); + +NTSTATUS +NTAPI +CmBattSetInformation(PVOID Context, + ULONG BatteryTag, + BATTERY_SET_INFORMATION_LEVEL Level, + OPTIONAL PVOID Buffer); diff --git a/reactos/drivers/battery/cmbatt/cmbatt.rbuild b/reactos/drivers/battery/cmbatt/cmbatt.rbuild new file mode 100644 index 00000000000..c41a072779c --- /dev/null +++ b/reactos/drivers/battery/cmbatt/cmbatt.rbuild @@ -0,0 +1,11 @@ + + + + ntoskrnl + hal + battc + . + cmbatt.c + miniclass.c + cmbatt.rc + diff --git a/reactos/drivers/battery/cmbatt/cmbatt.rc b/reactos/drivers/battery/cmbatt/cmbatt.rc new file mode 100644 index 00000000000..2fd6bc7713c --- /dev/null +++ b/reactos/drivers/battery/cmbatt/cmbatt.rc @@ -0,0 +1,5 @@ +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "Control Method Battery Miniclass Driver\0" +#define REACTOS_STR_INTERNAL_NAME "cmbatt\0" +#define REACTOS_STR_ORIGINAL_FILENAME "cmbatt.sys\0" +#include diff --git a/reactos/drivers/battery/cmbatt/miniclass.c b/reactos/drivers/battery/cmbatt/miniclass.c new file mode 100644 index 00000000000..bb75d9aa319 --- /dev/null +++ b/reactos/drivers/battery/cmbatt/miniclass.c @@ -0,0 +1,82 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: drivers/battery/cmbatt/miniclass.c + * PURPOSE: Control Method Battery Miniclass Driver + * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) + */ + +#include + +#define NDEBUG +#include + +NTSTATUS +NTAPI +CmBattQueryTag(PVOID Context, + PULONG BatteryTag) +{ + UNIMPLEMENTED + + *BatteryTag = 0; + + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +CmBattDisableStatusNotify(PVOID Context) +{ + UNIMPLEMENTED + + return STATUS_NOT_SUPPORTED; +} + +NTSTATUS +NTAPI +CmBattSetStatusNotify(PVOID Context, + ULONG BatteryTag, + PBATTERY_NOTIFY BatteryNotify) +{ + UNIMPLEMENTED + + return STATUS_NOT_SUPPORTED; +} + +NTSTATUS +NTAPI +CmBattQueryInformation(PVOID Context, + ULONG BatteryTag, + BATTERY_QUERY_INFORMATION_LEVEL Level, + OPTIONAL LONG AtRate, + PVOID Buffer, + ULONG BufferLength, + PULONG ReturnedLength) +{ + UNIMPLEMENTED + + return STATUS_NOT_SUPPORTED; +} + +NTSTATUS +NTAPI +CmBattQueryStatus(PVOID Context, + ULONG BatteryTag, + PBATTERY_STATUS BatteryStatus) +{ + UNIMPLEMENTED + + return STATUS_NOT_SUPPORTED; +} + +NTSTATUS +NTAPI +CmBattSetInformation(PVOID Context, + ULONG BatteryTag, + BATTERY_SET_INFORMATION_LEVEL Level, + OPTIONAL PVOID Buffer) +{ + UNIMPLEMENTED + + return STATUS_NOT_SUPPORTED; +} diff --git a/reactos/drivers/battery/directory.rbuild b/reactos/drivers/battery/directory.rbuild new file mode 100644 index 00000000000..2da9fe08c92 --- /dev/null +++ b/reactos/drivers/battery/directory.rbuild @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/reactos/drivers/bus/acpi/acpi.rbuild b/reactos/drivers/bus/acpi/acpi.rbuild deleted file mode 100644 index 94b960a9b6f..00000000000 --- a/reactos/drivers/bus/acpi/acpi.rbuild +++ /dev/null @@ -1,142 +0,0 @@ - - - - - include - ospm/include - ntoskrnl - hal - - dsfield.c - dsmethod.c - dsmthdat.c - dsobject.c - dsopcode.c - dsutils.c - dswexec.c - dswload.c - dswscope.c - dswstate.c - - - evevent.c - evmisc.c - evregion.c - evrgnini.c - evsci.c - evxface.c - evxfevnt.c - evxfregn.c - - - amconfig.c - amconvrt.c - amcreate.c - amdump.c - amdyadic.c - amfield.c - amfldio.c - ammisc.c - ammonad.c - ammutex.c - amnames.c - amprep.c - amregion.c - amresnte.c - amresolv.c - amresop.c - amstore.c - amstoren.c - amstorob.c - amsystem.c - amutils.c - amxface.c - - - hwacpi.c - hwgpe.c - hwregs.c - hwsleep.c - hwtimer.c - - - nsaccess.c - nsalloc.c - nseval.c - nsinit.c - nsload.c - nsnames.c - nsobject.c - nssearch.c - nsutils.c - nswalk.c - nsxfname.c - nsxfobj.c - - - - bm.c - bmnotify.c - bmpm.c - bmpower.c - bmrequest.c - bmsearch.c - bmutils.c - bmxface.c - - acpienum.c - acpisys.c - bn.c - fdo.c - osl.c - pdo.c - - - psargs.c - psopcode.c - psparse.c - psscope.c - pstree.c - psutils.c - pswalk.c - psxface.c - - - rsaddr.c - rscalc.c - rscreate.c - rsdump.c - rsio.c - rsirq.c - rslist.c - rsmemory.c - rsmisc.c - rsutils.c - rsxface.c - - - tbconvrt.c - tbget.c - tbinstal.c - tbutils.c - tbxface.c - tbxfroot.c - - - cmalloc.c - cmclib.c - cmcopy.c - cmdebug.c - cmdelete.c - cmeval.c - cmglobal.c - cminit.c - cmobject.c - cmutils.c - cmxface.c - - acpi.rc - - acpi.h - - diff --git a/reactos/drivers/bus/acpi/acpi.rc b/reactos/drivers/bus/acpi/acpi.rc deleted file mode 100644 index 41b00065cb0..00000000000 --- a/reactos/drivers/bus/acpi/acpi.rc +++ /dev/null @@ -1,7 +0,0 @@ -/* $Id$ */ - -#define REACTOS_VERSION_DLL -#define REACTOS_STR_FILE_DESCRIPTION "ReactOS ACPI Driver\0" -#define REACTOS_STR_INTERNAL_NAME "acpi\0" -#define REACTOS_STR_ORIGINAL_FILENAME "acpi.sys\0" -#include diff --git a/reactos/drivers/bus/acpi/changed.txt b/reactos/drivers/bus/acpi/changed.txt deleted file mode 100644 index 571775163fd..00000000000 --- a/reactos/drivers/bus/acpi/changed.txt +++ /dev/null @@ -1,21 +0,0 @@ -Changes to ACPI CA ------------------- - -+ = Added -- = Removed -* = Altered - -+ include/platform/acwin.h -+ include/platform/types.h -- ospm/ac_adapter/* -- ospm/battery/* -- ospm/button/* -- ospm/ec/* -- ospm/include/* (except bm.h) -- ospm/processor/* -- ospm/system/* -- ospm/thermal/* -- ospm/busmgr/bm_module.c -- ospm/busmgr/bm_proc.c -- ospm/busmgr/bm_symbols.c -- ospm/busmgr/Makefile diff --git a/reactos/drivers/bus/acpi/dispatcher/dsfield.c b/reactos/drivers/bus/acpi/dispatcher/dsfield.c deleted file mode 100644 index 191a9e92cfe..00000000000 --- a/reactos/drivers/bus/acpi/dispatcher/dsfield.c +++ /dev/null @@ -1,418 +0,0 @@ -/****************************************************************************** - * - * Module Name: dsfield - Dispatcher field routines - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_DISPATCHER - MODULE_NAME ("dsfield") - - -/* - * Field flags: Bits 00 - 03 : Access_type (Any_acc, Byte_acc, etc.) - * 04 : Lock_rule (1 == Lock) - * 05 - 06 : Update_rule - */ - -#define FIELD_ACCESS_TYPE_MASK 0x0F -#define FIELD_LOCK_RULE_MASK 0x10 -#define FIELD_UPDATE_RULE_MASK 0x60 - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_create_field - * - * PARAMETERS: Op - Op containing the Field definition and args - * Region_node - Object for the containing Operation Region - * - * RETURN: Status - * - * DESCRIPTION: Create a new field in the specified operation region - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_create_field ( - ACPI_PARSE_OBJECT *op, - ACPI_NAMESPACE_NODE *region_node, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status = AE_AML_ERROR; - ACPI_PARSE_OBJECT *arg; - ACPI_NAMESPACE_NODE *node; - u8 field_flags; - u8 access_attribute = 0; - u32 field_bit_position = 0; - - - /* First arg is the name of the parent Op_region */ - - arg = op->value.arg; - if (!region_node) { - status = acpi_ns_lookup (walk_state->scope_info, arg->value.name, - ACPI_TYPE_REGION, IMODE_EXECUTE, - NS_SEARCH_PARENT, walk_state, - ®ion_node); - - if (ACPI_FAILURE (status)) { - return (status); - } - } - - /* Second arg is the field flags */ - - arg = arg->next; - field_flags = (u8) arg->value.integer; - - /* Each remaining arg is a Named Field */ - - arg = arg->next; - while (arg) { - switch (arg->opcode) { - case AML_RESERVEDFIELD_OP: - - field_bit_position += arg->value.size; - break; - - - case AML_ACCESSFIELD_OP: - - /* - * Get a new Access_type and Access_attribute for all - * entries (until end or another Access_as keyword) - */ - - access_attribute = (u8) arg->value.integer; - field_flags = (u8) - ((field_flags & FIELD_ACCESS_TYPE_MASK) || - ((u8) (arg->value.integer >> 8))); - break; - - - case AML_NAMEDFIELD_OP: - - status = acpi_ns_lookup (walk_state->scope_info, - (NATIVE_CHAR *) &((ACPI_PARSE2_OBJECT *)arg)->name, - INTERNAL_TYPE_DEF_FIELD, - IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, &node); - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * Initialize an object for the new Node that is on - * the object stack - */ - - status = acpi_aml_prep_def_field_value (node, region_node, field_flags, - access_attribute, field_bit_position, arg->value.size); - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Keep track of bit position for *next* field */ - - field_bit_position += arg->value.size; - break; - } - - arg = arg->next; - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_create_bank_field - * - * PARAMETERS: Op - Op containing the Field definition and args - * Region_node - Object for the containing Operation Region - * - * RETURN: Status - * - * DESCRIPTION: Create a new bank field in the specified operation region - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_create_bank_field ( - ACPI_PARSE_OBJECT *op, - ACPI_NAMESPACE_NODE *region_node, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status = AE_AML_ERROR; - ACPI_PARSE_OBJECT *arg; - ACPI_NAMESPACE_NODE *register_node; - ACPI_NAMESPACE_NODE *node; - u32 bank_value; - u8 field_flags; - u8 access_attribute = 0; - u32 field_bit_position = 0; - - - /* First arg is the name of the parent Op_region */ - - arg = op->value.arg; - if (!region_node) { - status = acpi_ns_lookup (walk_state->scope_info, arg->value.name, - ACPI_TYPE_REGION, IMODE_EXECUTE, - NS_SEARCH_PARENT, walk_state, - ®ion_node); - - if (ACPI_FAILURE (status)) { - return (status); - } - } - - /* Second arg is the Bank Register */ - - arg = arg->next; - - status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, - INTERNAL_TYPE_BANK_FIELD_DEFN, - IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, ®ister_node); - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Third arg is the Bank_value */ - - arg = arg->next; - bank_value = arg->value.integer; - - - /* Next arg is the field flags */ - - arg = arg->next; - field_flags = (u8) arg->value.integer; - - /* Each remaining arg is a Named Field */ - - arg = arg->next; - while (arg) { - switch (arg->opcode) { - case AML_RESERVEDFIELD_OP: - - field_bit_position += arg->value.size; - break; - - - case AML_ACCESSFIELD_OP: - - /* - * Get a new Access_type and Access_attribute for - * all entries (until end or another Access_as keyword) - */ - - access_attribute = (u8) arg->value.integer; - field_flags = (u8) - ((field_flags & FIELD_ACCESS_TYPE_MASK) || - ((u8) (arg->value.integer >> 8))); - break; - - - case AML_NAMEDFIELD_OP: - - status = acpi_ns_lookup (walk_state->scope_info, - (NATIVE_CHAR *) &((ACPI_PARSE2_OBJECT *)arg)->name, - INTERNAL_TYPE_DEF_FIELD, - IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, &node); - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * Initialize an object for the new Node that is on - * the object stack - */ - - status = acpi_aml_prep_bank_field_value (node, region_node, register_node, - bank_value, field_flags, access_attribute, - field_bit_position, arg->value.size); - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Keep track of bit position for the *next* field */ - - field_bit_position += arg->value.size; - break; - - } - - arg = arg->next; - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_create_index_field - * - * PARAMETERS: Op - Op containing the Field definition and args - * Region_node - Object for the containing Operation Region - * - * RETURN: Status - * - * DESCRIPTION: Create a new index field in the specified operation region - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_create_index_field ( - ACPI_PARSE_OBJECT *op, - ACPI_HANDLE region_node, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status; - ACPI_PARSE_OBJECT *arg; - ACPI_NAMESPACE_NODE *node; - ACPI_NAMESPACE_NODE *index_register_node; - ACPI_NAMESPACE_NODE *data_register_node; - u8 field_flags; - u8 access_attribute = 0; - u32 field_bit_position = 0; - - - arg = op->value.arg; - - /* First arg is the name of the Index register */ - - status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, - ACPI_TYPE_ANY, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, &index_register_node); - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Second arg is the data register */ - - arg = arg->next; - - status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, - INTERNAL_TYPE_INDEX_FIELD_DEFN, - IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, &data_register_node); - - if (ACPI_FAILURE (status)) { - return (status); - } - - - /* Next arg is the field flags */ - - arg = arg->next; - field_flags = (u8) arg->value.integer; - - - /* Each remaining arg is a Named Field */ - - arg = arg->next; - while (arg) { - switch (arg->opcode) { - case AML_RESERVEDFIELD_OP: - - field_bit_position += arg->value.size; - break; - - - case AML_ACCESSFIELD_OP: - - /* - * Get a new Access_type and Access_attribute for all - * entries (until end or another Access_as keyword) - */ - - access_attribute = (u8) arg->value.integer; - field_flags = (u8) - ((field_flags & FIELD_ACCESS_TYPE_MASK) || - ((u8) (arg->value.integer >> 8))); - break; - - - case AML_NAMEDFIELD_OP: - - status = acpi_ns_lookup (walk_state->scope_info, - (NATIVE_CHAR *) &((ACPI_PARSE2_OBJECT *)arg)->name, - INTERNAL_TYPE_INDEX_FIELD, - IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, &node); - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * Initialize an object for the new Node that is on - * the object stack - */ - - status = acpi_aml_prep_index_field_value (node, index_register_node, data_register_node, - field_flags, access_attribute, - field_bit_position, arg->value.size); - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Keep track of bit position for the *next* field */ - - field_bit_position += arg->value.size; - break; - - - default: - - status = AE_AML_ERROR; - break; - } - - arg = arg->next; - } - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/dispatcher/dsmethod.c b/reactos/drivers/bus/acpi/dispatcher/dsmethod.c deleted file mode 100644 index 70b2349ae68..00000000000 --- a/reactos/drivers/bus/acpi/dispatcher/dsmethod.c +++ /dev/null @@ -1,489 +0,0 @@ -/****************************************************************************** - * - * Module Name: dsmethod - Parser/Interpreter interface - control method parsing - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_DISPATCHER - MODULE_NAME ("dsmethod") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_parse_method - * - * PARAMETERS: Obj_handle - Node of the method - * Level - Current nesting level - * Context - Points to a method counter - * Return_value - Not used - * - * RETURN: Status - * - * DESCRIPTION: Call the parser and parse the AML that is - * associated with the method. - * - * MUTEX: Assumes parser is locked - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_parse_method ( - ACPI_HANDLE obj_handle) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_PARSE_OBJECT *op; - ACPI_NAMESPACE_NODE *node; - ACPI_OWNER_ID owner_id; - - - /* Parameter Validation */ - - if (!obj_handle) { - return (AE_NULL_ENTRY); - } - - - /* Extract the method object from the method Node */ - - node = (ACPI_NAMESPACE_NODE *) obj_handle; - obj_desc = node->object; - if (!obj_desc) { - return (AE_NULL_OBJECT); - } - - /* Create a mutex for the method if there is a concurrency limit */ - - if ((obj_desc->method.concurrency != INFINITE_CONCURRENCY) && - (!obj_desc->method.semaphore)) { - status = acpi_os_create_semaphore (obj_desc->method.concurrency, - obj_desc->method.concurrency, - &obj_desc->method.semaphore); - if (ACPI_FAILURE (status)) { - return (status); - } - } - - /* - * Allocate a new parser op to be the root of the parsed - * method tree - */ - op = acpi_ps_alloc_op (AML_METHOD_OP); - if (!op) { - return (AE_NO_MEMORY); - } - - /* Init new op with the method name and pointer back to the Node */ - - acpi_ps_set_name (op, node->name); - op->node = node; - - - /* - * Parse the method, first pass - * - * The first pass load is - * where newly declared named objects are - * added into the namespace. Actual evaluation of - * the named objects (what would be called a "second - * pass") happens during the actual execution of the - * method so that operands to the named objects can - * take on dynamic run-time values. - */ - status = acpi_ps_parse_aml (op, obj_desc->method.pcode, - obj_desc->method.pcode_length, - ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE, - node, NULL, NULL, - acpi_ds_load1_begin_op, acpi_ds_load1_end_op); - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Get a new Owner_id for objects created by this method */ - - owner_id = acpi_cm_allocate_owner_id (OWNER_TYPE_METHOD); - obj_desc->method.owning_id = owner_id; - - /* Install the parsed tree in the method object */ - /* TBD: [Restructure] Obsolete field? */ - - acpi_ps_delete_parse_tree (op); - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_begin_method_execution - * - * PARAMETERS: Method_node - Node of the method - * Obj_desc - The method object - * Calling_method_node - Caller of this method (if non-null) - * - * RETURN: Status - * - * DESCRIPTION: Prepare a method for execution. Parses the method if necessary, - * increments the thread count, and waits at the method semaphore - * for clearance to execute. - * - * MUTEX: Locks/unlocks parser. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_begin_method_execution ( - ACPI_NAMESPACE_NODE *method_node, - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_NAMESPACE_NODE *calling_method_node) -{ - ACPI_STATUS status = AE_OK; - - - if (!method_node) { - return (AE_NULL_ENTRY); - } - - - /* - * If there is a concurrency limit on this method, we need to - * obtain a unit from the method semaphore. - */ - if (obj_desc->method.semaphore) { - /* - * Allow recursive method calls, up to the reentrancy/concurrency - * limit imposed by the SERIALIZED rule and the Sync_level method - * parameter. - * - * The point of this code is to avoid permanently blocking a - * thread that is making recursive method calls. - */ - if (method_node == calling_method_node) { - if (obj_desc->method.thread_count >= obj_desc->method.concurrency) { - return (AE_AML_METHOD_LIMIT); - } - } - - /* - * Get a unit from the method semaphore. This releases the - * interpreter if we block - */ - status = acpi_aml_system_wait_semaphore (obj_desc->method.semaphore, - WAIT_FOREVER); - } - - - /* - * Increment the method parse tree thread count since it has been - * reentered one more time (even if it is the same thread) - */ - obj_desc->method.thread_count++; - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_call_control_method - * - * PARAMETERS: Walk_state - Current state of the walk - * Op - Current Op to be walked - * - * RETURN: Status - * - * DESCRIPTION: Transfer execution to a called control method - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_call_control_method ( - ACPI_WALK_LIST *walk_list, - ACPI_WALK_STATE *this_walk_state, - ACPI_PARSE_OBJECT *op) -{ - ACPI_STATUS status; - ACPI_NAMESPACE_NODE *method_node; - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_WALK_STATE *next_walk_state; - ACPI_PARSE_STATE *parser_state; - u32 i; - - - /* - * Get the namespace entry for the control method we are about to call - */ - method_node = this_walk_state->method_call_node; - if (!method_node) { - return (AE_NULL_ENTRY); - } - - obj_desc = acpi_ns_get_attached_object (method_node); - if (!obj_desc) { - return (AE_NULL_OBJECT); - } - - - /* Init for new method, wait on concurrency semaphore */ - - status = acpi_ds_begin_method_execution (method_node, obj_desc, - this_walk_state->method_node); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Create and initialize a new parser state */ - - parser_state = acpi_ps_create_state (obj_desc->method.pcode, - obj_desc->method.pcode_length); - if (!parser_state) { - return (AE_NO_MEMORY); - } - - acpi_ps_init_scope (parser_state, NULL); - parser_state->start_node = method_node; - - - /* Create a new state for the preempting walk */ - - next_walk_state = acpi_ds_create_walk_state (obj_desc->method.owning_id, - NULL, obj_desc, walk_list); - if (!next_walk_state) { - /* TBD: delete parser state */ - - return (AE_NO_MEMORY); - } - - next_walk_state->walk_type = WALK_METHOD; - next_walk_state->method_node = method_node; - next_walk_state->parser_state = parser_state; - next_walk_state->parse_flags = this_walk_state->parse_flags; - next_walk_state->descending_callback = this_walk_state->descending_callback; - next_walk_state->ascending_callback = this_walk_state->ascending_callback; - - /* The Next_op of the Next_walk will be the beginning of the method */ - /* TBD: [Restructure] -- obsolete? */ - - next_walk_state->next_op = NULL; - - /* Open a new scope */ - - status = acpi_ds_scope_stack_push (method_node, - ACPI_TYPE_METHOD, next_walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - - /* - * Initialize the arguments for the method. The resolved - * arguments were put on the previous walk state's operand - * stack. Operands on the previous walk state stack always - * start at index 0. - */ - status = acpi_ds_method_data_init_args (&this_walk_state->operands[0], - this_walk_state->num_operands, - next_walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - - /* Create and init a Root Node */ - - op = acpi_ps_alloc_op (AML_SCOPE_OP); - if (!op) { - return (AE_NO_MEMORY); - } - - status = acpi_ps_parse_aml (op, obj_desc->method.pcode, - obj_desc->method.pcode_length, - ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE, - method_node, NULL, NULL, - acpi_ds_load1_begin_op, acpi_ds_load1_end_op); - acpi_ps_delete_parse_tree (op); - - - /* - * Delete the operands on the previous walkstate operand stack - * (they were copied to new objects) - */ - for (i = 0; i < obj_desc->method.param_count; i++) { - acpi_cm_remove_reference (this_walk_state->operands [i]); - this_walk_state->operands [i] = NULL; - } - - /* Clear the operand stack */ - - this_walk_state->num_operands = 0; - - - return (AE_OK); - - - /* On error, we must delete the new walk state */ - -cleanup: - acpi_ds_terminate_control_method (next_walk_state); - acpi_ds_delete_walk_state (next_walk_state); - return (status); - -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_restart_control_method - * - * PARAMETERS: Walk_state - State of the method when it was preempted - * Op - Pointer to new current op - * - * RETURN: Status - * - * DESCRIPTION: Restart a method that was preempted - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_restart_control_method ( - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT *return_desc) -{ - ACPI_STATUS status; - - - if (return_desc) { - if (walk_state->return_used) { - /* - * Get the return value (if any) from the previous method. - * NULL if no return value - */ - status = acpi_ds_result_push (return_desc, walk_state); - if (ACPI_FAILURE (status)) { - acpi_cm_remove_reference (return_desc); - return (status); - } - } - - else { - /* - * Delete the return value if it will not be used by the - * calling method - */ - acpi_cm_remove_reference (return_desc); - } - - } - - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_terminate_control_method - * - * PARAMETERS: Walk_state - State of the method - * - * RETURN: Status - * - * DESCRIPTION: Terminate a control method. Delete everything that the method - * created, delete all locals and arguments, and delete the parse - * tree if requested. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_terminate_control_method ( - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_NAMESPACE_NODE *method_node; - - - /* The method object should be stored in the walk state */ - - obj_desc = walk_state->method_desc; - if (!obj_desc) { - return (AE_OK); - } - - /* Delete all arguments and locals */ - - acpi_ds_method_data_delete_all (walk_state); - - /* - * Lock the parser while we terminate this method. - * If this is the last thread executing the method, - * we have additional cleanup to perform - */ - acpi_cm_acquire_mutex (ACPI_MTX_PARSER); - - - /* Signal completion of the execution of this method if necessary */ - - if (walk_state->method_desc->method.semaphore) { - status = acpi_os_signal_semaphore ( - walk_state->method_desc->method.semaphore, 1); - } - - /* Decrement the thread count on the method parse tree */ - - walk_state->method_desc->method.thread_count--; - if (!walk_state->method_desc->method.thread_count) { - /* - * There are no more threads executing this method. Perform - * additional cleanup. - * - * The method Node is stored in the walk state - */ - method_node = walk_state->method_node; - - /* - * Delete any namespace entries created immediately underneath - * the method - */ - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - if (method_node->child) { - acpi_ns_delete_namespace_subtree (method_node); - } - - /* - * Delete any namespace entries created anywhere else within - * the namespace - */ - acpi_ns_delete_namespace_by_owner (walk_state->method_desc->method.owning_id); - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - } - - acpi_cm_release_mutex (ACPI_MTX_PARSER); - return (AE_OK); -} - - diff --git a/reactos/drivers/bus/acpi/dispatcher/dsmthdat.c b/reactos/drivers/bus/acpi/dispatcher/dsmthdat.c deleted file mode 100644 index f51304017c5..00000000000 --- a/reactos/drivers/bus/acpi/dispatcher/dsmthdat.c +++ /dev/null @@ -1,687 +0,0 @@ -/******************************************************************************* - * - * Module Name: dsmthdat - control method arguments and local variables - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_DISPATCHER - MODULE_NAME ("dsmthdat") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_method_data_init - * - * PARAMETERS: Walk_state - Current walk state object - * - * RETURN: Status - * - * DESCRIPTION: Initialize the data structures that hold the method's arguments - * and locals. The data struct is an array of NTEs for each. - * This allows Ref_of and De_ref_of to work properly for these - * special data types. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_method_data_init ( - ACPI_WALK_STATE *walk_state) -{ - u32 i; - - - /* - * Walk_state fields are initialized to zero by the - * Acpi_cm_callocate(). - * - * An Node is assigned to each argument and local so - * that Ref_of() can return a pointer to the Node. - */ - - /* Init the method arguments */ - - for (i = 0; i < MTH_NUM_ARGS; i++) { - MOVE_UNALIGNED32_TO_32 (&walk_state->arguments[i].name, - NAMEOF_ARG_NTE); - walk_state->arguments[i].name |= (i << 24); - walk_state->arguments[i].data_type = ACPI_DESC_TYPE_NAMED; - walk_state->arguments[i].type = ACPI_TYPE_ANY; - walk_state->arguments[i].flags = ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_ARG; - } - - /* Init the method locals */ - - for (i = 0; i < MTH_NUM_LOCALS; i++) { - MOVE_UNALIGNED32_TO_32 (&walk_state->local_variables[i].name, - NAMEOF_LOCAL_NTE); - - walk_state->local_variables[i].name |= (i << 24); - walk_state->local_variables[i].data_type = ACPI_DESC_TYPE_NAMED; - walk_state->local_variables[i].type = ACPI_TYPE_ANY; - walk_state->local_variables[i].flags = ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_LOCAL; - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_method_data_delete_all - * - * PARAMETERS: Walk_state - Current walk state object - * - * RETURN: Status - * - * DESCRIPTION: Delete method locals and arguments. Arguments are only - * deleted if this method was called from another method. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_method_data_delete_all ( - ACPI_WALK_STATE *walk_state) -{ - u32 index; - ACPI_OPERAND_OBJECT *object; - - - /* Delete the locals */ - - for (index = 0; index < MTH_NUM_LOCALS; index++) { - object = walk_state->local_variables[index].object; - if (object) { - /* Remove first */ - - walk_state->local_variables[index].object = NULL; - - /* Was given a ref when stored */ - - acpi_cm_remove_reference (object); - } - } - - - /* Delete the arguments */ - - for (index = 0; index < MTH_NUM_ARGS; index++) { - object = walk_state->arguments[index].object; - if (object) { - /* Remove first */ - - walk_state->arguments[index].object = NULL; - - /* Was given a ref when stored */ - - acpi_cm_remove_reference (object); - } - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_method_data_init_args - * - * PARAMETERS: *Params - Pointer to a parameter list for the method - * Max_param_count - The arg count for this method - * Walk_state - Current walk state object - * - * RETURN: Status - * - * DESCRIPTION: Initialize arguments for a method - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_method_data_init_args ( - ACPI_OPERAND_OBJECT **params, - u32 max_param_count, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status; - u32 mindex; - u32 pindex; - - - if (!params) { - return (AE_OK); - } - - /* Copy passed parameters into the new method stack frame */ - - for (pindex = mindex = 0; - (mindex < MTH_NUM_ARGS) && (pindex < max_param_count); - mindex++) { - if (params[pindex]) { - /* - * A valid parameter. - * Set the current method argument to the - * Params[Pindex++] argument object descriptor - */ - status = acpi_ds_store_object_to_local (AML_ARG_OP, mindex, - params[pindex], walk_state); - if (ACPI_FAILURE (status)) { - break; - } - - pindex++; - } - - else { - break; - } - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_method_data_get_entry - * - * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP - * Index - Which local_var or argument to get - * Entry - Pointer to where a pointer to the stack - * entry is returned. - * Walk_state - Current walk state object - * - * RETURN: Status - * - * DESCRIPTION: Get the address of the object entry given by Opcode:Index - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_method_data_get_entry ( - u16 opcode, - u32 index, - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT ***entry) -{ - - - /* - * Get the requested object. - * The stack "Opcode" is either a Local_variable or an Argument - */ - - switch (opcode) { - - case AML_LOCAL_OP: - - if (index > MTH_MAX_LOCAL) { - return (AE_BAD_PARAMETER); - } - - *entry = (ACPI_OPERAND_OBJECT **) - &walk_state->local_variables[index].object; - break; - - - case AML_ARG_OP: - - if (index > MTH_MAX_ARG) { - return (AE_BAD_PARAMETER); - } - - *entry = (ACPI_OPERAND_OBJECT **) - &walk_state->arguments[index].object; - break; - - - default: - return (AE_BAD_PARAMETER); - } - - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_method_data_set_entry - * - * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP - * Index - Which local_var or argument to get - * Object - Object to be inserted into the stack entry - * Walk_state - Current walk state object - * - * RETURN: Status - * - * DESCRIPTION: Insert an object onto the method stack at entry Opcode:Index. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_method_data_set_entry ( - u16 opcode, - u32 index, - ACPI_OPERAND_OBJECT *object, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT **entry; - - - /* Get a pointer to the stack entry to set */ - - status = acpi_ds_method_data_get_entry (opcode, index, walk_state, &entry); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Increment ref count so object can't be deleted while installed */ - - acpi_cm_add_reference (object); - - /* Install the object into the stack entry */ - - *entry = object; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_method_data_get_type - * - * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP - * Index - Which local_var or argument whose type - * to get - * Walk_state - Current walk state object - * - * RETURN: Data type of selected Arg or Local - * Used only in Exec_monadic2()/Type_op. - * - ******************************************************************************/ - -OBJECT_TYPE_INTERNAL -acpi_ds_method_data_get_type ( - u16 opcode, - u32 index, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT **entry; - ACPI_OPERAND_OBJECT *object; - - - /* Get a pointer to the requested stack entry */ - - status = acpi_ds_method_data_get_entry (opcode, index, walk_state, &entry); - if (ACPI_FAILURE (status)) { - return ((ACPI_TYPE_NOT_FOUND)); - } - - /* Get the object from the method stack */ - - object = *entry; - - /* Get the object type */ - - if (!object) { - /* Any == 0 => "uninitialized" -- see spec 15.2.3.5.2.28 */ - return (ACPI_TYPE_ANY); - } - - return (object->common.type); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_method_data_get_node - * - * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP - * Index - Which local_var or argument whose type - * to get - * Walk_state - Current walk state object - * - * RETURN: Get the Node associated with a local or arg. - * - ******************************************************************************/ - -ACPI_NAMESPACE_NODE * -acpi_ds_method_data_get_node ( - u16 opcode, - u32 index, - ACPI_WALK_STATE *walk_state) -{ - ACPI_NAMESPACE_NODE *node = NULL; - - - switch (opcode) { - - case AML_LOCAL_OP: - - if (index > MTH_MAX_LOCAL) { - return (node); - } - - node = &walk_state->local_variables[index]; - break; - - - case AML_ARG_OP: - - if (index > MTH_MAX_ARG) { - return (node); - } - - node = &walk_state->arguments[index]; - break; - - - default: - break; - } - - - return (node); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_method_data_get_value - * - * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP - * Index - Which local_var or argument to get - * Walk_state - Current walk state object - * *Dest_desc - Ptr to Descriptor into which selected Arg - * or Local value should be copied - * - * RETURN: Status - * - * DESCRIPTION: Retrieve value of selected Arg or Local from the method frame - * at the current top of the method stack. - * Used only in Acpi_aml_resolve_to_value(). - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_method_data_get_value ( - u16 opcode, - u32 index, - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **dest_desc) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT **entry; - ACPI_OPERAND_OBJECT *object; - - - /* Validate the object descriptor */ - - if (!dest_desc) { - return (AE_BAD_PARAMETER); - } - - - /* Get a pointer to the requested method stack entry */ - - status = acpi_ds_method_data_get_entry (opcode, index, walk_state, &entry); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Get the object from the method stack */ - - object = *entry; - - - /* Examine the returned object, it must be valid. */ - - if (!object) { - /* - * Index points to uninitialized object stack value. - * This means that either 1) The expected argument was - * not passed to the method, or 2) A local variable - * was referenced by the method (via the ASL) - * before it was initialized. Either case is an error. - */ - - switch (opcode) { - case AML_ARG_OP: - - return (AE_AML_UNINITIALIZED_ARG); - break; - - case AML_LOCAL_OP: - - return (AE_AML_UNINITIALIZED_LOCAL); - break; - } - } - - - /* - * Index points to initialized and valid object stack value. - * Return an additional reference to the object - */ - - *dest_desc = object; - acpi_cm_add_reference (object); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_method_data_delete_value - * - * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP - * Index - Which local_var or argument to delete - * Walk_state - Current walk state object - * - * RETURN: Status - * - * DESCRIPTION: Delete the entry at Opcode:Index on the method stack. Inserts - * a null into the stack slot after the object is deleted. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_method_data_delete_value ( - u16 opcode, - u32 index, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT **entry; - ACPI_OPERAND_OBJECT *object; - - - /* Get a pointer to the requested entry */ - - status = acpi_ds_method_data_get_entry (opcode, index, walk_state, &entry); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Get the current entry in this slot k */ - - object = *entry; - - /* - * Undefine the Arg or Local by setting its descriptor - * pointer to NULL. Locals/Args can contain both - * ACPI_OPERAND_OBJECTS and ACPI_NAMESPACE_NODEs - */ - *entry = NULL; - - - if ((object) && - (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_INTERNAL))) { - /* - * There is a valid object in this slot - * Decrement the reference count by one to balance the - * increment when the object was stored in the slot. - */ - acpi_cm_remove_reference (object); - } - - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_store_object_to_local - * - * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP - * Index - Which local_var or argument to set - * Src_desc - Value to be stored - * Walk_state - Current walk state - * - * RETURN: Status - * - * DESCRIPTION: Store a value in an Arg or Local. The Src_desc is installed - * as the new value for the Arg or Local and the reference count - * for Src_desc is incremented. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_store_object_to_local ( - u16 opcode, - u32 index, - ACPI_OPERAND_OBJECT *src_desc, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT **entry; - - - /* Parameter validation */ - - if (!src_desc) { - return (AE_BAD_PARAMETER); - } - - - /* Get a pointer to the requested method stack entry */ - - status = acpi_ds_method_data_get_entry (opcode, index, walk_state, &entry); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - if (*entry == src_desc) { - goto cleanup; - } - - - /* - * If there is an object already in this slot, we either - * have to delete it, or if this is an argument and there - * is an object reference stored there, we have to do - * an indirect store! - */ - - if (*entry) { - /* - * Check for an indirect store if an argument - * contains an object reference (stored as an Node). - * We don't allow this automatic dereferencing for - * locals, since a store to a local should overwrite - * anything there, including an object reference. - * - * If both Arg0 and Local0 contain Ref_of (Local4): - * - * Store (1, Arg0) - Causes indirect store to local4 - * Store (1, Local0) - Stores 1 in local0, overwriting - * the reference to local4 - * Store (1, De_refof (Local0)) - Causes indirect store to local4 - * - * Weird, but true. - */ - - if ((opcode == AML_ARG_OP) && - (VALID_DESCRIPTOR_TYPE (*entry, ACPI_DESC_TYPE_NAMED))) { - /* Detach an existing object from the Node */ - - acpi_ns_detach_object ((ACPI_NAMESPACE_NODE *) *entry); - - /* - * Store this object into the Node - * (do the indirect store) - */ - status = acpi_ns_attach_object ((ACPI_NAMESPACE_NODE *) *entry, src_desc, - src_desc->common.type); - return (status); - } - - -#ifdef ACPI_ENABLE_IMPLICIT_CONVERSION - /* - * Perform "Implicit conversion" of the new object to the type of the - * existing object - */ - status = acpi_aml_convert_to_target_type ((*entry)->common.type, &src_desc, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } -#endif - - /* - * Delete the existing object - * before storing the new one - */ - acpi_ds_method_data_delete_value (opcode, index, walk_state); - } - - - /* - * Install the Obj_stack descriptor (*Src_desc) into - * the descriptor for the Arg or Local. - * Install the new object in the stack entry - * (increments the object reference count by one) - */ - status = acpi_ds_method_data_set_entry (opcode, index, src_desc, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - /* Normal exit */ - - return (AE_OK); - - - /* Error exit */ - -cleanup: - - return (status); -} - diff --git a/reactos/drivers/bus/acpi/dispatcher/dsobject.c b/reactos/drivers/bus/acpi/dispatcher/dsobject.c deleted file mode 100644 index 29f18fa9fb9..00000000000 --- a/reactos/drivers/bus/acpi/dispatcher/dsobject.c +++ /dev/null @@ -1,636 +0,0 @@ -/****************************************************************************** - * - * Module Name: dsobject - Dispatcher object management routines - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_DISPATCHER - MODULE_NAME ("dsobject") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_init_one_object - * - * PARAMETERS: Obj_handle - Node - * Level - Current nesting level - * Context - Points to a init info struct - * Return_value - Not used - * - * RETURN: Status - * - * DESCRIPTION: Callback from Acpi_walk_namespace. Invoked for every object - * within the namespace. - * - * Currently, the only objects that require initialization are: - * 1) Methods - * 2) Op Regions - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_init_one_object ( - ACPI_HANDLE obj_handle, - u32 level, - void *context, - void **return_value) -{ - OBJECT_TYPE_INTERNAL type; - ACPI_STATUS status; - ACPI_INIT_WALK_INFO *info = (ACPI_INIT_WALK_INFO *) context; - u8 table_revision; - - - info->object_count++; - table_revision = info->table_desc->pointer->revision; - - /* - * We are only interested in objects owned by the table that - * was just loaded - */ - - if (((ACPI_NAMESPACE_NODE *) obj_handle)->owner_id != - info->table_desc->table_id) { - return (AE_OK); - } - - - /* And even then, we are only interested in a few object types */ - - type = acpi_ns_get_type (obj_handle); - - switch (type) { - - case ACPI_TYPE_REGION: - - acpi_ds_initialize_region (obj_handle); - - info->op_region_count++; - break; - - - case ACPI_TYPE_METHOD: - - info->method_count++; - - - /* - * Set the execution data width (32 or 64) based upon the - * revision number of the parent ACPI table. - */ - - if (table_revision == 1) { - ((ACPI_NAMESPACE_NODE *)obj_handle)->flags |= ANOBJ_DATA_WIDTH_32; - } - - /* - * Always parse methods to detect errors, we may delete - * the parse tree below - */ - - status = acpi_ds_parse_method (obj_handle); - - /* TBD: [Errors] what do we do with an error? */ - - if (ACPI_FAILURE (status)) { - break; - } - - /* - * Delete the parse tree. We simple re-parse the method - * for every execution since there isn't much overhead - */ - acpi_ns_delete_namespace_subtree (obj_handle); - break; - - default: - break; - } - - /* - * We ignore errors from above, and always return OK, since - * we don't want to abort the walk on a single error. - */ - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_initialize_objects - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Walk the entire namespace and perform any necessary - * initialization on the objects found therein - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_initialize_objects ( - ACPI_TABLE_DESC *table_desc, - ACPI_NAMESPACE_NODE *start_node) -{ - ACPI_STATUS status; - ACPI_INIT_WALK_INFO info; - - - info.method_count = 0; - info.op_region_count = 0; - info.object_count = 0; - info.table_desc = table_desc; - - - /* Walk entire namespace from the supplied root */ - - status = acpi_walk_namespace (ACPI_TYPE_ANY, start_node, - ACPI_UINT32_MAX, acpi_ds_init_one_object, - &info, NULL); - - return (AE_OK); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ds_init_object_from_op - * - * PARAMETERS: Op - Parser op used to init the internal object - * Opcode - AML opcode associated with the object - * Obj_desc - Namespace object to be initialized - * - * RETURN: Status - * - * DESCRIPTION: Initialize a namespace object from a parser Op and its - * associated arguments. The namespace object is a more compact - * representation of the Op and its arguments. - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ds_init_object_from_op ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op, - u16 opcode, - ACPI_OPERAND_OBJECT **obj_desc) -{ - ACPI_STATUS status; - ACPI_PARSE_OBJECT *arg; - ACPI_PARSE2_OBJECT *byte_list; - ACPI_OPERAND_OBJECT *arg_desc; - ACPI_OPCODE_INFO *op_info; - - - op_info = acpi_ps_get_opcode_info (opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { - /* Unknown opcode */ - - return (AE_TYPE); - } - - - /* Get and prepare the first argument */ - - switch ((*obj_desc)->common.type) { - case ACPI_TYPE_BUFFER: - - /* First arg is a number */ - - acpi_ds_create_operand (walk_state, op->value.arg, 0); - arg_desc = walk_state->operands [walk_state->num_operands - 1]; - acpi_ds_obj_stack_pop (1, walk_state); - - /* Resolve the object (could be an arg or local) */ - - status = acpi_aml_resolve_to_value (&arg_desc, walk_state); - if (ACPI_FAILURE (status)) { - acpi_cm_remove_reference (arg_desc); - return (status); - } - - /* We are expecting a number */ - - if (arg_desc->common.type != ACPI_TYPE_INTEGER) { - acpi_cm_remove_reference (arg_desc); - return (AE_TYPE); - } - - /* Get the value, delete the internal object */ - - (*obj_desc)->buffer.length = (u32) arg_desc->integer.value; - acpi_cm_remove_reference (arg_desc); - - /* Allocate the buffer */ - - if ((*obj_desc)->buffer.length == 0) { - (*obj_desc)->buffer.pointer = NULL; - REPORT_WARNING (("Buffer created with zero length in AML\n")); - break; - } - - else { - (*obj_desc)->buffer.pointer = - acpi_cm_callocate ((*obj_desc)->buffer.length); - - if (!(*obj_desc)->buffer.pointer) { - return (AE_NO_MEMORY); - } - } - - /* - * Second arg is the buffer data (optional) - * Byte_list can be either individual bytes or a - * string initializer! - */ - - /* skip first arg */ - arg = op->value.arg; - byte_list = (ACPI_PARSE2_OBJECT *) arg->next; - if (byte_list) { - if (byte_list->opcode != AML_BYTELIST_OP) { - return (AE_TYPE); - } - - MEMCPY ((*obj_desc)->buffer.pointer, byte_list->data, - (*obj_desc)->buffer.length); - } - - break; - - - case ACPI_TYPE_PACKAGE: - - /* - * When called, an internal package object has already - * been built and is pointed to by *Obj_desc. - * Acpi_ds_build_internal_object build another internal - * package object, so remove reference to the original - * so that it is deleted. Error checking is done - * within the remove reference function. - */ - acpi_cm_remove_reference(*obj_desc); - - status = acpi_ds_build_internal_object (walk_state, op, obj_desc); - break; - - case ACPI_TYPE_INTEGER: - (*obj_desc)->integer.value = op->value.integer; - break; - - - case ACPI_TYPE_STRING: - (*obj_desc)->string.pointer = op->value.string; - (*obj_desc)->string.length = STRLEN (op->value.string); - break; - - - case ACPI_TYPE_METHOD: - break; - - - case INTERNAL_TYPE_REFERENCE: - - switch (ACPI_GET_OP_CLASS (op_info)) { - case OPTYPE_LOCAL_VARIABLE: - - /* Split the opcode into a base opcode + offset */ - - (*obj_desc)->reference.opcode = AML_LOCAL_OP; - (*obj_desc)->reference.offset = opcode - AML_LOCAL_OP; - break; - - case OPTYPE_METHOD_ARGUMENT: - - /* Split the opcode into a base opcode + offset */ - - (*obj_desc)->reference.opcode = AML_ARG_OP; - (*obj_desc)->reference.offset = opcode - AML_ARG_OP; - break; - - default: /* Constants, Literals, etc.. */ - - if (op->opcode == AML_NAMEPATH_OP) { - /* Node was saved in Op */ - - (*obj_desc)->reference.node = op->node; - } - - (*obj_desc)->reference.opcode = opcode; - break; - } - - break; - - - default: - - break; - } - - return (AE_OK); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ds_build_internal_simple_obj - * - * PARAMETERS: Op - Parser object to be translated - * Obj_desc_ptr - Where the ACPI internal object is returned - * - * RETURN: Status - * - * DESCRIPTION: Translate a parser Op object to the equivalent namespace object - * Simple objects are any objects other than a package object! - * - ****************************************************************************/ - -static ACPI_STATUS -acpi_ds_build_internal_simple_obj ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op, - ACPI_OPERAND_OBJECT **obj_desc_ptr) -{ - ACPI_OPERAND_OBJECT *obj_desc; - OBJECT_TYPE_INTERNAL type; - ACPI_STATUS status; - u32 length; - char *name; - - - if (op->opcode == AML_NAMEPATH_OP) { - /* - * This is an object reference. If The name was - * previously looked up in the NS, it is stored in this op. - * Otherwise, go ahead and look it up now - */ - - if (!op->node) { - status = acpi_ns_lookup (walk_state->scope_info, - op->value.string, ACPI_TYPE_ANY, - IMODE_EXECUTE, - NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE, - NULL, - (ACPI_NAMESPACE_NODE **)&(op->node)); - - if (ACPI_FAILURE (status)) { - if (status == AE_NOT_FOUND) { - name = NULL; - acpi_ns_externalize_name (ACPI_UINT32_MAX, op->value.string, &length, &name); - - if (name) { - REPORT_WARNING (("Reference %s at AML %X not found\n", - name, op->aml_offset)); - acpi_cm_free (name); - } - else { - REPORT_WARNING (("Reference %s at AML %X not found\n", - op->value.string, op->aml_offset)); - } - *obj_desc_ptr = NULL; - } - - else { - return (status); - } - } - } - - /* - * The reference will be a Reference - * TBD: [Restructure] unless we really need a separate - * type of INTERNAL_TYPE_REFERENCE change - * Acpi_ds_map_opcode_to_data_type to handle this case - */ - type = INTERNAL_TYPE_REFERENCE; - } - else { - type = acpi_ds_map_opcode_to_data_type (op->opcode, NULL); - } - - - /* Create and init the internal ACPI object */ - - obj_desc = acpi_cm_create_internal_object (type); - if (!obj_desc) { - return (AE_NO_MEMORY); - } - - status = acpi_ds_init_object_from_op (walk_state, op, - op->opcode, &obj_desc); - - if (ACPI_FAILURE (status)) { - acpi_cm_remove_reference (obj_desc); - return (status); - } - - *obj_desc_ptr = obj_desc; - - return (AE_OK); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ds_build_internal_package_obj - * - * PARAMETERS: Op - Parser object to be translated - * Obj_desc_ptr - Where the ACPI internal object is returned - * - * RETURN: Status - * - * DESCRIPTION: Translate a parser Op package object to the equivalent - * namespace object - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ds_build_internal_package_obj ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op, - ACPI_OPERAND_OBJECT **obj_desc_ptr) -{ - ACPI_PARSE_OBJECT *arg; - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_STATUS status = AE_OK; - - - obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_PACKAGE); - if (!obj_desc) { - return (AE_NO_MEMORY); - } - - /* The first argument must be the package length */ - - arg = op->value.arg; - obj_desc->package.count = arg->value.integer; - - /* - * Allocate the array of pointers (ptrs to the - * individual objects) Add an extra pointer slot so - * that the list is always null terminated. - */ - - obj_desc->package.elements = - acpi_cm_callocate ((obj_desc->package.count + 1) * - sizeof (void *)); - - if (!obj_desc->package.elements) { - /* Package vector allocation failure */ - - REPORT_ERROR (("Ds_build_internal_package_obj: Package vector allocation failure\n")); - - acpi_cm_delete_object_desc (obj_desc); - return (AE_NO_MEMORY); - } - - obj_desc->package.next_element = obj_desc->package.elements; - - /* - * Now init the elements of the package - */ - - arg = arg->next; - while (arg) { - if (arg->opcode == AML_PACKAGE_OP) { - status = acpi_ds_build_internal_package_obj (walk_state, arg, - obj_desc->package.next_element); - } - - else { - status = acpi_ds_build_internal_simple_obj (walk_state, arg, - obj_desc->package.next_element); - } - - obj_desc->package.next_element++; - arg = arg->next; - } - - *obj_desc_ptr = obj_desc; - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ds_build_internal_object - * - * PARAMETERS: Op - Parser object to be translated - * Obj_desc_ptr - Where the ACPI internal object is returned - * - * RETURN: Status - * - * DESCRIPTION: Translate a parser Op object to the equivalent namespace - * object - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ds_build_internal_object ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op, - ACPI_OPERAND_OBJECT **obj_desc_ptr) -{ - ACPI_STATUS status; - - - if (op->opcode == AML_PACKAGE_OP) { - status = acpi_ds_build_internal_package_obj (walk_state, op, - obj_desc_ptr); - } - - else { - status = acpi_ds_build_internal_simple_obj (walk_state, op, - obj_desc_ptr); - } - - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ds_create_node - * - * PARAMETERS: Op - Parser object to be translated - * Obj_desc_ptr - Where the ACPI internal object is returned - * - * RETURN: Status - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ds_create_node ( - ACPI_WALK_STATE *walk_state, - ACPI_NAMESPACE_NODE *node, - ACPI_PARSE_OBJECT *op) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT *obj_desc; - - - if (!op->value.arg) { - /* No arguments, there is nothing to do */ - - return (AE_OK); - } - - - /* Build an internal object for the argument(s) */ - - status = acpi_ds_build_internal_object (walk_state, - op->value.arg, &obj_desc); - if (ACPI_FAILURE (status)) { - return (status); - } - - - /* Re-type the object according to it's argument */ - - node->type = obj_desc->common.type; - - /* Init obj */ - - status = acpi_ns_attach_object ((ACPI_HANDLE) node, obj_desc, - (u8) node->type); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - return (status); - - -cleanup: - - acpi_cm_remove_reference (obj_desc); - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/dispatcher/dsopcode.c b/reactos/drivers/bus/acpi/dispatcher/dsopcode.c deleted file mode 100644 index 4a68ef8ac47..00000000000 --- a/reactos/drivers/bus/acpi/dispatcher/dsopcode.c +++ /dev/null @@ -1,868 +0,0 @@ -/****************************************************************************** - * - * Module Name: dsopcode - Dispatcher Op Region support and handling of - * "control" opcodes - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_DISPATCHER - MODULE_NAME ("dsopcode") - - -/***************************************************************************** - * - * FUNCTION: Acpi_ds_get_field_unit_arguments - * - * PARAMETERS: Obj_desc - A valid Field_unit object - * - * RETURN: Status. - * - * DESCRIPTION: Get Field_unit Buffer and Index. This implements the late - * evaluation of these field attributes. - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ds_get_field_unit_arguments ( - ACPI_OPERAND_OBJECT *obj_desc) -{ - ACPI_OPERAND_OBJECT *extra_desc; - ACPI_NAMESPACE_NODE *node; - ACPI_PARSE_OBJECT *op; - ACPI_PARSE_OBJECT *field_op; - ACPI_STATUS status; - ACPI_TABLE_DESC *table_desc; - - - if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { - return (AE_OK); - } - - - /* Get the AML pointer (method object) and Field_unit node */ - - extra_desc = obj_desc->field_unit.extra; - node = obj_desc->field_unit.node; - - /* - * Allocate a new parser op to be the root of the parsed - * Op_region tree - */ - - op = acpi_ps_alloc_op (AML_SCOPE_OP); - if (!op) { - return (AE_NO_MEMORY); - } - - /* Save the Node for use in Acpi_ps_parse_aml */ - - op->node = acpi_ns_get_parent_object (node); - - /* Get a handle to the parent ACPI table */ - - status = acpi_tb_handle_to_object (node->owner_id, &table_desc); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Pass1: Parse the entire Field_unit declaration */ - - status = acpi_ps_parse_aml (op, extra_desc->extra.pcode, - extra_desc->extra.pcode_length, 0, - NULL, NULL, NULL, acpi_ds_load1_begin_op, acpi_ds_load1_end_op); - if (ACPI_FAILURE (status)) { - acpi_ps_delete_parse_tree (op); - return (status); - } - - - /* Get and init the actual Fiel_unit_op created above */ - - field_op = op->value.arg; - op->node = node; - - - field_op = op->value.arg; - field_op->node = node; - acpi_ps_delete_parse_tree (op); - - /* Acpi_evaluate the address and length arguments for the Op_region */ - - op = acpi_ps_alloc_op (AML_SCOPE_OP); - if (!op) { - return (AE_NO_MEMORY); - } - - op->node = acpi_ns_get_parent_object (node); - - status = acpi_ps_parse_aml (op, extra_desc->extra.pcode, - extra_desc->extra.pcode_length, - ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE, - NULL /*Method_desc*/, NULL, NULL, - acpi_ds_exec_begin_op, acpi_ds_exec_end_op); - /* All done with the parse tree, delete it */ - - acpi_ps_delete_parse_tree (op); - - - /* - * The pseudo-method object is no longer needed since the region is - * now initialized - */ - acpi_cm_remove_reference (obj_desc->field_unit.extra); - obj_desc->field_unit.extra = NULL; - - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ds_get_region_arguments - * - * PARAMETERS: Obj_desc - A valid region object - * - * RETURN: Status. - * - * DESCRIPTION: Get region address and length. This implements the late - * evaluation of these region attributes. - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ds_get_region_arguments ( - ACPI_OPERAND_OBJECT *obj_desc) -{ - ACPI_OPERAND_OBJECT *extra_desc = NULL; - ACPI_NAMESPACE_NODE *node; - ACPI_PARSE_OBJECT *op; - ACPI_PARSE_OBJECT *region_op; - ACPI_STATUS status; - ACPI_TABLE_DESC *table_desc; - - - if (obj_desc->region.flags & AOPOBJ_DATA_VALID) { - return (AE_OK); - } - - - /* Get the AML pointer (method object) and region node */ - - extra_desc = obj_desc->region.extra; - node = obj_desc->region.node; - - /* - * Allocate a new parser op to be the root of the parsed - * Op_region tree - */ - - op = acpi_ps_alloc_op (AML_SCOPE_OP); - if (!op) { - return (AE_NO_MEMORY); - } - - /* Save the Node for use in Acpi_ps_parse_aml */ - - op->node = acpi_ns_get_parent_object (node); - - /* Get a handle to the parent ACPI table */ - - status = acpi_tb_handle_to_object (node->owner_id, &table_desc); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Parse the entire Op_region declaration, creating a parse tree */ - - status = acpi_ps_parse_aml (op, extra_desc->extra.pcode, - extra_desc->extra.pcode_length, 0, - NULL, NULL, NULL, acpi_ds_load1_begin_op, acpi_ds_load1_end_op); - - if (ACPI_FAILURE (status)) { - acpi_ps_delete_parse_tree (op); - return (status); - } - - - /* Get and init the actual Region_op created above */ - - region_op = op->value.arg; - op->node = node; - - - region_op = op->value.arg; - region_op->node = node; - acpi_ps_delete_parse_tree (op); - - /* Acpi_evaluate the address and length arguments for the Op_region */ - - op = acpi_ps_alloc_op (AML_SCOPE_OP); - if (!op) { - return (AE_NO_MEMORY); - } - - op->node = acpi_ns_get_parent_object (node); - - status = acpi_ps_parse_aml (op, extra_desc->extra.pcode, - extra_desc->extra.pcode_length, - ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE, - NULL /*Method_desc*/, NULL, NULL, - acpi_ds_exec_begin_op, acpi_ds_exec_end_op); - - /* All done with the parse tree, delete it */ - - acpi_ps_delete_parse_tree (op); - - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ds_initialize_region - * - * PARAMETERS: Op - A valid region Op object - * - * RETURN: Status - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ds_initialize_region ( - ACPI_HANDLE obj_handle) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_STATUS status; - - - obj_desc = acpi_ns_get_attached_object (obj_handle); - - /* Namespace is NOT locked */ - - status = acpi_ev_initialize_region (obj_desc, FALSE); - - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ds_eval_field_unit_operands - * - * PARAMETERS: Op - A valid Field_unit Op object - * - * RETURN: Status - * - * DESCRIPTION: Get Field_unit Buffer and Index - * Called from Acpi_ds_exec_end_op during Field_unit parse tree walk - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ds_eval_field_unit_operands ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT *field_desc; - ACPI_NAMESPACE_NODE *node; - ACPI_PARSE_OBJECT *next_op; - u32 offset; - u32 bit_offset; - u16 bit_count; - - - ACPI_OPERAND_OBJECT *res_desc = NULL; - ACPI_OPERAND_OBJECT *cnt_desc = NULL; - ACPI_OPERAND_OBJECT *off_desc = NULL; - ACPI_OPERAND_OBJECT *src_desc = NULL; - u32 num_operands = 3; - - - /* - * This is where we evaluate the address and length fields of the Op_field_unit declaration - */ - - node = op->node; - - /* Next_op points to the op that holds the Buffer */ - next_op = op->value.arg; - - /* Acpi_evaluate/create the address and length operands */ - - status = acpi_ds_create_operands (walk_state, next_op); - if (ACPI_FAILURE (status)) { - return (status); - } - - field_desc = acpi_ns_get_attached_object (node); - if (!field_desc) { - return (AE_NOT_EXIST); - } - - - /* Resolve the operands */ - - status = acpi_aml_resolve_operands (op->opcode, WALK_OPERANDS, walk_state); - - /* Get the operands */ - - status |= acpi_ds_obj_stack_pop_object (&res_desc, walk_state); - if (AML_CREATE_FIELD_OP == op->opcode) { - num_operands = 4; - status |= acpi_ds_obj_stack_pop_object (&cnt_desc, walk_state); - } - - status |= acpi_ds_obj_stack_pop_object (&off_desc, walk_state); - status |= acpi_ds_obj_stack_pop_object (&src_desc, walk_state); - - if (ACPI_FAILURE (status)) { - /* Invalid parameters on object stack */ - - goto cleanup; - } - - - offset = (u32) off_desc->integer.value; - - - /* - * If Res_desc is a Name, it will be a direct name pointer after - * Acpi_aml_resolve_operands() - */ - - if (!VALID_DESCRIPTOR_TYPE (res_desc, ACPI_DESC_TYPE_NAMED)) { - status = AE_AML_OPERAND_TYPE; - goto cleanup; - } - - - /* - * Setup the Bit offsets and counts, according to the opcode - */ - - switch (op->opcode) { - - /* Def_create_bit_field */ - - case AML_BIT_FIELD_OP: - - /* Offset is in bits, Field is a bit */ - - bit_offset = offset; - bit_count = 1; - break; - - - /* Def_create_byte_field */ - - case AML_BYTE_FIELD_OP: - - /* Offset is in bytes, field is a byte */ - - bit_offset = 8 * offset; - bit_count = 8; - break; - - - /* Def_create_word_field */ - - case AML_WORD_FIELD_OP: - - /* Offset is in bytes, field is a word */ - - bit_offset = 8 * offset; - bit_count = 16; - break; - - - /* Def_create_dWord_field */ - - case AML_DWORD_FIELD_OP: - - /* Offset is in bytes, field is a dword */ - - bit_offset = 8 * offset; - bit_count = 32; - break; - - - /* Def_create_field */ - - case AML_CREATE_FIELD_OP: - - /* Offset is in bits, count is in bits */ - - bit_offset = offset; - bit_count = (u16) cnt_desc->integer.value; - break; - - - default: - - status = AE_AML_BAD_OPCODE; - goto cleanup; - } - - - /* - * Setup field according to the object type - */ - - switch (src_desc->common.type) { - - /* Source_buff := Term_arg=>Buffer */ - - case ACPI_TYPE_BUFFER: - - if (bit_offset + (u32) bit_count > - (8 * (u32) src_desc->buffer.length)) { - status = AE_AML_BUFFER_LIMIT; - goto cleanup; - } - - - /* Construct the remainder of the field object */ - - field_desc->field_unit.access = (u8) ACCESS_ANY_ACC; - field_desc->field_unit.lock_rule = (u8) GLOCK_NEVER_LOCK; - field_desc->field_unit.update_rule = (u8) UPDATE_PRESERVE; - field_desc->field_unit.length = bit_count; - field_desc->field_unit.bit_offset = (u8) (bit_offset % 8); - field_desc->field_unit.offset = DIV_8 (bit_offset); - field_desc->field_unit.container = src_desc; - - /* Reference count for Src_desc inherits Field_desc count */ - - src_desc->common.reference_count = (u16) (src_desc->common.reference_count + - field_desc->common.reference_count); - - break; - - - /* Improper object type */ - - default: - - - - status = AE_AML_OPERAND_TYPE; - goto cleanup; - } - - - if (AML_CREATE_FIELD_OP == op->opcode) { - /* Delete object descriptor unique to Create_field */ - - acpi_cm_remove_reference (cnt_desc); - cnt_desc = NULL; - } - - -cleanup: - - /* Always delete the operands */ - - acpi_cm_remove_reference (off_desc); - acpi_cm_remove_reference (src_desc); - - if (AML_CREATE_FIELD_OP == op->opcode) { - acpi_cm_remove_reference (cnt_desc); - } - - /* On failure, delete the result descriptor */ - - if (ACPI_FAILURE (status)) { - acpi_cm_remove_reference (res_desc); /* Result descriptor */ - } - - else { - /* Now the address and length are valid for this op_field_unit */ - - field_desc->field_unit.flags |= AOPOBJ_DATA_VALID; - } - - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ds_eval_region_operands - * - * PARAMETERS: Op - A valid region Op object - * - * RETURN: Status - * - * DESCRIPTION: Get region address and length - * Called from Acpi_ds_exec_end_op during Op_region parse tree walk - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ds_eval_region_operands ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_OPERAND_OBJECT *operand_desc; - ACPI_NAMESPACE_NODE *node; - ACPI_PARSE_OBJECT *next_op; - - - /* - * This is where we evaluate the address and length fields of the Op_region declaration - */ - - node = op->node; - - /* Next_op points to the op that holds the Space_iD */ - next_op = op->value.arg; - - /* Next_op points to address op */ - next_op = next_op->next; - - /* Acpi_evaluate/create the address and length operands */ - - status = acpi_ds_create_operands (walk_state, next_op); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Resolve the length and address operands to numbers */ - - status = acpi_aml_resolve_operands (op->opcode, WALK_OPERANDS, walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - - - obj_desc = acpi_ns_get_attached_object (node); - if (!obj_desc) { - return (AE_NOT_EXIST); - } - - /* - * Get the length operand and save it - * (at Top of stack) - */ - operand_desc = walk_state->operands[walk_state->num_operands - 1]; - - obj_desc->region.length = (u32) operand_desc->integer.value; - acpi_cm_remove_reference (operand_desc); - - /* - * Get the address and save it - * (at top of stack - 1) - */ - operand_desc = walk_state->operands[walk_state->num_operands - 2]; - - obj_desc->region.address = (ACPI_PHYSICAL_ADDRESS) operand_desc->integer.value; - acpi_cm_remove_reference (operand_desc); - - - /* Now the address and length are valid for this opregion */ - - obj_desc->region.flags |= AOPOBJ_DATA_VALID; - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_exec_begin_control_op - * - * PARAMETERS: Walk_list - The list that owns the walk stack - * Op - The control Op - * - * RETURN: Status - * - * DESCRIPTION: Handles all control ops encountered during control method - * execution. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_exec_begin_control_op ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op) -{ - ACPI_STATUS status = AE_OK; - ACPI_GENERIC_STATE *control_state; - - - switch (op->opcode) { - case AML_IF_OP: - case AML_WHILE_OP: - - /* - * IF/WHILE: Create a new control state to manage these - * constructs. We need to manage these as a stack, in order - * to handle nesting. - */ - - control_state = acpi_cm_create_control_state (); - if (!control_state) { - status = AE_NO_MEMORY; - break; - } - - acpi_cm_push_generic_state (&walk_state->control_state, control_state); - - /* - * Save a pointer to the predicate for multiple executions - * of a loop - */ - walk_state->control_state->control.aml_predicate_start = - walk_state->parser_state->aml - 1; - /* TBD: can this be removed? */ - /*Acpi_ps_pkg_length_encoding_size (GET8 (Walk_state->Parser_state->Aml));*/ - break; - - - case AML_ELSE_OP: - - /* Predicate is in the state object */ - /* If predicate is true, the IF was executed, ignore ELSE part */ - - if (walk_state->last_predicate) { - status = AE_CTRL_TRUE; - } - - break; - - - case AML_RETURN_OP: - - break; - - - default: - break; - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_exec_end_control_op - * - * PARAMETERS: Walk_list - The list that owns the walk stack - * Op - The control Op - * - * RETURN: Status - * - * DESCRIPTION: Handles all control ops encountered during control method - * execution. - * - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_exec_end_control_op ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op) -{ - ACPI_STATUS status = AE_OK; - ACPI_GENERIC_STATE *control_state; - - - switch (op->opcode) { - case AML_IF_OP: - - /* - * Save the result of the predicate in case there is an - * ELSE to come - */ - - walk_state->last_predicate = - (u8) walk_state->control_state->common.value; - - /* - * Pop the control state that was created at the start - * of the IF and free it - */ - - control_state = - acpi_cm_pop_generic_state (&walk_state->control_state); - - acpi_cm_delete_generic_state (control_state); - - break; - - - case AML_ELSE_OP: - - break; - - - case AML_WHILE_OP: - - if (walk_state->control_state->common.value) { - /* Predicate was true, go back and evaluate it again! */ - - status = AE_CTRL_PENDING; - } - - - /* Pop this control state and free it */ - - control_state = - acpi_cm_pop_generic_state (&walk_state->control_state); - - walk_state->aml_last_while = control_state->control.aml_predicate_start; - acpi_cm_delete_generic_state (control_state); - - break; - - - case AML_RETURN_OP: - - - /* - * One optional operand -- the return value - * It can be either an immediate operand or a result that - * has been bubbled up the tree - */ - if (op->value.arg) { - /* Return statement has an immediate operand */ - - status = acpi_ds_create_operands (walk_state, op->value.arg); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * If value being returned is a Reference (such as - * an arg or local), resolve it now because it may - * cease to exist at the end of the method. - */ - status = acpi_aml_resolve_to_value (&walk_state->operands [0], walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * Get the return value and save as the last result - * value. This is the only place where Walk_state->Return_desc - * is set to anything other than zero! - */ - - walk_state->return_desc = walk_state->operands[0]; - } - - else if ((walk_state->results) && - (walk_state->results->results.num_results > 0)) { - /* - * The return value has come from a previous calculation. - * - * If value being returned is a Reference (such as - * an arg or local), resolve it now because it may - * cease to exist at the end of the method. - * - * Allow references created by the Index operator to return unchanged. - */ - - if (VALID_DESCRIPTOR_TYPE (walk_state->results->results.obj_desc [0], ACPI_DESC_TYPE_INTERNAL) && - ((walk_state->results->results.obj_desc [0])->common.type == INTERNAL_TYPE_REFERENCE) && - ((walk_state->results->results.obj_desc [0])->reference.opcode != AML_INDEX_OP)) { - status = acpi_aml_resolve_to_value (&walk_state->results->results.obj_desc [0], walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - } - - walk_state->return_desc = walk_state->results->results.obj_desc [0]; - } - - else { - /* No return operand */ - - if (walk_state->num_operands) { - acpi_cm_remove_reference (walk_state->operands [0]); - } - - walk_state->operands [0] = NULL; - walk_state->num_operands = 0; - walk_state->return_desc = NULL; - } - - - /* End the control method execution right now */ - status = AE_CTRL_TERMINATE; - break; - - - case AML_NOOP_OP: - - /* Just do nothing! */ - break; - - - case AML_BREAK_POINT_OP: - - /* Call up to the OS dependent layer to handle this */ - - acpi_os_breakpoint (NULL); - - /* If it returns, we are done! */ - - break; - - - case AML_BREAK_OP: - - /* - * As per the ACPI specification: - * "The break operation causes the current package - * execution to complete" - * "Break -- Stop executing the current code package - * at this point" - * - * Returning AE_FALSE here will cause termination of - * the current package, and execution will continue one - * level up, starting with the completion of the parent Op. - */ - - status = AE_CTRL_FALSE; - break; - - - default: - - status = AE_AML_BAD_OPCODE; - break; - } - - - return (status); -} - diff --git a/reactos/drivers/bus/acpi/dispatcher/dsutils.c b/reactos/drivers/bus/acpi/dispatcher/dsutils.c deleted file mode 100644 index c87469493aa..00000000000 --- a/reactos/drivers/bus/acpi/dispatcher/dsutils.c +++ /dev/null @@ -1,744 +0,0 @@ -/******************************************************************************* - * - * Module Name: dsutils - Dispatcher utilities - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_DISPATCHER - MODULE_NAME ("dsutils") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_is_result_used - * - * PARAMETERS: Op - * Result_obj - * Walk_state - * - * RETURN: Status - * - * DESCRIPTION: Check if a result object will be used by the parent - * - ******************************************************************************/ - -u8 -acpi_ds_is_result_used ( - ACPI_PARSE_OBJECT *op, - ACPI_WALK_STATE *walk_state) -{ - ACPI_OPCODE_INFO *parent_info; - - - /* Must have both an Op and a Result Object */ - - if (!op) { - return (TRUE); - } - - - /* - * If there is no parent, the result can't possibly be used! - * (An executing method typically has no parent, since each - * method is parsed separately) However, a method that is - * invoked from another method has a parent. - */ - if (!op->parent) { - return (FALSE); - } - - - /* - * Get info on the parent. The root Op is AML_SCOPE - */ - - parent_info = acpi_ps_get_opcode_info (op->parent->opcode); - if (ACPI_GET_OP_TYPE (parent_info) != ACPI_OP_TYPE_OPCODE) { - return (FALSE); - } - - - /* - * Decide what to do with the result based on the parent. If - * the parent opcode will not use the result, delete the object. - * Otherwise leave it as is, it will be deleted when it is used - * as an operand later. - */ - - switch (ACPI_GET_OP_CLASS (parent_info)) { - /* - * In these cases, the parent will never use the return object - */ - case OPTYPE_CONTROL: /* IF, ELSE, WHILE only */ - - switch (op->parent->opcode) { - case AML_RETURN_OP: - - /* Never delete the return value associated with a return opcode */ - - return (TRUE); - break; - - case AML_IF_OP: - case AML_WHILE_OP: - - /* - * If we are executing the predicate AND this is the predicate op, - * we will use the return value! - */ - - if ((walk_state->control_state->common.state == CONTROL_PREDICATE_EXECUTING) && - (walk_state->control_state->control.predicate_op == op)) { - return (TRUE); - } - - break; - } - - - /* Fall through to not used case below */ - - - case OPTYPE_NAMED_OBJECT: /* Scope, method, etc. */ - - /* - * These opcodes allow Term_arg(s) as operands and therefore - * method calls. The result is used. - */ - if ((op->parent->opcode == AML_REGION_OP) || - (op->parent->opcode == AML_CREATE_FIELD_OP) || - (op->parent->opcode == AML_BIT_FIELD_OP) || - (op->parent->opcode == AML_BYTE_FIELD_OP) || - (op->parent->opcode == AML_WORD_FIELD_OP) || - (op->parent->opcode == AML_DWORD_FIELD_OP) || - (op->parent->opcode == AML_QWORD_FIELD_OP)) { - return (TRUE); - } - - return (FALSE); - break; - - /* - * In all other cases. the parent will actually use the return - * object, so keep it. - */ - default: - break; - } - - return (TRUE); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_delete_result_if_not_used - * - * PARAMETERS: Op - * Result_obj - * Walk_state - * - * RETURN: Status - * - * DESCRIPTION: Used after interpretation of an opcode. If there is an internal - * result descriptor, check if the parent opcode will actually use - * this result. If not, delete the result now so that it will - * not become orphaned. - * - ******************************************************************************/ - -void -acpi_ds_delete_result_if_not_used ( - ACPI_PARSE_OBJECT *op, - ACPI_OPERAND_OBJECT *result_obj, - ACPI_WALK_STATE *walk_state) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_STATUS status; - - - if (!op) { - return; - } - - if (!result_obj) { - return; - } - - - if (!acpi_ds_is_result_used (op, walk_state)) { - /* - * Must pop the result stack (Obj_desc should be equal - * to Result_obj) - */ - - status = acpi_ds_result_pop (&obj_desc, walk_state); - if (ACPI_SUCCESS (status)) { - acpi_cm_remove_reference (result_obj); - } - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_create_operand - * - * PARAMETERS: Walk_state - * Arg - * - * RETURN: Status - * - * DESCRIPTION: Translate a parse tree object that is an argument to an AML - * opcode to the equivalent interpreter object. This may include - * looking up a name or entering a new name into the internal - * namespace. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_create_operand ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *arg, - u32 arg_index) -{ - ACPI_STATUS status = AE_OK; - NATIVE_CHAR *name_string; - u32 name_length; - OBJECT_TYPE_INTERNAL data_type; - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_PARSE_OBJECT *parent_op; - u16 opcode; - u32 flags = 0; - OPERATING_MODE interpreter_mode; - - - /* A valid name must be looked up in the namespace */ - - if ((arg->opcode == AML_NAMEPATH_OP) && - (arg->value.string)) { - /* Get the entire name string from the AML stream */ - - status = acpi_aml_get_name_string (ACPI_TYPE_ANY, - arg->value.buffer, - &name_string, - &name_length); - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * All prefixes have been handled, and the name is - * in Name_string - */ - - /* - * Differentiate between a namespace "create" operation - * versus a "lookup" operation (IMODE_LOAD_PASS2 vs. - * IMODE_EXECUTE) in order to support the creation of - * namespace objects during the execution of control methods. - */ - - parent_op = arg->parent; - if ((acpi_ps_is_node_op (parent_op->opcode)) && - (parent_op->opcode != AML_METHODCALL_OP) && - (parent_op->opcode != AML_REGION_OP) && - (parent_op->opcode != AML_NAMEPATH_OP)) { - /* Enter name into namespace if not found */ - - interpreter_mode = IMODE_LOAD_PASS2; - } - - else { - /* Return a failure if name not found */ - - interpreter_mode = IMODE_EXECUTE; - } - - status = acpi_ns_lookup (walk_state->scope_info, name_string, - ACPI_TYPE_ANY, interpreter_mode, - NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE, - walk_state, - (ACPI_NAMESPACE_NODE **) &obj_desc); - - /* Free the namestring created above */ - - acpi_cm_free (name_string); - - /* - * The only case where we pass through (ignore) a NOT_FOUND - * error is for the Cond_ref_of opcode. - */ - - if (status == AE_NOT_FOUND) { - if (parent_op->opcode == AML_COND_REF_OF_OP) { - /* - * For the Conditional Reference op, it's OK if - * the name is not found; We just need a way to - * indicate this to the interpreter, set the - * object to the root - */ - obj_desc = (ACPI_OPERAND_OBJECT *) acpi_gbl_root_node; - status = AE_OK; - } - - else { - /* - * We just plain didn't find it -- which is a - * very serious error at this point - */ - status = AE_AML_NAME_NOT_FOUND; - } - } - - /* Check status from the lookup */ - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Put the resulting object onto the current object stack */ - - status = acpi_ds_obj_stack_push (obj_desc, walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - DEBUGGER_EXEC (acpi_db_display_argument_object (obj_desc, walk_state)); - } - - - else { - /* Check for null name case */ - - if (arg->opcode == AML_NAMEPATH_OP) { - /* - * If the name is null, this means that this is an - * optional result parameter that was not specified - * in the original ASL. Create an Reference for a - * placeholder - */ - opcode = AML_ZERO_OP; /* Has no arguments! */ - - /* - * TBD: [Investigate] anything else needed for the - * zero op lvalue? - */ - } - - else { - opcode = arg->opcode; - } - - - /* Get the data type of the argument */ - - data_type = acpi_ds_map_opcode_to_data_type (opcode, &flags); - if (data_type == INTERNAL_TYPE_INVALID) { - return (AE_NOT_IMPLEMENTED); - } - - if (flags & OP_HAS_RETURN_VALUE) { - DEBUGGER_EXEC (acpi_db_display_argument_object (walk_state->operands [walk_state->num_operands - 1], walk_state)); - - /* - * Use value that was already previously returned - * by the evaluation of this argument - */ - - status = acpi_ds_result_pop_from_bottom (&obj_desc, walk_state); - if (ACPI_FAILURE (status)) { - /* - * Only error is underflow, and this indicates - * a missing or null operand! - */ - return (status); - } - - } - - else { - /* Create an ACPI_INTERNAL_OBJECT for the argument */ - - obj_desc = acpi_cm_create_internal_object (data_type); - if (!obj_desc) { - return (AE_NO_MEMORY); - } - - /* Initialize the new object */ - - status = acpi_ds_init_object_from_op (walk_state, arg, - opcode, &obj_desc); - if (ACPI_FAILURE (status)) { - acpi_cm_delete_object_desc (obj_desc); - return (status); - } - } - - /* Put the operand object on the object stack */ - - status = acpi_ds_obj_stack_push (obj_desc, walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - - DEBUGGER_EXEC (acpi_db_display_argument_object (obj_desc, walk_state)); - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_create_operands - * - * PARAMETERS: First_arg - First argument of a parser argument tree - * - * RETURN: Status - * - * DESCRIPTION: Convert an operator's arguments from a parse tree format to - * namespace objects and place those argument object on the object - * stack in preparation for evaluation by the interpreter. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_create_operands ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *first_arg) -{ - ACPI_STATUS status = AE_OK; - ACPI_PARSE_OBJECT *arg; - u32 arg_count = 0; - - - /* For all arguments in the list... */ - - arg = first_arg; - while (arg) { - status = acpi_ds_create_operand (walk_state, arg, arg_count); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - /* Move on to next argument, if any */ - - arg = arg->next; - arg_count++; - } - - return (status); - - -cleanup: - /* - * We must undo everything done above; meaning that we must - * pop everything off of the operand stack and delete those - * objects - */ - - acpi_ds_obj_stack_pop_and_delete (arg_count, walk_state); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_resolve_operands - * - * PARAMETERS: Walk_state - Current walk state with operands on stack - * - * RETURN: Status - * - * DESCRIPTION: Resolve all operands to their values. Used to prepare - * arguments to a control method invocation (a call from one - * method to another.) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_resolve_operands ( - ACPI_WALK_STATE *walk_state) -{ - u32 i; - ACPI_STATUS status = AE_OK; - - - /* - * Attempt to resolve each of the valid operands - * Method arguments are passed by value, not by reference - */ - - /* - * TBD: [Investigate] Note from previous parser: - * Ref_of problem with Acpi_aml_resolve_to_value() conversion. - */ - - for (i = 0; i < walk_state->num_operands; i++) { - status = acpi_aml_resolve_to_value (&walk_state->operands[i], walk_state); - if (ACPI_FAILURE (status)) { - break; - } - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_map_opcode_to_data_type - * - * PARAMETERS: Opcode - AML opcode to map - * Out_flags - Additional info about the opcode - * - * RETURN: The ACPI type associated with the opcode - * - * DESCRIPTION: Convert a raw AML opcode to the associated ACPI data type, - * if any. If the opcode returns a value as part of the - * intepreter execution, a flag is returned in Out_flags. - * - ******************************************************************************/ - -OBJECT_TYPE_INTERNAL -acpi_ds_map_opcode_to_data_type ( - u16 opcode, - u32 *out_flags) -{ - OBJECT_TYPE_INTERNAL data_type = INTERNAL_TYPE_INVALID; - ACPI_OPCODE_INFO *op_info; - u32 flags = 0; - - - op_info = acpi_ps_get_opcode_info (opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { - /* Unknown opcode */ - - return (data_type); - } - - switch (ACPI_GET_OP_CLASS (op_info)) { - - case OPTYPE_LITERAL: - - switch (opcode) { - case AML_BYTE_OP: - case AML_WORD_OP: - case AML_DWORD_OP: - - data_type = ACPI_TYPE_INTEGER; - break; - - - case AML_STRING_OP: - - data_type = ACPI_TYPE_STRING; - break; - - case AML_NAMEPATH_OP: - data_type = INTERNAL_TYPE_REFERENCE; - break; - - default: - break; - } - break; - - - case OPTYPE_DATA_TERM: - - switch (opcode) { - case AML_BUFFER_OP: - - data_type = ACPI_TYPE_BUFFER; - break; - - case AML_PACKAGE_OP: - - data_type = ACPI_TYPE_PACKAGE; - break; - - default: - break; - } - break; - - - case OPTYPE_CONSTANT: - case OPTYPE_METHOD_ARGUMENT: - case OPTYPE_LOCAL_VARIABLE: - - data_type = INTERNAL_TYPE_REFERENCE; - break; - - - case OPTYPE_MONADIC2: - case OPTYPE_MONADIC2_r: - case OPTYPE_DYADIC2: - case OPTYPE_DYADIC2_r: - case OPTYPE_DYADIC2_s: - case OPTYPE_INDEX: - case OPTYPE_MATCH: - case OPTYPE_RETURN: - - flags = OP_HAS_RETURN_VALUE; - data_type = ACPI_TYPE_ANY; - break; - - case OPTYPE_METHOD_CALL: - - flags = OP_HAS_RETURN_VALUE; - data_type = ACPI_TYPE_METHOD; - break; - - - case OPTYPE_NAMED_OBJECT: - - data_type = acpi_ds_map_named_opcode_to_data_type (opcode); - break; - - - case OPTYPE_DYADIC1: - case OPTYPE_CONTROL: - - /* No mapping needed at this time */ - - break; - - - default: - - break; - } - - /* Return flags to caller if requested */ - - if (out_flags) { - *out_flags = flags; - } - - return (data_type); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_map_named_opcode_to_data_type - * - * PARAMETERS: Opcode - The Named AML opcode to map - * - * RETURN: The ACPI type associated with the named opcode - * - * DESCRIPTION: Convert a raw Named AML opcode to the associated data type. - * Named opcodes are a subsystem of the AML opcodes. - * - ******************************************************************************/ - -OBJECT_TYPE_INTERNAL -acpi_ds_map_named_opcode_to_data_type ( - u16 opcode) -{ - OBJECT_TYPE_INTERNAL data_type; - - - /* Decode Opcode */ - - switch (opcode) { - case AML_SCOPE_OP: - data_type = INTERNAL_TYPE_SCOPE; - break; - - case AML_DEVICE_OP: - data_type = ACPI_TYPE_DEVICE; - break; - - case AML_THERMAL_ZONE_OP: - data_type = ACPI_TYPE_THERMAL; - break; - - case AML_METHOD_OP: - data_type = ACPI_TYPE_METHOD; - break; - - case AML_POWER_RES_OP: - data_type = ACPI_TYPE_POWER; - break; - - case AML_PROCESSOR_OP: - data_type = ACPI_TYPE_PROCESSOR; - break; - - case AML_DEF_FIELD_OP: /* Def_field_op */ - data_type = INTERNAL_TYPE_DEF_FIELD_DEFN; - break; - - case AML_INDEX_FIELD_OP: /* Index_field_op */ - data_type = INTERNAL_TYPE_INDEX_FIELD_DEFN; - break; - - case AML_BANK_FIELD_OP: /* Bank_field_op */ - data_type = INTERNAL_TYPE_BANK_FIELD_DEFN; - break; - - case AML_NAMEDFIELD_OP: /* NO CASE IN ORIGINAL */ - data_type = ACPI_TYPE_ANY; - break; - - case AML_NAME_OP: /* Name_op - special code in original */ - case AML_NAMEPATH_OP: - data_type = ACPI_TYPE_ANY; - break; - - case AML_ALIAS_OP: - data_type = INTERNAL_TYPE_ALIAS; - break; - - case AML_MUTEX_OP: - data_type = ACPI_TYPE_MUTEX; - break; - - case AML_EVENT_OP: - data_type = ACPI_TYPE_EVENT; - break; - - case AML_REGION_OP: - data_type = ACPI_TYPE_REGION; - break; - - - default: - data_type = ACPI_TYPE_ANY; - break; - - } - - return (data_type); -} - - diff --git a/reactos/drivers/bus/acpi/dispatcher/dswexec.c b/reactos/drivers/bus/acpi/dispatcher/dswexec.c deleted file mode 100644 index a7121305921..00000000000 --- a/reactos/drivers/bus/acpi/dispatcher/dswexec.c +++ /dev/null @@ -1,646 +0,0 @@ -/****************************************************************************** - * - * Module Name: dswexec - Dispatcher method execution callbacks; - * dispatch to interpreter. - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_DISPATCHER - MODULE_NAME ("dswexec") - - -/***************************************************************************** - * - * FUNCTION: Acpi_ds_get_predicate_value - * - * PARAMETERS: Walk_state - Current state of the parse tree walk - * - * RETURN: Status - * - * DESCRIPTION: Get the result of a predicate evaluation - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ds_get_predicate_value ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op, - NATIVE_UINT has_result_obj) -{ - ACPI_STATUS status = AE_OK; - ACPI_OPERAND_OBJECT *obj_desc; - - - walk_state->control_state->common.state = 0; - - if (has_result_obj) { - status = acpi_ds_result_pop (&obj_desc, walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - } - - else { - status = acpi_ds_create_operand (walk_state, op, 0); - if (ACPI_FAILURE (status)) { - return (status); - } - - status = acpi_aml_resolve_to_value (&walk_state->operands [0], walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - - obj_desc = walk_state->operands [0]; - } - - if (!obj_desc) { - return (AE_AML_NO_OPERAND); - } - - - /* - * Result of predicate evaluation currently must - * be a number - */ - - if (obj_desc->common.type != ACPI_TYPE_INTEGER) { - status = AE_AML_OPERAND_TYPE; - goto cleanup; - } - - - /* Truncate the predicate to 32-bits if necessary */ - - acpi_aml_truncate_for32bit_table (obj_desc, walk_state); - - /* - * Save the result of the predicate evaluation on - * the control stack - */ - - if (obj_desc->integer.value) { - walk_state->control_state->common.value = TRUE; - } - - else { - /* - * Predicate is FALSE, we will just toss the - * rest of the package - */ - - walk_state->control_state->common.value = FALSE; - status = AE_CTRL_FALSE; - } - - -cleanup: - - /* Break to debugger to display result */ - - DEBUGGER_EXEC (acpi_db_display_result_object (obj_desc, walk_state)); - - /* - * Delete the predicate result object (we know that - * we don't need it anymore) - */ - - acpi_cm_remove_reference (obj_desc); - - walk_state->control_state->common.state = CONTROL_NORMAL; - - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ds_exec_begin_op - * - * PARAMETERS: Walk_state - Current state of the parse tree walk - * Op - Op that has been just been reached in the - * walk; Arguments have not been evaluated yet. - * - * RETURN: Status - * - * DESCRIPTION: Descending callback used during the execution of control - * methods. This is where most operators and operands are - * dispatched to the interpreter. - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ds_exec_begin_op ( - u16 opcode, - ACPI_PARSE_OBJECT *op, - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT **out_op) -{ - ACPI_OPCODE_INFO *op_info; - ACPI_STATUS status = AE_OK; - - - if (!op) { - status = acpi_ds_load2_begin_op (opcode, NULL, walk_state, out_op); - if (ACPI_FAILURE (status)) { - return (status); - } - - op = *out_op; - } - - if (op == walk_state->origin) { - if (out_op) { - *out_op = op; - } - - return (AE_OK); - } - - /* - * If the previous opcode was a conditional, this opcode - * must be the beginning of the associated predicate. - * Save this knowledge in the current scope descriptor - */ - - if ((walk_state->control_state) && - (walk_state->control_state->common.state == - CONTROL_CONDITIONAL_EXECUTING)) { - walk_state->control_state->common.state = CONTROL_PREDICATE_EXECUTING; - - /* Save start of predicate */ - - walk_state->control_state->control.predicate_op = op; - } - - - op_info = acpi_ps_get_opcode_info (op->opcode); - - /* We want to send namepaths to the load code */ - - if (op->opcode == AML_NAMEPATH_OP) { - op_info->flags = OPTYPE_NAMED_OBJECT; - } - - - /* - * Handle the opcode based upon the opcode type - */ - - switch (ACPI_GET_OP_CLASS (op_info)) { - case OPTYPE_CONTROL: - - status = acpi_ds_result_stack_push (walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - - status = acpi_ds_exec_begin_control_op (walk_state, op); - break; - - - case OPTYPE_NAMED_OBJECT: - - if (walk_state->walk_type == WALK_METHOD) { - /* - * Found a named object declaration during method - * execution; we must enter this object into the - * namespace. The created object is temporary and - * will be deleted upon completion of the execution - * of this method. - */ - - status = acpi_ds_load2_begin_op (op->opcode, op, walk_state, NULL); - } - - - if (op->opcode == AML_REGION_OP) { - status = acpi_ds_result_stack_push (walk_state); - } - - break; - - - /* most operators with arguments */ - - case OPTYPE_MONADIC1: - case OPTYPE_DYADIC1: - case OPTYPE_MONADIC2: - case OPTYPE_MONADIC2_r: - case OPTYPE_DYADIC2: - case OPTYPE_DYADIC2_r: - case OPTYPE_DYADIC2_s: - case OPTYPE_RECONFIGURATION: - case OPTYPE_INDEX: - case OPTYPE_MATCH: - case OPTYPE_FATAL: - case OPTYPE_CREATE_FIELD: - - /* Start a new result/operand state */ - - status = acpi_ds_result_stack_push (walk_state); - break; - - - default: - break; - } - - /* Nothing to do here during method execution */ - - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ds_exec_end_op - * - * PARAMETERS: Walk_state - Current state of the parse tree walk - * Op - Op that has been just been completed in the - * walk; Arguments have now been evaluated. - * - * RETURN: Status - * - * DESCRIPTION: Ascending callback used during the execution of control - * methods. The only thing we really need to do here is to - * notice the beginning of IF, ELSE, and WHILE blocks. - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ds_exec_end_op ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op) -{ - ACPI_STATUS status = AE_OK; - u16 opcode; - u8 optype; - ACPI_PARSE_OBJECT *next_op; - ACPI_NAMESPACE_NODE *node; - ACPI_PARSE_OBJECT *first_arg; - ACPI_OPERAND_OBJECT *result_obj = NULL; - ACPI_OPCODE_INFO *op_info; - u32 operand_index; - - - opcode = (u16) op->opcode; - - - op_info = acpi_ps_get_opcode_info (op->opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { - return (AE_NOT_IMPLEMENTED); - } - - optype = (u8) ACPI_GET_OP_CLASS (op_info); - first_arg = op->value.arg; - - /* Init the walk state */ - - walk_state->num_operands = 0; - walk_state->return_desc = NULL; - walk_state->op_info = op_info; - walk_state->opcode = opcode; - - - /* Call debugger for single step support (DEBUG build only) */ - - DEBUGGER_EXEC (status = acpi_db_single_step (walk_state, op, optype)); - DEBUGGER_EXEC (if (ACPI_FAILURE (status)) {return (status);}); - - - /* Decode the opcode */ - - switch (optype) { - case OPTYPE_UNDEFINED: - - return (AE_NOT_IMPLEMENTED); - break; - - - case OPTYPE_BOGUS: - break; - - case OPTYPE_CONSTANT: /* argument type only */ - case OPTYPE_LITERAL: /* argument type only */ - case OPTYPE_DATA_TERM: /* argument type only */ - case OPTYPE_LOCAL_VARIABLE: /* argument type only */ - case OPTYPE_METHOD_ARGUMENT: /* argument type only */ - break; - - - /* most operators with arguments */ - - case OPTYPE_MONADIC1: - case OPTYPE_DYADIC1: - case OPTYPE_MONADIC2: - case OPTYPE_MONADIC2_r: - case OPTYPE_DYADIC2: - case OPTYPE_DYADIC2_r: - case OPTYPE_DYADIC2_s: - case OPTYPE_RECONFIGURATION: - case OPTYPE_INDEX: - case OPTYPE_MATCH: - case OPTYPE_FATAL: - - - /* Build resolved operand stack */ - - status = acpi_ds_create_operands (walk_state, first_arg); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - operand_index = walk_state->num_operands - 1; - - - /* Done with this result state (Now that operand stack is built) */ - - status = acpi_ds_result_stack_pop (walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - switch (optype) { - case OPTYPE_MONADIC1: - - /* 1 Operand, 0 External_result, 0 Internal_result */ - - status = acpi_aml_exec_monadic1 (opcode, walk_state); - break; - - - case OPTYPE_MONADIC2: - - /* 1 Operand, 0 External_result, 1 Internal_result */ - - status = acpi_aml_exec_monadic2 (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_MONADIC2_r: - - /* 1 Operand, 1 External_result, 1 Internal_result */ - - status = acpi_aml_exec_monadic2_r (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_DYADIC1: - - /* 2 Operands, 0 External_result, 0 Internal_result */ - - status = acpi_aml_exec_dyadic1 (opcode, walk_state); - break; - - - case OPTYPE_DYADIC2: - - /* 2 Operands, 0 External_result, 1 Internal_result */ - - status = acpi_aml_exec_dyadic2 (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_DYADIC2_r: - - /* 2 Operands, 1 or 2 External_results, 1 Internal_result */ - - status = acpi_aml_exec_dyadic2_r (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_DYADIC2_s: /* Synchronization Operator */ - - /* 2 Operands, 0 External_result, 1 Internal_result */ - - status = acpi_aml_exec_dyadic2_s (opcode, walk_state, &result_obj); - break; - - - case OPTYPE_INDEX: /* Type 2 opcode with 3 operands */ - - /* 3 Operands, 1 External_result, 1 Internal_result */ - - status = acpi_aml_exec_index (walk_state, &result_obj); - break; - - - case OPTYPE_MATCH: /* Type 2 opcode with 6 operands */ - - /* 6 Operands, 0 External_result, 1 Internal_result */ - - status = acpi_aml_exec_match (walk_state, &result_obj); - break; - - - case OPTYPE_RECONFIGURATION: - - /* 1 or 2 operands, 0 Internal Result */ - - status = acpi_aml_exec_reconfiguration (opcode, walk_state); - break; - - - case OPTYPE_FATAL: - - /* 3 Operands, 0 External_result, 0 Internal_result */ - - status = acpi_aml_exec_fatal (walk_state); - break; - } - - /* - * If a result object was returned from above, push it on the - * current result stack - */ - if (ACPI_SUCCESS (status) && - result_obj) { - status = acpi_ds_result_push (result_obj, walk_state); - } - - break; - - - case OPTYPE_CONTROL: /* Type 1 opcode, IF/ELSE/WHILE/NOOP */ - - /* 1 Operand, 0 External_result, 0 Internal_result */ - - status = acpi_ds_exec_end_control_op (walk_state, op); - - acpi_ds_result_stack_pop (walk_state); - break; - - - case OPTYPE_METHOD_CALL: - - /* - * (AML_METHODCALL) Op->Value->Arg->Node contains - * the method Node pointer - */ - /* Next_op points to the op that holds the method name */ - - next_op = first_arg; - node = next_op->node; - - /* Next_op points to first argument op */ - - next_op = next_op->next; - - /* - * Get the method's arguments and put them on the operand stack - */ - status = acpi_ds_create_operands (walk_state, next_op); - if (ACPI_FAILURE (status)) { - break; - } - - /* - * Since the operands will be passed to another - * control method, we must resolve all local - * references here (Local variables, arguments - * to *this* method, etc.) - */ - - status = acpi_ds_resolve_operands (walk_state); - if (ACPI_FAILURE (status)) { - break; - } - - /* - * Tell the walk loop to preempt this running method and - * execute the new method - */ - status = AE_CTRL_TRANSFER; - - /* - * Return now; we don't want to disturb anything, - * especially the operand count! - */ - return (status); - break; - - - case OPTYPE_CREATE_FIELD: - - status = acpi_ds_load2_end_op (walk_state, op); - if (ACPI_FAILURE (status)) { - break; - } - - status = acpi_ds_eval_field_unit_operands (walk_state, op); - break; - - - case OPTYPE_NAMED_OBJECT: - - status = acpi_ds_load2_end_op (walk_state, op); - if (ACPI_FAILURE (status)) { - break; - } - - switch (op->opcode) { - case AML_REGION_OP: - - status = acpi_ds_eval_region_operands (walk_state, op); - if (ACPI_FAILURE (status)) { - break; - } - - status = acpi_ds_result_stack_pop (walk_state); - break; - - - case AML_METHOD_OP: - break; - - - case AML_ALIAS_OP: - - /* Alias creation was already handled by call - to psxload above */ - break; - - - default: - /* Nothing needs to be done */ - - status = AE_OK; - break; - } - - break; - - default: - - status = AE_NOT_IMPLEMENTED; - break; - } - - - /* - * ACPI 2.0 support for 64-bit integers: - * Truncate numeric result value if we are executing from a 32-bit ACPI table - */ - acpi_aml_truncate_for32bit_table (result_obj, walk_state); - - /* - * Check if we just completed the evaluation of a - * conditional predicate - */ - - if ((walk_state->control_state) && - (walk_state->control_state->common.state == - CONTROL_PREDICATE_EXECUTING) && - (walk_state->control_state->control.predicate_op == op)) { - status = acpi_ds_get_predicate_value (walk_state, op, (NATIVE_UINT) result_obj); - result_obj = NULL; - } - - -cleanup: - if (result_obj) { - /* Break to debugger to display result */ - - DEBUGGER_EXEC (acpi_db_display_result_object (result_obj, walk_state)); - - /* - * Delete the result op if and only if: - * Parent will not use the result -- such as any - * non-nested type2 op in a method (parent will be method) - */ - acpi_ds_delete_result_if_not_used (op, result_obj, walk_state); - } - - /* Always clear the object stack */ - - /* TBD: [Investigate] Clear stack of return value, - but don't delete it */ - walk_state->num_operands = 0; - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/dispatcher/dswload.c b/reactos/drivers/bus/acpi/dispatcher/dswload.c deleted file mode 100644 index b810d5f6b4a..00000000000 --- a/reactos/drivers/bus/acpi/dispatcher/dswload.c +++ /dev/null @@ -1,672 +0,0 @@ -/****************************************************************************** - * - * Module Name: dswload - Dispatcher namespace load callbacks - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_DISPATCHER - MODULE_NAME ("dswload") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_load1_begin_op - * - * PARAMETERS: Walk_state - Current state of the parse tree walk - * Op - Op that has been just been reached in the - * walk; Arguments have not been evaluated yet. - * - * RETURN: Status - * - * DESCRIPTION: Descending callback used during the loading of ACPI tables. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_load1_begin_op ( - u16 opcode, - ACPI_PARSE_OBJECT *op, - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT **out_op) -{ - ACPI_NAMESPACE_NODE *node; - ACPI_STATUS status; - OBJECT_TYPE_INTERNAL data_type; - NATIVE_CHAR *path; - - - /* We are only interested in opcodes that have an associated name */ - - if (!acpi_ps_is_named_op (opcode)) { - *out_op = op; - return (AE_OK); - } - - - /* Check if this object has already been installed in the namespace */ - - if (op && op->node) { - *out_op = op; - return (AE_OK); - } - - path = acpi_ps_get_next_namestring (walk_state->parser_state); - - /* Map the raw opcode into an internal object type */ - - data_type = acpi_ds_map_named_opcode_to_data_type (opcode); - - - - /* - * Enter the named type into the internal namespace. We enter the name - * as we go downward in the parse tree. Any necessary subobjects that involve - * arguments to the opcode must be created as we go back up the parse tree later. - */ - status = acpi_ns_lookup (walk_state->scope_info, path, - data_type, IMODE_LOAD_PASS1, - NS_NO_UPSEARCH, walk_state, &(node)); - - if (ACPI_FAILURE (status)) { - return (status); - } - - if (!op) { - /* Create a new op */ - - op = acpi_ps_alloc_op (opcode); - if (!op) { - return (AE_NO_MEMORY); - } - } - - /* Initialize */ - - ((ACPI_PARSE2_OBJECT *)op)->name = node->name; - - /* - * Put the Node in the "op" object that the parser uses, so we - * can get it again quickly when this scope is closed - */ - op->node = node; - - - acpi_ps_append_arg (acpi_ps_get_parent_scope (walk_state->parser_state), op); - - *out_op = op; - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_load1_end_op - * - * PARAMETERS: Walk_state - Current state of the parse tree walk - * Op - Op that has been just been completed in the - * walk; Arguments have now been evaluated. - * - * RETURN: Status - * - * DESCRIPTION: Ascending callback used during the loading of the namespace, - * both control methods and everything else. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_load1_end_op ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op) -{ - OBJECT_TYPE_INTERNAL data_type; - - - /* We are only interested in opcodes that have an associated name */ - - if (!acpi_ps_is_named_op (op->opcode)) { - return (AE_OK); - } - - - /* Get the type to determine if we should pop the scope */ - - data_type = acpi_ds_map_named_opcode_to_data_type (op->opcode); - - if (op->opcode == AML_NAME_OP) { - /* For Name opcode, check the argument */ - - if (op->value.arg) { - data_type = acpi_ds_map_opcode_to_data_type ( - (op->value.arg)->opcode, NULL); - ((ACPI_NAMESPACE_NODE *)op->node)->type = - (u8) data_type; - } - } - - - /* Pop the scope stack */ - - if (acpi_ns_opens_scope (data_type)) { - - acpi_ds_scope_stack_pop (walk_state); - } - - return (AE_OK); - -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_load2_begin_op - * - * PARAMETERS: Walk_state - Current state of the parse tree walk - * Op - Op that has been just been reached in the - * walk; Arguments have not been evaluated yet. - * - * RETURN: Status - * - * DESCRIPTION: Descending callback used during the loading of ACPI tables. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_load2_begin_op ( - u16 opcode, - ACPI_PARSE_OBJECT *op, - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT **out_op) -{ - ACPI_NAMESPACE_NODE *node; - ACPI_STATUS status; - OBJECT_TYPE_INTERNAL data_type; - NATIVE_CHAR *buffer_ptr; - void *original = NULL; - - - /* We only care about Namespace opcodes here */ - - if (!acpi_ps_is_namespace_op (opcode) && - opcode != AML_NAMEPATH_OP) { - return (AE_OK); - } - - - /* Temp! same code as in psparse */ - - if (!acpi_ps_is_named_op (opcode)) { - return (AE_OK); - } - - if (op) { - /* - * Get the name we are going to enter or lookup in the namespace - */ - if (opcode == AML_NAMEPATH_OP) { - /* For Namepath op, get the path string */ - - buffer_ptr = op->value.string; - if (!buffer_ptr) { - /* No name, just exit */ - - return (AE_OK); - } - } - - else { - /* Get name from the op */ - - buffer_ptr = (NATIVE_CHAR *) &((ACPI_PARSE2_OBJECT *)op)->name; - } - } - - else { - buffer_ptr = acpi_ps_get_next_namestring (walk_state->parser_state); - } - - - /* Map the raw opcode into an internal object type */ - - data_type = acpi_ds_map_named_opcode_to_data_type (opcode); - - - if (opcode == AML_DEF_FIELD_OP || - opcode == AML_BANK_FIELD_OP || - opcode == AML_INDEX_FIELD_OP) { - node = NULL; - status = AE_OK; - } - - else if (opcode == AML_NAMEPATH_OP) { - /* - * The Name_path is an object reference to an existing object. Don't enter the - * name into the namespace, but look it up for use later - */ - status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, - data_type, IMODE_EXECUTE, - NS_SEARCH_PARENT, walk_state, - &(node)); - } - - else { - if (op && op->node) { - original = op->node; - node = op->node; - - if (acpi_ns_opens_scope (data_type)) { - status = acpi_ds_scope_stack_push (node, - data_type, - walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - - } - return (AE_OK); - } - - /* - * Enter the named type into the internal namespace. We enter the name - * as we go downward in the parse tree. Any necessary subobjects that involve - * arguments to the opcode must be created as we go back up the parse tree later. - */ - status = acpi_ns_lookup (walk_state->scope_info, buffer_ptr, - data_type, IMODE_EXECUTE, - NS_NO_UPSEARCH, walk_state, - &(node)); - } - - if (ACPI_SUCCESS (status)) { - if (!op) { - /* Create a new op */ - - op = acpi_ps_alloc_op (opcode); - if (!op) { - return (AE_NO_MEMORY); - } - - /* Initialize */ - - ((ACPI_PARSE2_OBJECT *)op)->name = node->name; - *out_op = op; - } - - - /* - * Put the Node in the "op" object that the parser uses, so we - * can get it again quickly when this scope is closed - */ - op->node = node; - - } - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_load2_end_op - * - * PARAMETERS: Walk_state - Current state of the parse tree walk - * Op - Op that has been just been completed in the - * walk; Arguments have now been evaluated. - * - * RETURN: Status - * - * DESCRIPTION: Ascending callback used during the loading of the namespace, - * both control methods and everything else. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_load2_end_op ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op) -{ - ACPI_STATUS status = AE_OK; - OBJECT_TYPE_INTERNAL data_type; - ACPI_NAMESPACE_NODE *node; - ACPI_PARSE_OBJECT *arg; - ACPI_NAMESPACE_NODE *new_node; - - - if (!acpi_ps_is_namespace_object_op (op->opcode)) { - return (AE_OK); - } - - if (op->opcode == AML_SCOPE_OP) { - if (((ACPI_PARSE2_OBJECT *)op)->name == -1) { - return (AE_OK); - } - } - - - data_type = acpi_ds_map_named_opcode_to_data_type (op->opcode); - - /* - * Get the Node/name from the earlier lookup - * (It was saved in the *op structure) - */ - node = op->node; - - /* - * Put the Node on the object stack (Contains the ACPI Name of - * this object) - */ - - walk_state->operands[0] = (void *) node; - walk_state->num_operands = 1; - - /* Pop the scope stack */ - - if (acpi_ns_opens_scope (data_type)) { - - acpi_ds_scope_stack_pop (walk_state); - } - - - /* - * Named operations are as follows: - * - * AML_SCOPE - * AML_DEVICE - * AML_THERMALZONE - * AML_METHOD - * AML_POWERRES - * AML_PROCESSOR - * AML_FIELD - * AML_INDEXFIELD - * AML_BANKFIELD - * AML_NAMEDFIELD - * AML_NAME - * AML_ALIAS - * AML_MUTEX - * AML_EVENT - * AML_OPREGION - * AML_CREATEFIELD - * AML_CREATEBITFIELD - * AML_CREATEBYTEFIELD - * AML_CREATEWORDFIELD - * AML_CREATEDWORDFIELD - * AML_METHODCALL - */ - - - /* Decode the opcode */ - - arg = op->value.arg; - - switch (op->opcode) { - - case AML_CREATE_FIELD_OP: - case AML_BIT_FIELD_OP: - case AML_BYTE_FIELD_OP: - case AML_WORD_FIELD_OP: - case AML_DWORD_FIELD_OP: - - /* - * Create the field object, but the field buffer and index must - * be evaluated later during the execution phase - */ - - /* Get the Name_string argument */ - - if (op->opcode == AML_CREATE_FIELD_OP) { - arg = acpi_ps_get_arg (op, 3); - } - else { - /* Create Bit/Byte/Word/Dword field */ - - arg = acpi_ps_get_arg (op, 2); - } - - /* - * Enter the Name_string into the namespace - */ - - status = acpi_ns_lookup (walk_state->scope_info, - arg->value.string, - INTERNAL_TYPE_DEF_ANY, - IMODE_LOAD_PASS1, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - walk_state, &(new_node)); - - if (ACPI_SUCCESS (status)) { - /* We could put the returned object (Node) on the object stack for later, but - * for now, we will put it in the "op" object that the parser uses, so we - * can get it again at the end of this scope - */ - op->node = new_node; - - /* - * If there is no object attached to the node, this node was just created and - * we need to create the field object. Otherwise, this was a lookup of an - * existing node and we don't want to create the field object again. - */ - if (!new_node->object) { - /* - * The Field definition is not fully parsed at this time. - * (We must save the address of the AML for the buffer and index operands) - */ - status = acpi_aml_exec_create_field (((ACPI_PARSE2_OBJECT *) op)->data, - ((ACPI_PARSE2_OBJECT *) op)->length, - new_node, walk_state); - } - } - - - break; - - - case AML_METHODCALL_OP: - - /* - * Lookup the method name and save the Node - */ - - status = acpi_ns_lookup (walk_state->scope_info, arg->value.string, - ACPI_TYPE_ANY, IMODE_LOAD_PASS2, - NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE, - walk_state, &(new_node)); - - if (ACPI_SUCCESS (status)) { - -/* has name already been resolved by here ??*/ - - /* TBD: [Restructure] Make sure that what we found is indeed a method! */ - /* We didn't search for a method on purpose, to see if the name would resolve! */ - - /* We could put the returned object (Node) on the object stack for later, but - * for now, we will put it in the "op" object that the parser uses, so we - * can get it again at the end of this scope - */ - op->node = new_node; - } - - - break; - - - case AML_PROCESSOR_OP: - - /* Nothing to do other than enter object into namespace */ - - status = acpi_aml_exec_create_processor (op, (ACPI_HANDLE) node); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - break; - - - case AML_POWER_RES_OP: - - /* Nothing to do other than enter object into namespace */ - - status = acpi_aml_exec_create_power_resource (op, (ACPI_HANDLE) node); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - break; - - - case AML_THERMAL_ZONE_OP: - - /* Nothing to do other than enter object into namespace */ - - break; - - - case AML_DEF_FIELD_OP: - - arg = op->value.arg; - - status = acpi_ds_create_field (op, arg->node, walk_state); - break; - - - case AML_INDEX_FIELD_OP: - - arg = op->value.arg; - - status = acpi_ds_create_index_field (op, (ACPI_HANDLE) arg->node, - walk_state); - break; - - - case AML_BANK_FIELD_OP: - - arg = op->value.arg; - status = acpi_ds_create_bank_field (op, arg->node, walk_state); - break; - - - /* - * Method_op Pkg_length Names_string Method_flags Term_list - */ - case AML_METHOD_OP: - - if (!node->object) { - status = acpi_aml_exec_create_method (((ACPI_PARSE2_OBJECT *) op)->data, - ((ACPI_PARSE2_OBJECT *) op)->length, - arg->value.integer, (ACPI_HANDLE) node); - } - - break; - - - case AML_MUTEX_OP: - - status = acpi_ds_create_operands (walk_state, arg); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - status = acpi_aml_exec_create_mutex (walk_state); - break; - - - case AML_EVENT_OP: - - status = acpi_ds_create_operands (walk_state, arg); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - status = acpi_aml_exec_create_event (walk_state); - break; - - - case AML_REGION_OP: - - if (node->object) { - break; - } - - - /* - * The Op_region is not fully parsed at this time. Only valid argument is the Space_id. - * (We must save the address of the AML of the address and length operands) - */ - - status = acpi_aml_exec_create_region (((ACPI_PARSE2_OBJECT *) op)->data, - ((ACPI_PARSE2_OBJECT *) op)->length, - (ACPI_ADDRESS_SPACE_TYPE) arg->value.integer, - walk_state); - - break; - - - /* Namespace Modifier Opcodes */ - - case AML_ALIAS_OP: - - status = acpi_ds_create_operands (walk_state, arg); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - status = acpi_aml_exec_create_alias (walk_state); - break; - - - case AML_NAME_OP: - - /* - * Because of the execution pass through the non-control-method - * parts of the table, we can arrive here twice. Only init - * the named object node the first time through - */ - - if (!node->object) { - status = acpi_ds_create_node (walk_state, node, op); - } - - break; - - - case AML_NAMEPATH_OP: - - break; - - - default: - break; - } - - -cleanup: - - /* Remove the Node pushed at the very beginning */ - - acpi_ds_obj_stack_pop (1, walk_state); - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/dispatcher/dswscope.c b/reactos/drivers/bus/acpi/dispatcher/dswscope.c deleted file mode 100644 index 87bdfd49bce..00000000000 --- a/reactos/drivers/bus/acpi/dispatcher/dswscope.c +++ /dev/null @@ -1,158 +0,0 @@ -/****************************************************************************** - * - * Module Name: dswscope - Scope stack manipulation - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_DISPATCHER - MODULE_NAME ("dswscope") - - -#define STACK_POP(head) head - - -/**************************************************************************** - * - * FUNCTION: Acpi_ds_scope_stack_clear - * - * PARAMETERS: None - * - * DESCRIPTION: Pop (and free) everything on the scope stack except the - * root scope object (which remains at the stack top.) - * - ***************************************************************************/ - -void -acpi_ds_scope_stack_clear ( - ACPI_WALK_STATE *walk_state) -{ - ACPI_GENERIC_STATE *scope_info; - - - while (walk_state->scope_info) { - /* Pop a scope off the stack */ - - scope_info = walk_state->scope_info; - walk_state->scope_info = scope_info->scope.next; - - acpi_cm_delete_generic_state (scope_info); - } -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_ds_scope_stack_push - * - * PARAMETERS: *Node, - Name to be made current - * Type, - Type of frame being pushed - * - * DESCRIPTION: Push the current scope on the scope stack, and make the - * passed Node current. - * - ***************************************************************************/ - -ACPI_STATUS -acpi_ds_scope_stack_push ( - ACPI_NAMESPACE_NODE *node, - OBJECT_TYPE_INTERNAL type, - ACPI_WALK_STATE *walk_state) -{ - ACPI_GENERIC_STATE *scope_info; - - - if (!node) { - /* invalid scope */ - - REPORT_ERROR (("Ds_scope_stack_push: null scope passed\n")); - return (AE_BAD_PARAMETER); - } - - /* Make sure object type is valid */ - - if (!acpi_aml_validate_object_type (type)) { - REPORT_WARNING (("Ds_scope_stack_push: type code out of range\n")); - } - - - /* Allocate a new scope object */ - - scope_info = acpi_cm_create_generic_state (); - if (!scope_info) { - return (AE_NO_MEMORY); - } - - /* Init new scope object */ - - scope_info->scope.node = node; - scope_info->common.value = (u16) type; - - /* Push new scope object onto stack */ - - acpi_cm_push_generic_state (&walk_state->scope_info, scope_info); - - return (AE_OK); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_ds_scope_stack_pop - * - * PARAMETERS: Type - The type of frame to be found - * - * DESCRIPTION: Pop the scope stack until a frame of the requested type - * is found. - * - * RETURN: Count of frames popped. If no frame of the requested type - * was found, the count is returned as a negative number and - * the scope stack is emptied (which sets the current scope - * to the root). If the scope stack was empty at entry, the - * function is a no-op and returns 0. - * - ***************************************************************************/ - -ACPI_STATUS -acpi_ds_scope_stack_pop ( - ACPI_WALK_STATE *walk_state) -{ - ACPI_GENERIC_STATE *scope_info; - - - /* - * Pop scope info object off the stack. - */ - - scope_info = acpi_cm_pop_generic_state (&walk_state->scope_info); - if (!scope_info) { - return (AE_STACK_UNDERFLOW); - } - - acpi_cm_delete_generic_state (scope_info); - - return (AE_OK); -} - - diff --git a/reactos/drivers/bus/acpi/dispatcher/dswstate.c b/reactos/drivers/bus/acpi/dispatcher/dswstate.c deleted file mode 100644 index 80e9933074a..00000000000 --- a/reactos/drivers/bus/acpi/dispatcher/dswstate.c +++ /dev/null @@ -1,872 +0,0 @@ -/****************************************************************************** - * - * Module Name: dswstate - Dispatcher parse tree walk management routines - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_DISPATCHER - MODULE_NAME ("dswstate") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_result_insert - * - * PARAMETERS: Object - Object to push - * Walk_state - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Push an object onto this walk's result stack - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_result_insert ( - void *object, - u32 index, - ACPI_WALK_STATE *walk_state) -{ - ACPI_GENERIC_STATE *state; - - - state = walk_state->results; - if (!state) { - return (AE_NOT_EXIST); - } - - if (index >= OBJ_NUM_OPERANDS) { - return (AE_BAD_PARAMETER); - } - - if (!object) { - return (AE_BAD_PARAMETER); - } - - state->results.obj_desc [index] = object; - state->results.num_results++; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_result_remove - * - * PARAMETERS: Object - Where to return the popped object - * Walk_state - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Pop an object off the bottom of this walk's result stack. In - * other words, this is a FIFO. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_result_remove ( - ACPI_OPERAND_OBJECT **object, - u32 index, - ACPI_WALK_STATE *walk_state) -{ - ACPI_GENERIC_STATE *state; - - - state = walk_state->results; - if (!state) { - return (AE_NOT_EXIST); - } - - - - /* Check for a valid result object */ - - if (!state->results.obj_desc [index]) { - return (AE_AML_NO_RETURN_VALUE); - } - - /* Remove the object */ - - state->results.num_results--; - - *object = state->results.obj_desc [index]; - state->results.obj_desc [index] = NULL; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_result_pop - * - * PARAMETERS: Object - Where to return the popped object - * Walk_state - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Pop an object off the bottom of this walk's result stack. In - * other words, this is a FIFO. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_result_pop ( - ACPI_OPERAND_OBJECT **object, - ACPI_WALK_STATE *walk_state) -{ - u32 index; - ACPI_GENERIC_STATE *state; - - - state = walk_state->results; - if (!state) { - return (AE_OK); - } - - - if (!state->results.num_results) { - return (AE_AML_NO_RETURN_VALUE); - } - - /* Remove top element */ - - state->results.num_results--; - - for (index = OBJ_NUM_OPERANDS; index; index--) { - /* Check for a valid result object */ - - if (state->results.obj_desc [index -1]) { - *object = state->results.obj_desc [index -1]; - state->results.obj_desc [index -1] = NULL; - - return (AE_OK); - } - } - - - return (AE_AML_NO_RETURN_VALUE); -} - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_result_pop_from_bottom - * - * PARAMETERS: Object - Where to return the popped object - * Walk_state - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Pop an object off the bottom of this walk's result stack. In - * other words, this is a FIFO. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_result_pop_from_bottom ( - ACPI_OPERAND_OBJECT **object, - ACPI_WALK_STATE *walk_state) -{ - u32 index; - ACPI_GENERIC_STATE *state; - - - state = walk_state->results; - if (!state) { - return (AE_NOT_EXIST); - } - - - if (!state->results.num_results) { - return (AE_AML_NO_RETURN_VALUE); - } - - /* Remove Bottom element */ - - *object = state->results.obj_desc [0]; - - - /* Push entire stack down one element */ - - for (index = 0; index < state->results.num_results; index++) { - state->results.obj_desc [index] = state->results.obj_desc [index + 1]; - } - - state->results.num_results--; - - /* Check for a valid result object */ - - if (!*object) { - return (AE_AML_NO_RETURN_VALUE); - } - - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_result_push - * - * PARAMETERS: Object - Where to return the popped object - * Walk_state - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Push an object onto the current result stack - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_result_push ( - ACPI_OPERAND_OBJECT *object, - ACPI_WALK_STATE *walk_state) -{ - ACPI_GENERIC_STATE *state; - - - state = walk_state->results; - if (!state) { - return (AE_AML_INTERNAL); - } - - if (state->results.num_results == OBJ_NUM_OPERANDS) { - return (AE_STACK_OVERFLOW); - } - - if (!object) { - return (AE_BAD_PARAMETER); - } - - - state->results.obj_desc [state->results.num_results] = object; - state->results.num_results++; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_result_stack_push - * - * PARAMETERS: Object - Object to push - * Walk_state - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_result_stack_push ( - ACPI_WALK_STATE *walk_state) -{ - ACPI_GENERIC_STATE *state; - - - state = acpi_cm_create_generic_state (); - if (!state) { - return (AE_NO_MEMORY); - } - - acpi_cm_push_generic_state (&walk_state->results, state); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_result_stack_pop - * - * PARAMETERS: Walk_state - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_result_stack_pop ( - ACPI_WALK_STATE *walk_state) -{ - ACPI_GENERIC_STATE *state; - - - /* Check for stack underflow */ - - if (walk_state->results == NULL) { - return (AE_AML_NO_OPERAND); - } - - - state = acpi_cm_pop_generic_state (&walk_state->results); - - acpi_cm_delete_generic_state (state); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_obj_stack_delete_all - * - * PARAMETERS: Walk_state - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Clear the object stack by deleting all objects that are on it. - * Should be used with great care, if at all! - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_obj_stack_delete_all ( - ACPI_WALK_STATE *walk_state) -{ - u32 i; - - - /* The stack size is configurable, but fixed */ - - for (i = 0; i < OBJ_NUM_OPERANDS; i++) { - if (walk_state->operands[i]) { - acpi_cm_remove_reference (walk_state->operands[i]); - walk_state->operands[i] = NULL; - } - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_obj_stack_push - * - * PARAMETERS: Object - Object to push - * Walk_state - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Push an object onto this walk's object/operand stack - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_obj_stack_push ( - void *object, - ACPI_WALK_STATE *walk_state) -{ - - - /* Check for stack overflow */ - - if (walk_state->num_operands >= OBJ_NUM_OPERANDS) { - return (AE_STACK_OVERFLOW); - } - - /* Put the object onto the stack */ - - walk_state->operands [walk_state->num_operands] = object; - walk_state->num_operands++; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_obj_stack_pop_object - * - * PARAMETERS: Pop_count - Number of objects/entries to pop - * Walk_state - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Pop this walk's object stack. Objects on the stack are NOT - * deleted by this routine. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_obj_stack_pop_object ( - ACPI_OPERAND_OBJECT **object, - ACPI_WALK_STATE *walk_state) -{ - - - /* Check for stack underflow */ - - if (walk_state->num_operands == 0) { - return (AE_AML_NO_OPERAND); - } - - - /* Pop the stack */ - - walk_state->num_operands--; - - /* Check for a valid operand */ - - if (!walk_state->operands [walk_state->num_operands]) { - return (AE_AML_NO_OPERAND); - } - - /* Get operand and set stack entry to null */ - - *object = walk_state->operands [walk_state->num_operands]; - walk_state->operands [walk_state->num_operands] = NULL; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_obj_stack_pop - * - * PARAMETERS: Pop_count - Number of objects/entries to pop - * Walk_state - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Pop this walk's object stack. Objects on the stack are NOT - * deleted by this routine. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_obj_stack_pop ( - u32 pop_count, - ACPI_WALK_STATE *walk_state) -{ - u32 i; - - - for (i = 0; i < pop_count; i++) { - /* Check for stack underflow */ - - if (walk_state->num_operands == 0) { - return (AE_STACK_UNDERFLOW); - } - - /* Just set the stack entry to null */ - - walk_state->num_operands--; - walk_state->operands [walk_state->num_operands] = NULL; - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_obj_stack_pop_and_delete - * - * PARAMETERS: Pop_count - Number of objects/entries to pop - * Walk_state - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Pop this walk's object stack and delete each object that is - * popped off. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ds_obj_stack_pop_and_delete ( - u32 pop_count, - ACPI_WALK_STATE *walk_state) -{ - u32 i; - ACPI_OPERAND_OBJECT *obj_desc; - - - for (i = 0; i < pop_count; i++) { - /* Check for stack underflow */ - - if (walk_state->num_operands == 0) { - return (AE_STACK_UNDERFLOW); - } - - /* Pop the stack and delete an object if present in this stack entry */ - - walk_state->num_operands--; - obj_desc = walk_state->operands [walk_state->num_operands]; - if (obj_desc) { - acpi_cm_remove_reference (walk_state->operands [walk_state->num_operands]); - walk_state->operands [walk_state->num_operands] = NULL; - } - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_obj_stack_get_value - * - * PARAMETERS: Index - Stack index whose value is desired. Based - * on the top of the stack (index=0 == top) - * Walk_state - Current Walk state - * - * RETURN: Status - * - * DESCRIPTION: Retrieve an object from this walk's object stack. Index must - * be within the range of the current stack pointer. - * - ******************************************************************************/ - -void * -acpi_ds_obj_stack_get_value ( - u32 index, - ACPI_WALK_STATE *walk_state) -{ - - - /* Can't do it if the stack is empty */ - - if (walk_state->num_operands == 0) { - return (NULL); - } - - /* or if the index is past the top of the stack */ - - if (index > (walk_state->num_operands - (u32) 1)) { - return (NULL); - } - - - return (walk_state->operands[(NATIVE_UINT)(walk_state->num_operands - 1) - - index]); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_get_current_walk_state - * - * PARAMETERS: Walk_list - Get current active state for this walk list - * - * RETURN: Pointer to the current walk state - * - * DESCRIPTION: Get the walk state that is at the head of the list (the "current" - * walk state. - * - ******************************************************************************/ - -ACPI_WALK_STATE * -acpi_ds_get_current_walk_state ( - ACPI_WALK_LIST *walk_list) - -{ - - if (!walk_list) { - return (NULL); - } - - return (walk_list->walk_state); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_push_walk_state - * - * PARAMETERS: Walk_state - State to push - * Walk_list - The list that owns the walk stack - * - * RETURN: None - * - * DESCRIPTION: Place the Walk_state at the head of the state list. - * - ******************************************************************************/ - -static void -acpi_ds_push_walk_state ( - ACPI_WALK_STATE *walk_state, - ACPI_WALK_LIST *walk_list) -{ - - - walk_state->next = walk_list->walk_state; - walk_list->walk_state = walk_state; - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_pop_walk_state - * - * PARAMETERS: Walk_list - The list that owns the walk stack - * - * RETURN: A Walk_state object popped from the stack - * - * DESCRIPTION: Remove and return the walkstate object that is at the head of - * the walk stack for the given walk list. NULL indicates that - * the list is empty. - * - ******************************************************************************/ - -ACPI_WALK_STATE * -acpi_ds_pop_walk_state ( - ACPI_WALK_LIST *walk_list) -{ - ACPI_WALK_STATE *walk_state; - - - walk_state = walk_list->walk_state; - - if (walk_state) { - /* Next walk state becomes the current walk state */ - - walk_list->walk_state = walk_state->next; - - /* - * Don't clear the NEXT field, this serves as an indicator - * that there is a parent WALK STATE - * Walk_state->Next = NULL; - */ - } - - return (walk_state); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_create_walk_state - * - * PARAMETERS: Origin - Starting point for this walk - * Walk_list - Owning walk list - * - * RETURN: Pointer to the new walk state. - * - * DESCRIPTION: Allocate and initialize a new walk state. The current walk state - * is set to this new state. - * - ******************************************************************************/ - -ACPI_WALK_STATE * -acpi_ds_create_walk_state ( - ACPI_OWNER_ID owner_id, - ACPI_PARSE_OBJECT *origin, - ACPI_OPERAND_OBJECT *mth_desc, - ACPI_WALK_LIST *walk_list) -{ - ACPI_WALK_STATE *walk_state; - ACPI_STATUS status; - - - acpi_cm_acquire_mutex (ACPI_MTX_CACHES); - acpi_gbl_walk_state_cache_requests++; - - /* Check the cache first */ - - if (acpi_gbl_walk_state_cache) { - /* There is an object available, use it */ - - walk_state = acpi_gbl_walk_state_cache; - acpi_gbl_walk_state_cache = walk_state->next; - - acpi_gbl_walk_state_cache_hits++; - acpi_gbl_walk_state_cache_depth--; - - acpi_cm_release_mutex (ACPI_MTX_CACHES); - } - - else { - /* The cache is empty, create a new object */ - - /* Avoid deadlock with Acpi_cm_callocate */ - - acpi_cm_release_mutex (ACPI_MTX_CACHES); - - walk_state = acpi_cm_callocate (sizeof (ACPI_WALK_STATE)); - if (!walk_state) { - return (NULL); - } - } - - walk_state->data_type = ACPI_DESC_TYPE_WALK; - walk_state->owner_id = owner_id; - walk_state->origin = origin; - walk_state->method_desc = mth_desc; - walk_state->walk_list = walk_list; - - /* Init the method args/local */ - -#ifndef _ACPI_ASL_COMPILER - acpi_ds_method_data_init (walk_state); -#endif - - /* Create an initial result stack entry */ - - status = acpi_ds_result_stack_push (walk_state); - if (ACPI_FAILURE (status)) { - return (NULL); - } - - - /* Put the new state at the head of the walk list */ - - acpi_ds_push_walk_state (walk_state, walk_list); - - return (walk_state); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ds_delete_walk_state - * - * PARAMETERS: Walk_state - State to delete - * - * RETURN: Status - * - * DESCRIPTION: Delete a walk state including all internal data structures - * - ******************************************************************************/ - -void -acpi_ds_delete_walk_state ( - ACPI_WALK_STATE *walk_state) -{ - ACPI_GENERIC_STATE *state; - - - if (!walk_state) { - return; - } - - if (walk_state->data_type != ACPI_DESC_TYPE_WALK) { - return; - } - - - /* Always must free any linked control states */ - - while (walk_state->control_state) { - state = walk_state->control_state; - walk_state->control_state = state->common.next; - - acpi_cm_delete_generic_state (state); - } - - /* Always must free any linked parse states */ - - while (walk_state->scope_info) { - state = walk_state->scope_info; - walk_state->scope_info = state->common.next; - - acpi_cm_delete_generic_state (state); - } - - /* Always must free any stacked result states */ - - while (walk_state->results) { - state = walk_state->results; - walk_state->results = state->common.next; - - acpi_cm_delete_generic_state (state); - } - - - /* If walk cache is full, just free this wallkstate object */ - - if (acpi_gbl_walk_state_cache_depth >= MAX_WALK_CACHE_DEPTH) { - acpi_cm_free (walk_state); - } - - /* Otherwise put this object back into the cache */ - - else { - acpi_cm_acquire_mutex (ACPI_MTX_CACHES); - - /* Clear the state */ - - MEMSET (walk_state, 0, sizeof (ACPI_WALK_STATE)); - walk_state->data_type = ACPI_DESC_TYPE_WALK; - - /* Put the object at the head of the global cache list */ - - walk_state->next = acpi_gbl_walk_state_cache; - acpi_gbl_walk_state_cache = walk_state; - acpi_gbl_walk_state_cache_depth++; - - - acpi_cm_release_mutex (ACPI_MTX_CACHES); - } - - return; -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ds_delete_walk_state_cache - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Purge the global state object cache. Used during subsystem - * termination. - * - ******************************************************************************/ - -void -acpi_ds_delete_walk_state_cache ( - void) -{ - ACPI_WALK_STATE *next; - - - /* Traverse the global cache list */ - - while (acpi_gbl_walk_state_cache) { - /* Delete one cached state object */ - - next = acpi_gbl_walk_state_cache->next; - acpi_cm_free (acpi_gbl_walk_state_cache); - acpi_gbl_walk_state_cache = next; - acpi_gbl_walk_state_cache_depth--; - } - - return; -} - - diff --git a/reactos/drivers/bus/acpi/events/evevent.c b/reactos/drivers/bus/acpi/events/evevent.c deleted file mode 100644 index 8fafa3c79a9..00000000000 --- a/reactos/drivers/bus/acpi/events/evevent.c +++ /dev/null @@ -1,765 +0,0 @@ -/****************************************************************************** - * - * Module Name: evevent - Fixed and General Purpose Acpi_event - * handling and dispatch - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - -#define _COMPONENT ACPI_EVENTS - MODULE_NAME ("evevent") - - -/************************************************************************** - * - * FUNCTION: Acpi_ev_initialize - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Ensures that the system control interrupt (SCI) is properly - * configured, disables SCI event sources, installs the SCI - * handler - * - *************************************************************************/ - -ACPI_STATUS -acpi_ev_initialize ( - void) -{ - ACPI_STATUS status; - - - /* Make sure we have ACPI tables */ - - if (!acpi_gbl_DSDT) { - return (AE_NO_ACPI_TABLES); - } - - - /* Make sure the BIOS supports ACPI mode */ - - if (SYS_MODE_LEGACY == acpi_hw_get_mode_capabilities()) { - return (AE_ERROR); - } - - - acpi_gbl_original_mode = acpi_hw_get_mode(); - - /* - * Initialize the Fixed and General Purpose Acpi_events prior. This is - * done prior to enabling SCIs to prevent interrupts from occuring - * before handers are installed. - */ - - status = acpi_ev_fixed_event_initialize (); - if (ACPI_FAILURE (status)) { - return (status); - } - - status = acpi_ev_gpe_initialize (); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Install the SCI handler */ - - status = acpi_ev_install_sci_handler (); - if (ACPI_FAILURE (status)) { - return (status); - } - - - /* Install handlers for control method GPE handlers (_Lxx, _Exx) */ - - status = acpi_ev_init_gpe_control_methods (); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Install the handler for the Global Lock */ - - status = acpi_ev_init_global_lock_handler (); - if (ACPI_FAILURE (status)) { - return (status); - } - - - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ev_fixed_event_initialize - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Initialize the Fixed Acpi_event data structures - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ev_fixed_event_initialize(void) -{ - int i = 0; - - /* Initialize the structure that keeps track of fixed event handlers */ - - for (i = 0; i < NUM_FIXED_EVENTS; i++) { - acpi_gbl_fixed_event_handlers[i].handler = NULL; - acpi_gbl_fixed_event_handlers[i].context = NULL; - } - - acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, TMR_EN, 0); - acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, GBL_EN, 0); - acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, PWRBTN_EN, 0); - acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, SLPBTN_EN, 0); - acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, RTC_EN, 0); - - return (AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ev_fixed_event_detect - * - * PARAMETERS: None - * - * RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED - * - * DESCRIPTION: Checks the PM status register for fixed events - * - ******************************************************************************/ - -u32 -acpi_ev_fixed_event_detect(void) -{ - u32 int_status = INTERRUPT_NOT_HANDLED; - u32 status_register; - u32 enable_register; - - /* - * Read the fixed feature status and enable registers, as all the cases - * depend on their values. - */ - - status_register = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM1_STS); - enable_register = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM1_EN); - - - /* power management timer roll over */ - - if ((status_register & ACPI_STATUS_PMTIMER) && - (enable_register & ACPI_ENABLE_PMTIMER)) { - int_status |= acpi_ev_fixed_event_dispatch (ACPI_EVENT_PMTIMER); - } - - /* global event (BIOS want's the global lock) */ - - if ((status_register & ACPI_STATUS_GLOBAL) && - (enable_register & ACPI_ENABLE_GLOBAL)) { - int_status |= acpi_ev_fixed_event_dispatch (ACPI_EVENT_GLOBAL); - } - - /* power button event */ - - if ((status_register & ACPI_STATUS_POWER_BUTTON) && - (enable_register & ACPI_ENABLE_POWER_BUTTON)) { - int_status |= acpi_ev_fixed_event_dispatch (ACPI_EVENT_POWER_BUTTON); - } - - /* sleep button event */ - - if ((status_register & ACPI_STATUS_SLEEP_BUTTON) && - (enable_register & ACPI_ENABLE_SLEEP_BUTTON)) { - int_status |= acpi_ev_fixed_event_dispatch (ACPI_EVENT_SLEEP_BUTTON); - } - - return (int_status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ev_fixed_event_dispatch - * - * PARAMETERS: Event - Event type - * - * RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED - * - * DESCRIPTION: Clears the status bit for the requested event, calls the - * handler that previously registered for the event. - * - ******************************************************************************/ - -u32 -acpi_ev_fixed_event_dispatch ( - u32 event) -{ - u32 register_id; - - /* Clear the status bit */ - - switch (event) { - case ACPI_EVENT_PMTIMER: - register_id = TMR_STS; - break; - - case ACPI_EVENT_GLOBAL: - register_id = GBL_STS; - break; - - case ACPI_EVENT_POWER_BUTTON: - register_id = PWRBTN_STS; - break; - - case ACPI_EVENT_SLEEP_BUTTON: - register_id = SLPBTN_STS; - break; - - case ACPI_EVENT_RTC: - register_id = RTC_STS; - break; - - default: - return 0; - break; - } - - acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_DO_NOT_LOCK, register_id, 1); - - /* - * Make sure we've got a handler. If not, report an error. - * The event is disabled to prevent further interrupts. - */ - if (NULL == acpi_gbl_fixed_event_handlers[event].handler) { - register_id = (PM1_EN | REGISTER_BIT_ID(register_id)); - - acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_DO_NOT_LOCK, - register_id, 0); - - REPORT_ERROR ( - ("Ev_gpe_dispatch: No installed handler for fixed event [%08X]\n", - event)); - - return (INTERRUPT_NOT_HANDLED); - } - - /* Invoke the handler */ - - return ((acpi_gbl_fixed_event_handlers[event].handler)( - acpi_gbl_fixed_event_handlers[event].context)); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ev_gpe_initialize - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Initialize the GPE data structures - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ev_gpe_initialize (void) -{ - u32 i; - u32 j; - u32 register_index; - u32 gpe_number; - u16 gpe0register_count; - u16 gpe1_register_count; - - - /* - * Set up various GPE counts - * - * You may ask,why are the GPE register block lengths divided by 2? - * From the ACPI 2.0 Spec, section, 4.7.1.6 General-Purpose Event - * Registers, we have, - * - * "Each register block contains two registers of equal length - * GPEx_STS and GPEx_EN (where x is 0 or 1). The length of the - * GPE0_STS and GPE0_EN registers is equal to half the GPE0_LEN - * The length of the GPE1_STS and GPE1_EN registers is equal to - * half the GPE1_LEN. If a generic register block is not supported - * then its respective block pointer and block length values in the - * FADT table contain zeros. The GPE0_LEN and GPE1_LEN do not need - * to be the same size." - */ - - gpe0register_count = (u16) DIV_2 (acpi_gbl_FADT->gpe0blk_len); - gpe1_register_count = (u16) DIV_2 (acpi_gbl_FADT->gpe1_blk_len); - acpi_gbl_gpe_register_count = gpe0register_count + gpe1_register_count; - - if (!acpi_gbl_gpe_register_count) { - REPORT_WARNING (("Zero GPEs are defined in the FADT\n")); - return (AE_OK); - } - - /* - * Allocate the Gpe information block - */ - - acpi_gbl_gpe_registers = acpi_cm_callocate (acpi_gbl_gpe_register_count * - sizeof (ACPI_GPE_REGISTERS)); - if (!acpi_gbl_gpe_registers) { - return (AE_NO_MEMORY); - } - - /* - * Allocate the Gpe dispatch handler block - * There are eight distinct GP events per register. - * Initialization to zeros is sufficient - */ - - acpi_gbl_gpe_info = acpi_cm_callocate (MUL_8 (acpi_gbl_gpe_register_count) * - sizeof (ACPI_GPE_LEVEL_INFO)); - if (!acpi_gbl_gpe_info) { - acpi_cm_free (acpi_gbl_gpe_registers); - return (AE_NO_MEMORY); - } - - /* Set the Gpe validation table to GPE_INVALID */ - - MEMSET (acpi_gbl_gpe_valid, (int) ACPI_GPE_INVALID, NUM_GPE); - - /* - * Initialize the Gpe information and validation blocks. A goal of these - * blocks is to hide the fact that there are two separate GPE register sets - * In a given block, the status registers occupy the first half, and - * the enable registers occupy the second half. - */ - - /* GPE Block 0 */ - - register_index = 0; - - for (i = 0; i < gpe0register_count; i++) { - acpi_gbl_gpe_registers[register_index].status_addr = - (u16) (ACPI_GET_ADDRESS (acpi_gbl_FADT->Xgpe0blk.address) + i); - - acpi_gbl_gpe_registers[register_index].enable_addr = - (u16) (ACPI_GET_ADDRESS (acpi_gbl_FADT->Xgpe0blk.address) + i + gpe0register_count); - - acpi_gbl_gpe_registers[register_index].gpe_base = (u8) MUL_8 (i); - - for (j = 0; j < 8; j++) { - gpe_number = acpi_gbl_gpe_registers[register_index].gpe_base + j; - acpi_gbl_gpe_valid[gpe_number] = (u8) register_index; - } - - /* - * Clear the status/enable registers. Note that status registers - * are cleared by writing a '1', while enable registers are cleared - * by writing a '0'. - */ - acpi_os_out8 (acpi_gbl_gpe_registers[register_index].enable_addr, 0x00); - acpi_os_out8 (acpi_gbl_gpe_registers[register_index].status_addr, 0xFF); - - register_index++; - } - - /* GPE Block 1 */ - - for (i = 0; i < gpe1_register_count; i++) { - acpi_gbl_gpe_registers[register_index].status_addr = - (u16) (ACPI_GET_ADDRESS (acpi_gbl_FADT->Xgpe1_blk.address) + i); - - acpi_gbl_gpe_registers[register_index].enable_addr = - (u16) (ACPI_GET_ADDRESS (acpi_gbl_FADT->Xgpe1_blk.address) + i + gpe1_register_count); - - acpi_gbl_gpe_registers[register_index].gpe_base = - (u8) (acpi_gbl_FADT->gpe1_base + MUL_8 (i)); - - for (j = 0; j < 8; j++) { - gpe_number = acpi_gbl_gpe_registers[register_index].gpe_base + j; - acpi_gbl_gpe_valid[gpe_number] = (u8) register_index; - } - - /* - * Clear the status/enable registers. Note that status registers - * are cleared by writing a '1', while enable registers are cleared - * by writing a '0'. - */ - acpi_os_out8 (acpi_gbl_gpe_registers[register_index].enable_addr, 0x00); - acpi_os_out8 (acpi_gbl_gpe_registers[register_index].status_addr, 0xFF); - - register_index++; - } - - return (AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ev_save_method_info - * - * PARAMETERS: None - * - * RETURN: None - * - * DESCRIPTION: Called from Acpi_walk_namespace. Expects each object to be a - * control method under the _GPE portion of the namespace. - * Extract the name and GPE type from the object, saving this - * information for quick lookup during GPE dispatch - * - * The name of each GPE control method is of the form: - * "_Lnn" or "_Enn" - * Where: - * L - means that the GPE is level triggered - * E - means that the GPE is edge triggered - * nn - is the GPE number - * - ******************************************************************************/ - -static ACPI_STATUS -acpi_ev_save_method_info ( - ACPI_HANDLE obj_handle, - u32 level, - void *obj_desc, - void **return_value) -{ - u32 gpe_number; - NATIVE_CHAR name[ACPI_NAME_SIZE + 1]; - u8 type; - - - /* Extract the name from the object and convert to a string */ - - MOVE_UNALIGNED32_TO_32 (name, &((ACPI_NAMESPACE_NODE *) obj_handle)->name); - name[ACPI_NAME_SIZE] = 0; - - /* - * Edge/Level determination is based on the 2nd s8 of the method name - */ - if (name[1] == 'L') { - type = ACPI_EVENT_LEVEL_TRIGGERED; - } - else if (name[1] == 'E') { - type = ACPI_EVENT_EDGE_TRIGGERED; - } - else { - /* Unknown method type, just ignore it! */ - - return (AE_OK); - } - - /* Convert the last two characters of the name to the Gpe Number */ - - gpe_number = STRTOUL (&name[2], NULL, 16); - if (gpe_number == ACPI_UINT32_MAX) { - /* Conversion failed; invalid method, just ignore it */ - - return (AE_OK); - } - - /* Ensure that we have a valid GPE number */ - - if (acpi_gbl_gpe_valid[gpe_number] == ACPI_GPE_INVALID) { - /* Not valid, all we can do here is ignore it */ - - return (AE_OK); - } - - /* - * Now we can add this information to the Gpe_info block - * for use during dispatch of this GPE. - */ - - acpi_gbl_gpe_info [gpe_number].type = type; - acpi_gbl_gpe_info [gpe_number].method_handle = obj_handle; - - - /* - * Enable the GPE (SCIs should be disabled at this point) - */ - - acpi_hw_enable_gpe (gpe_number); - - return (AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ev_init_gpe_control_methods - * - * PARAMETERS: None - * - * RETURN: None - * - * DESCRIPTION: Obtain the control methods associated with the GPEs. - * - * NOTE: Must be called AFTER namespace initialization! - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ev_init_gpe_control_methods (void) -{ - ACPI_STATUS status; - - - /* Get a permanent handle to the _GPE object */ - - status = acpi_get_handle (NULL, "\\_GPE", &acpi_gbl_gpe_obj_handle); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Traverse the namespace under \_GPE to find all methods there */ - - status = acpi_walk_namespace (ACPI_TYPE_METHOD, acpi_gbl_gpe_obj_handle, - ACPI_UINT32_MAX, acpi_ev_save_method_info, - NULL, NULL); - - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ev_gpe_detect - * - * PARAMETERS: None - * - * RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED - * - * DESCRIPTION: Detect if any GP events have occurred - * - ******************************************************************************/ - -u32 -acpi_ev_gpe_detect (void) -{ - u32 int_status = INTERRUPT_NOT_HANDLED; - u32 i; - u32 j; - u8 enabled_status_byte; - u8 bit_mask; - - - /* - * Read all of the 8-bit GPE status and enable registers - * in both of the register blocks, saving all of it. - * Find all currently active GP events. - */ - - for (i = 0; i < acpi_gbl_gpe_register_count; i++) { - acpi_gbl_gpe_registers[i].status = - acpi_os_in8 (acpi_gbl_gpe_registers[i].status_addr); - - acpi_gbl_gpe_registers[i].enable = - acpi_os_in8 (acpi_gbl_gpe_registers[i].enable_addr); - - /* First check if there is anything active at all in this register */ - - enabled_status_byte = (u8) (acpi_gbl_gpe_registers[i].status & - acpi_gbl_gpe_registers[i].enable); - - if (!enabled_status_byte) { - /* No active GPEs in this register, move on */ - - continue; - } - - /* Now look at the individual GPEs in this byte register */ - - for (j = 0, bit_mask = 1; j < 8; j++, bit_mask <<= 1) { - /* Examine one GPE bit */ - - if (enabled_status_byte & bit_mask) { - /* - * Found an active GPE. Dispatch the event to a handler - * or method. - */ - int_status |= - acpi_ev_gpe_dispatch (acpi_gbl_gpe_registers[i].gpe_base + j); - } - } - } - - return (int_status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ev_asynch_execute_gpe_method - * - * PARAMETERS: Gpe_number - The 0-based Gpe number - * - * RETURN: None - * - * DESCRIPTION: Perform the actual execution of a GPE control method. This - * function is called from an invocation of Acpi_os_queue_for_execution - * (and therefore does NOT execute at interrupt level) so that - * the control method itself is not executed in the context of - * the SCI interrupt handler. - * - ******************************************************************************/ - -static void -acpi_ev_asynch_execute_gpe_method ( - void *context) -{ - NATIVE_UINT gpe_number = (NATIVE_UINT) context; - ACPI_GPE_LEVEL_INFO gpe_info; - - - /* - * Take a snapshot of the GPE info for this level - */ - acpi_cm_acquire_mutex (ACPI_MTX_EVENTS); - gpe_info = acpi_gbl_gpe_info [gpe_number]; - acpi_cm_release_mutex (ACPI_MTX_EVENTS); - - /* - * Method Handler (_Lxx, _Exx): - * ---------------------------- - * Evaluate the _Lxx/_Exx control method that corresponds to this GPE. - */ - if (gpe_info.method_handle) { - acpi_ns_evaluate_by_handle (gpe_info.method_handle, NULL, NULL); - } - - /* - * Level-Triggered? - * ---------------- - * If level-triggered we clear the GPE status bit after handling the event. - */ - if (gpe_info.type & ACPI_EVENT_LEVEL_TRIGGERED) { - acpi_hw_clear_gpe (gpe_number); - } - - /* - * Enable the GPE. - */ - acpi_hw_enable_gpe (gpe_number); - - return; -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ev_gpe_dispatch - * - * PARAMETERS: Gpe_number - The 0-based Gpe number - * - * RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED - * - * DESCRIPTION: Handle and dispatch a General Purpose Acpi_event. - * Clears the status bit for the requested event. - * - * TBD: [Investigate] is this still valid or necessary: - * The Gpe handler differs from the fixed events in that it clears the enable - * bit rather than the status bit to clear the interrupt. This allows - * software outside of interrupt context to determine what caused the SCI and - * dispatch the correct AML. - * - ******************************************************************************/ - -u32 -acpi_ev_gpe_dispatch ( - u32 gpe_number) -{ - ACPI_GPE_LEVEL_INFO gpe_info; - - /* - * Valid GPE number? - */ - if (acpi_gbl_gpe_valid[gpe_number] == ACPI_GPE_INVALID) { - return (INTERRUPT_NOT_HANDLED); - } - - /* - * Disable the GPE. - */ - acpi_hw_disable_gpe (gpe_number); - - gpe_info = acpi_gbl_gpe_info [gpe_number]; - - /* - * Edge-Triggered? - * --------------- - * If edge-triggered, clear the GPE status bit now. Note that - * level-triggered events are cleared after the GPE is serviced. - */ - if (gpe_info.type & ACPI_EVENT_EDGE_TRIGGERED) { - acpi_hw_clear_gpe (gpe_number); - } - /* - * Function Handler (e.g. EC)? - */ - if (gpe_info.handler) { - /* Invoke function handler (at interrupt level). */ - gpe_info.handler (gpe_info.context); - - /* Level-Triggered? */ - if (gpe_info.type & ACPI_EVENT_LEVEL_TRIGGERED) { - acpi_hw_clear_gpe (gpe_number); - } - - /* Enable GPE */ - acpi_hw_enable_gpe (gpe_number); - } - /* - * Method Handler (e.g. _Exx/_Lxx)? - */ - else if (gpe_info.method_handle) { - if (ACPI_FAILURE(acpi_os_queue_for_execution (OSD_PRIORITY_GPE, - acpi_ev_asynch_execute_gpe_method, (void*)(NATIVE_UINT)gpe_number))) { - /* - * Shoudn't occur, but if it does report an error. Note that - * the GPE will remain disabled until the ACPI Core Subsystem - * is restarted, or the handler is removed/reinstalled. - */ - REPORT_ERROR (("Acpi_ev_gpe_dispatch: Unable to queue handler for GPE bit [%X]\n", gpe_number)); - } - } - /* - * No Handler? Report an error and leave the GPE disabled. - */ - else { - REPORT_ERROR (("Acpi_ev_gpe_dispatch: No installed handler for GPE [%X]\n", gpe_number)); - - /* Level-Triggered? */ - if (gpe_info.type & ACPI_EVENT_LEVEL_TRIGGERED) { - acpi_hw_clear_gpe (gpe_number); - } - } - - return (INTERRUPT_HANDLED); -} diff --git a/reactos/drivers/bus/acpi/events/evmisc.c b/reactos/drivers/bus/acpi/events/evmisc.c deleted file mode 100644 index 7d137d1d48a..00000000000 --- a/reactos/drivers/bus/acpi/events/evmisc.c +++ /dev/null @@ -1,439 +0,0 @@ -/****************************************************************************** - * - * Module Name: evmisc - ACPI device notification handler dispatch - * and ACPI Global Lock support - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - -#define _COMPONENT ACPI_EVENTS - MODULE_NAME ("evmisc") - - -/************************************************************************** - * - * FUNCTION: Acpi_ev_queue_notify_request - * - * PARAMETERS: - * - * RETURN: None. - * - * DESCRIPTION: Dispatch a device notification event to a previously - * installed handler. - * - *************************************************************************/ - -ACPI_STATUS -acpi_ev_queue_notify_request ( - ACPI_NAMESPACE_NODE *node, - u32 notify_value) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_OPERAND_OBJECT *handler_obj = NULL; - ACPI_GENERIC_STATE *notify_info; - ACPI_STATUS status = AE_OK; - - - /* - * For value 1 (Ejection Request), some device method may need to be run. - * For value 2 (Device Wake) if _PRW exists, the _PS0 method may need to be run. - * For value 0x80 (Status Change) on the power button or sleep button, - * initiate soft-off or sleep operation? - */ - - switch (notify_value) { - case 0: - break; - - case 1: - break; - - case 2: - break; - - case 0x80: - break; - - default: - break; - } - - - /* - * Get the notify object attached to the device Node - */ - - obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) node); - if (obj_desc) { - - /* We have the notify object, Get the right handler */ - - switch (node->type) { - case ACPI_TYPE_DEVICE: - if (notify_value <= MAX_SYS_NOTIFY) { - handler_obj = obj_desc->device.sys_handler; - } - else { - handler_obj = obj_desc->device.drv_handler; - } - break; - - case ACPI_TYPE_THERMAL: - if (notify_value <= MAX_SYS_NOTIFY) { - handler_obj = obj_desc->thermal_zone.sys_handler; - } - else { - handler_obj = obj_desc->thermal_zone.drv_handler; - } - break; - } - } - - - /* If there is any handler to run, schedule the dispatcher */ - - if ((acpi_gbl_sys_notify.handler && (notify_value <= MAX_SYS_NOTIFY)) || - (acpi_gbl_drv_notify.handler && (notify_value > MAX_SYS_NOTIFY)) || - handler_obj) { - - notify_info = acpi_cm_create_generic_state (); - if (!notify_info) { - return (AE_NO_MEMORY); - } - - notify_info->notify.node = node; - notify_info->notify.value = (u16) notify_value; - notify_info->notify.handler_obj = handler_obj; - - status = acpi_os_queue_for_execution (OSD_PRIORITY_HIGH, - acpi_ev_notify_dispatch, notify_info); - if (ACPI_FAILURE (status)) { - acpi_cm_delete_generic_state (notify_info); - } - } - - if (!handler_obj) { - /* There is no per-device notify handler for this device */ - - } - - - return (status); -} - - -/************************************************************************** - * - * FUNCTION: Acpi_ev_notify_dispatch - * - * PARAMETERS: - * - * RETURN: None. - * - * DESCRIPTION: Dispatch a device notification event to a previously - * installed handler. - * - *************************************************************************/ - -void -acpi_ev_notify_dispatch ( - void *context) -{ - ACPI_GENERIC_STATE *notify_info = (ACPI_GENERIC_STATE *) context; - NOTIFY_HANDLER global_handler = NULL; - void *global_context = NULL; - ACPI_OPERAND_OBJECT *handler_obj; - - - /* - * We will invoke a global notify handler if installed. - * This is done _before_ we invoke the per-device handler attached to the device. - */ - - if (notify_info->notify.value <= MAX_SYS_NOTIFY) { - /* Global system notification handler */ - - if (acpi_gbl_sys_notify.handler) { - global_handler = acpi_gbl_sys_notify.handler; - global_context = acpi_gbl_sys_notify.context; - } - } - - else { - /* Global driver notification handler */ - - if (acpi_gbl_drv_notify.handler) { - global_handler = acpi_gbl_drv_notify.handler; - global_context = acpi_gbl_drv_notify.context; - } - } - - - /* Invoke the system handler first, if present */ - - if (global_handler) { - global_handler (notify_info->notify.node, notify_info->notify.value, global_context); - } - - /* Now invoke the per-device handler, if present */ - - handler_obj = notify_info->notify.handler_obj; - if (handler_obj) { - handler_obj->notify_handler.handler (notify_info->notify.node, notify_info->notify.value, - handler_obj->notify_handler.context); - } - - - /* All done with the info object */ - - acpi_cm_delete_generic_state (notify_info); -} - - -/*************************************************************************** - * - * FUNCTION: Acpi_ev_global_lock_thread - * - * RETURN: None - * - * DESCRIPTION: Invoked by SCI interrupt handler upon acquisition of the - * Global Lock. Simply signal all threads that are waiting - * for the lock. - * - **************************************************************************/ - -static void -acpi_ev_global_lock_thread ( - void *context) -{ - - /* Signal threads that are waiting for the lock */ - - if (acpi_gbl_global_lock_thread_count) { - /* Send sufficient units to the semaphore */ - - acpi_os_signal_semaphore (acpi_gbl_global_lock_semaphore, - acpi_gbl_global_lock_thread_count); - } -} - - -/*************************************************************************** - * - * FUNCTION: Acpi_ev_global_lock_handler - * - * RETURN: Status - * - * DESCRIPTION: Invoked directly from the SCI handler when a global lock - * release interrupt occurs. Grab the global lock and queue - * the global lock thread for execution - * - **************************************************************************/ - -static u32 -acpi_ev_global_lock_handler ( - void *context) -{ - u8 acquired = FALSE; - void *global_lock; - - - /* - * Attempt to get the lock - * If we don't get it now, it will be marked pending and we will - * take another interrupt when it becomes free. - */ - - global_lock = acpi_gbl_FACS->global_lock; - ACPI_ACQUIRE_GLOBAL_LOCK (global_lock, acquired); - if (acquired) { - /* Got the lock, now wake all threads waiting for it */ - - acpi_gbl_global_lock_acquired = TRUE; - - /* Run the Global Lock thread which will signal all waiting threads */ - - acpi_os_queue_for_execution (OSD_PRIORITY_HIGH, acpi_ev_global_lock_thread, - context); - } - - return (INTERRUPT_HANDLED); -} - - -/*************************************************************************** - * - * FUNCTION: Acpi_ev_init_global_lock_handler - * - * RETURN: Status - * - * DESCRIPTION: Install a handler for the global lock release event - * - **************************************************************************/ - -ACPI_STATUS -acpi_ev_init_global_lock_handler (void) -{ - ACPI_STATUS status; - - - acpi_gbl_global_lock_present = TRUE; - status = acpi_install_fixed_event_handler (ACPI_EVENT_GLOBAL, - acpi_ev_global_lock_handler, NULL); - - /* - * If the global lock does not exist on this platform, the attempt - * to enable GBL_STS will fail (the GBL_EN bit will not stick) - * Map to AE_OK, but mark global lock as not present. - * Any attempt to actually use the global lock will be flagged - * with an error. - */ - if (status == AE_NO_HARDWARE_RESPONSE) { - acpi_gbl_global_lock_present = FALSE; - status = AE_OK; - } - - return (status); -} - - -/*************************************************************************** - * - * FUNCTION: Acpi_ev_acquire_global_lock - * - * RETURN: Status - * - * DESCRIPTION: Attempt to gain ownership of the Global Lock. - * - **************************************************************************/ - -ACPI_STATUS -acpi_ev_acquire_global_lock(void) -{ - ACPI_STATUS status = AE_OK; - u8 acquired = FALSE; - void *global_lock; - - - /* Make sure that we actually have a global lock */ - - if (!acpi_gbl_global_lock_present) { - return (AE_NO_GLOBAL_LOCK); - } - - /* One more thread wants the global lock */ - - acpi_gbl_global_lock_thread_count++; - - - /* If we (OS side) have the hardware lock already, we are done */ - - if (acpi_gbl_global_lock_acquired) { - return (AE_OK); - } - - /* Only if the FACS is valid */ - - if (!acpi_gbl_FACS) { - return (AE_OK); - } - - - /* We must acquire the actual hardware lock */ - - global_lock = acpi_gbl_FACS->global_lock; - ACPI_ACQUIRE_GLOBAL_LOCK (global_lock, acquired); - if (acquired) { - /* We got the lock */ - - acpi_gbl_global_lock_acquired = TRUE; - - return (AE_OK); - } - - - /* - * Did not get the lock. The pending bit was set above, and we must now - * wait until we get the global lock released interrupt. - */ - - /* - * Acquire the global lock semaphore first. - * Since this wait will block, we must release the interpreter - */ - - status = acpi_aml_system_wait_semaphore (acpi_gbl_global_lock_semaphore, - ACPI_UINT32_MAX); - - return (status); -} - - -/*************************************************************************** - * - * FUNCTION: Acpi_ev_release_global_lock - * - * DESCRIPTION: Releases ownership of the Global Lock. - * - **************************************************************************/ - -void -acpi_ev_release_global_lock (void) -{ - u8 pending = FALSE; - void *global_lock; - - - if (!acpi_gbl_global_lock_thread_count) { - REPORT_WARNING(("Global Lock has not be acquired, cannot release\n")); - return; - } - - /* One fewer thread has the global lock */ - - acpi_gbl_global_lock_thread_count--; - - /* Have all threads released the lock? */ - - if (!acpi_gbl_global_lock_thread_count) { - /* - * No more threads holding lock, we can do the actual hardware - * release - */ - - global_lock = acpi_gbl_FACS->global_lock; - ACPI_RELEASE_GLOBAL_LOCK (global_lock, pending); - acpi_gbl_global_lock_acquired = FALSE; - - /* - * If the pending bit was set, we must write GBL_RLS to the control - * register - */ - if (pending) { - acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, - GBL_RLS, 1); - } - } - - return; -} diff --git a/reactos/drivers/bus/acpi/events/evregion.c b/reactos/drivers/bus/acpi/events/evregion.c deleted file mode 100644 index 61bb39269b4..00000000000 --- a/reactos/drivers/bus/acpi/events/evregion.c +++ /dev/null @@ -1,602 +0,0 @@ -/****************************************************************************** - * - * Module Name: evregion - ACPI Address_space (Op_region) handler dispatch - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_EVENTS - MODULE_NAME ("evregion") - - -/************************************************************************** - * - * FUNCTION: Acpi_ev_install_default_address_space_handlers - * - * PARAMETERS: - * - * RETURN: Status - * - * DESCRIPTION: Installs the core subsystem address space handlers. - * - *************************************************************************/ - -ACPI_STATUS -acpi_ev_install_default_address_space_handlers ( - void) -{ - ACPI_STATUS status; - - - /* - * All address spaces (PCI Config, EC, SMBus) are scope dependent - * and registration must occur for a specific device. In the case - * system memory and IO address spaces there is currently no device - * associated with the address space. For these we use the root. - * We install the default PCI config space handler at the root so - * that this space is immediately available even though the we have - * not enumerated all the PCI Root Buses yet. This is to conform - * to the ACPI specification which states that the PCI config - * space must be always available -- even though we are nowhere - * near ready to find the PCI root buses at this point. - * - * NOTE: We ignore AE_EXIST because this means that a handler has - * already been installed (via Acpi_install_address_space_handler) - */ - - status = acpi_install_address_space_handler (acpi_gbl_root_node, - ADDRESS_SPACE_SYSTEM_MEMORY, - ACPI_DEFAULT_HANDLER, NULL, NULL); - if ((ACPI_FAILURE (status)) && - (status != AE_EXIST)) { - return (status); - } - - status = acpi_install_address_space_handler (acpi_gbl_root_node, - ADDRESS_SPACE_SYSTEM_IO, - ACPI_DEFAULT_HANDLER, NULL, NULL); - if ((ACPI_FAILURE (status)) && - (status != AE_EXIST)) { - return (status); - } - - status = acpi_install_address_space_handler (acpi_gbl_root_node, - ADDRESS_SPACE_PCI_CONFIG, - ACPI_DEFAULT_HANDLER, NULL, NULL); - if ((ACPI_FAILURE (status)) && - (status != AE_EXIST)) { - return (status); - } - - - return (AE_OK); -} - - -/* TBD: [Restructure] Move elsewhere */ - -/************************************************************************** - * - * FUNCTION: Acpi_ev_execute_reg_method - * - * PARAMETERS: Region_obj - Object structure - * Function - On (1) or Off (0) - * - * RETURN: Status - * - * DESCRIPTION: Execute _REG method for a region - * - *************************************************************************/ - -static ACPI_STATUS -acpi_ev_execute_reg_method ( - ACPI_OPERAND_OBJECT *region_obj, - u32 function) -{ - ACPI_OPERAND_OBJECT *params[3]; - ACPI_OPERAND_OBJECT space_id_desc; - ACPI_OPERAND_OBJECT function_desc; - ACPI_STATUS status; - - - if (region_obj->region.extra->extra.method_REG == NULL) { - return (AE_OK); - } - - /* - * _REG method has two arguments - * Arg0: Integer: Operation region space ID - * Same value as Region_obj->Region.Space_id - * Arg1: Integer: connection status - * 1 for connecting the handler, - * 0 for disconnecting the handler - * Passed as a parameter - */ - - acpi_cm_init_static_object (&space_id_desc); - acpi_cm_init_static_object (&function_desc); - - /* - * Method requires two parameters. - */ - params [0] = &space_id_desc; - params [1] = &function_desc; - params [2] = NULL; - - /* - * Set up the parameter objects - */ - space_id_desc.common.type = ACPI_TYPE_INTEGER; - space_id_desc.integer.value = region_obj->region.space_id; - - function_desc.common.type = ACPI_TYPE_INTEGER; - function_desc.integer.value = function; - - /* - * Execute the method, no return value - */ - status = acpi_ns_evaluate_by_handle (region_obj->region.extra->extra.method_REG, params, NULL); - return (status); -} - - -/************************************************************************** - * - * FUNCTION: Acpi_ev_address_space_dispatch - * - * PARAMETERS: Region_obj - internal region object - * Space_id - ID of the address space (0-255) - * Function - Read or Write operation - * Address - Where in the space to read or write - * Bit_width - Field width in bits (8, 16, or 32) - * Value - Pointer to in or out value - * - * RETURN: Status - * - * DESCRIPTION: Dispatch an address space or operation region access to - * a previously installed handler. - * - *************************************************************************/ - -ACPI_STATUS -acpi_ev_address_space_dispatch ( - ACPI_OPERAND_OBJECT *region_obj, - u32 function, - ACPI_PHYSICAL_ADDRESS address, - u32 bit_width, - u32 *value) -{ - ACPI_STATUS status; - ADDRESS_SPACE_HANDLER handler; - ADDRESS_SPACE_SETUP region_setup; - ACPI_OPERAND_OBJECT *handler_desc; - void *region_context = NULL; - - - /* - * Ensure that there is a handler associated with this region - */ - handler_desc = region_obj->region.addr_handler; - if (!handler_desc) { - return(AE_NOT_EXIST); - } - - /* - * It may be the case that the region has never been initialized - * Some types of regions require special init code - */ - if (!(region_obj->region.flags & AOPOBJ_INITIALIZED)) { - /* - * This region has not been initialized yet, do it - */ - region_setup = handler_desc->addr_handler.setup; - if (!region_setup) { - /* - * Bad news, no init routine and not init'd - */ - return (AE_UNKNOWN_STATUS); - } - - /* - * We must exit the interpreter because the region setup will potentially - * execute control methods - */ - acpi_aml_exit_interpreter (); - - status = region_setup (region_obj, ACPI_REGION_ACTIVATE, - handler_desc->addr_handler.context, - ®ion_context); - - /* Re-enter the interpreter */ - - acpi_aml_enter_interpreter (); - - /* - * Init routine may fail - */ - if (ACPI_FAILURE (status)) { - return(status); - } - - region_obj->region.flags |= AOPOBJ_INITIALIZED; - - /* - * Save the returned context for use in all accesses to - * this particular region. - */ - region_obj->region.extra->extra.region_context = region_context; - } - - /* - * We have everything we need, begin the process - */ - handler = handler_desc->addr_handler.handler; - - if (!(handler_desc->addr_handler.flags & ADDR_HANDLER_DEFAULT_INSTALLED)) { - /* - * For handlers other than the default (supplied) handlers, we must - * exit the interpreter because the handler *might* block -- we don't - * know what it will do, so we can't hold the lock on the intepreter. - */ - acpi_aml_exit_interpreter(); - } - - /* - * Invoke the handler. - */ - status = handler (function, address, bit_width, value, - handler_desc->addr_handler.context, - region_obj->region.extra->extra.region_context); - - - if (!(handler_desc->addr_handler.flags & ADDR_HANDLER_DEFAULT_INSTALLED)) { - /* We just returned from a non-default handler, we must re-enter the - interpreter */ - - acpi_aml_enter_interpreter (); - } - - return (status); -} - -/****************************************************************************** - * - * FUNCTION: Acpi_ev_disassociate_region_from_handler - * - * PARAMETERS: Region_obj - Region Object - * Acpi_ns_is_locked - Namespace Region Already Locked? - * - * RETURN: None - * - * DESCRIPTION: Break the association between the handler and the region - * this is a two way association. - * - ******************************************************************************/ - -void -acpi_ev_disassociate_region_from_handler( - ACPI_OPERAND_OBJECT *region_obj, - u8 acpi_ns_is_locked) -{ - ACPI_OPERAND_OBJECT *handler_obj; - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_OPERAND_OBJECT **last_obj_ptr; - ADDRESS_SPACE_SETUP region_setup; - void *region_context; - ACPI_STATUS status; - - - region_context = region_obj->region.extra->extra.region_context; - - /* - * Get the address handler from the region object - */ - - handler_obj = region_obj->region.addr_handler; - if (!handler_obj) { - /* - * This region has no handler, all done - */ - return; - } - - - /* - * Find this region in the handler's list - */ - - obj_desc = handler_obj->addr_handler.region_list; - last_obj_ptr = &handler_obj->addr_handler.region_list; - - while (obj_desc) { - /* - * See if this is the one - */ - if (obj_desc == region_obj) { - /* - * This is it, remove it from the handler's list - */ - *last_obj_ptr = obj_desc->region.next; - obj_desc->region.next = NULL; /* Must clear field */ - - if (acpi_ns_is_locked) { - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - } - - /* - * Now stop region accesses by executing the _REG method - */ - acpi_ev_execute_reg_method (region_obj, 0); - - if (acpi_ns_is_locked) { - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - } - - /* - * Call the setup handler with the deactivate notification - */ - region_setup = handler_obj->addr_handler.setup; - status = region_setup (region_obj, ACPI_REGION_DEACTIVATE, - handler_obj->addr_handler.context, - ®ion_context); - - /* - * Init routine may fail, Just ignore errors - */ - - region_obj->region.flags &= ~(AOPOBJ_INITIALIZED); - - /* - * Remove handler reference in the region - * - * NOTE: this doesn't mean that the region goes away - * The region is just inaccessible as indicated to - * the _REG method - * - * If the region is on the handler's list - * this better be the region's handler - */ - ACPI_ASSERT (region_obj->region.addr_handler == handler_obj); - - region_obj->region.addr_handler = NULL; - - return; - - } /* found the right handler */ - - /* - * Move through the linked list of handlers - */ - last_obj_ptr = &obj_desc->region.next; - obj_desc = obj_desc->region.next; - } - - /* - * If we get here, the region was not in the handler's region list - */ - return; -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ev_associate_region_and_handler - * - * PARAMETERS: Handler_obj - Handler Object - * Region_obj - Region Object - * Acpi_ns_is_locked - Namespace Region Already Locked? - * - * RETURN: None - * - * DESCRIPTION: Create the association between the handler and the region - * this is a two way association. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ev_associate_region_and_handler ( - ACPI_OPERAND_OBJECT *handler_obj, - ACPI_OPERAND_OBJECT *region_obj, - u8 acpi_ns_is_locked) -{ - ACPI_STATUS status; - - - ACPI_ASSERT (region_obj->region.space_id == handler_obj->addr_handler.space_id); - ACPI_ASSERT (region_obj->region.addr_handler == 0); - - /* - * Link this region to the front of the handler's list - */ - - region_obj->region.next = handler_obj->addr_handler.region_list; - handler_obj->addr_handler.region_list = region_obj; - - /* - * set the region's handler - */ - -/* - Handler_obj->Common.Reference_count = - (u16) (Handler_obj->Common.Reference_count + - Region_obj->Common.Reference_count - 1); -*/ - region_obj->region.addr_handler = handler_obj; - - /* - * Last thing, tell all users that this region is usable - */ - if (acpi_ns_is_locked) { - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - } - - status = acpi_ev_execute_reg_method (region_obj, 1); - - if (acpi_ns_is_locked) { - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - } - - return (status); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_ev_addr_handler_helper - * - * PARAMETERS: Handle - Node to be dumped - * Level - Nesting level of the handle - * Context - Passed into Acpi_ns_walk_namespace - * - * DESCRIPTION: This routine checks to see if the object is a Region if it - * is then the address handler is installed in it. - * - * If the Object is a Device, and the device has a handler of - * the same type then the search is terminated in that branch. - * - * This is because the existing handler is closer in proximity - * to any more regions than the one we are trying to install. - * - ***************************************************************************/ - -ACPI_STATUS -acpi_ev_addr_handler_helper ( - ACPI_HANDLE obj_handle, - u32 level, - void *context, - void **return_value) -{ - ACPI_OPERAND_OBJECT *handler_obj; - ACPI_OPERAND_OBJECT *tmp_obj; - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_NAMESPACE_NODE *node; - ACPI_STATUS status; - - - handler_obj = (ACPI_OPERAND_OBJECT *) context; - - /* Parameter validation */ - - if (!handler_obj) { - return (AE_OK); - } - - /* Convert and validate the device handle */ - - node = acpi_ns_convert_handle_to_entry (obj_handle); - if (!node) { - return (AE_BAD_PARAMETER); - } - - /* - * We only care about regions.and objects - * that can have address handlers - */ - - if ((node->type != ACPI_TYPE_DEVICE) && - (node->type != ACPI_TYPE_REGION) && - (node != acpi_gbl_root_node)) { - return (AE_OK); - } - - /* Check for an existing internal object */ - - obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) node); - if (!obj_desc) { - /* - * The object DNE, we don't care about it - */ - return (AE_OK); - } - - /* - * Devices are handled different than regions - */ - if (IS_THIS_OBJECT_TYPE (obj_desc, ACPI_TYPE_DEVICE)) { - /* - * See if this guy has any handlers - */ - tmp_obj = obj_desc->device.addr_handler; - while (tmp_obj) { - /* - * Now let's see if it's for the same address space. - */ - if (tmp_obj->addr_handler.space_id == handler_obj->addr_handler.space_id) { - /* - * It's for the same address space - */ - /* - * Since the object we found it on was a device, then it - * means that someone has already installed a handler for - * the branch of the namespace from this device on. Just - * bail out telling the walk routine to not traverse this - * branch. This preserves the scoping rule for handlers. - */ - return (AE_CTRL_DEPTH); - } - - /* - * Move through the linked list of handlers - */ - tmp_obj = tmp_obj->addr_handler.next; - } - - /* - * As long as the device didn't have a handler for this - * space we don't care about it. We just ignore it and - * proceed. - */ - return (AE_OK); - } - - /* - * Only here if it was a region - */ - ACPI_ASSERT (obj_desc->common.type == ACPI_TYPE_REGION); - - if (obj_desc->region.space_id != handler_obj->addr_handler.space_id) { - /* - * This region is for a different address space - * ignore it - */ - return (AE_OK); - } - - /* - * Now we have a region and it is for the handler's address - * space type. - * - * First disconnect region for any previous handler (if any) - */ - acpi_ev_disassociate_region_from_handler (obj_desc, FALSE); - - /* - * Then connect the region to the new handler - */ - status = acpi_ev_associate_region_and_handler (handler_obj, obj_desc, FALSE); - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/events/evrgnini.c b/reactos/drivers/bus/acpi/events/evrgnini.c deleted file mode 100644 index e37e78a4c63..00000000000 --- a/reactos/drivers/bus/acpi/events/evrgnini.c +++ /dev/null @@ -1,413 +0,0 @@ -/****************************************************************************** - * - * Module Name: evrgnini- ACPI Address_space (Op_region) init - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_EVENTS - MODULE_NAME ("evrgnini") - - -/***************************************************************************** - * - * FUNCTION: Acpi_ev_system_memory_region_setup - * - * PARAMETERS: Region_obj - region we are interested in - * Function - start or stop - * Handler_context - Address space handler context - * Region_context - Region specific context - * - * RETURN: Status - * - * DESCRIPTION: Do any prep work for region handling, a nop for now - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ev_system_memory_region_setup ( - ACPI_HANDLE handle, - u32 function, - void *handler_context, - void **region_context) -{ - - if (function == ACPI_REGION_DEACTIVATE) { - if (*region_context) { - acpi_cm_free (*region_context); - *region_context = NULL; - } - return (AE_OK); - } - - - /* Activate. Create a new context */ - - *region_context = acpi_cm_callocate (sizeof (MEM_HANDLER_CONTEXT)); - if (!(*region_context)) { - return (AE_NO_MEMORY); - } - - return (AE_OK); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ev_io_space_region_setup - * - * PARAMETERS: Region_obj - region we are interested in - * Function - start or stop - * Handler_context - Address space handler context - * Region_context - Region specific context - * - * RETURN: Status - * - * DESCRIPTION: Do any prep work for region handling - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ev_io_space_region_setup ( - ACPI_HANDLE handle, - u32 function, - void *handler_context, - void **region_context) -{ - if (function == ACPI_REGION_DEACTIVATE) { - *region_context = NULL; - } - else { - *region_context = handler_context; - } - - return (AE_OK); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ev_pci_config_region_setup - * - * PARAMETERS: Region_obj - region we are interested in - * Function - start or stop - * Handler_context - Address space handler context - * Region_context - Region specific context - * - * RETURN: Status - * - * DESCRIPTION: Do any prep work for region handling - * - * MUTEX: Assumes namespace is not locked - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ev_pci_config_region_setup ( - ACPI_HANDLE handle, - u32 function, - void *handler_context, - void **region_context) -{ - ACPI_STATUS status = AE_OK; - ACPI_INTEGER temp; - PCI_HANDLER_CONTEXT *pci_context = *region_context; - ACPI_OPERAND_OBJECT *handler_obj; - ACPI_NAMESPACE_NODE *node; - ACPI_OPERAND_OBJECT *region_obj = (ACPI_OPERAND_OBJECT *) handle; - DEVICE_ID object_hID; - - handler_obj = region_obj->region.addr_handler; - - if (!handler_obj) { - /* - * No installed handler. This shouldn't happen because the dispatch - * routine checks before we get here, but we check again just in case. - */ - return(AE_NOT_EXIST); - } - - if (function == ACPI_REGION_DEACTIVATE) { - if (pci_context) { - acpi_cm_free (pci_context); - *region_context = NULL; - } - - return (status); - } - - - /* Create a new context */ - - pci_context = acpi_cm_callocate (sizeof(PCI_HANDLER_CONTEXT)); - if (!pci_context) { - return (AE_NO_MEMORY); - } - - /* - * For PCI Config space access, we have to pass the segment, bus, - * device and function numbers. This routine must acquire those. - */ - - /* - * First get device and function numbers from the _ADR object - * in the parent's scope. - */ - ACPI_ASSERT(region_obj->region.node); - - node = acpi_ns_get_parent_object (region_obj->region.node); - - - /* Acpi_evaluate the _ADR object */ - - status = acpi_cm_evaluate_numeric_object (METHOD_NAME__ADR, node, &temp); - /* - * The default is zero, since the allocation above zeroed the data, just - * do nothing on failures. - */ - if (ACPI_SUCCESS (status)) { - /* - * Got it.. - */ - pci_context->dev_func = (u32) temp; - } - - /* - * Get the _SEG and _BBN values from the device upon which the handler - * is installed. - * - * We need to get the _SEG and _BBN objects relative to the PCI BUS device. - * This is the device the handler has been registered to handle. - */ - - /* - * If the Addr_handler.Node is still pointing to the root, we need - * to scan upward for a PCI Root bridge and re-associate the Op_region - * handlers with that device. - */ - if (handler_obj->addr_handler.node == acpi_gbl_root_node) { - /* - * Node is currently the parent object - */ - while (node != acpi_gbl_root_node) { - status = acpi_cm_execute_HID(node, &object_hID); - - if (ACPI_SUCCESS (status)) { - if (!(STRNCMP(object_hID.buffer, PCI_ROOT_HID_STRING, - sizeof (PCI_ROOT_HID_STRING)))) { - acpi_install_address_space_handler(node, - ADDRESS_SPACE_PCI_CONFIG, - ACPI_DEFAULT_HANDLER, NULL, NULL); - - break; - } - } - - node = acpi_ns_get_parent_object(node); - } - } - else { - node = handler_obj->addr_handler.node; - } - - status = acpi_cm_evaluate_numeric_object (METHOD_NAME__SEG, node, &temp); - if (ACPI_SUCCESS (status)) { - /* - * Got it.. - */ - pci_context->seg = (u32) temp; - } - - status = acpi_cm_evaluate_numeric_object (METHOD_NAME__BBN, node, &temp); - if (ACPI_SUCCESS (status)) { - /* - * Got it.. - */ - pci_context->bus = (u32) temp; - } - - *region_context = pci_context; - - return (AE_OK); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_ev_default_region_setup - * - * PARAMETERS: Region_obj - region we are interested in - * Function - start or stop - * Handler_context - Address space handler context - * Region_context - Region specific context - * - * RETURN: Status - * - * DESCRIPTION: Do any prep work for region handling - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ev_default_region_setup ( - ACPI_HANDLE handle, - u32 function, - void *handler_context, - void **region_context) -{ - if (function == ACPI_REGION_DEACTIVATE) { - *region_context = NULL; - } - else { - *region_context = handler_context; - } - - return (AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ev_initialize_region - * - * PARAMETERS: Region_obj - Region we are initializing - * - * RETURN: Status - * - * DESCRIPTION: Initializes the region, finds any _REG methods and saves them - * for execution at a later time - * - * Get the appropriate address space handler for a newly - * created region. - * - * This also performs address space specific intialization. For - * example, PCI regions must have an _ADR object that contains - * a PCI address in the scope of the defintion. This address is - * required to perform an access to PCI config space. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ev_initialize_region ( - ACPI_OPERAND_OBJECT *region_obj, - u8 acpi_ns_locked) -{ - ACPI_OPERAND_OBJECT *handler_obj; - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_ADDRESS_SPACE_TYPE space_id; - ACPI_NAMESPACE_NODE *node; - ACPI_STATUS status; - ACPI_NAMESPACE_NODE *method_node; - ACPI_NAME *reg_name_ptr = (ACPI_NAME *) METHOD_NAME__REG; - - - if (!region_obj) { - return (AE_BAD_PARAMETER); - } - - ACPI_ASSERT(region_obj->region.node); - - node = acpi_ns_get_parent_object (region_obj->region.node); - space_id = region_obj->region.space_id; - - region_obj->region.addr_handler = NULL; - region_obj->region.extra->extra.method_REG = NULL; - region_obj->region.flags &= ~(AOPOBJ_INITIALIZED); - - /* - * Find any "_REG" associated with this region definition - */ - status = acpi_ns_search_node (*reg_name_ptr, node, - ACPI_TYPE_METHOD, &method_node); - if (ACPI_SUCCESS (status)) { - /* - * The _REG method is optional and there can be only one per region - * definition. This will be executed when the handler is attached - * or removed - */ - region_obj->region.extra->extra.method_REG = method_node; - } - - /* - * The following loop depends upon the root Node having no parent - * ie: Acpi_gbl_Root_node->Parent_entry being set to NULL - */ - while (node) { - /* - * Check to see if a handler exists - */ - handler_obj = NULL; - obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) node); - if (obj_desc) { - /* - * can only be a handler if the object exists - */ - switch (node->type) { - case ACPI_TYPE_DEVICE: - - handler_obj = obj_desc->device.addr_handler; - break; - - case ACPI_TYPE_PROCESSOR: - - handler_obj = obj_desc->processor.addr_handler; - break; - - case ACPI_TYPE_THERMAL: - - handler_obj = obj_desc->thermal_zone.addr_handler; - break; - } - - while (handler_obj) { - /* - * This guy has at least one address handler - * see if it has the type we want - */ - if (handler_obj->addr_handler.space_id == space_id) { - /* - * Found it! Now update the region and the handler - */ - acpi_ev_associate_region_and_handler (handler_obj, region_obj, acpi_ns_locked); - return (AE_OK); - } - - handler_obj = handler_obj->addr_handler.next; - - } /* while handlerobj */ - } - - /* - * This one does not have the handler we need - * Pop up one level - */ - node = acpi_ns_get_parent_object (node); - - } /* while Node != ROOT */ - - /* - * If we get here, there is no handler for this region - */ - return (AE_NOT_EXIST); -} - diff --git a/reactos/drivers/bus/acpi/events/evsci.c b/reactos/drivers/bus/acpi/events/evsci.c deleted file mode 100644 index 748c5f73904..00000000000 --- a/reactos/drivers/bus/acpi/events/evsci.c +++ /dev/null @@ -1,267 +0,0 @@ -/******************************************************************************* - * - * Module Name: evsci - System Control Interrupt configuration and - * legacy to ACPI mode state transition functions - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - -#define _COMPONENT ACPI_EVENTS - MODULE_NAME ("evsci") - - -/* - * Elements correspond to counts for TMR, NOT_USED, GBL, PWR_BTN, SLP_BTN, RTC, - * and GENERAL respectively. These counts are modified by the ACPI interrupt - * handler. - * - * TBD: [Investigate] Note that GENERAL should probably be split out into - * one element for each bit in the GPE registers - */ - - -/******************************************************************************* - * - * FUNCTION: Acpi_ev_sci_handler - * - * PARAMETERS: Context - Calling Context - * - * RETURN: Status code indicates whether interrupt was handled. - * - * DESCRIPTION: Interrupt handler that will figure out what function or - * control method to call to deal with a SCI. Installed - * using BU interrupt support. - * - ******************************************************************************/ - -static u32 -acpi_ev_sci_handler (void *context) -{ - u32 interrupt_handled = INTERRUPT_NOT_HANDLED; - - - /* - * Make sure that ACPI is enabled by checking SCI_EN. Note that we are - * required to treat the SCI interrupt as sharable, level, active low. - */ - if (!acpi_hw_register_bit_access (ACPI_READ, ACPI_MTX_DO_NOT_LOCK, SCI_EN)) { - /* ACPI is not enabled; this interrupt cannot be for us */ - - return (INTERRUPT_NOT_HANDLED); - } - - /* - * Fixed Acpi_events: - * ------------- - * Check for and dispatch any Fixed Acpi_events that have occurred - */ - interrupt_handled |= acpi_ev_fixed_event_detect (); - - /* - * GPEs: - * ----- - * Check for and dispatch any GPEs that have occurred - */ - interrupt_handled |= acpi_ev_gpe_detect (); - - return (interrupt_handled); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ev_install_sci_handler - * - * PARAMETERS: none - * - * RETURN: Status - * - * DESCRIPTION: Installs SCI handler. - * - ******************************************************************************/ - -u32 -acpi_ev_install_sci_handler (void) -{ - u32 except = AE_OK; - - - except = acpi_os_install_interrupt_handler ((u32) acpi_gbl_FADT->sci_int, - acpi_ev_sci_handler, - NULL); - - return (except); -} - - -/****************************************************************************** - - * - * FUNCTION: Acpi_ev_remove_sci_handler - * - * PARAMETERS: none - * - * RETURN: E_OK if handler uninstalled OK, E_ERROR if handler was not - * installed to begin with - * - * DESCRIPTION: Restores original status of all fixed event enable bits and - * removes SCI handler. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ev_remove_sci_handler (void) -{ -#if 0 - /* TBD:[Investigate] Figure this out!! Disable all events first ??? */ - - if (original_fixed_enable_bit_status ^ 1 << acpi_event_index (TMR_FIXED_EVENT)) { - acpi_event_disable_event (TMR_FIXED_EVENT); - } - - if (original_fixed_enable_bit_status ^ 1 << acpi_event_index (GBL_FIXED_EVENT)) { - acpi_event_disable_event (GBL_FIXED_EVENT); - } - - if (original_fixed_enable_bit_status ^ 1 << acpi_event_index (PWR_BTN_FIXED_EVENT)) { - acpi_event_disable_event (PWR_BTN_FIXED_EVENT); - } - - if (original_fixed_enable_bit_status ^ 1 << acpi_event_index (SLP_BTN_FIXED_EVENT)) { - acpi_event_disable_event (SLP_BTN_FIXED_EVENT); - } - - if (original_fixed_enable_bit_status ^ 1 << acpi_event_index (RTC_FIXED_EVENT)) { - acpi_event_disable_event (RTC_FIXED_EVENT); - } - - original_fixed_enable_bit_status = 0; - -#endif - - acpi_os_remove_interrupt_handler ((u32) acpi_gbl_FADT->sci_int, - acpi_ev_sci_handler); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ev_restore_acpi_state - * - * PARAMETERS: none - * - * RETURN: none - * - * DESCRIPTION: Restore the original ACPI state of the machine - * - ******************************************************************************/ - -void -acpi_ev_restore_acpi_state (void) -{ - u32 index; - - - /* Restore the state of the chipset enable bits. */ - - if (acpi_gbl_restore_acpi_chipset == TRUE) { - /* Restore the fixed events */ - - if (acpi_hw_register_read (ACPI_MTX_LOCK, PM1_EN) != - acpi_gbl_pm1_enable_register_save) { - acpi_hw_register_write (ACPI_MTX_LOCK, PM1_EN, - acpi_gbl_pm1_enable_register_save); - } - - - /* Ensure that all status bits are clear */ - - acpi_hw_clear_acpi_status (); - - - /* Now restore the GPEs */ - - for (index = 0; index < DIV_2 (acpi_gbl_FADT->gpe0blk_len); index++) { - if (acpi_hw_register_read (ACPI_MTX_LOCK, GPE0_EN_BLOCK | index) != - acpi_gbl_gpe0enable_register_save[index]) { - acpi_hw_register_write (ACPI_MTX_LOCK, GPE0_EN_BLOCK | index, - acpi_gbl_gpe0enable_register_save[index]); - } - } - - /* GPE 1 present? */ - - if (acpi_gbl_FADT->gpe1_blk_len) { - for (index = 0; index < DIV_2 (acpi_gbl_FADT->gpe1_blk_len); index++) { - if (acpi_hw_register_read (ACPI_MTX_LOCK, GPE1_EN_BLOCK | index) != - acpi_gbl_gpe1_enable_register_save[index]) { - acpi_hw_register_write (ACPI_MTX_LOCK, GPE1_EN_BLOCK | index, - acpi_gbl_gpe1_enable_register_save[index]); - } - } - } - - if (acpi_hw_get_mode() != acpi_gbl_original_mode) { - acpi_hw_set_mode (acpi_gbl_original_mode); - } - } - - return; -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ev_terminate - * - * PARAMETERS: none - * - * RETURN: none - * - * DESCRIPTION: free memory allocated for table storage. - * - ******************************************************************************/ - -void -acpi_ev_terminate (void) -{ - - - /* - * Free global tables, etc. - */ - - if (acpi_gbl_gpe_registers) { - acpi_cm_free (acpi_gbl_gpe_registers); - } - - if (acpi_gbl_gpe_info) { - acpi_cm_free (acpi_gbl_gpe_info); - } - - return; -} - - diff --git a/reactos/drivers/bus/acpi/events/evxface.c b/reactos/drivers/bus/acpi/events/evxface.c deleted file mode 100644 index 3322616ed6c..00000000000 --- a/reactos/drivers/bus/acpi/events/evxface.c +++ /dev/null @@ -1,604 +0,0 @@ -/****************************************************************************** - * - * Module Name: evxface - External interfaces for ACPI events - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_EVENTS - MODULE_NAME ("evxface") - - -/****************************************************************************** - * - * FUNCTION: Acpi_install_fixed_event_handler - * - * PARAMETERS: Event - Event type to enable. - * Handler - Pointer to the handler function for the - * event - * Context - Value passed to the handler on each GPE - * - * RETURN: Status - * - * DESCRIPTION: Saves the pointer to the handler function and then enables the - * event. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_install_fixed_event_handler ( - u32 event, - FIXED_EVENT_HANDLER handler, - void *context) -{ - ACPI_STATUS status; - - - /* Parameter validation */ - - if (event >= NUM_FIXED_EVENTS) { - return (AE_BAD_PARAMETER); - } - - acpi_cm_acquire_mutex (ACPI_MTX_EVENTS); - - /* Don't allow two handlers. */ - - if (NULL != acpi_gbl_fixed_event_handlers[event].handler) { - status = AE_EXIST; - goto cleanup; - } - - - /* Install the handler before enabling the event - just in case... */ - - acpi_gbl_fixed_event_handlers[event].handler = handler; - acpi_gbl_fixed_event_handlers[event].context = context; - - status = acpi_enable_event (event, ACPI_EVENT_FIXED); - if (!ACPI_SUCCESS (status)) { - /* Remove the handler */ - - acpi_gbl_fixed_event_handlers[event].handler = NULL; - acpi_gbl_fixed_event_handlers[event].context = NULL; - } - - - -cleanup: - acpi_cm_release_mutex (ACPI_MTX_EVENTS); - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_remove_fixed_event_handler - * - * PARAMETERS: Event - Event type to disable. - * Handler - Address of the handler - * - * RETURN: Status - * - * DESCRIPTION: Disables the event and unregisters the event handler. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_remove_fixed_event_handler ( - u32 event, - FIXED_EVENT_HANDLER handler) -{ - ACPI_STATUS status = AE_OK; - - - /* Parameter validation */ - - if (event >= NUM_FIXED_EVENTS) { - return (AE_BAD_PARAMETER); - } - - acpi_cm_acquire_mutex (ACPI_MTX_EVENTS); - - /* Disable the event before removing the handler - just in case... */ - - status = acpi_disable_event(event, ACPI_EVENT_FIXED); - - /* Always Remove the handler */ - - acpi_gbl_fixed_event_handlers[event].handler = NULL; - acpi_gbl_fixed_event_handlers[event].context = NULL; - - - - - acpi_cm_release_mutex (ACPI_MTX_EVENTS); - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_install_notify_handler - * - * PARAMETERS: Device - The device for which notifies will be handled - * Handler_type - The type of handler: - * ACPI_SYSTEM_NOTIFY: System_handler (00-7f) - * ACPI_DEVICE_NOTIFY: Driver_handler (80-ff) - * Handler - Address of the handler - * Context - Value passed to the handler on each GPE - * - * RETURN: Status - * - * DESCRIPTION: Install a handler for notifies on an ACPI device - * - ******************************************************************************/ - -ACPI_STATUS -acpi_install_notify_handler ( - ACPI_HANDLE device, - u32 handler_type, - NOTIFY_HANDLER handler, - void *context) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_OPERAND_OBJECT *notify_obj; - ACPI_NAMESPACE_NODE *device_node; - ACPI_STATUS status = AE_OK; - - - /* Parameter validation */ - - if ((!handler) || - (handler_type > ACPI_MAX_NOTIFY_HANDLER_TYPE)) { - return (AE_BAD_PARAMETER); - } - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - /* Convert and validate the device handle */ - - device_node = acpi_ns_convert_handle_to_entry (device); - if (!device_node) { - status = AE_BAD_PARAMETER; - goto unlock_and_exit; - } - - /* - * Root Object: - * ------------ - * Registering a notify handler on the root object indicates that the - * caller wishes to receive notifications for all objects. Note that - * only one global handler can be regsitered (per notify type). - */ - if (device == ACPI_ROOT_OBJECT) { - /* Make sure the handler is not already installed */ - - if (((handler_type == ACPI_SYSTEM_NOTIFY) && - acpi_gbl_sys_notify.handler) || - ((handler_type == ACPI_DEVICE_NOTIFY) && - acpi_gbl_drv_notify.handler)) { - status = AE_EXIST; - goto unlock_and_exit; - } - - if (handler_type == ACPI_SYSTEM_NOTIFY) { - acpi_gbl_sys_notify.node = device_node; - acpi_gbl_sys_notify.handler = handler; - acpi_gbl_sys_notify.context = context; - } - else /* ACPI_DEVICE_NOTIFY */ { - acpi_gbl_drv_notify.node = device_node; - acpi_gbl_drv_notify.handler = handler; - acpi_gbl_drv_notify.context = context; - } - - /* Global notify handler installed */ - } - - /* - * Other Objects: - * -------------- - * Caller will only receive notifications specific to the target object. - * Note that only certain object types can receive notifications. - */ - else { - /* - * These are the ONLY objects that can receive ACPI notifications - */ - if ((device_node->type != ACPI_TYPE_DEVICE) && - (device_node->type != ACPI_TYPE_PROCESSOR) && - (device_node->type != ACPI_TYPE_POWER) && - (device_node->type != ACPI_TYPE_THERMAL)) { - status = AE_BAD_PARAMETER; - goto unlock_and_exit; - } - - /* Check for an existing internal object */ - - obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) device_node); - if (obj_desc) { - - /* Object exists - make sure there's no handler */ - - if (((handler_type == ACPI_SYSTEM_NOTIFY) && - obj_desc->device.sys_handler) || - ((handler_type == ACPI_DEVICE_NOTIFY) && - obj_desc->device.drv_handler)) { - status = AE_EXIST; - goto unlock_and_exit; - } - } - - else { - /* Create a new object */ - - obj_desc = acpi_cm_create_internal_object (device_node->type); - if (!obj_desc) { - status = AE_NO_MEMORY; - goto unlock_and_exit; - } - - /* Attach new object to the Node */ - - status = acpi_ns_attach_object (device, obj_desc, (u8) device_node->type); - - if (ACPI_FAILURE (status)) { - goto unlock_and_exit; - } - } - - /* Install the handler */ - - notify_obj = acpi_cm_create_internal_object (INTERNAL_TYPE_NOTIFY); - if (!notify_obj) { - status = AE_NO_MEMORY; - goto unlock_and_exit; - } - - notify_obj->notify_handler.node = device_node; - notify_obj->notify_handler.handler = handler; - notify_obj->notify_handler.context = context; - - - if (handler_type == ACPI_SYSTEM_NOTIFY) { - obj_desc->device.sys_handler = notify_obj; - } - else /* ACPI_DEVICE_NOTIFY */ { - obj_desc->device.drv_handler = notify_obj; - } - } - -unlock_and_exit: - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_remove_notify_handler - * - * PARAMETERS: Device - The device for which notifies will be handled - * Handler_type - The type of handler: - * ACPI_SYSTEM_NOTIFY: System_handler (00-7f) - * ACPI_DEVICE_NOTIFY: Driver_handler (80-ff) - * Handler - Address of the handler - * RETURN: Status - * - * DESCRIPTION: Remove a handler for notifies on an ACPI device - * - ******************************************************************************/ - -ACPI_STATUS -acpi_remove_notify_handler ( - ACPI_HANDLE device, - u32 handler_type, - NOTIFY_HANDLER handler) -{ - ACPI_OPERAND_OBJECT *notify_obj; - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_NAMESPACE_NODE *device_node; - ACPI_STATUS status = AE_OK; - - /* Parameter validation */ - - if ((!handler) || - (handler_type > ACPI_MAX_NOTIFY_HANDLER_TYPE)) { - return (AE_BAD_PARAMETER); - } - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - /* Convert and validate the device handle */ - - device_node = acpi_ns_convert_handle_to_entry (device); - if (!device_node) { - status = AE_BAD_PARAMETER; - goto unlock_and_exit; - } - - /* - * Root Object: - * ------------ - */ - if (device == ACPI_ROOT_OBJECT) { - - if (((handler_type == ACPI_SYSTEM_NOTIFY) && - !acpi_gbl_sys_notify.handler) || - ((handler_type == ACPI_DEVICE_NOTIFY) && - !acpi_gbl_drv_notify.handler)) { - status = AE_NOT_EXIST; - goto unlock_and_exit; - } - - if (handler_type == ACPI_SYSTEM_NOTIFY) { - acpi_gbl_sys_notify.node = NULL; - acpi_gbl_sys_notify.handler = NULL; - acpi_gbl_sys_notify.context = NULL; - } - else { - acpi_gbl_drv_notify.node = NULL; - acpi_gbl_drv_notify.handler = NULL; - acpi_gbl_drv_notify.context = NULL; - } - } - - /* - * Other Objects: - * -------------- - */ - else { - /* - * These are the ONLY objects that can receive ACPI notifications - */ - if ((device_node->type != ACPI_TYPE_DEVICE) && - (device_node->type != ACPI_TYPE_PROCESSOR) && - (device_node->type != ACPI_TYPE_POWER) && - (device_node->type != ACPI_TYPE_THERMAL)) { - status = AE_BAD_PARAMETER; - goto unlock_and_exit; - } - - /* Check for an existing internal object */ - - obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) device_node); - if (!obj_desc) { - status = AE_NOT_EXIST; - goto unlock_and_exit; - } - - /* Object exists - make sure there's an existing handler */ - - if (handler_type == ACPI_SYSTEM_NOTIFY) { - notify_obj = obj_desc->device.sys_handler; - } - else { - notify_obj = obj_desc->device.drv_handler; - } - - if ((!notify_obj) || - (notify_obj->notify_handler.handler != handler)) { - status = AE_BAD_PARAMETER; - goto unlock_and_exit; - } - - /* Remove the handler */ - - if (handler_type == ACPI_SYSTEM_NOTIFY) { - obj_desc->device.sys_handler = NULL; - } - else { - obj_desc->device.drv_handler = NULL; - } - - acpi_cm_remove_reference (notify_obj); - } - - -unlock_and_exit: - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_install_gpe_handler - * - * PARAMETERS: Gpe_number - The GPE number. The numbering scheme is - * bank 0 first, then bank 1. - * Type - Whether this GPE should be treated as an - * edge- or level-triggered interrupt. - * Handler - Address of the handler - * Context - Value passed to the handler on each GPE - * - * RETURN: Status - * - * DESCRIPTION: Install a handler for a General Purpose Event. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_install_gpe_handler ( - u32 gpe_number, - u32 type, - GPE_HANDLER handler, - void *context) -{ - ACPI_STATUS status = AE_OK; - - /* Parameter validation */ - - if (!handler || (gpe_number >= NUM_GPE)) { - return (AE_BAD_PARAMETER); - } - - /* Ensure that we have a valid GPE number */ - - if (acpi_gbl_gpe_valid[gpe_number] == ACPI_GPE_INVALID) { - return (AE_BAD_PARAMETER); - } - - acpi_cm_acquire_mutex (ACPI_MTX_EVENTS); - - /* Make sure that there isn't a handler there already */ - - if (acpi_gbl_gpe_info[gpe_number].handler) { - status = AE_EXIST; - goto cleanup; - } - - /* Install the handler */ - - acpi_gbl_gpe_info[gpe_number].handler = handler; - acpi_gbl_gpe_info[gpe_number].context = context; - acpi_gbl_gpe_info[gpe_number].type = (u8) type; - - /* Clear the GPE (of stale events), the enable it */ - - acpi_hw_clear_gpe (gpe_number); - acpi_hw_enable_gpe (gpe_number); - -cleanup: - acpi_cm_release_mutex (ACPI_MTX_EVENTS); - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_remove_gpe_handler - * - * PARAMETERS: Gpe_number - The event to remove a handler - * Handler - Address of the handler - * - * RETURN: Status - * - * DESCRIPTION: Remove a handler for a General Purpose Acpi_event. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_remove_gpe_handler ( - u32 gpe_number, - GPE_HANDLER handler) -{ - ACPI_STATUS status = AE_OK; - - - /* Parameter validation */ - - if (!handler || (gpe_number >= NUM_GPE)) { - return (AE_BAD_PARAMETER); - } - - /* Ensure that we have a valid GPE number */ - - if (acpi_gbl_gpe_valid[gpe_number] == ACPI_GPE_INVALID) { - return (AE_BAD_PARAMETER); - } - - /* Disable the GPE before removing the handler */ - - acpi_hw_disable_gpe (gpe_number); - - acpi_cm_acquire_mutex (ACPI_MTX_EVENTS); - - /* Make sure that the installed handler is the same */ - - if (acpi_gbl_gpe_info[gpe_number].handler != handler) { - acpi_hw_enable_gpe (gpe_number); - status = AE_BAD_PARAMETER; - goto cleanup; - } - - /* Remove the handler */ - - acpi_gbl_gpe_info[gpe_number].handler = NULL; - acpi_gbl_gpe_info[gpe_number].context = NULL; - -cleanup: - acpi_cm_release_mutex (ACPI_MTX_EVENTS); - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_acquire_global_lock - * - * PARAMETERS: Timeout - How long the caller is willing to wait - * Out_handle - A handle to the lock if acquired - * - * RETURN: Status - * - * DESCRIPTION: Acquire the ACPI Global Lock - * - ******************************************************************************/ -ACPI_STATUS -acpi_acquire_global_lock ( - void) -{ - ACPI_STATUS status; - - - status = acpi_aml_enter_interpreter (); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * TBD: [Restructure] add timeout param to internal interface, and - * perhaps INTERPRETER_LOCKED - */ - - status = acpi_ev_acquire_global_lock (); - acpi_aml_exit_interpreter (); - - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_release_global_lock - * - * PARAMETERS: Handle - Returned from Acpi_acquire_global_lock - * - * RETURN: Status - * - * DESCRIPTION: Release the ACPI Global Lock - * - ******************************************************************************/ - -ACPI_STATUS -acpi_release_global_lock ( - void) -{ - acpi_ev_release_global_lock (); - return (AE_OK); -} - - diff --git a/reactos/drivers/bus/acpi/events/evxfevnt.c b/reactos/drivers/bus/acpi/events/evxfevnt.c deleted file mode 100644 index 439f62e7931..00000000000 --- a/reactos/drivers/bus/acpi/events/evxfevnt.c +++ /dev/null @@ -1,480 +0,0 @@ -/****************************************************************************** - * - * Module Name: evxfevnt - External Interfaces, ACPI event disable/enable - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_EVENTS - MODULE_NAME ("evxfevnt") - - -/************************************************************************** - * - * FUNCTION: Acpi_enable - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Transfers the system into ACPI mode. - * - *************************************************************************/ - -ACPI_STATUS -acpi_enable (void) -{ - ACPI_STATUS status; - - - /* Make sure we've got ACPI tables */ - - if (!acpi_gbl_DSDT) { - return (AE_NO_ACPI_TABLES); - } - - /* Make sure the BIOS supports ACPI mode */ - - if (SYS_MODE_LEGACY == acpi_hw_get_mode_capabilities()) { - return (AE_ERROR); - } - - /* Transition to ACPI mode */ - - status = acpi_hw_set_mode (SYS_MODE_ACPI); - if (ACPI_FAILURE (status)) { - return (status); - } - - return (status); -} - - -/************************************************************************** - * - * FUNCTION: Acpi_disable - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Returns the system to original ACPI/legacy mode, and - * uninstalls the SCI interrupt handler. - * - *************************************************************************/ - -ACPI_STATUS -acpi_disable (void) -{ - ACPI_STATUS status; - - - /* Restore original mode */ - - status = acpi_hw_set_mode (acpi_gbl_original_mode); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Unload the SCI interrupt handler */ - - acpi_ev_remove_sci_handler (); - acpi_ev_restore_acpi_state (); - - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_enable_event - * - * PARAMETERS: Event - The fixed event or GPE to be enabled - * Type - The type of event - * - * RETURN: Status - * - * DESCRIPTION: Enable an ACPI event (fixed and general purpose) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_enable_event ( - u32 event, - u32 type) -{ - ACPI_STATUS status = AE_OK; - u32 register_id; - - - /* The Type must be either Fixed Acpi_event or GPE */ - - switch (type) { - - case ACPI_EVENT_FIXED: - - /* Decode the Fixed Acpi_event */ - - switch (event) { - case ACPI_EVENT_PMTIMER: - register_id = TMR_EN; - break; - - case ACPI_EVENT_GLOBAL: - register_id = GBL_EN; - break; - - case ACPI_EVENT_POWER_BUTTON: - register_id = PWRBTN_EN; - break; - - case ACPI_EVENT_SLEEP_BUTTON: - register_id = SLPBTN_EN; - break; - - case ACPI_EVENT_RTC: - register_id = RTC_EN; - break; - - default: - return (AE_BAD_PARAMETER); - break; - } - - /* - * Enable the requested fixed event (by writing a one to the - * enable register bit) - */ - - acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, register_id, 1); - - if (1 != acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_LOCK, register_id)) { - return (AE_NO_HARDWARE_RESPONSE); - } - - break; - - - case ACPI_EVENT_GPE: - - /* Ensure that we have a valid GPE number */ - - if ((event >= NUM_GPE) || - (acpi_gbl_gpe_valid[event] == ACPI_GPE_INVALID)) { - return (AE_BAD_PARAMETER); - } - - - /* Enable the requested GPE number */ - - acpi_hw_enable_gpe (event); - break; - - - default: - - status = AE_BAD_PARAMETER; - } - - - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_disable_event - * - * PARAMETERS: Event - The fixed event or GPE to be enabled - * Type - The type of event - * - * RETURN: Status - * - * DESCRIPTION: Disable an ACPI event (fixed and general purpose) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_disable_event ( - u32 event, - u32 type) -{ - ACPI_STATUS status = AE_OK; - u32 register_id; - - - /* The Type must be either Fixed Acpi_event or GPE */ - - switch (type) { - - case ACPI_EVENT_FIXED: - - /* Decode the Fixed Acpi_event */ - - switch (event) { - case ACPI_EVENT_PMTIMER: - register_id = TMR_EN; - break; - - case ACPI_EVENT_GLOBAL: - register_id = GBL_EN; - break; - - case ACPI_EVENT_POWER_BUTTON: - register_id = PWRBTN_EN; - break; - - case ACPI_EVENT_SLEEP_BUTTON: - register_id = SLPBTN_EN; - break; - - case ACPI_EVENT_RTC: - register_id = RTC_EN; - break; - - default: - return (AE_BAD_PARAMETER); - break; - } - - /* - * Disable the requested fixed event (by writing a zero to the - * enable register bit) - */ - - acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, register_id, 0); - - if (0 != acpi_hw_register_bit_access(ACPI_READ, ACPI_MTX_LOCK, register_id)) { - return (AE_NO_HARDWARE_RESPONSE); - } - - break; - - - case ACPI_EVENT_GPE: - - /* Ensure that we have a valid GPE number */ - - if ((event >= NUM_GPE) || - (acpi_gbl_gpe_valid[event] == ACPI_GPE_INVALID)) { - return (AE_BAD_PARAMETER); - } - - /* Disable the requested GPE number */ - - acpi_hw_disable_gpe (event); - break; - - - default: - status = AE_BAD_PARAMETER; - } - - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_clear_event - * - * PARAMETERS: Event - The fixed event or GPE to be cleared - * Type - The type of event - * - * RETURN: Status - * - * DESCRIPTION: Clear an ACPI event (fixed and general purpose) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_clear_event ( - u32 event, - u32 type) -{ - ACPI_STATUS status = AE_OK; - u32 register_id; - - - /* The Type must be either Fixed Acpi_event or GPE */ - - switch (type) { - - case ACPI_EVENT_FIXED: - - /* Decode the Fixed Acpi_event */ - - switch (event) { - case ACPI_EVENT_PMTIMER: - register_id = TMR_STS; - break; - - case ACPI_EVENT_GLOBAL: - register_id = GBL_STS; - break; - - case ACPI_EVENT_POWER_BUTTON: - register_id = PWRBTN_STS; - break; - - case ACPI_EVENT_SLEEP_BUTTON: - register_id = SLPBTN_STS; - break; - - case ACPI_EVENT_RTC: - register_id = RTC_STS; - break; - - default: - return (AE_BAD_PARAMETER); - break; - } - - /* - * Clear the requested fixed event (By writing a one to the - * status register bit) - */ - - acpi_hw_register_bit_access (ACPI_WRITE, ACPI_MTX_LOCK, register_id, 1); - break; - - - case ACPI_EVENT_GPE: - - /* Ensure that we have a valid GPE number */ - - if ((event >= NUM_GPE) || - (acpi_gbl_gpe_valid[event] == ACPI_GPE_INVALID)) { - return (AE_BAD_PARAMETER); - } - - - acpi_hw_clear_gpe (event); - break; - - - default: - - status = AE_BAD_PARAMETER; - } - - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_get_event_status - * - * PARAMETERS: Event - The fixed event or GPE - * Type - The type of event - * Status - Where the current status of the event will - * be returned - * - * RETURN: Status - * - * DESCRIPTION: Obtains and returns the current status of the event - * - ******************************************************************************/ - - -ACPI_STATUS -acpi_get_event_status ( - u32 event, - u32 type, - ACPI_EVENT_STATUS *event_status) -{ - ACPI_STATUS status = AE_OK; - u32 register_id; - - - if (!event_status) { - return (AE_BAD_PARAMETER); - } - - - /* The Type must be either Fixed Acpi_event or GPE */ - - switch (type) { - - case ACPI_EVENT_FIXED: - - /* Decode the Fixed Acpi_event */ - - switch (event) { - case ACPI_EVENT_PMTIMER: - register_id = TMR_STS; - break; - - case ACPI_EVENT_GLOBAL: - register_id = GBL_STS; - break; - - case ACPI_EVENT_POWER_BUTTON: - register_id = PWRBTN_STS; - break; - - case ACPI_EVENT_SLEEP_BUTTON: - register_id = SLPBTN_STS; - break; - - case ACPI_EVENT_RTC: - register_id = RTC_STS; - break; - - default: - return (AE_BAD_PARAMETER); - break; - } - - /* Get the status of the requested fixed event */ - - *event_status = acpi_hw_register_bit_access (ACPI_READ, ACPI_MTX_LOCK, register_id); - break; - - - case ACPI_EVENT_GPE: - - /* Ensure that we have a valid GPE number */ - - if ((event >= NUM_GPE) || - (acpi_gbl_gpe_valid[event] == ACPI_GPE_INVALID)) { - return (AE_BAD_PARAMETER); - } - - - /* Obtain status on the requested GPE number */ - - acpi_hw_get_gpe_status (event, event_status); - break; - - - default: - status = AE_BAD_PARAMETER; - } - - - return (status); -} - diff --git a/reactos/drivers/bus/acpi/events/evxfregn.c b/reactos/drivers/bus/acpi/events/evxfregn.c deleted file mode 100644 index e9d720e924a..00000000000 --- a/reactos/drivers/bus/acpi/events/evxfregn.c +++ /dev/null @@ -1,373 +0,0 @@ -/****************************************************************************** - * - * Module Name: evxfregn - External Interfaces, ACPI Operation Regions and - * Address Spaces. - * $Revision: 1.2 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_EVENTS - MODULE_NAME ("evxfregn") - - -/****************************************************************************** - * - * FUNCTION: Acpi_install_address_space_handler - * - * PARAMETERS: Device - Handle for the device - * Space_id - The address space ID - * Handler - Address of the handler - * Setup - Address of the setup function - * Context - Value passed to the handler on each access - * - * RETURN: Status - * - * DESCRIPTION: Install a handler for all Op_regions of a given Space_id. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_install_address_space_handler ( - ACPI_HANDLE device, - ACPI_ADDRESS_SPACE_TYPE space_id, - ADDRESS_SPACE_HANDLER handler, - ADDRESS_SPACE_SETUP setup, - void *context) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_OPERAND_OBJECT *handler_obj; - ACPI_NAMESPACE_NODE *node; - ACPI_STATUS status = AE_OK; - OBJECT_TYPE_INTERNAL type; - u16 flags = 0; - - - /* Parameter validation */ - - if ((!device) || - ((!handler) && (handler != ACPI_DEFAULT_HANDLER))) { - return (AE_BAD_PARAMETER); - } - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - /* Convert and validate the device handle */ - - node = acpi_ns_convert_handle_to_entry (device); - if (!node) { - status = AE_BAD_PARAMETER; - goto unlock_and_exit; - } - - /* - * This registration is valid for only the types below - * and the root. This is where the default handlers - * get placed. - */ - - if ((node->type != ACPI_TYPE_DEVICE) && - (node->type != ACPI_TYPE_PROCESSOR) && - (node->type != ACPI_TYPE_THERMAL) && - (node != acpi_gbl_root_node)) { - status = AE_BAD_PARAMETER; - goto unlock_and_exit; - } - - if (handler == ACPI_DEFAULT_HANDLER) { - flags = ADDR_HANDLER_DEFAULT_INSTALLED; - - switch (space_id) { - case ADDRESS_SPACE_SYSTEM_MEMORY: - handler = acpi_aml_system_memory_space_handler; - setup = acpi_ev_system_memory_region_setup; - break; - - case ADDRESS_SPACE_SYSTEM_IO: - handler = acpi_aml_system_io_space_handler; - setup = acpi_ev_io_space_region_setup; - break; - - case ADDRESS_SPACE_PCI_CONFIG: - handler = acpi_aml_pci_config_space_handler; - setup = acpi_ev_pci_config_region_setup; - break; - - default: - status = AE_NOT_EXIST; - goto unlock_and_exit; - break; - } - } - - /* - * If the caller hasn't specified a setup routine, use the default - */ - if (!setup) { - setup = acpi_ev_default_region_setup; - } - - /* - * Check for an existing internal object - */ - - obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) node); - if (obj_desc) { - /* - * The object exists. - * Make sure the handler is not already installed. - */ - - /* check the address handler the user requested */ - - handler_obj = obj_desc->device.addr_handler; - while (handler_obj) { - /* - * We have an Address handler, see if user requested this - * address space. - */ - if(handler_obj->addr_handler.space_id == space_id) { - status = AE_EXIST; - goto unlock_and_exit; - } - - /* - * Move through the linked list of handlers - */ - handler_obj = handler_obj->addr_handler.next; - } - } - - else { - /* Obj_desc does not exist, create one */ - - if (node->type == ACPI_TYPE_ANY) { - type = ACPI_TYPE_DEVICE; - } - - else { - type = node->type; - } - - obj_desc = acpi_cm_create_internal_object (type); - if (!obj_desc) { - status = AE_NO_MEMORY; - goto unlock_and_exit; - } - - /* Init new descriptor */ - - obj_desc->common.type = (u8) type; - - /* Attach the new object to the Node */ - - status = acpi_ns_attach_object (node, obj_desc, (u8) type); - if (ACPI_FAILURE (status)) { - acpi_cm_remove_reference (obj_desc); - goto unlock_and_exit; - } - } - - /* - * Now we can install the handler - * - * At this point we know that there is no existing handler. - * So, we just allocate the object for the handler and link it - * into the list. - */ - handler_obj = acpi_cm_create_internal_object (INTERNAL_TYPE_ADDRESS_HANDLER); - if (!handler_obj) { - status = AE_NO_MEMORY; - goto unlock_and_exit; - } - - handler_obj->addr_handler.space_id = (u8) space_id; - handler_obj->addr_handler.hflags = flags; - handler_obj->addr_handler.next = obj_desc->device.addr_handler; - handler_obj->addr_handler.region_list = NULL; - handler_obj->addr_handler.node = node; - handler_obj->addr_handler.handler = handler; - handler_obj->addr_handler.context = context; - handler_obj->addr_handler.setup = setup; - - /* - * Now walk the namespace finding all of the regions this - * handler will manage. - * - * We start at the device and search the branch toward - * the leaf nodes until either the leaf is encountered or - * a device is detected that has an address handler of the - * same type. - * - * In either case we back up and search down the remainder - * of the branch - */ - status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, device, - ACPI_UINT32_MAX, NS_WALK_UNLOCK, - acpi_ev_addr_handler_helper, - handler_obj, NULL); - - /* - * Place this handler 1st on the list - */ - - handler_obj->common.reference_count = - (u16) (handler_obj->common.reference_count + - obj_desc->common.reference_count - 1); - obj_desc->device.addr_handler = handler_obj; - - -unlock_and_exit: - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_remove_address_space_handler - * - * PARAMETERS: Space_id - The address space ID - * Handler - Address of the handler - * - * RETURN: Status - * - * DESCRIPTION: Install a handler for accesses on an Operation Region - * - ******************************************************************************/ - -ACPI_STATUS -acpi_remove_address_space_handler ( - ACPI_HANDLE device, - ACPI_ADDRESS_SPACE_TYPE space_id, - ADDRESS_SPACE_HANDLER handler) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_OPERAND_OBJECT *handler_obj; - ACPI_OPERAND_OBJECT *region_obj; - ACPI_OPERAND_OBJECT **last_obj_ptr; - ACPI_NAMESPACE_NODE *node; - ACPI_STATUS status = AE_OK; - - - /* Parameter validation */ - - if ((!device) || - ((!handler) && (handler != ACPI_DEFAULT_HANDLER))) { - return (AE_BAD_PARAMETER); - } - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - /* Convert and validate the device handle */ - - node = acpi_ns_convert_handle_to_entry (device); - if (!node) { - status = AE_BAD_PARAMETER; - goto unlock_and_exit; - } - - - /* Make sure the internal object exists */ - - obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) node); - if (!obj_desc) { - /* - * The object DNE. - */ - status = AE_NOT_EXIST; - goto unlock_and_exit; - } - - /* - * find the address handler the user requested - */ - - handler_obj = obj_desc->device.addr_handler; - last_obj_ptr = &obj_desc->device.addr_handler; - while (handler_obj) { - /* - * We have a handler, see if user requested this one - */ - - if(handler_obj->addr_handler.space_id == space_id) { - /* - * Got it, first dereference this in the Regions - */ - region_obj = handler_obj->addr_handler.region_list; - - /* Walk the handler's region list */ - - while (region_obj) { - /* - * First disassociate the handler from the region. - * - * NOTE: this doesn't mean that the region goes away - * The region is just inaccessible as indicated to - * the _REG method - */ - acpi_ev_disassociate_region_from_handler(region_obj, FALSE); - - /* - * Walk the list, since we took the first region and it - * was removed from the list by the dissassociate call - * we just get the first item on the list again - */ - region_obj = handler_obj->addr_handler.region_list; - - } - - /* - * Remove this Handler object from the list - */ - *last_obj_ptr = handler_obj->addr_handler.next; - - /* - * Now we can delete the handler object - */ - acpi_cm_remove_reference (handler_obj); - acpi_cm_remove_reference (handler_obj); - - goto unlock_and_exit; - } - - /* - * Move through the linked list of handlers - */ - last_obj_ptr = &handler_obj->addr_handler.next; - handler_obj = handler_obj->addr_handler.next; - } - - - /* - * The handler does not exist - */ - status = AE_NOT_EXIST; - - -unlock_and_exit: - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/executer/amconfig.c b/reactos/drivers/bus/acpi/executer/amconfig.c deleted file mode 100644 index b2e8c55e0f2..00000000000 --- a/reactos/drivers/bus/acpi/executer/amconfig.c +++ /dev/null @@ -1,297 +0,0 @@ -/****************************************************************************** - * - * Module Name: amconfig - Namespace reconfiguration (Load/Unload opcodes) - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amconfig") - - -/***************************************************************************** - * - * FUNCTION: Acpi_aml_exec_load_table - * - * PARAMETERS: Rgn_desc - Op region where the table will be obtained - * Ddb_handle - Where a handle to the table will be returned - * - * RETURN: Status - * - * DESCRIPTION: Load an ACPI table - * - ****************************************************************************/ - -static ACPI_STATUS -acpi_aml_exec_load_table ( - ACPI_OPERAND_OBJECT *rgn_desc, - ACPI_HANDLE *ddb_handle) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT *table_desc = NULL; - u8 *table_ptr; - u8 *table_data_ptr; - ACPI_TABLE_HEADER table_header; - ACPI_TABLE_DESC table_info; - u32 i; - - - /* TBD: [Unhandled] Object can be either a field or an opregion */ - - - /* Get the table header */ - - table_header.length = 0; - for (i = 0; i < sizeof (ACPI_TABLE_HEADER); i++) { - status = acpi_ev_address_space_dispatch (rgn_desc, ADDRESS_SPACE_READ, - (ACPI_PHYSICAL_ADDRESS) i, 8, - (u32 *) ((u8 *) &table_header + i)); - if (ACPI_FAILURE (status)) { - return (status); - } - } - - /* Allocate a buffer for the entire table */ - - table_ptr = acpi_cm_allocate (table_header.length); - if (!table_ptr) { - return (AE_NO_MEMORY); - } - - /* Copy the header to the buffer */ - - MEMCPY (table_ptr, &table_header, sizeof (ACPI_TABLE_HEADER)); - table_data_ptr = table_ptr + sizeof (ACPI_TABLE_HEADER); - - - /* Get the table from the op region */ - - for (i = 0; i < table_header.length; i++) { - status = acpi_ev_address_space_dispatch (rgn_desc, ADDRESS_SPACE_READ, - (ACPI_PHYSICAL_ADDRESS)i, 8, - (u32 *) (table_data_ptr + i)); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - } - - - /* Table must be either an SSDT or a PSDT */ - - if ((!STRNCMP (table_header.signature, - acpi_gbl_acpi_table_data[ACPI_TABLE_PSDT].signature, - acpi_gbl_acpi_table_data[ACPI_TABLE_PSDT].sig_length)) && - (!STRNCMP (table_header.signature, - acpi_gbl_acpi_table_data[ACPI_TABLE_SSDT].signature, - acpi_gbl_acpi_table_data[ACPI_TABLE_SSDT].sig_length))) { - status = AE_BAD_SIGNATURE; - goto cleanup; - } - - /* Create an object to be the table handle */ - - table_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_REFERENCE); - if (!table_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - - /* Install the new table into the local data structures */ - - table_info.pointer = (ACPI_TABLE_HEADER *) table_ptr; - table_info.length = table_header.length; - table_info.allocation = ACPI_MEM_ALLOCATED; - table_info.base_pointer = table_ptr; - - status = acpi_tb_install_table (NULL, &table_info); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - /* Add the table to the namespace */ - - /* TBD: [Restructure] - change to whatever new interface is appropriate */ -/* - Status = Acpi_load_namespace (); - if (ACPI_FAILURE (Status)) - { -*/ - /* TBD: [Errors] Unload the table on failure ? */ -/* - goto Cleanup; - } -*/ - - - /* TBD: [Investigate] we need a pointer to the table desc */ - - /* Init the table handle */ - - table_desc->reference.opcode = AML_LOAD_OP; - table_desc->reference.object = table_info.installed_desc; - - *ddb_handle = table_desc; - - return (status); - - -cleanup: - - acpi_cm_free (table_desc); - acpi_cm_free (table_ptr); - return (status); - -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_aml_exec_unload_table - * - * PARAMETERS: Ddb_handle - Handle to a previously loaded table - * - * RETURN: Status - * - * DESCRIPTION: Unload an ACPI table - * - ****************************************************************************/ - -static ACPI_STATUS -acpi_aml_exec_unload_table ( - ACPI_HANDLE ddb_handle) -{ - ACPI_STATUS status = AE_NOT_IMPLEMENTED; - ACPI_OPERAND_OBJECT *table_desc = (ACPI_OPERAND_OBJECT *) ddb_handle; - ACPI_TABLE_DESC *table_info; - - - /* Validate the handle */ - /* Although the handle is partially validated in Acpi_aml_exec_reconfiguration(), - * when it calls Acpi_aml_resolve_operands(), the handle is more completely - * validated here. - */ - - if ((!ddb_handle) || - (!VALID_DESCRIPTOR_TYPE (ddb_handle, ACPI_DESC_TYPE_INTERNAL)) || - (((ACPI_OPERAND_OBJECT *)ddb_handle)->common.type != - INTERNAL_TYPE_REFERENCE)) { - return (AE_BAD_PARAMETER); - } - - - /* Get the actual table descriptor from the Ddb_handle */ - - table_info = (ACPI_TABLE_DESC *) table_desc->reference.object; - - /* - * Delete the entire namespace under this table Node - * (Offset contains the Table_id) - */ - - status = acpi_ns_delete_namespace_by_owner (table_info->table_id); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Delete the table itself */ - - acpi_tb_uninstall_table (table_info->installed_desc); - - /* Delete the table descriptor (Ddb_handle) */ - - acpi_cm_remove_reference (table_desc); - - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_aml_exec_reconfiguration - * - * PARAMETERS: Opcode - The opcode to be executed - * Walk_state - Current state of the parse tree walk - * - * RETURN: Status - * - * DESCRIPTION: Reconfiguration opcodes such as LOAD and UNLOAD - * - ****************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_reconfiguration ( - u16 opcode, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT *region_desc = NULL; - ACPI_HANDLE *ddb_handle; - - - /* Resolve the operands */ - - status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state); - /* Get the table handle, common for both opcodes */ - - status |= acpi_ds_obj_stack_pop_object ((ACPI_OPERAND_OBJECT **) &ddb_handle, - walk_state); - - switch (opcode) { - - case AML_LOAD_OP: - - /* Get the region or field descriptor */ - - status |= acpi_ds_obj_stack_pop_object (®ion_desc, walk_state); - if (ACPI_FAILURE (status)) { - acpi_cm_remove_reference (region_desc); - return (status); - } - - status = acpi_aml_exec_load_table (region_desc, ddb_handle); - break; - - - case AML_UNLOAD_OP: - - if (ACPI_FAILURE (status)) { - return (status); - } - - status = acpi_aml_exec_unload_table (ddb_handle); - break; - - - default: - - status = AE_AML_BAD_OPCODE; - break; - } - - - return (status); -} - diff --git a/reactos/drivers/bus/acpi/executer/amconvrt.c b/reactos/drivers/bus/acpi/executer/amconvrt.c deleted file mode 100644 index cb53d1429a6..00000000000 --- a/reactos/drivers/bus/acpi/executer/amconvrt.c +++ /dev/null @@ -1,511 +0,0 @@ -/****************************************************************************** - * - * Module Name: amconvrt - Object conversion routines - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amconvrt") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_convert_to_integer - * - * PARAMETERS: *Obj_desc - Object to be converted. Must be an - * Integer, Buffer, or String - * Walk_state - Current method state - * - * RETURN: Status - * - * DESCRIPTION: Convert an ACPI Object to an integer. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_convert_to_integer ( - ACPI_OPERAND_OBJECT **obj_desc, - ACPI_WALK_STATE *walk_state) -{ - u32 i; - ACPI_OPERAND_OBJECT *ret_desc; - u32 count; - char *pointer; - ACPI_INTEGER result; - u32 integer_size = sizeof (ACPI_INTEGER); - - - switch ((*obj_desc)->common.type) { - case ACPI_TYPE_INTEGER: - return (AE_OK); - - case ACPI_TYPE_STRING: - pointer = (*obj_desc)->string.pointer; - count = (*obj_desc)->string.length; - break; - - case ACPI_TYPE_BUFFER: - pointer = (char *) (*obj_desc)->buffer.pointer; - count = (*obj_desc)->buffer.length; - break; - - default: - return (AE_TYPE); - } - - /* - * Create a new integer - */ - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - return (AE_NO_MEMORY); - } - - - /* Handle both ACPI 1.0 and ACPI 2.0 Integer widths */ - - if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) { - /* - * We are running a method that exists in a 32-bit ACPI table. - * Truncate the value to 32 bits by zeroing out the upper 32-bit field - */ - integer_size = sizeof (u32); - } - - - /* - * Convert the buffer/string to an integer. Note that both buffers and - * strings are treated as raw data - we don't convert ascii to hex for - * strings. - * - * There are two terminating conditions for the loop: - * 1) The size of an integer has been reached, or - * 2) The end of the buffer or string has been reached - */ - result = 0; - - /* Transfer no more than an integer's worth of data */ - - if (count > integer_size) { - count = integer_size; - } - - /* - * String conversion is different than Buffer conversion - */ - switch ((*obj_desc)->common.type) { - case ACPI_TYPE_STRING: - - /* TBD: Need to use 64-bit STRTOUL */ - - /* - * Convert string to an integer - * String must be hexadecimal as per the ACPI specification - */ - - result = STRTOUL (pointer, NULL, 16); - break; - - - case ACPI_TYPE_BUFFER: - - /* - * Buffer conversion - we simply grab enough raw data from the - * buffer to fill an integer - */ - for (i = 0; i < count; i++) { - /* - * Get next byte and shift it into the Result. - * Little endian is used, meaning that the first byte of the buffer - * is the LSB of the integer - */ - result |= (((ACPI_INTEGER) pointer[i]) << (i * 8)); - } - - break; - } - - /* Save the Result, delete original descriptor, store new descriptor */ - - ret_desc->integer.value = result; - - if (walk_state->opcode != AML_STORE_OP) { - acpi_cm_remove_reference (*obj_desc); - } - - *obj_desc = ret_desc; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_convert_to_buffer - * - * PARAMETERS: *Obj_desc - Object to be converted. Must be an - * Integer, Buffer, or String - * Walk_state - Current method state - * - * RETURN: Status - * - * DESCRIPTION: Convert an ACPI Object to an Buffer - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_convert_to_buffer ( - ACPI_OPERAND_OBJECT **obj_desc, - ACPI_WALK_STATE *walk_state) -{ - ACPI_OPERAND_OBJECT *ret_desc; - u32 i; - u32 integer_size = sizeof (ACPI_INTEGER); - u8 *new_buf; - - - switch ((*obj_desc)->common.type) { - case ACPI_TYPE_INTEGER: - - /* - * Create a new Buffer - */ - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_BUFFER); - if (!ret_desc) { - return (AE_NO_MEMORY); - } - - /* Handle both ACPI 1.0 and ACPI 2.0 Integer widths */ - - if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) { - /* - * We are running a method that exists in a 32-bit ACPI table. - * Truncate the value to 32 bits by zeroing out the upper - * 32-bit field - */ - integer_size = sizeof (u32); - } - - /* Need enough space for one integers */ - - ret_desc->buffer.length = integer_size; - new_buf = acpi_cm_callocate (integer_size); - if (!new_buf) { - REPORT_ERROR - (("Aml_exec_dyadic2_r/Concat_op: Buffer allocation failure\n")); - acpi_cm_remove_reference (ret_desc); - return (AE_NO_MEMORY); - } - - /* Copy the integer to the buffer */ - - for (i = 0; i < integer_size; i++) { - new_buf[i] = (u8) ((*obj_desc)->integer.value >> (i * 8)); - } - ret_desc->buffer.pointer = new_buf; - - /* Return the new buffer descriptor */ - - if (walk_state->opcode != AML_STORE_OP) { - acpi_cm_remove_reference (*obj_desc); - } - *obj_desc = ret_desc; - break; - - - case ACPI_TYPE_STRING: - break; - - - case ACPI_TYPE_BUFFER: - break; - - - default: - return (AE_TYPE); - break; - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_convert_to_string - * - * PARAMETERS: *Obj_desc - Object to be converted. Must be an - * Integer, Buffer, or String - * Walk_state - Current method state - * - * RETURN: Status - * - * DESCRIPTION: Convert an ACPI Object to a string - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_convert_to_string ( - ACPI_OPERAND_OBJECT **obj_desc, - ACPI_WALK_STATE *walk_state) -{ - ACPI_OPERAND_OBJECT *ret_desc; - u32 i; - u32 index; - u32 integer_size = sizeof (ACPI_INTEGER); - u8 *new_buf; - u8 *pointer; - - - switch ((*obj_desc)->common.type) { - case ACPI_TYPE_INTEGER: - - /* - * Create a new String - */ - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_STRING); - if (!ret_desc) { - return (AE_NO_MEMORY); - } - - /* Handle both ACPI 1.0 and ACPI 2.0 Integer widths */ - - if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) { - /* - * We are running a method that exists in a 32-bit ACPI table. - * Truncate the value to 32 bits by zeroing out the upper - * 32-bit field - */ - integer_size = sizeof (u32); - } - - /* Need enough space for one ASCII integer plus null terminator */ - - ret_desc->string.length = (integer_size * 2) + 1; - new_buf = acpi_cm_callocate (ret_desc->string.length); - if (!new_buf) { - REPORT_ERROR - (("Aml_exec_dyadic2_r/Concat_op: Buffer allocation failure\n")); - acpi_cm_remove_reference (ret_desc); - return (AE_NO_MEMORY); - } - - /* Copy the integer to the buffer */ - - for (i = 0; i < (integer_size * 2); i++) { - new_buf[i] = acpi_gbl_hex_to_ascii [((*obj_desc)->integer.value >> (i * 4)) & 0xF]; - } - - /* Null terminate */ - - new_buf [i] = 0; - ret_desc->buffer.pointer = new_buf; - - /* Return the new buffer descriptor */ - - if (walk_state->opcode != AML_STORE_OP) { - acpi_cm_remove_reference (*obj_desc); - } - *obj_desc = ret_desc; - - return (AE_OK); - - - case ACPI_TYPE_BUFFER: - - if (((*obj_desc)->buffer.length * 3) > ACPI_MAX_STRING_CONVERSION) { - return (AE_AML_STRING_LIMIT); - } - - /* - * Create a new String - */ - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_STRING); - if (!ret_desc) { - return (AE_NO_MEMORY); - } - - /* Need enough space for one ASCII integer plus null terminator */ - - ret_desc->string.length = (*obj_desc)->buffer.length * 3; - new_buf = acpi_cm_callocate (ret_desc->string.length + 1); - if (!new_buf) { - REPORT_ERROR - (("Aml_exec_dyadic2_r/Concat_op: Buffer allocation failure\n")); - acpi_cm_remove_reference (ret_desc); - return (AE_NO_MEMORY); - } - - /* - * Convert each byte of the buffer to two ASCII characters plus a space. - */ - pointer = (*obj_desc)->buffer.pointer; - index = 0; - for (i = 0; i < (*obj_desc)->buffer.length; i++) { - new_buf[index + 0] = acpi_gbl_hex_to_ascii [pointer[i] & 0x0F]; - new_buf[index + 1] = acpi_gbl_hex_to_ascii [(pointer[i] >> 4) & 0x0F]; - new_buf[index + 2] = ' '; - index += 3; - } - - /* Null terminate */ - - new_buf [index] = 0; - ret_desc->buffer.pointer = new_buf; - - /* Return the new buffer descriptor */ - - if (walk_state->opcode != AML_STORE_OP) { - acpi_cm_remove_reference (*obj_desc); - } - *obj_desc = ret_desc; - break; - - - case ACPI_TYPE_STRING: - break; - - - default: - return (AE_TYPE); - break; - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_convert_to_target_type - * - * PARAMETERS: *Obj_desc - Object to be converted. - * Walk_state - Current method state - * - * RETURN: Status - * - * DESCRIPTION: - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_convert_to_target_type ( - OBJECT_TYPE_INTERNAL destination_type, - ACPI_OPERAND_OBJECT **obj_desc, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status = AE_OK; - - - /* - * If required by the target, - * perform implicit conversion on the source before we store it. - */ - - switch (GET_CURRENT_ARG_TYPE (walk_state->op_info->runtime_args)) { - case ARGI_SIMPLE_TARGET: - case ARGI_FIXED_TARGET: - case ARGI_INTEGER_REF: /* Handles Increment, Decrement cases */ - - switch (destination_type) { - case INTERNAL_TYPE_DEF_FIELD: - /* - * Named field can always handle conversions - */ - break; - - default: - /* No conversion allowed for these types */ - - if (destination_type != (*obj_desc)->common.type) { - status = AE_TYPE; - } - } - break; - - - case ARGI_TARGETREF: - - switch (destination_type) { - case ACPI_TYPE_INTEGER: - case ACPI_TYPE_FIELD_UNIT: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: - /* - * These types require an Integer operand. We can convert - * a Buffer or a String to an Integer if necessary. - */ - status = acpi_aml_convert_to_integer (obj_desc, walk_state); - break; - - - case ACPI_TYPE_STRING: - - /* - * The operand must be a String. We can convert an - * Integer or Buffer if necessary - */ - status = acpi_aml_convert_to_string (obj_desc, walk_state); - break; - - - case ACPI_TYPE_BUFFER: - - /* - * The operand must be a String. We can convert an - * Integer or Buffer if necessary - */ - status = acpi_aml_convert_to_buffer (obj_desc, walk_state); - break; - } - break; - - - case ARGI_REFERENCE: - /* - * Create_xxxx_field cases - we are storing the field object into the name - */ - break; - - - default: - status = AE_AML_INTERNAL; - } - - - /* - * Source-to-Target conversion semantics: - * - * If conversion to the target type cannot be performed, then simply - * overwrite the target with the new object and type. - */ - if (status == AE_TYPE) { - status = AE_OK; - } - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/executer/amcreate.c b/reactos/drivers/bus/acpi/executer/amcreate.c deleted file mode 100644 index e8c5704546d..00000000000 --- a/reactos/drivers/bus/acpi/executer/amcreate.c +++ /dev/null @@ -1,714 +0,0 @@ -/****************************************************************************** - * - * Module Name: amcreate - Named object creation - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amcreate") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_exec_create_field - * - * PARAMETERS: Opcode - The opcode to be executed - * Operands - List of operands for the opcode - * - * RETURN: Status - * - * DESCRIPTION: Execute Create_field operators: Create_bit_field_op, - * Create_byte_field_op, Create_word_field_op, Create_dWord_field_op, - * Create_field_op (which define fields in buffers) - * - * ALLOCATION: Deletes Create_field_op's count operand descriptor - * - * - * ACPI SPECIFICATION REFERENCES: - * Def_create_bit_field := Create_bit_field_op Src_buf Bit_idx Name_string - * Def_create_byte_field := Create_byte_field_op Src_buf Byte_idx Name_string - * Def_create_dWord_field := Create_dWord_field_op Src_buf Byte_idx Name_string - * Def_create_field := Create_field_op Src_buf Bit_idx Num_bits Name_string - * Def_create_word_field := Create_word_field_op Src_buf Byte_idx Name_string - * Bit_index := Term_arg=>Integer - * Byte_index := Term_arg=>Integer - * Num_bits := Term_arg=>Integer - * Source_buff := Term_arg=>Buffer - * - ******************************************************************************/ - - -ACPI_STATUS -acpi_aml_exec_create_field ( - u8 *aml_ptr, - u32 aml_length, - ACPI_NAMESPACE_NODE *node, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_OPERAND_OBJECT *tmp_desc; - - - /* Create the region descriptor */ - - obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_FIELD_UNIT); - if (!obj_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* Construct the field object */ - - obj_desc->field_unit.access = (u8) ACCESS_ANY_ACC; - obj_desc->field_unit.lock_rule = (u8) GLOCK_NEVER_LOCK; - obj_desc->field_unit.update_rule = (u8) UPDATE_PRESERVE; - - /* - * Allocate a method object for this field unit - */ - - obj_desc->field_unit.extra = acpi_cm_create_internal_object ( - INTERNAL_TYPE_EXTRA); - if (!obj_desc->field_unit.extra) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* - * Remember location in AML stream of the field unit - * opcode and operands -- since the buffer and index - * operands must be evaluated. - */ - - obj_desc->field_unit.extra->extra.pcode = aml_ptr; - obj_desc->field_unit.extra->extra.pcode_length = aml_length; - obj_desc->field_unit.node = node; - - - /* - * This operation is supposed to cause the destination Name to refer - * to the defined Field_unit -- it must not store the constructed - * Field_unit object (or its current value) in some location that the - * Name may already be pointing to. So, if the Name currently contains - * a reference which would cause Acpi_aml_exec_store() to perform an indirect - * store rather than setting the value of the Name itself, clobber that - * reference before calling Acpi_aml_exec_store(). - */ - - /* Type of Name's existing value */ - - switch (acpi_ns_get_type (node)) { - - case ACPI_TYPE_FIELD_UNIT: - - case INTERNAL_TYPE_ALIAS: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_DEF_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: - - tmp_desc = acpi_ns_get_attached_object (node); - if (tmp_desc) { - /* - * There is an existing object here; delete it and zero out the - * object field within the Node - */ - - acpi_cm_remove_reference (tmp_desc); - acpi_ns_attach_object ((ACPI_NAMESPACE_NODE *) node, NULL, - ACPI_TYPE_ANY); - } - - /* Set the type to ANY (or the store below will fail) */ - - ((ACPI_NAMESPACE_NODE *) node)->type = ACPI_TYPE_ANY; - - break; - - - default: - - break; - } - - - /* Store constructed field descriptor in result location */ - - status = acpi_aml_exec_store (obj_desc, (ACPI_OPERAND_OBJECT *) node, walk_state); - - /* - * If the field descriptor was not physically stored (or if a failure - * above), we must delete it - */ - if (obj_desc->common.reference_count <= 1) { - acpi_cm_remove_reference (obj_desc); - } - - - return (AE_OK); - - -cleanup: - - /* Delete region object and method subobject */ - - if (obj_desc) { - /* Remove deletes both objects! */ - - acpi_cm_remove_reference (obj_desc); - obj_desc = NULL; - } - - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_aml_exec_create_alias - * - * PARAMETERS: Operands - List of operands for the opcode - * - * RETURN: Status - * - * DESCRIPTION: Create a new named alias - * - ****************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_create_alias ( - ACPI_WALK_STATE *walk_state) -{ - ACPI_NAMESPACE_NODE *source_node; - ACPI_NAMESPACE_NODE *alias_node; - ACPI_STATUS status; - - - /* Get the source/alias operands (both NTEs) */ - - status = acpi_ds_obj_stack_pop_object ((ACPI_OPERAND_OBJECT **) &source_node, - walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * Don't pop it, it gets removed in the calling routine - */ - - alias_node = acpi_ds_obj_stack_get_value (0, walk_state); - - /* Add an additional reference to the object */ - - acpi_cm_add_reference (source_node->object); - - /* - * Attach the original source Node to the new Alias Node. - */ - status = acpi_ns_attach_object (alias_node, source_node->object, - source_node->type); - - - /* - * The new alias assumes the type of the source, but it points - * to the same object. The reference count of the object has two - * additional references to prevent deletion out from under either the - * source or the alias Node - */ - - /* Since both operands are NTEs, we don't need to delete them */ - - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_aml_exec_create_event - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Create a new event object - * - ****************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_create_event ( - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT *obj_desc; - - - BREAKPOINT3; - - obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_EVENT); - if (!obj_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* Create the actual OS semaphore */ - - /* TBD: [Investigate] should be created with 0 or 1 units? */ - - status = acpi_os_create_semaphore (ACPI_NO_UNIT_LIMIT, 1, - &obj_desc->event.semaphore); - if (ACPI_FAILURE (status)) { - acpi_cm_remove_reference (obj_desc); - goto cleanup; - } - - /* Attach object to the Node */ - - status = acpi_ns_attach_object (acpi_ds_obj_stack_get_value (0, walk_state), - obj_desc, (u8) ACPI_TYPE_EVENT); - if (ACPI_FAILURE (status)) { - acpi_os_delete_semaphore (obj_desc->event.semaphore); - acpi_cm_remove_reference (obj_desc); - goto cleanup; - } - - -cleanup: - - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_aml_exec_create_mutex - * - * PARAMETERS: Interpreter_mode - Current running mode (load1/Load2/Exec) - * Operands - List of operands for the opcode - * - * RETURN: Status - * - * DESCRIPTION: Create a new mutex object - * - ****************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_create_mutex ( - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status = AE_OK; - ACPI_OPERAND_OBJECT *sync_desc; - ACPI_OPERAND_OBJECT *obj_desc; - - - /* Get the operand */ - - status = acpi_ds_obj_stack_pop_object (&sync_desc, walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Attempt to allocate a new object */ - - obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_MUTEX); - if (!obj_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* Create the actual OS semaphore */ - - status = acpi_os_create_semaphore (1, 1, &obj_desc->mutex.semaphore); - if (ACPI_FAILURE (status)) { - acpi_cm_remove_reference (obj_desc); - goto cleanup; - } - - obj_desc->mutex.sync_level = (u8) sync_desc->integer.value; - - /* Obj_desc was on the stack top, and the name is below it */ - - status = acpi_ns_attach_object (acpi_ds_obj_stack_get_value (0, walk_state), - obj_desc, (u8) ACPI_TYPE_MUTEX); - if (ACPI_FAILURE (status)) { - acpi_os_delete_semaphore (obj_desc->mutex.semaphore); - acpi_cm_remove_reference (obj_desc); - goto cleanup; - } - - -cleanup: - - /* Always delete the operand */ - - acpi_cm_remove_reference (sync_desc); - - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_aml_exec_create_region - * - * PARAMETERS: Aml_ptr - Pointer to the region declaration AML - * Aml_length - Max length of the declaration AML - * Operands - List of operands for the opcode - * Interpreter_mode - Load1/Load2/Execute - * - * RETURN: Status - * - * DESCRIPTION: Create a new operation region object - * - ****************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_create_region ( - u8 *aml_ptr, - u32 aml_length, - u8 region_space, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_NAMESPACE_NODE *node; - - - /* - * Space ID must be one of the predefined IDs, or in the user-defined - * range - */ - if ((region_space >= NUM_REGION_TYPES) && - (region_space < USER_REGION_BEGIN)) { - REPORT_ERROR (("Invalid Address_space type %X\n", region_space)); - return (AE_AML_INVALID_SPACE_ID); - } - - - /* Get the Node from the object stack */ - - node = (ACPI_NAMESPACE_NODE *) acpi_ds_obj_stack_get_value (0, walk_state); - - /* Create the region descriptor */ - - obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_REGION); - if (!obj_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* - * Allocate a method object for this region. - */ - - obj_desc->region.extra = acpi_cm_create_internal_object ( - INTERNAL_TYPE_EXTRA); - if (!obj_desc->region.extra) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* - * Remember location in AML stream of address & length - * operands since they need to be evaluated at run time. - */ - - obj_desc->region.extra->extra.pcode = aml_ptr; - obj_desc->region.extra->extra.pcode_length = aml_length; - - /* Init the region from the operands */ - - obj_desc->region.space_id = region_space; - obj_desc->region.address = 0; - obj_desc->region.length = 0; - - - /* Install the new region object in the parent Node */ - - obj_desc->region.node = node; - - status = acpi_ns_attach_object (node, obj_desc, - (u8) ACPI_TYPE_REGION); - - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - /* - * If we have a valid region, initialize it - * Namespace is NOT locked at this point. - */ - - status = acpi_ev_initialize_region (obj_desc, FALSE); - - if (ACPI_FAILURE (status)) { - /* - * If AE_NOT_EXIST is returned, it is not fatal - * because many regions get created before a handler - * is installed for said region. - */ - if (AE_NOT_EXIST == status) { - status = AE_OK; - } - } - -cleanup: - - if (ACPI_FAILURE (status)) { - /* Delete region object and method subobject */ - - if (obj_desc) { - /* Remove deletes both objects! */ - - acpi_cm_remove_reference (obj_desc); - obj_desc = NULL; - } - } - - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_aml_exec_create_processor - * - * PARAMETERS: Op - Op containing the Processor definition and - * args - * Processor_nTE - Node for the containing Node - * - * RETURN: Status - * - * DESCRIPTION: Create a new processor object and populate the fields - * - ****************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_create_processor ( - ACPI_PARSE_OBJECT *op, - ACPI_HANDLE processor_nTE) -{ - ACPI_STATUS status; - ACPI_PARSE_OBJECT *arg; - ACPI_OPERAND_OBJECT *obj_desc; - - - obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_PROCESSOR); - if (!obj_desc) { - status = AE_NO_MEMORY; - return (status); - } - - /* Install the new processor object in the parent Node */ - - status = acpi_ns_attach_object (processor_nTE, obj_desc, - (u8) ACPI_TYPE_PROCESSOR); - if (ACPI_FAILURE (status)) { - return(status); - } - - arg = op->value.arg; - - /* check existence */ - - if (!arg) { - status = AE_AML_NO_OPERAND; - return (status); - } - - /* First arg is the Processor ID */ - - obj_desc->processor.proc_id = (u8) arg->value.integer; - - /* Move to next arg and check existence */ - - arg = arg->next; - if (!arg) { - status = AE_AML_NO_OPERAND; - return (status); - } - - /* Second arg is the PBlock Address */ - - obj_desc->processor.address = (ACPI_IO_ADDRESS) arg->value.integer; - - /* Move to next arg and check existence */ - - arg = arg->next; - if (!arg) { - status = AE_AML_NO_OPERAND; - return (status); - } - - /* Third arg is the PBlock Length */ - - obj_desc->processor.length = (u8) arg->value.integer; - - return (AE_OK); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_aml_exec_create_power_resource - * - * PARAMETERS: Op - Op containing the Power_resource definition - * and args - * Power_res_nTE - Node for the containing Node - * - * RETURN: Status - * - * DESCRIPTION: Create a new Power_resource object and populate the fields - * - ****************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_create_power_resource ( - ACPI_PARSE_OBJECT *op, - ACPI_HANDLE power_res_nTE) -{ - ACPI_STATUS status; - ACPI_PARSE_OBJECT *arg; - ACPI_OPERAND_OBJECT *obj_desc; - - - obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_POWER); - if (!obj_desc) { - status = AE_NO_MEMORY; - return (status); - } - - /* Install the new power resource object in the parent Node */ - - status = acpi_ns_attach_object (power_res_nTE, obj_desc, - (u8) ACPI_TYPE_POWER); - if (ACPI_FAILURE (status)) { - return(status); - } - - arg = op->value.arg; - - /* check existence */ - - if (!arg) { - status = AE_AML_NO_OPERAND; - return (status); - } - - /* First arg is the System_level */ - - obj_desc->power_resource.system_level = (u8) arg->value.integer; - - /* Move to next arg and check existence */ - - arg = arg->next; - if (!arg) { - status = AE_AML_NO_OPERAND; - return (status); - } - - /* Second arg is the PBlock Address */ - - obj_desc->power_resource.resource_order = (u16) arg->value.integer; - - return (AE_OK); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_aml_exec_create_method - * - * PARAMETERS: Aml_ptr - First byte of the method's AML - * Aml_length - AML byte count for this method - * Method_flags - AML method flag byte - * Method - Method Node - * - * RETURN: Status - * - * DESCRIPTION: Create a new method object - * - ****************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_create_method ( - u8 *aml_ptr, - u32 aml_length, - u32 method_flags, - ACPI_HANDLE method) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_STATUS status; - - - /* Create a new method object */ - - obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_METHOD); - if (!obj_desc) { - return (AE_NO_MEMORY); - } - - /* Get the method's AML pointer/length from the Op */ - - obj_desc->method.pcode = aml_ptr; - obj_desc->method.pcode_length = aml_length; - - /* - * First argument is the Method Flags (contains parameter count for the - * method) - */ - - obj_desc->method.method_flags = (u8) method_flags; - obj_desc->method.param_count = (u8) (method_flags & - METHOD_FLAGS_ARG_COUNT); - - /* - * Get the concurrency count. If required, a semaphore will be - * created for this method when it is parsed. - */ - if (method_flags & METHOD_FLAGS_SERIALIZED) { - /* - * ACPI 1.0: Concurrency = 1 - * ACPI 2.0: Concurrency = (Sync_level (in method declaration) + 1) - */ - obj_desc->method.concurrency = (u8) - (((method_flags & METHOD_FLAGS_SYNCH_LEVEL) >> 4) + 1); - } - - else { - obj_desc->method.concurrency = INFINITE_CONCURRENCY; - } - - /* Attach the new object to the method Node */ - - status = acpi_ns_attach_object (method, obj_desc, (u8) ACPI_TYPE_METHOD); - if (ACPI_FAILURE (status)) { - acpi_cm_delete_object_desc (obj_desc); - } - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/executer/amdump.c b/reactos/drivers/bus/acpi/executer/amdump.c deleted file mode 100644 index 4f04ee97033..00000000000 --- a/reactos/drivers/bus/acpi/executer/amdump.c +++ /dev/null @@ -1,37 +0,0 @@ -/****************************************************************************** - * - * Module Name: amdump - Interpreter debug output routines - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amdump") - - -/* - * The following routines are used for debug output only - */ - - diff --git a/reactos/drivers/bus/acpi/executer/amdyadic.c b/reactos/drivers/bus/acpi/executer/amdyadic.c deleted file mode 100644 index 66744f89b6f..00000000000 --- a/reactos/drivers/bus/acpi/executer/amdyadic.c +++ /dev/null @@ -1,870 +0,0 @@ -/****************************************************************************** - * - * Module Name: amdyadic - ACPI AML (p-code) execution for dyadic operators - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amdyadic") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_do_concatenate - * - * PARAMETERS: *Obj_desc - Object to be converted. Must be an - * Integer, Buffer, or String - * - * RETURN: Status - * - * DESCRIPTION: Concatenate two objects OF THE SAME TYPE. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_do_concatenate ( - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_OPERAND_OBJECT *obj_desc2, - ACPI_OPERAND_OBJECT **actual_ret_desc, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status; - u32 i; - ACPI_INTEGER this_integer; - ACPI_OPERAND_OBJECT *ret_desc; - NATIVE_CHAR *new_buf; - u32 integer_size = sizeof (ACPI_INTEGER); - - - /* - * There are three cases to handle: - * 1) Two Integers concatenated to produce a buffer - * 2) Two Strings concatenated to produce a string - * 3) Two Buffers concatenated to produce a buffer - */ - switch (obj_desc->common.type) { - case ACPI_TYPE_INTEGER: - - /* Handle both ACPI 1.0 and ACPI 2.0 Integer widths */ - - if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) { - /* - * We are running a method that exists in a 32-bit ACPI table. - * Truncate the value to 32 bits by zeroing out the upper - * 32-bit field - */ - integer_size = sizeof (u32); - } - - /* Result of two integers is a buffer */ - - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_BUFFER); - if (!ret_desc) { - return (AE_NO_MEMORY); - } - - /* Need enough space for two integers */ - - ret_desc->buffer.length = integer_size * 2; - new_buf = acpi_cm_callocate (ret_desc->buffer.length); - if (!new_buf) { - REPORT_ERROR - (("Aml_exec_dyadic2_r/Concat_op: Buffer allocation failure\n")); - status = AE_NO_MEMORY; - goto cleanup; - } - - ret_desc->buffer.pointer = (u8 *) new_buf; - - /* Convert the first integer */ - - this_integer = obj_desc->integer.value; - for (i = 0; i < integer_size; i++) { - new_buf[i] = (u8) this_integer; - this_integer >>= 8; - } - - /* Convert the second integer */ - - this_integer = obj_desc2->integer.value; - for (; i < (integer_size * 2); i++) { - new_buf[i] = (u8) this_integer; - this_integer >>= 8; - } - - break; - - - case ACPI_TYPE_STRING: - - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_STRING); - if (!ret_desc) { - return (AE_NO_MEMORY); - } - - /* Operand1 is string */ - - new_buf = acpi_cm_allocate (obj_desc->string.length + - obj_desc2->string.length + 1); - if (!new_buf) { - REPORT_ERROR - (("Aml_exec_dyadic2_r/Concat_op: String allocation failure\n")); - status = AE_NO_MEMORY; - goto cleanup; - } - - STRCPY (new_buf, obj_desc->string.pointer); - STRCPY (new_buf + obj_desc->string.length, - obj_desc2->string.pointer); - - /* Point the return object to the new string */ - - ret_desc->string.pointer = new_buf; - ret_desc->string.length = obj_desc->string.length += - obj_desc2->string.length; - break; - - - case ACPI_TYPE_BUFFER: - - /* Operand1 is a buffer */ - - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_BUFFER); - if (!ret_desc) { - return (AE_NO_MEMORY); - } - - new_buf = acpi_cm_allocate (obj_desc->buffer.length + - obj_desc2->buffer.length); - if (!new_buf) { - REPORT_ERROR - (("Aml_exec_dyadic2_r/Concat_op: Buffer allocation failure\n")); - status = AE_NO_MEMORY; - goto cleanup; - } - - MEMCPY (new_buf, obj_desc->buffer.pointer, - obj_desc->buffer.length); - MEMCPY (new_buf + obj_desc->buffer.length, obj_desc2->buffer.pointer, - obj_desc2->buffer.length); - - /* - * Point the return object to the new buffer - */ - - ret_desc->buffer.pointer = (u8 *) new_buf; - ret_desc->buffer.length = obj_desc->buffer.length + - obj_desc2->buffer.length; - break; - - default: - status = AE_AML_INTERNAL; - ret_desc = NULL; - } - - - *actual_ret_desc = ret_desc; - return (AE_OK); - - -cleanup: - - acpi_cm_remove_reference (ret_desc); - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_exec_dyadic1 - * - * PARAMETERS: Opcode - The opcode to be executed - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 1 dyadic operator with numeric operands: - * Notify_op - * - * ALLOCATION: Deletes both operands - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_dyadic1 ( - u16 opcode, - ACPI_WALK_STATE *walk_state) -{ - ACPI_OPERAND_OBJECT *obj_desc = NULL; - ACPI_OPERAND_OBJECT *val_desc = NULL; - ACPI_NAMESPACE_NODE *node; - ACPI_STATUS status = AE_OK; - - - /* Resolve all operands */ - - status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state); - /* Get the operands */ - - status |= acpi_ds_obj_stack_pop_object (&val_desc, walk_state); - status |= acpi_ds_obj_stack_pop_object (&obj_desc, walk_state); - if (ACPI_FAILURE (status)) { - /* Invalid parameters on object stack */ - - goto cleanup; - } - - - /* Examine the opcode */ - - switch (opcode) { - - /* Def_notify := Notify_op Notify_object Notify_value */ - - case AML_NOTIFY_OP: - - /* The Obj_desc is actually an Node */ - - node = (ACPI_NAMESPACE_NODE *) obj_desc; - obj_desc = NULL; - - /* Object must be a device or thermal zone */ - - if (node && val_desc) { - switch (node->type) { - case ACPI_TYPE_DEVICE: - case ACPI_TYPE_THERMAL: - - /* - * Dispatch the notify to the appropriate handler - * NOTE: the request is queued for execution after this method - * completes. The notify handlers are NOT invoked synchronously - * from this thread -- because handlers may in turn run other - * control methods. - */ - - status = acpi_ev_queue_notify_request (node, - (u32) val_desc->integer.value); - break; - - default: - status = AE_AML_OPERAND_TYPE; - break; - } - } - break; - - default: - - REPORT_ERROR (("Acpi_aml_exec_dyadic1: Unknown dyadic opcode %X\n", - opcode)); - status = AE_AML_BAD_OPCODE; - } - - -cleanup: - - /* Always delete both operands */ - - acpi_cm_remove_reference (val_desc); - acpi_cm_remove_reference (obj_desc); - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_exec_dyadic2_r - * - * PARAMETERS: Opcode - The opcode to be executed - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 2 dyadic operator with numeric operands and - * one or two result operands. - * - * ALLOCATION: Deletes one operand descriptor -- other remains on stack - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_dyadic2_r ( - u16 opcode, - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **return_desc) -{ - ACPI_OPERAND_OBJECT *obj_desc = NULL; - ACPI_OPERAND_OBJECT *obj_desc2 = NULL; - ACPI_OPERAND_OBJECT *res_desc = NULL; - ACPI_OPERAND_OBJECT *res_desc2 = NULL; - ACPI_OPERAND_OBJECT *ret_desc = NULL; - ACPI_OPERAND_OBJECT *ret_desc2 = NULL; - ACPI_STATUS status = AE_OK; - u32 num_operands = 3; - - - /* Resolve all operands */ - - status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state); - /* Get all operands */ - - if (AML_DIVIDE_OP == opcode) { - num_operands = 4; - status |= acpi_ds_obj_stack_pop_object (&res_desc2, walk_state); - } - - status |= acpi_ds_obj_stack_pop_object (&res_desc, walk_state); - status |= acpi_ds_obj_stack_pop_object (&obj_desc2, walk_state); - status |= acpi_ds_obj_stack_pop_object (&obj_desc, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - - /* Create an internal return object if necessary */ - - switch (opcode) { - case AML_ADD_OP: - case AML_BIT_AND_OP: - case AML_BIT_NAND_OP: - case AML_BIT_OR_OP: - case AML_BIT_NOR_OP: - case AML_BIT_XOR_OP: - case AML_DIVIDE_OP: - case AML_MULTIPLY_OP: - case AML_SHIFT_LEFT_OP: - case AML_SHIFT_RIGHT_OP: - case AML_SUBTRACT_OP: - - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - break; - } - - - /* - * Execute the opcode - */ - - switch (opcode) { - - /* Def_add := Add_op Operand1 Operand2 Result */ - - case AML_ADD_OP: - - ret_desc->integer.value = obj_desc->integer.value + - obj_desc2->integer.value; - break; - - - /* Def_and := And_op Operand1 Operand2 Result */ - - case AML_BIT_AND_OP: - - ret_desc->integer.value = obj_desc->integer.value & - obj_desc2->integer.value; - break; - - - /* Def_nAnd := NAnd_op Operand1 Operand2 Result */ - - case AML_BIT_NAND_OP: - - ret_desc->integer.value = ~(obj_desc->integer.value & - obj_desc2->integer.value); - break; - - - /* Def_or := Or_op Operand1 Operand2 Result */ - - case AML_BIT_OR_OP: - - ret_desc->integer.value = obj_desc->integer.value | - obj_desc2->integer.value; - break; - - - /* Def_nOr := NOr_op Operand1 Operand2 Result */ - - case AML_BIT_NOR_OP: - - ret_desc->integer.value = ~(obj_desc->integer.value | - obj_desc2->integer.value); - break; - - - /* Def_xOr := XOr_op Operand1 Operand2 Result */ - - case AML_BIT_XOR_OP: - - ret_desc->integer.value = obj_desc->integer.value ^ - obj_desc2->integer.value; - break; - - - /* Def_divide := Divide_op Dividend Divisor Remainder Quotient */ - - case AML_DIVIDE_OP: - - if (!obj_desc2->integer.value) { - REPORT_ERROR - (("Aml_exec_dyadic2_r/Divide_op: Divide by zero\n")); - - status = AE_AML_DIVIDE_BY_ZERO; - goto cleanup; - } - - ret_desc2 = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc2) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* Remainder (modulo) */ - - ret_desc->integer.value = ACPI_MODULO (obj_desc->integer.value, - obj_desc2->integer.value); - - /* Result (what we used to call the quotient) */ - - ret_desc2->integer.value = ACPI_DIVIDE (obj_desc->integer.value, - obj_desc2->integer.value); - break; - - - /* Def_multiply := Multiply_op Operand1 Operand2 Result */ - - case AML_MULTIPLY_OP: - - ret_desc->integer.value = obj_desc->integer.value * - obj_desc2->integer.value; - break; - - - /* Def_shift_left := Shift_left_op Operand Shift_count Result */ - - case AML_SHIFT_LEFT_OP: - - ret_desc->integer.value = obj_desc->integer.value << - obj_desc2->integer.value; - break; - - - /* Def_shift_right := Shift_right_op Operand Shift_count Result */ - - case AML_SHIFT_RIGHT_OP: - - ret_desc->integer.value = obj_desc->integer.value >> - obj_desc2->integer.value; - break; - - - /* Def_subtract := Subtract_op Operand1 Operand2 Result */ - - case AML_SUBTRACT_OP: - - ret_desc->integer.value = obj_desc->integer.value - - obj_desc2->integer.value; - break; - - - /* Def_concat := Concat_op Data1 Data2 Result */ - - case AML_CONCAT_OP: - - - /* - * Convert the second operand if necessary. The first operand - * determines the type of the second operand, (See the Data Types - * section of the ACPI specification.) Both object types are - * guaranteed to be either Integer/String/Buffer by the operand - * resolution mechanism above. - */ - - switch (obj_desc->common.type) { - case ACPI_TYPE_INTEGER: - status = acpi_aml_convert_to_integer (&obj_desc2, walk_state); - break; - - case ACPI_TYPE_STRING: - status = acpi_aml_convert_to_string (&obj_desc2, walk_state); - break; - - case ACPI_TYPE_BUFFER: - status = acpi_aml_convert_to_buffer (&obj_desc2, walk_state); - break; - - default: - status = AE_AML_INTERNAL; - } - - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - - /* - * Both operands are now known to be the same object type - * (Both are Integer, String, or Buffer), and we can now perform the - * concatenation. - */ - status = acpi_aml_do_concatenate (obj_desc, obj_desc2, &ret_desc, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - break; - - - default: - - REPORT_ERROR (("Acpi_aml_exec_dyadic2_r: Unknown dyadic opcode %X\n", - opcode)); - status = AE_AML_BAD_OPCODE; - goto cleanup; - } - - - /* - * Store the result of the operation (which is now in Obj_desc) into - * the result descriptor, or the location pointed to by the result - * descriptor (Res_desc). - */ - - status = acpi_aml_exec_store (ret_desc, res_desc, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - if (AML_DIVIDE_OP == opcode) { - status = acpi_aml_exec_store (ret_desc2, res_desc2, walk_state); - - /* - * Since the remainder is not returned, remove a reference to - * the object we created earlier - */ - - acpi_cm_remove_reference (ret_desc2); - } - - -cleanup: - - /* Always delete the operands */ - - acpi_cm_remove_reference (obj_desc); - acpi_cm_remove_reference (obj_desc2); - - - /* Delete return object on error */ - - if (ACPI_FAILURE (status)) { - /* On failure, delete the result ops */ - - acpi_cm_remove_reference (res_desc); - acpi_cm_remove_reference (res_desc2); - - if (ret_desc) { - /* And delete the internal return object */ - - acpi_cm_remove_reference (ret_desc); - ret_desc = NULL; - } - } - - /* Set the return object and exit */ - - *return_desc = ret_desc; - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_exec_dyadic2_s - * - * PARAMETERS: Opcode - The opcode to be executed - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 2 dyadic synchronization operator - * - * ALLOCATION: Deletes one operand descriptor -- other remains on stack - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_dyadic2_s ( - u16 opcode, - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **return_desc) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_OPERAND_OBJECT *time_desc; - ACPI_OPERAND_OBJECT *ret_desc = NULL; - ACPI_STATUS status; - - - /* Resolve all operands */ - - status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state); - /* Get all operands */ - - status |= acpi_ds_obj_stack_pop_object (&time_desc, walk_state); - status |= acpi_ds_obj_stack_pop_object (&obj_desc, walk_state); - if (ACPI_FAILURE (status)) { - /* Invalid parameters on object stack */ - - goto cleanup; - } - - - /* Create the internal return object */ - - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* Default return value is FALSE, operation did not time out */ - - ret_desc->integer.value = 0; - - - /* Examine the opcode */ - - switch (opcode) { - - /* Def_acquire := Acquire_op Mutex_object Timeout */ - - case AML_ACQUIRE_OP: - - status = acpi_aml_acquire_mutex (time_desc, obj_desc, walk_state); - break; - - - /* Def_wait := Wait_op Acpi_event_object Timeout */ - - case AML_WAIT_OP: - - status = acpi_aml_system_wait_event (time_desc, obj_desc); - break; - - - default: - - REPORT_ERROR (("Acpi_aml_exec_dyadic2_s: Unknown dyadic synchronization opcode %X\n", opcode)); - status = AE_AML_BAD_OPCODE; - goto cleanup; - } - - - /* - * Return a boolean indicating if operation timed out - * (TRUE) or not (FALSE) - */ - - if (status == AE_TIME) { - ret_desc->integer.value = ACPI_INTEGER_MAX; /* TRUE, op timed out */ - status = AE_OK; - } - - -cleanup: - - /* Delete params */ - - acpi_cm_remove_reference (time_desc); - acpi_cm_remove_reference (obj_desc); - - /* Delete return object on error */ - - if (ACPI_FAILURE (status) && - (ret_desc)) { - acpi_cm_remove_reference (ret_desc); - ret_desc = NULL; - } - - - /* Set the return object and exit */ - - *return_desc = ret_desc; - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_exec_dyadic2 - * - * PARAMETERS: Opcode - The opcode to be executed - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 2 dyadic operator with numeric operands and - * no result operands - * - * ALLOCATION: Deletes one operand descriptor -- other remains on stack - * containing result value - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_dyadic2 ( - u16 opcode, - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **return_desc) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_OPERAND_OBJECT *obj_desc2; - ACPI_OPERAND_OBJECT *ret_desc = NULL; - ACPI_STATUS status; - u8 lboolean; - - - /* Resolve all operands */ - - status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state); - /* Get all operands */ - - status |= acpi_ds_obj_stack_pop_object (&obj_desc2, walk_state); - status |= acpi_ds_obj_stack_pop_object (&obj_desc, walk_state); - if (ACPI_FAILURE (status)) { - /* Invalid parameters on object stack */ - - goto cleanup; - } - - - /* Create the internal return object */ - - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - /* - * Execute the Opcode - */ - - lboolean = FALSE; - switch (opcode) { - - /* Def_lAnd := LAnd_op Operand1 Operand2 */ - - case AML_LAND_OP: - - lboolean = (u8) (obj_desc->integer.value && - obj_desc2->integer.value); - break; - - - /* Def_lEqual := LEqual_op Operand1 Operand2 */ - - case AML_LEQUAL_OP: - - lboolean = (u8) (obj_desc->integer.value == - obj_desc2->integer.value); - break; - - - /* Def_lGreater := LGreater_op Operand1 Operand2 */ - - case AML_LGREATER_OP: - - lboolean = (u8) (obj_desc->integer.value > - obj_desc2->integer.value); - break; - - - /* Def_lLess := LLess_op Operand1 Operand2 */ - - case AML_LLESS_OP: - - lboolean = (u8) (obj_desc->integer.value < - obj_desc2->integer.value); - break; - - - /* Def_lOr := LOr_op Operand1 Operand2 */ - - case AML_LOR_OP: - - lboolean = (u8) (obj_desc->integer.value || - obj_desc2->integer.value); - break; - - - default: - - REPORT_ERROR (("Acpi_aml_exec_dyadic2: Unknown dyadic opcode %X\n", opcode)); - status = AE_AML_BAD_OPCODE; - goto cleanup; - break; - } - - - /* Set return value to logical TRUE (all ones) or FALSE (zero) */ - - if (lboolean) { - ret_desc->integer.value = ACPI_INTEGER_MAX; - } - else { - ret_desc->integer.value = 0; - } - - -cleanup: - - /* Always delete operands */ - - acpi_cm_remove_reference (obj_desc); - acpi_cm_remove_reference (obj_desc2); - - - /* Delete return object on error */ - - if (ACPI_FAILURE (status) && - (ret_desc)) { - acpi_cm_remove_reference (ret_desc); - ret_desc = NULL; - } - - - /* Set the return object and exit */ - - *return_desc = ret_desc; - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/executer/amfield.c b/reactos/drivers/bus/acpi/executer/amfield.c deleted file mode 100644 index cb3007c9b70..00000000000 --- a/reactos/drivers/bus/acpi/executer/amfield.c +++ /dev/null @@ -1,274 +0,0 @@ -/****************************************************************************** - * - * Module Name: amfield - ACPI AML (p-code) execution - field manipulation - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amfield") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_setup_field - * - * PARAMETERS: *Obj_desc - Field to be read or written - * *Rgn_desc - Region containing field - * Field_bit_width - Field Width in bits (8, 16, or 32) - * - * RETURN: Status - * - * DESCRIPTION: Common processing for Acpi_aml_read_field and Acpi_aml_write_field - * - * ACPI SPECIFICATION REFERENCES: - * Each of the Type1_opcodes is defined as specified in in-line - * comments below. For each one, use the following definitions. - * - * Def_bit_field := Bit_field_op Src_buf Bit_idx Destination - * Def_byte_field := Byte_field_op Src_buf Byte_idx Destination - * Def_create_field := Create_field_op Src_buf Bit_idx Num_bits Name_string - * Def_dWord_field := DWord_field_op Src_buf Byte_idx Destination - * Def_word_field := Word_field_op Src_buf Byte_idx Destination - * Bit_index := Term_arg=>Integer - * Byte_index := Term_arg=>Integer - * Destination := Name_string - * Num_bits := Term_arg=>Integer - * Source_buf := Term_arg=>Buffer - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_setup_field ( - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_OPERAND_OBJECT *rgn_desc, - u32 field_bit_width) -{ - ACPI_STATUS status = AE_OK; - u32 field_byte_width; - - - /* Parameter validation */ - - if (!obj_desc || !rgn_desc) { - return (AE_AML_NO_OPERAND); - } - - if (ACPI_TYPE_REGION != rgn_desc->common.type) { - return (AE_AML_OPERAND_TYPE); - } - - - /* - * TBD: [Future] Acpi 2.0 supports Qword fields - * - * Init and validate Field width - * Possible values are 1, 2, 4 - */ - - field_byte_width = DIV_8 (field_bit_width); - - if ((field_bit_width != 8) && - (field_bit_width != 16) && - (field_bit_width != 32)) { - return (AE_AML_OPERAND_VALUE); - } - - - /* - * If the Region Address and Length have not been previously evaluated, - * evaluate them and save the results. - */ - if (!(rgn_desc->region.flags & AOPOBJ_DATA_VALID)) { - - status = acpi_ds_get_region_arguments (rgn_desc); - if (ACPI_FAILURE (status)) { - return (status); - } - } - - - if ((obj_desc->common.type == ACPI_TYPE_FIELD_UNIT) && - (!(obj_desc->common.flags & AOPOBJ_DATA_VALID))) { - /* - * Field Buffer and Index have not been previously evaluated, - */ - return (AE_AML_INTERNAL); - } - - if (rgn_desc->region.length < - (obj_desc->field.offset & ~((u32) field_byte_width - 1)) + - field_byte_width) { - /* - * Offset rounded up to next multiple of field width - * exceeds region length, indicate an error - */ - - return (AE_AML_REGION_LIMIT); - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_access_named_field - * - * PARAMETERS: Mode - ACPI_READ or ACPI_WRITE - * Named_field - Handle for field to be accessed - * *Buffer - Value(s) to be read or written - * Buffer_length - Number of bytes to transfer - * - * RETURN: Status - * - * DESCRIPTION: Read or write a named field - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_access_named_field ( - u32 mode, - ACPI_HANDLE named_field, - void *buffer, - u32 buffer_length) -{ - ACPI_OPERAND_OBJECT *obj_desc = NULL; - ACPI_STATUS status = AE_OK; - u8 locked = FALSE; - u32 bit_granularity = 0; - u32 byte_granularity; - u32 datum_length; - u32 actual_byte_length; - u32 byte_field_length; - - - /* Parameter validation */ - - if ((!named_field) || (ACPI_READ == mode && !buffer)) { - return (AE_AML_INTERNAL); - } - - /* Get the attached field object */ - - obj_desc = acpi_ns_get_attached_object (named_field); - if (!obj_desc) { - return (AE_AML_INTERNAL); - } - - /* Check the type */ - - if (INTERNAL_TYPE_DEF_FIELD != acpi_ns_get_type (named_field)) { - return (AE_AML_OPERAND_TYPE); - } - - /* Obj_desc valid and Named_field is a defined field */ - - - /* Double-check that the attached object is also a field */ - - if (INTERNAL_TYPE_DEF_FIELD != obj_desc->common.type) { - return (AE_AML_OPERAND_TYPE); - } - - - /* - * Granularity was decoded from the field access type - * (Any_acc will be the same as Byte_acc) - */ - - bit_granularity = obj_desc->field_unit.granularity; - byte_granularity = DIV_8 (bit_granularity); - - /* - * Check if request is too large for the field, and silently truncate - * if necessary - */ - - /* TBD: [Errors] should an error be returned in this case? */ - - byte_field_length = (u32) DIV_8 (obj_desc->field_unit.length + 7); - - - actual_byte_length = buffer_length; - if (buffer_length > byte_field_length) { - actual_byte_length = byte_field_length; - } - - /* TBD: should these round down to a power of 2? */ - - if (DIV_8 (bit_granularity) > byte_field_length) { - bit_granularity = MUL_8(byte_field_length); - } - - if (byte_granularity > byte_field_length) { - byte_granularity = byte_field_length; - } - - - /* Convert byte count to datum count, round up if necessary */ - - datum_length = (actual_byte_length + (byte_granularity-1)) / byte_granularity; - - - /* Get the global lock if needed */ - - locked = acpi_aml_acquire_global_lock (obj_desc->field_unit.lock_rule); - - - /* Perform the actual read or write of the buffer */ - - switch (mode) { - case ACPI_READ: - - status = acpi_aml_read_field (obj_desc, buffer, buffer_length, - actual_byte_length, datum_length, - bit_granularity, byte_granularity); - break; - - - case ACPI_WRITE: - - status = acpi_aml_write_field (obj_desc, buffer, buffer_length, - actual_byte_length, datum_length, - bit_granularity, byte_granularity); - break; - - - default: - - status = AE_BAD_PARAMETER; - break; - } - - - /* Release global lock if we acquired it earlier */ - - acpi_aml_release_global_lock (locked); - - return (status); -} - diff --git a/reactos/drivers/bus/acpi/executer/amfldio.c b/reactos/drivers/bus/acpi/executer/amfldio.c deleted file mode 100644 index 6804692d6ed..00000000000 --- a/reactos/drivers/bus/acpi/executer/amfldio.c +++ /dev/null @@ -1,668 +0,0 @@ -/****************************************************************************** - * - * Module Name: amfldio - Aml Field I/O - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amfldio") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_read_field_data - * - * PARAMETERS: *Obj_desc - Field to be read - * *Value - Where to store value - * Field_bit_width - Field Width in bits (8, 16, or 32) - * - * RETURN: Status - * - * DESCRIPTION: Retrieve the value of the given field - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_read_field_data ( - ACPI_OPERAND_OBJECT *obj_desc, - u32 field_byte_offset, - u32 field_bit_width, - u32 *value) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT *rgn_desc = NULL; - ACPI_PHYSICAL_ADDRESS address; - u32 local_value = 0; - u32 field_byte_width; - - - /* Obj_desc is validated by callers */ - - if (obj_desc) { - rgn_desc = obj_desc->field.container; - } - - - field_byte_width = DIV_8 (field_bit_width); - status = acpi_aml_setup_field (obj_desc, rgn_desc, field_bit_width); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Setup_field validated Rgn_desc and Field_bit_width */ - - if (!value) { - value = &local_value; /* support reads without saving value */ - } - - - /* - * Set offset to next multiple of field width, - * add region base address and offset within the field - */ - address = rgn_desc->region.address + - (obj_desc->field.offset * field_byte_width) + - field_byte_offset; - - - /* Invoke the appropriate Address_space/Op_region handler */ - - status = acpi_ev_address_space_dispatch (rgn_desc, ADDRESS_SPACE_READ, - address, field_bit_width, value); - - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_read_field - * - * PARAMETERS: *Obj_desc - Field to be read - * *Value - Where to store value - * Field_bit_width - Field Width in bits (8, 16, or 32) - * - * RETURN: Status - * - * DESCRIPTION: Retrieve the value of the given field - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_read_field ( - ACPI_OPERAND_OBJECT *obj_desc, - void *buffer, - u32 buffer_length, - u32 byte_length, - u32 datum_length, - u32 bit_granularity, - u32 byte_granularity) -{ - ACPI_STATUS status; - u32 this_field_byte_offset; - u32 this_field_datum_offset; - u32 previous_raw_datum; - u32 this_raw_datum = 0; - u32 valid_field_bits; - u32 mask; - u32 merged_datum = 0; - - - /* - * Clear the caller's buffer (the whole buffer length as given) - * This is very important, especially in the cases where a byte is read, - * but the buffer is really a u32 (4 bytes). - */ - - MEMSET (buffer, 0, buffer_length); - - /* Read the first raw datum to prime the loop */ - - this_field_byte_offset = 0; - this_field_datum_offset= 0; - - status = acpi_aml_read_field_data (obj_desc, this_field_byte_offset, bit_granularity, - &previous_raw_datum); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - /* We might actually be done if the request fits in one datum */ - - if ((datum_length == 1) && - ((obj_desc->field.bit_offset + obj_desc->field_unit.length) <= - (u16) bit_granularity)) { - merged_datum = previous_raw_datum; - - merged_datum = (merged_datum >> obj_desc->field.bit_offset); - - valid_field_bits = obj_desc->field_unit.length % bit_granularity; - if (valid_field_bits) { - mask = (((u32) 1 << valid_field_bits) - (u32) 1); - merged_datum &= mask; - } - - - /* - * Place the Merged_datum into the proper format and return buffer - * field - */ - - switch (byte_granularity) { - case 1: - ((u8 *) buffer) [this_field_datum_offset] = (u8) merged_datum; - break; - - case 2: - MOVE_UNALIGNED16_TO_16 (&(((u16 *) buffer)[this_field_datum_offset]), &merged_datum); - break; - - case 4: - MOVE_UNALIGNED32_TO_32 (&(((u32 *) buffer)[this_field_datum_offset]), &merged_datum); - break; - } - - this_field_byte_offset = 1; - this_field_datum_offset = 1; - } - - else { - /* We need to get more raw data to complete one or more field data */ - - while (this_field_datum_offset < datum_length) { - /* - * If the field is aligned on a byte boundary, we don't want - * to perform a final read, since this would potentially read - * past the end of the region. - * - * TBD: [Investigate] It may make more sense to just split the aligned - * and non-aligned cases since the aligned case is so very simple, - */ - if ((obj_desc->field.bit_offset != 0) || - ((obj_desc->field.bit_offset == 0) && - (this_field_datum_offset < (datum_length -1)))) { - /* - * Get the next raw datum, it contains some or all bits - * of the current field datum - */ - - status = acpi_aml_read_field_data (obj_desc, - this_field_byte_offset + byte_granularity, - bit_granularity, &this_raw_datum); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - /* Before merging the data, make sure the unused bits are clear */ - - switch (byte_granularity) { - case 1: - this_raw_datum &= 0x000000FF; - previous_raw_datum &= 0x000000FF; - break; - - case 2: - this_raw_datum &= 0x0000FFFF; - previous_raw_datum &= 0x0000FFFF; - break; - } - } - - - /* - * Put together bits of the two raw data to make a complete - * field datum - */ - - - if (obj_desc->field.bit_offset != 0) { - merged_datum = - (previous_raw_datum >> obj_desc->field.bit_offset) | - (this_raw_datum << (bit_granularity - obj_desc->field.bit_offset)); - } - - else { - merged_datum = previous_raw_datum; - } - - /* - * Prepare the merged datum for storing into the caller's - * buffer. It is possible to have a 32-bit buffer - * (Byte_granularity == 4), but a Obj_desc->Field.Length - * of 8 or 16, meaning that the upper bytes of merged data - * are undesired. This section fixes that. - */ - switch (obj_desc->field.length) { - case 8: - merged_datum &= 0x000000FF; - break; - - case 16: - merged_datum &= 0x0000FFFF; - break; - } - - /* - * Now store the datum in the caller's buffer, according to - * the data type - */ - switch (byte_granularity) { - case 1: - ((u8 *) buffer) [this_field_datum_offset] = (u8) merged_datum; - break; - - case 2: - MOVE_UNALIGNED16_TO_16 (&(((u16 *) buffer) [this_field_datum_offset]), &merged_datum); - break; - - case 4: - MOVE_UNALIGNED32_TO_32 (&(((u32 *) buffer) [this_field_datum_offset]), &merged_datum); - break; - } - - /* - * Save the most recent datum since it contains bits of - * the *next* field datum - */ - - previous_raw_datum = this_raw_datum; - - this_field_byte_offset += byte_granularity; - this_field_datum_offset++; - - } /* while */ - } - -cleanup: - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_write_field_data - * - * PARAMETERS: *Obj_desc - Field to be set - * Value - Value to store - * Field_bit_width - Field Width in bits (8, 16, or 32) - * - * RETURN: Status - * - * DESCRIPTION: Store the value into the given field - * - ******************************************************************************/ - -static ACPI_STATUS -acpi_aml_write_field_data ( - ACPI_OPERAND_OBJECT *obj_desc, - u32 field_byte_offset, - u32 field_bit_width, - u32 value) -{ - ACPI_STATUS status = AE_OK; - ACPI_OPERAND_OBJECT *rgn_desc = NULL; - ACPI_PHYSICAL_ADDRESS address; - u32 field_byte_width; - - - /* Obj_desc is validated by callers */ - - if (obj_desc) { - rgn_desc = obj_desc->field.container; - } - - field_byte_width = DIV_8 (field_bit_width); - status = acpi_aml_setup_field (obj_desc, rgn_desc, field_bit_width); - if (ACPI_FAILURE (status)) { - return (status); - } - - - /* - * Set offset to next multiple of field width, - * add region base address and offset within the field - */ - address = rgn_desc->region.address + - (obj_desc->field.offset * field_byte_width) + - field_byte_offset; - - /* Invoke the appropriate Address_space/Op_region handler */ - - status = acpi_ev_address_space_dispatch (rgn_desc, ADDRESS_SPACE_WRITE, - address, field_bit_width, &value); - - - - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_aml_write_field_data_with_update_rule - * - * PARAMETERS: *Obj_desc - Field to be set - * Value - Value to store - * Field_bit_width - Field Width in bits (8, 16, or 32) - * - * RETURN: Status - * - * DESCRIPTION: Apply the field update rule to a field write - * - ****************************************************************************/ - -static ACPI_STATUS -acpi_aml_write_field_data_with_update_rule ( - ACPI_OPERAND_OBJECT *obj_desc, - u32 mask, - u32 field_value, - u32 this_field_byte_offset, - u32 bit_granularity) -{ - ACPI_STATUS status = AE_OK; - u32 merged_value; - u32 current_value; - - - /* Start with the new bits */ - - merged_value = field_value; - - - /* Decode the update rule */ - - switch (obj_desc->field.update_rule) { - - case UPDATE_PRESERVE: - - /* Check if update rule needs to be applied (not if mask is all ones) */ - - /* The left shift drops the bits we want to ignore. */ - if ((~mask << (sizeof(mask)*8 - bit_granularity)) != 0) { - /* - * Read the current contents of the byte/word/dword containing - * the field, and merge with the new field value. - */ - status = acpi_aml_read_field_data (obj_desc, this_field_byte_offset, - bit_granularity, ¤t_value); - merged_value |= (current_value & ~mask); - } - break; - - - case UPDATE_WRITE_AS_ONES: - - /* Set positions outside the field to all ones */ - - merged_value |= ~mask; - break; - - - case UPDATE_WRITE_AS_ZEROS: - - /* Set positions outside the field to all zeros */ - - merged_value &= mask; - break; - - - default: - status = AE_AML_OPERAND_VALUE; - } - - - /* Write the merged value */ - - if (ACPI_SUCCESS (status)) { - status = acpi_aml_write_field_data (obj_desc, this_field_byte_offset, - bit_granularity, merged_value); - } - - return (status); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_aml_write_field - * - * PARAMETERS: *Obj_desc - Field to be set - * Value - Value to store - * Field_bit_width - Field Width in bits (8, 16, or 32) - * - * RETURN: Status - * - * DESCRIPTION: Store the value into the given field - * - ****************************************************************************/ - -ACPI_STATUS -acpi_aml_write_field ( - ACPI_OPERAND_OBJECT *obj_desc, - void *buffer, - u32 buffer_length, - u32 byte_length, - u32 datum_length, - u32 bit_granularity, - u32 byte_granularity) -{ - ACPI_STATUS status; - u32 this_field_byte_offset; - u32 this_field_datum_offset; - u32 mask; - u32 merged_datum; - u32 previous_raw_datum; - u32 this_raw_datum; - u32 field_value; - u32 valid_field_bits; - - - /* - * Break the request into up to three parts: - * non-aligned part at start, aligned part in middle, non-aligned part - * at end --- Just like an I/O request --- - */ - - this_field_byte_offset = 0; - this_field_datum_offset= 0; - - /* Get a datum */ - - switch (byte_granularity) { - case 1: - previous_raw_datum = ((u8 *) buffer) [this_field_datum_offset]; - break; - - case 2: - MOVE_UNALIGNED16_TO_32 (&previous_raw_datum, &(((u16 *) buffer) [this_field_datum_offset])); - break; - - case 4: - MOVE_UNALIGNED32_TO_32 (&previous_raw_datum, &(((u32 *) buffer) [this_field_datum_offset])); - break; - - default: - status = AE_AML_OPERAND_VALUE; - goto cleanup; - } - - - /* - * Write a partial field datum if field does not begin on a datum boundary - * - * Construct Mask with 1 bits where the field is, 0 bits elsewhere - * - * 1) Bits above the field - */ - - mask = (((u32)(-1)) << (u32)obj_desc->field.bit_offset); - - /* 2) Only the bottom 5 bits are valid for a shift operation. */ - - if ((obj_desc->field.bit_offset + obj_desc->field_unit.length) < 32) { - /* Bits above the field */ - - mask &= (~(((u32)(-1)) << ((u32)obj_desc->field.bit_offset + - (u32)obj_desc->field_unit.length))); - } - - /* 3) Shift and mask the value into the field position */ - - field_value = (previous_raw_datum << obj_desc->field.bit_offset) & mask; - - status = acpi_aml_write_field_data_with_update_rule (obj_desc, mask, field_value, - this_field_byte_offset, - bit_granularity); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - - /* If the field fits within one datum, we are done. */ - - if ((datum_length == 1) && - ((obj_desc->field.bit_offset + obj_desc->field_unit.length) <= - (u16) bit_granularity)) { - goto cleanup; - } - - /* - * We don't need to worry about the update rule for these data, because - * all of the bits are part of the field. - * - * Can't write the last datum, however, because it might contain bits that - * are not part of the field -- the update rule must be applied. - */ - - while (this_field_datum_offset < (datum_length - 1)) { - this_field_datum_offset++; - - /* Get the next raw datum, it contains bits of the current field datum... */ - - switch (byte_granularity) { - case 1: - this_raw_datum = ((u8 *) buffer) [this_field_datum_offset]; - break; - - case 2: - MOVE_UNALIGNED16_TO_32 (&this_raw_datum, &(((u16 *) buffer) [this_field_datum_offset])); - break; - - case 4: - MOVE_UNALIGNED32_TO_32 (&this_raw_datum, &(((u32 *) buffer) [this_field_datum_offset])); - break; - - default: - status = AE_AML_OPERAND_VALUE; - goto cleanup; - } - - /* - * Put together bits of the two raw data to make a complete field - * datum - */ - - if (obj_desc->field.bit_offset != 0) { - merged_datum = - (previous_raw_datum >> (bit_granularity - obj_desc->field.bit_offset)) | - (this_raw_datum << obj_desc->field.bit_offset); - } - - else { - merged_datum = this_raw_datum; - } - - /* Now write the completed datum */ - - - status = acpi_aml_write_field_data (obj_desc, - this_field_byte_offset + byte_granularity, - bit_granularity, merged_datum); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - - /* - * Save the most recent datum since it contains bits of - * the *next* field datum - */ - - previous_raw_datum = this_raw_datum; - - this_field_byte_offset += byte_granularity; - - } /* while */ - - - /* Write a partial field datum if field does not end on a datum boundary */ - - if ((obj_desc->field_unit.length + obj_desc->field_unit.bit_offset) % - bit_granularity) { - switch (byte_granularity) { - case 1: - this_raw_datum = ((u8 *) buffer) [this_field_datum_offset]; - break; - - case 2: - MOVE_UNALIGNED16_TO_32 (&this_raw_datum, &(((u16 *) buffer) [this_field_datum_offset])); - break; - - case 4: - MOVE_UNALIGNED32_TO_32 (&this_raw_datum, &(((u32 *) buffer) [this_field_datum_offset])); - break; - } - - /* Construct Mask with 1 bits where the field is, 0 bits elsewhere */ - - valid_field_bits = ((obj_desc->field_unit.length % bit_granularity) + - obj_desc->field.bit_offset); - - mask = (((u32) 1 << valid_field_bits) - (u32) 1); - - /* Shift and mask the value into the field position */ - - field_value = (previous_raw_datum >> - (bit_granularity - obj_desc->field.bit_offset)) & mask; - - status = acpi_aml_write_field_data_with_update_rule (obj_desc, mask, field_value, - this_field_byte_offset + byte_granularity, - bit_granularity); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - } - - -cleanup: - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/executer/ammisc.c b/reactos/drivers/bus/acpi/executer/ammisc.c deleted file mode 100644 index b4adaf1c0df..00000000000 --- a/reactos/drivers/bus/acpi/executer/ammisc.c +++ /dev/null @@ -1,510 +0,0 @@ - -/****************************************************************************** - * - * Module Name: ammisc - ACPI AML (p-code) execution - specific opcodes - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("ammisc") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_exec_fatal - * - * PARAMETERS: none - * - * RETURN: Status. If the OS returns from the OSD call, we just keep - * on going. - * - * DESCRIPTION: Execute Fatal operator - * - * ACPI SPECIFICATION REFERENCES: - * Def_fatal := Fatal_op Fatal_type Fatal_code Fatal_arg - * Fatal_type := Byte_data - * Fatal_code := DWord_data - * Fatal_arg := Term_arg=>Integer - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_fatal ( - ACPI_WALK_STATE *walk_state) -{ - ACPI_OPERAND_OBJECT *type_desc; - ACPI_OPERAND_OBJECT *code_desc; - ACPI_OPERAND_OBJECT *arg_desc; - ACPI_STATUS status; - - - /* Resolve operands */ - - status = acpi_aml_resolve_operands (AML_FATAL_OP, WALK_OPERANDS, walk_state); - /* Get operands */ - - status |= acpi_ds_obj_stack_pop_object (&arg_desc, walk_state); - status |= acpi_ds_obj_stack_pop_object (&code_desc, walk_state); - status |= acpi_ds_obj_stack_pop_object (&type_desc, walk_state); - if (ACPI_FAILURE (status)) { - /* Invalid parameters on object stack */ - - goto cleanup; - } - - - /* Def_fatal := Fatal_op Fatal_type Fatal_code Fatal_arg */ - - - /* - * TBD: [Unhandled] call OSD interface to notify OS of fatal error - * requiring shutdown! - */ - - -cleanup: - - /* Free the operands */ - - acpi_cm_remove_reference (arg_desc); - acpi_cm_remove_reference (code_desc); - acpi_cm_remove_reference (type_desc); - - - /* If we get back from the OS call, we might as well keep going. */ - - REPORT_WARNING (("An AML \"fatal\" Opcode (Fatal_op) was executed\n")); - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_exec_index - * - * PARAMETERS: none - * - * RETURN: Status - * - * DESCRIPTION: Execute Index operator - * - * ALLOCATION: Deletes one operand descriptor -- other remains on stack - * - * ACPI SPECIFICATION REFERENCES: - * Def_index := Index_op Buff_pkg_obj Index_value Result - * Index_value := Term_arg=>Integer - * Name_string := | - * Result := Super_name - * Super_name := Name_string | Arg_obj | Local_obj | Debug_obj | Def_index - * Local4_op | Local5_op | Local6_op | Local7_op - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_index ( - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **return_desc) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_OPERAND_OBJECT *idx_desc; - ACPI_OPERAND_OBJECT *res_desc; - ACPI_OPERAND_OBJECT *ret_desc = NULL; - ACPI_OPERAND_OBJECT *tmp_desc; - ACPI_STATUS status; - - - /* Resolve operands */ - /* First operand can be either a package or a buffer */ - - status = acpi_aml_resolve_operands (AML_INDEX_OP, WALK_OPERANDS, walk_state); - /* Get all operands */ - - status |= acpi_ds_obj_stack_pop_object (&res_desc, walk_state); - status |= acpi_ds_obj_stack_pop_object (&idx_desc, walk_state); - status |= acpi_ds_obj_stack_pop_object (&obj_desc, walk_state); - if (ACPI_FAILURE (status)) { - /* Invalid parameters on object stack */ - - goto cleanup; - } - - - /* Create the internal return object */ - - ret_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_REFERENCE); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - - /* - * At this point, the Obj_desc operand is either a Package or a Buffer - */ - - if (obj_desc->common.type == ACPI_TYPE_PACKAGE) { - /* Object to be indexed is a Package */ - - if (idx_desc->integer.value >= obj_desc->package.count) { - status = AE_AML_PACKAGE_LIMIT; - goto cleanup; - } - - if ((res_desc->common.type == INTERNAL_TYPE_REFERENCE) && - (res_desc->reference.opcode == AML_ZERO_OP)) { - /* - * There is no actual result descriptor (the Zero_op Result - * descriptor is a placeholder), so just delete the placeholder and - * return a reference to the package element - */ - - acpi_cm_remove_reference (res_desc); - } - - else { - /* - * Each element of the package is an internal object. Get the one - * we are after. - */ - - tmp_desc = obj_desc->package.elements[idx_desc->integer.value]; - ret_desc->reference.opcode = AML_INDEX_OP; - ret_desc->reference.target_type = tmp_desc->common.type; - ret_desc->reference.object = tmp_desc; - - status = acpi_aml_exec_store (ret_desc, res_desc, walk_state); - ret_desc->reference.object = NULL; - } - - /* - * The local return object must always be a reference to the package element, - * not the element itself. - */ - ret_desc->reference.opcode = AML_INDEX_OP; - ret_desc->reference.target_type = ACPI_TYPE_PACKAGE; - ret_desc->reference.where = &obj_desc->package.elements[idx_desc->integer.value]; - } - - else { - /* Object to be indexed is a Buffer */ - - if (idx_desc->integer.value >= obj_desc->buffer.length) { - status = AE_AML_BUFFER_LIMIT; - goto cleanup; - } - - ret_desc->reference.opcode = AML_INDEX_OP; - ret_desc->reference.target_type = ACPI_TYPE_BUFFER_FIELD; - ret_desc->reference.object = obj_desc; - ret_desc->reference.offset = (u32) idx_desc->integer.value; - - status = acpi_aml_exec_store (ret_desc, res_desc, walk_state); - } - - -cleanup: - - /* Always delete operands */ - - acpi_cm_remove_reference (obj_desc); - acpi_cm_remove_reference (idx_desc); - - /* Delete return object on error */ - - if (ACPI_FAILURE (status)) { - acpi_cm_remove_reference (res_desc); - - if (ret_desc) { - acpi_cm_remove_reference (ret_desc); - ret_desc = NULL; - } - } - - /* Set the return object and exit */ - - *return_desc = ret_desc; - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_exec_match - * - * PARAMETERS: none - * - * RETURN: Status - * - * DESCRIPTION: Execute Match operator - * - * ACPI SPECIFICATION REFERENCES: - * Def_match := Match_op Search_pkg Opcode1 Operand1 - * Opcode2 Operand2 Start_index - * Opcode1 := Byte_data: MTR, MEQ, MLE, MLT, MGE, or MGT - * Opcode2 := Byte_data: MTR, MEQ, MLE, MLT, MGE, or MGT - * Operand1 := Term_arg=>Integer - * Operand2 := Term_arg=>Integer - * Search_pkg := Term_arg=>Package_object - * Start_index := Term_arg=>Integer - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_match ( - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **return_desc) -{ - ACPI_OPERAND_OBJECT *pkg_desc; - ACPI_OPERAND_OBJECT *op1_desc; - ACPI_OPERAND_OBJECT *V1_desc; - ACPI_OPERAND_OBJECT *op2_desc; - ACPI_OPERAND_OBJECT *V2_desc; - ACPI_OPERAND_OBJECT *start_desc; - ACPI_OPERAND_OBJECT *ret_desc = NULL; - ACPI_STATUS status; - u32 index; - u32 match_value = (u32) -1; - - - /* Resolve all operands */ - - status = acpi_aml_resolve_operands (AML_MATCH_OP, WALK_OPERANDS, walk_state); - /* Get all operands */ - - status |= acpi_ds_obj_stack_pop_object (&start_desc, walk_state); - status |= acpi_ds_obj_stack_pop_object (&V2_desc, walk_state); - status |= acpi_ds_obj_stack_pop_object (&op2_desc, walk_state); - status |= acpi_ds_obj_stack_pop_object (&V1_desc, walk_state); - status |= acpi_ds_obj_stack_pop_object (&op1_desc, walk_state); - status |= acpi_ds_obj_stack_pop_object (&pkg_desc, walk_state); - - if (ACPI_FAILURE (status)) { - /* Invalid parameters on object stack */ - - goto cleanup; - } - - /* Validate match comparison sub-opcodes */ - - if ((op1_desc->integer.value > MAX_MATCH_OPERATOR) || - (op2_desc->integer.value > MAX_MATCH_OPERATOR)) { - status = AE_AML_OPERAND_VALUE; - goto cleanup; - } - - index = (u32) start_desc->integer.value; - if (index >= (u32) pkg_desc->package.count) { - status = AE_AML_PACKAGE_LIMIT; - goto cleanup; - } - - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - - } - - /* - * Examine each element until a match is found. Within the loop, - * "continue" signifies that the current element does not match - * and the next should be examined. - * Upon finding a match, the loop will terminate via "break" at - * the bottom. If it terminates "normally", Match_value will be -1 - * (its initial value) indicating that no match was found. When - * returned as a Number, this will produce the Ones value as specified. - */ - - for ( ; index < pkg_desc->package.count; ++index) { - /* - * Treat any NULL or non-numeric elements as non-matching. - * TBD [Unhandled] - if an element is a Name, - * should we examine its value? - */ - if (!pkg_desc->package.elements[index] || - ACPI_TYPE_INTEGER != pkg_desc->package.elements[index]->common.type) { - continue; - } - - /* - * Within these switch statements: - * "break" (exit from the switch) signifies a match; - * "continue" (proceed to next iteration of enclosing - * "for" loop) signifies a non-match. - */ - switch (op1_desc->integer.value) { - - case MATCH_MTR: /* always true */ - - break; - - - case MATCH_MEQ: /* true if equal */ - - if (pkg_desc->package.elements[index]->integer.value - != V1_desc->integer.value) { - continue; - } - break; - - - case MATCH_MLE: /* true if less than or equal */ - - if (pkg_desc->package.elements[index]->integer.value - > V1_desc->integer.value) { - continue; - } - break; - - - case MATCH_MLT: /* true if less than */ - - if (pkg_desc->package.elements[index]->integer.value - >= V1_desc->integer.value) { - continue; - } - break; - - - case MATCH_MGE: /* true if greater than or equal */ - - if (pkg_desc->package.elements[index]->integer.value - < V1_desc->integer.value) { - continue; - } - break; - - - case MATCH_MGT: /* true if greater than */ - - if (pkg_desc->package.elements[index]->integer.value - <= V1_desc->integer.value) { - continue; - } - break; - - - default: /* undefined */ - - continue; - } - - - switch(op2_desc->integer.value) { - - case MATCH_MTR: - - break; - - - case MATCH_MEQ: - - if (pkg_desc->package.elements[index]->integer.value - != V2_desc->integer.value) { - continue; - } - break; - - - case MATCH_MLE: - - if (pkg_desc->package.elements[index]->integer.value - > V2_desc->integer.value) { - continue; - } - break; - - - case MATCH_MLT: - - if (pkg_desc->package.elements[index]->integer.value - >= V2_desc->integer.value) { - continue; - } - break; - - - case MATCH_MGE: - - if (pkg_desc->package.elements[index]->integer.value - < V2_desc->integer.value) { - continue; - } - break; - - - case MATCH_MGT: - - if (pkg_desc->package.elements[index]->integer.value - <= V2_desc->integer.value) { - continue; - } - break; - - - default: - - continue; - } - - /* Match found: exit from loop */ - - match_value = index; - break; - } - - /* Match_value is the return value */ - - ret_desc->integer.value = match_value; - - -cleanup: - - /* Free the operands */ - - acpi_cm_remove_reference (start_desc); - acpi_cm_remove_reference (V2_desc); - acpi_cm_remove_reference (op2_desc); - acpi_cm_remove_reference (V1_desc); - acpi_cm_remove_reference (op1_desc); - acpi_cm_remove_reference (pkg_desc); - - - /* Delete return object on error */ - - if (ACPI_FAILURE (status) && - (ret_desc)) { - acpi_cm_remove_reference (ret_desc); - ret_desc = NULL; - } - - - /* Set the return object and exit */ - - *return_desc = ret_desc; - return (status); -} diff --git a/reactos/drivers/bus/acpi/executer/ammonad.c b/reactos/drivers/bus/acpi/executer/ammonad.c deleted file mode 100644 index e37e27d6905..00000000000 --- a/reactos/drivers/bus/acpi/executer/ammonad.c +++ /dev/null @@ -1,957 +0,0 @@ - -/****************************************************************************** - * - * Module Name: ammonad - ACPI AML (p-code) execution for monadic operators - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("ammonad") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_get_object_reference - * - * PARAMETERS: Obj_desc - Create a reference to this object - * Ret_desc - Where to store the reference - * - * RETURN: Status - * - * DESCRIPTION: Obtain and return a "reference" to the target object - * Common code for the Ref_of_op and the Cond_ref_of_op. - * - ******************************************************************************/ - -static ACPI_STATUS -acpi_aml_get_object_reference ( - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_OPERAND_OBJECT **ret_desc, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status = AE_OK; - - - if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_INTERNAL)) { - if (obj_desc->common.type != INTERNAL_TYPE_REFERENCE) { - *ret_desc = NULL; - status = AE_TYPE; - goto cleanup; - } - - /* - * Not a Name -- an indirect name pointer would have - * been converted to a direct name pointer in Acpi_aml_resolve_operands - */ - switch (obj_desc->reference.opcode) { - case AML_LOCAL_OP: - case AML_ARG_OP: - - *ret_desc = (void *) acpi_ds_method_data_get_node (obj_desc->reference.opcode, - obj_desc->reference.offset, walk_state); - break; - - default: - - *ret_desc = NULL; - status = AE_AML_INTERNAL; - goto cleanup; - } - - } - - else if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - /* Must be a named object; Just return the Node */ - - *ret_desc = obj_desc; - } - - else { - *ret_desc = NULL; - status = AE_TYPE; - } - - -cleanup: - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_exec_monadic1 - * - * PARAMETERS: Opcode - The opcode to be executed - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 1 monadic operator with numeric operand on - * object stack - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_monadic1 ( - u16 opcode, - ACPI_WALK_STATE *walk_state) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_STATUS status; - - - /* Resolve all operands */ - - status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state); - /* Get all operands */ - - status |= acpi_ds_obj_stack_pop_object (&obj_desc, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - - /* Examine the opcode */ - - switch (opcode) { - - /* Def_release := Release_op Mutex_object */ - - case AML_RELEASE_OP: - - status = acpi_aml_release_mutex (obj_desc, walk_state); - break; - - - /* Def_reset := Reset_op Acpi_event_object */ - - case AML_RESET_OP: - - status = acpi_aml_system_reset_event (obj_desc); - break; - - - /* Def_signal := Signal_op Acpi_event_object */ - - case AML_SIGNAL_OP: - - status = acpi_aml_system_signal_event (obj_desc); - break; - - - /* Def_sleep := Sleep_op Msec_time */ - - case AML_SLEEP_OP: - - acpi_aml_system_do_suspend ((u32) obj_desc->integer.value); - break; - - - /* Def_stall := Stall_op Usec_time */ - - case AML_STALL_OP: - - acpi_aml_system_do_stall ((u32) obj_desc->integer.value); - break; - - - /* Unknown opcode */ - - default: - - REPORT_ERROR (("Acpi_aml_exec_monadic1: Unknown monadic opcode %X\n", - opcode)); - status = AE_AML_BAD_OPCODE; - break; - - } /* switch */ - - -cleanup: - - /* Always delete the operand */ - - acpi_cm_remove_reference (obj_desc); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_exec_monadic2_r - * - * PARAMETERS: Opcode - The opcode to be executed - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 2 monadic operator with numeric operand and - * result operand on operand stack - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_monadic2_r ( - u16 opcode, - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **return_desc) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_OPERAND_OBJECT *res_desc; - ACPI_OPERAND_OBJECT *ret_desc = NULL; - ACPI_OPERAND_OBJECT *ret_desc2 = NULL; - u32 res_val; - ACPI_STATUS status; - u32 i; - u32 j; - ACPI_INTEGER digit; - - - /* Resolve all operands */ - - status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state); - /* Get all operands */ - - status |= acpi_ds_obj_stack_pop_object (&res_desc, walk_state); - status |= acpi_ds_obj_stack_pop_object (&obj_desc, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - - /* Create a return object of type NUMBER for most opcodes */ - - switch (opcode) { - case AML_BIT_NOT_OP: - case AML_FIND_SET_LEFT_BIT_OP: - case AML_FIND_SET_RIGHT_BIT_OP: - case AML_FROM_BCD_OP: - case AML_TO_BCD_OP: - case AML_COND_REF_OF_OP: - - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - break; - } - - - switch (opcode) { - /* Def_not := Not_op Operand Result */ - - case AML_BIT_NOT_OP: - - ret_desc->integer.value = ~obj_desc->integer.value; - break; - - - /* Def_find_set_left_bit := Find_set_left_bit_op Operand Result */ - - case AML_FIND_SET_LEFT_BIT_OP: - - ret_desc->integer.value = obj_desc->integer.value; - - /* - * Acpi specification describes Integer type as a little - * endian unsigned value, so this boundry condition is valid. - */ - for (res_val = 0; ret_desc->integer.value && res_val < ACPI_INTEGER_BIT_SIZE; ++res_val) { - ret_desc->integer.value >>= 1; - } - - ret_desc->integer.value = res_val; - break; - - - /* Def_find_set_right_bit := Find_set_right_bit_op Operand Result */ - - case AML_FIND_SET_RIGHT_BIT_OP: - - ret_desc->integer.value = obj_desc->integer.value; - - /* - * Acpi specification describes Integer type as a little - * endian unsigned value, so this boundry condition is valid. - */ - for (res_val = 0; ret_desc->integer.value && res_val < ACPI_INTEGER_BIT_SIZE; ++res_val) { - ret_desc->integer.value <<= 1; - } - - /* Since returns must be 1-based, subtract from 33 (65) */ - - ret_desc->integer.value = res_val == 0 ? 0 : (ACPI_INTEGER_BIT_SIZE + 1) - res_val; - break; - - - /* Def_from_bDC := From_bCDOp BCDValue Result */ - - case AML_FROM_BCD_OP: - - /* - * The 64-bit ACPI integer can hold 16 4-bit BCD integers - */ - ret_desc->integer.value = 0; - for (i = 0; i < ACPI_MAX_BCD_DIGITS; i++) { - /* Get one BCD digit */ - - digit = (ACPI_INTEGER) ((obj_desc->integer.value >> (i * 4)) & 0xF); - - /* Check the range of the digit */ - - if (digit > 9) { - status = AE_AML_NUMERIC_OVERFLOW; - goto cleanup; - } - - if (digit > 0) { - /* Sum into the result with the appropriate power of 10 */ - - for (j = 0; j < i; j++) { - digit *= 10; - } - - ret_desc->integer.value += digit; - } - } - break; - - - /* Def_to_bDC := To_bCDOp Operand Result */ - - case AML_TO_BCD_OP: - - - if (obj_desc->integer.value > ACPI_MAX_BCD_VALUE) { - status = AE_AML_NUMERIC_OVERFLOW; - goto cleanup; - } - - ret_desc->integer.value = 0; - for (i = 0; i < ACPI_MAX_BCD_DIGITS; i++) { - /* Divide by nth factor of 10 */ - - digit = obj_desc->integer.value; - for (j = 0; j < i; j++) { - digit /= 10; - } - - /* Create the BCD digit */ - - if (digit > 0) { - ret_desc->integer.value += (ACPI_MODULO (digit, 10) << (i * 4)); - } - } - break; - - - /* Def_cond_ref_of := Cond_ref_of_op Source_object Result */ - - case AML_COND_REF_OF_OP: - - /* - * This op is a little strange because the internal return value is - * different than the return value stored in the result descriptor - * (There are really two return values) - */ - - if ((ACPI_NAMESPACE_NODE *) obj_desc == acpi_gbl_root_node) { - /* - * This means that the object does not exist in the namespace, - * return FALSE - */ - - ret_desc->integer.value = 0; - - /* - * Must delete the result descriptor since there is no reference - * being returned - */ - - acpi_cm_remove_reference (res_desc); - goto cleanup; - } - - /* Get the object reference and store it */ - - status = acpi_aml_get_object_reference (obj_desc, &ret_desc2, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - status = acpi_aml_exec_store (ret_desc2, res_desc, walk_state); - - /* The object exists in the namespace, return TRUE */ - - ret_desc->integer.value = ACPI_INTEGER_MAX; - goto cleanup; - break; - - - case AML_STORE_OP: - - /* - * A store operand is typically a number, string, buffer or lvalue - * TBD: [Unhandled] What about a store to a package? - */ - - /* - * Do the store, and be careful about deleting the source object, - * since the object itself may have been stored. - */ - - status = acpi_aml_exec_store (obj_desc, res_desc, walk_state); - if (ACPI_FAILURE (status)) { - /* On failure, just delete the Obj_desc */ - - acpi_cm_remove_reference (obj_desc); - } - - else { - /* - * Normally, we would remove a reference on the Obj_desc parameter; - * But since it is being used as the internal return object - * (meaning we would normally increment it), the two cancel out, - * and we simply don't do anything. - */ - *return_desc = obj_desc; - } - - obj_desc = NULL; - return (status); - - break; - - - case AML_DEBUG_OP: - - /* Reference, returning an Reference */ - - return (AE_OK); - break; - - - /* - * These are obsolete opcodes - */ - - /* Def_shift_left_bit := Shift_left_bit_op Source Bit_num */ - /* Def_shift_right_bit := Shift_right_bit_op Source Bit_num */ - - case AML_SHIFT_LEFT_BIT_OP: - case AML_SHIFT_RIGHT_BIT_OP: - - status = AE_SUPPORT; - goto cleanup; - break; - - - default: - - REPORT_ERROR (("Acpi_aml_exec_monadic2_r: Unknown monadic opcode %X\n", - opcode)); - status = AE_AML_BAD_OPCODE; - goto cleanup; - } - - - status = acpi_aml_exec_store (ret_desc, res_desc, walk_state); - - -cleanup: - /* Always delete the operand object */ - - acpi_cm_remove_reference (obj_desc); - - /* Delete return object(s) on error */ - - if (ACPI_FAILURE (status)) { - acpi_cm_remove_reference (res_desc); /* Result descriptor */ - if (ret_desc) { - acpi_cm_remove_reference (ret_desc); - ret_desc = NULL; - } - } - - /* Set the return object and exit */ - - *return_desc = ret_desc; - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_exec_monadic2 - * - * PARAMETERS: Opcode - The opcode to be executed - * - * RETURN: Status - * - * DESCRIPTION: Execute Type 2 monadic operator with numeric operand: - * Deref_of_op, Ref_of_op, Size_of_op, Type_op, Increment_op, - * Decrement_op, LNot_op, - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_monadic2 ( - u16 opcode, - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **return_desc) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_OPERAND_OBJECT *tmp_desc; - ACPI_OPERAND_OBJECT *ret_desc = NULL; - ACPI_STATUS resolve_status; - ACPI_STATUS status; - u32 type; - ACPI_INTEGER value; - - - /* Attempt to resolve the operands */ - - resolve_status = acpi_aml_resolve_operands (opcode, WALK_OPERANDS, walk_state); - /* Always get all operands */ - - status = acpi_ds_obj_stack_pop_object (&obj_desc, walk_state); - - - /* Now we can check the status codes */ - - if (ACPI_FAILURE (resolve_status)) { - goto cleanup; - } - - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - - /* Get the operand and decode the opcode */ - - - switch (opcode) { - - /* Def_lNot := LNot_op Operand */ - - case AML_LNOT_OP: - - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - ret_desc->integer.value = !obj_desc->integer.value; - break; - - - /* Def_decrement := Decrement_op Target */ - /* Def_increment := Increment_op Target */ - - case AML_DECREMENT_OP: - case AML_INCREMENT_OP: - - /* - * Since we are expecting an Reference on the top of the stack, it - * can be either an Node or an internal object. - * - * TBD: [Future] This may be the prototype code for all cases where - * an Reference is expected!! 10/99 - */ - - if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - ret_desc = obj_desc; - } - - else { - /* - * Duplicate the Reference in a new object so that we can resolve it - * without destroying the original Reference object - */ - - ret_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_REFERENCE); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - ret_desc->reference.opcode = obj_desc->reference.opcode; - ret_desc->reference.offset = obj_desc->reference.offset; - ret_desc->reference.object = obj_desc->reference.object; - } - - - /* - * Convert the Ret_desc Reference to a Number - * (This deletes the original Ret_desc) - */ - - status = acpi_aml_resolve_operands (AML_LNOT_OP, &ret_desc, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - /* Do the actual increment or decrement */ - - if (AML_INCREMENT_OP == opcode) { - ret_desc->integer.value++; - } - else { - ret_desc->integer.value--; - } - - /* Store the result back in the original descriptor */ - - status = acpi_aml_exec_store (ret_desc, obj_desc, walk_state); - - /* Objdesc was just deleted (because it is an Reference) */ - - obj_desc = NULL; - - break; - - - /* Def_object_type := Object_type_op Source_object */ - - case AML_TYPE_OP: - - if (INTERNAL_TYPE_REFERENCE == obj_desc->common.type) { - /* - * Not a Name -- an indirect name pointer would have - * been converted to a direct name pointer in Resolve_operands - */ - switch (obj_desc->reference.opcode) { - case AML_ZERO_OP: - case AML_ONE_OP: - case AML_ONES_OP: - - /* Constants are of type Number */ - - type = ACPI_TYPE_INTEGER; - break; - - - case AML_DEBUG_OP: - - /* Per 1.0b spec, Debug object is of type Debug_object */ - - type = ACPI_TYPE_DEBUG_OBJECT; - break; - - - case AML_INDEX_OP: - - /* Get the type of this reference (index into another object) */ - - type = obj_desc->reference.target_type; - if (type == ACPI_TYPE_PACKAGE) { - /* - * The main object is a package, we want to get the type - * of the individual package element that is referenced by - * the index. - */ - type = (*(obj_desc->reference.where))->common.type; - } - - break; - - - case AML_LOCAL_OP: - case AML_ARG_OP: - - type = acpi_ds_method_data_get_type (obj_desc->reference.opcode, - obj_desc->reference.offset, walk_state); - break; - - - default: - - REPORT_ERROR (("Acpi_aml_exec_monadic2/Type_op: Internal error - Unknown Reference subtype %X\n", - obj_desc->reference.opcode)); - status = AE_AML_INTERNAL; - goto cleanup; - } - } - - else { - /* - * It's not a Reference, so it must be a direct name pointer. - */ - type = acpi_ns_get_type ((ACPI_HANDLE) obj_desc); - } - - /* Allocate a descriptor to hold the type. */ - - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - ret_desc->integer.value = type; - break; - - - /* Def_size_of := Size_of_op Source_object */ - - case AML_SIZE_OF_OP: - - if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - obj_desc = acpi_ns_get_attached_object (obj_desc); - } - - if (!obj_desc) { - value = 0; - } - - else { - switch (obj_desc->common.type) { - - case ACPI_TYPE_BUFFER: - - value = obj_desc->buffer.length; - break; - - - case ACPI_TYPE_STRING: - - value = obj_desc->string.length; - break; - - - case ACPI_TYPE_PACKAGE: - - value = obj_desc->package.count; - break; - - case INTERNAL_TYPE_REFERENCE: - - value = 4; - break; - - default: - - status = AE_AML_OPERAND_TYPE; - goto cleanup; - } - } - - /* - * Now that we have the size of the object, create a result - * object to hold the value - */ - - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - ret_desc->integer.value = value; - break; - - - /* Def_ref_of := Ref_of_op Source_object */ - - case AML_REF_OF_OP: - - status = acpi_aml_get_object_reference (obj_desc, &ret_desc, walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - break; - - - /* Def_deref_of := Deref_of_op Obj_reference */ - - case AML_DEREF_OF_OP: - - - /* Check for a method local or argument */ - - if (!VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - /* - * Must resolve/dereference the local/arg reference first - */ - switch (obj_desc->reference.opcode) { - /* Set Obj_desc to the value of the local/arg */ - - case AML_LOCAL_OP: - case AML_ARG_OP: - - acpi_ds_method_data_get_value (obj_desc->reference.opcode, - obj_desc->reference.offset, walk_state, &tmp_desc); - - /* - * Delete our reference to the input object and - * point to the object just retrieved - */ - acpi_cm_remove_reference (obj_desc); - obj_desc = tmp_desc; - break; - - default: - - /* Index op - handled below */ - break; - } - } - - - /* Obj_desc may have changed from the code above */ - - if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - /* Get the actual object from the Node (This is the dereference) */ - - ret_desc = ((ACPI_NAMESPACE_NODE *) obj_desc)->object; - - /* Returning a pointer to the object, add another reference! */ - - acpi_cm_add_reference (ret_desc); - } - - else { - /* - * This must be a reference object produced by the Index - * ASL operation -- check internal opcode - */ - - if ((obj_desc->reference.opcode != AML_INDEX_OP) && - (obj_desc->reference.opcode != AML_REF_OF_OP)) { - status = AE_TYPE; - goto cleanup; - } - - - switch (obj_desc->reference.opcode) { - case AML_INDEX_OP: - - /* - * Supported target types for the Index operator are - * 1) A Buffer - * 2) A Package - */ - - if (obj_desc->reference.target_type == ACPI_TYPE_BUFFER_FIELD) { - /* - * The target is a buffer, we must create a new object that - * contains one element of the buffer, the element pointed - * to by the index. - * - * NOTE: index into a buffer is NOT a pointer to a - * sub-buffer of the main buffer, it is only a pointer to a - * single element (byte) of the buffer! - */ - ret_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER); - if (!ret_desc) { - status = AE_NO_MEMORY; - goto cleanup; - } - - tmp_desc = obj_desc->reference.object; - ret_desc->integer.value = - tmp_desc->buffer.pointer[obj_desc->reference.offset]; - - /* TBD: [Investigate] (see below) Don't add an additional - * ref! - */ - } - - else if (obj_desc->reference.target_type == ACPI_TYPE_PACKAGE) { - /* - * The target is a package, we want to return the referenced - * element of the package. We must add another reference to - * this object, however. - */ - - ret_desc = *(obj_desc->reference.where); - if (!ret_desc) { - /* - * We can't return a NULL dereferenced value. This is - * an uninitialized package element and is thus a - * severe error. - */ - - status = AE_AML_UNINITIALIZED_ELEMENT; - goto cleanup; - } - - acpi_cm_add_reference (ret_desc); - } - - else { - status = AE_AML_OPERAND_TYPE; - goto cleanup; - } - - break; - - - case AML_REF_OF_OP: - - ret_desc = obj_desc->reference.object; - - /* Add another reference to the object! */ - - acpi_cm_add_reference (ret_desc); - break; - } - } - - break; - - - default: - - REPORT_ERROR (("Acpi_aml_exec_monadic2: Unknown monadic opcode %X\n", - opcode)); - status = AE_AML_BAD_OPCODE; - goto cleanup; - } - - -cleanup: - - if (obj_desc) { - acpi_cm_remove_reference (obj_desc); - } - - /* Delete return object on error */ - - if (ACPI_FAILURE (status) && - (ret_desc)) { - acpi_cm_remove_reference (ret_desc); - ret_desc = NULL; - } - - *return_desc = ret_desc; - return (status); -} - diff --git a/reactos/drivers/bus/acpi/executer/ammutex.c b/reactos/drivers/bus/acpi/executer/ammutex.c deleted file mode 100644 index 2a4091083b5..00000000000 --- a/reactos/drivers/bus/acpi/executer/ammutex.c +++ /dev/null @@ -1,278 +0,0 @@ - -/****************************************************************************** - * - * Module Name: ammutex - ASL Mutex Acquire/Release functions - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("ammutex") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_unlink_mutex - * - * PARAMETERS: *Obj_desc - The mutex to be unlinked - * - * RETURN: Status - * - * DESCRIPTION: Remove a mutex from the "Acquired_mutex" list - * - ******************************************************************************/ - -void -acpi_aml_unlink_mutex ( - ACPI_OPERAND_OBJECT *obj_desc) -{ - - if (obj_desc->mutex.next) { - (obj_desc->mutex.next)->mutex.prev = obj_desc->mutex.prev; - } - if (obj_desc->mutex.prev) { - (obj_desc->mutex.prev)->mutex.next = obj_desc->mutex.next; - } -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_link_mutex - * - * PARAMETERS: *Obj_desc - The mutex to be linked - * *List_head - head of the "Acquired_mutex" list - * - * RETURN: Status - * - * DESCRIPTION: Add a mutex to the "Acquired_mutex" list for this walk - * - ******************************************************************************/ - -static void -acpi_aml_link_mutex ( - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_OPERAND_OBJECT *list_head) -{ - - /* This object will be the first object in the list */ - - obj_desc->mutex.prev = list_head; - obj_desc->mutex.next = list_head->mutex.next; - - /* Update old first object to point back to this object */ - - if (list_head->mutex.next) { - (list_head->mutex.next)->mutex.prev = obj_desc; - } - - /* Update list head */ - - list_head->mutex.next = obj_desc; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_acquire_mutex - * - * PARAMETERS: *Time_desc - The 'time to delay' object descriptor - * *Obj_desc - The object descriptor for this op - * - * RETURN: Status - * - * DESCRIPTION: Acquire an AML mutex - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_acquire_mutex ( - ACPI_OPERAND_OBJECT *time_desc, - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status; - - - if (!obj_desc) { - return (AE_BAD_PARAMETER); - } - - /* - * Current Sync must be less than or equal to the sync level of the - * mutex. This mechanism provides some deadlock prevention - */ - if (walk_state->current_sync_level > obj_desc->mutex.sync_level) { - return (AE_AML_MUTEX_ORDER); - } - - /* - * If the mutex is already owned by this thread, - * just increment the acquisition depth - */ - if (obj_desc->mutex.owner == walk_state) { - obj_desc->mutex.acquisition_depth++; - return (AE_OK); - } - - /* Acquire the mutex, wait if necessary */ - - status = acpi_aml_system_acquire_mutex (time_desc, obj_desc); - if (ACPI_FAILURE (status)) { - /* Includes failure from a timeout on Time_desc */ - - return (status); - } - - /* Have the mutex, update mutex and walk info */ - - obj_desc->mutex.owner = walk_state; - obj_desc->mutex.acquisition_depth = 1; - walk_state->current_sync_level = obj_desc->mutex.sync_level; - - /* Link the mutex to the walk state for force-unlock at method exit */ - - acpi_aml_link_mutex (obj_desc, (ACPI_OPERAND_OBJECT *) - &(walk_state->walk_list->acquired_mutex_list)); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_release_mutex - * - * PARAMETERS: *Obj_desc - The object descriptor for this op - * - * RETURN: Status - * - * DESCRIPTION: Release a previously acquired Mutex. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_release_mutex ( - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status; - - - if (!obj_desc) { - return (AE_BAD_PARAMETER); - } - - /* The mutex must have been previously acquired in order to release it */ - - if (!obj_desc->mutex.owner) { - return (AE_AML_MUTEX_NOT_ACQUIRED); - } - - /* The Mutex is owned, but this thread must be the owner */ - - if (obj_desc->mutex.owner != walk_state) { - return (AE_AML_NOT_OWNER); - } - - /* - * The sync level of the mutex must be less than or - * equal to the current sync level - */ - if (obj_desc->mutex.sync_level > walk_state->current_sync_level) { - return (AE_AML_MUTEX_ORDER); - } - - /* - * Match multiple Acquires with multiple Releases - */ - obj_desc->mutex.acquisition_depth--; - if (obj_desc->mutex.acquisition_depth != 0) { - /* Just decrement the depth and return */ - - return (AE_OK); - } - - - /* Release the mutex */ - - status = acpi_aml_system_release_mutex (obj_desc); - - /* Update the mutex and walk state */ - - obj_desc->mutex.owner = NULL; - walk_state->current_sync_level = obj_desc->mutex.sync_level; - - /* Unlink the mutex from the owner's list */ - - acpi_aml_unlink_mutex (obj_desc); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_release_all_mutexes - * - * PARAMETERS: *Mutex_list - Head of the mutex list - * - * RETURN: Status - * - * DESCRIPTION: Release all mutexes in the list - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_release_all_mutexes ( - ACPI_OPERAND_OBJECT *list_head) -{ - ACPI_OPERAND_OBJECT *next = list_head->mutex.next; - ACPI_OPERAND_OBJECT *this; - - - /* - * Traverse the list of owned mutexes, releasing each one. - */ - while (next) { - this = next; - next = this->mutex.next; - - /* Mark mutex un-owned */ - - this->mutex.owner = NULL; - this->mutex.prev = NULL; - this->mutex.next = NULL; - this->mutex.acquisition_depth = 0; - - /* Release the mutex */ - - acpi_aml_system_release_mutex (this); - } - - return (AE_OK); -} - - diff --git a/reactos/drivers/bus/acpi/executer/amnames.c b/reactos/drivers/bus/acpi/executer/amnames.c deleted file mode 100644 index 269631f49f0..00000000000 --- a/reactos/drivers/bus/acpi/executer/amnames.c +++ /dev/null @@ -1,387 +0,0 @@ - -/****************************************************************************** - * - * Module Name: amnames - interpreter/scanner name load/execute - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amnames") - - -/* AML Package Length encodings */ - -#define ACPI_AML_PACKAGE_TYPE1 0x40 -#define ACPI_AML_PACKAGE_TYPE2 0x4000 -#define ACPI_AML_PACKAGE_TYPE3 0x400000 -#define ACPI_AML_PACKAGE_TYPE4 0x40000000 - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_allocate_name_string - * - * PARAMETERS: Prefix_count - Count of parent levels. Special cases: - * (-1) = root, 0 = none - * Num_name_segs - count of 4-character name segments - * - * RETURN: A pointer to the allocated string segment. This segment must - * be deleted by the caller. - * - * DESCRIPTION: Allocate a buffer for a name string. Ensure allocated name - * string is long enough, and set up prefix if any. - * - ******************************************************************************/ - -NATIVE_CHAR * -acpi_aml_allocate_name_string ( - u32 prefix_count, - u32 num_name_segs) -{ - NATIVE_CHAR *temp_ptr; - NATIVE_CHAR *name_string; - u32 size_needed; - - - /* - * Allow room for all \ and ^ prefixes, all segments, and a Multi_name_prefix. - * Also, one byte for the null terminator. - * This may actually be somewhat longer than needed. - */ - - if (prefix_count == (u32) -1) { - /* Special case for root */ - - size_needed = 1 + (ACPI_NAME_SIZE * num_name_segs) + 2 + 1; - } - else { - size_needed = prefix_count + (ACPI_NAME_SIZE * num_name_segs) + 2 + 1; - } - - /* - * Allocate a buffer for the name. - * This buffer must be deleted by the caller! - */ - - name_string = acpi_cm_allocate (size_needed); - if (!name_string) { - REPORT_ERROR (("Aml_allocate_name_string: name allocation failure\n")); - return (NULL); - } - - temp_ptr = name_string; - - /* Set up Root or Parent prefixes if needed */ - - if (prefix_count == (u32) -1) { - *temp_ptr++ = AML_ROOT_PREFIX; - } - - else { - while (prefix_count--) { - *temp_ptr++ = AML_PARENT_PREFIX; - } - } - - - /* Set up Dual or Multi prefixes if needed */ - - if (num_name_segs > 2) { - /* Set up multi prefixes */ - - *temp_ptr++ = AML_MULTI_NAME_PREFIX_OP; - *temp_ptr++ = (char) num_name_segs; - } - - else if (2 == num_name_segs) { - /* Set up dual prefixes */ - - *temp_ptr++ = AML_DUAL_NAME_PREFIX; - } - - /* - * Terminate string following prefixes. Acpi_aml_exec_name_segment() will - * append the segment(s) - */ - - *temp_ptr = 0; - - return (name_string); -} - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_exec_name_segment - * - * PARAMETERS: Interpreter_mode - Current running mode (load1/Load2/Exec) - * - * RETURN: Status - * - * DESCRIPTION: Execute a name segment (4 bytes) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_name_segment ( - u8 **in_aml_address, - NATIVE_CHAR *name_string) -{ - u8 *aml_address = *in_aml_address; - ACPI_STATUS status = AE_OK; - u32 index; - NATIVE_CHAR char_buf[5]; - - - /* - * If first character is a digit, then we know that we aren't looking at a - * valid name segment - */ - - char_buf[0] = *aml_address; - - if ('0' <= char_buf[0] && char_buf[0] <= '9') { - return (AE_CTRL_PENDING); - } - - for (index = 4; - (index > 0) && (acpi_cm_valid_acpi_character (*aml_address)); - --index) { - char_buf[4 - index] = *aml_address++; - } - - - /* Valid name segment */ - - if (0 == index) { - /* Found 4 valid characters */ - - char_buf[4] = '\0'; - - if (name_string) { - STRCAT (name_string, char_buf); - } - - } - - else if (4 == index) { - /* - * First character was not a valid name character, - * so we are looking at something other than a name. - */ - status = AE_CTRL_PENDING; - } - - else { - /* Segment started with one or more valid characters, but fewer than 4 */ - - status = AE_AML_BAD_NAME; - } - - *in_aml_address = aml_address; - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_get_name_string - * - * PARAMETERS: Data_type - Data type to be associated with this name - * - * RETURN: Status - * - * DESCRIPTION: Get a name, including any prefixes. - * - ******************************************************************************/ - - -ACPI_STATUS -acpi_aml_get_name_string ( - OBJECT_TYPE_INTERNAL data_type, - u8 *in_aml_address, - NATIVE_CHAR **out_name_string, - u32 *out_name_length) -{ - ACPI_STATUS status = AE_OK; - u8 *aml_address = in_aml_address; - NATIVE_CHAR *name_string = NULL; - u32 num_segments; - u32 prefix_count = 0; - u8 prefix = 0; - u8 has_prefix = FALSE; - - - if (INTERNAL_TYPE_DEF_FIELD == data_type || - INTERNAL_TYPE_BANK_FIELD == data_type || - INTERNAL_TYPE_INDEX_FIELD == data_type) { - /* Disallow prefixes for types associated with field names */ - - name_string = acpi_aml_allocate_name_string (0, 1); - if (!name_string) { - status = AE_NO_MEMORY; - } - else { - status = acpi_aml_exec_name_segment (&aml_address, name_string); - } - } - - else { - /* - * Data_type is not a field name. - * Examine first character of name for root or parent prefix operators - */ - - switch (*aml_address) { - - case AML_ROOT_PREFIX: - - prefix = *aml_address++; - /* - * Remember that we have a Root_prefix -- - * see comment in Acpi_aml_allocate_name_string() - */ - prefix_count = (u32) -1; - has_prefix = TRUE; - break; - - - case AML_PARENT_PREFIX: - - /* Increment past possibly multiple parent prefixes */ - - do { - prefix = *aml_address++; - ++prefix_count; - - } while (*aml_address == AML_PARENT_PREFIX); - has_prefix = TRUE; - break; - - - default: - - break; - } - - - /* Examine first character of name for name segment prefix operator */ - - switch (*aml_address) { - - case AML_DUAL_NAME_PREFIX: - - prefix = *aml_address++; - name_string = acpi_aml_allocate_name_string (prefix_count, 2); - if (!name_string) { - status = AE_NO_MEMORY; - break; - } - - /* Indicate that we processed a prefix */ - has_prefix = TRUE; - - status = acpi_aml_exec_name_segment (&aml_address, name_string); - if (ACPI_SUCCESS (status)) { - status = acpi_aml_exec_name_segment (&aml_address, name_string); - } - break; - - - case AML_MULTI_NAME_PREFIX_OP: - - prefix = *aml_address++; - /* Fetch count of segments remaining in name path */ - - num_segments = *aml_address++; - - name_string = acpi_aml_allocate_name_string (prefix_count, num_segments); - if (!name_string) { - status = AE_NO_MEMORY; - break; - } - - /* Indicate that we processed a prefix */ - has_prefix = TRUE; - - while (num_segments && - (status = acpi_aml_exec_name_segment (&aml_address, name_string)) == AE_OK) { - --num_segments; - } - - break; - - - case 0: - - /* Null_name valid as of 8-12-98 ASL/AML Grammar Update */ - - - /* Consume the NULL byte */ - - aml_address++; - name_string = acpi_aml_allocate_name_string (prefix_count, 0); - if (!name_string) { - status = AE_NO_MEMORY; - break; - } - - break; - - - default: - - /* Name segment string */ - - name_string = acpi_aml_allocate_name_string (prefix_count, 1); - if (!name_string) { - status = AE_NO_MEMORY; - break; - } - - status = acpi_aml_exec_name_segment (&aml_address, name_string); - break; - - } /* Switch (Peek_op ()) */ - } - - - if (AE_CTRL_PENDING == status && has_prefix) { - /* Ran out of segments after processing a prefix */ - - REPORT_ERROR ( - ("Aml_do_name: Malformed Name at %p\n", name_string)); - status = AE_AML_BAD_NAME; - } - - - *out_name_string = name_string; - *out_name_length = (u32) (aml_address - in_aml_address); - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/executer/amprep.c b/reactos/drivers/bus/acpi/executer/amprep.c deleted file mode 100644 index 351fb2bffe1..00000000000 --- a/reactos/drivers/bus/acpi/executer/amprep.c +++ /dev/null @@ -1,400 +0,0 @@ - -/****************************************************************************** - * - * Module Name: amprep - ACPI AML (p-code) execution - field prep utilities - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amprep") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_decode_field_access_type - * - * PARAMETERS: Access - Encoded field access bits - * - * RETURN: Field granularity (8, 16, or 32) - * - * DESCRIPTION: Decode the Access_type bits of a field definition. - * - ******************************************************************************/ - -static u32 -acpi_aml_decode_field_access_type ( - u32 access, - u16 length) -{ - - switch (access) { - case ACCESS_ANY_ACC: - if (length <= 8) { - return (8); - } - else if (length <= 16) { - return (16); - } - else if (length <= 32) { - return (32); - } - else { - return (8); - } - break; - - case ACCESS_BYTE_ACC: - return (8); - break; - - case ACCESS_WORD_ACC: - return (16); - break; - - case ACCESS_DWORD_ACC: - return (32); - break; - - default: - /* Invalid field access type */ - - return (0); - } -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_prep_common_field_objec - * - * PARAMETERS: Obj_desc - The field object - * Field_flags - Access, Lock_rule, or Update_rule. - * The format of a Field_flag is described - * in the ACPI specification - * Field_position - Field position - * Field_length - Field length - * - * RETURN: Status - * - * DESCRIPTION: Initialize the areas of the field object that are common - * to the various types of fields. - * - ******************************************************************************/ - -static ACPI_STATUS -acpi_aml_prep_common_field_object ( - ACPI_OPERAND_OBJECT *obj_desc, - u8 field_flags, - u8 field_attribute, - u32 field_position, - u32 field_length) -{ - u32 granularity; - - - /* - * Note: the structure being initialized is the - * ACPI_COMMON_FIELD_INFO; Therefore, we can just use the Field union to - * access this common area. No structure fields outside of the common area - * are initialized by this procedure. - */ - - /* Decode the Field_flags */ - - obj_desc->field.access = (u8) ((field_flags & ACCESS_TYPE_MASK) - >> ACCESS_TYPE_SHIFT); - obj_desc->field.lock_rule = (u8) ((field_flags & LOCK_RULE_MASK) - >> LOCK_RULE_SHIFT); - obj_desc->field.update_rule = (u8) ((field_flags & UPDATE_RULE_MASK) - >> UPDATE_RULE_SHIFT); - - /* Other misc fields */ - - obj_desc->field.length = (u16) field_length; - obj_desc->field.access_attribute = field_attribute; - - /* Decode the access type so we can compute offsets */ - - granularity = acpi_aml_decode_field_access_type (obj_desc->field.access, obj_desc->field.length); - if (!granularity) { - return (AE_AML_OPERAND_VALUE); - } - - /* Access granularity based fields */ - - obj_desc->field.granularity = (u8) granularity; - obj_desc->field.bit_offset = (u8) (field_position % granularity); - obj_desc->field.offset = (u32) field_position / granularity; - - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_prep_def_field_value - * - * PARAMETERS: Node - Owning Node - * Region - Region in which field is being defined - * Field_flags - Access, Lock_rule, or Update_rule. - * The format of a Field_flag is described - * in the ACPI specification - * Field_position - Field position - * Field_length - Field length - * - * RETURN: Status - * - * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT of type Def_field and - * connect it to the parent Node. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_prep_def_field_value ( - ACPI_NAMESPACE_NODE *node, - ACPI_HANDLE region, - u8 field_flags, - u8 field_attribute, - u32 field_position, - u32 field_length) -{ - ACPI_OPERAND_OBJECT *obj_desc; - u32 type; - ACPI_STATUS status; - - - /* Parameter validation */ - - if (!region) { - return (AE_AML_NO_OPERAND); - } - - type = acpi_ns_get_type (region); - if (type != ACPI_TYPE_REGION) { - return (AE_AML_OPERAND_TYPE); - } - - /* Allocate a new object */ - - obj_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_DEF_FIELD); - if (!obj_desc) { - return (AE_NO_MEMORY); - } - - - /* Obj_desc and Region valid */ - - /* Initialize areas of the object that are common to all fields */ - - status = acpi_aml_prep_common_field_object (obj_desc, field_flags, field_attribute, - field_position, field_length); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Initialize areas of the object that are specific to this field type */ - - obj_desc->field.container = acpi_ns_get_attached_object (region); - - /* An additional reference for the container */ - - acpi_cm_add_reference (obj_desc->field.container); - - - /* Debug info */ - - /* - * Store the constructed descriptor (Obj_desc) into the Named_obj whose - * handle is on TOS, preserving the current type of that Named_obj. - */ - status = acpi_ns_attach_object ((ACPI_HANDLE) node, obj_desc, - (u8) acpi_ns_get_type ((ACPI_HANDLE) node)); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_prep_bank_field_value - * - * PARAMETERS: Node - Owning Node - * Region - Region in which field is being defined - * Bank_reg - Bank selection register - * Bank_val - Value to store in selection register - * Field_flags - Access, Lock_rule, or Update_rule - * Field_position - Field position - * Field_length - Field length - * - * RETURN: Status - * - * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT of type Bank_field and - * connect it to the parent Node. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_prep_bank_field_value ( - ACPI_NAMESPACE_NODE *node, - ACPI_HANDLE region, - ACPI_HANDLE bank_reg, - u32 bank_val, - u8 field_flags, - u8 field_attribute, - u32 field_position, - u32 field_length) -{ - ACPI_OPERAND_OBJECT *obj_desc; - u32 type; - ACPI_STATUS status; - - - /* Parameter validation */ - - if (!region) { - return (AE_AML_NO_OPERAND); - } - - type = acpi_ns_get_type (region); - if (type != ACPI_TYPE_REGION) { - return (AE_AML_OPERAND_TYPE); - } - - /* Allocate a new object */ - - obj_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_BANK_FIELD); - if (!obj_desc) { - return (AE_NO_MEMORY); - } - - /* Obj_desc and Region valid */ - - /* Initialize areas of the object that are common to all fields */ - - status = acpi_aml_prep_common_field_object (obj_desc, field_flags, field_attribute, - field_position, field_length); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Initialize areas of the object that are specific to this field type */ - - obj_desc->bank_field.value = bank_val; - obj_desc->bank_field.container = acpi_ns_get_attached_object (region); - obj_desc->bank_field.bank_select = acpi_ns_get_attached_object (bank_reg); - - /* An additional reference for the container and bank select */ - /* TBD: [Restructure] is "Bank_select" ever a real internal object?? */ - - acpi_cm_add_reference (obj_desc->bank_field.container); - acpi_cm_add_reference (obj_desc->bank_field.bank_select); - - /* Debug info */ - - /* - * Store the constructed descriptor (Obj_desc) into the Named_obj whose - * handle is on TOS, preserving the current type of that Named_obj. - */ - status = acpi_ns_attach_object ((ACPI_HANDLE) node, obj_desc, - (u8) acpi_ns_get_type ((ACPI_HANDLE) node)); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_prep_index_field_value - * - * PARAMETERS: Node - Owning Node - * Index_reg - Index register - * Data_reg - Data register - * Field_flags - Access, Lock_rule, or Update_rule - * Field_position - Field position - * Field_length - Field length - * - * RETURN: Status - * - * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT of type Index_field and - * connect it to the parent Node. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_prep_index_field_value ( - ACPI_NAMESPACE_NODE *node, - ACPI_HANDLE index_reg, - ACPI_HANDLE data_reg, - u8 field_flags, - u8 field_attribute, - u32 field_position, - u32 field_length) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_STATUS status; - - - /* Parameter validation */ - - if (!index_reg || !data_reg) { - return (AE_AML_NO_OPERAND); - } - - /* Allocate a new object descriptor */ - - obj_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_INDEX_FIELD); - if (!obj_desc) { - return (AE_NO_MEMORY); - } - - /* Initialize areas of the object that are common to all fields */ - - status = acpi_aml_prep_common_field_object (obj_desc, field_flags, field_attribute, - field_position, field_length); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Initialize areas of the object that are specific to this field type */ - - obj_desc->index_field.value = (u32) (field_position / - obj_desc->field.granularity); - obj_desc->index_field.index = index_reg; - obj_desc->index_field.data = data_reg; - - /* Debug info */ - - /* - * Store the constructed descriptor (Obj_desc) into the Named_obj whose - * handle is on TOS, preserving the current type of that Named_obj. - */ - status = acpi_ns_attach_object ((ACPI_HANDLE) node, obj_desc, - (u8) acpi_ns_get_type ((ACPI_HANDLE) node)); - - return (status); -} - diff --git a/reactos/drivers/bus/acpi/executer/amregion.c b/reactos/drivers/bus/acpi/executer/amregion.c deleted file mode 100644 index a3e9e0a4a5f..00000000000 --- a/reactos/drivers/bus/acpi/executer/amregion.c +++ /dev/null @@ -1,405 +0,0 @@ - -/****************************************************************************** - * - * Module Name: amregion - ACPI default Op_region (address space) handlers - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amregion") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_system_memory_space_handler - * - * PARAMETERS: Function - Read or Write operation - * Address - Where in the space to read or write - * Bit_width - Field width in bits (8, 16, or 32) - * Value - Pointer to in or out value - * Handler_context - Pointer to Handler's context - * Region_context - Pointer to context specific to the - * accessed region - * - * RETURN: Status - * - * DESCRIPTION: Handler for the System Memory address space (Op Region) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_system_memory_space_handler ( - u32 function, - ACPI_PHYSICAL_ADDRESS address, - u32 bit_width, - u32 *value, - void *handler_context, - void *region_context) -{ - ACPI_STATUS status = AE_OK; - void *logical_addr_ptr = NULL; - MEM_HANDLER_CONTEXT *mem_info = region_context; - u32 length; - - - /* Validate and translate the bit width */ - - switch (bit_width) { - case 8: - length = 1; - break; - - case 16: - length = 2; - break; - - case 32: - length = 4; - break; - - default: - return (AE_AML_OPERAND_VALUE); - break; - } - - - /* - * Does the request fit into the cached memory mapping? - * Is 1) Address below the current mapping? OR - * 2) Address beyond the current mapping? - */ - - if ((address < mem_info->mapped_physical_address) || - (((ACPI_INTEGER) address + length) > - ((ACPI_INTEGER) mem_info->mapped_physical_address + mem_info->mapped_length))) { - /* - * The request cannot be resolved by the current memory mapping; - * Delete the existing mapping and create a new one. - */ - - if (mem_info->mapped_length) { - /* Valid mapping, delete it */ - - acpi_os_unmap_memory (mem_info->mapped_logical_address, - mem_info->mapped_length); - } - - mem_info->mapped_length = 0; /* In case of failure below */ - - /* Create a new mapping starting at the address given */ - - status = acpi_os_map_memory (address, SYSMEM_REGION_WINDOW_SIZE, - (void **) &mem_info->mapped_logical_address); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* TBD: should these pointers go to 64-bit in all cases ? */ - - mem_info->mapped_physical_address = address; - mem_info->mapped_length = SYSMEM_REGION_WINDOW_SIZE; - } - - - /* - * Generate a logical pointer corresponding to the address we want to - * access - */ - - /* TBD: should these pointers go to 64-bit in all cases ? */ - - logical_addr_ptr = mem_info->mapped_logical_address + - ((ACPI_INTEGER) address - (ACPI_INTEGER) mem_info->mapped_physical_address); - - /* Perform the memory read or write */ - - switch (function) { - - case ADDRESS_SPACE_READ: - - switch (bit_width) { - case 8: - *value = (u32)* (u8 *) logical_addr_ptr; - break; - - case 16: - MOVE_UNALIGNED16_TO_32 (value, logical_addr_ptr); - break; - - case 32: - MOVE_UNALIGNED32_TO_32 (value, logical_addr_ptr); - break; - } - - break; - - - case ADDRESS_SPACE_WRITE: - - switch (bit_width) { - case 8: - *(u8 *) logical_addr_ptr = (u8) *value; - break; - - case 16: - MOVE_UNALIGNED16_TO_16 (logical_addr_ptr, value); - break; - - case 32: - MOVE_UNALIGNED32_TO_32 (logical_addr_ptr, value); - break; - } - - break; - - - default: - status = AE_BAD_PARAMETER; - break; - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_system_io_space_handler - * - * PARAMETERS: Function - Read or Write operation - * Address - Where in the space to read or write - * Bit_width - Field width in bits (8, 16, or 32) - * Value - Pointer to in or out value - * Handler_context - Pointer to Handler's context - * Region_context - Pointer to context specific to the - * accessed region - * - * RETURN: Status - * - * DESCRIPTION: Handler for the System IO address space (Op Region) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_system_io_space_handler ( - u32 function, - ACPI_PHYSICAL_ADDRESS address, - u32 bit_width, - u32 *value, - void *handler_context, - void *region_context) -{ - ACPI_STATUS status = AE_OK; - - - /* Decode the function parameter */ - - switch (function) { - - case ADDRESS_SPACE_READ: - - switch (bit_width) { - /* I/O Port width */ - - case 8: - *value = (u32) acpi_os_in8 ((ACPI_IO_ADDRESS) address); - break; - - case 16: - *value = (u32) acpi_os_in16 ((ACPI_IO_ADDRESS) address); - break; - - case 32: - *value = acpi_os_in32 ((ACPI_IO_ADDRESS) address); - break; - - default: - status = AE_AML_OPERAND_VALUE; - } - - break; - - - case ADDRESS_SPACE_WRITE: - - switch (bit_width) { - /* I/O Port width */ - case 8: - acpi_os_out8 ((ACPI_IO_ADDRESS) address, (u8) *value); - break; - - case 16: - acpi_os_out16 ((ACPI_IO_ADDRESS) address, (u16) *value); - break; - - case 32: - acpi_os_out32 ((ACPI_IO_ADDRESS) address, *value); - break; - - default: - status = AE_AML_OPERAND_VALUE; - } - - break; - - - default: - status = AE_BAD_PARAMETER; - break; - } - - return (status); -} - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_pci_config_space_handler - * - * PARAMETERS: Function - Read or Write operation - * Address - Where in the space to read or write - * Bit_width - Field width in bits (8, 16, or 32) - * Value - Pointer to in or out value - * Handler_context - Pointer to Handler's context - * Region_context - Pointer to context specific to the - * accessed region - * - * RETURN: Status - * - * DESCRIPTION: Handler for the PCI Config address space (Op Region) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_pci_config_space_handler ( - u32 function, - ACPI_PHYSICAL_ADDRESS address, - u32 bit_width, - u32 *value, - void *handler_context, - void *region_context) -{ - ACPI_STATUS status = AE_OK; - u32 pci_bus; - u32 dev_func; - u8 pci_reg; - PCI_HANDLER_CONTEXT *PCIcontext; - - - /* - * The arguments to Acpi_os(Read|Write)Pci_cfg(Byte|Word|Dword) are: - * - * Seg_bus - 0xSSSSBBBB - SSSS is the PCI bus segment - * BBBB is the PCI bus number - * - * Dev_func - 0xDDDDFFFF - DDDD is the PCI device number - * FFFF is the PCI device function number - * - * Reg_num - Config space register must be < 40h - * - * Value - input value for write, output for read - * - */ - - PCIcontext = (PCI_HANDLER_CONTEXT *) region_context; - - pci_bus = LOWORD(PCIcontext->seg) << 16; - pci_bus |= LOWORD(PCIcontext->bus); - - dev_func = PCIcontext->dev_func; - - pci_reg = (u8) address; - - switch (function) { - - case ADDRESS_SPACE_READ: - - *value = 0; - - switch (bit_width) { - /* PCI Register width */ - - case 8: - status = acpi_os_read_pci_cfg_byte (pci_bus, dev_func, pci_reg, - (u8 *) value); - break; - - case 16: - status = acpi_os_read_pci_cfg_word (pci_bus, dev_func, pci_reg, - (u16 *) value); - break; - - case 32: - status = acpi_os_read_pci_cfg_dword (pci_bus, dev_func, pci_reg, - value); - break; - - default: - status = AE_AML_OPERAND_VALUE; - - } /* Switch bit_width */ - - break; - - - case ADDRESS_SPACE_WRITE: - - switch (bit_width) { - /* PCI Register width */ - - case 8: - status = acpi_os_write_pci_cfg_byte (pci_bus, dev_func, pci_reg, - *(u8 *) value); - break; - - case 16: - status = acpi_os_write_pci_cfg_word (pci_bus, dev_func, pci_reg, - *(u16 *) value); - break; - - case 32: - status = acpi_os_write_pci_cfg_dword (pci_bus, dev_func, pci_reg, - *value); - break; - - default: - status = AE_AML_OPERAND_VALUE; - - } /* Switch bit_width */ - - break; - - - default: - - status = AE_BAD_PARAMETER; - break; - - } - - return (status); -} - diff --git a/reactos/drivers/bus/acpi/executer/amresnte.c b/reactos/drivers/bus/acpi/executer/amresnte.c deleted file mode 100644 index 9ddbc841728..00000000000 --- a/reactos/drivers/bus/acpi/executer/amresnte.c +++ /dev/null @@ -1,500 +0,0 @@ - -/****************************************************************************** - * - * Module Name: amresnte - AML Interpreter object resolution - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amresnte") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_resolve_node_to_value - * - * PARAMETERS: Stack_ptr - Pointer to a location on a stack that contains - * a pointer to an Node - * - * RETURN: Status - * - * DESCRIPTION: Resolve a ACPI_NAMESPACE_NODE (Node, - * A.K.A. a "direct name pointer") - * - * Note: for some of the data types, the pointer attached to the Node - * can be either a pointer to an actual internal object or a pointer into the - * AML stream itself. These types are currently: - * - * ACPI_TYPE_INTEGER - * ACPI_TYPE_STRING - * ACPI_TYPE_BUFFER - * ACPI_TYPE_MUTEX - * ACPI_TYPE_PACKAGE - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_resolve_node_to_value ( - ACPI_NAMESPACE_NODE **stack_ptr, - ACPI_WALK_STATE *walk_state) - -{ - ACPI_STATUS status = AE_OK; - ACPI_OPERAND_OBJECT *val_desc = NULL; - ACPI_OPERAND_OBJECT *obj_desc = NULL; - ACPI_NAMESPACE_NODE *node; - u8 *aml_pointer = NULL; - OBJECT_TYPE_INTERNAL entry_type; - u8 locked; - u8 attached_aml_pointer = FALSE; - u8 aml_opcode = 0; - ACPI_INTEGER temp_val; - OBJECT_TYPE_INTERNAL object_type; - - - node = *stack_ptr; - - - /* - * The stack pointer is a "Direct name ptr", and points to a - * a ACPI_NAMESPACE_NODE (Node). Get the pointer that is attached to - * the Node. - */ - - val_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) node); - entry_type = acpi_ns_get_type ((ACPI_HANDLE) node); - - /* - * The Val_desc attached to the Node can be either: - * 1) An internal ACPI object - * 2) A pointer into the AML stream (into one of the ACPI system tables) - */ - - if (acpi_tb_system_table_pointer (val_desc)) { - attached_aml_pointer = TRUE; - aml_opcode = *((u8 *) val_desc); - aml_pointer = ((u8 *) val_desc) + 1; - - } - - - /* - * Several Entry_types do not require further processing, so - * we will return immediately - */ - /* Devices rarely have an attached object, return the Node - * and Method locals and arguments have a pseudo-Node - */ - if (entry_type == ACPI_TYPE_DEVICE || - (node->flags & (ANOBJ_METHOD_ARG | ANOBJ_METHOD_LOCAL))) { - return (AE_OK); - } - - if (!val_desc) { - return (AE_AML_NO_OPERAND); - } - - /* - * Action is based on the type of the Node, which indicates the type - * of the attached object or pointer - */ - switch (entry_type) { - - case ACPI_TYPE_PACKAGE: - - if (attached_aml_pointer) { - /* - * This means that the package initialization is not parsed - * -- should not happen - */ - return (AE_NOT_IMPLEMENTED); - } - - /* Val_desc is an internal object in all cases by the time we get here */ - - if (ACPI_TYPE_PACKAGE != val_desc->common.type) { - return (AE_AML_OPERAND_TYPE); - } - - /* Return an additional reference to the object */ - - obj_desc = val_desc; - acpi_cm_add_reference (obj_desc); - break; - - - case ACPI_TYPE_BUFFER: - - if (attached_aml_pointer) { - /* - * This means that the buffer initialization is not parsed - * -- should not happen - */ - return (AE_NOT_IMPLEMENTED); - } - - /* Val_desc is an internal object in all cases by the time we get here */ - - if (ACPI_TYPE_BUFFER != val_desc->common.type) { - return (AE_AML_OPERAND_TYPE); - } - - /* Return an additional reference to the object */ - - obj_desc = val_desc; - acpi_cm_add_reference (obj_desc); - break; - - - case ACPI_TYPE_STRING: - - if (attached_aml_pointer) { - /* Allocate a new string object */ - - obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_STRING); - if (!obj_desc) { - return (AE_NO_MEMORY); - } - - /* Init the internal object */ - - obj_desc->string.pointer = (NATIVE_CHAR *) aml_pointer; - obj_desc->string.length = STRLEN (obj_desc->string.pointer); - } - - else { - if (ACPI_TYPE_STRING != val_desc->common.type) { - return (AE_AML_OPERAND_TYPE); - } - - /* Return an additional reference to the object */ - - obj_desc = val_desc; - acpi_cm_add_reference (obj_desc); - } - - break; - - - case ACPI_TYPE_INTEGER: - - /* - * The Node has an attached internal object, make sure that it's a - * number - */ - - if (ACPI_TYPE_INTEGER != val_desc->common.type) { - return (AE_AML_OPERAND_TYPE); - } - - /* Return an additional reference to the object */ - - obj_desc = val_desc; - acpi_cm_add_reference (obj_desc); - break; - - - case INTERNAL_TYPE_DEF_FIELD: - - /* - * TBD: [Investigate] Is this the correct solution? - * - * This section was extended to convert to generic buffer if - * the return length is greater than 32 bits, but still allows - * for returning a type Number for smaller values because the - * caller can then apply arithmetic operators on those fields. - * - * XXX - Implementation limitation: Fields are implemented as type - * XXX - Number, but they really are supposed to be type Buffer. - * XXX - The two are interchangeable only for lengths <= 32 bits. - */ - if(val_desc->field.length > 32) { - object_type = ACPI_TYPE_BUFFER; - } - else { - object_type = ACPI_TYPE_INTEGER; - } - - /* - * Create the destination buffer object and the buffer space. - */ - obj_desc = acpi_cm_create_internal_object (object_type); - if (!obj_desc) { - return (AE_NO_MEMORY); - } - - /* - * Fill in the object specific details - */ - if (ACPI_TYPE_BUFFER == object_type) { - obj_desc->buffer.pointer = acpi_cm_callocate (val_desc->field.length); - if (!obj_desc->buffer.pointer) { - acpi_cm_remove_reference(obj_desc); - return (AE_NO_MEMORY); - } - - obj_desc->buffer.length = val_desc->field.length; - - status = acpi_aml_access_named_field (ACPI_READ, (ACPI_HANDLE) node, - obj_desc->buffer.pointer, obj_desc->buffer.length); - - if (ACPI_FAILURE (status)) { - return (status); - } - } - else { - status = acpi_aml_access_named_field (ACPI_READ, (ACPI_HANDLE) node, - &temp_val, sizeof (temp_val)); - - if (ACPI_FAILURE (status)) { - return (status); - } - - obj_desc->integer.value = temp_val; - } - - - break; - - - case INTERNAL_TYPE_BANK_FIELD: - - if (attached_aml_pointer) { - return (AE_AML_OPERAND_TYPE); - } - - if (INTERNAL_TYPE_BANK_FIELD != val_desc->common.type) { - return (AE_AML_OPERAND_TYPE); - } - - - /* Get the global lock if needed */ - - obj_desc = (ACPI_OPERAND_OBJECT *) *stack_ptr; - locked = acpi_aml_acquire_global_lock (obj_desc->field_unit.lock_rule); - - /* Set Index value to select proper Data register */ - /* perform the update */ - - status = acpi_aml_access_named_field (ACPI_WRITE, - val_desc->bank_field.bank_select, &val_desc->bank_field.value, - sizeof (val_desc->bank_field.value)); - - acpi_aml_release_global_lock (locked); - - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Read Data value */ - - status = acpi_aml_access_named_field (ACPI_READ, - (ACPI_HANDLE) val_desc->bank_field.container, - &temp_val, sizeof (temp_val)); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Create an object for the result */ - - obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER); - if (!obj_desc) { - return (AE_NO_MEMORY); - } - - obj_desc->integer.value = temp_val; - break; - - - case INTERNAL_TYPE_INDEX_FIELD: - - if (attached_aml_pointer) { - return (AE_AML_OPERAND_TYPE); - } - - if (INTERNAL_TYPE_INDEX_FIELD != val_desc->common.type) { - return (AE_AML_OPERAND_TYPE); - } - - - /* Set Index value to select proper Data register */ - /* Get the global lock if needed */ - - obj_desc = (ACPI_OPERAND_OBJECT *) *stack_ptr; - locked = acpi_aml_acquire_global_lock (obj_desc->field_unit.lock_rule); - - /* Perform the update */ - - status = acpi_aml_access_named_field (ACPI_WRITE, - val_desc->index_field.index, &val_desc->index_field.value, - sizeof (val_desc->index_field.value)); - - acpi_aml_release_global_lock (locked); - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Read Data value */ - - status = acpi_aml_access_named_field (ACPI_READ, val_desc->index_field.data, - &temp_val, sizeof (temp_val)); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Create an object for the result */ - - obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER); - if (!obj_desc) { - return (AE_NO_MEMORY); - } - - obj_desc->integer.value = temp_val; - break; - - - case ACPI_TYPE_FIELD_UNIT: - - if (attached_aml_pointer) { - return (AE_AML_OPERAND_TYPE); - } - - if (val_desc->common.type != (u8) entry_type) { - return (AE_AML_OPERAND_TYPE); - break; - } - - /* Create object for result */ - - obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_ANY); - if (!obj_desc) { - return (AE_NO_MEMORY); - } - - status = acpi_aml_get_field_unit_value (val_desc, obj_desc); - if (ACPI_FAILURE (status)) { - acpi_cm_remove_reference (obj_desc); - return (status); - } - - break; - - - /* - * For these objects, just return the object attached to the Node - */ - - case ACPI_TYPE_MUTEX: - case ACPI_TYPE_METHOD: - case ACPI_TYPE_POWER: - case ACPI_TYPE_PROCESSOR: - case ACPI_TYPE_THERMAL: - case ACPI_TYPE_EVENT: - case ACPI_TYPE_REGION: - - - /* Return an additional reference to the object */ - - obj_desc = val_desc; - acpi_cm_add_reference (obj_desc); - break; - - - /* TYPE_Any is untyped, and thus there is no object associated with it */ - - case ACPI_TYPE_ANY: - - return (AE_AML_OPERAND_TYPE); /* Cannot be AE_TYPE */ - break; - - - /* - * The only named references allowed are named constants - * - * e.g. Name (\OSFL, Ones) - */ - case INTERNAL_TYPE_REFERENCE: - - switch (val_desc->reference.opcode) { - - case AML_ZERO_OP: - - temp_val = 0; - break; - - - case AML_ONE_OP: - - temp_val = 1; - break; - - - case AML_ONES_OP: - - temp_val = ACPI_INTEGER_MAX; - break; - - - default: - - return (AE_AML_BAD_OPCODE); - } - - /* Create object for result */ - - obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_INTEGER); - if (!obj_desc) { - return (AE_NO_MEMORY); - } - - obj_desc->integer.value = temp_val; - - /* Truncate value if we are executing from a 32-bit ACPI table */ - - acpi_aml_truncate_for32bit_table (obj_desc, walk_state); - break; - - - /* Default case is for unknown types */ - - default: - - return (AE_AML_OPERAND_TYPE); - - } /* switch (Entry_type) */ - - - /* Put the object descriptor on the stack */ - - *stack_ptr = (void *) obj_desc; - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/executer/amresolv.c b/reactos/drivers/bus/acpi/executer/amresolv.c deleted file mode 100644 index bdbaed6c3a6..00000000000 --- a/reactos/drivers/bus/acpi/executer/amresolv.c +++ /dev/null @@ -1,420 +0,0 @@ - -/****************************************************************************** - * - * Module Name: amresolv - AML Interpreter object resolution - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amresolv") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_get_field_unit_value - * - * PARAMETERS: *Field_desc - Pointer to a Field_unit - * *Result_desc - Pointer to an empty descriptor - * which will become a Number - * containing the field's value. - * - * RETURN: Status - * - * DESCRIPTION: Retrieve the value from a Field_unit - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_get_field_unit_value ( - ACPI_OPERAND_OBJECT *field_desc, - ACPI_OPERAND_OBJECT *result_desc) -{ - ACPI_STATUS status = AE_OK; - u32 mask; - u8 *location = NULL; - u8 locked = FALSE; - - - if (!field_desc) { - status = AE_AML_NO_OPERAND; - } - - if (!(field_desc->common.flags & AOPOBJ_DATA_VALID)) { - status = acpi_ds_get_field_unit_arguments (field_desc); - if (ACPI_FAILURE (status)) { - return (status); - } - } - - if (!field_desc->field_unit.container) { - status = AE_AML_INTERNAL; - } - - else if (ACPI_TYPE_BUFFER != field_desc->field_unit.container->common.type) { - status = AE_AML_OPERAND_TYPE; - } - - else if (!result_desc) { - status = AE_AML_INTERNAL; - } - - if (ACPI_FAILURE (status)) { - return (status); - } - - - /* Get the global lock if needed */ - - locked = acpi_aml_acquire_global_lock (field_desc->field_unit.lock_rule); - - /* Field location is (base of buffer) + (byte offset) */ - - location = field_desc->field_unit.container->buffer.pointer - + field_desc->field_unit.offset; - - /* - * Construct Mask with as many 1 bits as the field width - * - * NOTE: Only the bottom 5 bits are valid for a shift operation, so - * special care must be taken for any shift greater than 31 bits. - * - * TBD: [Unhandled] Fields greater than 32-bits will not work. - */ - - if (field_desc->field_unit.length < 32) { - mask = ((u32) 1 << field_desc->field_unit.length) - (u32) 1; - } - else { - mask = ACPI_UINT32_MAX; - } - - result_desc->integer.type = (u8) ACPI_TYPE_INTEGER; - - /* Get the 32 bit value at the location */ - - MOVE_UNALIGNED32_TO_32 (&result_desc->integer.value, location); - - /* - * Shift the 32-bit word containing the field, and mask off the - * resulting value - */ - - result_desc->integer.value = - (result_desc->integer.value >> field_desc->field_unit.bit_offset) & mask; - - /* Release global lock if we acquired it earlier */ - - acpi_aml_release_global_lock (locked); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_resolve_to_value - * - * PARAMETERS: **Stack_ptr - Points to entry on Obj_stack, which can - * be either an (ACPI_OPERAND_OBJECT *) - * or an ACPI_HANDLE. - * - * RETURN: Status - * - * DESCRIPTION: Convert Reference objects to values - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_resolve_to_value ( - ACPI_OPERAND_OBJECT **stack_ptr, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status = AE_OK; - - - if (!stack_ptr || !*stack_ptr) { - return (AE_AML_NO_OPERAND); - } - - - /* - * The entity pointed to by the Stack_ptr can be either - * 1) A valid ACPI_OPERAND_OBJECT, or - * 2) A ACPI_NAMESPACE_NODE (Named_obj) - */ - - if (VALID_DESCRIPTOR_TYPE (*stack_ptr, ACPI_DESC_TYPE_INTERNAL)) { - - status = acpi_aml_resolve_object_to_value (stack_ptr, walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - } - - /* - * Object on the stack may have changed if Acpi_aml_resolve_object_to_value() - * was called (i.e., we can't use an _else_ here.) - */ - - if (VALID_DESCRIPTOR_TYPE (*stack_ptr, ACPI_DESC_TYPE_NAMED)) { - status = acpi_aml_resolve_node_to_value ((ACPI_NAMESPACE_NODE **) stack_ptr, walk_state); - } - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_resolve_object_to_value - * - * PARAMETERS: Stack_ptr - Pointer to a stack location that contains a - * ptr to an internal object. - * - * RETURN: Status - * - * DESCRIPTION: Retrieve the value from an internal object. The Reference type - * uses the associated AML opcode to determine the value. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_resolve_object_to_value ( - ACPI_OPERAND_OBJECT **stack_ptr, - ACPI_WALK_STATE *walk_state) -{ - ACPI_OPERAND_OBJECT *stack_desc; - ACPI_STATUS status = AE_OK; - ACPI_HANDLE temp_handle = NULL; - ACPI_OPERAND_OBJECT *obj_desc = NULL; - u32 index = 0; - u16 opcode; - - - stack_desc = *stack_ptr; - - /* This is an ACPI_OPERAND_OBJECT */ - - switch (stack_desc->common.type) { - - case INTERNAL_TYPE_REFERENCE: - - opcode = stack_desc->reference.opcode; - - switch (opcode) { - - case AML_NAME_OP: - - /* - * Convert indirect name ptr to a direct name ptr. - * Then, Acpi_aml_resolve_node_to_value can be used to get the value - */ - - temp_handle = stack_desc->reference.object; - - /* Delete the Reference Object */ - - acpi_cm_remove_reference (stack_desc); - - /* Put direct name pointer onto stack and exit */ - - (*stack_ptr) = temp_handle; - status = AE_OK; - break; - - - case AML_LOCAL_OP: - case AML_ARG_OP: - - index = stack_desc->reference.offset; - - /* - * Get the local from the method's state info - * Note: this increments the local's object reference count - */ - - status = acpi_ds_method_data_get_value (opcode, index, - walk_state, &obj_desc); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * Now we can delete the original Reference Object and - * replace it with the resolve value - */ - - acpi_cm_remove_reference (stack_desc); - *stack_ptr = obj_desc; - - break; - - - /* - * TBD: [Restructure] These next three opcodes change the type of - * the object, which is actually a no-no. - */ - - case AML_ZERO_OP: - - stack_desc->common.type = (u8) ACPI_TYPE_INTEGER; - stack_desc->integer.value = 0; - break; - - - case AML_ONE_OP: - - stack_desc->common.type = (u8) ACPI_TYPE_INTEGER; - stack_desc->integer.value = 1; - break; - - - case AML_ONES_OP: - - stack_desc->common.type = (u8) ACPI_TYPE_INTEGER; - stack_desc->integer.value = ACPI_INTEGER_MAX; - - /* Truncate value if we are executing from a 32-bit ACPI table */ - - acpi_aml_truncate_for32bit_table (stack_desc, walk_state); - break; - - - case AML_INDEX_OP: - - switch (stack_desc->reference.target_type) { - case ACPI_TYPE_BUFFER_FIELD: - - /* Just return - leave the Reference on the stack */ - break; - - - case ACPI_TYPE_PACKAGE: - obj_desc = *stack_desc->reference.where; - if (obj_desc) { - /* - * Valid obj descriptor, copy pointer to return value - * (i.e., dereference the package index) - * Delete the ref object, increment the returned object - */ - acpi_cm_remove_reference (stack_desc); - acpi_cm_add_reference (obj_desc); - *stack_ptr = obj_desc; - } - - else { - /* - * A NULL object descriptor means an unitialized element of - * the package, can't deref it - */ - - status = AE_AML_UNINITIALIZED_ELEMENT; - } - break; - - default: - /* Invalid reference OBJ*/ - - status = AE_AML_INTERNAL; - break; - } - - break; - - - case AML_DEBUG_OP: - - /* Just leave the object as-is */ - break; - - - default: - - status = AE_AML_INTERNAL; - - } /* switch (Opcode) */ - - - if (ACPI_FAILURE (status)) { - return (status); - } - - break; /* case INTERNAL_TYPE_REFERENCE */ - - - case ACPI_TYPE_FIELD_UNIT: - - obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_ANY); - if (!obj_desc) { - /* Descriptor allocation failure */ - - return (AE_NO_MEMORY); - } - - status = acpi_aml_get_field_unit_value (stack_desc, obj_desc); - if (ACPI_FAILURE (status)) { - acpi_cm_remove_reference (obj_desc); - obj_desc = NULL; - } - - *stack_ptr = (void *) obj_desc; - break; - - - case INTERNAL_TYPE_BANK_FIELD: - - obj_desc = acpi_cm_create_internal_object (ACPI_TYPE_ANY); - if (!obj_desc) { - /* Descriptor allocation failure */ - - return (AE_NO_MEMORY); - } - - status = acpi_aml_get_field_unit_value (stack_desc, obj_desc); - if (ACPI_FAILURE (status)) { - acpi_cm_remove_reference (obj_desc); - obj_desc = NULL; - } - - *stack_ptr = (void *) obj_desc; - break; - - - /* TBD: [Future] - may need to handle Index_field, and Def_field someday */ - - default: - - break; - - } /* switch (Stack_desc->Common.Type) */ - - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/executer/amresop.c b/reactos/drivers/bus/acpi/executer/amresop.c deleted file mode 100644 index 58e9feb94de..00000000000 --- a/reactos/drivers/bus/acpi/executer/amresop.c +++ /dev/null @@ -1,475 +0,0 @@ - -/****************************************************************************** - * - * Module Name: amresop - AML Interpreter operand/object resolution - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amresop") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_check_object_type - * - * PARAMETERS: Type_needed Object type needed - * This_type Actual object type - * Object Object pointer - * - * RETURN: Status - * - * DESCRIPTION: Check required type against actual type - * - ******************************************************************************/ - -static ACPI_STATUS -acpi_aml_check_object_type ( - ACPI_OBJECT_TYPE type_needed, - ACPI_OBJECT_TYPE this_type, - void *object) -{ - - - if (type_needed == ACPI_TYPE_ANY) { - /* All types OK, so we don't perform any typechecks */ - - return (AE_OK); - } - - - if (type_needed != this_type) { - return (AE_AML_OPERAND_TYPE); - } - - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_resolve_operands - * - * PARAMETERS: Opcode Opcode being interpreted - * Stack_ptr Top of operand stack - * - * RETURN: Status - * - * DESCRIPTION: Convert stack entries to required types - * - * Each nibble in Arg_types represents one required operand - * and indicates the required Type: - * - * The corresponding stack entry will be converted to the - * required type if possible, else return an exception - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_resolve_operands ( - u16 opcode, - ACPI_OPERAND_OBJECT **stack_ptr, - ACPI_WALK_STATE *walk_state) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_STATUS status = AE_OK; - u8 object_type; - ACPI_HANDLE temp_handle; - u32 arg_types; - ACPI_OPCODE_INFO *op_info; - u32 this_arg_type; - ACPI_OBJECT_TYPE type_needed; - - - op_info = acpi_ps_get_opcode_info (opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { - return (AE_AML_BAD_OPCODE); - } - - - arg_types = op_info->runtime_args; - if (arg_types == ARGI_INVALID_OPCODE) { - return (AE_AML_INTERNAL); - } - - - /* - * Normal exit is with *Types == '\0' at end of string. - * Function will return an exception from within the loop upon - * finding an entry which is not, and cannot be converted - * to, the required type; if stack underflows; or upon - * finding a NULL stack entry (which "should never happen"). - */ - - while (GET_CURRENT_ARG_TYPE (arg_types)) { - if (!stack_ptr || !*stack_ptr) { - return (AE_AML_INTERNAL); - } - - /* Extract useful items */ - - obj_desc = *stack_ptr; - - /* Decode the descriptor type */ - - if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) { - /* Node */ - - object_type = ((ACPI_NAMESPACE_NODE *) obj_desc)->type; - } - - else if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_INTERNAL)) { - /* ACPI internal object */ - - object_type = obj_desc->common.type; - - /* Check for bad ACPI_OBJECT_TYPE */ - - if (!acpi_aml_validate_object_type (object_type)) { - return (AE_AML_OPERAND_TYPE); - } - - if (object_type == (u8) INTERNAL_TYPE_REFERENCE) { - /* - * Decode the Reference - */ - - op_info = acpi_ps_get_opcode_info (opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { - return (AE_AML_BAD_OPCODE); - } - - - switch (obj_desc->reference.opcode) { - case AML_ZERO_OP: - case AML_ONE_OP: - case AML_ONES_OP: - case AML_DEBUG_OP: - case AML_NAME_OP: - case AML_INDEX_OP: - case AML_ARG_OP: - case AML_LOCAL_OP: - - break; - - default: - return (AE_AML_OPERAND_TYPE); - break; - } - } - } - - else { - /* Invalid descriptor */ - - return (AE_AML_OPERAND_TYPE); - } - - - /* - * Get one argument type, point to the next - */ - - this_arg_type = GET_CURRENT_ARG_TYPE (arg_types); - INCREMENT_ARG_LIST (arg_types); - - - /* - * Handle cases where the object does not need to be - * resolved to a value - */ - - switch (this_arg_type) { - - case ARGI_REFERENCE: /* References */ - case ARGI_INTEGER_REF: - case ARGI_OBJECT_REF: - case ARGI_DEVICE_REF: - case ARGI_TARGETREF: /* TBD: must implement implicit conversion rules before store */ - case ARGI_FIXED_TARGET: /* No implicit conversion before store to target */ - case ARGI_SIMPLE_TARGET: /* Name, Local, or Arg - no implicit conversion */ - - /* Need an operand of type INTERNAL_TYPE_REFERENCE */ - - if (VALID_DESCRIPTOR_TYPE (obj_desc, ACPI_DESC_TYPE_NAMED)) /* direct name ptr OK as-is */ { - goto next_operand; - } - - status = acpi_aml_check_object_type (INTERNAL_TYPE_REFERENCE, - object_type, obj_desc); - if (ACPI_FAILURE (status)) { - return (status); - } - - - if (AML_NAME_OP == obj_desc->reference.opcode) { - /* - * Convert an indirect name ptr to direct name ptr and put - * it on the stack - */ - - temp_handle = obj_desc->reference.object; - acpi_cm_remove_reference (obj_desc); - (*stack_ptr) = temp_handle; - } - - goto next_operand; - break; - - - case ARGI_ANYTYPE: - - /* - * We don't want to resolve Index_op reference objects during - * a store because this would be an implicit De_ref_of operation. - * Instead, we just want to store the reference object. - * -- All others must be resolved below. - */ - - if ((opcode == AML_STORE_OP) && - ((*stack_ptr)->common.type == INTERNAL_TYPE_REFERENCE) && - ((*stack_ptr)->reference.opcode == AML_INDEX_OP)) { - goto next_operand; - } - break; - } - - - /* - * Resolve this object to a value - */ - - status = acpi_aml_resolve_to_value (stack_ptr, walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - - - /* - * Check the resulting object (value) type - */ - switch (this_arg_type) { - /* - * For the simple cases, only one type of resolved object - * is allowed - */ - case ARGI_MUTEX: - - /* Need an operand of type ACPI_TYPE_MUTEX */ - - type_needed = ACPI_TYPE_MUTEX; - break; - - case ARGI_EVENT: - - /* Need an operand of type ACPI_TYPE_EVENT */ - - type_needed = ACPI_TYPE_EVENT; - break; - - case ARGI_REGION: - - /* Need an operand of type ACPI_TYPE_REGION */ - - type_needed = ACPI_TYPE_REGION; - break; - - case ARGI_IF: /* If */ - - /* Need an operand of type INTERNAL_TYPE_IF */ - - type_needed = INTERNAL_TYPE_IF; - break; - - case ARGI_PACKAGE: /* Package */ - - /* Need an operand of type ACPI_TYPE_PACKAGE */ - - type_needed = ACPI_TYPE_PACKAGE; - break; - - case ARGI_ANYTYPE: - - /* Any operand type will do */ - - type_needed = ACPI_TYPE_ANY; - break; - - - /* - * The more complex cases allow multiple resolved object types - */ - - case ARGI_INTEGER: /* Number */ - - /* - * Need an operand of type ACPI_TYPE_INTEGER, - * But we can implicitly convert from a STRING or BUFFER - */ - status = acpi_aml_convert_to_integer (stack_ptr, walk_state); - if (ACPI_FAILURE (status)) { - if (status == AE_TYPE) { - return (AE_AML_OPERAND_TYPE); - } - - return (status); - } - - goto next_operand; - break; - - - case ARGI_BUFFER: - - /* - * Need an operand of type ACPI_TYPE_BUFFER, - * But we can implicitly convert from a STRING or INTEGER - */ - status = acpi_aml_convert_to_buffer (stack_ptr, walk_state); - if (ACPI_FAILURE (status)) { - if (status == AE_TYPE) { - return (AE_AML_OPERAND_TYPE); - } - - return (status); - } - - goto next_operand; - break; - - - case ARGI_STRING: - - /* - * Need an operand of type ACPI_TYPE_STRING, - * But we can implicitly convert from a BUFFER or INTEGER - */ - status = acpi_aml_convert_to_string (stack_ptr, walk_state); - if (ACPI_FAILURE (status)) { - if (status == AE_TYPE) { - return (AE_AML_OPERAND_TYPE); - } - - return (status); - } - - goto next_operand; - break; - - - case ARGI_COMPUTEDATA: - - /* Need an operand of type INTEGER, STRING or BUFFER */ - - if ((ACPI_TYPE_INTEGER != (*stack_ptr)->common.type) && - (ACPI_TYPE_STRING != (*stack_ptr)->common.type) && - (ACPI_TYPE_BUFFER != (*stack_ptr)->common.type)) { - return (AE_AML_OPERAND_TYPE); - } - goto next_operand; - break; - - - case ARGI_DATAOBJECT: - /* - * ARGI_DATAOBJECT is only used by the Size_of operator. - * - * The ACPI specification allows Size_of to return the size of - * a Buffer, String or Package. However, the MS ACPI.SYS AML - * Interpreter also allows an Node reference to return without - * error with a size of 4. - */ - - /* Need a buffer, string, package or Node reference */ - - if (((*stack_ptr)->common.type != ACPI_TYPE_BUFFER) && - ((*stack_ptr)->common.type != ACPI_TYPE_STRING) && - ((*stack_ptr)->common.type != ACPI_TYPE_PACKAGE) && - ((*stack_ptr)->common.type != INTERNAL_TYPE_REFERENCE)) { - return (AE_AML_OPERAND_TYPE); - } - - /* - * If this is a reference, only allow a reference to an Node. - */ - if ((*stack_ptr)->common.type == INTERNAL_TYPE_REFERENCE) { - if (!(*stack_ptr)->reference.node) { - return (AE_AML_OPERAND_TYPE); - } - } - goto next_operand; - break; - - - case ARGI_COMPLEXOBJ: - - /* Need a buffer or package */ - - if (((*stack_ptr)->common.type != ACPI_TYPE_BUFFER) && - ((*stack_ptr)->common.type != ACPI_TYPE_PACKAGE)) { - return (AE_AML_OPERAND_TYPE); - } - goto next_operand; - break; - - - default: - - /* Unknown type */ - - return (AE_BAD_PARAMETER); - } - - - /* - * Make sure that the original object was resolved to the - * required object type (Simple cases only). - */ - status = acpi_aml_check_object_type (type_needed, - (*stack_ptr)->common.type, *stack_ptr); - if (ACPI_FAILURE (status)) { - return (status); - } - - -next_operand: - /* - * If more operands needed, decrement Stack_ptr to point - * to next operand on stack - */ - if (GET_CURRENT_ARG_TYPE (arg_types)) { - stack_ptr--; - } - - } /* while (*Types) */ - - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/executer/amstore.c b/reactos/drivers/bus/acpi/executer/amstore.c deleted file mode 100644 index 136373a0c63..00000000000 --- a/reactos/drivers/bus/acpi/executer/amstore.c +++ /dev/null @@ -1,563 +0,0 @@ - -/****************************************************************************** - * - * Module Name: amstore - AML Interpreter object store support - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amstore") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_exec_store - * - * PARAMETERS: *Val_desc - Value to be stored - * *Dest_desc - Where to store it 0 Must be (ACPI_HANDLE) - * or an ACPI_OPERAND_OBJECT of type - * Reference; if the latter the descriptor - * will be either reused or deleted. - * - * RETURN: Status - * - * DESCRIPTION: Store the value described by Val_desc into the location - * described by Dest_desc. Called by various interpreter - * functions to store the result of an operation into - * the destination operand. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_exec_store ( - ACPI_OPERAND_OBJECT *val_desc, - ACPI_OPERAND_OBJECT *dest_desc, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status = AE_OK; - ACPI_OPERAND_OBJECT *ref_desc = dest_desc; - - - /* Validate parameters */ - - if (!val_desc || !dest_desc) { - return (AE_AML_NO_OPERAND); - } - - /* Dest_desc can be either a namespace node or an ACPI object */ - - if (VALID_DESCRIPTOR_TYPE (dest_desc, ACPI_DESC_TYPE_NAMED)) { - /* - * Dest is a namespace node, - * Storing an object into a Name "container" - */ - status = acpi_aml_store_object_to_node (val_desc, - (ACPI_NAMESPACE_NODE *) dest_desc, walk_state); - - /* All done, that's it */ - - return (status); - } - - - /* Destination object must be an object of type Reference */ - - if (dest_desc->common.type != INTERNAL_TYPE_REFERENCE) { - /* Destination is not an Reference */ - - return (AE_AML_OPERAND_TYPE); - } - - - /* - * Examine the Reference opcode. These cases are handled: - * - * 1) Store to Name (Change the object associated with a name) - * 2) Store to an indexed area of a Buffer or Package - * 3) Store to a Method Local or Arg - * 4) Store to the debug object - * 5) Store to a constant -- a noop - */ - - switch (ref_desc->reference.opcode) { - - case AML_NAME_OP: - - /* Storing an object into a Name "container" */ - - status = acpi_aml_store_object_to_node (val_desc, ref_desc->reference.object, - walk_state); - break; - - - case AML_INDEX_OP: - - /* Storing to an Index (pointer into a packager or buffer) */ - - status = acpi_aml_store_object_to_index (val_desc, ref_desc, walk_state); - break; - - - case AML_LOCAL_OP: - case AML_ARG_OP: - - /* Store to a method local/arg */ - - status = acpi_ds_store_object_to_local (ref_desc->reference.opcode, - ref_desc->reference.offset, val_desc, walk_state); - break; - - - case AML_DEBUG_OP: - - /* - * Storing to the Debug object causes the value stored to be - * displayed and otherwise has no effect -- see ACPI Specification - * - * TBD: print known object types "prettier". - */ - - break; - - - case AML_ZERO_OP: - case AML_ONE_OP: - case AML_ONES_OP: - - /* - * Storing to a constant is a no-op -- see ACPI Specification - * Delete the reference descriptor, however - */ - break; - - - default: - - /* TBD: [Restructure] use object dump routine !! */ - - status = AE_AML_INTERNAL; - break; - - } /* switch (Ref_desc->Reference.Opcode) */ - - - /* Always delete the reference descriptor object */ - - if (ref_desc) { - acpi_cm_remove_reference (ref_desc); - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_store_object_to_index - * - * PARAMETERS: *Val_desc - Value to be stored - * *Node - Named object to receive the value - * - * RETURN: Status - * - * DESCRIPTION: Store the object to the named object. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_store_object_to_index ( - ACPI_OPERAND_OBJECT *val_desc, - ACPI_OPERAND_OBJECT *dest_desc, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status = AE_OK; - ACPI_OPERAND_OBJECT *obj_desc; - u32 length; - u32 i; - u8 value = 0; - - - /* - * Destination must be a reference pointer, and - * must point to either a buffer or a package - */ - - switch (dest_desc->reference.target_type) { - case ACPI_TYPE_PACKAGE: - /* - * Storing to a package element is not simple. The source must be - * evaluated and converted to the type of the destination and then the - * source is copied into the destination - we can't just point to the - * source object. - */ - if (dest_desc->reference.target_type == ACPI_TYPE_PACKAGE) { - /* - * The object at *(Dest_desc->Reference.Where) is the - * element within the package that is to be modified. - */ - obj_desc = *(dest_desc->reference.where); - if (obj_desc) { - /* - * If the Destination element is a package, we will delete - * that object and construct a new one. - * - * TBD: [Investigate] Should both the src and dest be required - * to be packages? - * && (Val_desc->Common.Type == ACPI_TYPE_PACKAGE) - */ - if (obj_desc->common.type == ACPI_TYPE_PACKAGE) { - /* - * Take away the reference for being part of a package and - * delete - */ - acpi_cm_remove_reference (obj_desc); - acpi_cm_remove_reference (obj_desc); - - obj_desc = NULL; - } - } - - if (!obj_desc) { - /* - * If the Obj_desc is NULL, it means that an uninitialized package - * element has been used as a destination (this is OK), therefore, - * we must create the destination element to match the type of the - * source element NOTE: Val_desc can be of any type. - */ - obj_desc = acpi_cm_create_internal_object (val_desc->common.type); - if (!obj_desc) { - return (AE_NO_MEMORY); - } - - /* - * If the source is a package, copy the source to the new dest - */ - if (ACPI_TYPE_PACKAGE == obj_desc->common.type) { - status = acpi_cm_copy_ipackage_to_ipackage (val_desc, obj_desc, walk_state); - if (ACPI_FAILURE (status)) { - acpi_cm_remove_reference (obj_desc); - return (status); - } - } - - /* - * Install the new descriptor into the package and add a - * reference to the newly created descriptor for now being - * part of the parent package - */ - - *(dest_desc->reference.where) = obj_desc; - acpi_cm_add_reference (obj_desc); - } - - if (ACPI_TYPE_PACKAGE != obj_desc->common.type) { - /* - * The destination element is not a package, so we need to - * convert the contents of the source (Val_desc) and copy into - * the destination (Obj_desc) - */ - status = acpi_aml_store_object_to_object (val_desc, obj_desc, - walk_state); - if (ACPI_FAILURE (status)) { - /* - * An error occurrered when copying the internal object - * so delete the reference. - */ - return (AE_AML_OPERAND_TYPE); - } - } - } - break; - - - case ACPI_TYPE_BUFFER_FIELD: - /* - * Storing into a buffer at a location defined by an Index. - * - * Each 8-bit element of the source object is written to the - * 8-bit Buffer Field of the Index destination object. - */ - - /* - * Set the Obj_desc to the destination object and type check. - */ - obj_desc = dest_desc->reference.object; - if (obj_desc->common.type != ACPI_TYPE_BUFFER) { - return (AE_AML_OPERAND_TYPE); - } - - /* - * The assignment of the individual elements will be slightly - * different for each source type. - */ - - switch (val_desc->common.type) { - /* - * If the type is Integer, assign bytewise - * This loop to assign each of the elements is somewhat - * backward because of the Big Endian-ness of IA-64 - */ - case ACPI_TYPE_INTEGER: - length = sizeof (ACPI_INTEGER); - for (i = length; i != 0; i--) { - value = (u8)(val_desc->integer.value >> (MUL_8 (i - 1))); - obj_desc->buffer.pointer[dest_desc->reference.offset] = value; - } - break; - - /* - * If the type is Buffer, the Length is in the structure. - * Just loop through the elements and assign each one in turn. - */ - case ACPI_TYPE_BUFFER: - length = val_desc->buffer.length; - for (i = 0; i < length; i++) { - value = *(val_desc->buffer.pointer + i); - obj_desc->buffer.pointer[dest_desc->reference.offset] = value; - } - break; - - /* - * If the type is String, the Length is in the structure. - * Just loop through the elements and assign each one in turn. - */ - case ACPI_TYPE_STRING: - length = val_desc->string.length; - for (i = 0; i < length; i++) { - value = *(val_desc->string.pointer + i); - obj_desc->buffer.pointer[dest_desc->reference.offset] = value; - } - break; - - /* - * If source is not a valid type so return an error. - */ - default: - status = AE_AML_OPERAND_TYPE; - break; - } - break; - - - default: - status = AE_AML_OPERAND_TYPE; - break; - } - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_store_object_to_node - * - * PARAMETERS: *Source_desc - Value to be stored - * *Node - Named object to receive the value - * - * RETURN: Status - * - * DESCRIPTION: Store the object to the named object. - * - * The Assignment of an object to a named object is handled here - * The val passed in will replace the current value (if any) - * with the input value. - * - * When storing into an object the data is converted to the - * target object type then stored in the object. This means - * that the target object type (for an initialized target) will - * not be changed by a store operation. - * - * NOTE: the global lock is acquired early. This will result - * in the global lock being held a bit longer. Also, if the - * function fails during set up we may get the lock when we - * don't really need it. I don't think we care. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_store_object_to_node ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_NAMESPACE_NODE *node, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status = AE_OK; - ACPI_OPERAND_OBJECT *target_desc; - OBJECT_TYPE_INTERNAL target_type = ACPI_TYPE_ANY; - - - /* - * Assuming the parameters were already validated - */ - ACPI_ASSERT((node) && (source_desc)); - - - /* - * Get current type of the node, and object attached to Node - */ - target_type = acpi_ns_get_type (node); - target_desc = acpi_ns_get_attached_object (node); - - - /* - * Resolve the source object to an actual value - * (If it is a reference object) - */ - status = acpi_aml_resolve_object (&source_desc, target_type, walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - - - /* - * Do the actual store operation - */ - switch (target_type) { - case INTERNAL_TYPE_DEF_FIELD: - - /* Raw data copy for target types Integer/String/Buffer */ - - status = acpi_aml_copy_data_to_named_field (source_desc, node); - break; - - - case ACPI_TYPE_INTEGER: - case ACPI_TYPE_STRING: - case ACPI_TYPE_BUFFER: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: - case ACPI_TYPE_FIELD_UNIT: - - /* - * These target types are all of type Integer/String/Buffer, and - * therefore support implicit conversion before the store. - * - * Copy and/or convert the source object to a new target object - */ - status = acpi_aml_store_object (source_desc, target_type, &target_desc, walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * Store the new Target_desc as the new value of the Name, and set - * the Name's type to that of the value being stored in it. - * Source_desc reference count is incremented by Attach_object. - */ - status = acpi_ns_attach_object (node, target_desc, target_type); - break; - - - default: - - /* No conversions for all other types. Just attach the source object */ - - status = acpi_ns_attach_object (node, source_desc, source_desc->common.type); - - break; - } - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_store_object_to_object - * - * PARAMETERS: *Source_desc - Value to be stored - * *Dest_desc - Object to receive the value - * - * RETURN: Status - * - * DESCRIPTION: Store an object to another object. - * - * The Assignment of an object to another (not named) object - * is handled here. - * The val passed in will replace the current value (if any) - * with the input value. - * - * When storing into an object the data is converted to the - * target object type then stored in the object. This means - * that the target object type (for an initialized target) will - * not be changed by a store operation. - * - * This module allows destination types of Number, String, - * and Buffer. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_store_object_to_object ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_OPERAND_OBJECT *dest_desc, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status = AE_OK; - OBJECT_TYPE_INTERNAL destination_type = dest_desc->common.type; - - - /* - * Assuming the parameters are valid! - */ - ACPI_ASSERT((dest_desc) && (source_desc)); - - - /* - * From this interface, we only support Integers/Strings/Buffers - */ - switch (destination_type) { - case ACPI_TYPE_INTEGER: - case ACPI_TYPE_STRING: - case ACPI_TYPE_BUFFER: - break; - - default: - return (AE_NOT_IMPLEMENTED); - } - - - /* - * Resolve the source object to an actual value - * (If it is a reference object) - */ - status = acpi_aml_resolve_object (&source_desc, destination_type, walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - - - /* - * Copy and/or convert the source object to the destination object - */ - status = acpi_aml_store_object (source_desc, destination_type, &dest_desc, walk_state); - - - return (status); -} - diff --git a/reactos/drivers/bus/acpi/executer/amstoren.c b/reactos/drivers/bus/acpi/executer/amstoren.c deleted file mode 100644 index aacf99e24f4..00000000000 --- a/reactos/drivers/bus/acpi/executer/amstoren.c +++ /dev/null @@ -1,252 +0,0 @@ - -/****************************************************************************** - * - * Module Name: amstoren - AML Interpreter object store support, - * Store to Node (namespace object) - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amstoren") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_resolve_object - * - * PARAMETERS: Source_desc_ptr - Pointer to the source object - * Target_type - Current type of the target - * Walk_state - Current walk state - * - * RETURN: Status, resolved object in Source_desc_ptr. - * - * DESCRIPTION: Resolve an object. If the object is a reference, dereference - * it and return the actual object in the Source_desc_ptr. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_resolve_object ( - ACPI_OPERAND_OBJECT **source_desc_ptr, - OBJECT_TYPE_INTERNAL target_type, - ACPI_WALK_STATE *walk_state) -{ - ACPI_OPERAND_OBJECT *source_desc = *source_desc_ptr; - ACPI_STATUS status = AE_OK; - - - /* - * Ensure we have a Source that can be stored in the target - */ - switch (target_type) { - - /* This case handles the "interchangeable" types Integer, String, and Buffer. */ - - /* - * These cases all require only Integers or values that - * can be converted to Integers (Strings or Buffers) - */ - case ACPI_TYPE_INTEGER: - case ACPI_TYPE_FIELD_UNIT: - case INTERNAL_TYPE_BANK_FIELD: - case INTERNAL_TYPE_INDEX_FIELD: - - /* - * Stores into a Field/Region or into a Buffer/String - * are all essentially the same. - */ - case ACPI_TYPE_STRING: - case ACPI_TYPE_BUFFER: - case INTERNAL_TYPE_DEF_FIELD: - - /* - * If Source_desc is not a valid type, try to resolve it to one. - */ - if ((source_desc->common.type != ACPI_TYPE_INTEGER) && - (source_desc->common.type != ACPI_TYPE_BUFFER) && - (source_desc->common.type != ACPI_TYPE_STRING)) { - /* - * Initially not a valid type, convert - */ - status = acpi_aml_resolve_to_value (source_desc_ptr, walk_state); - if (ACPI_SUCCESS (status) && - (source_desc->common.type != ACPI_TYPE_INTEGER) && - (source_desc->common.type != ACPI_TYPE_BUFFER) && - (source_desc->common.type != ACPI_TYPE_STRING)) { - /* - * Conversion successful but still not a valid type - */ - status = AE_AML_OPERAND_TYPE; - } - } - break; - - - case INTERNAL_TYPE_ALIAS: - - /* - * Aliases are resolved by Acpi_aml_prep_operands - */ - status = AE_AML_INTERNAL; - break; - - - case ACPI_TYPE_PACKAGE: - default: - - /* - * All other types than Alias and the various Fields come here, - * including the untyped case - ACPI_TYPE_ANY. - */ - break; - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_store_object - * - * PARAMETERS: Source_desc - Object to store - * Target_type - Current type of the target - * Target_desc_ptr - Pointer to the target - * Walk_state - Current walk state - * - * RETURN: Status - * - * DESCRIPTION: "Store" an object to another object. This may include - * converting the source type to the target type (implicit - * conversion), and a copy of the value of the source to - * the target. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_store_object ( - ACPI_OPERAND_OBJECT *source_desc, - OBJECT_TYPE_INTERNAL target_type, - ACPI_OPERAND_OBJECT **target_desc_ptr, - ACPI_WALK_STATE *walk_state) -{ - ACPI_OPERAND_OBJECT *target_desc = *target_desc_ptr; - ACPI_STATUS status = AE_OK; - - - /* - * Perform the "implicit conversion" of the source to the current type - * of the target - As per the ACPI specification. - * - * If no conversion performed, Source_desc is left alone, otherwise it - * is updated with a new object. - */ - status = acpi_aml_convert_to_target_type (target_type, &source_desc, walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * We now have two objects of identical types, and we can perform a - * copy of the *value* of the source object. - */ - switch (target_type) { - case ACPI_TYPE_ANY: - case INTERNAL_TYPE_DEF_ANY: - - /* - * The target namespace node is uninitialized (has no target object), - * and will take on the type of the source object - */ - - *target_desc_ptr = source_desc; - break; - - - case ACPI_TYPE_INTEGER: - - target_desc->integer.value = source_desc->integer.value; - - /* Truncate value if we are executing from a 32-bit ACPI table */ - - acpi_aml_truncate_for32bit_table (target_desc, walk_state); - break; - - - case ACPI_TYPE_FIELD_UNIT: - - status = acpi_aml_copy_integer_to_field_unit (source_desc, target_desc); - break; - - - case INTERNAL_TYPE_BANK_FIELD: - - status = acpi_aml_copy_integer_to_bank_field (source_desc, target_desc); - break; - - - case INTERNAL_TYPE_INDEX_FIELD: - - status = acpi_aml_copy_integer_to_index_field (source_desc, target_desc); - break; - - - case ACPI_TYPE_STRING: - - status = acpi_aml_copy_string_to_string (source_desc, target_desc); - break; - - - case ACPI_TYPE_BUFFER: - - status = acpi_aml_copy_buffer_to_buffer (source_desc, target_desc); - break; - - - case ACPI_TYPE_PACKAGE: - - /* - * TBD: [Unhandled] Not real sure what to do here - */ - status = AE_NOT_IMPLEMENTED; - break; - - - default: - - /* - * All other types come here. - */ - status = AE_NOT_IMPLEMENTED; - break; - } - - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/executer/amstorob.c b/reactos/drivers/bus/acpi/executer/amstorob.c deleted file mode 100644 index a0d25c731e4..00000000000 --- a/reactos/drivers/bus/acpi/executer/amstorob.c +++ /dev/null @@ -1,427 +0,0 @@ - -/****************************************************************************** - * - * Module Name: amstorob - AML Interpreter object store support, store to object - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amstorob") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_copy_buffer_to_buffer - * - * PARAMETERS: Source_desc - Source object to copy - * Target_desc - Destination object of the copy - * - * RETURN: Status - * - * DESCRIPTION: Copy a buffer object to another buffer object. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_copy_buffer_to_buffer ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_OPERAND_OBJECT *target_desc) -{ - u32 length; - u8 *buffer; - - - /* - * We know that Source_desc is a buffer by now - */ - buffer = (u8 *) source_desc->buffer.pointer; - length = source_desc->buffer.length; - - /* - * If target is a buffer of length zero, allocate a new - * buffer of the proper length - */ - if (target_desc->buffer.length == 0) { - target_desc->buffer.pointer = acpi_cm_allocate (length); - if (!target_desc->buffer.pointer) { - return (AE_NO_MEMORY); - } - - target_desc->buffer.length = length; - } - - /* - * Buffer is a static allocation, - * only place what will fit in the buffer. - */ - if (length <= target_desc->buffer.length) { - /* Clear existing buffer and copy in the new one */ - - MEMSET(target_desc->buffer.pointer, 0, target_desc->buffer.length); - MEMCPY(target_desc->buffer.pointer, buffer, length); - } - - else { - /* - * Truncate the source, copy only what will fit - */ - MEMCPY(target_desc->buffer.pointer, buffer, target_desc->buffer.length); - - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_copy_string_to_string - * - * PARAMETERS: Source_desc - Source object to copy - * Target_desc - Destination object of the copy - * - * RETURN: Status - * - * DESCRIPTION: Copy a String object to another String object - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_copy_string_to_string ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_OPERAND_OBJECT *target_desc) -{ - u32 length; - u8 *buffer; - - - /* - * We know that Source_desc is a string by now. - */ - buffer = (u8 *) source_desc->string.pointer; - length = source_desc->string.length; - - /* - * Setting a string value replaces the old string - */ - if (length < target_desc->string.length) { - /* Clear old string and copy in the new one */ - - MEMSET(target_desc->string.pointer, 0, target_desc->string.length); - MEMCPY(target_desc->string.pointer, buffer, length); - } - - else { - /* - * Free the current buffer, then allocate a buffer - * large enough to hold the value - */ - if (target_desc->string.pointer && - !acpi_tb_system_table_pointer (target_desc->string.pointer)) { - /* - * Only free if not a pointer into the DSDT - */ - acpi_cm_free(target_desc->string.pointer); - } - - target_desc->string.pointer = acpi_cm_allocate (length + 1); - if (!target_desc->string.pointer) { - return (AE_NO_MEMORY); - } - target_desc->string.length = length; - - - MEMCPY(target_desc->string.pointer, buffer, length); - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_copy_integer_to_index_field - * - * PARAMETERS: Source_desc - Source object to copy - * Target_desc - Destination object of the copy - * - * RETURN: Status - * - * DESCRIPTION: Write an Integer to an Index Field - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_copy_integer_to_index_field ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_OPERAND_OBJECT *target_desc) -{ - ACPI_STATUS status; - u8 locked; - - - /* - * Get the global lock if needed - */ - locked = acpi_aml_acquire_global_lock (target_desc->index_field.lock_rule); - - /* - * Set Index value to select proper Data register - * perform the update (Set index) - */ - status = acpi_aml_access_named_field (ACPI_WRITE, - target_desc->index_field.index, - &target_desc->index_field.value, - sizeof (target_desc->index_field.value)); - if (ACPI_SUCCESS (status)) { - /* Set_index was successful, next set Data value */ - - status = acpi_aml_access_named_field (ACPI_WRITE, - target_desc->index_field.data, - &source_desc->integer.value, - sizeof (source_desc->integer.value)); - - } - - - - /* - * Release global lock if we acquired it earlier - */ - acpi_aml_release_global_lock (locked); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_copy_integer_to_bank_field - * - * PARAMETERS: Source_desc - Source object to copy - * Target_desc - Destination object of the copy - * - * RETURN: Status - * - * DESCRIPTION: Write an Integer to a Bank Field - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_copy_integer_to_bank_field ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_OPERAND_OBJECT *target_desc) -{ - ACPI_STATUS status; - u8 locked; - - - /* - * Get the global lock if needed - */ - locked = acpi_aml_acquire_global_lock (target_desc->index_field.lock_rule); - - - /* - * Set Bank value to select proper Bank - * Perform the update (Set Bank Select) - */ - - status = acpi_aml_access_named_field (ACPI_WRITE, - target_desc->bank_field.bank_select, - &target_desc->bank_field.value, - sizeof (target_desc->bank_field.value)); - if (ACPI_SUCCESS (status)) { - /* Set bank select successful, set data value */ - - status = acpi_aml_access_named_field (ACPI_WRITE, - target_desc->bank_field.bank_select, - &source_desc->bank_field.value, - sizeof (source_desc->bank_field.value)); - } - - - - /* - * Release global lock if we acquired it earlier - */ - acpi_aml_release_global_lock (locked); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_copy_data_to_named_field - * - * PARAMETERS: Source_desc - Source object to copy - * Node - Destination Namespace node - * - * RETURN: Status - * - * DESCRIPTION: Copy raw data to a Named Field. No implicit conversion - * is performed on the source object - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_copy_data_to_named_field ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_NAMESPACE_NODE *node) -{ - ACPI_STATUS status; - u8 locked; - u32 length; - u8 *buffer; - - - /* - * Named fields (Create_xxx_field) - We don't perform any conversions on the - * source operand, just use the raw data - */ - switch (source_desc->common.type) { - case ACPI_TYPE_INTEGER: - buffer = (u8 *) &source_desc->integer.value; - length = sizeof (source_desc->integer.value); - break; - - case ACPI_TYPE_BUFFER: - buffer = (u8 *) source_desc->buffer.pointer; - length = source_desc->buffer.length; - break; - - case ACPI_TYPE_STRING: - buffer = (u8 *) source_desc->string.pointer; - length = source_desc->string.length; - break; - - default: - return (AE_TYPE); - } - - /* - * Get the global lock if needed before the update - * TBD: not needed! - */ - locked = acpi_aml_acquire_global_lock (source_desc->field.lock_rule); - - status = acpi_aml_access_named_field (ACPI_WRITE, - node, buffer, length); - - acpi_aml_release_global_lock (locked); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_copy_integer_to_field_unit - * - * PARAMETERS: Source_desc - Source object to copy - * Target_desc - Destination object of the copy - * - * RETURN: Status - * - * DESCRIPTION: Write an Integer to a Field Unit. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_copy_integer_to_field_unit ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_OPERAND_OBJECT *target_desc) -{ - ACPI_STATUS status = AE_OK; - u8 *location = NULL; - u32 mask; - u32 new_value; - u8 locked = FALSE; - - - /* - * If the Field Buffer and Index have not been previously evaluated, - * evaluate them and save the results. - */ - if (!(target_desc->common.flags & AOPOBJ_DATA_VALID)) { - status = acpi_ds_get_field_unit_arguments (target_desc); - if (ACPI_FAILURE (status)) { - return (status); - } - } - - if ((!target_desc->field_unit.container || - ACPI_TYPE_BUFFER != target_desc->field_unit.container->common.type)) { - return (AE_AML_INTERNAL); - } - - /* - * Get the global lock if needed - */ - locked = acpi_aml_acquire_global_lock (target_desc->field_unit.lock_rule); - - /* - * TBD: [Unhandled] REMOVE this limitation - * Make sure the operation is within the limits of our implementation - * this is not a Spec limitation!! - */ - if (target_desc->field_unit.length + target_desc->field_unit.bit_offset > 32) { - return (AE_NOT_IMPLEMENTED); - } - - /* Field location is (base of buffer) + (byte offset) */ - - location = target_desc->field_unit.container->buffer.pointer - + target_desc->field_unit.offset; - - /* - * Construct Mask with 1 bits where the field is, - * 0 bits elsewhere - */ - mask = ((u32) 1 << target_desc->field_unit.length) - ((u32)1 - << target_desc->field_unit.bit_offset); - - /* Zero out the field in the buffer */ - - MOVE_UNALIGNED32_TO_32 (&new_value, location); - new_value &= ~mask; - - /* - * Shift and mask the new value into position, - * and or it into the buffer. - */ - new_value |= (source_desc->integer.value << target_desc->field_unit.bit_offset) & - mask; - - /* Store back the value */ - - MOVE_UNALIGNED32_TO_32 (location, &new_value); - - return (AE_OK); -} - - diff --git a/reactos/drivers/bus/acpi/executer/amsystem.c b/reactos/drivers/bus/acpi/executer/amsystem.c deleted file mode 100644 index aff86885139..00000000000 --- a/reactos/drivers/bus/acpi/executer/amsystem.c +++ /dev/null @@ -1,323 +0,0 @@ - -/****************************************************************************** - * - * Module Name: amsystem - Interface to OS services - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amsystem") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_system_wait_semaphore - * - * PARAMETERS: Semaphore - OSD semaphore to wait on - * Timeout - Max time to wait - * - * RETURN: Status - * - * DESCRIPTION: Implements a semaphore wait with a check to see if the - * semaphore is available immediately. If it is not, the - * interpreter is released. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_system_wait_semaphore ( - ACPI_HANDLE semaphore, - u32 timeout) -{ - ACPI_STATUS status; - - - status = acpi_os_wait_semaphore (semaphore, 1, 0); - if (ACPI_SUCCESS (status)) { - return (status); - } - - if (status == AE_TIME) { - /* We must wait, so unlock the interpreter */ - - acpi_aml_exit_interpreter (); - - status = acpi_os_wait_semaphore (semaphore, 1, timeout); - - /* Reacquire the interpreter */ - - status = acpi_aml_enter_interpreter (); - if (ACPI_SUCCESS (status)) { - /* Restore the timeout exception */ - - status = AE_TIME; - } - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_system_do_stall - * - * PARAMETERS: How_long - The amount of time to stall - * - * RETURN: None - * - * DESCRIPTION: Suspend running thread for specified amount of time. - * - ******************************************************************************/ - -void -acpi_aml_system_do_stall ( - u32 how_long) -{ - - if (how_long > 1000) /* 1 millisecond */ { - /* Since this thread will sleep, we must release the interpreter */ - - acpi_aml_exit_interpreter (); - - acpi_os_sleep_usec (how_long); - - /* And now we must get the interpreter again */ - - acpi_aml_enter_interpreter (); - } - - else { - acpi_os_sleep_usec (how_long); - } -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_system_do_suspend - * - * PARAMETERS: How_long - The amount of time to suspend - * - * RETURN: None - * - * DESCRIPTION: Suspend running thread for specified amount of time. - * - ******************************************************************************/ - -void -acpi_aml_system_do_suspend ( - u32 how_long) -{ - /* Since this thread will sleep, we must release the interpreter */ - - acpi_aml_exit_interpreter (); - - acpi_os_sleep ((u16) (how_long / (u32) 1000), - (u16) (how_long % (u32) 1000)); - - /* And now we must get the interpreter again */ - - acpi_aml_enter_interpreter (); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_system_acquire_mutex - * - * PARAMETERS: *Time_desc - The 'time to delay' object descriptor - * *Obj_desc - The object descriptor for this op - * - * RETURN: Status - * - * DESCRIPTION: Provides an access point to perform synchronization operations - * within the AML. This function will cause a lock to be generated - * for the Mutex pointed to by Obj_desc. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_system_acquire_mutex ( - ACPI_OPERAND_OBJECT *time_desc, - ACPI_OPERAND_OBJECT *obj_desc) -{ - ACPI_STATUS status = AE_OK; - - - if (!obj_desc) { - return (AE_BAD_PARAMETER); - } - - /* - * Support for the _GL_ Mutex object -- go get the global lock - */ - - if (obj_desc->mutex.semaphore == acpi_gbl_global_lock_semaphore) { - status = acpi_ev_acquire_global_lock (); - return (status); - } - - status = acpi_aml_system_wait_semaphore (obj_desc->mutex.semaphore, - (u32) time_desc->integer.value); - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_system_release_mutex - * - * PARAMETERS: *Obj_desc - The object descriptor for this op - * - * RETURN: Status - * - * DESCRIPTION: Provides an access point to perform synchronization operations - * within the AML. This operation is a request to release a - * previously acquired Mutex. If the Mutex variable is set then - * it will be decremented. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_system_release_mutex ( - ACPI_OPERAND_OBJECT *obj_desc) -{ - ACPI_STATUS status = AE_OK; - - - if (!obj_desc) { - return (AE_BAD_PARAMETER); - } - - /* - * Support for the _GL_ Mutex object -- release the global lock - */ - if (obj_desc->mutex.semaphore == acpi_gbl_global_lock_semaphore) { - acpi_ev_release_global_lock (); - return (AE_OK); - } - - status = acpi_os_signal_semaphore (obj_desc->mutex.semaphore, 1); - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_system_signal_event - * - * PARAMETERS: *Obj_desc - The object descriptor for this op - * - * RETURN: AE_OK - * - * DESCRIPTION: Provides an access point to perform synchronization operations - * within the AML. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_system_signal_event ( - ACPI_OPERAND_OBJECT *obj_desc) -{ - ACPI_STATUS status = AE_OK; - - - if (obj_desc) { - status = acpi_os_signal_semaphore (obj_desc->event.semaphore, 1); - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_system_wait_event - * - * PARAMETERS: *Time_desc - The 'time to delay' object descriptor - * *Obj_desc - The object descriptor for this op - * - * RETURN: Status - * - * DESCRIPTION: Provides an access point to perform synchronization operations - * within the AML. This operation is a request to wait for an - * event. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_system_wait_event ( - ACPI_OPERAND_OBJECT *time_desc, - ACPI_OPERAND_OBJECT *obj_desc) -{ - ACPI_STATUS status = AE_OK; - - - if (obj_desc) { - status = acpi_aml_system_wait_semaphore (obj_desc->event.semaphore, - (u32) time_desc->integer.value); - } - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_system_reset_event - * - * PARAMETERS: *Obj_desc - The object descriptor for this op - * - * RETURN: Status - * - * DESCRIPTION: Reset an event to a known state. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_system_reset_event ( - ACPI_OPERAND_OBJECT *obj_desc) -{ - ACPI_STATUS status = AE_OK; - void *temp_semaphore; - - - /* - * We are going to simply delete the existing semaphore and - * create a new one! - */ - - status = acpi_os_create_semaphore (ACPI_NO_UNIT_LIMIT, 0, &temp_semaphore); - if (ACPI_SUCCESS (status)) { - acpi_os_delete_semaphore (obj_desc->event.semaphore); - obj_desc->event.semaphore = temp_semaphore; - } - - return (status); -} - diff --git a/reactos/drivers/bus/acpi/executer/amutils.c b/reactos/drivers/bus/acpi/executer/amutils.c deleted file mode 100644 index 28333f8c1d9..00000000000 --- a/reactos/drivers/bus/acpi/executer/amutils.c +++ /dev/null @@ -1,359 +0,0 @@ - -/****************************************************************************** - * - * Module Name: amutils - interpreter/scanner utilities - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amutils") - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_enter_interpreter - * - * PARAMETERS: None - * - * DESCRIPTION: Enter the interpreter execution region - * TBD: should be a macro - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_enter_interpreter (void) -{ - ACPI_STATUS status; - - - status = acpi_cm_acquire_mutex (ACPI_MTX_EXECUTE); - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_exit_interpreter - * - * PARAMETERS: None - * - * DESCRIPTION: Exit the interpreter execution region - * - * Cases where the interpreter is unlocked: - * 1) Completion of the execution of a control method - * 2) Method blocked on a Sleep() AML opcode - * 3) Method blocked on an Acquire() AML opcode - * 4) Method blocked on a Wait() AML opcode - * 5) Method blocked to acquire the global lock - * 6) Method blocked to execute a serialized control method that is - * already executing - * 7) About to invoke a user-installed opregion handler - * - * TBD: should be a macro - * - ******************************************************************************/ - -void -acpi_aml_exit_interpreter (void) -{ - - acpi_cm_release_mutex (ACPI_MTX_EXECUTE); - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_validate_object_type - * - * PARAMETERS: Type Object type to validate - * - * DESCRIPTION: Determine if a type is a valid ACPI object type - * - ******************************************************************************/ - -u8 -acpi_aml_validate_object_type ( - ACPI_OBJECT_TYPE type) -{ - - if ((type > ACPI_TYPE_MAX && type < INTERNAL_TYPE_BEGIN) || - (type > INTERNAL_TYPE_MAX)) { - return (FALSE); - } - - return (TRUE); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_truncate_for32bit_table - * - * PARAMETERS: Obj_desc - Object to be truncated - * Walk_state - Current walk state - * (A method must be executing) - * - * RETURN: none - * - * DESCRIPTION: Truncate a number to 32-bits if the currently executing method - * belongs to a 32-bit ACPI table. - * - ******************************************************************************/ - -void -acpi_aml_truncate_for32bit_table ( - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_WALK_STATE *walk_state) -{ - - /* - * Object must be a valid number and we must be executing - * a control method - */ - - if ((!obj_desc) || - (obj_desc->common.type != ACPI_TYPE_INTEGER) || - (!walk_state->method_node)) { - return; - } - - if (walk_state->method_node->flags & ANOBJ_DATA_WIDTH_32) { - /* - * We are running a method that exists in a 32-bit ACPI table. - * Truncate the value to 32 bits by zeroing out the upper 32-bit field - */ - obj_desc->integer.value &= (ACPI_INTEGER) ACPI_UINT32_MAX; - } -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_acquire_global_lock - * - * PARAMETERS: Rule - Lock rule: Always_lock, Never_lock - * - * RETURN: TRUE/FALSE indicating whether the lock was actually acquired - * - * DESCRIPTION: Obtain the global lock and keep track of this fact via two - * methods. A global variable keeps the state of the lock, and - * the state is returned to the caller. - * - ******************************************************************************/ - -u8 -acpi_aml_acquire_global_lock ( - u32 rule) -{ - u8 locked = FALSE; - ACPI_STATUS status; - - - /* Only attempt lock if the Rule says so */ - - if (rule == (u32) GLOCK_ALWAYS_LOCK) { - /* We should attempt to get the lock */ - - status = acpi_ev_acquire_global_lock (); - if (ACPI_SUCCESS (status)) { - locked = TRUE; - } - - } - - return (locked); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_release_global_lock - * - * PARAMETERS: Locked_by_me - Return value from corresponding call to - * Acquire_global_lock. - * - * RETURN: Status - * - * DESCRIPTION: Release the global lock if it is locked. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_release_global_lock ( - u8 locked_by_me) -{ - - - /* Only attempt unlock if the caller locked it */ - - if (locked_by_me) { - /* OK, now release the lock */ - - acpi_ev_release_global_lock (); - } - - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_digits_needed - * - * PARAMETERS: val - Value to be represented - * base - Base of representation - * - * RETURN: the number of digits needed to represent val in base - * - ******************************************************************************/ - -u32 -acpi_aml_digits_needed ( - ACPI_INTEGER val, - u32 base) -{ - u32 num_digits = 0; - - - if (base < 1) { - REPORT_ERROR (("Aml_digits_needed: Internal error - Invalid base\n")); - } - - else { - for (num_digits = 1; (val = ACPI_DIVIDE (val,base)); ++num_digits) { ; } - } - - return (num_digits); -} - - -/******************************************************************************* - * - * FUNCTION: ntohl - * - * PARAMETERS: Value - Value to be converted - * - * DESCRIPTION: Convert a 32-bit value to big-endian (swap the bytes) - * - ******************************************************************************/ - -static u32 -_ntohl ( - u32 value) -{ - union { - u32 value; - u8 bytes[4]; - } out; - - union { - u32 value; - u8 bytes[4]; - } in; - - - in.value = value; - - out.bytes[0] = in.bytes[3]; - out.bytes[1] = in.bytes[2]; - out.bytes[2] = in.bytes[1]; - out.bytes[3] = in.bytes[0]; - - return (out.value); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_eisa_id_to_string - * - * PARAMETERS: Numeric_id - EISA ID to be converted - * Out_string - Where to put the converted string (8 bytes) - * - * DESCRIPTION: Convert a numeric EISA ID to string representation - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_eisa_id_to_string ( - u32 numeric_id, - NATIVE_CHAR *out_string) -{ - u32 id; - - /* swap to big-endian to get contiguous bits */ - - id = _ntohl (numeric_id); - - out_string[0] = (char) ('@' + ((id >> 26) & 0x1f)); - out_string[1] = (char) ('@' + ((id >> 21) & 0x1f)); - out_string[2] = (char) ('@' + ((id >> 16) & 0x1f)); - out_string[3] = acpi_gbl_hex_to_ascii[(id >> 12) & 0xf]; - out_string[4] = acpi_gbl_hex_to_ascii[(id >> 8) & 0xf]; - out_string[5] = acpi_gbl_hex_to_ascii[(id >> 4) & 0xf]; - out_string[6] = acpi_gbl_hex_to_ascii[id & 0xf]; - out_string[7] = 0; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_unsigned_integer_to_string - * - * PARAMETERS: Value - Value to be converted - * Out_string - Where to put the converted string (8 bytes) - * - * RETURN: Convert a number to string representation - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_unsigned_integer_to_string ( - ACPI_INTEGER value, - NATIVE_CHAR *out_string) -{ - u32 count; - u32 digits_needed; - - - digits_needed = acpi_aml_digits_needed (value, 10); - - out_string[digits_needed] = '\0'; - - for (count = digits_needed; count > 0; count--) { - out_string[count-1] = (NATIVE_CHAR) ('0' + (ACPI_MODULO (value, 10))); - value = ACPI_DIVIDE (value, 10); - } - - return (AE_OK); -} - - diff --git a/reactos/drivers/bus/acpi/executer/amxface.c b/reactos/drivers/bus/acpi/executer/amxface.c deleted file mode 100644 index 7ce20ddd6b4..00000000000 --- a/reactos/drivers/bus/acpi/executer/amxface.c +++ /dev/null @@ -1,98 +0,0 @@ - -/****************************************************************************** - * - * Module Name: amxface - External interpreter interfaces - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - - -#define _COMPONENT ACPI_EXECUTER - MODULE_NAME ("amxface") - - -/* - * DEFINE_AML_GLOBALS is tested in amlcode.h - * to determine whether certain global names should be "defined" or only - * "declared" in the current compilation. This enhances maintainability - * by enabling a single header file to embody all knowledge of the names - * in question. - * - * Exactly one module of any executable should #define DEFINE_GLOBALS - * before #including the header files which use this convention. The - * names in question will be defined and initialized in that module, - * and declared as extern in all other modules which #include those - * header files. - */ - -#define DEFINE_AML_GLOBALS -#include "amlcode.h" -#include "acparser.h" -#include "acnamesp.h" - - -/******************************************************************************* - * - * FUNCTION: Acpi_aml_execute_method - * - * PARAMETERS: Pcode - Pointer to the pcode stream - * Pcode_length - Length of pcode that comprises the method - * **Params - List of parameters to pass to method, - * terminated by NULL. Params itself may be - * NULL if no parameters are being passed. - * - * RETURN: Status - * - * DESCRIPTION: Execute a control method - * - ******************************************************************************/ - -ACPI_STATUS -acpi_aml_execute_method ( - ACPI_NAMESPACE_NODE *method_node, - ACPI_OPERAND_OBJECT **params, - ACPI_OPERAND_OBJECT **return_obj_desc) -{ - ACPI_STATUS status; - - - /* - * The point here is to lock the interpreter and call the low - * level execute. - */ - - status = acpi_aml_enter_interpreter (); - if (ACPI_FAILURE (status)) { - return (status); - } - - status = acpi_psx_execute (method_node, params, return_obj_desc); - - acpi_aml_exit_interpreter (); - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/hardware/hwacpi.c b/reactos/drivers/bus/acpi/hardware/hwacpi.c deleted file mode 100644 index b1504fa17c6..00000000000 --- a/reactos/drivers/bus/acpi/hardware/hwacpi.c +++ /dev/null @@ -1,303 +0,0 @@ - -/****************************************************************************** - * - * Module Name: hwacpi - ACPI Hardware Initialization/Mode Interface - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_HARDWARE - MODULE_NAME ("hwacpi") - - -/****************************************************************************** - * - * FUNCTION: Acpi_hw_initialize - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Initialize and validate various ACPI registers - * - ******************************************************************************/ - -ACPI_STATUS -acpi_hw_initialize ( - void) -{ - ACPI_STATUS status = AE_OK; - u32 index; - - - /* We must have the ACPI tables by the time we get here */ - - if (!acpi_gbl_FADT) { - acpi_gbl_restore_acpi_chipset = FALSE; - - return (AE_NO_ACPI_TABLES); - } - - /* Must support *some* mode! */ -/* - if (!(System_flags & SYS_MODES_MASK)) - { - Restore_acpi_chipset = FALSE; - - return (AE_ERROR); - } - -*/ - - - switch (acpi_gbl_system_flags & SYS_MODES_MASK) { - /* Identify current ACPI/legacy mode */ - - case (SYS_MODE_ACPI): - - acpi_gbl_original_mode = SYS_MODE_ACPI; - break; - - - case (SYS_MODE_LEGACY): - - acpi_gbl_original_mode = SYS_MODE_LEGACY; - break; - - - case (SYS_MODE_ACPI | SYS_MODE_LEGACY): - - if (acpi_hw_get_mode () == SYS_MODE_ACPI) { - acpi_gbl_original_mode = SYS_MODE_ACPI; - } - else { - acpi_gbl_original_mode = SYS_MODE_LEGACY; - } - - break; - } - - - if (acpi_gbl_system_flags & SYS_MODE_ACPI) { - /* Target system supports ACPI mode */ - - /* - * The purpose of this code is to save the initial state - * of the ACPI event enable registers. An exit function will be - * registered which will restore this state when the application - * exits. The exit function will also clear all of the ACPI event - * status bits prior to restoring the original mode. - * - * The location of the PM1a_evt_blk enable registers is defined as the - * base of PM1a_evt_blk + DIV_2(PM1a_evt_blk_length). Since the spec further - * fully defines the PM1a_evt_blk to be a total of 4 bytes, the offset - * for the enable registers is always 2 from the base. It is hard - * coded here. If this changes in the spec, this code will need to - * be modified. The PM1b_evt_blk behaves as expected. - */ - - acpi_gbl_pm1_enable_register_save = (u16) acpi_hw_register_read (ACPI_MTX_LOCK, PM1_EN); - - - /* - * The GPEs behave similarly, except that the length of the register - * block is not fixed, so the buffer must be allocated with malloc - */ - - if (ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xgpe0blk.address) && - acpi_gbl_FADT->gpe0blk_len) { - /* GPE0 specified in FADT */ - - acpi_gbl_gpe0enable_register_save = - acpi_cm_allocate (DIV_2 (acpi_gbl_FADT->gpe0blk_len)); - if (!acpi_gbl_gpe0enable_register_save) { - return (AE_NO_MEMORY); - } - - /* Save state of GPE0 enable bits */ - - for (index = 0; index < DIV_2 (acpi_gbl_FADT->gpe0blk_len); index++) { - acpi_gbl_gpe0enable_register_save[index] = - (u8) acpi_hw_register_read (ACPI_MTX_LOCK, GPE0_EN_BLOCK | index); - } - } - - else { - acpi_gbl_gpe0enable_register_save = NULL; - } - - if (ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xgpe1_blk.address) && - acpi_gbl_FADT->gpe1_blk_len) { - /* GPE1 defined */ - - acpi_gbl_gpe1_enable_register_save = - acpi_cm_allocate (DIV_2 (acpi_gbl_FADT->gpe1_blk_len)); - if (!acpi_gbl_gpe1_enable_register_save) { - return (AE_NO_MEMORY); - } - - /* save state of GPE1 enable bits */ - - for (index = 0; index < DIV_2 (acpi_gbl_FADT->gpe1_blk_len); index++) { - acpi_gbl_gpe1_enable_register_save[index] = - (u8) acpi_hw_register_read (ACPI_MTX_LOCK, GPE1_EN_BLOCK | index); - } - } - - else { - acpi_gbl_gpe1_enable_register_save = NULL; - } - } - - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_hw_set_mode - * - * PARAMETERS: Mode - SYS_MODE_ACPI or SYS_MODE_LEGACY - * - * RETURN: Status - * - * DESCRIPTION: Transitions the system into the requested mode or does nothing - * if the system is already in that mode. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_hw_set_mode ( - u32 mode) -{ - - ACPI_STATUS status = AE_NO_HARDWARE_RESPONSE; - - - if (mode == SYS_MODE_ACPI) { - /* BIOS should have disabled ALL fixed and GP events */ - - acpi_os_out8 (acpi_gbl_FADT->smi_cmd, acpi_gbl_FADT->acpi_enable); - } - - else if (mode == SYS_MODE_LEGACY) { - /* - * BIOS should clear all fixed status bits and restore fixed event - * enable bits to default - */ - - acpi_os_out8 (acpi_gbl_FADT->smi_cmd, acpi_gbl_FADT->acpi_disable); - } - - if (acpi_hw_get_mode () == mode) { - status = AE_OK; - } - - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_hw_get_mode - * - * PARAMETERS: none - * - * RETURN: SYS_MODE_ACPI or SYS_MODE_LEGACY - * - * DESCRIPTION: Return current operating state of system. Determined by - * querying the SCI_EN bit. - * - ******************************************************************************/ - -u32 -acpi_hw_get_mode (void) -{ - - - if (acpi_hw_register_bit_access (ACPI_READ, ACPI_MTX_LOCK, SCI_EN)) { - return (SYS_MODE_ACPI); - } - else { - return (SYS_MODE_LEGACY); - } -} - -/****************************************************************************** - * - * FUNCTION: Acpi_hw_get_mode_capabilities - * - * PARAMETERS: none - * - * RETURN: logical OR of SYS_MODE_ACPI and SYS_MODE_LEGACY determined at initial - * system state. - * - * DESCRIPTION: Returns capablities of system - * - ******************************************************************************/ - -u32 -acpi_hw_get_mode_capabilities (void) -{ - - - if (!(acpi_gbl_system_flags & SYS_MODES_MASK)) { - if (acpi_hw_get_mode () == SYS_MODE_LEGACY) { - /* - * Assume that if this call is being made, Acpi_init has been called - * and ACPI support has been established by the presence of the - * tables. Therefore since we're in SYS_MODE_LEGACY, the system - * must support both modes - */ - - acpi_gbl_system_flags |= (SYS_MODE_ACPI | SYS_MODE_LEGACY); - } - - else { - /* TBD: [Investigate] !!! this may be unsafe... */ - /* - * system is is ACPI mode, so try to switch back to LEGACY to see if - * it is supported - */ - acpi_hw_set_mode (SYS_MODE_LEGACY); - - if (acpi_hw_get_mode () == SYS_MODE_LEGACY) { - /* Now in SYS_MODE_LEGACY, so both are supported */ - - acpi_gbl_system_flags |= (SYS_MODE_ACPI | SYS_MODE_LEGACY); - acpi_hw_set_mode (SYS_MODE_ACPI); - } - - else { - /* Still in SYS_MODE_ACPI so this must be an ACPI only system */ - - acpi_gbl_system_flags |= SYS_MODE_ACPI; - } - } - } - - return (acpi_gbl_system_flags & SYS_MODES_MASK); -} - - diff --git a/reactos/drivers/bus/acpi/hardware/hwgpe.c b/reactos/drivers/bus/acpi/hardware/hwgpe.c deleted file mode 100644 index 9d7ed9e6ebd..00000000000 --- a/reactos/drivers/bus/acpi/hardware/hwgpe.c +++ /dev/null @@ -1,204 +0,0 @@ - -/****************************************************************************** - * - * Module Name: hwgpe - Low level GPE enable/disable/clear functions - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - -#define _COMPONENT ACPI_HARDWARE - MODULE_NAME ("hwgpe") - - -/****************************************************************************** - * - * FUNCTION: Acpi_hw_enable_gpe - * - * PARAMETERS: Gpe_number - The GPE - * - * RETURN: None - * - * DESCRIPTION: Enable a single GPE. - * - ******************************************************************************/ - -void -acpi_hw_enable_gpe ( - u32 gpe_number) -{ - u8 in_byte; - u32 register_index; - u8 bit_mask; - - /* - * Translate GPE number to index into global registers array. - */ - register_index = acpi_gbl_gpe_valid[gpe_number]; - - /* - * Figure out the bit offset for this GPE within the target register. - */ - bit_mask = acpi_gbl_decode_to8bit [MOD_8 (gpe_number)]; - - /* - * Read the current value of the register, set the appropriate bit - * to enable the GPE, and write out the new register. - */ - in_byte = acpi_os_in8 (acpi_gbl_gpe_registers[register_index].enable_addr); - acpi_os_out8 (acpi_gbl_gpe_registers[register_index].enable_addr, - (u8)(in_byte | bit_mask)); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_hw_disable_gpe - * - * PARAMETERS: Gpe_number - The GPE - * - * RETURN: None - * - * DESCRIPTION: Disable a single GPE. - * - ******************************************************************************/ - -void -acpi_hw_disable_gpe ( - u32 gpe_number) -{ - u8 in_byte; - u32 register_index; - u8 bit_mask; - - /* - * Translate GPE number to index into global registers array. - */ - register_index = acpi_gbl_gpe_valid[gpe_number]; - - /* - * Figure out the bit offset for this GPE within the target register. - */ - bit_mask = acpi_gbl_decode_to8bit [MOD_8 (gpe_number)]; - - /* - * Read the current value of the register, clear the appropriate bit, - * and write out the new register value to disable the GPE. - */ - in_byte = acpi_os_in8 (acpi_gbl_gpe_registers[register_index].enable_addr); - acpi_os_out8 (acpi_gbl_gpe_registers[register_index].enable_addr, - (u8)(in_byte & ~bit_mask)); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_hw_clear_gpe - * - * PARAMETERS: Gpe_number - The GPE - * - * RETURN: None - * - * DESCRIPTION: Clear a single GPE. - * - ******************************************************************************/ - -void -acpi_hw_clear_gpe ( - u32 gpe_number) -{ - u32 register_index; - u8 bit_mask; - - /* - * Translate GPE number to index into global registers array. - */ - register_index = acpi_gbl_gpe_valid[gpe_number]; - - /* - * Figure out the bit offset for this GPE within the target register. - */ - bit_mask = acpi_gbl_decode_to8bit [MOD_8 (gpe_number)]; - - /* - * Write a one to the appropriate bit in the status register to - * clear this GPE. - */ - acpi_os_out8 (acpi_gbl_gpe_registers[register_index].status_addr, bit_mask); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_hw_get_gpe_status - * - * PARAMETERS: Gpe_number - The GPE - * - * RETURN: None - * - * DESCRIPTION: Return the status of a single GPE. - * - ******************************************************************************/ - -void -acpi_hw_get_gpe_status ( - u32 gpe_number, - ACPI_EVENT_STATUS *event_status) -{ - u8 in_byte = 0; - u32 register_index = 0; - u8 bit_mask = 0; - - if (!event_status) { - return; - } - - (*event_status) = 0; - - /* - * Translate GPE number to index into global registers array. - */ - register_index = acpi_gbl_gpe_valid[gpe_number]; - - /* - * Figure out the bit offset for this GPE within the target register. - */ - bit_mask = acpi_gbl_decode_to8bit [MOD_8 (gpe_number)]; - - /* - * Enabled?: - */ - in_byte = acpi_os_in8 (acpi_gbl_gpe_registers[register_index].enable_addr); - - if (bit_mask & in_byte) { - (*event_status) |= ACPI_EVENT_FLAG_ENABLED; - } - - /* - * Set? - */ - in_byte = acpi_os_in8 (acpi_gbl_gpe_registers[register_index].status_addr); - - if (bit_mask & in_byte) { - (*event_status) |= ACPI_EVENT_FLAG_SET; - } -} diff --git a/reactos/drivers/bus/acpi/hardware/hwregs.c b/reactos/drivers/bus/acpi/hardware/hwregs.c deleted file mode 100644 index 658d5c8167d..00000000000 --- a/reactos/drivers/bus/acpi/hardware/hwregs.c +++ /dev/null @@ -1,964 +0,0 @@ - -/******************************************************************************* - * - * Module Name: hwregs - Read/write access functions for the various ACPI - * control and status registers. - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_HARDWARE - MODULE_NAME ("hwregs") - - -/* This matches the #defines in actypes.h. */ - -NATIVE_CHAR *sleep_state_table[] = {"\\_S0_","\\_S1_","\\_S2_","\\_S3_", - "\\_S4_","\\_S5_","\\_S4_b"}; - - -/******************************************************************************* - * - * FUNCTION: Acpi_hw_get_bit_shift - * - * PARAMETERS: Mask - Input mask to determine bit shift from. - * Must have at least 1 bit set. - * - * RETURN: Bit location of the lsb of the mask - * - * DESCRIPTION: Returns the bit number for the low order bit that's set. - * - ******************************************************************************/ - -u32 -acpi_hw_get_bit_shift ( - u32 mask) { - u32 shift; - - - for (shift = 0; ((mask >> shift) & 1) == 0; shift++) { ; } - - return (shift); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_hw_clear_acpi_status - * - * PARAMETERS: none - * - * RETURN: none - * - * DESCRIPTION: Clears all fixed and general purpose status bits - * - ******************************************************************************/ - -void -acpi_hw_clear_acpi_status (void) -{ - u16 gpe_length; - u16 index; - - - acpi_cm_acquire_mutex (ACPI_MTX_HARDWARE); - - acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK, PM1_STS, ALL_FIXED_STS_BITS); - - - if (ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm1b_evt_blk.address)) { - acpi_os_out16 ((ACPI_IO_ADDRESS) ACPI_GET_ADDRESS (acpi_gbl_FADT->Xpm1b_evt_blk.address), - (u16) ALL_FIXED_STS_BITS); - } - - /* now clear the GPE Bits */ - - if (acpi_gbl_FADT->gpe0blk_len) { - gpe_length = (u16) DIV_2 (acpi_gbl_FADT->gpe0blk_len); - - for (index = 0; index < gpe_length; index++) { - acpi_os_out8 ((ACPI_IO_ADDRESS) (ACPI_GET_ADDRESS (acpi_gbl_FADT->Xgpe0blk.address) + index), - (u8) 0xff); - } - } - - if (acpi_gbl_FADT->gpe1_blk_len) { - gpe_length = (u16) DIV_2 (acpi_gbl_FADT->gpe1_blk_len); - - for (index = 0; index < gpe_length; index++) { - acpi_os_out8 ((ACPI_IO_ADDRESS) (ACPI_GET_ADDRESS (acpi_gbl_FADT->Xgpe1_blk.address) + index), - (u8) 0xff); - } - } - - acpi_cm_release_mutex (ACPI_MTX_HARDWARE); - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_hw_obtain_sleep_type_register_data - * - * PARAMETERS: Sleep_state - Numeric state requested - * *Slp_Typ_a - Pointer to byte to receive SLP_TYPa value - * *Slp_Typ_b - Pointer to byte to receive SLP_TYPb value - * - * RETURN: Status - ACPI status - * - * DESCRIPTION: Acpi_hw_obtain_sleep_type_register_data() obtains the SLP_TYP and - * SLP_TYPb values for the sleep state requested. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_hw_obtain_sleep_type_register_data ( - u8 sleep_state, - u8 *slp_typ_a, - u8 *slp_typ_b) -{ - ACPI_STATUS status = AE_OK; - ACPI_OPERAND_OBJECT *obj_desc; - - - /* - * Validate parameters - */ - - if ((sleep_state > ACPI_S_STATES_MAX) || - !slp_typ_a || !slp_typ_b) { - return (AE_BAD_PARAMETER); - } - - /* - * Acpi_evaluate the namespace object containing the values for this state - */ - - status = acpi_ns_evaluate_by_name (sleep_state_table[sleep_state], NULL, &obj_desc); - if (ACPI_FAILURE (status)) { - return (status); - } - - if (!obj_desc) { - REPORT_ERROR (("Missing Sleep State object\n")); - return (AE_NOT_EXIST); - } - - /* - * We got something, now ensure it is correct. The object must - * be a package and must have at least 2 numeric values as the - * two elements - */ - - /* Even though Acpi_evaluate_object resolves package references, - * Ns_evaluate dpesn't. So, we do it here. - */ - status = acpi_cm_resolve_package_references(obj_desc); - - if (obj_desc->package.count < 2) { - /* Must have at least two elements */ - - REPORT_ERROR (("Sleep State package does not have at least two elements\n")); - status = AE_ERROR; - } - - else if (((obj_desc->package.elements[0])->common.type != - ACPI_TYPE_INTEGER) || - ((obj_desc->package.elements[1])->common.type != - ACPI_TYPE_INTEGER)) { - /* Must have two */ - - REPORT_ERROR (("Sleep State package elements are not both of type Number\n")); - status = AE_ERROR; - } - - else { - /* - * Valid _Sx_ package size, type, and value - */ - *slp_typ_a = (u8) (obj_desc->package.elements[0])->integer.value; - - *slp_typ_b = (u8) (obj_desc->package.elements[1])->integer.value; - } - - - - acpi_cm_remove_reference (obj_desc); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_hw_register_bit_access - * - * PARAMETERS: Read_write - Either ACPI_READ or ACPI_WRITE. - * Use_lock - Lock the hardware - * Register_id - index of ACPI Register to access - * Value - (only used on write) value to write to the - * Register. Shifted all the way right. - * - * RETURN: Value written to or read from specified Register. This value - * is shifted all the way right. - * - * DESCRIPTION: Generic ACPI Register read/write function. - * - ******************************************************************************/ - -u32 -acpi_hw_register_bit_access ( - NATIVE_UINT read_write, - u8 use_lock, - u32 register_id, - ...) /* Value (only used on write) */ -{ - u32 register_value = 0; - u32 mask = 0; - u32 value = 0; - - - if (read_write == ACPI_WRITE) { - va_list marker; - - va_start (marker, register_id); - value = va_arg (marker, u32); - va_end (marker); - } - - if (ACPI_MTX_LOCK == use_lock) { - acpi_cm_acquire_mutex (ACPI_MTX_HARDWARE); - } - - /* - * Decode the Register ID - * Register id = Register block id | bit id - * - * Check bit id to fine locate Register offset. - * check Mask to determine Register offset, and then read-write. - */ - - switch (REGISTER_BLOCK_ID(register_id)) { - case PM1_STS: - - switch (register_id) { - case TMR_STS: - mask = TMR_STS_MASK; - break; - - case BM_STS: - mask = BM_STS_MASK; - break; - - case GBL_STS: - mask = GBL_STS_MASK; - break; - - case PWRBTN_STS: - mask = PWRBTN_STS_MASK; - break; - - case SLPBTN_STS: - mask = SLPBTN_STS_MASK; - break; - - case RTC_STS: - mask = RTC_STS_MASK; - break; - - case WAK_STS: - mask = WAK_STS_MASK; - break; - - default: - mask = 0; - break; - } - - register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM1_STS); - - if (read_write == ACPI_WRITE) { - /* - * Status Registers are different from the rest. Clear by - * writing 1, writing 0 has no effect. So, the only relevent - * information is the single bit we're interested in, all - * others should be written as 0 so they will be left - * unchanged - */ - - value <<= acpi_hw_get_bit_shift (mask); - value &= mask; - - if (value) { - acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK, PM1_STS, (u16) value); - - register_value = 0; - } - } - - break; - - - case PM1_EN: - - switch (register_id) { - case TMR_EN: - mask = TMR_EN_MASK; - break; - - case GBL_EN: - mask = GBL_EN_MASK; - break; - - case PWRBTN_EN: - mask = PWRBTN_EN_MASK; - break; - - case SLPBTN_EN: - mask = SLPBTN_EN_MASK; - break; - - case RTC_EN: - mask = RTC_EN_MASK; - break; - - default: - mask = 0; - break; - } - - register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM1_EN); - - if (read_write == ACPI_WRITE) { - register_value &= ~mask; - value <<= acpi_hw_get_bit_shift (mask); - value &= mask; - register_value |= value; - - acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK, PM1_EN, (u16) register_value); - } - - break; - - - case PM1_CONTROL: - - switch (register_id) { - case SCI_EN: - mask = SCI_EN_MASK; - break; - - case BM_RLD: - mask = BM_RLD_MASK; - break; - - case GBL_RLS: - mask = GBL_RLS_MASK; - break; - - case SLP_TYPE_A: - case SLP_TYPE_B: - mask = SLP_TYPE_X_MASK; - break; - - case SLP_EN: - mask = SLP_EN_MASK; - break; - - default: - mask = 0; - break; - } - - - /* - * Read the PM1 Control register. - * Note that at this level, the fact that there are actually TWO - * registers (A and B) and that B may not exist, are abstracted. - */ - register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM1_CONTROL); - - if (read_write == ACPI_WRITE) { - register_value &= ~mask; - value <<= acpi_hw_get_bit_shift (mask); - value &= mask; - register_value |= value; - - /* - * SLP_TYPE_x Registers are written differently - * than any other control Registers with - * respect to A and B Registers. The value - * for A may be different than the value for B - * - * Therefore, pass the Register_id, not just generic PM1_CONTROL, - * because we need to do different things. Yuck. - */ - - acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK, - register_id, (u16) register_value); - } - break; - - - case PM2_CONTROL: - - switch (register_id) { - case ARB_DIS: - mask = ARB_DIS_MASK; - break; - - default: - mask = 0; - break; - } - - register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, PM2_CONTROL); - - if (read_write == ACPI_WRITE) { - register_value &= ~mask; - value <<= acpi_hw_get_bit_shift (mask); - value &= mask; - register_value |= value; - - acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK, - PM2_CONTROL, (u8) (register_value)); - } - break; - - - case PM_TIMER: - - mask = TMR_VAL_MASK; - register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, - PM_TIMER); - break; - - - case GPE1_EN_BLOCK: - case GPE1_STS_BLOCK: - case GPE0_EN_BLOCK: - case GPE0_STS_BLOCK: - - /* Determine the bit to be accessed - * - * (u32) Register_id: - * 31 24 16 8 0 - * +--------+--------+--------+--------+ - * | gpe_block_id | gpe_bit_number | - * +--------+--------+--------+--------+ - * - * gpe_block_id is one of GPE[01]_EN_BLOCK and GPE[01]_STS_BLOCK - * gpe_bit_number is relative from the gpe_block (0x00~0xFF) - */ - - mask = REGISTER_BIT_ID(register_id); /* gpe_bit_number */ - register_id = REGISTER_BLOCK_ID(register_id) | (mask >> 3); - mask = acpi_gbl_decode_to8bit [mask % 8]; - - /* - * The base address of the GPE 0 Register Block - * Plus 1/2 the length of the GPE 0 Register Block - * The enable Register is the Register following the Status Register - * and each Register is defined as 1/2 of the total Register Block - */ - - /* - * This sets the bit within Enable_bit that needs to be written to - * the Register indicated in Mask to a 1, all others are 0 - */ - - /* Now get the current Enable Bits in the selected Reg */ - - register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, register_id); - if (read_write == ACPI_WRITE) { - register_value &= ~mask; - value <<= acpi_hw_get_bit_shift (mask); - value &= mask; - register_value |= value; - - /* This write will put the Action state into the General Purpose */ - /* Enable Register indexed by the value in Mask */ - - acpi_hw_register_write (ACPI_MTX_DO_NOT_LOCK, - register_id, (u8) register_value); - register_value = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK, register_id); - } - break; - - - case SMI_CMD_BLOCK: - case PROCESSOR_BLOCK: - /* not used */ - default: - - mask = 0; - break; - } - - if (ACPI_MTX_LOCK == use_lock) { - acpi_cm_release_mutex (ACPI_MTX_HARDWARE); - } - - - register_value &= mask; - register_value >>= acpi_hw_get_bit_shift (mask); - - return (register_value); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_hw_register_read - * - * PARAMETERS: Use_lock - Mutex hw access. - * Register_id - Register_iD + Offset. - * - * RETURN: Value read or written. - * - * DESCRIPTION: Acpi register read function. Registers are read at the - * given offset. - * - ******************************************************************************/ - -u32 -acpi_hw_register_read ( - u8 use_lock, - u32 register_id) -{ - u32 value = 0; - u32 bank_offset; - - if (ACPI_MTX_LOCK == use_lock) { - acpi_cm_acquire_mutex (ACPI_MTX_HARDWARE); - } - - - switch (REGISTER_BLOCK_ID(register_id)) { - case PM1_STS: /* 16-bit access */ - - value = acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1a_evt_blk, 0); - value |= acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1b_evt_blk, 0); - break; - - - case PM1_EN: /* 16-bit access*/ - - bank_offset = DIV_2 (acpi_gbl_FADT->pm1_evt_len); - value = acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1a_evt_blk, bank_offset); - value |= acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1b_evt_blk, bank_offset); - break; - - - case PM1_CONTROL: /* 16-bit access */ - - value = acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1a_cnt_blk, 0); - value |= acpi_hw_low_level_read (16, &acpi_gbl_FADT->Xpm1b_cnt_blk, 0); - break; - - - case PM2_CONTROL: /* 8-bit access */ - - value = acpi_hw_low_level_read (8, &acpi_gbl_FADT->Xpm2_cnt_blk, 0); - break; - - - case PM_TIMER: /* 32-bit access */ - - value = acpi_hw_low_level_read (32, &acpi_gbl_FADT->Xpm_tmr_blk, 0); - break; - - - case GPE0_STS_BLOCK: /* 8-bit access */ - - value = acpi_hw_low_level_read (8, &acpi_gbl_FADT->Xgpe0blk, 0); - break; - - - case GPE0_EN_BLOCK: /* 8-bit access */ - - bank_offset = DIV_2 (acpi_gbl_FADT->gpe0blk_len); - value = acpi_hw_low_level_read (8, &acpi_gbl_FADT->Xgpe0blk, bank_offset); - break; - - - case GPE1_STS_BLOCK: /* 8-bit access */ - - value = acpi_hw_low_level_read (8, &acpi_gbl_FADT->Xgpe1_blk, 0); - break; - - - case GPE1_EN_BLOCK: /* 8-bit access */ - - bank_offset = DIV_2 (acpi_gbl_FADT->gpe1_blk_len); - value = acpi_hw_low_level_read (8, &acpi_gbl_FADT->Xgpe1_blk, bank_offset); - break; - - - case SMI_CMD_BLOCK: /* 8bit */ - - value = (u32) acpi_os_in8 (acpi_gbl_FADT->smi_cmd); - break; - - - default: - value = 0; - break; - } - - - if (ACPI_MTX_LOCK == use_lock) { - acpi_cm_release_mutex (ACPI_MTX_HARDWARE); - } - - return (value); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_hw_register_write - * - * PARAMETERS: Use_lock - Mutex hw access. - * Register_id - Register_iD + Offset. - * - * RETURN: Value read or written. - * - * DESCRIPTION: Acpi register Write function. Registers are written at the - * given offset. - * - ******************************************************************************/ - -void -acpi_hw_register_write ( - u8 use_lock, - u32 register_id, - u32 value) -{ - u32 bank_offset; - - - if (ACPI_MTX_LOCK == use_lock) { - acpi_cm_acquire_mutex (ACPI_MTX_HARDWARE); - } - - - switch (REGISTER_BLOCK_ID (register_id)) { - case PM1_STS: /* 16-bit access */ - - acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1a_evt_blk, 0); - acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1b_evt_blk, 0); - break; - - - case PM1_EN: /* 16-bit access*/ - - bank_offset = DIV_2 (acpi_gbl_FADT->pm1_evt_len); - acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1a_evt_blk, bank_offset); - acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1b_evt_blk, bank_offset); - break; - - - case PM1_CONTROL: /* 16-bit access */ - - acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1a_cnt_blk, 0); - acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1b_cnt_blk, 0); - break; - - - case PM1_a_CONTROL: /* 16-bit access */ - - acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1a_cnt_blk, 0); - break; - - - case PM1_b_CONTROL: /* 16-bit access */ - - acpi_hw_low_level_write (16, value, &acpi_gbl_FADT->Xpm1b_cnt_blk, 0); - break; - - - case PM2_CONTROL: /* 8-bit access */ - - acpi_hw_low_level_write (8, value, &acpi_gbl_FADT->Xpm2_cnt_blk, 0); - break; - - - case PM_TIMER: /* 32-bit access */ - - acpi_hw_low_level_write (32, value, &acpi_gbl_FADT->Xpm_tmr_blk, 0); - break; - - - case GPE0_STS_BLOCK: /* 8-bit access */ - - acpi_hw_low_level_write (8, value, &acpi_gbl_FADT->Xgpe0blk, 0); - break; - - - case GPE0_EN_BLOCK: /* 8-bit access */ - - bank_offset = DIV_2 (acpi_gbl_FADT->gpe0blk_len); - acpi_hw_low_level_write (8, value, &acpi_gbl_FADT->Xgpe0blk, bank_offset); - break; - - - case GPE1_STS_BLOCK: /* 8-bit access */ - - acpi_hw_low_level_write (8, value, &acpi_gbl_FADT->Xgpe1_blk, 0); - break; - - - case GPE1_EN_BLOCK: /* 8-bit access */ - - bank_offset = DIV_2 (acpi_gbl_FADT->gpe1_blk_len); - acpi_hw_low_level_write (8, value, &acpi_gbl_FADT->Xgpe1_blk, bank_offset); - break; - - - case SMI_CMD_BLOCK: /* 8bit */ - - /* For 2.0, SMI_CMD is always in IO space */ - /* TBD: what about 1.0? 0.71? */ - - acpi_os_out8 (acpi_gbl_FADT->smi_cmd, (u8) value); - break; - - - default: - value = 0; - break; - } - - - if (ACPI_MTX_LOCK == use_lock) { - acpi_cm_release_mutex (ACPI_MTX_HARDWARE); - } - - return; -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_hw_low_level_read - * - * PARAMETERS: Register - GAS register structure - * Offset - Offset from the base address in the GAS - * Width - 8, 16, or 32 - * - * RETURN: Value read - * - * DESCRIPTION: Read from either memory, IO, or PCI config space. - * - ******************************************************************************/ - -u32 -acpi_hw_low_level_read ( - u32 width, - ACPI_GAS *reg, - u32 offset) -{ - u32 value = 0; - ACPI_PHYSICAL_ADDRESS mem_address; - ACPI_IO_ADDRESS io_address; - u32 pci_register; - u32 pci_dev_func; - - - /* - * Must have a valid pointer to a GAS structure, and - * a non-zero address within - */ - if ((!reg) || - (!ACPI_VALID_ADDRESS (reg->address))) { - return 0; - } - - - /* - * Three address spaces supported: - * Memory, Io, or PCI config. - */ - - switch (reg->address_space_id) { - case ADDRESS_SPACE_SYSTEM_MEMORY: - - mem_address = (ACPI_PHYSICAL_ADDRESS) (ACPI_GET_ADDRESS (reg->address) + offset); - - switch (width) { - case 8: - value = acpi_os_mem_in8 (mem_address); - break; - case 16: - value = acpi_os_mem_in16 (mem_address); - break; - case 32: - value = acpi_os_mem_in32 (mem_address); - break; - } - break; - - - case ADDRESS_SPACE_SYSTEM_IO: - - io_address = (ACPI_IO_ADDRESS) (ACPI_GET_ADDRESS (reg->address) + offset); - - switch (width) { - case 8: - value = acpi_os_in8 (io_address); - break; - case 16: - value = acpi_os_in16 (io_address); - break; - case 32: - value = acpi_os_in32 (io_address); - break; - } - break; - - - case ADDRESS_SPACE_PCI_CONFIG: - - pci_dev_func = ACPI_PCI_DEVFUN (ACPI_GET_ADDRESS (reg->address)); - pci_register = ACPI_PCI_REGISTER (ACPI_GET_ADDRESS (reg->address)) + offset; - - switch (width) { - case 8: - acpi_os_read_pci_cfg_byte (0, pci_dev_func, pci_register, (u8 *) &value); - break; - case 16: - acpi_os_read_pci_cfg_word (0, pci_dev_func, pci_register, (u16 *) &value); - break; - case 32: - acpi_os_read_pci_cfg_dword (0, pci_dev_func, pci_register, (u32 *) &value); - break; - } - break; - } - - return value; -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_hw_low_level_write - * - * PARAMETERS: Width - 8, 16, or 32 - * Value - To be written - * Register - GAS register structure - * Offset - Offset from the base address in the GAS - * - * - * RETURN: Value read - * - * DESCRIPTION: Read from either memory, IO, or PCI config space. - * - ******************************************************************************/ - -void -acpi_hw_low_level_write ( - u32 width, - u32 value, - ACPI_GAS *reg, - u32 offset) -{ - ACPI_PHYSICAL_ADDRESS mem_address; - ACPI_IO_ADDRESS io_address; - u32 pci_register; - u32 pci_dev_func; - - - /* - * Must have a valid pointer to a GAS structure, and - * a non-zero address within - */ - if ((!reg) || - (!ACPI_VALID_ADDRESS (reg->address))) { - return; - } - - - /* - * Three address spaces supported: - * Memory, Io, or PCI config. - */ - - switch (reg->address_space_id) { - case ADDRESS_SPACE_SYSTEM_MEMORY: - - mem_address = (ACPI_PHYSICAL_ADDRESS) (ACPI_GET_ADDRESS (reg->address) + offset); - - switch (width) { - case 8: - acpi_os_mem_out8 (mem_address, (u8) value); - break; - case 16: - acpi_os_mem_out16 (mem_address, (u16) value); - break; - case 32: - acpi_os_mem_out32 (mem_address, (u32) value); - break; - } - break; - - - case ADDRESS_SPACE_SYSTEM_IO: - - io_address = (ACPI_IO_ADDRESS) (ACPI_GET_ADDRESS (reg->address) + offset); - - switch (width) { - case 8: - acpi_os_out8 (io_address, (u8) value); - break; - case 16: - acpi_os_out16 (io_address, (u16) value); - break; - case 32: - acpi_os_out32 (io_address, (u32) value); - break; - } - break; - - - case ADDRESS_SPACE_PCI_CONFIG: - - pci_dev_func = ACPI_PCI_DEVFUN (ACPI_GET_ADDRESS (reg->address)); - pci_register = ACPI_PCI_REGISTER (ACPI_GET_ADDRESS (reg->address)) + offset; - - switch (width) { - case 8: - acpi_os_write_pci_cfg_byte (0, pci_dev_func, pci_register, (u8) value); - break; - case 16: - acpi_os_write_pci_cfg_word (0, pci_dev_func, pci_register, (u16) value); - break; - case 32: - acpi_os_write_pci_cfg_dword (0, pci_dev_func, pci_register, (u32) value); - break; - } - break; - } -} diff --git a/reactos/drivers/bus/acpi/hardware/hwsleep.c b/reactos/drivers/bus/acpi/hardware/hwsleep.c deleted file mode 100644 index a30fbe624a3..00000000000 --- a/reactos/drivers/bus/acpi/hardware/hwsleep.c +++ /dev/null @@ -1,186 +0,0 @@ - -/****************************************************************************** - * - * Name: hwsleep.c - ACPI Hardware Sleep/Wake Interface - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - -#define _COMPONENT ACPI_HARDWARE - MODULE_NAME ("hwsleep") - - -/****************************************************************************** - * - * FUNCTION: Acpi_set_firmware_waking_vector - * - * PARAMETERS: Physical_address - Physical address of ACPI real mode - * entry point. - * - * RETURN: AE_OK or AE_ERROR - * - * DESCRIPTION: Access function for d_firmware_waking_vector field in FACS - * - ******************************************************************************/ - -ACPI_STATUS -acpi_set_firmware_waking_vector ( - ACPI_PHYSICAL_ADDRESS physical_address) -{ - - - /* Make sure that we have an FACS */ - - if (!acpi_gbl_FACS) { - return (AE_NO_ACPI_TABLES); - } - - /* Set the vector */ - - if (acpi_gbl_FACS->vector_width == 32) { - * (u32 *) acpi_gbl_FACS->firmware_waking_vector = (u32) physical_address; - } - else { - *acpi_gbl_FACS->firmware_waking_vector = physical_address; - } - - return (AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_get_firmware_waking_vector - * - * PARAMETERS: *Physical_address - Output buffer where contents of - * the Firmware_waking_vector field of - * the FACS will be stored. - * - * RETURN: Status - * - * DESCRIPTION: Access function for d_firmware_waking_vector field in FACS - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_firmware_waking_vector ( - ACPI_PHYSICAL_ADDRESS *physical_address) -{ - - - if (!physical_address) { - return (AE_BAD_PARAMETER); - } - - /* Make sure that we have an FACS */ - - if (!acpi_gbl_FACS) { - return (AE_NO_ACPI_TABLES); - } - - /* Get the vector */ - - if (acpi_gbl_FACS->vector_width == 32) { - *physical_address = * (u32 *) acpi_gbl_FACS->firmware_waking_vector; - } - else { - *physical_address = *acpi_gbl_FACS->firmware_waking_vector; - } - - return (AE_OK); -} - -/****************************************************************************** - * - * FUNCTION: Acpi_enter_sleep_state - * - * PARAMETERS: Sleep_state - Which sleep state to enter - * - * RETURN: Status - * - * DESCRIPTION: Enter a system sleep state (see ACPI 2.0 spec p 231) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_enter_sleep_state ( - u8 sleep_state) -{ - ACPI_STATUS status; - ACPI_OBJECT_LIST arg_list; - ACPI_OBJECT arg; - u8 type_a; - u8 type_b; - u16 PM1_acontrol; - u16 PM1_bcontrol; - - /* - * _PSW methods could be run here to enable wake-on keyboard, LAN, etc. - */ - - status = acpi_hw_obtain_sleep_type_register_data(sleep_state, &type_a, &type_b); - - if (!ACPI_SUCCESS(status)) { - return status; - } - - /* run the _PTS and _GTS methods */ - MEMSET(&arg_list, 0, sizeof(arg_list)); - arg_list.count = 1; - arg_list.pointer = &arg; - - MEMSET(&arg, 0, sizeof(arg)); - arg.type = ACPI_TYPE_INTEGER; - arg.integer.value = sleep_state; - - acpi_evaluate_object(NULL, "\\_PTS", &arg_list, NULL); - acpi_evaluate_object(NULL, "\\_GTS", &arg_list, NULL); - - /* clear wake status */ - acpi_hw_register_bit_access(ACPI_WRITE, ACPI_MTX_LOCK, WAK_STS, 1); - - PM1_acontrol = (u16) acpi_hw_register_read(ACPI_MTX_LOCK, PM1_CONTROL); - - /* mask off SLP_EN and SLP_TYP fields */ - PM1_acontrol &= 0xC3FF; - - /* mask in SLP_EN */ - PM1_acontrol |= (1 << acpi_hw_get_bit_shift (SLP_EN_MASK)); - - PM1_bcontrol = PM1_acontrol; - - /* mask in SLP_TYP */ - PM1_acontrol |= (type_a << acpi_hw_get_bit_shift (SLP_TYPE_X_MASK)); - PM1_bcontrol |= (type_b << acpi_hw_get_bit_shift (SLP_TYPE_X_MASK)); - - disable(); - - acpi_hw_register_write(ACPI_MTX_LOCK, PM1_a_CONTROL, PM1_acontrol); - acpi_hw_register_write(ACPI_MTX_LOCK, PM1_b_CONTROL, PM1_bcontrol); - acpi_hw_register_write(ACPI_MTX_LOCK, PM1_CONTROL, - (1 << acpi_hw_get_bit_shift (SLP_EN_MASK))); - - enable(); - - return (AE_OK); -} diff --git a/reactos/drivers/bus/acpi/hardware/hwtimer.c b/reactos/drivers/bus/acpi/hardware/hwtimer.c deleted file mode 100644 index 06dfbbee535..00000000000 --- a/reactos/drivers/bus/acpi/hardware/hwtimer.c +++ /dev/null @@ -1,199 +0,0 @@ - -/****************************************************************************** - * - * Name: hwtimer.c - ACPI Power Management Timer Interface - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - -#define _COMPONENT ACPI_HARDWARE - MODULE_NAME ("hwtimer") - - -/****************************************************************************** - * - * FUNCTION: Acpi_get_timer_resolution - * - * PARAMETERS: none - * - * RETURN: Number of bits of resolution in the PM Timer (24 or 32). - * - * DESCRIPTION: Obtains resolution of the ACPI PM Timer. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_timer_resolution ( - u32 *resolution) -{ - if (!resolution) { - return (AE_BAD_PARAMETER); - } - - if (0 == acpi_gbl_FADT->tmr_val_ext) { - *resolution = 24; - } - else { - *resolution = 32; - } - - return (AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_get_timer - * - * PARAMETERS: none - * - * RETURN: Current value of the ACPI PM Timer (in ticks). - * - * DESCRIPTION: Obtains current value of ACPI PM Timer. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_timer ( - u32 *ticks) -{ - if (!ticks) { - return (AE_BAD_PARAMETER); - } - - *ticks = acpi_os_in32 ((ACPI_IO_ADDRESS) ACPI_GET_ADDRESS (acpi_gbl_FADT->Xpm_tmr_blk.address)); - - return (AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_get_timer_duration - * - * PARAMETERS: Start_ticks - * End_ticks - * Time_elapsed - * - * RETURN: Time_elapsed - * - * DESCRIPTION: Computes the time elapsed (in microseconds) between two - * PM Timer time stamps, taking into account the possibility of - * rollovers, the timer resolution, and timer frequency. - * - * The PM Timer's clock ticks at roughly 3.6 times per - * _microsecond_, and its clock continues through Cx state - * transitions (unlike many CPU timestamp counters) -- making it - * a versatile and accurate timer. - * - * Note that this function accomodates only a single timer - * rollover. Thus for 24-bit timers, this function should only - * be used for calculating durations less than ~4.6 seconds - * (~20 hours for 32-bit timers). - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_timer_duration ( - u32 start_ticks, - u32 end_ticks, - u32 *time_elapsed) -{ - u32 delta_ticks = 0; - u32 seconds = 0; - u32 milliseconds = 0; - u32 microseconds = 0; - u32 remainder = 0; - - if (!time_elapsed) { - return (AE_BAD_PARAMETER); - } - - /* - * Compute Tick Delta: - * ------------------- - * Handle (max one) timer rollovers on 24- versus 32-bit timers. - */ - if (start_ticks < end_ticks) { - delta_ticks = end_ticks - start_ticks; - } - else if (start_ticks > end_ticks) { - /* 24-bit Timer */ - if (0 == acpi_gbl_FADT->tmr_val_ext) { - delta_ticks = (((0x00FFFFFF - start_ticks) + end_ticks) & 0x00FFFFFF); - } - /* 32-bit Timer */ - else { - delta_ticks = (0xFFFFFFFF - start_ticks) + end_ticks; - } - } - else { - *time_elapsed = 0; - return (AE_OK); - } - - /* - * Compute Duration: - * ----------------- - * Since certain compilers (gcc/Linux, argh!) don't support 64-bit - * divides in kernel-space we have to do some trickery to preserve - * accuracy while using 32-bit math. - * - * TODO: Change to use 64-bit math when supported. - * - * The process is as follows: - * 1. Compute the number of seconds by dividing Delta Ticks by - * the timer frequency. - * 2. Compute the number of milliseconds in the remainder from step #1 - * by multiplying by 1000 and then dividing by the timer frequency. - * 3. Compute the number of microseconds in the remainder from step #2 - * by multiplying by 1000 and then dividing by the timer frequency. - * 4. Add the results from steps 1, 2, and 3 to get the total duration. - * - * Example: The time elapsed for Delta_ticks = 0xFFFFFFFF should be - * 1199864031 microseconds. This is computed as follows: - * Step #1: Seconds = 1199; Remainder = 3092840 - * Step #2: Milliseconds = 864; Remainder = 113120 - * Step #3: Microseconds = 31; Remainder = - */ - - /* Step #1 */ - seconds = delta_ticks / PM_TIMER_FREQUENCY; - remainder = delta_ticks % PM_TIMER_FREQUENCY; - - /* Step #2 */ - milliseconds = (remainder * 1000) / PM_TIMER_FREQUENCY; - remainder = (remainder * 1000) % PM_TIMER_FREQUENCY; - - /* Step #3 */ - microseconds = (remainder * 1000) / PM_TIMER_FREQUENCY; - - /* Step #4 */ - *time_elapsed = seconds * 1000000; - *time_elapsed += milliseconds * 1000; - *time_elapsed += microseconds; - - return (AE_OK); -} - - diff --git a/reactos/drivers/bus/acpi/include/accommon.h b/reactos/drivers/bus/acpi/include/accommon.h deleted file mode 100644 index 56bdf49cebd..00000000000 --- a/reactos/drivers/bus/acpi/include/accommon.h +++ /dev/null @@ -1,725 +0,0 @@ -/****************************************************************************** - * - * Name: accommon.h -- prototypes for the common (subsystem-wide) procedures - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _ACCOMMON_H -#define _ACCOMMON_H - - -typedef -ACPI_STATUS (*ACPI_PKG_CALLBACK) ( - u8 object_type, - ACPI_OPERAND_OBJECT *source_object, - ACPI_GENERIC_STATE *state, - void *context); - - -ACPI_STATUS -acpi_cm_walk_package_tree ( - ACPI_OPERAND_OBJECT *source_object, - void *target_object, - ACPI_PKG_CALLBACK walk_callback, - void *context); - - -typedef struct acpi_pkg_info -{ - u8 *free_space; - u32 length; - u32 object_space; - u32 num_packages; -} ACPI_PKG_INFO; - -#define REF_INCREMENT (u16) 0 -#define REF_DECREMENT (u16) 1 -#define REF_FORCE_DELETE (u16) 2 - -/* Acpi_cm_dump_buffer */ - -#define DB_BYTE_DISPLAY 1 -#define DB_WORD_DISPLAY 2 -#define DB_DWORD_DISPLAY 4 -#define DB_QWORD_DISPLAY 8 - - -/* Global initialization interfaces */ - -void -acpi_cm_init_globals ( - void); - -void -acpi_cm_terminate ( - void); - - -/* - * Cm_init - miscellaneous initialization and shutdown - */ - -ACPI_STATUS -acpi_cm_hardware_initialize ( - void); - -ACPI_STATUS -acpi_cm_subsystem_shutdown ( - void); - -ACPI_STATUS -acpi_cm_validate_fadt ( - void); - -/* - * Cm_global - Global data structures and procedures - */ - -#ifdef ACPI_DEBUG - -NATIVE_CHAR * -acpi_cm_get_mutex_name ( - u32 mutex_id); - -NATIVE_CHAR * -acpi_cm_get_type_name ( - u32 type); - -NATIVE_CHAR * -acpi_cm_get_region_name ( - u8 space_id); - -#endif - - -u8 -acpi_cm_valid_object_type ( - u32 type); - -ACPI_OWNER_ID -acpi_cm_allocate_owner_id ( - u32 id_type); - - -/* - * Cm_clib - Local implementations of C library functions - */ - -#ifndef ACPI_USE_SYSTEM_CLIBRARY - -u32 -acpi_cm_strlen ( - const NATIVE_CHAR *string); - -NATIVE_CHAR * -acpi_cm_strcpy ( - NATIVE_CHAR *dst_string, - const NATIVE_CHAR *src_string); - -NATIVE_CHAR * -acpi_cm_strncpy ( - NATIVE_CHAR *dst_string, - const NATIVE_CHAR *src_string, - NATIVE_UINT count); - -u32 -acpi_cm_strncmp ( - const NATIVE_CHAR *string1, - const NATIVE_CHAR *string2, - NATIVE_UINT count); - -u32 -acpi_cm_strcmp ( - const NATIVE_CHAR *string1, - const NATIVE_CHAR *string2); - -NATIVE_CHAR * -acpi_cm_strcat ( - NATIVE_CHAR *dst_string, - const NATIVE_CHAR *src_string); - -NATIVE_CHAR * -acpi_cm_strncat ( - NATIVE_CHAR *dst_string, - const NATIVE_CHAR *src_string, - NATIVE_UINT count); - -NATIVE_UINT -acpi_cm_strtoul ( - const NATIVE_CHAR *string, - NATIVE_CHAR **terminator, - NATIVE_UINT base); - -NATIVE_CHAR * -acpi_cm_strstr ( - NATIVE_CHAR *string1, - NATIVE_CHAR *string2); - -NATIVE_CHAR * -acpi_cm_strupr ( - NATIVE_CHAR *src_string); - -void * -acpi_cm_memcpy ( - void *dest, - const void *src, - NATIVE_UINT count); - -void * -acpi_cm_memset ( - void *dest, - NATIVE_UINT value, - NATIVE_UINT count); - -u32 -acpi_cm_to_upper ( - u32 c); - -u32 -acpi_cm_to_lower ( - u32 c); - -#endif /* ACPI_USE_SYSTEM_CLIBRARY */ - -/* - * Cm_copy - Object construction and conversion interfaces - */ - -ACPI_STATUS -acpi_cm_build_simple_object( - ACPI_OPERAND_OBJECT *obj, - ACPI_OBJECT *user_obj, - u8 *data_space, - u32 *buffer_space_used); - -ACPI_STATUS -acpi_cm_build_package_object ( - ACPI_OPERAND_OBJECT *obj, - u8 *buffer, - u32 *space_used); - -ACPI_STATUS -acpi_cm_copy_iobject_to_eobject ( - ACPI_OPERAND_OBJECT *obj, - ACPI_BUFFER *ret_buffer); - -ACPI_STATUS -acpi_cm_copy_esimple_to_isimple( - ACPI_OBJECT *user_obj, - ACPI_OPERAND_OBJECT *obj); - -ACPI_STATUS -acpi_cm_copy_eobject_to_iobject ( - ACPI_OBJECT *obj, - ACPI_OPERAND_OBJECT *internal_obj); - -ACPI_STATUS -acpi_cm_copy_isimple_to_isimple ( - ACPI_OPERAND_OBJECT *source_obj, - ACPI_OPERAND_OBJECT *dest_obj); - -ACPI_STATUS -acpi_cm_copy_ipackage_to_ipackage ( - ACPI_OPERAND_OBJECT *source_obj, - ACPI_OPERAND_OBJECT *dest_obj, - ACPI_WALK_STATE *walk_state); - - -/* - * Cm_create - Object creation - */ - -ACPI_STATUS -acpi_cm_update_object_reference ( - ACPI_OPERAND_OBJECT *object, - u16 action); - -ACPI_OPERAND_OBJECT * -_cm_create_internal_object ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - OBJECT_TYPE_INTERNAL type); - - -/* - * Cm_debug - Debug interfaces - */ - -u32 -get_debug_level ( - void); - -void -set_debug_level ( - u32 level); - -void -function_trace ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name); - -void -function_trace_ptr ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name, - void *pointer); - -void -function_trace_u32 ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name, - u32 integer); - -void -function_trace_str ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name, - NATIVE_CHAR *string); - -void -function_exit ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name); - -void -function_status_exit ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name, - ACPI_STATUS status); - -void -function_value_exit ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name, - ACPI_INTEGER value); - -void -function_ptr_exit ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name, - u8 *ptr); - -void -debug_print_prefix ( - NATIVE_CHAR *module_name, - u32 line_number); - -void -debug_print ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - u32 print_level, - NATIVE_CHAR *format, ...); - -void -debug_print_raw ( - NATIVE_CHAR *format, ...); - -void -_report_info ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id); - -void -_report_error ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id); - -void -_report_warning ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id); - -void -acpi_cm_dump_buffer ( - u8 *buffer, - u32 count, - u32 display, - u32 component_id); - - -/* - * Cm_delete - Object deletion - */ - -void -acpi_cm_delete_internal_obj ( - ACPI_OPERAND_OBJECT *object); - -void -acpi_cm_delete_internal_package_object ( - ACPI_OPERAND_OBJECT *object); - -void -acpi_cm_delete_internal_simple_object ( - ACPI_OPERAND_OBJECT *object); - -ACPI_STATUS -acpi_cm_delete_internal_object_list ( - ACPI_OPERAND_OBJECT **obj_list); - - -/* - * Cm_eval - object evaluation - */ - -/* Method name strings */ - -#define METHOD_NAME__HID "_HID" -#define METHOD_NAME__UID "_UID" -#define METHOD_NAME__ADR "_ADR" -#define METHOD_NAME__STA "_STA" -#define METHOD_NAME__REG "_REG" -#define METHOD_NAME__SEG "_SEG" -#define METHOD_NAME__BBN "_BBN" - - -ACPI_STATUS -acpi_cm_evaluate_numeric_object ( - NATIVE_CHAR *object_name, - ACPI_NAMESPACE_NODE *device_node, - ACPI_INTEGER *address); - -ACPI_STATUS -acpi_cm_execute_HID ( - ACPI_NAMESPACE_NODE *device_node, - DEVICE_ID *hid); - -ACPI_STATUS -acpi_cm_execute_STA ( - ACPI_NAMESPACE_NODE *device_node, - u32 *status_flags); - -ACPI_STATUS -acpi_cm_execute_UID ( - ACPI_NAMESPACE_NODE *device_node, - DEVICE_ID *uid); - - -/* - * Cm_error - exception interfaces - */ - -NATIVE_CHAR * -acpi_cm_format_exception ( - ACPI_STATUS status); - - -/* - * Cm_mutex - mutual exclusion interfaces - */ - -ACPI_STATUS -acpi_cm_mutex_initialize ( - void); - -void -acpi_cm_mutex_terminate ( - void); - -ACPI_STATUS -acpi_cm_create_mutex ( - ACPI_MUTEX_HANDLE mutex_id); - -ACPI_STATUS -acpi_cm_delete_mutex ( - ACPI_MUTEX_HANDLE mutex_id); - -ACPI_STATUS -acpi_cm_acquire_mutex ( - ACPI_MUTEX_HANDLE mutex_id); - -ACPI_STATUS -acpi_cm_release_mutex ( - ACPI_MUTEX_HANDLE mutex_id); - - -/* - * Cm_object - internal object create/delete/cache routines - */ - -void * -_cm_allocate_object_desc ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id); - -#define acpi_cm_create_internal_object(t) _cm_create_internal_object(_THIS_MODULE,__LINE__,_COMPONENT,t) -#define acpi_cm_allocate_object_desc() _cm_allocate_object_desc(_THIS_MODULE,__LINE__,_COMPONENT) - -void -acpi_cm_delete_object_desc ( - ACPI_OPERAND_OBJECT *object); - -u8 -acpi_cm_valid_internal_object ( - void *object); - - -/* - * Cm_ref_cnt - Object reference count management - */ - -void -acpi_cm_add_reference ( - ACPI_OPERAND_OBJECT *object); - -void -acpi_cm_remove_reference ( - ACPI_OPERAND_OBJECT *object); - -/* - * Cm_size - Object size routines - */ - -ACPI_STATUS -acpi_cm_get_simple_object_size ( - ACPI_OPERAND_OBJECT *obj, - u32 *obj_length); - -ACPI_STATUS -acpi_cm_get_package_object_size ( - ACPI_OPERAND_OBJECT *obj, - u32 *obj_length); - -ACPI_STATUS -acpi_cm_get_object_size( - ACPI_OPERAND_OBJECT *obj, - u32 *obj_length); - - -/* - * Cm_state - Generic state creation/cache routines - */ - -void -acpi_cm_push_generic_state ( - ACPI_GENERIC_STATE **list_head, - ACPI_GENERIC_STATE *state); - -ACPI_GENERIC_STATE * -acpi_cm_pop_generic_state ( - ACPI_GENERIC_STATE **list_head); - - -ACPI_GENERIC_STATE * -acpi_cm_create_generic_state ( - void); - -ACPI_GENERIC_STATE * -acpi_cm_create_update_state ( - ACPI_OPERAND_OBJECT *object, - u16 action); - -ACPI_GENERIC_STATE * -acpi_cm_create_pkg_state ( - void *internal_object, - void *external_object, - u16 index); - -ACPI_STATUS -acpi_cm_create_update_state_and_push ( - ACPI_OPERAND_OBJECT *object, - u16 action, - ACPI_GENERIC_STATE **state_list); - -ACPI_STATUS -acpi_cm_create_pkg_state_and_push ( - void *internal_object, - void *external_object, - u16 index, - ACPI_GENERIC_STATE **state_list); - -ACPI_GENERIC_STATE * -acpi_cm_create_control_state ( - void); - -void -acpi_cm_delete_generic_state ( - ACPI_GENERIC_STATE *state); - -void -acpi_cm_delete_generic_state_cache ( - void); - -void -acpi_cm_delete_object_cache ( - void); - -/* - * Cmutils - */ - -u8 -acpi_cm_valid_acpi_name ( - u32 name); - -u8 -acpi_cm_valid_acpi_character ( - NATIVE_CHAR character); - -ACPI_STATUS -acpi_cm_resolve_package_references ( - ACPI_OPERAND_OBJECT *obj_desc); - -#ifdef ACPI_DEBUG - -void -acpi_cm_display_init_pathname ( - ACPI_HANDLE obj_handle, - char *path); - -#endif - - -/* - * Memory allocation functions and related macros. - * Macros that expand to include filename and line number - */ - -void * -_cm_allocate ( - u32 size, - u32 component, - NATIVE_CHAR *module, - u32 line); - -void * -_cm_callocate ( - u32 size, - u32 component, - NATIVE_CHAR *module, - u32 line); - -void -_cm_free ( - void *address, - u32 component, - NATIVE_CHAR *module, - u32 line); - -void -acpi_cm_init_static_object ( - ACPI_OPERAND_OBJECT *obj_desc); - -#define acpi_cm_allocate(a) _cm_allocate(a,_COMPONENT,_THIS_MODULE,__LINE__) -#define acpi_cm_callocate(a) _cm_callocate(a, _COMPONENT,_THIS_MODULE,__LINE__) -#define acpi_cm_free(a) _cm_free(a,_COMPONENT,_THIS_MODULE,__LINE__) - -#ifndef ACPI_DEBUG_TRACK_ALLOCATIONS - -#define acpi_cm_add_element_to_alloc_list(a,b,c,d,e,f) -#define acpi_cm_delete_element_from_alloc_list(a,b,c,d) -#define acpi_cm_dump_current_allocations(a,b) -#define acpi_cm_dump_allocation_info() - -#define DECREMENT_OBJECT_METRICS(a) -#define INCREMENT_OBJECT_METRICS(a) -#define INITIALIZE_ALLOCATION_METRICS() -#define DECREMENT_NAME_TABLE_METRICS(a) -#define INCREMENT_NAME_TABLE_METRICS(a) - -#else - -#define INITIALIZE_ALLOCATION_METRICS() \ - acpi_gbl_current_object_count = 0; \ - acpi_gbl_current_object_size = 0; \ - acpi_gbl_running_object_count = 0; \ - acpi_gbl_running_object_size = 0; \ - acpi_gbl_max_concurrent_object_count = 0; \ - acpi_gbl_max_concurrent_object_size = 0; \ - acpi_gbl_current_alloc_size = 0; \ - acpi_gbl_current_alloc_count = 0; \ - acpi_gbl_running_alloc_size = 0; \ - acpi_gbl_running_alloc_count = 0; \ - acpi_gbl_max_concurrent_alloc_size = 0; \ - acpi_gbl_max_concurrent_alloc_count = 0; \ - acpi_gbl_current_node_count = 0; \ - acpi_gbl_current_node_size = 0; \ - acpi_gbl_max_concurrent_node_count = 0 - - -#define DECREMENT_OBJECT_METRICS(a) \ - acpi_gbl_current_object_count--; \ - acpi_gbl_current_object_size -= a - -#define INCREMENT_OBJECT_METRICS(a) \ - acpi_gbl_current_object_count++; \ - acpi_gbl_running_object_count++; \ - if (acpi_gbl_max_concurrent_object_count < acpi_gbl_current_object_count) \ - { \ - acpi_gbl_max_concurrent_object_count = acpi_gbl_current_object_count; \ - } \ - acpi_gbl_running_object_size += a; \ - acpi_gbl_current_object_size += a; \ - if (acpi_gbl_max_concurrent_object_size < acpi_gbl_current_object_size) \ - { \ - acpi_gbl_max_concurrent_object_size = acpi_gbl_current_object_size; \ - } - -#define DECREMENT_NAME_TABLE_METRICS(a) \ - acpi_gbl_current_node_count--; \ - acpi_gbl_current_node_size -= (a) - -#define INCREMENT_NAME_TABLE_METRICS(a) \ - acpi_gbl_current_node_count++; \ - acpi_gbl_current_node_size+= (a); \ - if (acpi_gbl_max_concurrent_node_count < acpi_gbl_current_node_count) \ - { \ - acpi_gbl_max_concurrent_node_count = acpi_gbl_current_node_count; \ - } \ - - -void -acpi_cm_dump_allocation_info ( - void); - -void -acpi_cm_dump_current_allocations ( - u32 component, - NATIVE_CHAR *module); - -#endif - - -#endif /* _ACCOMMON_H */ diff --git a/reactos/drivers/bus/acpi/include/acconfig.h b/reactos/drivers/bus/acpi/include/acconfig.h deleted file mode 100644 index c31e16f7dd9..00000000000 --- a/reactos/drivers/bus/acpi/include/acconfig.h +++ /dev/null @@ -1,152 +0,0 @@ -/****************************************************************************** - * - * Name: acconfig.h - Global configuration constants - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _ACCONFIG_H -#define _ACCONFIG_H - - -/****************************************************************************** - * - * Compile-time options - * - *****************************************************************************/ - -/* - * ACPI_DEBUG - This switch enables all the debug facilities of the ACPI - * subsystem. This includes the DEBUG_PRINT output statements - * When disabled, all DEBUG_PRINT statements are compiled out. - * - * ACPI_APPLICATION - Use this switch if the subsystem is going to be run - * at the application level. - * - */ - - -/****************************************************************************** - * - * Subsystem Constants - * - *****************************************************************************/ - - -/* Version string */ - -#define ACPI_CA_VERSION 0x20010313 - - -/* Maximum objects in the various object caches */ - -#define MAX_STATE_CACHE_DEPTH 64 /* State objects for stacks */ -#define MAX_PARSE_CACHE_DEPTH 96 /* Parse tree objects */ -#define MAX_EXTPARSE_CACHE_DEPTH 64 /* Parse tree objects */ -#define MAX_OBJECT_CACHE_DEPTH 64 /* Interpreter operand objects */ -#define MAX_WALK_CACHE_DEPTH 2 /* Objects for parse tree walks (method execution) */ - - -/* String size constants */ - -#define MAX_STRING_LENGTH 512 -#define PATHNAME_MAX 256 /* A full namespace pathname */ - - -/* Maximum count for a semaphore object */ - -#define MAX_SEMAPHORE_COUNT 256 - - -/* Max reference count (for debug only) */ - -#define MAX_REFERENCE_COUNT 0x200 - - -/* Size of cached memory mapping for system memory operation region */ - -#define SYSMEM_REGION_WINDOW_SIZE 4096 - - -/* - * Debugger threading model - * Use single threaded if the entire subsystem is contained in an application - * Use multiple threaded when the subsystem is running in the kernel. - * - * By default the model is single threaded if ACPI_APPLICATION is set, - * multi-threaded if ACPI_APPLICATION is not set. - */ - -#define DEBUGGER_SINGLE_THREADED 0 -#define DEBUGGER_MULTI_THREADED 1 - -#ifdef ACPI_APPLICATION -#define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED - -#else -#define DEBUGGER_THREADING DEBUGGER_MULTI_THREADED -#endif - - -/****************************************************************************** - * - * ACPI Specification constants (Do not change unless the specification changes) - * - *****************************************************************************/ - -/* - * Method info (in WALK_STATE), containing local variables and argumetns - */ - -#define MTH_NUM_LOCALS 8 -#define MTH_MAX_LOCAL 7 - -#define MTH_NUM_ARGS 7 -#define MTH_MAX_ARG 6 - -/* Maximum length of resulting string when converting from a buffer */ - -#define ACPI_MAX_STRING_CONVERSION 200 - -/* - * Operand Stack (in WALK_STATE), Must be large enough to contain MTH_MAX_ARG - */ - -#define OBJ_NUM_OPERANDS 8 -#define OBJ_MAX_OPERAND 7 - -/* Names within the namespace are 4 bytes long */ - -#define ACPI_NAME_SIZE 4 -#define PATH_SEGMENT_LENGTH 5 /* 4 chars for name + 1 s8 for separator */ -#define PATH_SEPARATOR '.' - - -/* Constants used in searching for the RSDP in low memory */ - -#define LO_RSDP_WINDOW_BASE 0 /* Physical Address */ -#define HI_RSDP_WINDOW_BASE 0xE0000 /* Physical Address */ -#define LO_RSDP_WINDOW_SIZE 0x400 -#define HI_RSDP_WINDOW_SIZE 0x20000 -#define RSDP_SCAN_STEP 16 - -#endif /* _ACCONFIG_H */ - diff --git a/reactos/drivers/bus/acpi/include/acdebug.h b/reactos/drivers/bus/acpi/include/acdebug.h deleted file mode 100644 index 3694f51b691..00000000000 --- a/reactos/drivers/bus/acpi/include/acdebug.h +++ /dev/null @@ -1,411 +0,0 @@ -/****************************************************************************** - * - * Name: acdebug.h - ACPI/AML debugger - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACDEBUG_H__ -#define __ACDEBUG_H__ - - -#define DB_MAX_ARGS 8 /* Must be max method args + 1 */ - -#define DB_COMMAND_PROMPT '-' -#define DB_EXECUTE_PROMPT '%' - - -extern int optind; -extern NATIVE_CHAR *optarg; -extern u8 *aml_ptr; -extern u32 acpi_aml_length; - -extern u8 opt_tables; -extern u8 opt_disasm; -extern u8 opt_stats; -extern u8 opt_parse_jit; -extern u8 opt_verbose; -extern u8 opt_ini_methods; - - -extern NATIVE_CHAR *args[DB_MAX_ARGS]; -extern NATIVE_CHAR line_buf[80]; -extern NATIVE_CHAR scope_buf[40]; -extern NATIVE_CHAR debug_filename[40]; -extern u8 output_to_file; -extern NATIVE_CHAR *buffer; -extern NATIVE_CHAR *filename; -extern NATIVE_CHAR *INDENT_STRING; -extern u8 acpi_gbl_db_output_flags; -extern u32 acpi_gbl_db_debug_level; -extern u32 acpi_gbl_db_console_debug_level; - -extern u32 num_names; -extern u32 num_methods; -extern u32 num_regions; -extern u32 num_packages; -extern u32 num_aliases; -extern u32 num_devices; -extern u32 num_field_defs; -extern u32 num_thermal_zones; -extern u32 num_nodes; -extern u32 num_grammar_elements; -extern u32 num_method_elements ; -extern u32 num_mutexes; -extern u32 num_power_resources; -extern u32 num_bank_fields ; -extern u32 num_index_fields; -extern u32 num_events; - -extern u32 size_of_parse_tree; -extern u32 size_of_method_trees; -extern u32 size_of_nTes; -extern u32 size_of_acpi_objects; - - -#define BUFFER_SIZE 4196 - -#define DB_REDIRECTABLE_OUTPUT 0x01 -#define DB_CONSOLE_OUTPUT 0x02 -#define DB_DUPLICATE_OUTPUT 0x03 - - -typedef struct command_info -{ - NATIVE_CHAR *name; /* Command Name */ - u8 min_args; /* Minimum arguments required */ - -} COMMAND_INFO; - - -typedef struct argument_info -{ - NATIVE_CHAR *name; /* Argument Name */ - -} ARGUMENT_INFO; - - -#define PARAM_LIST(pl) pl - -#define DBTEST_OUTPUT_LEVEL(lvl) if (opt_verbose) - -#define VERBOSE_PRINT(fp) DBTEST_OUTPUT_LEVEL(lvl) {\ - acpi_os_printf PARAM_LIST(fp);} - -#define EX_NO_SINGLE_STEP 1 -#define EX_SINGLE_STEP 2 - - -/* Prototypes */ - - -/* - * dbapi - external debugger interfaces - */ - -int -acpi_db_initialize ( - void); - -ACPI_STATUS -acpi_db_single_step ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op, - u8 op_type); - - -/* - * dbcmds - debug commands and output routines - */ - - -void -acpi_db_display_table_info ( - NATIVE_CHAR *table_arg); - -void -acpi_db_unload_acpi_table ( - NATIVE_CHAR *table_arg, - NATIVE_CHAR *instance_arg); - -void -acpi_db_set_method_breakpoint ( - NATIVE_CHAR *location, - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op); - -void -acpi_db_set_method_call_breakpoint ( - ACPI_PARSE_OBJECT *op); - -void -acpi_db_disassemble_aml ( - NATIVE_CHAR *statements, - ACPI_PARSE_OBJECT *op); - -void -acpi_db_dump_namespace ( - NATIVE_CHAR *start_arg, - NATIVE_CHAR *depth_arg); - -void -acpi_db_dump_namespace_by_owner ( - NATIVE_CHAR *owner_arg, - NATIVE_CHAR *depth_arg); - -void -acpi_db_send_notify ( - NATIVE_CHAR *name, - u32 value); - -void -acpi_db_set_method_data ( - NATIVE_CHAR *type_arg, - NATIVE_CHAR *index_arg, - NATIVE_CHAR *value_arg); - -ACPI_STATUS -acpi_db_display_objects ( - NATIVE_CHAR *obj_type_arg, - NATIVE_CHAR *display_count_arg); - -ACPI_STATUS -acpi_db_find_name_in_namespace ( - NATIVE_CHAR *name_arg); - -void -acpi_db_set_scope ( - NATIVE_CHAR *name); - -void -acpi_db_find_references ( - NATIVE_CHAR *object_arg); - -void -acpi_db_display_locks (void); - - -void -acpi_db_display_resources ( - NATIVE_CHAR *object_arg); - - -/* - * dbdisasm - AML disassembler - */ - -void -acpi_db_display_op ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *origin, - u32 num_opcodes); - -void -acpi_db_display_namestring ( - NATIVE_CHAR *name); - -void -acpi_db_display_path ( - ACPI_PARSE_OBJECT *op); - -void -acpi_db_display_opcode ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op); - -void -acpi_db_decode_internal_object ( - ACPI_OPERAND_OBJECT *obj_desc); - - -/* - * dbdisply - debug display commands - */ - - -void -acpi_db_display_method_info ( - ACPI_PARSE_OBJECT *op); - -void -acpi_db_decode_and_display_object ( - NATIVE_CHAR *target, - NATIVE_CHAR *output_type); - -void -acpi_db_display_result_object ( - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_db_display_all_methods ( - NATIVE_CHAR *display_count_arg); - -void -acpi_db_display_internal_object ( - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_WALK_STATE *walk_state); - -void -acpi_db_display_arguments ( - void); - -void -acpi_db_display_locals ( - void); - -void -acpi_db_display_results ( - void); - -void -acpi_db_display_calling_tree ( - void); - -void -acpi_db_display_argument_object ( - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_WALK_STATE *walk_state); - - -/* - * dbexec - debugger control method execution - */ - -void -acpi_db_execute ( - NATIVE_CHAR *name, - NATIVE_CHAR **args, - u32 flags); - -void -acpi_db_create_execution_threads ( - NATIVE_CHAR *num_threads_arg, - NATIVE_CHAR *num_loops_arg, - NATIVE_CHAR *method_name_arg); - - -/* - * dbfileio - Debugger file I/O commands - */ - -OBJECT_TYPE_INTERNAL -acpi_db_match_argument ( - NATIVE_CHAR *user_argument, - ARGUMENT_INFO *arguments); - - -void -acpi_db_close_debug_file ( - void); - -void -acpi_db_open_debug_file ( - NATIVE_CHAR *name); - -ACPI_STATUS -acpi_db_load_acpi_table ( - NATIVE_CHAR *filename); - - -/* - * dbhistry - debugger HISTORY command - */ - -void -acpi_db_add_to_history ( - NATIVE_CHAR *command_line); - -void -acpi_db_display_history (void); - -NATIVE_CHAR * -acpi_db_get_from_history ( - NATIVE_CHAR *command_num_arg); - - -/* - * dbinput - user front-end to the AML debugger - */ - -ACPI_STATUS -acpi_db_command_dispatch ( - NATIVE_CHAR *input_buffer, - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op); - -void -acpi_db_execute_thread ( - void *context); - -ACPI_STATUS -acpi_db_user_commands ( - NATIVE_CHAR prompt, - ACPI_PARSE_OBJECT *op); - - -/* - * dbstats - Generation and display of ACPI table statistics - */ - -void -acpi_db_generate_statistics ( - ACPI_PARSE_OBJECT *root, - u8 is_method); - - -ACPI_STATUS -acpi_db_display_statistics ( - NATIVE_CHAR *type_arg); - - -/* - * dbutils - AML debugger utilities - */ - -void -acpi_db_set_output_destination ( - u32 where); - -void -acpi_db_dump_buffer ( - u32 address); - -void -acpi_db_dump_object ( - ACPI_OBJECT *obj_desc, - u32 level); - -void -acpi_db_prep_namestring ( - NATIVE_CHAR *name); - - -ACPI_STATUS -acpi_db_second_pass_parse ( - ACPI_PARSE_OBJECT *root); - -ACPI_NAMESPACE_NODE * -acpi_db_local_ns_lookup ( - NATIVE_CHAR *name); - - -#endif /* __ACDEBUG_H__ */ diff --git a/reactos/drivers/bus/acpi/include/acdispat.h b/reactos/drivers/bus/acpi/include/acdispat.h deleted file mode 100644 index ab792298d44..00000000000 --- a/reactos/drivers/bus/acpi/include/acdispat.h +++ /dev/null @@ -1,450 +0,0 @@ -/****************************************************************************** - * - * Name: acdispat.h - dispatcher (parser to interpreter interface) - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#ifndef _ACDISPAT_H_ -#define _ACDISPAT_H_ - - -#define NAMEOF_LOCAL_NTE "__L0" -#define NAMEOF_ARG_NTE "__A0" - - -/* Common interfaces */ - -ACPI_STATUS -acpi_ds_obj_stack_push ( - void *object, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_obj_stack_pop ( - u32 pop_count, - ACPI_WALK_STATE *walk_state); - -void * -acpi_ds_obj_stack_get_value ( - u32 index, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_obj_stack_pop_object ( - ACPI_OPERAND_OBJECT **object, - ACPI_WALK_STATE *walk_state); - - -/* dsopcode - support for late evaluation */ - -ACPI_STATUS -acpi_ds_get_field_unit_arguments ( - ACPI_OPERAND_OBJECT *obj_desc); - -ACPI_STATUS -acpi_ds_get_region_arguments ( - ACPI_OPERAND_OBJECT *rgn_desc); - - -/* dsctrl - Parser/Interpreter interface, control stack routines */ - - -ACPI_STATUS -acpi_ds_exec_begin_control_op ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op); - -ACPI_STATUS -acpi_ds_exec_end_control_op ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op); - - -/* dsexec - Parser/Interpreter interface, method execution callbacks */ - - -ACPI_STATUS -acpi_ds_get_predicate_value ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op, - NATIVE_UINT has_result_obj); - -ACPI_STATUS -acpi_ds_exec_begin_op ( - u16 opcode, - ACPI_PARSE_OBJECT *op, - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT **out_op); - -ACPI_STATUS -acpi_ds_exec_end_op ( - ACPI_WALK_STATE *state, - ACPI_PARSE_OBJECT *op); - - -/* dsfield - Parser/Interpreter interface for AML fields */ - - -ACPI_STATUS -acpi_ds_create_field ( - ACPI_PARSE_OBJECT *op, - ACPI_NAMESPACE_NODE *region_node, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_create_bank_field ( - ACPI_PARSE_OBJECT *op, - ACPI_NAMESPACE_NODE *region_node, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_create_index_field ( - ACPI_PARSE_OBJECT *op, - ACPI_HANDLE region_node, - ACPI_WALK_STATE *walk_state); - - -/* dsload - Parser/Interpreter interface, namespace load callbacks */ - -ACPI_STATUS -acpi_ds_load1_begin_op ( - u16 opcode, - ACPI_PARSE_OBJECT *op, - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT **out_op); - -ACPI_STATUS -acpi_ds_load1_end_op ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op); - -ACPI_STATUS -acpi_ds_load2_begin_op ( - u16 opcode, - ACPI_PARSE_OBJECT *op, - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT **out_op); - -ACPI_STATUS -acpi_ds_load2_end_op ( - ACPI_WALK_STATE *state, - ACPI_PARSE_OBJECT *op); - -ACPI_STATUS -acpi_ds_load3_begin_op ( - u16 opcode, - ACPI_PARSE_OBJECT *op, - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT **out_op); - -ACPI_STATUS -acpi_ds_load3_end_op ( - ACPI_WALK_STATE *state, - ACPI_PARSE_OBJECT *op); - - -/* dsmthdat - method data (locals/args) */ - - -ACPI_STATUS -acpi_ds_store_object_to_local ( - u16 opcode, - u32 index, - ACPI_OPERAND_OBJECT *src_desc, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_method_data_get_entry ( - u16 opcode, - u32 index, - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT ***node); - -ACPI_STATUS -acpi_ds_method_data_delete_all ( - ACPI_WALK_STATE *walk_state); - -u8 -acpi_ds_is_method_value ( - ACPI_OPERAND_OBJECT *obj_desc); - -OBJECT_TYPE_INTERNAL -acpi_ds_method_data_get_type ( - u16 opcode, - u32 index, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_method_data_get_value ( - u16 opcode, - u32 index, - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **dest_desc); - -ACPI_STATUS -acpi_ds_method_data_delete_value ( - u16 opcode, - u32 index, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_method_data_init_args ( - ACPI_OPERAND_OBJECT **params, - u32 max_param_count, - ACPI_WALK_STATE *walk_state); - -ACPI_NAMESPACE_NODE * -acpi_ds_method_data_get_node ( - u16 opcode, - u32 index, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_method_data_init ( - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_method_data_set_entry ( - u16 opcode, - u32 index, - ACPI_OPERAND_OBJECT *object, - ACPI_WALK_STATE *walk_state); - - -/* dsmethod - Parser/Interpreter interface - control method parsing */ - -ACPI_STATUS -acpi_ds_parse_method ( - ACPI_HANDLE obj_handle); - -ACPI_STATUS -acpi_ds_call_control_method ( - ACPI_WALK_LIST *walk_list, - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op); - -ACPI_STATUS -acpi_ds_restart_control_method ( - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT *return_desc); - -ACPI_STATUS -acpi_ds_terminate_control_method ( - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_begin_method_execution ( - ACPI_NAMESPACE_NODE *method_node, - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_NAMESPACE_NODE *calling_method_node); - - -/* dsobj - Parser/Interpreter interface - object initialization and conversion */ - -ACPI_STATUS -acpi_ds_init_one_object ( - ACPI_HANDLE obj_handle, - u32 level, - void *context, - void **return_value); - -ACPI_STATUS -acpi_ds_initialize_objects ( - ACPI_TABLE_DESC *table_desc, - ACPI_NAMESPACE_NODE *start_node); - -ACPI_STATUS -acpi_ds_build_internal_package_obj ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op, - ACPI_OPERAND_OBJECT **obj_desc); - -ACPI_STATUS -acpi_ds_build_internal_object ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op, - ACPI_OPERAND_OBJECT **obj_desc_ptr); - -ACPI_STATUS -acpi_ds_init_object_from_op ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op, - u16 opcode, - ACPI_OPERAND_OBJECT **obj_desc); - -ACPI_STATUS -acpi_ds_create_node ( - ACPI_WALK_STATE *walk_state, - ACPI_NAMESPACE_NODE *node, - ACPI_PARSE_OBJECT *op); - - -/* dsregn - Parser/Interpreter interface - Op Region parsing */ - -ACPI_STATUS -acpi_ds_eval_field_unit_operands ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op); - -ACPI_STATUS -acpi_ds_eval_region_operands ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op); - -ACPI_STATUS -acpi_ds_initialize_region ( - ACPI_HANDLE obj_handle); - - -/* dsutils - Parser/Interpreter interface utility routines */ - -u8 -acpi_ds_is_result_used ( - ACPI_PARSE_OBJECT *op, - ACPI_WALK_STATE *walk_state); - -void -acpi_ds_delete_result_if_not_used ( - ACPI_PARSE_OBJECT *op, - ACPI_OPERAND_OBJECT *result_obj, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_create_operand ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *arg, - u32 args_remaining); - -ACPI_STATUS -acpi_ds_create_operands ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *first_arg); - -ACPI_STATUS -acpi_ds_resolve_operands ( - ACPI_WALK_STATE *walk_state); - -OBJECT_TYPE_INTERNAL -acpi_ds_map_opcode_to_data_type ( - u16 opcode, - u32 *out_flags); - -OBJECT_TYPE_INTERNAL -acpi_ds_map_named_opcode_to_data_type ( - u16 opcode); - - -/* - * dswscope - Scope Stack manipulation - */ - -ACPI_STATUS -acpi_ds_scope_stack_push ( - ACPI_NAMESPACE_NODE *node, - OBJECT_TYPE_INTERNAL type, - ACPI_WALK_STATE *walk_state); - - -ACPI_STATUS -acpi_ds_scope_stack_pop ( - ACPI_WALK_STATE *walk_state); - -void -acpi_ds_scope_stack_clear ( - ACPI_WALK_STATE *walk_state); - - -/* Acpi_dswstate - parser WALK_STATE management routines */ - -ACPI_WALK_STATE * -acpi_ds_create_walk_state ( - ACPI_OWNER_ID owner_id, - ACPI_PARSE_OBJECT *origin, - ACPI_OPERAND_OBJECT *mth_desc, - ACPI_WALK_LIST *walk_list); - -ACPI_STATUS -acpi_ds_obj_stack_delete_all ( - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_obj_stack_pop_and_delete ( - u32 pop_count, - ACPI_WALK_STATE *walk_state); - -void -acpi_ds_delete_walk_state ( - ACPI_WALK_STATE *walk_state); - -ACPI_WALK_STATE * -acpi_ds_pop_walk_state ( - ACPI_WALK_LIST *walk_list); - -ACPI_STATUS -acpi_ds_result_stack_pop ( - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_result_stack_push ( - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_result_stack_clear ( - ACPI_WALK_STATE *walk_state); - -ACPI_WALK_STATE * -acpi_ds_get_current_walk_state ( - ACPI_WALK_LIST *walk_list); - -void -acpi_ds_delete_walk_state_cache ( - void); - -ACPI_STATUS -acpi_ds_result_insert ( - void *object, - u32 index, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_result_remove ( - ACPI_OPERAND_OBJECT **object, - u32 index, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_result_pop ( - ACPI_OPERAND_OBJECT **object, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_result_push ( - ACPI_OPERAND_OBJECT *object, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ds_result_pop_from_bottom ( - ACPI_OPERAND_OBJECT **object, - ACPI_WALK_STATE *walk_state); - -#endif /* _ACDISPAT_H_ */ diff --git a/reactos/drivers/bus/acpi/include/acevents.h b/reactos/drivers/bus/acpi/include/acevents.h deleted file mode 100644 index 4f54d645a4c..00000000000 --- a/reactos/drivers/bus/acpi/include/acevents.h +++ /dev/null @@ -1,203 +0,0 @@ -/****************************************************************************** - * - * Name: acevents.h - Event subcomponent prototypes and defines - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACEVENTS_H__ -#define __ACEVENTS_H__ - - -ACPI_STATUS -acpi_ev_initialize ( - void); - - -/* - * Acpi_evfixed - Fixed event handling - */ - -ACPI_STATUS -acpi_ev_fixed_event_initialize ( - void); - -u32 -acpi_ev_fixed_event_detect ( - void); - -u32 -acpi_ev_fixed_event_dispatch ( - u32 acpi_event); - - -/* - * Acpi_evglock - Global Lock support - */ - -ACPI_STATUS -acpi_ev_acquire_global_lock( - void); - -void -acpi_ev_release_global_lock( - void); - -ACPI_STATUS -acpi_ev_init_global_lock_handler ( - void); - - -/* - * Acpi_evgpe - GPE handling and dispatch - */ - -ACPI_STATUS -acpi_ev_gpe_initialize ( - void); - -ACPI_STATUS -acpi_ev_init_gpe_control_methods ( - void); - -u32 -acpi_ev_gpe_dispatch ( - u32 gpe_number); - -u32 -acpi_ev_gpe_detect ( - void); - - -/* - * Acpi_evnotify - Device Notify handling and dispatch - */ - -ACPI_STATUS -acpi_ev_queue_notify_request ( - ACPI_NAMESPACE_NODE *node, - u32 notify_value); - -void -acpi_ev_notify_dispatch ( - void *context); - -/* - * Acpi_evregion - Address Space handling - */ - -ACPI_STATUS -acpi_ev_install_default_address_space_handlers ( - void); - -ACPI_STATUS -acpi_ev_address_space_dispatch ( - ACPI_OPERAND_OBJECT *region_obj, - u32 function, - ACPI_PHYSICAL_ADDRESS address, - u32 bit_width, - u32 *value); - - -ACPI_STATUS -acpi_ev_addr_handler_helper ( - ACPI_HANDLE obj_handle, - u32 level, - void *context, - void **return_value); - -void -acpi_ev_disassociate_region_from_handler( - ACPI_OPERAND_OBJECT *region_obj, - u8 acpi_ns_is_locked); - - -ACPI_STATUS -acpi_ev_associate_region_and_handler ( - ACPI_OPERAND_OBJECT *handler_obj, - ACPI_OPERAND_OBJECT *region_obj, - u8 acpi_ns_is_locked); - - -/* - * Acpi_evregini - Region initialization and setup - */ - -ACPI_STATUS -acpi_ev_system_memory_region_setup ( - ACPI_HANDLE handle, - u32 function, - void *handler_context, - void **region_context); - -ACPI_STATUS -acpi_ev_io_space_region_setup ( - ACPI_HANDLE handle, - u32 function, - void *handler_context, - void **region_context); - -ACPI_STATUS -acpi_ev_pci_config_region_setup ( - ACPI_HANDLE handle, - u32 function, - void *handler_context, - void **region_context); - -ACPI_STATUS -acpi_ev_default_region_setup ( - ACPI_HANDLE handle, - u32 function, - void *handler_context, - void **region_context); - -ACPI_STATUS -acpi_ev_initialize_region ( - ACPI_OPERAND_OBJECT *region_obj, - u8 acpi_ns_locked); - - -/* - * Evsci - SCI (System Control Interrupt) handling/dispatch - */ - -u32 -acpi_ev_install_sci_handler ( - void); - -ACPI_STATUS -acpi_ev_remove_sci_handler ( - void); - -u32 -acpi_ev_initialize_sCI ( - u32 program_sCI); - -void -acpi_ev_restore_acpi_state ( - void); - -void -acpi_ev_terminate ( - void); - - -#endif /* __ACEVENTS_H__ */ diff --git a/reactos/drivers/bus/acpi/include/acexcep.h b/reactos/drivers/bus/acpi/include/acexcep.h deleted file mode 100644 index 82089e31079..00000000000 --- a/reactos/drivers/bus/acpi/include/acexcep.h +++ /dev/null @@ -1,150 +0,0 @@ -/****************************************************************************** - * - * Name: acexcep.h - Exception codes returned by the ACPI subsystem - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACEXCEP_H__ -#define __ACEXCEP_H__ - - -/* - * Exceptions returned by external ACPI interfaces - */ - -#define AE_CODE_ENVIRONMENTAL 0x0000 -#define AE_CODE_PROGRAMMER 0x1000 -#define AE_CODE_ACPI_TABLES 0x2000 -#define AE_CODE_AML 0x3000 -#define AE_CODE_CONTROL 0x4000 -#define AE_CODE_MASK 0xF000 - - -#define ACPI_SUCCESS(a) (!(a)) -#define ACPI_FAILURE(a) (a) - - -#define AE_OK (ACPI_STATUS) 0x0000 - -/* - * Environmental exceptions - */ -#define AE_ERROR (ACPI_STATUS) (0x0001 | AE_CODE_ENVIRONMENTAL) -#define AE_NO_ACPI_TABLES (ACPI_STATUS) (0x0002 | AE_CODE_ENVIRONMENTAL) -#define AE_NO_NAMESPACE (ACPI_STATUS) (0x0003 | AE_CODE_ENVIRONMENTAL) -#define AE_NO_MEMORY (ACPI_STATUS) (0x0004 | AE_CODE_ENVIRONMENTAL) -#define AE_NOT_FOUND (ACPI_STATUS) (0x0005 | AE_CODE_ENVIRONMENTAL) -#define AE_NOT_EXIST (ACPI_STATUS) (0x0006 | AE_CODE_ENVIRONMENTAL) -#define AE_EXIST (ACPI_STATUS) (0x0007 | AE_CODE_ENVIRONMENTAL) -#define AE_TYPE (ACPI_STATUS) (0x0008 | AE_CODE_ENVIRONMENTAL) -#define AE_NULL_OBJECT (ACPI_STATUS) (0x0009 | AE_CODE_ENVIRONMENTAL) -#define AE_NULL_ENTRY (ACPI_STATUS) (0x000A | AE_CODE_ENVIRONMENTAL) -#define AE_BUFFER_OVERFLOW (ACPI_STATUS) (0x000B | AE_CODE_ENVIRONMENTAL) -#define AE_STACK_OVERFLOW (ACPI_STATUS) (0x000C | AE_CODE_ENVIRONMENTAL) -#define AE_STACK_UNDERFLOW (ACPI_STATUS) (0x000D | AE_CODE_ENVIRONMENTAL) -#define AE_NOT_IMPLEMENTED (ACPI_STATUS) (0x000E | AE_CODE_ENVIRONMENTAL) -#define AE_VERSION_MISMATCH (ACPI_STATUS) (0x000F | AE_CODE_ENVIRONMENTAL) -#define AE_SUPPORT (ACPI_STATUS) (0x0010 | AE_CODE_ENVIRONMENTAL) -#define AE_SHARE (ACPI_STATUS) (0x0011 | AE_CODE_ENVIRONMENTAL) -#define AE_LIMIT (ACPI_STATUS) (0x0012 | AE_CODE_ENVIRONMENTAL) -#define AE_TIME (ACPI_STATUS) (0x0013 | AE_CODE_ENVIRONMENTAL) -#define AE_UNKNOWN_STATUS (ACPI_STATUS) (0x0014 | AE_CODE_ENVIRONMENTAL) -#define AE_ACQUIRE_DEADLOCK (ACPI_STATUS) (0x0015 | AE_CODE_ENVIRONMENTAL) -#define AE_RELEASE_DEADLOCK (ACPI_STATUS) (0x0016 | AE_CODE_ENVIRONMENTAL) -#define AE_NOT_ACQUIRED (ACPI_STATUS) (0x0017 | AE_CODE_ENVIRONMENTAL) -#define AE_ALREADY_ACQUIRED (ACPI_STATUS) (0x0018 | AE_CODE_ENVIRONMENTAL) -#define AE_NO_HARDWARE_RESPONSE (ACPI_STATUS) (0x0019 | AE_CODE_ENVIRONMENTAL) -#define AE_NO_GLOBAL_LOCK (ACPI_STATUS) (0x001A | AE_CODE_ENVIRONMENTAL) - -#define AE_CODE_ENV_MAX 0x001A - -/* - * Programmer exceptions - */ -#define AE_BAD_PARAMETER (ACPI_STATUS) (0x0001 | AE_CODE_PROGRAMMER) -#define AE_BAD_CHARACTER (ACPI_STATUS) (0x0002 | AE_CODE_PROGRAMMER) -#define AE_BAD_PATHNAME (ACPI_STATUS) (0x0003 | AE_CODE_PROGRAMMER) -#define AE_BAD_DATA (ACPI_STATUS) (0x0004 | AE_CODE_PROGRAMMER) -#define AE_BAD_ADDRESS (ACPI_STATUS) (0x0005 | AE_CODE_PROGRAMMER) - -#define AE_CODE_PGM_MAX 0x0005 - - -/* - * Acpi table exceptions - */ -#define AE_BAD_SIGNATURE (ACPI_STATUS) (0x0001 | AE_CODE_ACPI_TABLES) -#define AE_BAD_HEADER (ACPI_STATUS) (0x0002 | AE_CODE_ACPI_TABLES) -#define AE_BAD_CHECKSUM (ACPI_STATUS) (0x0003 | AE_CODE_ACPI_TABLES) -#define AE_BAD_VALUE (ACPI_STATUS) (0x0004 | AE_CODE_ACPI_TABLES) - -#define AE_CODE_TBL_MAX 0x0003 - - -/* - * AML exceptions. These are caused by problems with - * the actual AML byte stream - */ -#define AE_AML_ERROR (ACPI_STATUS) (0x0001 | AE_CODE_AML) -#define AE_AML_PARSE (ACPI_STATUS) (0x0002 | AE_CODE_AML) -#define AE_AML_BAD_OPCODE (ACPI_STATUS) (0x0003 | AE_CODE_AML) -#define AE_AML_NO_OPERAND (ACPI_STATUS) (0x0004 | AE_CODE_AML) -#define AE_AML_OPERAND_TYPE (ACPI_STATUS) (0x0005 | AE_CODE_AML) -#define AE_AML_OPERAND_VALUE (ACPI_STATUS) (0x0006 | AE_CODE_AML) -#define AE_AML_UNINITIALIZED_LOCAL (ACPI_STATUS) (0x0007 | AE_CODE_AML) -#define AE_AML_UNINITIALIZED_ARG (ACPI_STATUS) (0x0008 | AE_CODE_AML) -#define AE_AML_UNINITIALIZED_ELEMENT (ACPI_STATUS) (0x0009 | AE_CODE_AML) -#define AE_AML_NUMERIC_OVERFLOW (ACPI_STATUS) (0x000A | AE_CODE_AML) -#define AE_AML_REGION_LIMIT (ACPI_STATUS) (0x000B | AE_CODE_AML) -#define AE_AML_BUFFER_LIMIT (ACPI_STATUS) (0x000C | AE_CODE_AML) -#define AE_AML_PACKAGE_LIMIT (ACPI_STATUS) (0x000D | AE_CODE_AML) -#define AE_AML_DIVIDE_BY_ZERO (ACPI_STATUS) (0x000E | AE_CODE_AML) -#define AE_AML_BAD_NAME (ACPI_STATUS) (0x000F | AE_CODE_AML) -#define AE_AML_NAME_NOT_FOUND (ACPI_STATUS) (0x0010 | AE_CODE_AML) -#define AE_AML_INTERNAL (ACPI_STATUS) (0x0011 | AE_CODE_AML) -#define AE_AML_INVALID_SPACE_ID (ACPI_STATUS) (0x0012 | AE_CODE_AML) -#define AE_AML_STRING_LIMIT (ACPI_STATUS) (0x0013 | AE_CODE_AML) -#define AE_AML_NO_RETURN_VALUE (ACPI_STATUS) (0x0014 | AE_CODE_AML) -#define AE_AML_METHOD_LIMIT (ACPI_STATUS) (0x0015 | AE_CODE_AML) -#define AE_AML_NOT_OWNER (ACPI_STATUS) (0x0016 | AE_CODE_AML) -#define AE_AML_MUTEX_ORDER (ACPI_STATUS) (0x0017 | AE_CODE_AML) -#define AE_AML_MUTEX_NOT_ACQUIRED (ACPI_STATUS) (0x0018 | AE_CODE_AML) - -#define AE_CODE_AML_MAX 0x0018 - -/* - * Internal exceptions used for control - */ -#define AE_CTRL_RETURN_VALUE (ACPI_STATUS) (0x0001 | AE_CODE_CONTROL) -#define AE_CTRL_PENDING (ACPI_STATUS) (0x0002 | AE_CODE_CONTROL) -#define AE_CTRL_TERMINATE (ACPI_STATUS) (0x0003 | AE_CODE_CONTROL) -#define AE_CTRL_TRUE (ACPI_STATUS) (0x0004 | AE_CODE_CONTROL) -#define AE_CTRL_FALSE (ACPI_STATUS) (0x0005 | AE_CODE_CONTROL) -#define AE_CTRL_DEPTH (ACPI_STATUS) (0x0006 | AE_CODE_CONTROL) -#define AE_CTRL_END (ACPI_STATUS) (0x0007 | AE_CODE_CONTROL) -#define AE_CTRL_TRANSFER (ACPI_STATUS) (0x0008 | AE_CODE_CONTROL) - -#define AE_CODE_CTRL_MAX 0x0008 - - - -#endif /* __ACEXCEP_H__ */ diff --git a/reactos/drivers/bus/acpi/include/acglobal.h b/reactos/drivers/bus/acpi/include/acglobal.h deleted file mode 100644 index 92446bef0e5..00000000000 --- a/reactos/drivers/bus/acpi/include/acglobal.h +++ /dev/null @@ -1,301 +0,0 @@ -/****************************************************************************** - * - * Name: acglobal.h - Declarations for global variables - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACGLOBAL_H__ -#define __ACGLOBAL_H__ - - -/* - * Ensure that the globals are actually defined only once. - * - * The use of these defines allows a single list of globals (here) in order - * to simplify maintenance of the code. - */ -#ifdef DEFINE_ACPI_GLOBALS -#define ACPI_EXTERN -#else -#define ACPI_EXTERN extern -#endif - - -extern NATIVE_CHAR *msg_acpi_error_break; - -/***************************************************************************** - * - * Debug support - * - ****************************************************************************/ - -/* Runtime configuration of debug print levels */ - -extern u32 acpi_dbg_level; -extern u32 acpi_dbg_layer; - - -/* Procedure nesting level for debug output */ - -extern u32 acpi_gbl_nesting_level; - - -/***************************************************************************** - * - * ACPI Table globals - * - ****************************************************************************/ - -/* - * Table pointers. - * Although these pointers are somewhat redundant with the global Acpi_table, - * they are convenient because they are typed pointers. - * - * These tables are single-table only; meaning that there can be at most one - * of each in the system. Each global points to the actual table. - * - */ -ACPI_EXTERN RSDP_DESCRIPTOR *acpi_gbl_RSDP; -ACPI_EXTERN XSDT_DESCRIPTOR *acpi_gbl_XSDT; -ACPI_EXTERN FADT_DESCRIPTOR *acpi_gbl_FADT; -ACPI_EXTERN ACPI_TABLE_HEADER *acpi_gbl_DSDT; -ACPI_EXTERN ACPI_COMMON_FACS *acpi_gbl_FACS; - -/* - * Since there may be multiple SSDTs and PSDTS, a single pointer is not - * sufficient; Therefore, there isn't one! - */ - - -/* - * ACPI Table info arrays - */ -extern ACPI_TABLE_DESC acpi_gbl_acpi_tables[NUM_ACPI_TABLES]; -extern ACPI_TABLE_SUPPORT acpi_gbl_acpi_table_data[NUM_ACPI_TABLES]; - -/* - * Predefined mutex objects. This array contains the - * actual OS mutex handles, indexed by the local ACPI_MUTEX_HANDLEs. - * (The table maps local handles to the real OS handles) - */ -ACPI_EXTERN ACPI_MUTEX_INFO acpi_gbl_acpi_mutex_info [NUM_MTX]; - - -/***************************************************************************** - * - * Miscellaneous globals - * - ****************************************************************************/ - - -ACPI_EXTERN u8 *acpi_gbl_gpe0enable_register_save; -ACPI_EXTERN u8 *acpi_gbl_gpe1_enable_register_save; -ACPI_EXTERN ACPI_WALK_STATE *acpi_gbl_breakpoint_walk; -ACPI_EXTERN ACPI_GENERIC_STATE *acpi_gbl_generic_state_cache; -ACPI_EXTERN ACPI_PARSE_OBJECT *acpi_gbl_parse_cache; -ACPI_EXTERN ACPI_PARSE2_OBJECT *acpi_gbl_ext_parse_cache; -ACPI_EXTERN ACPI_OPERAND_OBJECT *acpi_gbl_object_cache; -ACPI_EXTERN ACPI_WALK_STATE *acpi_gbl_walk_state_cache; -ACPI_EXTERN ACPI_HANDLE acpi_gbl_global_lock_semaphore; - - -ACPI_EXTERN u32 acpi_gbl_global_lock_thread_count; -ACPI_EXTERN u32 acpi_gbl_restore_acpi_chipset; -ACPI_EXTERN u32 acpi_gbl_original_mode; -ACPI_EXTERN u32 acpi_gbl_edge_level_save; -ACPI_EXTERN u32 acpi_gbl_irq_enable_save; -ACPI_EXTERN u32 acpi_gbl_rsdp_original_location; - -ACPI_EXTERN u32 acpi_gbl_state_cache_requests; -ACPI_EXTERN u32 acpi_gbl_state_cache_hits; -ACPI_EXTERN u32 acpi_gbl_parse_cache_requests; -ACPI_EXTERN u32 acpi_gbl_parse_cache_hits; -ACPI_EXTERN u32 acpi_gbl_ext_parse_cache_requests; -ACPI_EXTERN u32 acpi_gbl_ext_parse_cache_hits; -ACPI_EXTERN u32 acpi_gbl_object_cache_requests; -ACPI_EXTERN u32 acpi_gbl_object_cache_hits; -ACPI_EXTERN u32 acpi_gbl_walk_state_cache_requests; -ACPI_EXTERN u32 acpi_gbl_walk_state_cache_hits; -ACPI_EXTERN u32 acpi_gbl_ns_lookup_count; -ACPI_EXTERN u32 acpi_gbl_ps_find_count; - - -ACPI_EXTERN u16 acpi_gbl_generic_state_cache_depth; -ACPI_EXTERN u16 acpi_gbl_parse_cache_depth; -ACPI_EXTERN u16 acpi_gbl_ext_parse_cache_depth; -ACPI_EXTERN u16 acpi_gbl_object_cache_depth; -ACPI_EXTERN u16 acpi_gbl_walk_state_cache_depth; -ACPI_EXTERN u16 acpi_gbl_pm1_enable_register_save; -ACPI_EXTERN u16 acpi_gbl_next_table_owner_id; -ACPI_EXTERN u16 acpi_gbl_next_method_owner_id; - -ACPI_EXTERN u8 acpi_gbl_debugger_configuration; -ACPI_EXTERN u8 acpi_gbl_global_lock_acquired; -ACPI_EXTERN u8 acpi_gbl_step_to_next_call; -ACPI_EXTERN u8 acpi_gbl_acpi_hardware_present; -ACPI_EXTERN u8 acpi_gbl_global_lock_present; - -ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER acpi_gbl_drv_notify; -ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER acpi_gbl_sys_notify; - - -extern u8 acpi_gbl_shutdown; -extern u32 acpi_gbl_system_flags; -extern u32 acpi_gbl_startup_flags; -extern u8 acpi_gbl_decode_to8bit[8]; -extern NATIVE_CHAR acpi_gbl_hex_to_ascii[16]; - - -/***************************************************************************** - * - * Namespace globals - * - ****************************************************************************/ - -#define NUM_NS_TYPES INTERNAL_TYPE_INVALID+1 -#define NUM_PREDEFINED_NAMES 9 - - -ACPI_EXTERN ACPI_NAMESPACE_NODE acpi_gbl_root_node_struct; -ACPI_EXTERN ACPI_NAMESPACE_NODE *acpi_gbl_root_node; - -extern u8 acpi_gbl_ns_properties[NUM_NS_TYPES]; -extern PREDEFINED_NAMES acpi_gbl_pre_defined_names [NUM_PREDEFINED_NAMES]; - - -/* Used to detect memory leaks (DEBUG ONLY) */ - -#ifdef ACPI_DEBUG -ACPI_EXTERN ALLOCATION_INFO *acpi_gbl_head_alloc_ptr; -ACPI_EXTERN ALLOCATION_INFO *acpi_gbl_tail_alloc_ptr; -#endif - - -/***************************************************************************** - * - * Interpreter globals - * - ****************************************************************************/ - - -ACPI_EXTERN ACPI_WALK_LIST *acpi_gbl_current_walk_list; - -/* - * Handle to the last method found - used during pass1 of load - */ -ACPI_EXTERN ACPI_HANDLE acpi_gbl_last_method; - -/* - * Table of Address Space handlers - */ - -ACPI_EXTERN ACPI_ADDRESS_SPACE_INFO acpi_gbl_address_spaces[ACPI_NUM_ADDRESS_SPACES]; - - -/* Control method single step flag */ - -ACPI_EXTERN u8 acpi_gbl_cm_single_step; - - -/***************************************************************************** - * - * Parser globals - * - ****************************************************************************/ - -ACPI_EXTERN ACPI_PARSE_OBJECT *acpi_gbl_parsed_namespace_root; - -/***************************************************************************** - * - * Hardware globals - * - ****************************************************************************/ - -extern ACPI_C_STATE_HANDLER acpi_hw_cx_handlers[MAX_CX_STATES]; -extern u32 acpi_hw_active_cx_state; - - -/***************************************************************************** - * - * Event globals - * - ****************************************************************************/ - -ACPI_EXTERN ACPI_FIXED_EVENT_INFO acpi_gbl_fixed_event_handlers[NUM_FIXED_EVENTS]; - -ACPI_EXTERN ACPI_HANDLE acpi_gbl_gpe_obj_handle; -ACPI_EXTERN u32 acpi_gbl_gpe_register_count; -ACPI_EXTERN ACPI_GPE_REGISTERS *acpi_gbl_gpe_registers; -ACPI_EXTERN ACPI_GPE_LEVEL_INFO *acpi_gbl_gpe_info; - -/* - * Gpe validation and translation table - * Indexed by the GPE number, returns GPE_INVALID if the GPE is not supported. - * Otherwise, returns a valid index into the global GPE table. - * - * This table is needed because the GPE numbers supported by block 1 do not - * have to be contiguous with the GPE numbers supported by block 0. - */ -ACPI_EXTERN u8 acpi_gbl_gpe_valid [NUM_GPE]; - -/* Acpi_event counter for debug only */ - -#ifdef ACPI_DEBUG -ACPI_EXTERN u32 acpi_gbl_event_count[NUM_FIXED_EVENTS]; -#endif - - -/***************************************************************************** - * - * Debugger globals - * - ****************************************************************************/ - -#ifdef ENABLE_DEBUGGER -ACPI_EXTERN u8 acpi_gbl_method_executing; -ACPI_EXTERN u8 acpi_gbl_db_terminate_threads; -#endif - -/* Memory allocation metrics - Debug Only! */ - -#ifdef ACPI_DEBUG - -ACPI_EXTERN u32 acpi_gbl_current_alloc_size; -ACPI_EXTERN u32 acpi_gbl_current_alloc_count; -ACPI_EXTERN u32 acpi_gbl_running_alloc_size; -ACPI_EXTERN u32 acpi_gbl_running_alloc_count; -ACPI_EXTERN u32 acpi_gbl_max_concurrent_alloc_size; -ACPI_EXTERN u32 acpi_gbl_max_concurrent_alloc_count; -ACPI_EXTERN u32 acpi_gbl_current_object_count; -ACPI_EXTERN u32 acpi_gbl_current_object_size; -ACPI_EXTERN u32 acpi_gbl_max_concurrent_object_count; -ACPI_EXTERN u32 acpi_gbl_max_concurrent_object_size; -ACPI_EXTERN u32 acpi_gbl_running_object_count; -ACPI_EXTERN u32 acpi_gbl_running_object_size; -ACPI_EXTERN u32 acpi_gbl_current_node_count; -ACPI_EXTERN u32 acpi_gbl_current_node_size; -ACPI_EXTERN u32 acpi_gbl_max_concurrent_node_count; - -#endif - - -#endif /* __ACGLOBAL_H__ */ diff --git a/reactos/drivers/bus/acpi/include/achware.h b/reactos/drivers/bus/acpi/include/achware.h deleted file mode 100644 index 412b91eb6a0..00000000000 --- a/reactos/drivers/bus/acpi/include/achware.h +++ /dev/null @@ -1,149 +0,0 @@ -/****************************************************************************** - * - * Name: achware.h -- hardware specific interfaces - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACHWARE_H__ -#define __ACHWARE_H__ - - -/* PM Timer ticks per second (HZ) */ -#define PM_TIMER_FREQUENCY 3579545 - - -/* Prototypes */ - - -ACPI_STATUS -acpi_hw_initialize ( - void); - -ACPI_STATUS -acpi_hw_shutdown ( - void); - -ACPI_STATUS -acpi_hw_initialize_system_info ( - void); - -ACPI_STATUS -acpi_hw_set_mode ( - u32 mode); - -u32 -acpi_hw_get_mode ( - void); - -u32 -acpi_hw_get_mode_capabilities ( - void); - -/* Register I/O Prototypes */ - - -u32 -acpi_hw_register_bit_access ( - NATIVE_UINT read_write, - u8 use_lock, - u32 register_id, - ... /* DWORD Write Value */); - -u32 -acpi_hw_register_read ( - u8 use_lock, - u32 register_id); - -void -acpi_hw_register_write ( - u8 use_lock, - u32 register_id, - u32 value); - -u32 -acpi_hw_low_level_read ( - u32 width, - ACPI_GAS *reg, - u32 offset); - -void -acpi_hw_low_level_write ( - u32 width, - u32 value, - ACPI_GAS *reg, - u32 offset); - -void -acpi_hw_clear_acpi_status ( - void); - -u32 -acpi_hw_get_bit_shift ( - u32 mask); - - -/* GPE support */ - -void -acpi_hw_enable_gpe ( - u32 gpe_index); - -void -acpi_hw_disable_gpe ( - u32 gpe_index); - -void -acpi_hw_clear_gpe ( - u32 gpe_index); - -void -acpi_hw_get_gpe_status ( - u32 gpe_number, - ACPI_EVENT_STATUS *event_status); - -/* Sleep Prototypes */ - -ACPI_STATUS -acpi_hw_obtain_sleep_type_register_data ( - u8 sleep_state, - u8 *slp_typ_a, - u8 *slp_typ_b); - - -/* ACPI Timer prototypes */ - -ACPI_STATUS -acpi_get_timer_resolution ( - u32 *resolution); - -ACPI_STATUS -acpi_get_timer ( - u32 *ticks); - -ACPI_STATUS -acpi_get_timer_duration ( - u32 start_ticks, - u32 end_ticks, - u32 *time_elapsed); - - -#endif /* __ACHWARE_H__ */ diff --git a/reactos/drivers/bus/acpi/include/acinterp.h b/reactos/drivers/bus/acpi/include/acinterp.h deleted file mode 100644 index 177dd3f2c87..00000000000 --- a/reactos/drivers/bus/acpi/include/acinterp.h +++ /dev/null @@ -1,632 +0,0 @@ -/****************************************************************************** - * - * Name: acinterp.h - Interpreter subcomponent prototypes and defines - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACINTERP_H__ -#define __ACINTERP_H__ - - -#define WALK_OPERANDS &(walk_state->operands [walk_state->num_operands -1]) - - -/* Interpreter constants */ - -#define AML_END_OF_BLOCK -1 -#define PUSH_PKG_LENGTH 1 -#define DO_NOT_PUSH_PKG_LENGTH 0 - - -#define STACK_TOP 0 -#define STACK_BOTTOM (u32) -1 - -/* Constants for global "When_to_parse_methods" */ - -#define METHOD_PARSE_AT_INIT 0x0 -#define METHOD_PARSE_JUST_IN_TIME 0x1 -#define METHOD_DELETE_AT_COMPLETION 0x2 - - -ACPI_STATUS -acpi_aml_resolve_operands ( - u16 opcode, - ACPI_OPERAND_OBJECT **stack_ptr, - ACPI_WALK_STATE *walk_state); - - -/* - * amxface - External interpreter interfaces - */ - -ACPI_STATUS -acpi_aml_load_table ( - ACPI_TABLE_TYPE table_id); - -ACPI_STATUS -acpi_aml_execute_method ( - ACPI_NAMESPACE_NODE *method_node, - ACPI_OPERAND_OBJECT **params, - ACPI_OPERAND_OBJECT **return_obj_desc); - - -/* - * amconvrt - object conversion - */ - -ACPI_STATUS -acpi_aml_convert_to_integer ( - ACPI_OPERAND_OBJECT **obj_desc, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_convert_to_buffer ( - ACPI_OPERAND_OBJECT **obj_desc, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_convert_to_string ( - ACPI_OPERAND_OBJECT **obj_desc, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_convert_to_target_type ( - OBJECT_TYPE_INTERNAL destination_type, - ACPI_OPERAND_OBJECT **obj_desc, - ACPI_WALK_STATE *walk_state); - - -/* - * amfield - ACPI AML (p-code) execution - field manipulation - */ - -ACPI_STATUS -acpi_aml_read_field ( - ACPI_OPERAND_OBJECT *obj_desc, - void *buffer, - u32 buffer_length, - u32 byte_length, - u32 datum_length, - u32 bit_granularity, - u32 byte_granularity); - -ACPI_STATUS -acpi_aml_write_field ( - ACPI_OPERAND_OBJECT *obj_desc, - void *buffer, - u32 buffer_length, - u32 byte_length, - u32 datum_length, - u32 bit_granularity, - u32 byte_granularity); - -ACPI_STATUS -acpi_aml_setup_field ( - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_OPERAND_OBJECT *rgn_desc, - u32 field_bit_width); - -ACPI_STATUS -acpi_aml_read_field_data ( - ACPI_OPERAND_OBJECT *obj_desc, - u32 field_byte_offset, - u32 field_bit_width, - u32 *value); - -ACPI_STATUS -acpi_aml_access_named_field ( - u32 mode, - ACPI_HANDLE named_field, - void *buffer, - u32 length); - -/* - * ammisc - ACPI AML (p-code) execution - specific opcodes - */ - -ACPI_STATUS -acpi_aml_exec_create_field ( - u8 *aml_ptr, - u32 aml_length, - ACPI_NAMESPACE_NODE *node, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_exec_reconfiguration ( - u16 opcode, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_exec_fatal ( - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_exec_index ( - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **return_desc); - -ACPI_STATUS -acpi_aml_exec_match ( - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **return_desc); - -ACPI_STATUS -acpi_aml_exec_create_mutex ( - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_exec_create_processor ( - ACPI_PARSE_OBJECT *op, - ACPI_HANDLE processor_nTE); - -ACPI_STATUS -acpi_aml_exec_create_power_resource ( - ACPI_PARSE_OBJECT *op, - ACPI_HANDLE processor_nTE); - -ACPI_STATUS -acpi_aml_exec_create_region ( - u8 *aml_ptr, - u32 acpi_aml_length, - u8 region_space, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_exec_create_event ( - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_exec_create_alias ( - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_exec_create_method ( - u8 *aml_ptr, - u32 acpi_aml_length, - u32 method_flags, - ACPI_HANDLE method); - - -/* - * ammutex - mutex support - */ - -ACPI_STATUS -acpi_aml_acquire_mutex ( - ACPI_OPERAND_OBJECT *time_desc, - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_release_mutex ( - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_release_all_mutexes ( - ACPI_OPERAND_OBJECT *mutex_list); - -void -acpi_aml_unlink_mutex ( - ACPI_OPERAND_OBJECT *obj_desc); - - -/* - * amprep - ACPI AML (p-code) execution - prep utilities - */ - -ACPI_STATUS -acpi_aml_prep_def_field_value ( - ACPI_NAMESPACE_NODE *node, - ACPI_HANDLE region, - u8 field_flags, - u8 field_attribute, - u32 field_position, - u32 field_length); - -ACPI_STATUS -acpi_aml_prep_bank_field_value ( - ACPI_NAMESPACE_NODE *node, - ACPI_HANDLE region, - ACPI_HANDLE bank_reg, - u32 bank_val, - u8 field_flags, - u8 field_attribute, - u32 field_position, - u32 field_length); - -ACPI_STATUS -acpi_aml_prep_index_field_value ( - ACPI_NAMESPACE_NODE *node, - ACPI_HANDLE index_reg, - ACPI_HANDLE data_reg, - u8 field_flags, - u8 field_attribute, - u32 field_position, - u32 field_length); - - -/* - * amsystem - Interface to OS services - */ - -ACPI_STATUS -acpi_aml_system_do_notify_op ( - ACPI_OPERAND_OBJECT *value, - ACPI_OPERAND_OBJECT *obj_desc); - -void -acpi_aml_system_do_suspend( - u32 time); - -void -acpi_aml_system_do_stall ( - u32 time); - -ACPI_STATUS -acpi_aml_system_acquire_mutex( - ACPI_OPERAND_OBJECT *time, - ACPI_OPERAND_OBJECT *obj_desc); - -ACPI_STATUS -acpi_aml_system_release_mutex( - ACPI_OPERAND_OBJECT *obj_desc); - -ACPI_STATUS -acpi_aml_system_signal_event( - ACPI_OPERAND_OBJECT *obj_desc); - -ACPI_STATUS -acpi_aml_system_wait_event( - ACPI_OPERAND_OBJECT *time, - ACPI_OPERAND_OBJECT *obj_desc); - -ACPI_STATUS -acpi_aml_system_reset_event( - ACPI_OPERAND_OBJECT *obj_desc); - -ACPI_STATUS -acpi_aml_system_wait_semaphore ( - ACPI_HANDLE semaphore, - u32 timeout); - - -/* - * ammonadic - ACPI AML (p-code) execution, monadic operators - */ - -ACPI_STATUS -acpi_aml_exec_monadic1 ( - u16 opcode, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_exec_monadic2 ( - u16 opcode, - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **return_desc); - -ACPI_STATUS -acpi_aml_exec_monadic2_r ( - u16 opcode, - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **return_desc); - - -/* - * amdyadic - ACPI AML (p-code) execution, dyadic operators - */ - -ACPI_STATUS -acpi_aml_exec_dyadic1 ( - u16 opcode, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_exec_dyadic2 ( - u16 opcode, - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **return_desc); - -ACPI_STATUS -acpi_aml_exec_dyadic2_r ( - u16 opcode, - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **return_desc); - -ACPI_STATUS -acpi_aml_exec_dyadic2_s ( - u16 opcode, - ACPI_WALK_STATE *walk_state, - ACPI_OPERAND_OBJECT **return_desc); - - -/* - * amresolv - Object resolution and get value functions - */ - -ACPI_STATUS -acpi_aml_resolve_to_value ( - ACPI_OPERAND_OBJECT **stack_ptr, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_resolve_node_to_value ( - ACPI_NAMESPACE_NODE **stack_ptr, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_resolve_object_to_value ( - ACPI_OPERAND_OBJECT **stack_ptr, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_get_field_unit_value ( - ACPI_OPERAND_OBJECT *field_desc, - ACPI_OPERAND_OBJECT *result_desc); - - -/* - * amdump - Scanner debug output routines - */ - -void -acpi_aml_show_hex_value ( - u32 byte_count, - u8 *aml_ptr, - u32 lead_space); - - -ACPI_STATUS -acpi_aml_dump_operand ( - ACPI_OPERAND_OBJECT *entry_desc); - -void -acpi_aml_dump_operands ( - ACPI_OPERAND_OBJECT **operands, - OPERATING_MODE interpreter_mode, - NATIVE_CHAR *ident, - u32 num_levels, - NATIVE_CHAR *note, - NATIVE_CHAR *module_name, - u32 line_number); - -void -acpi_aml_dump_object_descriptor ( - ACPI_OPERAND_OBJECT *object, - u32 flags); - - -void -acpi_aml_dump_node ( - ACPI_NAMESPACE_NODE *node, - u32 flags); - - -/* - * amnames - interpreter/scanner name load/execute - */ - -NATIVE_CHAR * -acpi_aml_allocate_name_string ( - u32 prefix_count, - u32 num_name_segs); - -u32 -acpi_aml_good_char ( - u32 character); - -ACPI_STATUS -acpi_aml_exec_name_segment ( - u8 **in_aml_address, - NATIVE_CHAR *name_string); - -ACPI_STATUS -acpi_aml_get_name_string ( - OBJECT_TYPE_INTERNAL data_type, - u8 *in_aml_address, - NATIVE_CHAR **out_name_string, - u32 *out_name_length); - -ACPI_STATUS -acpi_aml_do_name ( - ACPI_OBJECT_TYPE data_type, - OPERATING_MODE load_exec_mode); - - -/* - * amstore - Object store support - */ - -ACPI_STATUS -acpi_aml_exec_store ( - ACPI_OPERAND_OBJECT *val_desc, - ACPI_OPERAND_OBJECT *dest_desc, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_store_object_to_index ( - ACPI_OPERAND_OBJECT *val_desc, - ACPI_OPERAND_OBJECT *dest_desc, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_store_object_to_node ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_NAMESPACE_NODE *node, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_store_object_to_object ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_OPERAND_OBJECT *dest_desc, - ACPI_WALK_STATE *walk_state); - - -/* - * - */ - -ACPI_STATUS -acpi_aml_resolve_object ( - ACPI_OPERAND_OBJECT **source_desc_ptr, - OBJECT_TYPE_INTERNAL target_type, - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_aml_store_object ( - ACPI_OPERAND_OBJECT *source_desc, - OBJECT_TYPE_INTERNAL target_type, - ACPI_OPERAND_OBJECT **target_desc_ptr, - ACPI_WALK_STATE *walk_state); - - -/* - * amcopy - object copy - */ - -ACPI_STATUS -acpi_aml_copy_buffer_to_buffer ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_OPERAND_OBJECT *target_desc); - -ACPI_STATUS -acpi_aml_copy_string_to_string ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_OPERAND_OBJECT *target_desc); - -ACPI_STATUS -acpi_aml_copy_integer_to_index_field ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_OPERAND_OBJECT *target_desc); - -ACPI_STATUS -acpi_aml_copy_integer_to_bank_field ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_OPERAND_OBJECT *target_desc); - -ACPI_STATUS -acpi_aml_copy_data_to_named_field ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_NAMESPACE_NODE *node); - -ACPI_STATUS -acpi_aml_copy_integer_to_field_unit ( - ACPI_OPERAND_OBJECT *source_desc, - ACPI_OPERAND_OBJECT *target_desc); - -/* - * amutils - interpreter/scanner utilities - */ - -ACPI_STATUS -acpi_aml_enter_interpreter ( - void); - -void -acpi_aml_exit_interpreter ( - void); - -void -acpi_aml_truncate_for32bit_table ( - ACPI_OPERAND_OBJECT *obj_desc, - ACPI_WALK_STATE *walk_state); - -u8 -acpi_aml_validate_object_type ( - ACPI_OBJECT_TYPE type); - -u8 -acpi_aml_acquire_global_lock ( - u32 rule); - -ACPI_STATUS -acpi_aml_release_global_lock ( - u8 locked); - -u32 -acpi_aml_digits_needed ( - ACPI_INTEGER value, - u32 base); - -ACPI_STATUS -acpi_aml_eisa_id_to_string ( - u32 numeric_id, - NATIVE_CHAR *out_string); - -ACPI_STATUS -acpi_aml_unsigned_integer_to_string ( - ACPI_INTEGER value, - NATIVE_CHAR *out_string); - - -/* - * amregion - default Op_region handlers - */ - -ACPI_STATUS -acpi_aml_system_memory_space_handler ( - u32 function, - ACPI_PHYSICAL_ADDRESS address, - u32 bit_width, - u32 *value, - void *handler_context, - void *region_context); - -ACPI_STATUS -acpi_aml_system_io_space_handler ( - u32 function, - ACPI_PHYSICAL_ADDRESS address, - u32 bit_width, - u32 *value, - void *handler_context, - void *region_context); - -ACPI_STATUS -acpi_aml_pci_config_space_handler ( - u32 function, - ACPI_PHYSICAL_ADDRESS address, - u32 bit_width, - u32 *value, - void *handler_context, - void *region_context); - -ACPI_STATUS -acpi_aml_embedded_controller_space_handler ( - u32 function, - ACPI_PHYSICAL_ADDRESS address, - u32 bit_width, - u32 *value, - void *handler_context, - void *region_context); - -ACPI_STATUS -acpi_aml_sm_bus_space_handler ( - u32 function, - ACPI_PHYSICAL_ADDRESS address, - u32 bit_width, - u32 *value, - void *handler_context, - void *region_context); - - -#endif /* __INTERP_H__ */ diff --git a/reactos/drivers/bus/acpi/include/aclocal.h b/reactos/drivers/bus/acpi/include/aclocal.h deleted file mode 100644 index 3eac5d5af3a..00000000000 --- a/reactos/drivers/bus/acpi/include/aclocal.h +++ /dev/null @@ -1,832 +0,0 @@ -/****************************************************************************** - * - * Name: aclocal.h - Internal data types used across the ACPI subsystem - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACLOCAL_H__ -#define __ACLOCAL_H__ - - -#define WAIT_FOREVER ((u32) -1) - -typedef void* ACPI_MUTEX; -typedef u32 ACPI_MUTEX_HANDLE; - - -/* Object descriptor types */ - -#define ACPI_CACHED_OBJECT 0x11 /* ORed in when object is cached */ -#define ACPI_DESC_TYPE_STATE 0x22 -#define ACPI_DESC_TYPE_WALK 0x44 -#define ACPI_DESC_TYPE_PARSER 0x66 -#define ACPI_DESC_TYPE_INTERNAL 0x88 -#define ACPI_DESC_TYPE_NAMED 0xAA - - -/***************************************************************************** - * - * Mutex typedefs and structs - * - ****************************************************************************/ - - -/* - * Predefined handles for the mutex objects used within the subsystem - * All mutex objects are automatically created by Acpi_cm_mutex_initialize. - * - * The acquire/release ordering protocol is implied via this list. Mutexes - * with a lower value must be acquired before mutexes with a higher value. - * - * NOTE: any changes here must be reflected in the Acpi_gbl_Mutex_names table also! - */ - -#define ACPI_MTX_EXECUTE 0 -#define ACPI_MTX_INTERPRETER 1 -#define ACPI_MTX_PARSER 2 -#define ACPI_MTX_DISPATCHER 3 -#define ACPI_MTX_TABLES 4 -#define ACPI_MTX_OP_REGIONS 5 -#define ACPI_MTX_NAMESPACE 6 -#define ACPI_MTX_EVENTS 7 -#define ACPI_MTX_HARDWARE 8 -#define ACPI_MTX_CACHES 9 -#define ACPI_MTX_MEMORY 10 -#define ACPI_MTX_DEBUG_CMD_COMPLETE 11 -#define ACPI_MTX_DEBUG_CMD_READY 12 - -#define MAX_MTX 12 -#define NUM_MTX MAX_MTX+1 - - -#if defined(ACPI_DEBUG) || defined(ENABLE_DEBUGGER) -#ifdef DEFINE_ACPI_GLOBALS - -/* Names for the mutexes used in the subsystem */ - -static NATIVE_CHAR *acpi_gbl_mutex_names[] = -{ - "ACPI_MTX_Execute", - "ACPI_MTX_Interpreter", - "ACPI_MTX_Parser", - "ACPI_MTX_Dispatcher", - "ACPI_MTX_Tables", - "ACPI_MTX_Op_regions", - "ACPI_MTX_Namespace", - "ACPI_MTX_Events", - "ACPI_MTX_Hardware", - "ACPI_MTX_Caches", - "ACPI_MTX_Memory", - "ACPI_MTX_Debug_cmd_complete" - "ACPI_MTX_Debug_cmd_ready", -}; - -#endif -#endif - - -/* Table for the global mutexes */ - -typedef struct acpi_mutex_info -{ - ACPI_MUTEX mutex; - u32 use_count; - u32 owner_id; - u8 locked; - -} ACPI_MUTEX_INFO; - - -/* Lock flag parameter for various interfaces */ - -#define ACPI_MTX_DO_NOT_LOCK 0 -#define ACPI_MTX_LOCK 1 - - -typedef u16 ACPI_OWNER_ID; -#define OWNER_TYPE_TABLE 0x0 -#define OWNER_TYPE_METHOD 0x1 -#define FIRST_METHOD_ID 0x0000 -#define FIRST_TABLE_ID 0x8000 - -/* TBD: [Restructure] get rid of the need for this! */ - -#define TABLE_ID_DSDT (ACPI_OWNER_ID) 0x8000 - - -/***************************************************************************** - * - * Namespace typedefs and structs - * - ****************************************************************************/ - - -/* Operational modes of the AML interpreter/scanner */ - -typedef enum -{ - IMODE_LOAD_PASS1 = 0x01, - IMODE_LOAD_PASS2 = 0x02, - IMODE_EXECUTE = 0x0E - -} OPERATING_MODE; - - -/* - * The Node describes a named object that appears in the AML - * An Acpi_node is used to store Nodes. - * - * Data_type is used to differentiate between internal descriptors, and MUST - * be the first byte in this structure. - */ - -typedef struct acpi_node -{ - u8 data_type; - u8 type; /* Type associated with this name */ - u16 owner_id; - u32 name; /* ACPI Name, always 4 chars per ACPI spec */ - - - void *object; /* Pointer to attached ACPI object (optional) */ - struct acpi_node *child; /* first child */ - struct acpi_node *peer; /* Next peer*/ - u16 reference_count; /* Current count of references and children */ - u8 flags; - -} ACPI_NAMESPACE_NODE; - - -#define ENTRY_NOT_FOUND NULL - - -/* Node flags */ - -#define ANOBJ_AML_ATTACHMENT 0x01 -#define ANOBJ_END_OF_PEER_LIST 0x02 -#define ANOBJ_DATA_WIDTH_32 0x04 /* Parent table is 64-bits */ -#define ANOBJ_METHOD_ARG 0x08 -#define ANOBJ_METHOD_LOCAL 0x10 -#define ANOBJ_METHOD_NO_RETVAL 0x20 -#define ANOBJ_METHOD_SOME_NO_RETVAL 0x40 - - -/* - * ACPI Table Descriptor. One per ACPI table - */ -typedef struct acpi_table_desc -{ - struct acpi_table_desc *prev; - struct acpi_table_desc *next; - struct acpi_table_desc *installed_desc; - ACPI_TABLE_HEADER *pointer; - void *base_pointer; - u8 *aml_pointer; - UINT64 physical_address; - u32 aml_length; - u32 length; - u32 count; - ACPI_OWNER_ID table_id; - u8 type; - u8 allocation; - u8 loaded_into_namespace; - -} ACPI_TABLE_DESC; - - -typedef struct -{ - NATIVE_CHAR *search_for; - ACPI_HANDLE *list; - u32 *count; - -} FIND_CONTEXT; - - -typedef struct -{ - ACPI_NAMESPACE_NODE *node; -} NS_SEARCH_DATA; - - -/* - * Predefined Namespace items - */ -#define ACPI_MAX_ADDRESS_SPACE 255 -#define ACPI_NUM_ADDRESS_SPACES 256 - - -typedef struct -{ - NATIVE_CHAR *name; - ACPI_OBJECT_TYPE type; - NATIVE_CHAR *val; - -} PREDEFINED_NAMES; - - -/* Object types used during package copies */ - - -#define ACPI_COPY_TYPE_SIMPLE 0 -#define ACPI_COPY_TYPE_PACKAGE 1 - - -/***************************************************************************** - * - * Event typedefs and structs - * - ****************************************************************************/ - - -/* Status bits. */ - -#define ACPI_STATUS_PMTIMER 0x0001 -#define ACPI_STATUS_GLOBAL 0x0020 -#define ACPI_STATUS_POWER_BUTTON 0x0100 -#define ACPI_STATUS_SLEEP_BUTTON 0x0200 -#define ACPI_STATUS_RTC_ALARM 0x0400 - -/* Enable bits. */ - -#define ACPI_ENABLE_PMTIMER 0x0001 -#define ACPI_ENABLE_GLOBAL 0x0020 -#define ACPI_ENABLE_POWER_BUTTON 0x0100 -#define ACPI_ENABLE_SLEEP_BUTTON 0x0200 -#define ACPI_ENABLE_RTC_ALARM 0x0400 - - -/* - * Entry in the Address_space (AKA Operation Region) table - */ - -typedef struct -{ - ADDRESS_SPACE_HANDLER handler; - void *context; - -} ACPI_ADDRESS_SPACE_INFO; - - -/* Values and addresses of the GPE registers (both banks) */ - -typedef struct -{ - u8 status; /* Current value of status reg */ - u8 enable; /* Current value of enable reg */ - u16 status_addr; /* Address of status reg */ - u16 enable_addr; /* Address of enable reg */ - u8 gpe_base; /* Base GPE number */ - -} ACPI_GPE_REGISTERS; - - -#define ACPI_GPE_LEVEL_TRIGGERED 1 -#define ACPI_GPE_EDGE_TRIGGERED 2 - - -/* Information about each particular GPE level */ - -typedef struct -{ - u8 type; /* Level or Edge */ - - ACPI_HANDLE method_handle; /* Method handle for direct (fast) execution */ - GPE_HANDLER handler; /* Address of handler, if any */ - void *context; /* Context to be passed to handler */ - -} ACPI_GPE_LEVEL_INFO; - - -/* Information about each particular fixed event */ - -typedef struct -{ - FIXED_EVENT_HANDLER handler; /* Address of handler. */ - void *context; /* Context to be passed to handler */ - -} ACPI_FIXED_EVENT_INFO; - - -/* Information used during field processing */ - -typedef struct -{ - u8 skip_field; - u8 field_flag; - u32 pkg_length; - -} ACPI_FIELD_INFO; - - -/***************************************************************************** - * - * Generic "state" object for stacks - * - ****************************************************************************/ - - -#define CONTROL_NORMAL 0xC0 -#define CONTROL_CONDITIONAL_EXECUTING 0xC1 -#define CONTROL_PREDICATE_EXECUTING 0xC2 -#define CONTROL_PREDICATE_FALSE 0xC3 -#define CONTROL_PREDICATE_TRUE 0xC4 - - -/* Forward declarations */ -struct acpi_walk_state; -struct acpi_walk_list; -struct acpi_parse_obj; -struct acpi_obj_mutex; - - -#define ACPI_STATE_COMMON /* Two 32-bit fields and a pointer */\ - u8 data_type; /* To differentiate various internal objs */\ - u8 flags; \ - u16 value; \ - u16 state; \ - u16 acpi_eval; \ - void *next; \ - -typedef struct acpi_common_state -{ - ACPI_STATE_COMMON -} ACPI_COMMON_STATE; - - -/* - * Update state - used to traverse complex objects such as packages - */ -typedef struct acpi_update_state -{ - ACPI_STATE_COMMON - union acpi_operand_obj *object; - -} ACPI_UPDATE_STATE; - - -/* - * Pkg state - used to traverse nested package structures - */ -typedef struct acpi_pkg_state -{ - ACPI_STATE_COMMON - union acpi_operand_obj *source_object; - union acpi_operand_obj *dest_object; - struct acpi_walk_state *walk_state; - void *this_target_obj; - u32 num_packages; - u16 index; - -} ACPI_PKG_STATE; - - -/* - * Control state - one per if/else and while constructs. - * Allows nesting of these constructs - */ -typedef struct acpi_control_state -{ - ACPI_STATE_COMMON - struct acpi_parse_obj *predicate_op; - u8 *aml_predicate_start; /* Start of if/while predicate */ - -} ACPI_CONTROL_STATE; - - -/* - * Scope state - current scope during namespace lookups - */ - -typedef struct acpi_scope_state -{ - ACPI_STATE_COMMON - ACPI_NAMESPACE_NODE *node; - -} ACPI_SCOPE_STATE; - - -typedef struct acpi_pscope_state -{ - ACPI_STATE_COMMON - struct acpi_parse_obj *op; /* current op being parsed */ - u8 *arg_end; /* current argument end */ - u8 *pkg_end; /* current package end */ - u32 arg_list; /* next argument to parse */ - u32 arg_count; /* Number of fixed arguments */ - -} ACPI_PSCOPE_STATE; - - -/* - * Result values - used to accumulate the results of nested - * AML arguments - */ -typedef struct acpi_result_values -{ - ACPI_STATE_COMMON - union acpi_operand_obj *obj_desc [OBJ_NUM_OPERANDS]; - u8 num_results; - u8 last_insert; - -} ACPI_RESULT_VALUES; - - -/* - * Notify info - used to pass info to the deferred notify - * handler/dispatcher. - */ - -typedef struct acpi_notify_info -{ - ACPI_STATE_COMMON - ACPI_NAMESPACE_NODE *node; - union acpi_operand_obj *handler_obj; - -} ACPI_NOTIFY_INFO; - - -/* Generic state is union of structs above */ - -typedef union acpi_gen_state -{ - ACPI_COMMON_STATE common; - ACPI_CONTROL_STATE control; - ACPI_UPDATE_STATE update; - ACPI_SCOPE_STATE scope; - ACPI_PSCOPE_STATE parse_scope; - ACPI_PKG_STATE pkg; - ACPI_RESULT_VALUES results; - ACPI_NOTIFY_INFO notify; - -} ACPI_GENERIC_STATE; - - -typedef -ACPI_STATUS (*ACPI_PARSE_DOWNWARDS) ( - u16 opcode, - struct acpi_parse_obj *op, - struct acpi_walk_state *walk_state, - struct acpi_parse_obj **out_op); - -typedef -ACPI_STATUS (*ACPI_PARSE_UPWARDS) ( - struct acpi_walk_state *walk_state, - struct acpi_parse_obj *op); - - -/***************************************************************************** - * - * Parser typedefs and structs - * - ****************************************************************************/ - - -#define ACPI_OP_CLASS_MASK 0x1F -#define ACPI_OP_ARGS_MASK 0x20 -#define ACPI_OP_TYPE_MASK 0xC0 - -#define ACPI_OP_TYPE_OPCODE 0x00 -#define ACPI_OP_TYPE_ASCII 0x40 -#define ACPI_OP_TYPE_PREFIX 0x80 -#define ACPI_OP_TYPE_UNKNOWN 0xC0 - -#define ACPI_GET_OP_CLASS(a) ((a)->flags & ACPI_OP_CLASS_MASK) -#define ACPI_GET_OP_ARGS(a) ((a)->flags & ACPI_OP_ARGS_MASK) -#define ACPI_GET_OP_TYPE(a) ((a)->flags & ACPI_OP_TYPE_MASK) - - -/* - * AML opcode, name, and argument layout - */ -typedef struct acpi_opcode_info -{ - u8 flags; /* Opcode type, Has_args flag */ - u32 parse_args; /* Grammar/Parse time arguments */ - u32 runtime_args; /* Interpret time arguments */ - -#ifdef _OPCODE_NAMES - NATIVE_CHAR *name; /* op name (debug only) */ -#endif - -} ACPI_OPCODE_INFO; - - -typedef union acpi_parse_val -{ - u32 integer; /* integer constant */ - u32 size; /* bytelist or field size */ - NATIVE_CHAR *string; /* NULL terminated string */ - u8 *buffer; /* buffer or string */ - NATIVE_CHAR *name; /* NULL terminated string */ - struct acpi_parse_obj *arg; /* arguments and contained ops */ - -} ACPI_PARSE_VALUE; - - -#define ACPI_PARSE_COMMON \ - u8 data_type; /* To differentiate various internal objs */\ - u8 flags; /* Type of Op */\ - u16 opcode; /* AML opcode */\ - u32 aml_offset; /* offset of declaration in AML */\ - struct acpi_parse_obj *parent; /* parent op */\ - struct acpi_parse_obj *next; /* next op */\ - DEBUG_ONLY_MEMBERS (\ - NATIVE_CHAR op_name[16]) /* op name (debug only) */\ - /* NON-DEBUG members below: */\ - ACPI_NAMESPACE_NODE *node; /* for use by interpreter */\ - ACPI_PARSE_VALUE value; /* Value or args associated with the opcode */\ - - -/* - * generic operation (eg. If, While, Store) - */ -typedef struct acpi_parse_obj -{ - ACPI_PARSE_COMMON -} ACPI_PARSE_OBJECT; - - -/* - * Extended Op for named ops (Scope, Method, etc.), deferred ops (Methods and Op_regions), - * and bytelists. - */ -typedef struct acpi_parse2_obj -{ - ACPI_PARSE_COMMON - u8 *data; /* AML body or bytelist data */ - u32 length; /* AML length */ - u32 name; /* 4-byte name or zero if no name */ - -} ACPI_PARSE2_OBJECT; - - -/* - * Parse state - one state per parser invocation and each control - * method. - */ - -typedef struct acpi_parse_state -{ - u8 *aml_start; /* first AML byte */ - u8 *aml; /* next AML byte */ - u8 *aml_end; /* (last + 1) AML byte */ - u8 *pkg_start; /* current package begin */ - u8 *pkg_end; /* current package end */ - ACPI_PARSE_OBJECT *start_op; /* root of parse tree */ - struct acpi_node *start_node; - ACPI_GENERIC_STATE *scope; /* current scope */ - struct acpi_parse_state *next; - -} ACPI_PARSE_STATE; - - -/***************************************************************************** - * - * Hardware and PNP - * - ****************************************************************************/ - - -/* PCI */ - -#define PCI_ROOT_HID_STRING "PNP0A03" -#define PCI_ROOT_HID_VALUE 0x030AD041 /* EISAID("PNP0A03") */ - - -/* Sleep states */ - -#define SLWA_DEBUG_LEVEL 4 -#define GTS_CALL 0 -#define GTS_WAKE 1 - -/* Cx States */ - -#define MAX_CX_STATE_LATENCY 0xFFFFFFFF -#define MAX_CX_STATES 4 - - -/* - * The #define's and enum below establish an abstract way of identifying what - * register block and register is to be accessed. Do not change any of the - * values as they are used in switch statements and offset calculations. - */ - -#define REGISTER_BLOCK_MASK 0xFF00 /* Register Block Id */ -#define BIT_IN_REGISTER_MASK 0x00FF /* Bit Id in the Register Block Id */ -#define BYTE_IN_REGISTER_MASK 0x00FF /* Register Offset in the Register Block */ - -#define REGISTER_BLOCK_ID(reg_id) (reg_id & REGISTER_BLOCK_MASK) -#define REGISTER_BIT_ID(reg_id) (reg_id & BIT_IN_REGISTER_MASK) -#define REGISTER_OFFSET(reg_id) (reg_id & BYTE_IN_REGISTER_MASK) - -/* - * Access Rule - * To access a Register Bit: - * -> Use Bit Name (= Register Block Id | Bit Id) defined in the enum. - * - * To access a Register: - * -> Use Register Id (= Register Block Id | Register Offset) - */ - - -/* - * Register Block Id - */ -#define PM1_STS 0x0100 -#define PM1_EN 0x0200 -#define PM1_CONTROL 0x0300 -#define PM1_a_CONTROL 0x0400 -#define PM1_b_CONTROL 0x0500 -#define PM2_CONTROL 0x0600 -#define PM_TIMER 0x0700 -#define PROCESSOR_BLOCK 0x0800 -#define GPE0_STS_BLOCK 0x0900 -#define GPE0_EN_BLOCK 0x0A00 -#define GPE1_STS_BLOCK 0x0B00 -#define GPE1_EN_BLOCK 0x0C00 -#define SMI_CMD_BLOCK 0x0D00 - -/* - * Address space bitmasks for mmio or io spaces - */ - -#define SMI_CMD_ADDRESS_SPACE 0x01 -#define PM1_BLK_ADDRESS_SPACE 0x02 -#define PM2_CNT_BLK_ADDRESS_SPACE 0x04 -#define PM_TMR_BLK_ADDRESS_SPACE 0x08 -#define GPE0_BLK_ADDRESS_SPACE 0x10 -#define GPE1_BLK_ADDRESS_SPACE 0x20 - -/* - * Control bit definitions - */ -#define TMR_STS (PM1_STS | 0x01) -#define BM_STS (PM1_STS | 0x02) -#define GBL_STS (PM1_STS | 0x03) -#define PWRBTN_STS (PM1_STS | 0x04) -#define SLPBTN_STS (PM1_STS | 0x05) -#define RTC_STS (PM1_STS | 0x06) -#define WAK_STS (PM1_STS | 0x07) - -#define TMR_EN (PM1_EN | 0x01) - /* no BM_EN */ -#define GBL_EN (PM1_EN | 0x03) -#define PWRBTN_EN (PM1_EN | 0x04) -#define SLPBTN_EN (PM1_EN | 0x05) -#define RTC_EN (PM1_EN | 0x06) -#define WAK_EN (PM1_EN | 0x07) - -#define SCI_EN (PM1_CONTROL | 0x01) -#define BM_RLD (PM1_CONTROL | 0x02) -#define GBL_RLS (PM1_CONTROL | 0x03) -#define SLP_TYPE_A (PM1_CONTROL | 0x04) -#define SLP_TYPE_B (PM1_CONTROL | 0x05) -#define SLP_EN (PM1_CONTROL | 0x06) - -#define ARB_DIS (PM2_CONTROL | 0x01) - -#define TMR_VAL (PM_TIMER | 0x01) - -#define GPE0_STS (GPE0_STS_BLOCK | 0x01) -#define GPE0_EN (GPE0_EN_BLOCK | 0x01) - -#define GPE1_STS (GPE1_STS_BLOCK | 0x01) -#define GPE1_EN (GPE1_EN_BLOCK | 0x01) - - -#define TMR_STS_MASK 0x0001 -#define BM_STS_MASK 0x0010 -#define GBL_STS_MASK 0x0020 -#define PWRBTN_STS_MASK 0x0100 -#define SLPBTN_STS_MASK 0x0200 -#define RTC_STS_MASK 0x0400 -#define WAK_STS_MASK 0x8000 - -#define ALL_FIXED_STS_BITS (TMR_STS_MASK | BM_STS_MASK | GBL_STS_MASK \ - | PWRBTN_STS_MASK | SLPBTN_STS_MASK \ - | RTC_STS_MASK | WAK_STS_MASK) - -#define TMR_EN_MASK 0x0001 -#define GBL_EN_MASK 0x0020 -#define PWRBTN_EN_MASK 0x0100 -#define SLPBTN_EN_MASK 0x0200 -#define RTC_EN_MASK 0x0400 - -#define SCI_EN_MASK 0x0001 -#define BM_RLD_MASK 0x0002 -#define GBL_RLS_MASK 0x0004 -#define SLP_TYPE_X_MASK 0x1C00 -#define SLP_EN_MASK 0x2000 - -#define ARB_DIS_MASK 0x0001 -#define TMR_VAL_MASK 0xFFFFFFFF - -#define GPE0_STS_MASK -#define GPE0_EN_MASK - -#define GPE1_STS_MASK -#define GPE1_EN_MASK - - -#define ACPI_READ 1 -#define ACPI_WRITE 2 - - -/* Plug and play */ - -/* Pnp and ACPI data */ - -#define VERSION_NO 0x01 -#define LOGICAL_DEVICE_ID 0x02 -#define COMPATIBLE_DEVICE_ID 0x03 -#define IRQ_FORMAT 0x04 -#define DMA_FORMAT 0x05 -#define START_DEPENDENT_TAG 0x06 -#define END_DEPENDENT_TAG 0x07 -#define IO_PORT_DESCRIPTOR 0x08 -#define FIXED_LOCATION_IO_DESCRIPTOR 0x09 -#define RESERVED_TYPE0 0x0A -#define RESERVED_TYPE1 0x0B -#define RESERVED_TYPE2 0x0C -#define RESERVED_TYPE3 0x0D -#define SMALL_VENDOR_DEFINED 0x0E -#define END_TAG 0x0F - -/* Pnp and ACPI data */ - -#define MEMORY_RANGE_24 0x81 -#define ISA_MEMORY_RANGE 0x81 -#define LARGE_VENDOR_DEFINED 0x84 -#define EISA_MEMORY_RANGE 0x85 -#define MEMORY_RANGE_32 0x85 -#define FIXED_EISA_MEMORY_RANGE 0x86 -#define FIXED_MEMORY_RANGE_32 0x86 - -/* ACPI only data */ - -#define DWORD_ADDRESS_SPACE 0x87 -#define WORD_ADDRESS_SPACE 0x88 -#define EXTENDED_IRQ 0x89 - -/* MUST HAVES */ - -#define DEVICE_ID_LENGTH 0x09 - -typedef struct -{ - NATIVE_CHAR buffer[DEVICE_ID_LENGTH]; - -} DEVICE_ID; - - -/***************************************************************************** - * - * Debug - * - ****************************************************************************/ - - -/* Entry for a memory allocation (debug only) */ - -#ifdef ACPI_DEBUG - -#define MEM_MALLOC 0 -#define MEM_CALLOC 1 -#define MAX_MODULE_NAME 16 - -typedef struct allocation_info -{ - struct allocation_info *previous; - struct allocation_info *next; - void *address; - u32 size; - u32 component; - u32 line; - NATIVE_CHAR module[MAX_MODULE_NAME]; - u8 alloc_type; - -} ALLOCATION_INFO; - -#endif - -#endif /* __ACLOCAL_H__ */ diff --git a/reactos/drivers/bus/acpi/include/acmacros.h b/reactos/drivers/bus/acpi/include/acmacros.h deleted file mode 100644 index 6a386b67846..00000000000 --- a/reactos/drivers/bus/acpi/include/acmacros.h +++ /dev/null @@ -1,507 +0,0 @@ -/****************************************************************************** - * - * Name: acmacros.h - C macros for the entire subsystem. - * $Revision: 1.4 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACMACROS_H__ -#define __ACMACROS_H__ - -/* - * Data manipulation macros - */ - -#ifndef LODWORD -#define LODWORD(l) ((u32)(UINT64)(l)) -#endif - -#ifndef HIDWORD -#define HIDWORD(l) ((u32)((((UINT64)(l)) >> 32) & 0xFFFFFFFF)) -#endif - -#ifndef LOWORD -#define LOWORD(l) ((u16)(NATIVE_UINT)(l)) -#endif - -#ifndef HIWORD -#define HIWORD(l) ((u16)((((NATIVE_UINT)(l)) >> 16) & 0xFFFF)) -#endif - -#ifndef LOBYTE -#define LOBYTE(l) ((u8)(u16)(l)) -#endif - -#ifndef HIBYTE -#define HIBYTE(l) ((u8)((((u16)(l)) >> 8) & 0xFF)) -#endif - -#define BIT0(x) ((((x) & 0x01) > 0) ? 1 : 0) -#define BIT1(x) ((((x) & 0x02) > 0) ? 1 : 0) -#define BIT2(x) ((((x) & 0x04) > 0) ? 1 : 0) - -#define BIT3(x) ((((x) & 0x08) > 0) ? 1 : 0) -#define BIT4(x) ((((x) & 0x10) > 0) ? 1 : 0) -#define BIT5(x) ((((x) & 0x20) > 0) ? 1 : 0) -#define BIT6(x) ((((x) & 0x40) > 0) ? 1 : 0) -#define BIT7(x) ((((x) & 0x80) > 0) ? 1 : 0) - -#define LOW_BASE(w) ((u16) ((w) & 0x0000FFFF)) -#define MID_BASE(b) ((u8) (((b) & 0x00FF0000) >> 16)) -#define HI_BASE(b) ((u8) (((b) & 0xFF000000) >> 24)) -#define LOW_LIMIT(w) ((u16) ((w) & 0x0000FFFF)) -#define HI_LIMIT(b) ((u8) (((b) & 0x00FF0000) >> 16)) - - -#ifdef _IA16 -/* - * For 16-bit addresses, we have to assume that the upper 32 bits - * are zero. - */ -#define ACPI_GET_ADDRESS(a) ((a).lo) -#define ACPI_STORE_ADDRESS(a,b) {(a).hi=0;(a).lo=(b);} -#define ACPI_VALID_ADDRESS(a) ((a).hi | (a).lo) - -#else -/* - * Full 64-bit address on 32-bit and 64-bit platforms - */ -#define ACPI_GET_ADDRESS(a) (a) -#define ACPI_STORE_ADDRESS(a,b) ((a)=(b)) -#define ACPI_VALID_ADDRESS(a) (a) -#endif - /* - * Extract a byte of data using a pointer. Any more than a byte and we - * get into potential aligment issues -- see the STORE macros below - */ -#define GET8(addr) (*(u8*)(addr)) - - -/* - * Macros for moving data around to/from buffers that are possibly unaligned. - * If the hardware supports the transfer of unaligned data, just do the store. - * Otherwise, we have to move one byte at a time. - */ - -#ifdef _HW_ALIGNMENT_SUPPORT - -/* The hardware supports unaligned transfers, just do the move */ - -#define MOVE_UNALIGNED16_TO_16(d,s) *(u16*)(d) = *(u16*)(s) -#define MOVE_UNALIGNED32_TO_32(d,s) *(u32*)(d) = *(u32*)(s) -#define MOVE_UNALIGNED16_TO_32(d,s) *(u32*)(d) = *(u16*)(s) - -#else -/* - * The hardware does not support unaligned transfers. We must move the - * data one byte at a time. These macros work whether the source or - * the destination (or both) is/are unaligned. - */ - -#define MOVE_UNALIGNED16_TO_16(d,s) {((u8 *)(d))[0] = ((u8 *)(s))[0];\ - ((u8 *)(d))[1] = ((u8 *)(s))[1];} - -#define MOVE_UNALIGNED32_TO_32(d,s) {((u8 *)(d))[0] = ((u8 *)(s))[0];\ - ((u8 *)(d))[1] = ((u8 *)(s))[1];\ - ((u8 *)(d))[2] = ((u8 *)(s))[2];\ - ((u8 *)(d))[3] = ((u8 *)(s))[3];} - -#define MOVE_UNALIGNED16_TO_32(d,s) {(*(u32*)(d)) = 0; MOVE_UNALIGNED16_TO_16(d,s);} - -#endif - - -/* - * Fast power-of-two math macros for non-optimized compilers - */ - -#define _DIV(value,power_of2) ((u32) ((value) >> (power_of2))) -#define _MUL(value,power_of2) ((u32) ((value) << (power_of2))) -#define _MOD(value,divisor) ((u32) ((value) & ((divisor) -1))) - -#define DIV_2(a) _DIV(a,1) -#define MUL_2(a) _MUL(a,1) -#define MOD_2(a) _MOD(a,2) - -#define DIV_4(a) _DIV(a,2) -#define MUL_4(a) _MUL(a,2) -#define MOD_4(a) _MOD(a,4) - -#define DIV_8(a) _DIV(a,3) -#define MUL_8(a) _MUL(a,3) -#define MOD_8(a) _MOD(a,8) - -#define DIV_16(a) _DIV(a,4) -#define MUL_16(a) _MUL(a,4) -#define MOD_16(a) _MOD(a,16) - -/* - * Divide and Modulo - */ -#define ACPI_DIVIDE(n,d) ((n) / (d)) -#define ACPI_MODULO(n,d) ((n) % (d)) - -/* - * Rounding macros (Power of two boundaries only) - */ - -#define ROUND_DOWN(value,boundary) ((value) & (~((boundary)-1))) -#define ROUND_UP(value,boundary) (((value) + ((boundary)-1)) & (~((boundary)-1))) - -#define ROUND_DOWN_TO_32_BITS(a) ROUND_DOWN(a,4) -#define ROUND_DOWN_TO_64_BITS(a) ROUND_DOWN(a,8) -#define ROUND_DOWN_TO_NATIVE_WORD(a) ROUND_DOWN(a,ALIGNED_ADDRESS_BOUNDARY) - -#define ROUND_UP_TO_32_bITS(a) ROUND_UP(a,4) -#define ROUND_UP_TO_64_bITS(a) ROUND_UP(a,8) -#define ROUND_UP_TO_NATIVE_WORD(a) ROUND_UP(a,ALIGNED_ADDRESS_BOUNDARY) - -#define ROUND_PTR_UP_TO_4(a,b) ((b *)(((NATIVE_UINT)(a) + 3) & ~3)) -#define ROUND_PTR_UP_TO_8(a,b) ((b *)(((NATIVE_UINT)(a) + 7) & ~7)) - -#define ROUND_UP_TO_1_k(a) (((a) + 1023) >> 10) - -#ifdef DEBUG_ASSERT -#undef DEBUG_ASSERT -#endif - - -/* Macros for GAS addressing */ - -#ifdef __GNUC__ -#define ACPI_PCI_DEVICE_MASK (UINT64) 0x0000FFFF00000000ULL -#define ACPI_PCI_FUNCTION_MASK (UINT64) 0x00000000FFFF0000ULL -#define ACPI_PCI_REGISTER_MASK (UINT64) 0x000000000000FFFFULL -#else -#define ACPI_PCI_DEVICE_MASK (UINT64) 0x0000FFFF00000000 -#define ACPI_PCI_FUNCTION_MASK (UINT64) 0x00000000FFFF0000 -#define ACPI_PCI_REGISTER_MASK (UINT64) 0x000000000000FFFF -#endif - -#define ACPI_PCI_FUNCTION(a) (u32) ((((a) & ACPI_PCI_FUNCTION_MASK) >> 16)) -#define ACPI_PCI_DEVICE(a) (u32) ((((a) & ACPI_PCI_DEVICE_MASK) >> 32)) - -#ifndef _IA16 -#define ACPI_PCI_REGISTER(a) (u32) (((a) & ACPI_PCI_REGISTER_MASK)) -#define ACPI_PCI_DEVFUN(a) (u32) ((ACPI_PCI_DEVICE(a) << 16) | ACPI_PCI_FUNCTION(a)) - -#else -#define ACPI_PCI_REGISTER(a) (u32) (((a) & 0x0000FFFF)) -#define ACPI_PCI_DEVFUN(a) (u32) ((((a) & 0xFFFF0000) >> 16)) - -#endif - -/* - * An ACPI_HANDLE (which is actually an ACPI_NAMESPACE_NODE *) can appear in some contexts, - * such as on ap_obj_stack, where a pointer to an ACPI_OPERAND_OBJECT can also - * appear. This macro is used to distinguish them. - * - * The Data_type field is the first field in both structures. - */ - -#define VALID_DESCRIPTOR_TYPE(d,t) (((ACPI_NAMESPACE_NODE *)d)->data_type == t) - - -/* Macro to test the object type */ - -#define IS_THIS_OBJECT_TYPE(d,t) (((ACPI_OPERAND_OBJECT *)d)->common.type == (u8)t) - -/* Macro to check the table flags for SINGLE or MULTIPLE tables are allowed */ - -#define IS_SINGLE_TABLE(x) (((x) & 0x01) == ACPI_TABLE_SINGLE ? 1 : 0) - -/* - * Macro to check if a pointer is within an ACPI table. - * Parameter (a) is the pointer to check. Parameter (b) must be defined - * as a pointer to an ACPI_TABLE_HEADER. (b+1) then points past the header, - * and ((u8 *)b+b->Length) points one byte past the end of the table. - */ - -#ifndef _IA16 -#define IS_IN_ACPI_TABLE(a,b) (((u8 *)(a) >= (u8 *)(b + 1)) &&\ - ((u8 *)(a) < ((u8 *)b + b->length))) - -#else -#define IS_IN_ACPI_TABLE(a,b) (_segment)(a) == (_segment)(b) &&\ - (((u8 *)(a) >= (u8 *)(b + 1)) &&\ - ((u8 *)(a) < ((u8 *)b + b->length))) -#endif - -/* - * Macros for the master AML opcode table - */ - -#ifdef ACPI_DEBUG -#define OP_INFO_ENTRY(flags,name,Pargs,Iargs) {flags,Pargs,Iargs,name} -#else -#define OP_INFO_ENTRY(flags,name,Pargs,Iargs) {flags,Pargs,Iargs} -#endif - -#define ARG_TYPE_WIDTH 5 -#define ARG_1(x) ((u32)(x)) -#define ARG_2(x) ((u32)(x) << (1 * ARG_TYPE_WIDTH)) -#define ARG_3(x) ((u32)(x) << (2 * ARG_TYPE_WIDTH)) -#define ARG_4(x) ((u32)(x) << (3 * ARG_TYPE_WIDTH)) -#define ARG_5(x) ((u32)(x) << (4 * ARG_TYPE_WIDTH)) -#define ARG_6(x) ((u32)(x) << (5 * ARG_TYPE_WIDTH)) - -#define ARGI_LIST1(a) (ARG_1(a)) -#define ARGI_LIST2(a,b) (ARG_1(b)|ARG_2(a)) -#define ARGI_LIST3(a,b,c) (ARG_1(c)|ARG_2(b)|ARG_3(a)) -#define ARGI_LIST4(a,b,c,d) (ARG_1(d)|ARG_2(c)|ARG_3(b)|ARG_4(a)) -#define ARGI_LIST5(a,b,c,d,e) (ARG_1(e)|ARG_2(d)|ARG_3(c)|ARG_4(b)|ARG_5(a)) -#define ARGI_LIST6(a,b,c,d,e,f) (ARG_1(f)|ARG_2(e)|ARG_3(d)|ARG_4(c)|ARG_5(b)|ARG_6(a)) - -#define ARGP_LIST1(a) (ARG_1(a)) -#define ARGP_LIST2(a,b) (ARG_1(a)|ARG_2(b)) -#define ARGP_LIST3(a,b,c) (ARG_1(a)|ARG_2(b)|ARG_3(c)) -#define ARGP_LIST4(a,b,c,d) (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)) -#define ARGP_LIST5(a,b,c,d,e) (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)|ARG_5(e)) -#define ARGP_LIST6(a,b,c,d,e,f) (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)|ARG_5(e)|ARG_6(f)) - -#define GET_CURRENT_ARG_TYPE(list) (list & ((u32) 0x1F)) -#define INCREMENT_ARG_LIST(list) (list >>= ((u32) ARG_TYPE_WIDTH)) - - -/* - * Reporting macros that are never compiled out - */ - -#define PARAM_LIST(pl) pl - -/* - * Error reporting. These versions add callers module and line#. Since - * _THIS_MODULE gets compiled out when ACPI_DEBUG isn't defined, only - * use it in debug mode. - */ - -#ifdef ACPI_DEBUG - -#define REPORT_INFO(fp) {_report_info(_THIS_MODULE,__LINE__,_COMPONENT); \ - debug_print_raw PARAM_LIST(fp);} -#define REPORT_ERROR(fp) {_report_error(_THIS_MODULE,__LINE__,_COMPONENT); \ - debug_print_raw PARAM_LIST(fp);} -#define REPORT_WARNING(fp) {_report_warning(_THIS_MODULE,__LINE__,_COMPONENT); \ - debug_print_raw PARAM_LIST(fp);} - -#else - -#define REPORT_INFO(fp) {_report_info("ACPI",__LINE__,_COMPONENT); \ - debug_print_raw PARAM_LIST(fp);} -#define REPORT_ERROR(fp) {_report_error("ACPI",__LINE__,_COMPONENT); \ - debug_print_raw PARAM_LIST(fp);} -#define REPORT_WARNING(fp) {_report_warning("ACPI",__LINE__,_COMPONENT); \ - debug_print_raw PARAM_LIST(fp);} - -#endif - -/* Error reporting. These versions pass thru the module and line# */ - -#define _REPORT_INFO(a,b,c,fp) {_report_info(a,b,c); \ - debug_print_raw PARAM_LIST(fp);} -#define _REPORT_ERROR(a,b,c,fp) {_report_error(a,b,c); \ - debug_print_raw PARAM_LIST(fp);} -#define _REPORT_WARNING(a,b,c,fp) {_report_warning(a,b,c); \ - debug_print_raw PARAM_LIST(fp);} - -/* Buffer dump macros */ - -#define DUMP_BUFFER(a,b) acpi_cm_dump_buffer((u8 *)a,b,DB_BYTE_DISPLAY,_COMPONENT) - -/* - * Debug macros that are conditionally compiled - */ - -#ifdef ACPI_DEBUG - -#define MODULE_NAME(name) static char *_THIS_MODULE = name; - -/* - * Function entry tracing. - * The first parameter should be the procedure name as a quoted string. This is declared - * as a local string ("_Proc_name) so that it can be also used by the function exit macros below. - */ - -#define FUNCTION_TRACE(a) char * _proc_name = a;\ - function_trace(_THIS_MODULE,__LINE__,_COMPONENT,a) -#define FUNCTION_TRACE_PTR(a,b) char * _proc_name = a;\ - function_trace_ptr(_THIS_MODULE,__LINE__,_COMPONENT,a,(void *)b) -#define FUNCTION_TRACE_U32(a,b) char * _proc_name = a;\ - function_trace_u32(_THIS_MODULE,__LINE__,_COMPONENT,a,(u32)b) -#define FUNCTION_TRACE_STR(a,b) char * _proc_name = a;\ - function_trace_str(_THIS_MODULE,__LINE__,_COMPONENT,a,(NATIVE_CHAR *)b) -/* - * Function exit tracing. - * WARNING: These macros include a return statement. This is usually considered - * bad form, but having a separate exit macro is very ugly and difficult to maintain. - * One of the FUNCTION_TRACE macros above must be used in conjunction with these macros - * so that "_Proc_name" is defined. - */ -#define return_VOID {function_exit(_THIS_MODULE,__LINE__,_COMPONENT,_proc_name);return;} -#define return_ACPI_STATUS(s) {function_status_exit(_THIS_MODULE,__LINE__,_COMPONENT,_proc_name,s);return(s);} -#define return_VALUE(s) {function_value_exit(_THIS_MODULE,__LINE__,_COMPONENT,_proc_name,(ACPI_INTEGER)s);return(s);} -#define return_PTR(s) {function_ptr_exit(_THIS_MODULE,__LINE__,_COMPONENT,_proc_name,(u8 *)s);return(s);} - - -/* Conditional execution */ - -#define DEBUG_EXEC(a) a -#define NORMAL_EXEC(a) - -#define DEBUG_DEFINE(a) a; -#define DEBUG_ONLY_MEMBERS(a) a; -#define _OPCODE_NAMES -#define _VERBOSE_STRUCTURES - - -/* Stack and buffer dumping */ - -#define DUMP_STACK_ENTRY(a) acpi_aml_dump_operand(a) -#define DUMP_OPERANDS(a,b,c,d,e) acpi_aml_dump_operands(a,b,c,d,e,_THIS_MODULE,__LINE__) - - -#define DUMP_ENTRY(a,b) acpi_ns_dump_entry (a,b) -#define DUMP_TABLES(a,b) acpi_ns_dump_tables(a,b) -#define DUMP_PATHNAME(a,b,c,d) acpi_ns_dump_pathname(a,b,c,d) -#define DUMP_RESOURCE_LIST(a) acpi_rs_dump_resource_list(a) -#define BREAK_MSG(a) acpi_os_breakpoint (a) - -/* - * Generate INT3 on ACPI_ERROR (Debug only!) - */ - -#define ERROR_BREAK -#ifdef ERROR_BREAK -#define BREAK_ON_ERROR(lvl) if ((lvl)&ACPI_ERROR) acpi_os_breakpoint("Fatal error encountered\n") -#else -#define BREAK_ON_ERROR(lvl) -#endif - -/* - * Master debug print macros - * Print iff: - * 1) Debug print for the current component is enabled - * 2) Debug error level or trace level for the print statement is enabled - * - */ - -#define TEST_DEBUG_SWITCH(lvl) if (((lvl) & acpi_dbg_level) && (_COMPONENT & acpi_dbg_layer)) - -#define DEBUG_PRINT(lvl,fp) TEST_DEBUG_SWITCH(lvl) {\ - debug_print_prefix (_THIS_MODULE,__LINE__);\ - debug_print_raw PARAM_LIST(fp);\ - BREAK_ON_ERROR(lvl);} - -#define DEBUG_PRINT_RAW(lvl,fp) TEST_DEBUG_SWITCH(lvl) {\ - debug_print_raw PARAM_LIST(fp);} - - -/* Assert macros */ - -#define ACPI_ASSERT(exp) if(!(exp)) \ - acpi_os_dbg_assert(#exp, __FILE__, __LINE__, "Failed Assertion") - -#define DEBUG_ASSERT(msg, exp) if(!(exp)) \ - acpi_os_dbg_assert(#exp, __FILE__, __LINE__, msg) - - -#else -/* - * This is the non-debug case -- make everything go away, - * leaving no executable debug code! - */ - -#define MODULE_NAME(name) -#define _THIS_MODULE "" - -#define DEBUG_EXEC(a) -#define NORMAL_EXEC(a) a; - -#define DEBUG_DEFINE(a) -#define DEBUG_ONLY_MEMBERS(a) -#define FUNCTION_TRACE(a) -#define FUNCTION_TRACE_PTR(a,b) -#define FUNCTION_TRACE_U32(a,b) -#define FUNCTION_TRACE_STR(a,b) -#define FUNCTION_EXIT -#define FUNCTION_STATUS_EXIT(s) -#define FUNCTION_VALUE_EXIT(s) -#define DUMP_STACK_ENTRY(a) -#define DUMP_OPERANDS(a,b,c,d,e) -#define DUMP_ENTRY(a,b) -#define DUMP_TABLES(a,b) -#define DUMP_PATHNAME(a,b,c,d) -#define DUMP_RESOURCE_LIST(a) -#define DEBUG_PRINT(l,f) -#define DEBUG_PRINT_RAW(l,f) -#define BREAK_MSG(a) - -#define return_VOID return -#define return_ACPI_STATUS(s) return(s) -#define return_VALUE(s) return(s) -#define return_PTR(s) return(s) - -#define ACPI_ASSERT(exp) -#define DEBUG_ASSERT(msg, exp) - -#endif - -/* - * Some code only gets executed when the debugger is built in. - * Note that this is entirely independent of whether the - * DEBUG_PRINT stuff (set by ACPI_DEBUG) is on, or not. - */ -#ifdef ENABLE_DEBUGGER -#define DEBUGGER_EXEC(a) a -#else -#define DEBUGGER_EXEC(a) -#endif - - -/* - * For 16-bit code, we want to shrink some things even though - * we are using ACPI_DEBUG to get the debug output - */ -#ifdef _IA16 -#undef DEBUG_ONLY_MEMBERS -#undef _VERBOSE_STRUCTURES -#define DEBUG_ONLY_MEMBERS(a) -#endif - - -#ifdef ACPI_DEBUG - -/* - * 1) Set name to blanks - * 2) Copy the object name - */ - -#define ADD_OBJECT_NAME(a,b) MEMSET (a->common.name, ' ', sizeof (a->common.name));\ - STRNCPY (a->common.name, acpi_gbl_ns_type_names[b], sizeof (a->common.name)) - -#else - -#define ADD_OBJECT_NAME(a,b) - -#endif - - -#endif /* ACMACROS_H */ diff --git a/reactos/drivers/bus/acpi/include/acnamesp.h b/reactos/drivers/bus/acpi/include/acnamesp.h deleted file mode 100644 index ad1d0a60f88..00000000000 --- a/reactos/drivers/bus/acpi/include/acnamesp.h +++ /dev/null @@ -1,430 +0,0 @@ -/****************************************************************************** - * - * Name: acnamesp.h - Namespace subcomponent prototypes and defines - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACNAMESP_H__ -#define __ACNAMESP_H__ - - -/* To search the entire name space, pass this as Search_base */ - -#define NS_ALL ((ACPI_HANDLE)0) - -/* - * Elements of Acpi_ns_properties are bit significant - * and should be one-to-one with values of ACPI_OBJECT_TYPE - */ -#define NSP_NORMAL 0 -#define NSP_NEWSCOPE 1 /* a definition of this type opens a name scope */ -#define NSP_LOCAL 2 /* suppress search of enclosing scopes */ - - -/* Definitions of the predefined namespace names */ - -#define ACPI_UNKNOWN_NAME (u32) 0x3F3F3F3F /* Unknown name is "????" */ -#define ACPI_ROOT_NAME (u32) 0x2F202020 /* Root name is "/ " */ -#define ACPI_SYS_BUS_NAME (u32) 0x5F53425F /* Sys bus name is "_SB_" */ - -#define NS_ROOT_PATH "/" -#define NS_SYSTEM_BUS "_SB_" - - -/* Flags for Acpi_ns_lookup, Acpi_ns_search_and_enter */ - -#define NS_NO_UPSEARCH 0 -#define NS_SEARCH_PARENT 0x01 -#define NS_DONT_OPEN_SCOPE 0x02 -#define NS_NO_PEER_SEARCH 0x04 -#define NS_ERROR_IF_FOUND 0x08 - -#define NS_WALK_UNLOCK TRUE -#define NS_WALK_NO_UNLOCK FALSE - - -ACPI_STATUS -acpi_ns_load_namespace ( - void); - -ACPI_STATUS -acpi_ns_initialize_objects ( - void); - -ACPI_STATUS -acpi_ns_initialize_devices ( - void); - - -/* Namespace init - nsxfinit */ - -ACPI_STATUS -acpi_ns_init_one_device ( - ACPI_HANDLE obj_handle, - u32 nesting_level, - void *context, - void **return_value); - -ACPI_STATUS -acpi_ns_init_one_object ( - ACPI_HANDLE obj_handle, - u32 level, - void *context, - void **return_value); - - -ACPI_STATUS -acpi_ns_walk_namespace ( - OBJECT_TYPE_INTERNAL type, - ACPI_HANDLE start_object, - u32 max_depth, - u8 unlock_before_callback, - WALK_CALLBACK user_function, - void *context, - void **return_value); - - -ACPI_NAMESPACE_NODE * -acpi_ns_get_next_object ( - OBJECT_TYPE_INTERNAL type, - ACPI_NAMESPACE_NODE *parent, - ACPI_NAMESPACE_NODE *child); - - -ACPI_STATUS -acpi_ns_delete_namespace_by_owner ( - u16 table_id); - - -/* Namespace loading - nsload */ - -ACPI_STATUS -acpi_ns_one_complete_parse ( - u32 pass_number, - ACPI_TABLE_DESC *table_desc); - -ACPI_STATUS -acpi_ns_parse_table ( - ACPI_TABLE_DESC *table_desc, - ACPI_NAMESPACE_NODE *scope); - -ACPI_STATUS -acpi_ns_load_table ( - ACPI_TABLE_DESC *table_desc, - ACPI_NAMESPACE_NODE *node); - -ACPI_STATUS -acpi_ns_load_table_by_type ( - ACPI_TABLE_TYPE table_type); - - -/* - * Top-level namespace access - nsaccess - */ - - -ACPI_STATUS -acpi_ns_root_initialize ( - void); - -ACPI_STATUS -acpi_ns_lookup ( - ACPI_GENERIC_STATE *scope_info, - NATIVE_CHAR *name, - OBJECT_TYPE_INTERNAL type, - OPERATING_MODE interpreter_mode, - u32 flags, - ACPI_WALK_STATE *walk_state, - ACPI_NAMESPACE_NODE **ret_node); - - -/* - * Named object allocation/deallocation - nsalloc - */ - - -ACPI_NAMESPACE_NODE * -acpi_ns_create_node ( - u32 acpi_name); - -void -acpi_ns_delete_node ( - ACPI_NAMESPACE_NODE *node); - -ACPI_STATUS -acpi_ns_delete_namespace_subtree ( - ACPI_NAMESPACE_NODE *parent_handle); - -void -acpi_ns_detach_object ( - ACPI_NAMESPACE_NODE *node); - -void -acpi_ns_delete_children ( - ACPI_NAMESPACE_NODE *parent); - - -/* - * Namespace modification - nsmodify - */ - -ACPI_STATUS -acpi_ns_unload_namespace ( - ACPI_HANDLE handle); - -ACPI_STATUS -acpi_ns_delete_subtree ( - ACPI_HANDLE start_handle); - - -/* - * Namespace dump/print utilities - nsdump - */ - -void -acpi_ns_dump_tables ( - ACPI_HANDLE search_base, - u32 max_depth); - -void -acpi_ns_dump_entry ( - ACPI_HANDLE handle, - u32 debug_level); - -ACPI_STATUS -acpi_ns_dump_pathname ( - ACPI_HANDLE handle, - NATIVE_CHAR *msg, - u32 level, - u32 component); - -void -acpi_ns_dump_root_devices ( - void); - -void -acpi_ns_dump_objects ( - OBJECT_TYPE_INTERNAL type, - u32 max_depth, - u32 ownder_id, - ACPI_HANDLE start_handle); - - -/* - * Namespace evaluation functions - nseval - */ - -ACPI_STATUS -acpi_ns_evaluate_by_handle ( - ACPI_NAMESPACE_NODE *prefix_node, - ACPI_OPERAND_OBJECT **params, - ACPI_OPERAND_OBJECT **return_object); - -ACPI_STATUS -acpi_ns_evaluate_by_name ( - NATIVE_CHAR *pathname, - ACPI_OPERAND_OBJECT **params, - ACPI_OPERAND_OBJECT **return_object); - -ACPI_STATUS -acpi_ns_evaluate_relative ( - ACPI_NAMESPACE_NODE *prefix_node, - NATIVE_CHAR *pathname, - ACPI_OPERAND_OBJECT **params, - ACPI_OPERAND_OBJECT **return_object); - -ACPI_STATUS -acpi_ns_execute_control_method ( - ACPI_NAMESPACE_NODE *method_node, - ACPI_OPERAND_OBJECT **params, - ACPI_OPERAND_OBJECT **return_obj_desc); - -ACPI_STATUS -acpi_ns_get_object_value ( - ACPI_NAMESPACE_NODE *object_node, - ACPI_OPERAND_OBJECT **return_obj_desc); - - -/* - * Parent/Child/Peer utility functions - nsfamily - */ - -ACPI_NAME -acpi_ns_find_parent_name ( - ACPI_NAMESPACE_NODE *node_to_search); - -u8 -acpi_ns_exist_downstream_sibling ( - ACPI_NAMESPACE_NODE *this_node); - - -/* - * Scope manipulation - nsscope - */ - -u32 -acpi_ns_opens_scope ( - OBJECT_TYPE_INTERNAL type); - -NATIVE_CHAR * -acpi_ns_get_table_pathname ( - ACPI_NAMESPACE_NODE *node); - -NATIVE_CHAR * -acpi_ns_name_of_current_scope ( - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ns_handle_to_pathname ( - ACPI_HANDLE obj_handle, - u32 *buf_size, - NATIVE_CHAR *user_buffer); - -u8 -acpi_ns_pattern_match ( - ACPI_NAMESPACE_NODE *obj_node, - NATIVE_CHAR *search_for); - -ACPI_STATUS -acpi_ns_name_compare ( - ACPI_HANDLE obj_handle, - u32 level, - void *context, - void **return_value); - -ACPI_STATUS -acpi_ns_get_node ( - NATIVE_CHAR *pathname, - ACPI_NAMESPACE_NODE *in_prefix_node, - ACPI_NAMESPACE_NODE **out_node); - -u32 -acpi_ns_get_pathname_length ( - ACPI_NAMESPACE_NODE *node); - - -/* - * Object management for NTEs - nsobject - */ - -ACPI_STATUS -acpi_ns_attach_object ( - ACPI_NAMESPACE_NODE *node, - ACPI_OPERAND_OBJECT *object, - OBJECT_TYPE_INTERNAL type); - - -void * -acpi_ns_compare_value ( - ACPI_HANDLE obj_handle, - u32 level, - void *obj_desc); - - -/* - * Namespace searching and entry - nssearch - */ - -ACPI_STATUS -acpi_ns_search_and_enter ( - u32 entry_name, - ACPI_WALK_STATE *walk_state, - ACPI_NAMESPACE_NODE *node, - OPERATING_MODE interpreter_mode, - OBJECT_TYPE_INTERNAL type, - u32 flags, - ACPI_NAMESPACE_NODE **ret_node); - -ACPI_STATUS -acpi_ns_search_node ( - u32 entry_name, - ACPI_NAMESPACE_NODE *node, - OBJECT_TYPE_INTERNAL type, - ACPI_NAMESPACE_NODE **ret_node); - -void -acpi_ns_install_node ( - ACPI_WALK_STATE *walk_state, - ACPI_NAMESPACE_NODE *parent_node, /* Parent */ - ACPI_NAMESPACE_NODE *node, /* New Child*/ - OBJECT_TYPE_INTERNAL type); - - -/* - * Utility functions - nsutils - */ - -u8 -acpi_ns_valid_root_prefix ( - NATIVE_CHAR prefix); - -u8 -acpi_ns_valid_path_separator ( - NATIVE_CHAR sep); - -OBJECT_TYPE_INTERNAL -acpi_ns_get_type ( - ACPI_HANDLE obj_handle); - -void * -acpi_ns_get_attached_object ( - ACPI_HANDLE obj_handle); - -u32 -acpi_ns_local ( - OBJECT_TYPE_INTERNAL type); - -ACPI_STATUS -acpi_ns_internalize_name ( - NATIVE_CHAR *dotted_name, - NATIVE_CHAR **converted_name); - -ACPI_STATUS -acpi_ns_externalize_name ( - u32 internal_name_length, - NATIVE_CHAR *internal_name, - u32 *converted_name_length, - NATIVE_CHAR **converted_name); - -ACPI_NAMESPACE_NODE * -acpi_ns_convert_handle_to_entry ( - ACPI_HANDLE handle); - -ACPI_HANDLE -acpi_ns_convert_entry_to_handle( - ACPI_NAMESPACE_NODE *node); - -void -acpi_ns_terminate ( - void); - -ACPI_NAMESPACE_NODE * -acpi_ns_get_parent_object ( - ACPI_NAMESPACE_NODE *node); - - -ACPI_NAMESPACE_NODE * -acpi_ns_get_next_valid_object ( - ACPI_NAMESPACE_NODE *node); - - -#endif /* __ACNAMESP_H__ */ diff --git a/reactos/drivers/bus/acpi/include/acobject.h b/reactos/drivers/bus/acpi/include/acobject.h deleted file mode 100644 index 5996628dcf8..00000000000 --- a/reactos/drivers/bus/acpi/include/acobject.h +++ /dev/null @@ -1,425 +0,0 @@ - -/****************************************************************************** - * - * Name: acobject.h - Definition of ACPI_OPERAND_OBJECT (Internal object only) - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _ACOBJECT_H -#define _ACOBJECT_H - - -/* - * The ACPI_OPERAND_OBJECT is used to pass AML operands from the dispatcher - * to the interpreter, and to keep track of the various handlers such as - * address space handlers and notify handlers. The object is a constant - * size in order to allow them to be cached and reused. - * - * All variants of the ACPI_OPERAND_OBJECT are defined with the same - * sequence of field types, with fields that are not used in a particular - * variant being named "Reserved". This is not strictly necessary, but - * may in some circumstances simplify understanding if these structures - * need to be displayed in a debugger having limited (or no) support for - * union types. It also simplifies some debug code in Dump_table() which - * dumps multi-level values: fetching Buffer.Pointer suffices to pick up - * the value or next level for any of several types. - */ - -/****************************************************************************** - * - * Common Descriptors - * - *****************************************************************************/ - -/* - * Common area for all objects. - * - * Data_type is used to differentiate between internal descriptors, and MUST - * be the first byte in this structure. - */ - - -#define ACPI_OBJECT_COMMON_HEADER /* 32-bits plus 8-bit flag */\ - u8 data_type; /* To differentiate various internal objs */\ - u8 type; /* ACPI_OBJECT_TYPE */\ - u16 reference_count; /* For object deletion management */\ - u8 flags; \ - -/* Defines for flag byte above */ - -#define AOPOBJ_STATIC_ALLOCATION 0x1 -#define AOPOBJ_DATA_VALID 0x2 -#define AOPOBJ_INITIALIZED 0x4 - - -/* - * Common bitfield for the field objects - */ -#define ACPI_COMMON_FIELD_INFO /* Three 32-bit values plus 8*/\ - u8 granularity;\ - u16 length; \ - u32 offset; /* Byte offset within containing object */\ - u8 bit_offset; /* Bit offset within min read/write data unit */\ - u8 access; /* Access_type */\ - u8 lock_rule;\ - u8 update_rule;\ - u8 access_attribute; - - -/****************************************************************************** - * - * Individual Object Descriptors - * - *****************************************************************************/ - - -typedef struct /* COMMON */ -{ - ACPI_OBJECT_COMMON_HEADER - -} ACPI_OBJECT_COMMON; - - -typedef struct /* CACHE_LIST */ -{ - ACPI_OBJECT_COMMON_HEADER - union acpi_operand_obj *next; /* Link for object cache and internal lists*/ - -} ACPI_OBJECT_CACHE_LIST; - - -typedef struct /* NUMBER - has value */ -{ - ACPI_OBJECT_COMMON_HEADER - - ACPI_INTEGER value; - -} ACPI_OBJECT_INTEGER; - - -typedef struct /* STRING - has length and pointer - Null terminated, ASCII characters only */ -{ - ACPI_OBJECT_COMMON_HEADER - - u32 length; - NATIVE_CHAR *pointer; /* String value in AML stream or in allocated space */ - -} ACPI_OBJECT_STRING; - - -typedef struct /* BUFFER - has length and pointer - not null terminated */ -{ - ACPI_OBJECT_COMMON_HEADER - - u32 length; - u8 *pointer; /* points to the buffer in allocated space */ - -} ACPI_OBJECT_BUFFER; - - -typedef struct /* PACKAGE - has count, elements, next element */ -{ - ACPI_OBJECT_COMMON_HEADER - - u32 count; /* # of elements in package */ - - union acpi_operand_obj **elements; /* Array of pointers to Acpi_objects */ - union acpi_operand_obj **next_element; /* used only while initializing */ - -} ACPI_OBJECT_PACKAGE; - - -typedef struct /* FIELD UNIT */ -{ - ACPI_OBJECT_COMMON_HEADER - - ACPI_COMMON_FIELD_INFO - - union acpi_operand_obj *extra; /* Pointer to executable AML (in field definition) */ - ACPI_NAMESPACE_NODE *node; /* containing object */ - union acpi_operand_obj *container; /* Containing object (Buffer) */ - -} ACPI_OBJECT_FIELD_UNIT; - - -typedef struct /* DEVICE - has handle and notification handler/context */ -{ - ACPI_OBJECT_COMMON_HEADER - - union acpi_operand_obj *sys_handler; /* Handler for system notifies */ - union acpi_operand_obj *drv_handler; /* Handler for driver notifies */ - union acpi_operand_obj *addr_handler; /* Handler for Address space */ - -} ACPI_OBJECT_DEVICE; - - -typedef struct /* EVENT */ -{ - ACPI_OBJECT_COMMON_HEADER - void *semaphore; - -} ACPI_OBJECT_EVENT; - - -#define INFINITE_CONCURRENCY 0xFF - -typedef struct /* METHOD */ -{ - ACPI_OBJECT_COMMON_HEADER - u8 method_flags; - u8 param_count; - - u32 pcode_length; - - void *semaphore; - u8 *pcode; - - u8 concurrency; - u8 thread_count; - ACPI_OWNER_ID owning_id; - -} ACPI_OBJECT_METHOD; - - -typedef struct acpi_obj_mutex /* MUTEX */ -{ - ACPI_OBJECT_COMMON_HEADER - u16 sync_level; - u16 acquisition_depth; - - void *semaphore; - void *owner; - union acpi_operand_obj *prev; /* Link for list of acquired mutexes */ - union acpi_operand_obj *next; /* Link for list of acquired mutexes */ - -} ACPI_OBJECT_MUTEX; - - -typedef struct /* REGION */ -{ - ACPI_OBJECT_COMMON_HEADER - - u8 space_id; - u32 length; - ACPI_PHYSICAL_ADDRESS address; - union acpi_operand_obj *extra; /* Pointer to executable AML (in region definition) */ - - union acpi_operand_obj *addr_handler; /* Handler for system notifies */ - ACPI_NAMESPACE_NODE *node; /* containing object */ - union acpi_operand_obj *next; - -} ACPI_OBJECT_REGION; - - -typedef struct /* POWER RESOURCE - has Handle and notification handler/context*/ -{ - ACPI_OBJECT_COMMON_HEADER - - u32 system_level; - u32 resource_order; - - union acpi_operand_obj *sys_handler; /* Handler for system notifies */ - union acpi_operand_obj *drv_handler; /* Handler for driver notifies */ - -} ACPI_OBJECT_POWER_RESOURCE; - - -typedef struct /* PROCESSOR - has Handle and notification handler/context*/ -{ - ACPI_OBJECT_COMMON_HEADER - - u32 proc_id; - u32 length; - ACPI_IO_ADDRESS address; - - union acpi_operand_obj *sys_handler; /* Handler for system notifies */ - union acpi_operand_obj *drv_handler; /* Handler for driver notifies */ - union acpi_operand_obj *addr_handler; /* Handler for Address space */ - -} ACPI_OBJECT_PROCESSOR; - - -typedef struct /* THERMAL ZONE - has Handle and Handler/Context */ -{ - ACPI_OBJECT_COMMON_HEADER - - union acpi_operand_obj *sys_handler; /* Handler for system notifies */ - union acpi_operand_obj *drv_handler; /* Handler for driver notifies */ - union acpi_operand_obj *addr_handler; /* Handler for Address space */ - -} ACPI_OBJECT_THERMAL_ZONE; - - -/* - * Internal types - */ - - -typedef struct /* FIELD */ -{ - ACPI_OBJECT_COMMON_HEADER - - ACPI_COMMON_FIELD_INFO - - union acpi_operand_obj *container; /* Containing object */ - -} ACPI_OBJECT_FIELD; - - -typedef struct /* BANK FIELD */ -{ - ACPI_OBJECT_COMMON_HEADER - - ACPI_COMMON_FIELD_INFO - u32 value; /* Value to store into Bank_select */ - - ACPI_HANDLE bank_select; /* Bank select register */ - union acpi_operand_obj *container; /* Containing object */ - -} ACPI_OBJECT_BANK_FIELD; - - -typedef struct /* INDEX FIELD */ -{ - /* - * No container pointer needed since the index and data register definitions - * will define how to access the respective registers - */ - ACPI_OBJECT_COMMON_HEADER - - ACPI_COMMON_FIELD_INFO - u32 value; /* Value to store into Index register */ - - ACPI_HANDLE index; /* Index register */ - ACPI_HANDLE data; /* Data register */ - -} ACPI_OBJECT_INDEX_FIELD; - - -typedef struct /* NOTIFY HANDLER */ -{ - ACPI_OBJECT_COMMON_HEADER - - ACPI_NAMESPACE_NODE *node; /* Parent device */ - NOTIFY_HANDLER handler; - void *context; - -} ACPI_OBJECT_NOTIFY_HANDLER; - - -/* Flags for address handler */ - -#define ADDR_HANDLER_DEFAULT_INSTALLED 0x1 - - -typedef struct /* ADDRESS HANDLER */ -{ - ACPI_OBJECT_COMMON_HEADER - - u8 space_id; - u16 hflags; - ADDRESS_SPACE_HANDLER handler; - - ACPI_NAMESPACE_NODE *node; /* Parent device */ - void *context; - ADDRESS_SPACE_SETUP setup; - union acpi_operand_obj *region_list; /* regions using this handler */ - union acpi_operand_obj *next; - -} ACPI_OBJECT_ADDR_HANDLER; - - -/* - * The Reference object type is used for these opcodes: - * Arg[0-6], Local[0-7], Index_op, Name_op, Zero_op, One_op, Ones_op, Debug_op - */ - -typedef struct /* Reference - Local object type */ -{ - ACPI_OBJECT_COMMON_HEADER - - u8 target_type; /* Used for Index_op */ - u16 opcode; - u32 offset; /* Used for Arg_op, Local_op, and Index_op */ - - void *object; /* Name_op=>HANDLE to obj, Index_op=>ACPI_OPERAND_OBJECT */ - ACPI_NAMESPACE_NODE *node; - union acpi_operand_obj **where; - -} ACPI_OBJECT_REFERENCE; - - -/* - * Extra object is used as additional storage for types that - * have AML code in their declarations (Term_args) that must be - * evaluated at run time. - * - * Currently: Region and Field_unit types - */ - -typedef struct /* EXTRA */ -{ - ACPI_OBJECT_COMMON_HEADER - u8 byte_fill1; - u16 word_fill1; - u32 pcode_length; - u8 *pcode; - ACPI_NAMESPACE_NODE *method_REG; /* _REG method for this region (if any) */ - void *region_context; /* Region-specific data */ - -} ACPI_OBJECT_EXTRA; - - -/****************************************************************************** - * - * ACPI_OPERAND_OBJECT Descriptor - a giant union of all of the above - * - *****************************************************************************/ - -typedef union acpi_operand_obj -{ - ACPI_OBJECT_COMMON common; - ACPI_OBJECT_CACHE_LIST cache; - ACPI_OBJECT_INTEGER integer; - ACPI_OBJECT_STRING string; - ACPI_OBJECT_BUFFER buffer; - ACPI_OBJECT_PACKAGE package; - ACPI_OBJECT_FIELD_UNIT field_unit; - ACPI_OBJECT_DEVICE device; - ACPI_OBJECT_EVENT event; - ACPI_OBJECT_METHOD method; - ACPI_OBJECT_MUTEX mutex; - ACPI_OBJECT_REGION region; - ACPI_OBJECT_POWER_RESOURCE power_resource; - ACPI_OBJECT_PROCESSOR processor; - ACPI_OBJECT_THERMAL_ZONE thermal_zone; - ACPI_OBJECT_FIELD field; - ACPI_OBJECT_BANK_FIELD bank_field; - ACPI_OBJECT_INDEX_FIELD index_field; - ACPI_OBJECT_REFERENCE reference; - ACPI_OBJECT_NOTIFY_HANDLER notify_handler; - ACPI_OBJECT_ADDR_HANDLER addr_handler; - ACPI_OBJECT_EXTRA extra; - -} ACPI_OPERAND_OBJECT; - -#endif /* _ACOBJECT_H */ diff --git a/reactos/drivers/bus/acpi/include/acoutput.h b/reactos/drivers/bus/acpi/include/acoutput.h deleted file mode 100644 index 82d137bb5b7..00000000000 --- a/reactos/drivers/bus/acpi/include/acoutput.h +++ /dev/null @@ -1,132 +0,0 @@ -/****************************************************************************** - * - * Name: acoutput.h -- debug output - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACOUTPUT_H__ -#define __ACOUTPUT_H__ - -/* - * Debug levels and component IDs. These are used to control the - * granularity of the output of the DEBUG_PRINT macro -- on a per- - * component basis and a per-exception-type basis. - */ - -/* Component IDs -- used in the global "Debug_layer" */ - -#define ACPI_UTILITIES 0x00000001 -#define ACPI_HARDWARE 0x00000002 -#define ACPI_EVENTS 0x00000003 -#define ACPI_TABLES 0x00000008 -#define ACPI_NAMESPACE 0x00000010 -#define ACPI_PARSER 0x00000020 -#define ACPI_DISPATCHER 0x00000040 -#define ACPI_EXECUTER 0x00000080 -#define ACPI_RESOURCES 0x00000100 -#define ACPI_DEVICES 0x00000200 -#define ACPI_POWER 0x00000400 - - -#define ACPI_BUS_MANAGER 0x00001000 -#define ACPI_POWER_CONTROL 0x00002000 -#define ACPI_EMBEDDED_CONTROLLER 0x00004000 -#define ACPI_PROCESSOR_CONTROL 0x00008000 -#define ACPI_AC_ADAPTER 0x00010000 -#define ACPI_BATTERY 0x00020000 -#define ACPI_BUTTON 0x00040000 -#define ACPI_SYSTEM 0x00080000 -#define ACPI_THERMAL_ZONE 0x00100000 - -#define ACPI_DEBUGGER 0x01000000 -#define ACPI_OS_SERVICES 0x02000000 -#define ACPI_ALL_COMPONENTS 0x01FFFFFF - -#define ACPI_COMPONENT_DEFAULT (ACPI_ALL_COMPONENTS) - - -#define ACPI_COMPILER 0x10000000 -#define ACPI_TOOLS 0x20000000 - - -/* Exception level -- used in the global "Debug_level" */ - -#define ACPI_OK 0x00000001 -#define ACPI_INFO 0x00000002 -#define ACPI_WARN 0x00000004 -#define ACPI_ERROR 0x00000008 -#define ACPI_FATAL 0x00000010 -#define ACPI_DEBUG_OBJECT 0x00000020 -#define ACPI_ALL 0x0000003F - - -/* Trace level -- also used in the global "Debug_level" */ - -#define TRACE_PARSE 0x00000100 -#define TRACE_DISPATCH 0x00000200 -#define TRACE_LOAD 0x00000400 -#define TRACE_EXEC 0x00000800 -#define TRACE_NAMES 0x00001000 -#define TRACE_OPREGION 0x00002000 -#define TRACE_BFIELD 0x00004000 -#define TRACE_TRASH 0x00008000 -#define TRACE_TABLES 0x00010000 -#define TRACE_FUNCTIONS 0x00020000 -#define TRACE_VALUES 0x00040000 -#define TRACE_OBJECTS 0x00080000 -#define TRACE_ALLOCATIONS 0x00100000 -#define TRACE_RESOURCES 0x00200000 -#define TRACE_IO 0x00400000 -#define TRACE_INTERRUPTS 0x00800000 -#define TRACE_USER_REQUESTS 0x01000000 -#define TRACE_PACKAGE 0x02000000 -#define TRACE_MUTEX 0x04000000 -#define TRACE_INIT 0x08000000 - -#define TRACE_ALL 0x0FFFFF00 - - -/* Exceptionally verbose output -- also used in the global "Debug_level" */ - -#define VERBOSE_AML_DISASSEMBLE 0x10000000 -#define VERBOSE_INFO 0x20000000 -#define VERBOSE_TABLES 0x40000000 -#define VERBOSE_EVENTS 0x80000000 - -#define VERBOSE_ALL 0xF0000000 - - -/* Defaults for Debug_level, debug and normal */ - -#define DEBUG_DEFAULT (ACPI_OK | ACPI_WARN | ACPI_ERROR | ACPI_DEBUG_OBJECT) -#define NORMAL_DEFAULT (ACPI_OK | ACPI_WARN | ACPI_ERROR | ACPI_DEBUG_OBJECT) -#define DEBUG_ALL (VERBOSE_AML_DISASSEMBLE | TRACE_ALL | ACPI_ALL) - -/* Misc defines */ - -#define HEX 0x01 -#define ASCII 0x02 -#define FULL_ADDRESS 0x04 -#define CHARS_PER_LINE 16 /* used in Dump_buf function */ - - -#endif /* __ACOUTPUT_H__ */ diff --git a/reactos/drivers/bus/acpi/include/acparser.h b/reactos/drivers/bus/acpi/include/acparser.h deleted file mode 100644 index 83a6c6761d6..00000000000 --- a/reactos/drivers/bus/acpi/include/acparser.h +++ /dev/null @@ -1,346 +0,0 @@ -/****************************************************************************** - * - * Module Name: acparser.h - AML Parser subcomponent prototypes and defines - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#ifndef __ACPARSER_H__ -#define __ACPARSER_H__ - - -#define OP_HAS_RETURN_VALUE 1 - -/* variable # arguments */ - -#define ACPI_VAR_ARGS ACPI_UINT32_MAX - -/* maximum virtual address */ - -#define ACPI_MAX_AML ((u8 *)(~0UL)) - - -#define ACPI_PARSE_DELETE_TREE 0x0001 -#define ACPI_PARSE_NO_TREE_DELETE 0x0000 -#define ACPI_PARSE_TREE_MASK 0x0001 - -#define ACPI_PARSE_LOAD_PASS1 0x0010 -#define ACPI_PARSE_LOAD_PASS2 0x0020 -#define ACPI_PARSE_EXECUTE 0x0030 -#define ACPI_PARSE_MODE_MASK 0x0030 - -/* psapi - Parser external interfaces */ - -ACPI_STATUS -acpi_psx_load_table ( - u8 *pcode_addr, - u32 pcode_length); - -ACPI_STATUS -acpi_psx_execute ( - ACPI_NAMESPACE_NODE *method_node, - ACPI_OPERAND_OBJECT **params, - ACPI_OPERAND_OBJECT **return_obj_desc); - - -u8 -acpi_ps_is_namespace_object_op ( - u16 opcode); -u8 -acpi_ps_is_namespace_op ( - u16 opcode); - - -/****************************************************************************** - * - * Parser interfaces - * - *****************************************************************************/ - - -/* psargs - Parse AML opcode arguments */ - -u8 * -acpi_ps_get_next_package_end ( - ACPI_PARSE_STATE *parser_state); - -u32 -acpi_ps_get_next_package_length ( - ACPI_PARSE_STATE *parser_state); - -NATIVE_CHAR * -acpi_ps_get_next_namestring ( - ACPI_PARSE_STATE *parser_state); - -void -acpi_ps_get_next_simple_arg ( - ACPI_PARSE_STATE *parser_state, - u32 arg_type, /* type of argument */ - ACPI_PARSE_OBJECT *arg); /* (OUT) argument data */ - -void -acpi_ps_get_next_namepath ( - ACPI_PARSE_STATE *parser_state, - ACPI_PARSE_OBJECT *arg, - u32 *arg_count, - u8 method_call); - -ACPI_PARSE_OBJECT * -acpi_ps_get_next_field ( - ACPI_PARSE_STATE *parser_state); - -ACPI_PARSE_OBJECT * -acpi_ps_get_next_arg ( - ACPI_PARSE_STATE *parser_state, - u32 arg_type, - u32 *arg_count); - - -/* psopcode - AML Opcode information */ - -ACPI_OPCODE_INFO * -acpi_ps_get_opcode_info ( - u16 opcode); - -NATIVE_CHAR * -acpi_ps_get_opcode_name ( - u16 opcode); - - -/* psparse - top level parsing routines */ - -ACPI_STATUS -acpi_ps_find_object ( - u16 opcode, - ACPI_PARSE_OBJECT *op, - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT **out_op); - -void -acpi_ps_delete_parse_tree ( - ACPI_PARSE_OBJECT *root); - -ACPI_STATUS -acpi_ps_parse_loop ( - ACPI_WALK_STATE *walk_state); - -ACPI_STATUS -acpi_ps_parse_aml ( - ACPI_PARSE_OBJECT *start_scope, - u8 *aml, - u32 aml_size, - u32 parse_flags, - ACPI_NAMESPACE_NODE *method_node, - ACPI_OPERAND_OBJECT **params, - ACPI_OPERAND_OBJECT **caller_return_desc, - ACPI_PARSE_DOWNWARDS descending_callback, - ACPI_PARSE_UPWARDS ascending_callback); - -ACPI_STATUS -acpi_ps_parse_table ( - u8 *aml, - u32 aml_size, - ACPI_PARSE_DOWNWARDS descending_callback, - ACPI_PARSE_UPWARDS ascending_callback, - ACPI_PARSE_OBJECT **root_object); - -u16 -acpi_ps_peek_opcode ( - ACPI_PARSE_STATE *state); - - -/* psscope - Scope stack management routines */ - - -ACPI_STATUS -acpi_ps_init_scope ( - ACPI_PARSE_STATE *parser_state, - ACPI_PARSE_OBJECT *root); - -ACPI_PARSE_OBJECT * -acpi_ps_get_parent_scope ( - ACPI_PARSE_STATE *state); - -u8 -acpi_ps_has_completed_scope ( - ACPI_PARSE_STATE *parser_state); - -void -acpi_ps_pop_scope ( - ACPI_PARSE_STATE *parser_state, - ACPI_PARSE_OBJECT **op, - u32 *arg_list, - u32 *arg_count); - -ACPI_STATUS -acpi_ps_push_scope ( - ACPI_PARSE_STATE *parser_state, - ACPI_PARSE_OBJECT *op, - u32 remaining_args, - u32 arg_count); - -void -acpi_ps_cleanup_scope ( - ACPI_PARSE_STATE *state); - - -/* pstree - parse tree manipulation routines */ - -void -acpi_ps_append_arg( - ACPI_PARSE_OBJECT *op, - ACPI_PARSE_OBJECT *arg); - -ACPI_PARSE_OBJECT* -acpi_ps_find ( - ACPI_PARSE_OBJECT *scope, - NATIVE_CHAR *path, - u16 opcode, - u32 create); - -ACPI_PARSE_OBJECT * -acpi_ps_get_arg( - ACPI_PARSE_OBJECT *op, - u32 argn); - -ACPI_PARSE_OBJECT * -acpi_ps_get_child ( - ACPI_PARSE_OBJECT *op); - -ACPI_PARSE_OBJECT * -acpi_ps_get_depth_next ( - ACPI_PARSE_OBJECT *origin, - ACPI_PARSE_OBJECT *op); - - -/* pswalk - parse tree walk routines */ - -ACPI_STATUS -acpi_ps_walk_parsed_aml ( - ACPI_PARSE_OBJECT *start_op, - ACPI_PARSE_OBJECT *end_op, - ACPI_OPERAND_OBJECT *mth_desc, - ACPI_NAMESPACE_NODE *start_node, - ACPI_OPERAND_OBJECT **params, - ACPI_OPERAND_OBJECT **caller_return_desc, - ACPI_OWNER_ID owner_id, - ACPI_PARSE_DOWNWARDS descending_callback, - ACPI_PARSE_UPWARDS ascending_callback); - -ACPI_STATUS -acpi_ps_get_next_walk_op ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op, - ACPI_PARSE_UPWARDS ascending_callback); - - -/* psutils - parser utilities */ - - -ACPI_PARSE_STATE * -acpi_ps_create_state ( - u8 *aml, - u32 aml_size); - -void -acpi_ps_init_op ( - ACPI_PARSE_OBJECT *op, - u16 opcode); - -ACPI_PARSE_OBJECT * -acpi_ps_alloc_op ( - u16 opcode); - -void -acpi_ps_free_op ( - ACPI_PARSE_OBJECT *op); - -void -acpi_ps_delete_parse_cache ( - void); - -u8 -acpi_ps_is_leading_char ( - u32 c); - -u8 -acpi_ps_is_prefix_char ( - u32 c); - -u8 -acpi_ps_is_named_op ( - u16 opcode); - -u8 -acpi_ps_is_node_op ( - u16 opcode); - -u8 -acpi_ps_is_deferred_op ( - u16 opcode); - -u8 -acpi_ps_is_bytelist_op( - u16 opcode); - -u8 -acpi_ps_is_field_op( - u16 opcode); - -u8 -acpi_ps_is_create_field_op ( - u16 opcode); - -ACPI_PARSE2_OBJECT* -acpi_ps_to_extended_op( - ACPI_PARSE_OBJECT *op); - -u32 -acpi_ps_get_name( - ACPI_PARSE_OBJECT *op); - -void -acpi_ps_set_name( - ACPI_PARSE_OBJECT *op, - u32 name); - - -/* psdump - display parser tree */ - -u32 -acpi_ps_sprint_path ( - NATIVE_CHAR *buffer_start, - u32 buffer_size, - ACPI_PARSE_OBJECT *op); - -u32 -acpi_ps_sprint_op ( - NATIVE_CHAR *buffer_start, - u32 buffer_size, - ACPI_PARSE_OBJECT *op); - -void -acpi_ps_show ( - ACPI_PARSE_OBJECT *op); - - -#endif /* __ACPARSER_H__ */ diff --git a/reactos/drivers/bus/acpi/include/acpi.h b/reactos/drivers/bus/acpi/include/acpi.h deleted file mode 100644 index c1226f84659..00000000000 --- a/reactos/drivers/bus/acpi/include/acpi.h +++ /dev/null @@ -1,70 +0,0 @@ -/****************************************************************************** - * - * Name: acpi.h - Master include file, Publics and external data. - * $Revision: 1.2 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACPI_H__ -#define __ACPI_H__ - -#include "platform/types.h" -#undef ROUND_DOWN -#undef ROUND_UP -#define DEFINE_ACPI_GLOBALS - -/* - * Common includes for all ACPI driver files - * We put them here because we don't want to duplicate them - * in the rest of the source code again and again. - */ -#include "acconfig.h" /* Configuration constants */ -#include "platform/acenv.h" /* Target environment specific items */ -#include "actypes.h" /* Fundamental common data types */ -#include "acexcep.h" /* ACPI exception codes */ -#include "acmacros.h" /* C macros */ -#include "actbl.h" /* ACPI table definitions */ -#include "aclocal.h" /* Internal data types */ -#include "acoutput.h" /* Error output and Debug macros */ -#include "acpiosxf.h" /* Interfaces to the ACPI-to-OS layer*/ -#include "acpixf.h" /* ACPI core subsystem external interfaces */ -#include "acobject.h" /* ACPI internal object */ -#include "acstruct.h" /* Common structures */ -#include "acglobal.h" /* All global variables */ -#include "achware.h" /* Hardware defines and interfaces */ -#include "accommon.h" /* Common interfaces */ -#include "acresrc.h" /* Resource Manager function prototypes */ -#include "acparser.h" -#include "acinterp.h" -#include "amlcode.h" -#include "acnamesp.h" -#include "acevents.h" -#include "actables.h" -#include "acdispat.h" -#include -#include -#include -#include -#include -#include -#include - -#endif /* __ACPI_H__ */ diff --git a/reactos/drivers/bus/acpi/include/acpiosxf.h b/reactos/drivers/bus/acpi/include/acpiosxf.h deleted file mode 100644 index f65e03846b1..00000000000 --- a/reactos/drivers/bus/acpi/include/acpiosxf.h +++ /dev/null @@ -1,341 +0,0 @@ - -/****************************************************************************** - * - * Name: acpiosxf.h - All interfaces to the OS Services Layer (OSL). These - * interfaces must be implemented by OSL to interface the - * ACPI components to the host operating system. - * - *****************************************************************************/ - - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACPIOSXF_H__ -#define __ACPIOSXF_H__ - -#include "platform/acenv.h" -#include "actypes.h" - - -/* Priorities for Acpi_os_queue_for_execution */ - -#define OSD_PRIORITY_GPE 1 -#define OSD_PRIORITY_HIGH 2 -#define OSD_PRIORITY_MED 3 -#define OSD_PRIORITY_LO 4 - -#define ACPI_NO_UNIT_LIMIT ((u32) -1) -#define ACPI_MUTEX_SEM 1 - - -/* - * Types specific to the OS service interfaces - */ - -typedef -u32 (*OSD_HANDLER) ( - void *context); - -typedef -void (*OSD_EXECUTION_CALLBACK) ( - void *context); - - -/* - * OSL Initialization and shutdown primitives - */ - -ACPI_STATUS -acpi_os_initialize ( - void); - -ACPI_STATUS -acpi_os_terminate ( - void); - - -/* - * Synchronization primitives - */ - -ACPI_STATUS -acpi_os_create_semaphore ( - u32 max_units, - u32 initial_units, - ACPI_HANDLE *out_handle); - -ACPI_STATUS -acpi_os_delete_semaphore ( - ACPI_HANDLE handle); - -ACPI_STATUS -acpi_os_wait_semaphore ( - ACPI_HANDLE handle, - u32 units, - u32 timeout); - -ACPI_STATUS -acpi_os_signal_semaphore ( - ACPI_HANDLE handle, - u32 units); - - -/* - * Memory allocation and mapping - */ - -void * -acpi_os_allocate ( - u32 size); - -void * -acpi_os_callocate ( - u32 size); - -void -acpi_os_free ( - void * memory); - -ACPI_STATUS -acpi_os_map_memory ( - ACPI_PHYSICAL_ADDRESS physical_address, - u32 length, - void **logical_address); - -void -acpi_os_unmap_memory ( - void *logical_address, - u32 length); - -ACPI_STATUS -acpi_os_get_physical_address ( - void *logical_address, - ACPI_PHYSICAL_ADDRESS *physical_address); - - -/* - * Interrupt handlers - */ - -ACPI_STATUS -acpi_os_install_interrupt_handler ( - u32 interrupt_number, - OSD_HANDLER service_routine, - void *context); - -ACPI_STATUS -acpi_os_remove_interrupt_handler ( - u32 interrupt_number, - OSD_HANDLER service_routine); - - -/* - * Threads and Scheduling - */ - -u32 -acpi_os_get_thread_id ( - void); - -ACPI_STATUS -acpi_os_queue_for_execution ( - u32 priority, - OSD_EXECUTION_CALLBACK function, - void *context); - -void -acpi_os_sleep ( - u32 seconds, - u32 milliseconds); - -void -acpi_os_sleep_usec ( - u32 microseconds); - - -/* - * Platform/Hardware independent I/O interfaces - */ - -u8 -acpi_os_in8 ( - ACPI_IO_ADDRESS in_port); - - -u16 -acpi_os_in16 ( - ACPI_IO_ADDRESS in_port); - -u32 -acpi_os_in32 ( - ACPI_IO_ADDRESS in_port); - -void -acpi_os_out8 ( - ACPI_IO_ADDRESS out_port, - u8 value); - -void -acpi_os_out16 ( - ACPI_IO_ADDRESS out_port, - u16 value); - -void -acpi_os_out32 ( - ACPI_IO_ADDRESS out_port, - u32 value); - - -/* - * Platform/Hardware independent physical memory interfaces - */ - -u8 -acpi_os_mem_in8 ( - ACPI_PHYSICAL_ADDRESS in_addr); - -u16 -acpi_os_mem_in16 ( - ACPI_PHYSICAL_ADDRESS in_addr); - -u32 -acpi_os_mem_in32 ( - ACPI_PHYSICAL_ADDRESS in_addr); - -void -acpi_os_mem_out8 ( - ACPI_PHYSICAL_ADDRESS out_addr, - u8 value); - -void -acpi_os_mem_out16 ( - ACPI_PHYSICAL_ADDRESS out_addr, - u16 value); - -void -acpi_os_mem_out32 ( - ACPI_PHYSICAL_ADDRESS out_addr, - u32 value); - - -/* - * Standard access to PCI configuration space - */ - -ACPI_STATUS -acpi_os_read_pci_cfg_byte ( - u32 bus, - u32 device_function, - u32 register, - u8 *value); - -ACPI_STATUS -acpi_os_read_pci_cfg_word ( - u32 bus, - u32 device_function, - u32 register, - u16 *value); - -ACPI_STATUS -acpi_os_read_pci_cfg_dword ( - u32 bus, - u32 device_function, - u32 register, - u32 *value); - -ACPI_STATUS -acpi_os_write_pci_cfg_byte ( - u32 bus, - u32 device_function, - u32 register, - u8 value); - -ACPI_STATUS -acpi_os_write_pci_cfg_word ( - u32 bus, - u32 device_function, - u32 register, - u16 value); - - -ACPI_STATUS -acpi_os_write_pci_cfg_dword ( - u32 bus, - u32 device_function, - u32 register, - u32 value); - - -/* - * Miscellaneous - */ - -ACPI_STATUS -acpi_os_breakpoint ( - NATIVE_CHAR *message); - -u8 -acpi_os_readable ( - void *pointer, - u32 length); - - -u8 -acpi_os_writable ( - void *pointer, - u32 length); - - -/* - * Debug print routines - */ - -s32 -acpi_os_printf ( - const NATIVE_CHAR *format, - ...); - -s32 -acpi_os_vprintf ( - const NATIVE_CHAR *format, - va_list args); - - -/* - * Debug input - */ - -u32 -acpi_os_get_line ( - NATIVE_CHAR *buffer); - - -/* - * Debug - */ - -void -acpi_os_dbg_assert( - void *failed_assertion, - void *file_name, - u32 line_number, - NATIVE_CHAR *message); - - -#endif /* __ACPIOSXF_H__ */ diff --git a/reactos/drivers/bus/acpi/include/acpixf.h b/reactos/drivers/bus/acpi/include/acpixf.h deleted file mode 100644 index ef4b1dca32c..00000000000 --- a/reactos/drivers/bus/acpi/include/acpixf.h +++ /dev/null @@ -1,340 +0,0 @@ - -/****************************************************************************** - * - * Name: acpixf.h - External interfaces to the ACPI subsystem - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#ifndef __ACXFACE_H__ -#define __ACXFACE_H__ - -#include "actypes.h" -#include "actbl.h" - - -/* - * Global interfaces - */ - -ACPI_STATUS -acpi_initialize_subsystem ( - void); - -ACPI_STATUS -acpi_enable_subsystem ( - u32 flags); - -ACPI_STATUS -acpi_terminate ( - void); - -ACPI_STATUS -acpi_enable ( - void); - -ACPI_STATUS -acpi_disable ( - void); - -ACPI_STATUS -acpi_get_system_info( - ACPI_BUFFER *ret_buffer); - -ACPI_STATUS -acpi_format_exception ( - ACPI_STATUS exception, - ACPI_BUFFER *out_buffer); - - -/* - * ACPI Memory manager - */ - -void * -acpi_allocate ( - u32 size); - -void * -acpi_callocate ( - u32 size); - -void -acpi_free ( - void *address); - - -/* - * ACPI table manipulation interfaces - */ - -ACPI_STATUS -acpi_find_root_pointer ( - ACPI_PHYSICAL_ADDRESS *rsdp_physical_address); - -ACPI_STATUS -acpi_load_tables ( - ACPI_PHYSICAL_ADDRESS rsdp_physical_address); - -ACPI_STATUS -acpi_load_table ( - ACPI_TABLE_HEADER *table_ptr); - -ACPI_STATUS -acpi_unload_table ( - ACPI_TABLE_TYPE table_type); - -ACPI_STATUS -acpi_get_table_header ( - ACPI_TABLE_TYPE table_type, - u32 instance, - ACPI_TABLE_HEADER *out_table_header); - -ACPI_STATUS -acpi_get_table ( - ACPI_TABLE_TYPE table_type, - u32 instance, - ACPI_BUFFER *ret_buffer); - - -/* - * Namespace and name interfaces - */ - -ACPI_STATUS -acpi_walk_namespace ( - ACPI_OBJECT_TYPE type, - ACPI_HANDLE start_object, - u32 max_depth, - WALK_CALLBACK user_function, - void *context, - void * *return_value); - -ACPI_STATUS -acpi_get_devices ( - NATIVE_CHAR *HID, - WALK_CALLBACK user_function, - void *context, - void **return_value); - -ACPI_STATUS -acpi_get_name ( - ACPI_HANDLE handle, - u32 name_type, - ACPI_BUFFER *ret_path_ptr); - -ACPI_STATUS -acpi_get_handle ( - ACPI_HANDLE parent, - ACPI_STRING pathname, - ACPI_HANDLE *ret_handle); - - -/* - * Object manipulation and enumeration - */ - -ACPI_STATUS -acpi_evaluate_object ( - ACPI_HANDLE object, - ACPI_STRING pathname, - ACPI_OBJECT_LIST *parameter_objects, - ACPI_BUFFER *return_object_buffer); - -ACPI_STATUS -acpi_get_object_info ( - ACPI_HANDLE device, - ACPI_DEVICE_INFO *info); - -ACPI_STATUS -acpi_get_next_object ( - ACPI_OBJECT_TYPE type, - ACPI_HANDLE parent, - ACPI_HANDLE child, - ACPI_HANDLE *out_handle); - -ACPI_STATUS -acpi_get_type ( - ACPI_HANDLE object, - ACPI_OBJECT_TYPE *out_type); - -ACPI_STATUS -acpi_get_parent ( - ACPI_HANDLE object, - ACPI_HANDLE *out_handle); - - -/* - * Event handler interfaces - */ - -ACPI_STATUS -acpi_install_fixed_event_handler ( - u32 acpi_event, - FIXED_EVENT_HANDLER handler, - void *context); - -ACPI_STATUS -acpi_remove_fixed_event_handler ( - u32 acpi_event, - FIXED_EVENT_HANDLER handler); - -ACPI_STATUS -acpi_install_notify_handler ( - ACPI_HANDLE device, - u32 handler_type, - NOTIFY_HANDLER handler, - void *context); - -ACPI_STATUS -acpi_remove_notify_handler ( - ACPI_HANDLE device, - u32 handler_type, - NOTIFY_HANDLER handler); - -ACPI_STATUS -acpi_install_address_space_handler ( - ACPI_HANDLE device, - ACPI_ADDRESS_SPACE_TYPE space_id, - ADDRESS_SPACE_HANDLER handler, - ADDRESS_SPACE_SETUP setup, - void *context); - -ACPI_STATUS -acpi_remove_address_space_handler ( - ACPI_HANDLE device, - ACPI_ADDRESS_SPACE_TYPE space_id, - ADDRESS_SPACE_HANDLER handler); - -ACPI_STATUS -acpi_install_gpe_handler ( - u32 gpe_number, - u32 type, - GPE_HANDLER handler, - void *context); - -ACPI_STATUS -acpi_acquire_global_lock ( - void); - -ACPI_STATUS -acpi_release_global_lock ( - void); - -ACPI_STATUS -acpi_remove_gpe_handler ( - u32 gpe_number, - GPE_HANDLER handler); - -ACPI_STATUS -acpi_enable_event ( - u32 acpi_event, - u32 type); - -ACPI_STATUS -acpi_disable_event ( - u32 acpi_event, - u32 type); - -ACPI_STATUS -acpi_clear_event ( - u32 acpi_event, - u32 type); - -ACPI_STATUS -acpi_get_event_status ( - u32 acpi_event, - u32 type, - ACPI_EVENT_STATUS *event_status); - -/* - * Resource interfaces - */ - -ACPI_STATUS -acpi_get_current_resources( - ACPI_HANDLE device_handle, - ACPI_BUFFER *ret_buffer); - -ACPI_STATUS -acpi_get_possible_resources( - ACPI_HANDLE device_handle, - ACPI_BUFFER *ret_buffer); - -ACPI_STATUS -acpi_set_current_resources ( - ACPI_HANDLE device_handle, - ACPI_BUFFER *in_buffer); - -ACPI_STATUS -acpi_get_irq_routing_table ( - ACPI_HANDLE bus_device_handle, - ACPI_BUFFER *ret_buffer); - - -/* - * Hardware (ACPI device) interfaces - */ - -ACPI_STATUS -acpi_set_firmware_waking_vector ( - ACPI_PHYSICAL_ADDRESS physical_address); - -ACPI_STATUS -acpi_get_firmware_waking_vector ( - ACPI_PHYSICAL_ADDRESS *physical_address); - -ACPI_STATUS -acpi_enter_sleep_state ( - u8 sleep_state); - -ACPI_STATUS -acpi_get_processor_throttling_info ( - ACPI_HANDLE processor_handle, - ACPI_BUFFER *user_buffer); - -ACPI_STATUS -acpi_set_processor_throttling_state ( - ACPI_HANDLE processor_handle, - u32 throttle_state); - -ACPI_STATUS -acpi_get_processor_throttling_state ( - ACPI_HANDLE processor_handle, - u32 *throttle_state); - -ACPI_STATUS -acpi_get_processor_cx_info ( - ACPI_HANDLE processor_handle, - ACPI_BUFFER *user_buffer); - -ACPI_STATUS -acpi_set_processor_sleep_state ( - ACPI_HANDLE processor_handle, - u32 cx_state); - -ACPI_STATUS -acpi_processor_sleep ( - ACPI_HANDLE processor_handle, - u32 *pm_timer_ticks); - - -#endif /* __ACXFACE_H__ */ diff --git a/reactos/drivers/bus/acpi/include/acresrc.h b/reactos/drivers/bus/acpi/include/acresrc.h deleted file mode 100644 index 239d1f989c9..00000000000 --- a/reactos/drivers/bus/acpi/include/acresrc.h +++ /dev/null @@ -1,304 +0,0 @@ -/****************************************************************************** - * - * Name: acresrc.h - Resource Manager function prototypes - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACRESRC_H__ -#define __ACRESRC_H__ - - -/* - * Function prototypes called from Acpi* APIs - */ - -ACPI_STATUS -acpi_rs_get_prt_method_data ( - ACPI_HANDLE handle, - ACPI_BUFFER *ret_buffer); - - -ACPI_STATUS -acpi_rs_get_crs_method_data ( - ACPI_HANDLE handle, - ACPI_BUFFER *ret_buffer); - -ACPI_STATUS -acpi_rs_get_prs_method_data ( - ACPI_HANDLE handle, - ACPI_BUFFER *ret_buffer); - -ACPI_STATUS -acpi_rs_set_srs_method_data ( - ACPI_HANDLE handle, - ACPI_BUFFER *ret_buffer); - -ACPI_STATUS -acpi_rs_create_resource_list ( - ACPI_OPERAND_OBJECT *byte_stream_buffer, - u8 *output_buffer, - u32 *output_buffer_length); - -ACPI_STATUS -acpi_rs_create_byte_stream ( - RESOURCE *linked_list_buffer, - u8 *output_buffer, - u32 *output_buffer_length); - -ACPI_STATUS -acpi_rs_create_pci_routing_table ( - ACPI_OPERAND_OBJECT *method_return_object, - u8 *output_buffer, - u32 *output_buffer_length); - - -/* - *Function prototypes called from Acpi_rs_create*APIs - */ - -void -acpi_rs_dump_resource_list ( - RESOURCE *resource); - -void -acpi_rs_dump_irq_list ( - u8 *route_table); - -ACPI_STATUS -acpi_rs_get_byte_stream_start ( - u8 *byte_stream_buffer, - u8 **byte_stream_start, - u32 *size); - -ACPI_STATUS -acpi_rs_calculate_list_length ( - u8 *byte_stream_buffer, - u32 byte_stream_buffer_length, - u32 *size_needed); - -ACPI_STATUS -acpi_rs_calculate_byte_stream_length ( - RESOURCE *linked_list_buffer, - u32 *size_needed); - -ACPI_STATUS -acpi_rs_calculate_pci_routing_table_length ( - ACPI_OPERAND_OBJECT *package_object, - u32 *buffer_size_needed); - -ACPI_STATUS -acpi_rs_byte_stream_to_list ( - u8 *byte_stream_buffer, - u32 byte_stream_buffer_length, - u8 **output_buffer); - -ACPI_STATUS -acpi_rs_list_to_byte_stream ( - RESOURCE *linked_list, - u32 byte_stream_size_needed, - u8 **output_buffer); - -ACPI_STATUS -acpi_rs_io_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size); - -ACPI_STATUS -acpi_rs_fixed_io_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size); - -ACPI_STATUS -acpi_rs_io_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed); - -ACPI_STATUS -acpi_rs_fixed_io_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed); - -ACPI_STATUS -acpi_rs_irq_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size); - -ACPI_STATUS -acpi_rs_irq_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed); - -ACPI_STATUS -acpi_rs_dma_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size); - -ACPI_STATUS -acpi_rs_dma_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed); - -ACPI_STATUS -acpi_rs_address16_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size); - -ACPI_STATUS -acpi_rs_address16_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed); - -ACPI_STATUS -acpi_rs_address32_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size); - -ACPI_STATUS -acpi_rs_address32_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed); - -ACPI_STATUS -acpi_rs_start_dependent_functions_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size); - -ACPI_STATUS -acpi_rs_end_dependent_functions_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size); - -ACPI_STATUS -acpi_rs_start_dependent_functions_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed); - -ACPI_STATUS -acpi_rs_end_dependent_functions_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed); - -ACPI_STATUS -acpi_rs_memory24_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size); - -ACPI_STATUS -acpi_rs_memory24_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed); - -ACPI_STATUS -acpi_rs_memory32_range_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size -); - -ACPI_STATUS -acpi_rs_fixed_memory32_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size); - -ACPI_STATUS -acpi_rs_memory32_range_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed); - -ACPI_STATUS -acpi_rs_fixed_memory32_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed); - -ACPI_STATUS -acpi_rs_extended_irq_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size); - -ACPI_STATUS -acpi_rs_extended_irq_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed); - -ACPI_STATUS -acpi_rs_end_tag_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size); - -ACPI_STATUS -acpi_rs_end_tag_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed); - -ACPI_STATUS -acpi_rs_vendor_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size); - -ACPI_STATUS -acpi_rs_vendor_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed); - - -#endif /* __ACRESRC_H__ */ diff --git a/reactos/drivers/bus/acpi/include/acstruct.h b/reactos/drivers/bus/acpi/include/acstruct.h deleted file mode 100644 index c8abf99cbed..00000000000 --- a/reactos/drivers/bus/acpi/include/acstruct.h +++ /dev/null @@ -1,157 +0,0 @@ -/****************************************************************************** - * - * Name: acstruct.h - Internal structs - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACSTRUCT_H__ -#define __ACSTRUCT_H__ - - -/***************************************************************************** - * - * Tree walking typedefs and structs - * - ****************************************************************************/ - - -/* - * Walk state - current state of a parse tree walk. Used for both a leisurely stroll through - * the tree (for whatever reason), and for control method execution. - */ - -#define NEXT_OP_DOWNWARD 1 -#define NEXT_OP_UPWARD 2 - -#define WALK_NON_METHOD 0 -#define WALK_METHOD 1 -#define WALK_METHOD_RESTART 2 - -typedef struct acpi_walk_state -{ - u8 data_type; /* To differentiate various internal objs */\ - ACPI_OWNER_ID owner_id; /* Owner of objects created during the walk */ - u8 last_predicate; /* Result of last predicate */ - u8 next_op_info; /* Info about Next_op */ - u8 num_operands; /* Stack pointer for Operands[] array */ - u8 current_result; /* */ - - struct acpi_walk_state *next; /* Next Walk_state in list */ - ACPI_PARSE_OBJECT *origin; /* Start of walk [Obsolete] */ - -/* TBD: Obsolete with removal of WALK procedure ? */ - ACPI_PARSE_OBJECT *prev_op; /* Last op that was processed */ - ACPI_PARSE_OBJECT *next_op; /* next op to be processed */ - - - ACPI_GENERIC_STATE *results; /* Stack of accumulated results */ - ACPI_GENERIC_STATE *control_state; /* List of control states (nested IFs) */ - ACPI_GENERIC_STATE *scope_info; /* Stack of nested scopes */ - ACPI_PARSE_STATE *parser_state; /* Current state of parser */ - u8 *aml_last_while; - ACPI_OPCODE_INFO *op_info; /* Info on current opcode */ - ACPI_PARSE_DOWNWARDS descending_callback; - ACPI_PARSE_UPWARDS ascending_callback; - - union acpi_operand_obj *return_desc; /* Return object, if any */ - union acpi_operand_obj *method_desc; /* Method descriptor if running a method */ - struct acpi_node *method_node; /* Method Node if running a method */ - ACPI_PARSE_OBJECT *method_call_op; /* Method_call Op if running a method */ - struct acpi_node *method_call_node; /* Called method Node*/ - union acpi_operand_obj *operands[OBJ_NUM_OPERANDS]; /* Operands passed to the interpreter */ - struct acpi_node arguments[MTH_NUM_ARGS]; /* Control method arguments */ - struct acpi_node local_variables[MTH_NUM_LOCALS]; /* Control method locals */ - struct acpi_walk_list *walk_list; - u32 parse_flags; - u8 walk_type; - u8 return_used; - u16 opcode; /* Current AML opcode */ - u32 prev_arg_types; - u16 current_sync_level; /* Mutex Sync (nested acquire) level */ - - /* Debug support */ - - u32 method_breakpoint; - - -} ACPI_WALK_STATE; - - -/* - * Walk list - head of a tree of walk states. Multiple walk states are created when there - * are nested control methods executing. - */ -typedef struct acpi_walk_list -{ - - ACPI_WALK_STATE *walk_state; - ACPI_OBJECT_MUTEX acquired_mutex_list; /* List of all currently acquired mutexes */ - -} ACPI_WALK_LIST; - - -/* Info used by Acpi_ps_init_objects */ - -typedef struct acpi_init_walk_info -{ - u16 method_count; - u16 op_region_count; - u16 field_count; - u16 op_region_init; - u16 field_init; - u16 object_count; - ACPI_TABLE_DESC *table_desc; - -} ACPI_INIT_WALK_INFO; - - -/* Info used by TBD */ - -typedef struct acpi_device_walk_info -{ - u16 device_count; - u16 num_STA; - u16 num_INI; - ACPI_TABLE_DESC *table_desc; - -} ACPI_DEVICE_WALK_INFO; - - -/* TBD: [Restructure] Merge with struct above */ - -typedef struct acpi_walk_info -{ - u32 debug_level; - u32 owner_id; - -} ACPI_WALK_INFO; - -typedef struct acpi_get_devices_info -{ - WALK_CALLBACK user_function; - void *context; - NATIVE_CHAR *hid; - -} ACPI_GET_DEVICES_INFO; - - -#endif diff --git a/reactos/drivers/bus/acpi/include/actables.h b/reactos/drivers/bus/acpi/include/actables.h deleted file mode 100644 index c70208485be..00000000000 --- a/reactos/drivers/bus/acpi/include/actables.h +++ /dev/null @@ -1,185 +0,0 @@ -/****************************************************************************** - * - * Name: actables.h - ACPI table management - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACTABLES_H__ -#define __ACTABLES_H__ - - -/* Used in Acpi_tb_map_acpi_table for size parameter if table header is to be used */ - -#define SIZE_IN_HEADER 0 - - -ACPI_STATUS -acpi_tb_handle_to_object ( - u16 table_id, - ACPI_TABLE_DESC **table_desc); - -/* - * tbconvrt - Table conversion routines - */ - -ACPI_STATUS -acpi_tb_convert_to_xsdt ( - ACPI_TABLE_DESC *table_info, - u32 *number_of_tables); - -ACPI_STATUS -acpi_tb_convert_table_fadt ( - void); - -ACPI_STATUS -acpi_tb_build_common_facs ( - ACPI_TABLE_DESC *table_info); - - -/* - * tbget - Table "get" routines - */ - -ACPI_STATUS -acpi_tb_get_table_ptr ( - ACPI_TABLE_TYPE table_type, - u32 instance, - ACPI_TABLE_HEADER **table_ptr_loc); - -ACPI_STATUS -acpi_tb_get_table ( - ACPI_PHYSICAL_ADDRESS physical_address, - ACPI_TABLE_HEADER *buffer_ptr, - ACPI_TABLE_DESC *table_info); - -ACPI_STATUS -acpi_tb_verify_rsdp ( - ACPI_PHYSICAL_ADDRESS RSDP_physical_address); - -ACPI_STATUS -acpi_tb_get_table_facs ( - ACPI_TABLE_HEADER *buffer_ptr, - ACPI_TABLE_DESC *table_info); - - -/* - * tbgetall - Get all firmware ACPI tables - */ - -ACPI_STATUS -acpi_tb_get_all_tables ( - u32 number_of_tables, - ACPI_TABLE_HEADER *buffer_ptr); - - -/* - * tbinstall - Table installation - */ - -ACPI_STATUS -acpi_tb_install_table ( - ACPI_TABLE_HEADER *table_ptr, - ACPI_TABLE_DESC *table_info); - -ACPI_STATUS -acpi_tb_recognize_table ( - ACPI_TABLE_HEADER *table_ptr, - ACPI_TABLE_DESC *table_info); - -ACPI_STATUS -acpi_tb_init_table_descriptor ( - ACPI_TABLE_TYPE table_type, - ACPI_TABLE_DESC *table_info); - - -/* - * tbremove - Table removal and deletion - */ - -void -acpi_tb_delete_acpi_tables ( - void); - -void -acpi_tb_delete_acpi_table ( - ACPI_TABLE_TYPE type); - -void -acpi_tb_delete_single_table ( - ACPI_TABLE_DESC *table_desc); - -ACPI_TABLE_DESC * -acpi_tb_uninstall_table ( - ACPI_TABLE_DESC *table_desc); - -void -acpi_tb_free_acpi_tables_of_type ( - ACPI_TABLE_DESC *table_info); - - -/* - * tbrsd - RSDP, RSDT utilities - */ - -ACPI_STATUS -acpi_tb_get_table_rsdt ( - u32 *number_of_tables); - -u8 * -acpi_tb_scan_memory_for_rsdp ( - u8 *start_address, - u32 length); - -ACPI_STATUS -acpi_tb_find_rsdp ( - ACPI_TABLE_DESC *table_info); - - -/* - * tbutils - common table utilities - */ - -u8 -acpi_tb_system_table_pointer ( - void *where); - -ACPI_STATUS -acpi_tb_map_acpi_table ( - ACPI_PHYSICAL_ADDRESS physical_address, - u32 *size, - void **logical_address); - -ACPI_STATUS -acpi_tb_verify_table_checksum ( - ACPI_TABLE_HEADER *table_header); - -u8 -acpi_tb_checksum ( - void *buffer, - u32 length); - -ACPI_STATUS -acpi_tb_validate_table_header ( - ACPI_TABLE_HEADER *table_header); - - -#endif /* __ACTABLES_H__ */ diff --git a/reactos/drivers/bus/acpi/include/actbl.h b/reactos/drivers/bus/acpi/include/actbl.h deleted file mode 100644 index 7472372e9fd..00000000000 --- a/reactos/drivers/bus/acpi/include/actbl.h +++ /dev/null @@ -1,217 +0,0 @@ -/****************************************************************************** - * - * Name: actbl.h - Table data structures defined in ACPI specification - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACTBL_H__ -#define __ACTBL_H__ - - -/* - * Values for description table header signatures - */ - -#define RSDP_NAME "RSDP" -#define RSDP_SIG "RSD PTR " /* RSDT Pointer signature */ -#define APIC_SIG "APIC" /* Multiple APIC Description Table */ -#define DSDT_SIG "DSDT" /* Differentiated System Description Table */ -#define FADT_SIG "FACP" /* Fixed ACPI Description Table */ -#define FACS_SIG "FACS" /* Firmware ACPI Control Structure */ -#define PSDT_SIG "PSDT" /* Persistent System Description Table */ -#define RSDT_SIG "RSDT" /* Root System Description Table */ -#define XSDT_SIG "XSDT" /* Extended System Description Table */ -#define SSDT_SIG "SSDT" /* Secondary System Description Table */ -#define SBST_SIG "SBST" /* Smart Battery Specification Table */ -#define SPIC_SIG "SPIC" /* iosapic table */ -#define BOOT_SIG "BOOT" /* Boot table */ - - -#define GL_OWNED 0x02 /* Ownership of global lock is bit 1 */ - -/* values of Mapic.Model */ - -#define DUAL_PIC 0 -#define MULTIPLE_APIC 1 - -/* values of Type in APIC_HEADER */ - -#define APIC_PROC 0 -#define APIC_IO 1 - - -/* - * Common table types. The base code can remain - * constant if the underlying tables are changed - */ -#define RSDT_DESCRIPTOR RSDT_DESCRIPTOR_REV2 -#define XSDT_DESCRIPTOR XSDT_DESCRIPTOR_REV2 -#define FACS_DESCRIPTOR FACS_DESCRIPTOR_REV2 -#define FADT_DESCRIPTOR FADT_DESCRIPTOR_REV2 - - -#pragma pack(1) - -/* - * Architecture-independent tables - * The architecture dependent tables are in separate files - */ - -typedef struct /* Root System Descriptor Pointer */ -{ - NATIVE_CHAR signature [8]; /* contains "RSD PTR " */ - u8 checksum; /* to make sum of struct == 0 */ - NATIVE_CHAR oem_id [6]; /* OEM identification */ - u8 revision; /* Must be 0 for 1.0, 2 for 2.0 */ - u32 rsdt_physical_address; /* 32-bit physical address of RSDT */ - u32 length; /* XSDT Length in bytes including hdr */ - UINT64 xsdt_physical_address; /* 64-bit physical address of XSDT */ - u8 extended_checksum; /* Checksum of entire table */ - NATIVE_CHAR reserved [3]; /* reserved field must be 0 */ - -} RSDP_DESCRIPTOR; - - -typedef struct /* ACPI common table header */ -{ - NATIVE_CHAR signature [4]; /* identifies type of table */ - u32 length; /* length of table, in bytes, - * including header */ - u8 revision; /* specification minor version # */ - u8 checksum; /* to make sum of entire table == 0 */ - NATIVE_CHAR oem_id [6]; /* OEM identification */ - NATIVE_CHAR oem_table_id [8]; /* OEM table identification */ - u32 oem_revision; /* OEM revision number */ - NATIVE_CHAR asl_compiler_id [4]; /* ASL compiler vendor ID */ - u32 asl_compiler_revision; /* ASL compiler revision number */ - -} ACPI_TABLE_HEADER; - - -typedef struct /* Common FACS for internal use */ -{ - u32 *global_lock; - UINT64 *firmware_waking_vector; - u8 vector_width; - -} ACPI_COMMON_FACS; - - -typedef struct /* APIC Table */ -{ - ACPI_TABLE_HEADER header; /* table header */ - u32 local_apic_address; /* Physical address for accessing local APICs */ - u32 PCATcompat : 1; /* a one indicates system also has dual 8259s */ - u32 reserved1 : 31; - -} APIC_TABLE; - - -typedef struct /* APIC Header */ -{ - u8 type; /* APIC type. Either APIC_PROC or APIC_IO */ - u8 length; /* Length of APIC structure */ - -} APIC_HEADER; - - -typedef struct /* Processor APIC */ -{ - APIC_HEADER header; - u8 processor_apic_id; /* ACPI processor id */ - u8 local_apic_id; /* processor's local APIC id */ - u32 processor_enabled: 1; /* Processor is usable if set */ - u32 reserved1 : 32; - -} PROCESSOR_APIC; - - -typedef struct /* IO APIC */ -{ - APIC_HEADER header; - u8 io_apic_id; /* I/O APIC ID */ - u8 reserved; /* reserved - must be zero */ - u32 io_apic_address; /* APIC's physical address */ - u32 vector; /* interrupt vector index where INTI - * lines start */ -} IO_APIC; - - -/* -** IA64 TODO: Add SAPIC Tables -*/ - -/* -** IA64 TODO: Modify Smart Battery Description to comply with ACPI IA64 -** extensions. -*/ -typedef struct /* Smart Battery Description Table */ -{ - ACPI_TABLE_HEADER header; - u32 warning_level; - u32 low_level; - u32 critical_level; - -} SMART_BATTERY_DESCRIPTION_TABLE; - - -#pragma pack() - - -/* - * ACPI Table information. We save the table address, length, - * and type of memory allocation (mapped or allocated) for each - * table for 1) when we exit, and 2) if a new table is installed - */ - -#define ACPI_MEM_NOT_ALLOCATED 0 -#define ACPI_MEM_ALLOCATED 1 -#define ACPI_MEM_MAPPED 2 - -/* Definitions for the Flags bitfield member of ACPI_TABLE_SUPPORT */ - -#define ACPI_TABLE_SINGLE 0 -#define ACPI_TABLE_MULTIPLE 1 - - -/* Data about each known table type */ - -typedef struct _acpi_table_support -{ - NATIVE_CHAR *name; - NATIVE_CHAR *signature; - u8 sig_length; - u8 flags; - u16 status; - void **global_ptr; - -} ACPI_TABLE_SUPPORT; - -/* - * Get the architecture-specific tables - */ - -#include "actbl1.h" /* Acpi 1.0 table defintions */ -#include "actbl71.h" /* Acpi 0.71 IA-64 Extension table defintions */ -#include "actbl2.h" /* Acpi 2.0 table definitions */ - -#endif /* __ACTBL_H__ */ diff --git a/reactos/drivers/bus/acpi/include/actbl1.h b/reactos/drivers/bus/acpi/include/actbl1.h deleted file mode 100644 index 8cb88b459dc..00000000000 --- a/reactos/drivers/bus/acpi/include/actbl1.h +++ /dev/null @@ -1,123 +0,0 @@ -/****************************************************************************** - * - * Name: actbl1.h - ACPI 1.0 tables - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACTBL1_H__ -#define __ACTBL1_H__ - -#pragma pack(1) - -/*************************************/ -/* ACPI Specification Rev 1.0 for */ -/* the Root System Description Table */ -/*************************************/ -typedef struct -{ - ACPI_TABLE_HEADER header; /* Table header */ - u32 table_offset_entry [1]; /* Array of pointers to other */ - /* ACPI tables */ -} RSDT_DESCRIPTOR_REV1; - - -/***************************************/ -/* ACPI Specification Rev 1.0 for */ -/* the Firmware ACPI Control Structure */ -/***************************************/ -typedef struct -{ - NATIVE_CHAR signature[4]; /* signature "FACS" */ - u32 length; /* length of structure, in bytes */ - u32 hardware_signature; /* hardware configuration signature */ - u32 firmware_waking_vector; /* ACPI OS waking vector */ - u32 global_lock; /* Global Lock */ - u32 S4_bios_f : 1; /* Indicates if S4_bIOS support is present */ - u32 reserved1 : 31; /* must be 0 */ - u8 resverved3 [40]; /* reserved - must be zero */ - -} FACS_DESCRIPTOR_REV1; - - -/************************************/ -/* ACPI Specification Rev 1.0 for */ -/* the Fixed ACPI Description Table */ -/************************************/ -typedef struct -{ - ACPI_TABLE_HEADER header; /* table header */ - u32 firmware_ctrl; /* Physical address of FACS */ - u32 dsdt; /* Physical address of DSDT */ - u8 model; /* System Interrupt Model */ - u8 reserved1; /* reserved */ - u16 sci_int; /* System vector of SCI interrupt */ - u32 smi_cmd; /* Port address of SMI command port */ - u8 acpi_enable; /* value to write to smi_cmd to enable ACPI */ - u8 acpi_disable; /* value to write to smi_cmd to disable ACPI */ - u8 S4_bios_req; /* Value to write to SMI CMD to enter S4_bIOS state */ - u8 reserved2; /* reserved - must be zero */ - u32 pm1a_evt_blk; /* Port address of Power Mgt 1a Acpi_event Reg Blk */ - u32 pm1b_evt_blk; /* Port address of Power Mgt 1b Acpi_event Reg Blk */ - u32 pm1a_cnt_blk; /* Port address of Power Mgt 1a Control Reg Blk */ - u32 pm1b_cnt_blk; /* Port address of Power Mgt 1b Control Reg Blk */ - u32 pm2_cnt_blk; /* Port address of Power Mgt 2 Control Reg Blk */ - u32 pm_tmr_blk; /* Port address of Power Mgt Timer Ctrl Reg Blk */ - u32 gpe0blk; /* Port addr of General Purpose Acpi_event 0 Reg Blk */ - u32 gpe1_blk; /* Port addr of General Purpose Acpi_event 1 Reg Blk */ - u8 pm1_evt_len; /* Byte Length of ports at pm1_x_evt_blk */ - u8 pm1_cnt_len; /* Byte Length of ports at pm1_x_cnt_blk */ - u8 pm2_cnt_len; /* Byte Length of ports at pm2_cnt_blk */ - u8 pm_tm_len; /* Byte Length of ports at pm_tm_blk */ - u8 gpe0blk_len; /* Byte Length of ports at gpe0_blk */ - u8 gpe1_blk_len; /* Byte Length of ports at gpe1_blk */ - u8 gpe1_base; /* offset in gpe model where gpe1 events start */ - u8 reserved3; /* reserved */ - u16 plvl2_lat; /* worst case HW latency to enter/exit C2 state */ - u16 plvl3_lat; /* worst case HW latency to enter/exit C3 state */ - u16 flush_size; /* Size of area read to flush caches */ - u16 flush_stride; /* Stride used in flushing caches */ - u8 duty_offset; /* bit location of duty cycle field in p_cnt reg */ - u8 duty_width; /* bit width of duty cycle field in p_cnt reg */ - u8 day_alrm; /* index to day-of-month alarm in RTC CMOS RAM */ - u8 mon_alrm; /* index to month-of-year alarm in RTC CMOS RAM */ - u8 century; /* index to century in RTC CMOS RAM */ - u8 reserved4; /* reserved */ - u8 reserved4a; /* reserved */ - u8 reserved4b; /* reserved */ - u32 wb_invd : 1; /* wbinvd instruction works properly */ - u32 wb_invd_flush : 1; /* wbinvd flushes but does not invalidate */ - u32 proc_c1 : 1; /* all processors support C1 state */ - u32 plvl2_up : 1; /* C2 state works on MP system */ - u32 pwr_button : 1; /* Power button is handled as a generic feature */ - u32 sleep_button : 1; /* Sleep button is handled as a generic feature, or not present */ - u32 fixed_rTC : 1; /* RTC wakeup stat not in fixed register space */ - u32 rtcs4 : 1; /* RTC wakeup stat not possible from S4 */ - u32 tmr_val_ext : 1; /* tmr_val is 32 bits */ - u32 reserved5 : 23; /* reserved - must be zero */ - -} FADT_DESCRIPTOR_REV1; - -#pragma pack() - -#endif /* __ACTBL1_H__ */ - - diff --git a/reactos/drivers/bus/acpi/include/actbl2.h b/reactos/drivers/bus/acpi/include/actbl2.h deleted file mode 100644 index 8b6fe8f6e32..00000000000 --- a/reactos/drivers/bus/acpi/include/actbl2.h +++ /dev/null @@ -1,189 +0,0 @@ -/****************************************************************************** - * - * Name: actbl2.h - ACPI Specification Revision 2.0 Tables - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACTBL2_H__ -#define __ACTBL2_H__ - -/**************************************/ -/* Prefered Power Management Profiles */ -/**************************************/ -#define PM_UNSPECIFIED 0 -#define PM_DESKTOP 1 -#define PM_MOBILE 2 -#define PM_WORKSTATION 3 -#define PM_ENTERPRISE_SERVER 4 -#define PM_SOHO_SERVER 5 -#define PM_APPLIANCE_PC 6 - -/*********************************************/ -/* ACPI Boot Arch Flags, See spec Table 5-10 */ -/*********************************************/ -#define BAF_LEGACY_DEVICES 0x0001 -#define BAF_8042_KEYBOARD_CONTROLLER 0x0002 - -#define FADT2_REVISION_ID 3 - -#pragma pack(1) - -/*************************************/ -/* ACPI Specification Rev 2.0 for */ -/* the Root System Description Table */ -/*************************************/ -typedef struct -{ - ACPI_TABLE_HEADER header; /* Table header */ - u32 table_offset_entry [1]; /* Array of pointers to */ - /* other tables' headers */ -} RSDT_DESCRIPTOR_REV2; - - -/********************************************/ -/* ACPI Specification Rev 2.0 for the */ -/* Extended System Description Table (XSDT) */ -/********************************************/ -typedef struct -{ - ACPI_TABLE_HEADER header; /* Table header */ - UINT64 table_offset_entry [1]; /* Array of pointers to */ - /* other tables' headers */ -} XSDT_DESCRIPTOR_REV2; - -/***************************************/ -/* ACPI Specification Rev 2.0 for */ -/* the Firmware ACPI Control Structure */ -/***************************************/ -typedef struct -{ - NATIVE_CHAR signature[4]; /* signature "FACS" */ - u32 length; /* length of structure, in bytes */ - u32 hardware_signature; /* hardware configuration signature */ - u32 firmware_waking_vector; /* 32bit physical address of the Firmware Waking Vector. */ - u32 global_lock; /* Global Lock used to synchronize access to shared hardware resources */ - u32 S4_bios_f : 1; /* Indicates if S4_bIOS support is present */ - u32 reserved1 : 31; /* must be 0 */ - UINT64 Xfirmware_waking_vector; /* 64bit physical address of the Firmware Waking Vector. */ - u8 version; /* Version of this table */ - u8 reserved3 [31]; /* reserved - must be zero */ - -} FACS_DESCRIPTOR_REV2; - - -/***************************************/ -/* ACPI Specification Rev 2.0 for */ -/* the Generic Address Structure (GAS) */ -/***************************************/ -typedef struct -{ - u8 address_space_id; /* Address space where struct or register exists. */ - u8 register_bit_width; /* Size in bits of given register */ - u8 register_bit_offset; /* Bit offset within the register */ - u8 reserved; /* Must be 0 */ - UINT64 address; /* 64-bit address of struct or register */ - -} ACPI_GAS; - - -/************************************/ -/* ACPI Specification Rev 2.0 for */ -/* the Fixed ACPI Description Table */ -/************************************/ -typedef struct -{ - ACPI_TABLE_HEADER header; /* table header */ - u32 V1_firmware_ctrl; /* 32-bit physical address of FACS */ - u32 V1_dsdt; /* 32-bit physical address of DSDT */ - u8 reserved1; /* System Interrupt Model isn't used in ACPI 2.0*/ - u8 prefer_PM_profile; /* Conveys preferred power management profile to OSPM. */ - u16 sci_int; /* System vector of SCI interrupt */ - u32 smi_cmd; /* Port address of SMI command port */ - u8 acpi_enable; /* value to write to smi_cmd to enable ACPI */ - u8 acpi_disable; /* value to write to smi_cmd to disable ACPI */ - u8 S4_bios_req; /* Value to write to SMI CMD to enter S4_bIOS state */ - u8 pstate_cnt; /* processor performance state control*/ - u32 V1_pm1a_evt_blk; /* Port address of Power Mgt 1a Acpi_event Reg Blk */ - u32 V1_pm1b_evt_blk; /* Port address of Power Mgt 1b Acpi_event Reg Blk */ - u32 V1_pm1a_cnt_blk; /* Port address of Power Mgt 1a Control Reg Blk */ - u32 V1_pm1b_cnt_blk; /* Port address of Power Mgt 1b Control Reg Blk */ - u32 V1_pm2_cnt_blk; /* Port address of Power Mgt 2 Control Reg Blk */ - u32 V1_pm_tmr_blk; /* Port address of Power Mgt Timer Ctrl Reg Blk */ - u32 V1_gpe0blk; /* Port addr of General Purpose Acpi_event 0 Reg Blk */ - u32 V1_gpe1_blk; /* Port addr of General Purpose Acpi_event 1 Reg Blk */ - u8 pm1_evt_len; /* Byte Length of ports at pm1_x_evt_blk */ - u8 pm1_cnt_len; /* Byte Length of ports at pm1_x_cnt_blk */ - u8 pm2_cnt_len; /* Byte Length of ports at pm2_cnt_blk */ - u8 pm_tm_len; /* Byte Length of ports at pm_tm_blk */ - u8 gpe0blk_len; /* Byte Length of ports at gpe0_blk */ - u8 gpe1_blk_len; /* Byte Length of ports at gpe1_blk */ - u8 gpe1_base; /* offset in gpe model where gpe1 events start */ - u8 cst_cnt; /* Support for the _CST object and C States change notification.*/ - u16 plvl2_lat; /* worst case HW latency to enter/exit C2 state */ - u16 plvl3_lat; /* worst case HW latency to enter/exit C3 state */ - u16 flush_size; /* number of flush strides that need to be read */ - u16 flush_stride; /* Processor's memory cache line width, in bytes */ - u8 duty_offset; /* Processor_s duty cycle index in processor's P_CNT reg*/ - u8 duty_width; /* Processor_s duty cycle value bit width in P_CNT register.*/ - u8 day_alrm; /* index to day-of-month alarm in RTC CMOS RAM */ - u8 mon_alrm; /* index to month-of-year alarm in RTC CMOS RAM */ - u8 century; /* index to century in RTC CMOS RAM */ - u16 iapc_boot_arch; /* IA-PC Boot Architecture Flags. See Table 5-10 for description*/ - u8 reserved2; /* reserved */ - u32 wb_invd : 1; /* wbinvd instruction works properly */ - u32 wb_invd_flush : 1; /* wbinvd flushes but does not invalidate */ - u32 proc_c1 : 1; /* all processors support C1 state */ - u32 plvl2_up : 1; /* C2 state works on MP system */ - u32 pwr_button : 1; /* Power button is handled as a generic feature */ - u32 sleep_button : 1; /* Sleep button is handled as a generic feature, or not present */ - u32 fixed_rTC : 1; /* RTC wakeup stat not in fixed register space */ - u32 rtcs4 : 1; /* RTC wakeup stat not possible from S4 */ - u32 tmr_val_ext : 1; /* tmr_val is 32 bits */ - u32 dock_cap : 1; /* Supports Docking */ - u32 reset_reg_sup : 1; /* Indicates system supports system reset via the FADT RESET_REG*/ - u32 sealed_case : 1; /* Indicates system has no internal expansion capabilities and case is sealed. */ - u32 headless : 1; /* Indicates system does not have local video capabilities or local input devices.*/ - u32 cpu_sw_sleep : 1; /* Indicates to OSPM that a processor native instruction */ - /* must be executed after writing the SLP_TYPx register. */ - u32 reserved6 : 18; /* reserved - must be zero */ - - ACPI_GAS reset_register; /* Reset register address in GAS format */ - u8 reset_value; /* Value to write to the Reset_register port to reset the system. */ - u8 reserved7[3]; /* These three bytes must be zero */ - UINT64 Xfirmware_ctrl; /* 64-bit physical address of FACS */ - UINT64 Xdsdt; /* 64-bit physical address of DSDT */ - ACPI_GAS Xpm1a_evt_blk; /* Extended Power Mgt 1a Acpi_event Reg Blk address */ - ACPI_GAS Xpm1b_evt_blk; /* Extended Power Mgt 1b Acpi_event Reg Blk address */ - ACPI_GAS Xpm1a_cnt_blk; /* Extended Power Mgt 1a Control Reg Blk address */ - ACPI_GAS Xpm1b_cnt_blk; /* Extended Power Mgt 1b Control Reg Blk address */ - ACPI_GAS Xpm2_cnt_blk; /* Extended Power Mgt 2 Control Reg Blk address */ - ACPI_GAS Xpm_tmr_blk; /* Extended Power Mgt Timer Ctrl Reg Blk address */ - ACPI_GAS Xgpe0blk; /* Extended General Purpose Acpi_event 0 Reg Blk address */ - ACPI_GAS Xgpe1_blk; /* Extended General Purpose Acpi_event 1 Reg Blk address */ - -} FADT_DESCRIPTOR_REV2; - - -#pragma pack() - -#endif /* __ACTBL2_H__ */ - diff --git a/reactos/drivers/bus/acpi/include/actbl71.h b/reactos/drivers/bus/acpi/include/actbl71.h deleted file mode 100644 index 0390d6f8de6..00000000000 --- a/reactos/drivers/bus/acpi/include/actbl71.h +++ /dev/null @@ -1,144 +0,0 @@ -/****************************************************************************** - * - * Name: actbl71.h - IA-64 Extensions to the ACPI Spec Rev. 0.71 - * This file includes tables specific to this - * specification revision. - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACTBL71_H__ -#define __ACTBL71_H__ - -/* 0.71 FADT Address_space data item bitmasks defines */ -/* If the associated bit is zero then it is in memory space else in io space */ -#define SMI_CMD_ADDRESS_SPACE 0x01 -#define PM1_BLK_ADDRESS_SPACE 0x02 -#define PM2_CNT_BLK_ADDRESS_SPACE 0x04 -#define PM_TMR_BLK_ADDRESS_SPACE 0x08 -#define GPE0_BLK_ADDRESS_SPACE 0x10 -#define GPE1_BLK_ADDRESS_SPACE 0x20 - -/* Only for clarity in declarations */ -typedef UINT64 IO_ADDRESS; - -#pragma pack(1) - -typedef struct /* Root System Descriptor Pointer */ -{ - NATIVE_CHAR signature [8]; /* contains "RSD PTR " */ - u8 checksum; /* to make sum of struct == 0 */ - NATIVE_CHAR oem_id [6]; /* OEM identification */ - u8 reserved; /* Must be 0 for 1.0, 2 for 2.0 */ - UINT64 rsdt_physical_address; /* 64-bit physical address of RSDT */ -} RSDP_DESCRIPTOR_REV071; - - -/*****************************************/ -/* IA64 Extensions to ACPI Spec Rev 0.71 */ -/* for the Root System Description Table */ -/*****************************************/ -typedef struct -{ - ACPI_TABLE_HEADER header; /* Table header */ - u32 reserved_pad; /* IA64 alignment, must be 0 */ - UINT64 table_offset_entry [1]; /* Array of pointers to other */ - /* tables' headers */ -} RSDT_DESCRIPTOR_REV071; - - -/*******************************************/ -/* IA64 Extensions to ACPI Spec Rev 0.71 */ -/* for the Firmware ACPI Control Structure */ -/*******************************************/ -typedef struct -{ - NATIVE_CHAR signature[4]; /* signature "FACS" */ - u32 length; /* length of structure, in bytes */ - u32 hardware_signature; /* hardware configuration signature */ - u32 reserved4; /* must be 0 */ - UINT64 firmware_waking_vector; /* ACPI OS waking vector */ - UINT64 global_lock; /* Global Lock */ - u32 S4_bios_f : 1; /* Indicates if S4_bIOS support is present */ - u32 reserved1 : 31; /* must be 0 */ - u8 reserved3 [28]; /* reserved - must be zero */ - -} FACS_DESCRIPTOR_REV071; - - -/******************************************/ -/* IA64 Extensions to ACPI Spec Rev 0.71 */ -/* for the Fixed ACPI Description Table */ -/******************************************/ -typedef struct -{ - ACPI_TABLE_HEADER header; /* table header */ - u32 reserved_pad; /* IA64 alignment, must be 0 */ - UINT64 firmware_ctrl; /* 64-bit Physical address of FACS */ - UINT64 dsdt; /* 64-bit Physical address of DSDT */ - u8 model; /* System Interrupt Model */ - u8 address_space; /* Address Space Bitmask */ - u16 sci_int; /* System vector of SCI interrupt */ - u8 acpi_enable; /* value to write to smi_cmd to enable ACPI */ - u8 acpi_disable; /* value to write to smi_cmd to disable ACPI */ - u8 S4_bios_req; /* Value to write to SMI CMD to enter S4_bIOS state */ - u8 reserved2; /* reserved - must be zero */ - UINT64 smi_cmd; /* Port address of SMI command port */ - UINT64 pm1a_evt_blk; /* Port address of Power Mgt 1a Acpi_event Reg Blk */ - UINT64 pm1b_evt_blk; /* Port address of Power Mgt 1b Acpi_event Reg Blk */ - UINT64 pm1a_cnt_blk; /* Port address of Power Mgt 1a Control Reg Blk */ - UINT64 pm1b_cnt_blk; /* Port address of Power Mgt 1b Control Reg Blk */ - UINT64 pm2_cnt_blk; /* Port address of Power Mgt 2 Control Reg Blk */ - UINT64 pm_tmr_blk; /* Port address of Power Mgt Timer Ctrl Reg Blk */ - UINT64 gpe0blk; /* Port addr of General Purpose Acpi_event 0 Reg Blk */ - UINT64 gpe1_blk; /* Port addr of General Purpose Acpi_event 1 Reg Blk */ - u8 pm1_evt_len; /* Byte Length of ports at pm1_x_evt_blk */ - u8 pm1_cnt_len; /* Byte Length of ports at pm1_x_cnt_blk */ - u8 pm2_cnt_len; /* Byte Length of ports at pm2_cnt_blk */ - u8 pm_tm_len; /* Byte Length of ports at pm_tm_blk */ - u8 gpe0blk_len; /* Byte Length of ports at gpe0_blk */ - u8 gpe1_blk_len; /* Byte Length of ports at gpe1_blk */ - u8 gpe1_base; /* offset in gpe model where gpe1 events start */ - u8 reserved3; /* reserved */ - u16 plvl2_lat; /* worst case HW latency to enter/exit C2 state */ - u16 plvl3_lat; /* worst case HW latency to enter/exit C3 state */ - u8 day_alrm; /* index to day-of-month alarm in RTC CMOS RAM */ - u8 mon_alrm; /* index to month-of-year alarm in RTC CMOS RAM */ - u8 century; /* index to century in RTC CMOS RAM */ - u8 reserved4; /* reserved */ - u32 flush_cash : 1; /* PAL_FLUSH_CACHE is correctly supported */ - u32 reserved5 : 1; /* reserved - must be zero */ - u32 proc_c1 : 1; /* all processors support C1 state */ - u32 plvl2_up : 1; /* C2 state works on MP system */ - u32 pwr_button : 1; /* Power button is handled as a generic feature */ - u32 sleep_button : 1; /* Sleep button is handled as a generic feature, or not present */ - u32 fixed_rTC : 1; /* RTC wakeup stat not in fixed register space */ - u32 rtcs4 : 1; /* RTC wakeup stat not possible from S4 */ - u32 tmr_val_ext : 1; /* tmr_val is 32 bits */ - u32 dock_cap : 1; /* Supports Docking */ - u32 reserved6 : 22; /* reserved - must be zero */ - -} FADT_DESCRIPTOR_REV071; - -#pragma pack() - -#endif /* __ACTBL71_H__ */ - diff --git a/reactos/drivers/bus/acpi/include/actypes.h b/reactos/drivers/bus/acpi/include/actypes.h deleted file mode 100644 index 16c7b76ddf7..00000000000 --- a/reactos/drivers/bus/acpi/include/actypes.h +++ /dev/null @@ -1,1077 +0,0 @@ -/****************************************************************************** - * - * Name: actypes.h - Common data types for the entire ACPI subsystem - * $Revision: 1.5 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACTYPES_H__ -#define __ACTYPES_H__ - -/*! [Begin] no source code translation (keep the typedefs) */ - -/* - * Data types - Fixed across all compilation models - * - * BOOLEAN Logical Boolean. - * 1 byte value containing a 0 for FALSE or a 1 for TRUE. - * Other values are undefined. - * - * INT8 8-bit (1 byte) signed value - * UINT8 8-bit (1 byte) unsigned value - * INT16 16-bit (2 byte) signed value - * UINT16 16-bit (2 byte) unsigned value - * INT32 32-bit (4 byte) signed value - * UINT32 32-bit (4 byte) unsigned value - * INT64 64-bit (8 byte) signed value - * UINT64 64-bit (8 byte) unsigned value - * NATIVE_INT 32-bit on IA-32, 64-bit on IA-64 signed value - * NATIVE_UINT 32-bit on IA-32, 64-bit on IA-64 unsigned value - * UCHAR Character. 1 byte unsigned value. - */ - - -#if defined (_IA64) || defined(_AMD64_) -/* - * 64-bit type definitions - */ -//typedef unsigned char UINT8; -//typedef unsigned char BOOLEAN; -//typedef unsigned char UCHAR; -//typedef unsigned short UINT16; -//typedef int INT32; -//typedef unsigned int UINT32; -//typedef COMPILER_DEPENDENT_UINT64 UINT64; - -typedef UINT64 NATIVE_UINT; -typedef INT64 NATIVE_INT; - -typedef NATIVE_UINT ACPI_TBLPTR; -typedef UINT64 ACPI_IO_ADDRESS; -typedef UINT64 ACPI_PHYSICAL_ADDRESS; - -#define ALIGNED_ADDRESS_BOUNDARY 0x00000008 - -/* (No hardware alignment support in IA64) */ - - -#elif _IA16 -/* - * 16-bit type definitions - */ -typedef unsigned char UINT8; -typedef unsigned char BOOLEAN; -typedef unsigned char UCHAR; -typedef unsigned int UINT16; -typedef long INT32; -typedef int INT16; -typedef unsigned long UINT32; - -typedef struct -{ - UINT32 Lo; - UINT32 Hi; - -} UINT64; - -typedef UINT16 NATIVE_UINT; -typedef INT16 NATIVE_INT; - -typedef UINT32 ACPI_TBLPTR; -typedef UINT32 ACPI_IO_ADDRESS; -typedef char *ACPI_PHYSICAL_ADDRESS; - -#define ALIGNED_ADDRESS_BOUNDARY 0x00000002 -#define _HW_ALIGNMENT_SUPPORT - -/* - * (16-bit only) internal integers must be 32-bits, so - * 64-bit integers cannot be supported - */ -#define ACPI_NO_INTEGER64_SUPPORT - - -#else -/* - * 32-bit type definitions (default) - */ -//typedef unsigned char UINT8; -//typedef unsigned char BOOLEAN; -//typedef unsigned char UCHAR; -//typedef unsigned short UINT16; -//typedef int INT32; -//typedef unsigned int UINT32; -//typedef COMPILER_DEPENDENT_UINT64 UINT64; - -typedef UINT32 NATIVE_UINT; -typedef INT32 NATIVE_INT; - -typedef NATIVE_UINT ACPI_TBLPTR; -typedef UINT32 ACPI_IO_ADDRESS; -typedef UINT64 ACPI_PHYSICAL_ADDRESS; - -#define ALIGNED_ADDRESS_BOUNDARY 0x00000004 -#define _HW_ALIGNMENT_SUPPORT -#endif - - - -/* - * Miscellaneous common types - */ - -typedef UINT32 UINT32_BIT; -typedef NATIVE_UINT ACPI_PTRDIFF; -typedef char NATIVE_CHAR; - - -/* - * Data type ranges - */ - -#define ACPI_UINT8_MAX (UINT8) 0xFF -#define ACPI_UINT16_MAX (UINT16) 0xFFFF -#define ACPI_UINT32_MAX (UINT32) 0xFFFFFFFF -#ifdef __GNUC__ -#define ACPI_UINT64_MAX (UINT64) 0xFFFFFFFFFFFFFFFFULL -#else -#define ACPI_UINT64_MAX (UINT64) 0xFFFFFFFFFFFFFFFF -#endif - -#ifdef DEFINE_ALTERNATE_TYPES -/* - * Types used only in translated source - */ -typedef INT32 s32; -typedef UINT8 u8; -typedef UINT16 u16; -typedef UINT32 u32; -typedef UINT64 u64; -#endif -/*! [End] no source code translation !*/ - - -/* - * Useful defines - */ - -#ifdef FALSE -#undef FALSE -#endif -#define FALSE (1 == 0) - -#ifdef TRUE -#undef TRUE -#endif -#define TRUE (1 == 1) - -#ifndef NULL -#define NULL (void *) 0 -#endif - - -/* - * Local datatypes - */ -#ifdef _MSC_VER -typedef ULONGLONG u64; -typedef ULONG u32; -typedef USHORT u16; -typedef UCHAR u8; -typedef LONGLONG s64; -typedef LONG s32; -typedef SHORT s16; -typedef CHAR s8; -#endif - -typedef u32 ACPI_STATUS; /* All ACPI Exceptions */ -typedef u32 ACPI_NAME; /* 4-s8 ACPI name */ -typedef char* ACPI_STRING; /* Null terminated ASCII string */ -typedef void* ACPI_HANDLE; /* Actually a ptr to an Node */ - - -/* - * Acpi integer width. In ACPI version 1, integers are - * 32 bits. In ACPI version 2, integers are 64 bits. - * Note that this pertains to the ACPI integer type only, not - * other integers used in the implementation of the ACPI CA - * subsystem. - */ -#ifdef ACPI_NO_INTEGER64_SUPPORT - -/* 32-bit integers only, no 64-bit support */ - -typedef u32 ACPI_INTEGER; -#define ACPI_INTEGER_MAX ACPI_UINT32_MAX -#define ACPI_INTEGER_BIT_SIZE 32 -#define ACPI_MAX_BCD_VALUE 99999999 -#define ACPI_MAX_BCD_DIGITS 8 - -#else - -/* 64-bit integers */ - -typedef UINT64 ACPI_INTEGER; -#define ACPI_INTEGER_MAX ACPI_UINT64_MAX -#define ACPI_INTEGER_BIT_SIZE 64 -#ifdef __GNUC__ -#define ACPI_MAX_BCD_VALUE 9999999999999999ULL -#else -#define ACPI_MAX_BCD_VALUE 9999999999999999 -#endif -#define ACPI_MAX_BCD_DIGITS 16 - -#endif - - -/* - * Constants with special meanings - */ - -#define ACPI_ROOT_OBJECT (ACPI_HANDLE)(-1) - -#define ACPI_FULL_INITIALIZATION 0x00 -#define ACPI_NO_ADDRESS_SPACE_INIT 0x01 -#define ACPI_NO_HARDWARE_INIT 0x02 -#define ACPI_NO_EVENT_INIT 0x04 -#define ACPI_NO_ACPI_ENABLE 0x08 -#define ACPI_NO_DEVICE_INIT 0x10 -#define ACPI_NO_OBJECT_INIT 0x20 - - -/* - * System states - */ -#define ACPI_STATE_S0 (u8) 0 -#define ACPI_STATE_S1 (u8) 1 -#define ACPI_STATE_S2 (u8) 2 -#define ACPI_STATE_S3 (u8) 3 -#define ACPI_STATE_S4 (u8) 4 -#define ACPI_STATE_S5 (u8) 5 -/* let's pretend S4_bIOS didn't exist for now. ASG */ -#define ACPI_STATE_S4_bIOS (u8) 6 -#define ACPI_S_STATES_MAX ACPI_STATE_S5 -#define ACPI_S_STATE_COUNT 6 - -/* - * Device power states - */ -#define ACPI_STATE_D0 (u8) 0 -#define ACPI_STATE_D1 (u8) 1 -#define ACPI_STATE_D2 (u8) 2 -#define ACPI_STATE_D3 (u8) 3 -#define ACPI_D_STATES_MAX ACPI_STATE_D3 -#define ACPI_D_STATE_COUNT 4 - -#define ACPI_STATE_UNKNOWN (u8) 0xFF - - -/* - * Table types. These values are passed to the table related APIs - */ - -typedef u32 ACPI_TABLE_TYPE; - -#define ACPI_TABLE_RSDP (ACPI_TABLE_TYPE) 0 -#define ACPI_TABLE_DSDT (ACPI_TABLE_TYPE) 1 -#define ACPI_TABLE_FADT (ACPI_TABLE_TYPE) 2 -#define ACPI_TABLE_FACS (ACPI_TABLE_TYPE) 3 -#define ACPI_TABLE_PSDT (ACPI_TABLE_TYPE) 4 -#define ACPI_TABLE_SSDT (ACPI_TABLE_TYPE) 5 -#define ACPI_TABLE_XSDT (ACPI_TABLE_TYPE) 6 -#define ACPI_TABLE_MAX 6 -#define NUM_ACPI_TABLES (ACPI_TABLE_MAX+1) - - -/* - * Types associated with names. The first group of - * values correspond to the definition of the ACPI - * Object_type operator (See the ACPI Spec). Therefore, - * only add to the first group if the spec changes! - * - * Types must be kept in sync with the Acpi_ns_properties - * and Acpi_ns_type_names arrays - */ - -typedef u32 ACPI_OBJECT_TYPE; -typedef u8 OBJECT_TYPE_INTERNAL; - -#define ACPI_BTYPE_ANY 0x00000000 -#define ACPI_BTYPE_INTEGER 0x00000001 -#define ACPI_BTYPE_STRING 0x00000002 -#define ACPI_BTYPE_BUFFER 0x00000004 -#define ACPI_BTYPE_PACKAGE 0x00000008 -#define ACPI_BTYPE_FIELD_UNIT 0x00000010 -#define ACPI_BTYPE_DEVICE 0x00000020 -#define ACPI_BTYPE_EVENT 0x00000040 -#define ACPI_BTYPE_METHOD 0x00000080 -#define ACPI_BTYPE_MUTEX 0x00000100 -#define ACPI_BTYPE_REGION 0x00000200 -#define ACPI_BTYPE_POWER 0x00000400 -#define ACPI_BTYPE_PROCESSOR 0x00000800 -#define ACPI_BTYPE_THERMAL 0x00001000 -#define ACPI_BTYPE_BUFFER_FIELD 0x00002000 -#define ACPI_BTYPE_DDB_HANDLE 0x00004000 -#define ACPI_BTYPE_DEBUG_OBJECT 0x00008000 -#define ACPI_BTYPE_REFERENCE 0x00010000 -#define ACPI_BTYPE_RESOURCE 0x00020000 - -#define ACPI_BTYPE_COMPUTE_DATA (ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER) - -#define ACPI_BTYPE_DATA (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_PACKAGE) -#define ACPI_BTYPE_DATA_REFERENCE (ACPI_BTYPE_DATA | ACPI_BTYPE_REFERENCE | ACPI_BTYPE_DDB_HANDLE) -#define ACPI_BTYPE_DEVICE_OBJECTS (ACPI_BTYPE_DEVICE | ACPI_BTYPE_THERMAL | ACPI_BTYPE_PROCESSOR) -#define ACPI_BTYPE_OBJECTS_AND_REFS 0x00017FFF /* ARG or LOCAL */ -#define ACPI_BTYPE_ALL_OBJECTS 0x00007FFF - - -#define ACPI_TYPE_ANY 0 /* 0x00 */ -#define ACPI_TYPE_INTEGER 1 /* 0x01 Byte/Word/Dword/Zero/One/Ones */ -#define ACPI_TYPE_STRING 2 /* 0x02 */ -#define ACPI_TYPE_BUFFER 3 /* 0x03 */ -#define ACPI_TYPE_PACKAGE 4 /* 0x04 Byte_const, multiple Data_term/Constant/Super_name */ -#define ACPI_TYPE_FIELD_UNIT 5 /* 0x05 */ -#define ACPI_TYPE_DEVICE 6 /* 0x06 Name, multiple Node */ -#define ACPI_TYPE_EVENT 7 /* 0x07 */ -#define ACPI_TYPE_METHOD 8 /* 0x08 Name, Byte_const, multiple Code */ -#define ACPI_TYPE_MUTEX 9 /* 0x09 */ -#define ACPI_TYPE_REGION 10 /* 0x0A */ -#define ACPI_TYPE_POWER 11 /* 0x0B Name,Byte_const,Word_const,multi Node */ -#define ACPI_TYPE_PROCESSOR 12 /* 0x0C Name,Byte_const,DWord_const,Byte_const,multi Nm_o */ -#define ACPI_TYPE_THERMAL 13 /* 0x0D Name, multiple Node */ -#define ACPI_TYPE_BUFFER_FIELD 14 /* 0x0E */ -#define ACPI_TYPE_DDB_HANDLE 15 /* 0x0F */ -#define ACPI_TYPE_DEBUG_OBJECT 16 /* 0x10 */ - -#define ACPI_TYPE_MAX 16 - -/* - * This section contains object types that do not relate to the ACPI Object_type operator. - * They are used for various internal purposes only. If new predefined ACPI_TYPEs are - * added (via the ACPI specification), these internal types must move upwards. - * Also, values exceeding the largest official ACPI Object_type must not overlap with - * defined AML opcodes. - */ -#define INTERNAL_TYPE_BEGIN 17 - -#define INTERNAL_TYPE_DEF_FIELD 17 /* 0x11 */ -#define INTERNAL_TYPE_BANK_FIELD 18 /* 0x12 */ -#define INTERNAL_TYPE_INDEX_FIELD 19 /* 0x13 */ -#define INTERNAL_TYPE_REFERENCE 20 /* 0x14 Arg#, Local#, Name, Debug; used only in descriptors */ -#define INTERNAL_TYPE_ALIAS 21 /* 0x15 */ -#define INTERNAL_TYPE_NOTIFY 22 /* 0x16 */ -#define INTERNAL_TYPE_ADDRESS_HANDLER 23 /* 0x17 */ -#define INTERNAL_TYPE_RESOURCE 24 /* 0x18 */ - - -#define INTERNAL_TYPE_NODE_MAX 24 - -/* These are pseudo-types because there are never any namespace nodes with these types */ - -#define INTERNAL_TYPE_DEF_FIELD_DEFN 25 /* 0x19 Name, Byte_const, multiple Field_element */ -#define INTERNAL_TYPE_BANK_FIELD_DEFN 26 /* 0x1A 2 Name,DWord_const,Byte_const,multi Field_element */ -#define INTERNAL_TYPE_INDEX_FIELD_DEFN 27 /* 0x1B 2 Name, Byte_const, multiple Field_element */ -#define INTERNAL_TYPE_IF 28 /* 0x1C */ -#define INTERNAL_TYPE_ELSE 29 /* 0x1D */ -#define INTERNAL_TYPE_WHILE 30 /* 0x1E */ -#define INTERNAL_TYPE_SCOPE 31 /* 0x1F Name, multiple Node */ -#define INTERNAL_TYPE_DEF_ANY 32 /* 0x20 type is Any, suppress search of enclosing scopes */ -#define INTERNAL_TYPE_EXTRA 33 /* 0x21 */ - -#define INTERNAL_TYPE_MAX 33 - -#define INTERNAL_TYPE_INVALID 34 -#define ACPI_TYPE_NOT_FOUND 0xFF - -/* - * Acpi_event Types: - * ------------ - * Fixed & general purpose... - */ - -typedef u32 ACPI_EVENT_TYPE; - -#define ACPI_EVENT_FIXED (ACPI_EVENT_TYPE) 0 -#define ACPI_EVENT_GPE (ACPI_EVENT_TYPE) 1 - -/* - * Fixed events - */ - -#define ACPI_EVENT_PMTIMER (ACPI_EVENT_TYPE) 0 - /* - * There's no bus master event so index 1 is used for IRQ's that are not - * handled by the SCI handler - */ -#define ACPI_EVENT_NOT_USED (ACPI_EVENT_TYPE) 1 -#define ACPI_EVENT_GLOBAL (ACPI_EVENT_TYPE) 2 -#define ACPI_EVENT_POWER_BUTTON (ACPI_EVENT_TYPE) 3 -#define ACPI_EVENT_SLEEP_BUTTON (ACPI_EVENT_TYPE) 4 -#define ACPI_EVENT_RTC (ACPI_EVENT_TYPE) 5 -#define ACPI_EVENT_GENERAL (ACPI_EVENT_TYPE) 6 -#define ACPI_EVENT_MAX 6 -#define NUM_FIXED_EVENTS (ACPI_EVENT_TYPE) 7 - -#define ACPI_GPE_INVALID 0xFF -#define ACPI_GPE_MAX 0xFF -#define NUM_GPE 256 - -#define ACPI_EVENT_LEVEL_TRIGGERED (ACPI_EVENT_TYPE) 1 -#define ACPI_EVENT_EDGE_TRIGGERED (ACPI_EVENT_TYPE) 2 - -/* - * Acpi_event Status: - * ------------- - * The encoding of ACPI_EVENT_STATUS is illustrated below. - * Note that a set bit (1) indicates the property is TRUE - * (e.g. if bit 0 is set then the event is enabled). - * +---------------+-+-+ - * | Bits 31:2 |1|0| - * +---------------+-+-+ - * | | | - * | | +- Enabled? - * | +--- Set? - * +----------- - */ -typedef u32 ACPI_EVENT_STATUS; - -#define ACPI_EVENT_FLAG_DISABLED (ACPI_EVENT_STATUS) 0x00 -#define ACPI_EVENT_FLAG_ENABLED (ACPI_EVENT_STATUS) 0x01 -#define ACPI_EVENT_FLAG_SET (ACPI_EVENT_STATUS) 0x02 - - -/* Notify types */ - -#define ACPI_SYSTEM_NOTIFY 0 -#define ACPI_DEVICE_NOTIFY 1 -#define ACPI_MAX_NOTIFY_HANDLER_TYPE 1 - -#define MAX_SYS_NOTIFY 0x7f - - -/* Address Space (Operation Region) Types */ - -typedef u8 ACPI_ADDRESS_SPACE_TYPE; - -#define ADDRESS_SPACE_SYSTEM_MEMORY (ACPI_ADDRESS_SPACE_TYPE) 0 -#define ADDRESS_SPACE_SYSTEM_IO (ACPI_ADDRESS_SPACE_TYPE) 1 -#define ADDRESS_SPACE_PCI_CONFIG (ACPI_ADDRESS_SPACE_TYPE) 2 -#define ADDRESS_SPACE_EC (ACPI_ADDRESS_SPACE_TYPE) 3 -#define ADDRESS_SPACE_SMBUS (ACPI_ADDRESS_SPACE_TYPE) 4 -#define ADDRESS_SPACE_CMOS (ACPI_ADDRESS_SPACE_TYPE) 5 -#define ADDRESS_SPACE_PCI_BAR_TARGET (ACPI_ADDRESS_SPACE_TYPE) 6 - - -/* - * External ACPI object definition - */ - -typedef union acpi_obj -{ - ACPI_OBJECT_TYPE type; /* See definition of Acpi_ns_type for values */ - struct - { - ACPI_OBJECT_TYPE type; - ACPI_INTEGER value; /* The actual number */ - } integer; - - struct - { - ACPI_OBJECT_TYPE type; - u32 length; /* # of bytes in string, excluding trailing null */ - NATIVE_CHAR *pointer; /* points to the string value */ - } string; - - struct - { - ACPI_OBJECT_TYPE type; - u32 length; /* # of bytes in buffer */ - u8 *pointer; /* points to the buffer */ - } buffer; - - struct - { - ACPI_OBJECT_TYPE type; - u32 fill1; - ACPI_HANDLE handle; /* object reference */ - } reference; - - struct - { - ACPI_OBJECT_TYPE type; - u32 count; /* # of elements in package */ - union acpi_obj *elements; /* Pointer to an array of ACPI_OBJECTs */ - } package; - - struct - { - ACPI_OBJECT_TYPE type; - u32 proc_id; - ACPI_IO_ADDRESS pblk_address; - u32 pblk_length; - } processor; - - struct - { - ACPI_OBJECT_TYPE type; - u32 system_level; - u32 resource_order; - } power_resource; - -} ACPI_OBJECT, *PACPI_OBJECT; - - -/* - * List of objects, used as a parameter list for control method evaluation - */ - -typedef struct acpi_obj_list -{ - u32 count; - ACPI_OBJECT *pointer; - -} ACPI_OBJECT_LIST, *PACPI_OBJECT_LIST; - - -/* - * Miscellaneous common Data Structures used by the interfaces - */ - -typedef struct -{ - u32 length; /* Length in bytes of the buffer */ - void *pointer; /* pointer to buffer */ - -} ACPI_BUFFER; - - -/* - * Name_type for Acpi_get_name - */ - -#define ACPI_FULL_PATHNAME 0 -#define ACPI_SINGLE_NAME 1 -#define ACPI_NAME_TYPE_MAX 1 - - -/* - * Structure and flags for Acpi_get_system_info - */ - -#define SYS_MODE_UNKNOWN 0x0000 -#define SYS_MODE_ACPI 0x0001 -#define SYS_MODE_LEGACY 0x0002 -#define SYS_MODES_MASK 0x0003 - -/* - * ACPI CPU Cx state handler - */ -typedef -ACPI_STATUS (*ACPI_SET_C_STATE_HANDLER) ( - NATIVE_UINT pblk_address); - -/* - * ACPI Cx State info - */ -typedef struct -{ - u32 state_number; - u32 latency; -} ACPI_CX_STATE; - -/* - * ACPI CPU throttling info - */ -typedef struct -{ - u32 state_number; - u32 percent_of_clock; -} ACPI_CPU_THROTTLING_STATE; - -/* - * ACPI Table Info. One per ACPI table _type_ - */ -typedef struct acpi_table_info -{ - u32 count; - -} ACPI_TABLE_INFO; - - -/* - * System info returned by Acpi_get_system_info() - */ - -typedef struct _acpi_sys_info -{ - u32 acpi_ca_version; - u32 flags; - u32 timer_resolution; - u32 reserved1; - u32 reserved2; - u32 debug_level; - u32 debug_layer; - u32 num_table_types; - ACPI_TABLE_INFO table_info [NUM_ACPI_TABLES]; - -} ACPI_SYSTEM_INFO; - - -/* - * System Initiailization data. This data is passed to ACPIInitialize - * copyied to global data and retained by ACPI CA - */ - -typedef struct _acpi_init_data -{ - void *RSDP_physical_address; /* Address of RSDP, needed it it is */ - /* not found in the IA32 manner */ -} ACPI_INIT_DATA; - -/* - * Various handlers and callback procedures - */ - -typedef -u32 (*FIXED_EVENT_HANDLER) ( - void *context); - -typedef -void (*GPE_HANDLER) ( - void *context); - -typedef -void (*NOTIFY_HANDLER) ( - ACPI_HANDLE device, - u32 value, - void *context); - -#define ADDRESS_SPACE_READ 1 -#define ADDRESS_SPACE_WRITE 2 - -typedef -ACPI_STATUS (*ADDRESS_SPACE_HANDLER) ( - u32 function, - ACPI_PHYSICAL_ADDRESS address, - u32 bit_width, - u32 *value, - void *handler_context, - void *region_context); - -#define ACPI_DEFAULT_HANDLER ((ADDRESS_SPACE_HANDLER) NULL) - - -typedef -ACPI_STATUS (*ADDRESS_SPACE_SETUP) ( - ACPI_HANDLE region_handle, - u32 function, - void *handler_context, - void **region_context); - -#define ACPI_REGION_ACTIVATE 0 -#define ACPI_REGION_DEACTIVATE 1 - -typedef -ACPI_STATUS (*WALK_CALLBACK) ( - ACPI_HANDLE obj_handle, - u32 nesting_level, - void *context, - void **return_value); - - -/* Interrupt handler return values */ - -#define INTERRUPT_NOT_HANDLED 0x00 -#define INTERRUPT_HANDLED 0x01 - - -/* Structure and flags for Acpi_get_device_info */ - -#define ACPI_VALID_HID 0x1 -#define ACPI_VALID_UID 0x2 -#define ACPI_VALID_ADR 0x4 -#define ACPI_VALID_STA 0x8 - - -#define ACPI_COMMON_OBJ_INFO \ - ACPI_OBJECT_TYPE type; /* ACPI object type */ \ - ACPI_NAME name /* ACPI object Name */ - - -typedef struct -{ - ACPI_COMMON_OBJ_INFO; -} ACPI_OBJ_INFO_HEADER; - - -typedef struct -{ - ACPI_COMMON_OBJ_INFO; - - u32 valid; /* Are the next bits legit? */ - NATIVE_CHAR hardware_id [9]; /* _HID value if any */ - NATIVE_CHAR unique_id[9]; /* _UID value if any */ - ACPI_INTEGER address; /* _ADR value if any */ - u32 current_status; /* _STA value */ -} ACPI_DEVICE_INFO; - - -/* Context structs for address space handlers */ - -typedef struct -{ - u32 seg; - u32 bus; - u32 dev_func; -} PCI_HANDLER_CONTEXT; - - -typedef struct -{ - ACPI_PHYSICAL_ADDRESS mapped_physical_address; - u8 *mapped_logical_address; - u32 mapped_length; -} MEM_HANDLER_CONTEXT; - - -/* - * C-state handler - */ - -typedef ACPI_STATUS (*ACPI_C_STATE_HANDLER) (ACPI_IO_ADDRESS, u32*); - - -/* - * Definitions for Resource Attributes - */ - -/* - * Memory Attributes - */ -#define READ_ONLY_MEMORY (u8) 0x00 -#define READ_WRITE_MEMORY (u8) 0x01 - -#define NON_CACHEABLE_MEMORY (u8) 0x00 -#define CACHABLE_MEMORY (u8) 0x01 -#define WRITE_COMBINING_MEMORY (u8) 0x02 -#define PREFETCHABLE_MEMORY (u8) 0x03 - -/* - * IO Attributes - * The ISA IO ranges are: n000-n0FFh, n400-n4_fFh, n800-n8_fFh, n_c00-n_cFFh. - * The non-ISA IO ranges are: n100-n3_fFh, n500-n7_fFh, n900-n_bFFh, n_cD0-n_fFFh. - */ -#define NON_ISA_ONLY_RANGES (u8) 0x01 -#define ISA_ONLY_RANGES (u8) 0x02 -#define ENTIRE_RANGE (NON_ISA_ONLY_RANGES | ISA_ONLY_RANGES) - -/* - * IO Port Descriptor Decode - */ -#define DECODE_10 (u8) 0x00 /* 10-bit IO address decode */ -#define DECODE_16 (u8) 0x01 /* 16-bit IO address decode */ - -/* - * IRQ Attributes - */ -#define EDGE_SENSITIVE (u8) 0x00 -#define LEVEL_SENSITIVE (u8) 0x01 - -#define ACTIVE_HIGH (u8) 0x00 -#define ACTIVE_LOW (u8) 0x01 - -#define EXCLUSIVE (u8) 0x00 -#define SHARED (u8) 0x01 - -/* - * DMA Attributes - */ -#define COMPATIBILITY (u8) 0x00 -#define TYPE_A (u8) 0x01 -#define TYPE_B (u8) 0x02 -#define TYPE_F (u8) 0x03 - -#define NOT_BUS_MASTER (u8) 0x00 -#define BUS_MASTER (u8) 0x01 - -#define TRANSFER_8 (u8) 0x00 -#define TRANSFER_8_16 (u8) 0x01 -#define TRANSFER_16 (u8) 0x02 - -/* - * Start Dependent Functions Priority definitions - */ -#define GOOD_CONFIGURATION (u8) 0x00 -#define ACCEPTABLE_CONFIGURATION (u8) 0x01 -#define SUB_OPTIMAL_CONFIGURATION (u8) 0x02 - -/* - * 16, 32 and 64-bit Address Descriptor resource types - */ -#define MEMORY_RANGE (u8) 0x00 -#define IO_RANGE (u8) 0x01 -#define BUS_NUMBER_RANGE (u8) 0x02 - -#define ADDRESS_NOT_FIXED (u8) 0x00 -#define ADDRESS_FIXED (u8) 0x01 - -#define POS_DECODE (u8) 0x00 -#define SUB_DECODE (u8) 0x01 - -#define PRODUCER (u8) 0x00 -#define CONSUMER (u8) 0x01 - - -/* - * Structures used to describe device resources - */ -typedef struct -{ - u32 edge_level; - u32 active_high_low; - u32 shared_exclusive; - u32 number_of_interrupts; - u32 interrupts[1]; - -} IRQ_RESOURCE; - -typedef struct -{ - u32 type; - u32 bus_master; - u32 transfer; - u32 number_of_channels; - u32 channels[1]; - -} DMA_RESOURCE; - -typedef struct -{ - u32 compatibility_priority; - u32 performance_robustness; - -} START_DEPENDENT_FUNCTIONS_RESOURCE; - -/* - * END_DEPENDENT_FUNCTIONS_RESOURCE struct is not - * needed because it has no fields - */ - -typedef struct -{ - u32 io_decode; - u32 min_base_address; - u32 max_base_address; - u32 alignment; - u32 range_length; - -} IO_RESOURCE; - -typedef struct -{ - u32 base_address; - u32 range_length; - -} FIXED_IO_RESOURCE; - -typedef struct -{ - u32 length; - u8 reserved[1]; - -} VENDOR_RESOURCE; - -typedef struct -{ - u32 read_write_attribute; - u32 min_base_address; - u32 max_base_address; - u32 alignment; - u32 range_length; - -} MEMORY24_RESOURCE; - -typedef struct -{ - u32 read_write_attribute; - u32 min_base_address; - u32 max_base_address; - u32 alignment; - u32 range_length; - -} MEMORY32_RESOURCE; - -typedef struct -{ - u32 read_write_attribute; - u32 range_base_address; - u32 range_length; - -} FIXED_MEMORY32_RESOURCE; - -typedef struct -{ - u16 cache_attribute; - u16 read_write_attribute; - -} MEMORY_ATTRIBUTE; - -typedef struct -{ - u16 range_attribute; - u16 reserved; - -} IO_ATTRIBUTE; - -typedef struct -{ - u16 reserved1; - u16 reserved2; - -} BUS_ATTRIBUTE; - -typedef union -{ - MEMORY_ATTRIBUTE memory; - IO_ATTRIBUTE io; - BUS_ATTRIBUTE bus; - -} ATTRIBUTE_DATA; - -typedef struct -{ - u32 resource_type; - u32 producer_consumer; - u32 decode; - u32 min_address_fixed; - u32 max_address_fixed; - ATTRIBUTE_DATA attribute; - u32 granularity; - u32 min_address_range; - u32 max_address_range; - u32 address_translation_offset; - u32 address_length; - u32 resource_source_index; - u32 resource_source_string_length; - NATIVE_CHAR resource_source[1]; - -} ADDRESS16_RESOURCE; - -typedef struct -{ - u32 resource_type; - u32 producer_consumer; - u32 decode; - u32 min_address_fixed; - u32 max_address_fixed; - ATTRIBUTE_DATA attribute; - u32 granularity; - u32 min_address_range; - u32 max_address_range; - u32 address_translation_offset; - u32 address_length; - u32 resource_source_index; - u32 resource_source_string_length; - NATIVE_CHAR resource_source[1]; - -} ADDRESS32_RESOURCE; - -typedef struct -{ - u32 producer_consumer; - u32 edge_level; - u32 active_high_low; - u32 shared_exclusive; - u32 number_of_interrupts; - u32 interrupts[1]; - u32 resource_source_index; - u32 resource_source_string_length; - NATIVE_CHAR resource_source[1]; - -} EXTENDED_IRQ_RESOURCE; - -typedef enum -{ - irq, - dma, - start_dependent_functions, - end_dependent_functions, - io, - fixed_io, - vendor_specific, - end_tag, - memory24, - memory32, - fixed_memory32, - address16, - address32, - extended_irq -} RESOURCE_TYPE; - -typedef union -{ - IRQ_RESOURCE irq; - DMA_RESOURCE dma; - START_DEPENDENT_FUNCTIONS_RESOURCE start_dependent_functions; - IO_RESOURCE io; - FIXED_IO_RESOURCE fixed_io; - VENDOR_RESOURCE vendor_specific; - MEMORY24_RESOURCE memory24; - MEMORY32_RESOURCE memory32; - FIXED_MEMORY32_RESOURCE fixed_memory32; - ADDRESS16_RESOURCE address16; - ADDRESS32_RESOURCE address32; - EXTENDED_IRQ_RESOURCE extended_irq; -} RESOURCE_DATA; - -typedef struct _resource_tag -{ - RESOURCE_TYPE id; - u32 length; - RESOURCE_DATA data; -} RESOURCE; - -#define RESOURCE_LENGTH 12 -#define RESOURCE_LENGTH_NO_DATA 8 - -#define NEXT_RESOURCE(res) (RESOURCE*)((u8*) res + res->length) - -/* - * END: Definitions for Resource Attributes - */ - - -typedef struct pci_routing_table -{ - u32 length; - u32 pin; - ACPI_INTEGER address; /* here for 64-bit alignment */ - u32 source_index; - NATIVE_CHAR source[4]; /* pad to 64 bits so sizeof() works in all cases */ - -} PCI_ROUTING_TABLE; - - -/* - * END: Definitions for PCI Routing tables - */ - -#endif /* __ACTYPES_H__ */ diff --git a/reactos/drivers/bus/acpi/include/amlcode.h b/reactos/drivers/bus/acpi/include/amlcode.h deleted file mode 100644 index 917722d897d..00000000000 --- a/reactos/drivers/bus/acpi/include/amlcode.h +++ /dev/null @@ -1,420 +0,0 @@ -/****************************************************************************** - * - * Name: amlcode.h - Definitions for AML, as included in "definition blocks" - * Declarations and definitions contained herein are derived - * directly from the ACPI specification. - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __AMLCODE_H__ -#define __AMLCODE_H__ - - -/* primary opcodes */ - -#define AML_NULL_CHAR (u16) 0x00 - -#define AML_ZERO_OP (u16) 0x00 -#define AML_ONE_OP (u16) 0x01 -#define AML_UNASSIGNED (u16) 0x02 -#define AML_ALIAS_OP (u16) 0x06 -#define AML_NAME_OP (u16) 0x08 -#define AML_BYTE_OP (u16) 0x0a -#define AML_WORD_OP (u16) 0x0b -#define AML_DWORD_OP (u16) 0x0c -#define AML_STRING_OP (u16) 0x0d -#define AML_QWORD_OP (u16) 0x0e /* ACPI 2.0 */ -#define AML_SCOPE_OP (u16) 0x10 -#define AML_BUFFER_OP (u16) 0x11 -#define AML_PACKAGE_OP (u16) 0x12 -#define AML_VAR_PACKAGE_OP (u16) 0x13 /* ACPI 2.0 */ -#define AML_METHOD_OP (u16) 0x14 -#define AML_DUAL_NAME_PREFIX (u16) 0x2e -#define AML_MULTI_NAME_PREFIX_OP (u16) 0x2f -#define AML_NAME_CHAR_SUBSEQ (u16) 0x30 -#define AML_NAME_CHAR_FIRST (u16) 0x41 -#define AML_OP_PREFIX (u16) 0x5b -#define AML_ROOT_PREFIX (u16) 0x5c -#define AML_PARENT_PREFIX (u16) 0x5e -#define AML_LOCAL_OP (u16) 0x60 -#define AML_LOCAL0 (u16) 0x60 -#define AML_LOCAL1 (u16) 0x61 -#define AML_LOCAL2 (u16) 0x62 -#define AML_LOCAL3 (u16) 0x63 -#define AML_LOCAL4 (u16) 0x64 -#define AML_LOCAL5 (u16) 0x65 -#define AML_LOCAL6 (u16) 0x66 -#define AML_LOCAL7 (u16) 0x67 -#define AML_ARG_OP (u16) 0x68 -#define AML_ARG0 (u16) 0x68 -#define AML_ARG1 (u16) 0x69 -#define AML_ARG2 (u16) 0x6a -#define AML_ARG3 (u16) 0x6b -#define AML_ARG4 (u16) 0x6c -#define AML_ARG5 (u16) 0x6d -#define AML_ARG6 (u16) 0x6e -#define AML_STORE_OP (u16) 0x70 -#define AML_REF_OF_OP (u16) 0x71 -#define AML_ADD_OP (u16) 0x72 -#define AML_CONCAT_OP (u16) 0x73 -#define AML_SUBTRACT_OP (u16) 0x74 -#define AML_INCREMENT_OP (u16) 0x75 -#define AML_DECREMENT_OP (u16) 0x76 -#define AML_MULTIPLY_OP (u16) 0x77 -#define AML_DIVIDE_OP (u16) 0x78 -#define AML_SHIFT_LEFT_OP (u16) 0x79 -#define AML_SHIFT_RIGHT_OP (u16) 0x7a -#define AML_BIT_AND_OP (u16) 0x7b -#define AML_BIT_NAND_OP (u16) 0x7c -#define AML_BIT_OR_OP (u16) 0x7d -#define AML_BIT_NOR_OP (u16) 0x7e -#define AML_BIT_XOR_OP (u16) 0x7f -#define AML_BIT_NOT_OP (u16) 0x80 -#define AML_FIND_SET_LEFT_BIT_OP (u16) 0x81 -#define AML_FIND_SET_RIGHT_BIT_OP (u16) 0x82 -#define AML_DEREF_OF_OP (u16) 0x83 -#define AML_CONCAT_RES_OP (u16) 0x84 /* ACPI 2.0 */ -#define AML_MOD_OP (u16) 0x85 /* ACPI 2.0 */ -#define AML_NOTIFY_OP (u16) 0x86 -#define AML_SIZE_OF_OP (u16) 0x87 -#define AML_INDEX_OP (u16) 0x88 -#define AML_MATCH_OP (u16) 0x89 -#define AML_DWORD_FIELD_OP (u16) 0x8a -#define AML_WORD_FIELD_OP (u16) 0x8b -#define AML_BYTE_FIELD_OP (u16) 0x8c -#define AML_BIT_FIELD_OP (u16) 0x8d -#define AML_TYPE_OP (u16) 0x8e -#define AML_QWORD_FIELD_OP (u16) 0x8f /* ACPI 2.0 */ -#define AML_LAND_OP (u16) 0x90 -#define AML_LOR_OP (u16) 0x91 -#define AML_LNOT_OP (u16) 0x92 -#define AML_LEQUAL_OP (u16) 0x93 -#define AML_LGREATER_OP (u16) 0x94 -#define AML_LLESS_OP (u16) 0x95 -#define AML_TO_BUFFER_OP (u16) 0x96 /* ACPI 2.0 */ -#define AML_TO_DECSTRING_OP (u16) 0x97 /* ACPI 2.0 */ -#define AML_TO_HEXSTRING_OP (u16) 0x98 /* ACPI 2.0 */ -#define AML_TO_INTEGER_OP (u16) 0x99 /* ACPI 2.0 */ -#define AML_TO_STRING_OP (u16) 0x9c /* ACPI 2.0 */ -#define AML_COPY_OP (u16) 0x9d /* ACPI 2.0 */ -#define AML_MID_OP (u16) 0x9e /* ACPI 2.0 */ -#define AML_CONTINUE_OP (u16) 0x9f /* ACPI 2.0 */ -#define AML_IF_OP (u16) 0xa0 -#define AML_ELSE_OP (u16) 0xa1 -#define AML_WHILE_OP (u16) 0xa2 -#define AML_NOOP_OP (u16) 0xa3 -#define AML_RETURN_OP (u16) 0xa4 -#define AML_BREAK_OP (u16) 0xa5 -#define AML_BREAK_POINT_OP (u16) 0xcc -#define AML_ONES_OP (u16) 0xff - -/* prefixed opcodes */ - -#define AML_EXTOP (u16) 0x005b - - -#define AML_MUTEX_OP (u16) 0x5b01 -#define AML_EVENT_OP (u16) 0x5b02 -#define AML_SHIFT_RIGHT_BIT_OP (u16) 0x5b10 -#define AML_SHIFT_LEFT_BIT_OP (u16) 0x5b11 -#define AML_COND_REF_OF_OP (u16) 0x5b12 -#define AML_CREATE_FIELD_OP (u16) 0x5b13 -#define AML_LOAD_TABLE_OP (u16) 0x5b1f /* ACPI 2.0 */ -#define AML_LOAD_OP (u16) 0x5b20 -#define AML_STALL_OP (u16) 0x5b21 -#define AML_SLEEP_OP (u16) 0x5b22 -#define AML_ACQUIRE_OP (u16) 0x5b23 -#define AML_SIGNAL_OP (u16) 0x5b24 -#define AML_WAIT_OP (u16) 0x5b25 -#define AML_RESET_OP (u16) 0x5b26 -#define AML_RELEASE_OP (u16) 0x5b27 -#define AML_FROM_BCD_OP (u16) 0x5b28 -#define AML_TO_BCD_OP (u16) 0x5b29 -#define AML_UNLOAD_OP (u16) 0x5b2a -#define AML_REVISION_OP (u16) 0x5b30 -#define AML_DEBUG_OP (u16) 0x5b31 -#define AML_FATAL_OP (u16) 0x5b32 -#define AML_REGION_OP (u16) 0x5b80 -#define AML_DEF_FIELD_OP (u16) 0x5b81 -#define AML_DEVICE_OP (u16) 0x5b82 -#define AML_PROCESSOR_OP (u16) 0x5b83 -#define AML_POWER_RES_OP (u16) 0x5b84 -#define AML_THERMAL_ZONE_OP (u16) 0x5b85 -#define AML_INDEX_FIELD_OP (u16) 0x5b86 -#define AML_BANK_FIELD_OP (u16) 0x5b87 -#define AML_DATA_REGION_OP (u16) 0x5b88 /* ACPI 2.0 */ - - -/* Bogus opcodes (they are actually two separate opcodes) */ - -#define AML_LGREATEREQUAL_OP (u16) 0x9295 -#define AML_LLESSEQUAL_OP (u16) 0x9294 -#define AML_LNOTEQUAL_OP (u16) 0x9293 - - -/* - * Internal opcodes - * Use only "Unknown" AML opcodes, don't attempt to use - * any valid ACPI ASCII values (A-Z, 0-9, '-') - */ - -#define AML_NAMEPATH_OP (u16) 0x002d -#define AML_NAMEDFIELD_OP (u16) 0x0030 -#define AML_RESERVEDFIELD_OP (u16) 0x0031 -#define AML_ACCESSFIELD_OP (u16) 0x0032 -#define AML_BYTELIST_OP (u16) 0x0033 -#define AML_STATICSTRING_OP (u16) 0x0034 -#define AML_METHODCALL_OP (u16) 0x0035 -#define AML_RETURN_VALUE_OP (u16) 0x0036 - - -#define ARG_NONE 0x0 - -/* - * Argument types for the AML Parser - * Each field in the Arg_types u32 is 5 bits, allowing for a maximum of 6 arguments. - * There can be up to 31 unique argument types - */ - -#define ARGP_BYTEDATA 0x01 -#define ARGP_BYTELIST 0x02 -#define ARGP_CHARLIST 0x03 -#define ARGP_DATAOBJ 0x04 -#define ARGP_DATAOBJLIST 0x05 -#define ARGP_DWORDDATA 0x06 -#define ARGP_FIELDLIST 0x07 -#define ARGP_NAME 0x08 -#define ARGP_NAMESTRING 0x09 -#define ARGP_OBJLIST 0x0A -#define ARGP_PKGLENGTH 0x0B -#define ARGP_SUPERNAME 0x0C -#define ARGP_TARGET 0x0D -#define ARGP_TERMARG 0x0E -#define ARGP_TERMLIST 0x0F -#define ARGP_WORDDATA 0x10 -#define ARGP_QWORDDATA 0x11 -#define ARGP_SIMPLENAME 0x12 - -/* - * Resolved argument types for the AML Interpreter - * Each field in the Arg_types u32 is 5 bits, allowing for a maximum of 6 arguments. - * There can be up to 31 unique argument types (0 is end-of-arg-list indicator) - */ - -/* "Standard" ACPI types are 1-15 (0x0F) */ - -#define ARGI_INTEGER ACPI_TYPE_INTEGER /* 1 */ -#define ARGI_STRING ACPI_TYPE_STRING /* 2 */ -#define ARGI_BUFFER ACPI_TYPE_BUFFER /* 3 */ -#define ARGI_PACKAGE ACPI_TYPE_PACKAGE /* 4 */ -#define ARGI_EVENT ACPI_TYPE_EVENT -#define ARGI_MUTEX ACPI_TYPE_MUTEX -#define ARGI_REGION ACPI_TYPE_REGION -#define ARGI_DDBHANDLE ACPI_TYPE_DDB_HANDLE - -/* Custom types are 0x10 through 0x1F */ - -#define ARGI_IF 0x10 -#define ARGI_ANYOBJECT 0x11 -#define ARGI_ANYTYPE 0x12 -#define ARGI_COMPUTEDATA 0x13 /* Buffer, String, or Integer */ -#define ARGI_DATAOBJECT 0x14 /* Buffer, string, package or reference to a Node - Used only by Size_of operator*/ -#define ARGI_COMPLEXOBJ 0x15 /* Buffer or package */ -#define ARGI_INTEGER_REF 0x16 -#define ARGI_OBJECT_REF 0x17 -#define ARGI_DEVICE_REF 0x18 -#define ARGI_REFERENCE 0x19 -#define ARGI_TARGETREF 0x1A /* Target, subject to implicit conversion */ -#define ARGI_FIXED_TARGET 0x1B /* Target, no implicit conversion */ -#define ARGI_SIMPLE_TARGET 0x1C /* Name, Local, Arg -- no implicit conversion */ -#define ARGI_BUFFERSTRING 0x1D - -#define ARGI_INVALID_OPCODE 0xFFFFFFFF - - -/* - * hash offsets - */ -#define AML_EXTOP_HASH_OFFSET 22 -#define AML_LNOT_HASH_OFFSET 19 - - -/* - * opcode groups and types - */ - -#define OPGRP_NAMED 0x01 -#define OPGRP_FIELD 0x02 -#define OPGRP_BYTELIST 0x04 - -#define OPTYPE_UNDEFINED 0 - - -#define OPTYPE_LITERAL 1 -#define OPTYPE_CONSTANT 2 -#define OPTYPE_METHOD_ARGUMENT 3 -#define OPTYPE_LOCAL_VARIABLE 4 -#define OPTYPE_DATA_TERM 5 - -/* Type 1 opcodes */ - -#define OPTYPE_MONADIC1 6 -#define OPTYPE_DYADIC1 7 - - -/* Type 2 opcodes */ - -#define OPTYPE_MONADIC2 8 -#define OPTYPE_MONADIC2_r 9 -#define OPTYPE_DYADIC2 10 -#define OPTYPE_DYADIC2_r 11 -#define OPTYPE_DYADIC2_s 12 -#define OPTYPE_INDEX 13 -#define OPTYPE_MATCH 14 - -/* Generic for an op that returns a value */ - -#define OPTYPE_METHOD_CALL 15 - - -/* Misc */ - -#define OPTYPE_CREATE_FIELD 16 -#define OPTYPE_FATAL 17 -#define OPTYPE_CONTROL 18 -#define OPTYPE_RECONFIGURATION 19 -#define OPTYPE_NAMED_OBJECT 20 -#define OPTYPE_RETURN 21 - -#define OPTYPE_BOGUS 22 - - -/* Predefined Operation Region Space_iDs */ - -typedef enum -{ - REGION_MEMORY = 0, - REGION_IO, - REGION_PCI_CONFIG, - REGION_EC, - REGION_SMBUS, - REGION_CMOS, - REGION_PCI_BAR - -} AML_REGION_TYPES; - - -/* Comparison operation codes for Match_op operator */ - -typedef enum -{ - MATCH_MTR = 0, - MATCH_MEQ = 1, - MATCH_MLE = 2, - MATCH_MLT = 3, - MATCH_MGE = 4, - MATCH_MGT = 5 - -} AML_MATCH_OPERATOR; - -#define MAX_MATCH_OPERATOR 5 - - -/* Field Access Types */ - -#define ACCESS_TYPE_MASK 0x0f -#define ACCESS_TYPE_SHIFT 0 - -typedef enum -{ - ACCESS_ANY_ACC = 0, - ACCESS_BYTE_ACC = 1, - ACCESS_WORD_ACC = 2, - ACCESS_DWORD_ACC = 3, - ACCESS_BLOCK_ACC = 4, - ACCESS_SMBSEND_RECV_ACC = 5, - ACCESS_SMBQUICK_ACC = 6 - -} AML_ACCESS_TYPE; - - -/* Field Lock Rules */ - -#define LOCK_RULE_MASK 0x10 -#define LOCK_RULE_SHIFT 4 - -typedef enum -{ - GLOCK_NEVER_LOCK = 0, - GLOCK_ALWAYS_LOCK = 1 - -} AML_LOCK_RULE; - - -/* Field Update Rules */ - -#define UPDATE_RULE_MASK 0x060 -#define UPDATE_RULE_SHIFT 5 - -typedef enum -{ - UPDATE_PRESERVE = 0, - UPDATE_WRITE_AS_ONES = 1, - UPDATE_WRITE_AS_ZEROS = 2 - -} AML_UPDATE_RULE; - - -/* bit fields in Method_flags byte */ - -#define METHOD_FLAGS_ARG_COUNT 0x07 -#define METHOD_FLAGS_SERIALIZED 0x08 -#define METHOD_FLAGS_SYNCH_LEVEL 0xF0 - - -/* Array sizes. Used for range checking also */ - -#define NUM_REGION_TYPES 7 -#define NUM_ACCESS_TYPES 7 -#define NUM_UPDATE_RULES 3 -#define NUM_MATCH_OPS 7 -#define NUM_OPCODES 256 -#define NUM_FIELD_NAMES 2 - - -#define USER_REGION_BEGIN 0x80 - -/* - * AML tables - */ - -#ifdef DEFINE_AML_GLOBALS - -/* External declarations of the AML tables */ - -extern u8 acpi_gbl_aml [NUM_OPCODES]; -extern u16 acpi_gbl_pfx [NUM_OPCODES]; - - -#endif /* DEFINE_AML_GLOBALS */ - -#endif /* __AMLCODE_H__ */ diff --git a/reactos/drivers/bus/acpi/include/platform/acenv.h b/reactos/drivers/bus/acpi/include/platform/acenv.h deleted file mode 100644 index 9679222de8d..00000000000 --- a/reactos/drivers/bus/acpi/include/platform/acenv.h +++ /dev/null @@ -1,288 +0,0 @@ -/****************************************************************************** - * - * Name: acenv.h - Generation environment specific items - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACENV_H__ -#define __ACENV_H__ - - -/* - * Configuration for ACPI tools and utilities - */ - -#ifdef _ACPI_DUMP_APP -#define ACPI_DEBUG -#define ACPI_APPLICATION -#define ENABLE_DEBUGGER -#define ACPI_USE_SYSTEM_CLIBRARY -#define PARSER_ONLY -#endif - -#ifdef _ACPI_EXEC_APP -#undef DEBUGGER_THREADING -#define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED -#define ACPI_DEBUG -#define ACPI_APPLICATION -#define ENABLE_DEBUGGER -#define ACPI_USE_SYSTEM_CLIBRARY -#endif - -#ifdef _ACPI_ASL_COMPILER -#define ACPI_DEBUG -#define ACPI_APPLICATION -#define ENABLE_DEBUGGER -#define ACPI_USE_SYSTEM_CLIBRARY -#endif - -/* - * Memory allocation tracking. Used only if - * 1) This is the debug version - * 2) This is NOT a 16-bit version of the code (not enough real-mode memory) - */ -#ifdef ACPI_DEBUG -#ifndef _IA16 -#define ACPI_DEBUG_TRACK_ALLOCATIONS -#endif -#endif - -/* - * Environment configuration. The purpose of this file is to interface to the - * local generation environment. - * - * 1) ACPI_USE_SYSTEM_CLIBRARY - Define this if linking to an actual C library. - * Otherwise, local versions of string/memory functions will be used. - * 2) ACPI_USE_STANDARD_HEADERS - Define this if linking to a C library and - * the standard header files may be used. - * - * The ACPI subsystem only uses low level C library functions that do not call - * operating system services and may therefore be inlined in the code. - * - * It may be necessary to tailor these include files to the target - * generation environment. - * - * - * Functions and constants used from each header: - * - * string.h: memcpy - * memset - * strcat - * strcmp - * strcpy - * strlen - * strncmp - * strncat - * strncpy - * - * stdlib.h: strtoul - * - * stdarg.h: va_list - * va_arg - * va_start - * va_end - * - */ - -/*! [Begin] no source code translation */ - -#ifdef _LINUX -#include "aclinux.h" - -#elif _AED_EFI -#include "acefi.h" - -#elif WIN32 -#include "acwin.h" - -#elif __FreeBSD__ -#include "acfreebsd.h" - -#else - -/* All other environments */ - -#define ACPI_USE_STANDARD_HEADERS - -/* Name of host operating system (returned by the _OS_ namespace object) */ - -#define ACPI_OS_NAME "Intel ACPI/CA Core Subsystem" - -#endif - - -/*! [End] no source code translation !*/ - -/****************************************************************************** - * - * C library configuration - * - *****************************************************************************/ - -#ifdef ACPI_USE_SYSTEM_CLIBRARY -/* - * Use the standard C library headers. - * We want to keep these to a minimum. - * - */ - -#ifdef ACPI_USE_STANDARD_HEADERS -/* - * Use the standard headers from the standard locations - */ -#include -#include -#include -#include - -#endif /* ACPI_USE_STANDARD_HEADERS */ - -/* - * We will be linking to the standard Clib functions - */ - -#define STRSTR(s1,s2) strstr((s1), (s2)) -#define STRUPR(s) strupr((s)) -#define STRLEN(s) (u32) strlen((s)) -#define STRCPY(d,s) strcpy((d), (s)) -#define STRNCPY(d,s,n) strncpy((d), (s), (NATIVE_INT)(n)) -#define STRNCMP(d,s,n) strncmp((d), (s), (NATIVE_INT)(n)) -#define STRCMP(d,s) strcmp((d), (s)) -#define STRCAT(d,s) strcat((d), (s)) -#define STRNCAT(d,s,n) strncat((d), (s), (NATIVE_INT)(n)) -#define STRTOUL(d,s,n) strtoul((d), (s), (NATIVE_INT)(n)) -#define MEMCPY(d,s,n) memcpy((d), (s), (NATIVE_INT)(n)) -#define MEMSET(d,s,n) memset((d), (s), (NATIVE_INT)(n)) -#define TOUPPER toupper -#define TOLOWER tolower -#define IS_XDIGIT isxdigit - -/****************************************************************************** - * - * Not using native C library, use local implementations - * - *****************************************************************************/ -#else - -/* - * Use local definitions of C library macros and functions - * NOTE: The function implementations may not be as efficient - * as an inline or assembly code implementation provided by a - * native C library. - */ - -#ifndef va_arg - -#ifndef _VALIST -#define _VALIST -typedef char *va_list; -#endif /* _VALIST */ - -/* - * Storage alignment properties - */ - -#define _AUPBND (sizeof (NATIVE_INT) - 1) -#define _ADNBND (sizeof (NATIVE_INT) - 1) - -/* - * Variable argument list macro definitions - */ - -#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd))) -#define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND)))) -#define va_end(ap) (void) 0 -#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND)))) - -#endif /* va_arg */ - - -#define STRSTR(s1,s2) acpi_cm_strstr ((s1), (s2)) -#define STRUPR(s) acpi_cm_strupr ((s)) -#define STRLEN(s) acpi_cm_strlen ((s)) -#define STRCPY(d,s) acpi_cm_strcpy ((d), (s)) -#define STRNCPY(d,s,n) acpi_cm_strncpy ((d), (s), (n)) -#define STRNCMP(d,s,n) acpi_cm_strncmp ((d), (s), (n)) -#define STRCMP(d,s) acpi_cm_strcmp ((d), (s)) -#define STRCAT(d,s) acpi_cm_strcat ((d), (s)) -#define STRNCAT(d,s,n) acpi_cm_strncat ((d), (s), (n)) -#define STRTOUL(d,s,n) acpi_cm_strtoul ((d), (s),(n)) -#define MEMCPY(d,s,n) acpi_cm_memcpy ((d), (s), (n)) -#define MEMSET(d,v,n) acpi_cm_memset ((d), (v), (n)) -#define TOUPPER acpi_cm_to_upper -#define TOLOWER acpi_cm_to_lower - -#endif /* ACPI_USE_SYSTEM_CLIBRARY */ - - -/****************************************************************************** - * - * Assembly code macros - * - *****************************************************************************/ - -/* - * Handle platform- and compiler-specific assembly language differences. - * These should already have been defined by the platform includes above. - * - * Notes: - * 1) Interrupt 3 is used to break into a debugger - * 2) Interrupts are turned off during ACPI register setup - */ - -/* Unrecognized compiler, use defaults */ -#ifndef ACPI_ASM_MACROS - -#define ACPI_ASM_MACROS -#define causeinterrupt(level) -#define BREAKPOINT3 -#define disable() -#define enable() -#define halt() -#define ACPI_ACQUIRE_GLOBAL_LOCK(Glptr, acq) -#define ACPI_RELEASE_GLOBAL_LOCK(Glptr, acq) - -#endif /* ACPI_ASM_MACROS */ - - -#ifdef ACPI_APPLICATION - -/* Don't want software interrupts within a ring3 application */ - -#undef causeinterrupt -#undef BREAKPOINT3 -#define causeinterrupt(level) -#define BREAKPOINT3 -#endif - - -/****************************************************************************** - * - * Compiler-specific - * - *****************************************************************************/ - -/* this has been moved to compiler-specific headers, which are included from the - platform header. */ - - -#endif /* __ACENV_H__ */ diff --git a/reactos/drivers/bus/acpi/include/platform/acgcc.h b/reactos/drivers/bus/acpi/include/platform/acgcc.h deleted file mode 100644 index bf8f5073348..00000000000 --- a/reactos/drivers/bus/acpi/include/platform/acgcc.h +++ /dev/null @@ -1,189 +0,0 @@ -/****************************************************************************** - * - * Name: acgcc.h - GCC specific defines, etc. - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACGCC_H__ -#define __ACGCC_H__ - - -#ifdef __ia64__ -#define _IA64 - -#define COMPILER_DEPENDENT_UINT64 unsigned long -/* Single threaded */ -#define ACPI_APPLICATION - -#define ACPI_ASM_MACROS -#define causeinterrupt(level) -#define BREAKPOINT3 -#define disable() __cli() -#define enable() __sti() -#define wbinvd() - -/*! [Begin] no source code translation */ - -#include - -#define halt() ia64_pal_halt_light() /* PAL_HALT[_LIGHT] */ -#define safe_halt() ia64_pal_halt(1) /* PAL_HALT */ - - -#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \ - do { \ - __asm__ volatile ("1: ld4 r29=%1\n" \ - ";;\n" \ - "mov ar.ccv=r29\n" \ - "mov r2=r29\n" \ - "shr.u r30=r29,1\n" \ - "and r29=-4,r29\n" \ - ";;\n" \ - "add r29=2,r29\n" \ - "and r30=1,r30\n" \ - ";;\n" \ - "add r29=r29,r30\n" \ - ";;\n" \ - "cmpxchg4.acq r30=%1,r29,ar.ccv\n" \ - ";;\n" \ - "cmp.eq p6,p7=r2,r30\n" \ - "(p7) br.dpnt.few 1b\n" \ - "cmp.gt p8,p9=3,r29\n" \ - ";;\n" \ - "(p8) mov %0=-1\n" \ - "(p9) mov %0=r0\n" \ - :"=r"(Acq):"m"(GLptr):"r2","r29","r30","memory"); \ - } while (0) - -#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \ - do { \ - __asm__ volatile ("1: ld4 r29=%1\n" \ - ";;\n" \ - "mov ar.ccv=r29\n" \ - "mov r2=r29\n" \ - "and r29=-4,r29\n" \ - ";;\n" \ - "cmpxchg4.acq r30=%1,r29,ar.ccv\n" \ - ";;\n" \ - "cmp.eq p6,p7=r2,r30\n" \ - "(p7) br.dpnt.few 1b\n" \ - "and %0=1,r2\n" \ - ";;\n" \ - :"=r"(Acq):"m"(GLptr):"r2","r29","r30","memory"); \ - } while (0) -/*! [End] no source code translation !*/ - -#elif defined (_AMD64_) - -#define COMPILER_DEPENDENT_UINT64 unsigned long long -#define ACPI_ASM_MACROS -#define causeinterrupt(level) -#define BREAKPOINT3 -#define disable() __cli() -#define enable() __sti() -#define halt() __asm__ __volatile__ ("sti; hlt":::"memory") -#define wbinvd() - -/*! [Begin] no source code translation - * - * A brief explanation as GNU inline assembly is a bit hairy - * %0 is the output parameter in EAX ("=a") - * %1 and %2 are the input parameters in ECX ("c") - * and an immediate value ("i") respectively - * All actual register references are preceded with "%%" as in "%%edx" - * Immediate values in the assembly are preceded by "$" as in "$0x1" - * The final asm parameter are the operation altered non-output registers. - */ - -// FIXME: These are only sonly stubs to make it compile - -#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \ - do { \ - int dummy; \ - asm("1: movl (%1),%%eax;" \ - "movl %%eax,%%edx;" \ - :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~1L):"dx"); \ - } while(0) - -#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \ - do { \ - int dummy; \ - asm("1: movl (%1),%%eax;" \ - "movl %%eax,%%edx;" \ - :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~3L):"dx"); \ - } while(0) - -/*! [End] no source code translation !*/ - -#else /* DO IA32 */ - -#define COMPILER_DEPENDENT_UINT64 unsigned long long -#define ACPI_ASM_MACROS -#define causeinterrupt(level) -#define BREAKPOINT3 -#define disable() __cli() -#define enable() __sti() -#define halt() __asm__ __volatile__ ("sti; hlt":::"memory") -#define wbinvd() - -/*! [Begin] no source code translation - * - * A brief explanation as GNU inline assembly is a bit hairy - * %0 is the output parameter in EAX ("=a") - * %1 and %2 are the input parameters in ECX ("c") - * and an immediate value ("i") respectively - * All actual register references are preceded with "%%" as in "%%edx" - * Immediate values in the assembly are preceded by "$" as in "$0x1" - * The final asm parameter are the operation altered non-output registers. - */ -#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \ - do { \ - int dummy; \ - asm("1: movl (%1),%%eax;" \ - "movl %%eax,%%edx;" \ - "andl %2,%%edx;" \ - "btsl $0x1,%%edx;" \ - "adcl $0x0,%%edx;" \ - "lock; cmpxchgl %%edx,(%1);" \ - "jnz 1b;" \ - "cmpb $0x3,%%dl;" \ - "sbbl %%eax,%%eax" \ - :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~1L):"dx"); \ - } while(0) - -#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \ - do { \ - int dummy; \ - asm("1: movl (%1),%%eax;" \ - "movl %%eax,%%edx;" \ - "andl %2,%%edx;" \ - "lock; cmpxchgl %%edx,(%1);" \ - "jnz 1b;" \ - "andl $0x1,%%eax" \ - :"=a"(Acq),"=c"(dummy):"c"(GLptr),"i"(~3L):"dx"); \ - } while(0) - -/*! [End] no source code translation !*/ - -#endif /* IA 32 */ - -#endif /* __ACGCC_H__ */ diff --git a/reactos/drivers/bus/acpi/include/platform/aclinux.h b/reactos/drivers/bus/acpi/include/platform/aclinux.h deleted file mode 100644 index 81a6775f714..00000000000 --- a/reactos/drivers/bus/acpi/include/platform/aclinux.h +++ /dev/null @@ -1,66 +0,0 @@ -/****************************************************************************** - * - * Name: aclinux.h - OS specific defines, etc. - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACLINUX_H__ -#define __ACLINUX_H__ - -#define ACPI_OS_NAME "Linux" - -#undef ACPI_USE_SYSTEM_CLIBRARY - -#ifdef __KERNEL__ - -#include -#include -#include -#include -#include -#include -#include - -#else - -#include - -#endif - -/* Linux uses GCC */ - -#include "acgcc.h" - -#undef DEBUGGER_THREADING -#define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED - -#ifndef _IA64 -/* Linux ia32 can't do int64 well */ -#define ACPI_NO_INTEGER64_SUPPORT -/* And the ia32 kernel doesn't include 64-bit divide support */ -#define ACPI_DIV64(dividend, divisor) do_div(dividend, divisor) -#else -#define ACPI_DIV64(dividend, divisor) ACPI_DIVIDE(dividend, divisor) -#endif - - -#endif /* __ACLINUX_H__ */ diff --git a/reactos/drivers/bus/acpi/include/platform/acmsc.h b/reactos/drivers/bus/acpi/include/platform/acmsc.h deleted file mode 100644 index 612edf938c2..00000000000 --- a/reactos/drivers/bus/acpi/include/platform/acmsc.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef __ACMSC_H__ -#define __ACMSC_H__ - -#define COMPILER_DEPENDENT_UINT64 unsigned __int64 - -#if defined(_M_IX86) - -#define ACPI_ASM_MACROS -#define causeinterrupt(level) -#define BREAKPOINT3 -#define halt() { __asm { sti } __asm { hlt } } -#define wbinvd() - -__forceinline void _ACPI_ACQUIRE_GLOBAL_LOCK(void * GLptr, unsigned char * Acq_) -{ - unsigned char Acq; - - __asm - { - mov ecx, [GLptr] - - L1: mov eax, [ecx] - mov edx, eax - and edx, ecx - bts edx, 1 - adc edx, 0 - lock cmpxchg [ecx], edx - jne L1 - cmp dl, 3 - sbb eax, eax - - mov [Acq], al - }; - - *Acq_ = Acq; -} - -#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq) \ - _ACPI_ACQUIRE_GLOBAL_LOCK((GLptr), (unsigned char *)&(Acq)) - -__forceinline void _ACPI_RELEASE_GLOBAL_LOCK(void * GLptr, unsigned char * Acq_) -{ - unsigned char Acq; - - __asm - { - mov ecx, [GLptr] - - L1: mov eax, [ecx] - mov edx, eax - and edx, ecx - lock cmpxchg [ecx], edx - jnz L1 - and eax, 1 - - mov [Acq], al - }; - - *Acq_ = Acq; -} - -#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq) \ - _ACPI_RELEASE_GLOBAL_LOCK((GLptr), (unsigned char *)&(Acq)) - -#endif - -#endif /* __ACMSC_H__ */ diff --git a/reactos/drivers/bus/acpi/include/platform/acwin.h b/reactos/drivers/bus/acpi/include/platform/acwin.h deleted file mode 100644 index cfab7728f6f..00000000000 --- a/reactos/drivers/bus/acpi/include/platform/acwin.h +++ /dev/null @@ -1,82 +0,0 @@ -/****************************************************************************** - * - * Name: aclinux.h - OS specific defines, etc. - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __ACWIN_H__ -#define __ACWIN_H__ - -#define ACPI_OS_NAME "ReactOS" -#define DEFINE_ALTERNATE_TYPES - -#undef ACPI_USE_SYSTEM_CLIBRARY - -#ifdef __KERNEL__ - -#include -#include -#include -#include -#include -#include -#include - -#else - -#include - -#endif - -#if defined(__GNUC__) - -#include "acgcc.h" - -#undef disable -#define disable() __asm__("cli\n\t") -#undef enable -#define enable() __asm__("sti\n\t") - -#elif defined(_MSC_VER) - -#include "acmsc.h" - -#undef disable -#define disable() __asm { cli } -#undef enable -#define enable() __asm { sti } - -#endif - -#undef DEBUGGER_THREADING -#define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED - -#ifndef _IA64 -/* Linux ia32 can't do int64 well */ -#define ACPI_NO_INTEGER64_SUPPORT -/* And the ia32 kernel doesn't include 64-bit divide support */ -#define ACPI_DIV64(dividend, divisor) do_div(dividend, divisor) -#else -#define ACPI_DIV64(dividend, divisor) ACPI_DIVIDE(dividend, divisor) -#endif - -#endif /* __ACWIN_H__ */ diff --git a/reactos/drivers/bus/acpi/include/platform/types.h b/reactos/drivers/bus/acpi/include/platform/types.h deleted file mode 100644 index e823dda3bf8..00000000000 --- a/reactos/drivers/bus/acpi/include/platform/types.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: include/types.h - * PURPOSE: Types used by all the parts of the system - * PROGRAMMER: David Welch - * DEFINES: _WIN64: 64-bit architecture - * _WIN32: 32-bit architecture (default) - * UPDATE HISTORY: - * 27/06/00: Created - * 01/05/01: Portabillity changes - */ -#ifndef __INCLUDE_ACPI_TYPES_H -#define __INCLUDE_ACPI_TYPES_H - -#include -#include - -#endif /* __INCLUDE_ACPI_TYPES_H */ diff --git a/reactos/drivers/bus/acpi/namespace/nsaccess.c b/reactos/drivers/bus/acpi/namespace/nsaccess.c deleted file mode 100644 index 4da6b907bf7..00000000000 --- a/reactos/drivers/bus/acpi/namespace/nsaccess.c +++ /dev/null @@ -1,546 +0,0 @@ -/******************************************************************************* - * - * Module Name: nsaccess - Top-level functions for accessing ACPI namespace - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_NAMESPACE - MODULE_NAME ("nsaccess") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_root_initialize - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Allocate and initialize the default root named objects - * - * MUTEX: Locks namespace for entire execution - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_root_initialize (void) -{ - ACPI_STATUS status = AE_OK; - PREDEFINED_NAMES *init_val = NULL; - ACPI_NAMESPACE_NODE *new_node; - ACPI_OPERAND_OBJECT *obj_desc; - - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - /* - * The global root ptr is initially NULL, so a non-NULL value indicates - * that Acpi_ns_root_initialize() has already been called; just return. - */ - - if (acpi_gbl_root_node) { - status = AE_OK; - goto unlock_and_exit; - } - - - /* - * Tell the rest of the subsystem that the root is initialized - * (This is OK because the namespace is locked) - */ - - acpi_gbl_root_node = &acpi_gbl_root_node_struct; - - - /* Enter the pre-defined names in the name table */ - - for (init_val = acpi_gbl_pre_defined_names; init_val->name; init_val++) { - status = acpi_ns_lookup (NULL, init_val->name, - (OBJECT_TYPE_INTERNAL) init_val->type, - IMODE_LOAD_PASS2, NS_NO_UPSEARCH, - NULL, &new_node); - - - /* - * Name entered successfully. - * If entry in Pre_defined_names[] specifies an - * initial value, create the initial value. - */ - - if (init_val->val) { - /* - * Entry requests an initial value, allocate a - * descriptor for it. - */ - - obj_desc = acpi_cm_create_internal_object ( - (OBJECT_TYPE_INTERNAL) init_val->type); - - if (!obj_desc) { - status = AE_NO_MEMORY; - goto unlock_and_exit; - } - - /* - * Convert value string from table entry to - * internal representation. Only types actually - * used for initial values are implemented here. - */ - - switch (init_val->type) { - - case ACPI_TYPE_INTEGER: - - obj_desc->integer.value = - (ACPI_INTEGER) STRTOUL (init_val->val, NULL, 10); - break; - - - case ACPI_TYPE_STRING: - - obj_desc->string.length = STRLEN (init_val->val); - - /* - * Allocate a buffer for the string. All - * String.Pointers must be allocated buffers! - * (makes deletion simpler) - */ - obj_desc->string.pointer = acpi_cm_allocate ( - (obj_desc->string.length + 1)); - if (!obj_desc->string.pointer) { - acpi_cm_remove_reference (obj_desc); - status = AE_NO_MEMORY; - goto unlock_and_exit; - } - - STRCPY (obj_desc->string.pointer, init_val->val); - break; - - - case ACPI_TYPE_MUTEX: - - obj_desc->mutex.sync_level = - (u16) STRTOUL (init_val->val, NULL, 10); - - if (STRCMP (init_val->name, "_GL_") == 0) { - /* - * Create a counting semaphore for the - * global lock - */ - status = acpi_os_create_semaphore (ACPI_NO_UNIT_LIMIT, - 1, &obj_desc->mutex.semaphore); - - if (ACPI_FAILURE (status)) { - goto unlock_and_exit; - } - /* - * We just created the mutex for the - * global lock, save it - */ - - acpi_gbl_global_lock_semaphore = obj_desc->mutex.semaphore; - } - - else { - /* Create a mutex */ - - status = acpi_os_create_semaphore (1, 1, - &obj_desc->mutex.semaphore); - - if (ACPI_FAILURE (status)) { - goto unlock_and_exit; - } - } - break; - - - default: - REPORT_ERROR (("Unsupported initial type value %X\n", - init_val->type)); - acpi_cm_remove_reference (obj_desc); - obj_desc = NULL; - continue; - } - - /* Store pointer to value descriptor in the Node */ - - acpi_ns_attach_object (new_node, obj_desc, obj_desc->common.type); - } - } - - -unlock_and_exit: - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_lookup - * - * PARAMETERS: Prefix_node - Search scope if name is not fully qualified - * Pathname - Search pathname, in internal format - * (as represented in the AML stream) - * Type - Type associated with name - * Interpreter_mode - IMODE_LOAD_PASS2 => add name if not found - * Flags - Flags describing the search restrictions - * Walk_state - Current state of the walk - * Return_node - Where the Node is placed (if found - * or created successfully) - * - * RETURN: Status - * - * DESCRIPTION: Find or enter the passed name in the name space. - * Log an error if name not found in Exec mode. - * - * MUTEX: Assumes namespace is locked. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_lookup ( - ACPI_GENERIC_STATE *scope_info, - NATIVE_CHAR *pathname, - OBJECT_TYPE_INTERNAL type, - OPERATING_MODE interpreter_mode, - u32 flags, - ACPI_WALK_STATE *walk_state, - ACPI_NAMESPACE_NODE **return_node) -{ - ACPI_STATUS status; - ACPI_NAMESPACE_NODE *prefix_node; - ACPI_NAMESPACE_NODE *current_node = NULL; - ACPI_NAMESPACE_NODE *scope_to_push = NULL; - ACPI_NAMESPACE_NODE *this_node = NULL; - u32 num_segments; - ACPI_NAME simple_name; - u8 null_name_path = FALSE; - OBJECT_TYPE_INTERNAL type_to_check_for; - OBJECT_TYPE_INTERNAL this_search_type; - u32 local_flags = flags & ~NS_ERROR_IF_FOUND; - - - if (!return_node) { - return (AE_BAD_PARAMETER); - } - - - acpi_gbl_ns_lookup_count++; - - *return_node = ENTRY_NOT_FOUND; - - - if (!acpi_gbl_root_node) { - return (AE_NO_NAMESPACE); - } - - /* - * Get the prefix scope. - * A null scope means use the root scope - */ - - if ((!scope_info) || - (!scope_info->scope.node)) { - prefix_node = acpi_gbl_root_node; - } - else { - prefix_node = scope_info->scope.node; - } - - - /* - * This check is explicitly split provide relax the Type_to_check_for - * conditions for Bank_field_defn. Originally, both Bank_field_defn and - * Def_field_defn caused Type_to_check_for to be set to ACPI_TYPE_REGION, - * but the Bank_field_defn may also check for a Field definition as well - * as an Operation_region. - */ - - if (INTERNAL_TYPE_DEF_FIELD_DEFN == type) { - /* Def_field_defn defines fields in a Region */ - - type_to_check_for = ACPI_TYPE_REGION; - } - - else if (INTERNAL_TYPE_BANK_FIELD_DEFN == type) { - /* Bank_field_defn defines data fields in a Field Object */ - - type_to_check_for = ACPI_TYPE_ANY; - } - - else { - type_to_check_for = type; - } - - - /* TBD: [Restructure] - Move the pathname stuff into a new procedure */ - - /* Examine the name pointer */ - - if (!pathname) { - /* 8-12-98 ASL Grammar Update supports null Name_path */ - - null_name_path = TRUE; - num_segments = 0; - this_node = acpi_gbl_root_node; - - } - - else { - /* - * Valid name pointer (Internal name format) - * - * Check for prefixes. As represented in the AML stream, a - * Pathname consists of an optional scope prefix followed by - * a segment part. - * - * If present, the scope prefix is either a Root_prefix (in - * which case the name is fully qualified), or zero or more - * Parent_prefixes (in which case the name's scope is relative - * to the current scope). - * - * The segment part consists of either: - * - A single 4-byte name segment, or - * - A Dual_name_prefix followed by two 4-byte name segments, or - * - A Multi_name_prefix_op, followed by a byte indicating the - * number of segments and the segments themselves. - */ - - if (*pathname == AML_ROOT_PREFIX) { - /* Pathname is fully qualified, look in root name table */ - - current_node = acpi_gbl_root_node; - - /* point to segment part */ - - pathname++; - - /* Direct reference to root, "\" */ - - if (!(*pathname)) { - this_node = acpi_gbl_root_node; - goto check_for_new_scope_and_exit; - } - } - - else { - /* Pathname is relative to current scope, start there */ - - current_node = prefix_node; - - /* - * Handle up-prefix (carat). More than one prefix - * is supported - */ - - while (*pathname == AML_PARENT_PREFIX) { - /* Point to segment part or next Parent_prefix */ - - pathname++; - - /* Backup to the parent's scope */ - - this_node = acpi_ns_get_parent_object (current_node); - if (!this_node) { - /* Current scope has no parent scope */ - - REPORT_ERROR ( - ("Too many parent prefixes (^) - reached root\n")); - return (AE_NOT_FOUND); - } - - current_node = this_node; - } - } - - - /* - * Examine the name prefix opcode, if any, - * to determine the number of segments - */ - - if (*pathname == AML_DUAL_NAME_PREFIX) { - num_segments = 2; - - /* point to first segment */ - - pathname++; - - } - - else if (*pathname == AML_MULTI_NAME_PREFIX_OP) { - num_segments = (u32)* (u8 *) ++pathname; - - /* point to first segment */ - - pathname++; - - } - - else { - /* - * No Dual or Multi prefix, hence there is only one - * segment and Pathname is already pointing to it. - */ - num_segments = 1; - - } - - } - - - /* - * Search namespace for each segment of the name. - * Loop through and verify/add each name segment. - */ - - - while (num_segments-- && current_node) { - /* - * Search for the current name segment under the current - * named object. The Type is significant only at the last (topmost) - * level. (We don't care about the types along the path, only - * the type of the final target object.) - */ - this_search_type = ACPI_TYPE_ANY; - if (!num_segments) { - this_search_type = type; - local_flags = flags; - } - - /* Pluck one ACPI name from the front of the pathname */ - - MOVE_UNALIGNED32_TO_32 (&simple_name, pathname); - - /* Try to find the ACPI name */ - - status = acpi_ns_search_and_enter (simple_name, walk_state, - current_node, interpreter_mode, - this_search_type, local_flags, - &this_node); - - if (ACPI_FAILURE (status)) { - if (status == AE_NOT_FOUND) { - /* Name not found in ACPI namespace */ - - } - - return (status); - } - - - /* - * If 1) This is the last segment (Num_segments == 0) - * 2) and looking for a specific type - * (Not checking for TYPE_ANY) - * 3) Which is not an alias - * 4) which is not a local type (TYPE_DEF_ANY) - * 5) which is not a local type (TYPE_SCOPE) - * 6) which is not a local type (TYPE_INDEX_FIELD_DEFN) - * 7) and type of object is known (not TYPE_ANY) - * 8) and object does not match request - * - * Then we have a type mismatch. Just warn and ignore it. - */ - if ((num_segments == 0) && - (type_to_check_for != ACPI_TYPE_ANY) && - (type_to_check_for != INTERNAL_TYPE_ALIAS) && - (type_to_check_for != INTERNAL_TYPE_DEF_ANY) && - (type_to_check_for != INTERNAL_TYPE_SCOPE) && - (type_to_check_for != INTERNAL_TYPE_INDEX_FIELD_DEFN) && - (this_node->type != ACPI_TYPE_ANY) && - (this_node->type != type_to_check_for)) { - /* Complain about a type mismatch */ - - REPORT_WARNING ( - ("Ns_lookup: %4.4s, type %X, checking for type %X\n", - &simple_name, this_node->type, type_to_check_for)); - } - - /* - * If this is the last name segment and we are not looking for a - * specific type, but the type of found object is known, use that type - * to see if it opens a scope. - */ - - if ((0 == num_segments) && (ACPI_TYPE_ANY == type)) { - type = this_node->type; - } - - if ((num_segments || acpi_ns_opens_scope (type)) && - (this_node->child == NULL)) { - /* - * More segments or the type implies enclosed scope, - * and the next scope has not been allocated. - */ - - } - - current_node = this_node; - - /* point to next name segment */ - - pathname += ACPI_NAME_SIZE; - } - - - /* - * Always check if we need to open a new scope - */ - -check_for_new_scope_and_exit: - - if (!(flags & NS_DONT_OPEN_SCOPE) && (walk_state)) { - /* - * If entry is a type which opens a scope, - * push the new scope on the scope stack. - */ - - if (acpi_ns_opens_scope (type_to_check_for)) { - /* 8-12-98 ASL Grammar Update supports null Name_path */ - - if (null_name_path) { - /* TBD: [Investigate] - is this the correct thing to do? */ - - scope_to_push = NULL; - } - else { - scope_to_push = this_node; - } - - status = acpi_ds_scope_stack_push (scope_to_push, type, - walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - - } - } - - *return_node = this_node; - return (AE_OK); -} - diff --git a/reactos/drivers/bus/acpi/namespace/nsalloc.c b/reactos/drivers/bus/acpi/namespace/nsalloc.c deleted file mode 100644 index 00f79882669..00000000000 --- a/reactos/drivers/bus/acpi/namespace/nsalloc.c +++ /dev/null @@ -1,563 +0,0 @@ -/******************************************************************************* - * - * Module Name: nsalloc - Namespace allocation and deletion utilities - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_NAMESPACE - MODULE_NAME ("nsalloc") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_create_node - * - * PARAMETERS: - * - * RETURN: None - * - * DESCRIPTION: - * - ******************************************************************************/ - -ACPI_NAMESPACE_NODE * -acpi_ns_create_node ( - u32 acpi_name) -{ - ACPI_NAMESPACE_NODE *node; - - - node = acpi_cm_callocate (sizeof (ACPI_NAMESPACE_NODE)); - if (!node) { - return (NULL); - } - - INCREMENT_NAME_TABLE_METRICS (sizeof (ACPI_NAMESPACE_NODE)); - - node->data_type = ACPI_DESC_TYPE_NAMED; - node->name = acpi_name; - node->reference_count = 1; - - return (node); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_delete_node - * - * PARAMETERS: - * - * RETURN: None - * - * DESCRIPTION: - * - ******************************************************************************/ - -void -acpi_ns_delete_node ( - ACPI_NAMESPACE_NODE *node) -{ - ACPI_NAMESPACE_NODE *parent_node; - ACPI_NAMESPACE_NODE *prev_node; - ACPI_NAMESPACE_NODE *next_node; - - - parent_node = acpi_ns_get_parent_object (node); - - prev_node = NULL; - next_node = parent_node->child; - - while (next_node != node) { - prev_node = next_node; - next_node = prev_node->peer; - } - - if (prev_node) { - prev_node->peer = next_node->peer; - if (next_node->flags & ANOBJ_END_OF_PEER_LIST) { - prev_node->flags |= ANOBJ_END_OF_PEER_LIST; - } - } - else { - parent_node->child = next_node->peer; - } - - - DECREMENT_NAME_TABLE_METRICS (sizeof (ACPI_NAMESPACE_NODE)); - - /* - * Detach an object if there is one - */ - - if (node->object) { - acpi_ns_detach_object (node); - } - - acpi_cm_free (node); - - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_install_node - * - * PARAMETERS: Walk_state - Current state of the walk - * Parent_node - The parent of the new Node - * Node - The new Node to install - * Type - ACPI object type of the new Node - * - * RETURN: None - * - * DESCRIPTION: Initialize a new entry within a namespace table. - * - ******************************************************************************/ - -void -acpi_ns_install_node ( - ACPI_WALK_STATE *walk_state, - ACPI_NAMESPACE_NODE *parent_node, /* Parent */ - ACPI_NAMESPACE_NODE *node, /* New Child*/ - OBJECT_TYPE_INTERNAL type) -{ - u16 owner_id = TABLE_ID_DSDT; - ACPI_NAMESPACE_NODE *child_node; - - - /* - * Get the owner ID from the Walk state - * The owner ID is used to track table deletion and - * deletion of objects created by methods - */ - if (walk_state) { - owner_id = walk_state->owner_id; - } - - - /* link the new entry into the parent and existing children */ - - /* TBD: Could be first, last, or alphabetic */ - - child_node = parent_node->child; - if (!child_node) { - parent_node->child = node; - } - - else { - while (!(child_node->flags & ANOBJ_END_OF_PEER_LIST)) { - child_node = child_node->peer; - } - - child_node->peer = node; - - /* Clear end-of-list flag */ - - child_node->flags &= ~ANOBJ_END_OF_PEER_LIST; - } - - /* Init the new entry */ - - node->owner_id = owner_id; - node->flags |= ANOBJ_END_OF_PEER_LIST; - node->peer = parent_node; - - - /* - * If adding a name with unknown type, or having to - * add the region in order to define fields in it, we - * have a forward reference. - */ - - if ((ACPI_TYPE_ANY == type) || - (INTERNAL_TYPE_DEF_FIELD_DEFN == type) || - (INTERNAL_TYPE_BANK_FIELD_DEFN == type)) { - /* - * We don't want to abort here, however! - * We will fill in the actual type when the - * real definition is found later. - */ - - } - - /* - * The Def_field_defn and Bank_field_defn cases are actually - * looking up the Region in which the field will be defined - */ - - if ((INTERNAL_TYPE_DEF_FIELD_DEFN == type) || - (INTERNAL_TYPE_BANK_FIELD_DEFN == type)) { - type = ACPI_TYPE_REGION; - } - - /* - * Scope, Def_any, and Index_field_defn are bogus "types" which do - * not actually have anything to do with the type of the name - * being looked up. Save any other value of Type as the type of - * the entry. - */ - - if ((type != INTERNAL_TYPE_SCOPE) && - (type != INTERNAL_TYPE_DEF_ANY) && - (type != INTERNAL_TYPE_INDEX_FIELD_DEFN)) { - node->type = (u8) type; - } - - /* - * Increment the reference count(s) of all parents up to - * the root! - */ - - while ((node = acpi_ns_get_parent_object (node)) != NULL) { - node->reference_count++; - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_delete_children - * - * PARAMETERS: Parent_node - Delete this objects children - * - * RETURN: None. - * - * DESCRIPTION: Delete all children of the parent object. Deletes a - * "scope". - * - ******************************************************************************/ - -void -acpi_ns_delete_children ( - ACPI_NAMESPACE_NODE *parent_node) -{ - ACPI_NAMESPACE_NODE *child_node; - ACPI_NAMESPACE_NODE *next_node; - u8 flags; - - - if (!parent_node) { - return; - } - - /* If no children, all done! */ - - child_node = parent_node->child; - if (!child_node) { - return; - } - - /* - * Deallocate all children at this level - */ - do { - /* Get the things we need */ - - next_node = child_node->peer; - flags = child_node->flags; - - /* Grandchildren should have all been deleted already */ - - - /* Now we can free this child object */ - - DECREMENT_NAME_TABLE_METRICS (sizeof (ACPI_NAMESPACE_NODE)); - - /* - * Detach an object if there is one - */ - - if (child_node->object) { - acpi_ns_detach_object (child_node); - } - - acpi_cm_free (child_node); - - /* And move on to the next child in the list */ - - child_node = next_node; - - } while (!(flags & ANOBJ_END_OF_PEER_LIST)); - - - /* Clear the parent's child pointer */ - - parent_node->child = NULL; - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_delete_namespace_subtree - * - * PARAMETERS: None. - * - * RETURN: None. - * - * DESCRIPTION: Delete a subtree of the namespace. This includes all objects - * stored within the subtree. Scope tables are deleted also - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_delete_namespace_subtree ( - ACPI_NAMESPACE_NODE *parent_node) -{ - ACPI_NAMESPACE_NODE *child_node; - ACPI_OPERAND_OBJECT *obj_desc; - u32 level; - - - if (!parent_node) { - return (AE_OK); - } - - - child_node = 0; - level = 1; - - /* - * Traverse the tree of objects until we bubble back up - * to where we started. - */ - - while (level > 0) { - /* - * Get the next typed object in this scope. - * Null returned if not found - */ - - child_node = acpi_ns_get_next_object (ACPI_TYPE_ANY, parent_node, - child_node); - if (child_node) { - /* - * Found an object - delete the object within - * the Value field - */ - - obj_desc = acpi_ns_get_attached_object (child_node); - if (obj_desc) { - acpi_ns_detach_object (child_node); - acpi_cm_remove_reference (obj_desc); - } - - - /* Check if this object has any children */ - - if (acpi_ns_get_next_object (ACPI_TYPE_ANY, child_node, 0)) { - /* - * There is at least one child of this object, - * visit the object - */ - - level++; - parent_node = child_node; - child_node = 0; - } - } - - else { - /* - * No more children in this object. - * We will move up to the grandparent. - */ - level--; - - /* - * Now delete all of the children of this parent - * all at the same time. - */ - acpi_ns_delete_children (parent_node); - - /* New "last child" is this parent object */ - - child_node = parent_node; - - /* Now we can move up the tree to the grandparent */ - - parent_node = acpi_ns_get_parent_object (parent_node); - } - } - - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_remove_reference - * - * PARAMETERS: Node - Named object whose reference count is to be - * decremented - * - * RETURN: None. - * - * DESCRIPTION: Remove a Node reference. Decrements the reference count - * of all parent Nodes up to the root. Any object along - * the way that reaches zero references is freed. - * - ******************************************************************************/ - -static void -acpi_ns_remove_reference ( - ACPI_NAMESPACE_NODE *node) -{ - ACPI_NAMESPACE_NODE *next_node; - - - /* - * Decrement the reference count(s) of this object and all - * objects up to the root, Delete anything with zero remaining references. - */ - next_node = node; - while (next_node) { - /* Decrement the reference count on this object*/ - - next_node->reference_count--; - - /* Delete the object if no more references */ - - if (!next_node->reference_count) { - /* Delete all children and delete the object */ - - acpi_ns_delete_children (next_node); - acpi_ns_delete_node (next_node); - } - - /* Move up to parent */ - - next_node = acpi_ns_get_parent_object (next_node); - } -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_delete_namespace_by_owner - * - * PARAMETERS: None. - * - * RETURN: None. - * - * DESCRIPTION: Delete entries within the namespace that are owned by a - * specific ID. Used to delete entire ACPI tables. All - * reference counts are updated. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_delete_namespace_by_owner ( - u16 owner_id) -{ - ACPI_NAMESPACE_NODE *child_node; - u32 level; - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_NAMESPACE_NODE *parent_node; - - - parent_node = acpi_gbl_root_node; - child_node = 0; - level = 1; - - /* - * Traverse the tree of objects until we bubble back up - * to where we started. - */ - - while (level > 0) { - /* - * Get the next typed object in this scope. - * Null returned if not found - */ - - child_node = acpi_ns_get_next_object (ACPI_TYPE_ANY, parent_node, - child_node); - - if (child_node) { - if (child_node->owner_id == owner_id) { - /* - * Found an object - delete the object within - * the Value field - */ - - obj_desc = acpi_ns_get_attached_object (child_node); - if (obj_desc) { - acpi_ns_detach_object (child_node); - acpi_cm_remove_reference (obj_desc); - } - } - - /* Check if this object has any children */ - - if (acpi_ns_get_next_object (ACPI_TYPE_ANY, child_node, 0)) { - /* - * There is at least one child of this object, - * visit the object - */ - - level++; - parent_node = child_node; - child_node = 0; - } - - else if (child_node->owner_id == owner_id) { - acpi_ns_remove_reference (child_node); - } - } - - else { - /* - * No more children in this object. Move up to grandparent. - */ - level--; - - if (level != 0) { - if (parent_node->owner_id == owner_id) { - acpi_ns_remove_reference (parent_node); - } - } - - /* New "last child" is this parent object */ - - child_node = parent_node; - - /* Now we can move up the tree to the grandparent */ - - parent_node = acpi_ns_get_parent_object (parent_node); - } - } - - - return (AE_OK); -} - - diff --git a/reactos/drivers/bus/acpi/namespace/nseval.c b/reactos/drivers/bus/acpi/namespace/nseval.c deleted file mode 100644 index 63647e0d92e..00000000000 --- a/reactos/drivers/bus/acpi/namespace/nseval.c +++ /dev/null @@ -1,501 +0,0 @@ -/******************************************************************************* - * - * Module Name: nseval - Object evaluation interfaces -- includes control - * method lookup and execution. - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_NAMESPACE - MODULE_NAME ("nseval") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_evaluate_relative - * - * PARAMETERS: Handle - The relative containing object - * *Pathname - Name of method to execute, If NULL, the - * handle is the object to execute - * **Params - List of parameters to pass to the method, - * terminated by NULL. Params itself may be - * NULL if no parameters are being passed. - * *Return_object - Where to put method's return value (if - * any). If NULL, no value is returned. - * - * RETURN: Status - * - * DESCRIPTION: Find and execute the requested method using the handle as a - * scope - * - * MUTEX: Locks Namespace - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_evaluate_relative ( - ACPI_NAMESPACE_NODE *handle, - NATIVE_CHAR *pathname, - ACPI_OPERAND_OBJECT **params, - ACPI_OPERAND_OBJECT **return_object) -{ - ACPI_NAMESPACE_NODE *prefix_node; - ACPI_STATUS status; - ACPI_NAMESPACE_NODE *node = NULL; - NATIVE_CHAR *internal_path = NULL; - ACPI_GENERIC_STATE scope_info; - - - /* - * Must have a valid object handle - */ - if (!handle) { - return (AE_BAD_PARAMETER); - } - - /* Build an internal name string for the method */ - - status = acpi_ns_internalize_name (pathname, &internal_path); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Get the prefix handle and Node */ - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - prefix_node = acpi_ns_convert_handle_to_entry (handle); - if (!prefix_node) { - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - status = AE_BAD_PARAMETER; - goto cleanup; - } - - /* Lookup the name in the namespace */ - - scope_info.scope.node = prefix_node; - status = acpi_ns_lookup (&scope_info, internal_path, ACPI_TYPE_ANY, - IMODE_EXECUTE, NS_NO_UPSEARCH, NULL, - &node); - - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - /* - * Now that we have a handle to the object, we can attempt - * to evaluate it. - */ - - status = acpi_ns_evaluate_by_handle (node, params, return_object); - -cleanup: - - /* Cleanup */ - - acpi_cm_free (internal_path); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_evaluate_by_name - * - * PARAMETERS: Pathname - Fully qualified pathname to the object - * *Return_object - Where to put method's return value (if - * any). If NULL, no value is returned. - * **Params - List of parameters to pass to the method, - * terminated by NULL. Params itself may be - * NULL if no parameters are being passed. - * - * RETURN: Status - * - * DESCRIPTION: Find and execute the requested method passing the given - * parameters - * - * MUTEX: Locks Namespace - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_evaluate_by_name ( - NATIVE_CHAR *pathname, - ACPI_OPERAND_OBJECT **params, - ACPI_OPERAND_OBJECT **return_object) -{ - ACPI_STATUS status; - ACPI_NAMESPACE_NODE *node = NULL; - NATIVE_CHAR *internal_path = NULL; - - - /* Build an internal name string for the method */ - - status = acpi_ns_internalize_name (pathname, &internal_path); - if (ACPI_FAILURE (status)) { - return (status); - } - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - /* Lookup the name in the namespace */ - - status = acpi_ns_lookup (NULL, internal_path, ACPI_TYPE_ANY, - IMODE_EXECUTE, NS_NO_UPSEARCH, NULL, - &node); - - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - /* - * Now that we have a handle to the object, we can attempt - * to evaluate it. - */ - - status = acpi_ns_evaluate_by_handle (node, params, return_object); - - -cleanup: - - /* Cleanup */ - - if (internal_path) { - acpi_cm_free (internal_path); - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_evaluate_by_handle - * - * PARAMETERS: Handle - Method Node to execute - * **Params - List of parameters to pass to the method, - * terminated by NULL. Params itself may be - * NULL if no parameters are being passed. - * *Return_object - Where to put method's return value (if - * any). If NULL, no value is returned. - * - * RETURN: Status - * - * DESCRIPTION: Execute the requested method passing the given parameters - * - * MUTEX: Locks Namespace - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_evaluate_by_handle ( - ACPI_NAMESPACE_NODE *handle, - ACPI_OPERAND_OBJECT **params, - ACPI_OPERAND_OBJECT **return_object) -{ - ACPI_NAMESPACE_NODE *node; - ACPI_STATUS status; - ACPI_OPERAND_OBJECT *local_return_object; - - - /* Check if namespace has been initialized */ - - if (!acpi_gbl_root_node) { - return (AE_NO_NAMESPACE); - } - - /* Parameter Validation */ - - if (!handle) { - return (AE_BAD_PARAMETER); - } - - if (return_object) { - /* Initialize the return value to an invalid object */ - - *return_object = NULL; - } - - /* Get the prefix handle and Node */ - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - node = acpi_ns_convert_handle_to_entry (handle); - if (!node) { - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (AE_BAD_PARAMETER); - } - - - /* - * Two major cases here: - * 1) The object is an actual control method -- execute it. - * 2) The object is not a method -- just return it's current - * value - * - * In both cases, the namespace is unlocked by the - * Acpi_ns* procedure - */ - if (acpi_ns_get_type (node) == ACPI_TYPE_METHOD) { - /* - * Case 1) We have an actual control method to execute - */ - status = acpi_ns_execute_control_method (node, params, - &local_return_object); - } - - else { - /* - * Case 2) Object is NOT a method, just return its - * current value - */ - status = acpi_ns_get_object_value (node, &local_return_object); - } - - - /* - * Check if there is a return value on the stack that must - * be dealt with - */ - if (status == AE_CTRL_RETURN_VALUE) { - /* - * If the Method returned a value and the caller - * provided a place to store a returned value, Copy - * the returned value to the object descriptor provided - * by the caller. - */ - if (return_object) { - /* - * Valid return object, copy the pointer to - * the returned object - */ - *return_object = local_return_object; - } - - - /* Map AE_RETURN_VALUE to AE_OK, we are done with it */ - - if (status == AE_CTRL_RETURN_VALUE) { - status = AE_OK; - } - } - - /* - * Namespace was unlocked by the handling Acpi_ns* function, - * so we just return - */ - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_execute_control_method - * - * PARAMETERS: Method_node - The object/method - * **Params - List of parameters to pass to the method, - * terminated by NULL. Params itself may be - * NULL if no parameters are being passed. - * **Return_obj_desc - List of result objects to be returned - * from the method. - * - * RETURN: Status - * - * DESCRIPTION: Execute the requested method passing the given parameters - * - * MUTEX: Assumes namespace is locked - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_execute_control_method ( - ACPI_NAMESPACE_NODE *method_node, - ACPI_OPERAND_OBJECT **params, - ACPI_OPERAND_OBJECT **return_obj_desc) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT *obj_desc; - - - /* Verify that there is a method associated with this object */ - - obj_desc = acpi_ns_get_attached_object ((ACPI_HANDLE) method_node); - if (!obj_desc) { - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (AE_ERROR); - } - - - /* - * Unlock the namespace before execution. This allows namespace access - * via the external Acpi* interfaces while a method is being executed. - * However, any namespace deletion must acquire both the namespace and - * interpreter locks to ensure that no thread is using the portion of the - * namespace that is being deleted. - */ - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - - /* - * Execute the method via the interpreter - */ - status = acpi_aml_execute_method (method_node, params, return_obj_desc); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_get_object_value - * - * PARAMETERS: Node - The object - * - * RETURN: Status - * - * DESCRIPTION: Return the current value of the object - * - * MUTEX: Assumes namespace is locked - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_get_object_value ( - ACPI_NAMESPACE_NODE *node, - ACPI_OPERAND_OBJECT **return_obj_desc) -{ - ACPI_STATUS status = AE_OK; - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_OPERAND_OBJECT *val_desc; - - - /* - * We take the value from certain objects directly - */ - - if ((node->type == ACPI_TYPE_PROCESSOR) || - (node->type == ACPI_TYPE_POWER)) { - /* - * Create a Reference object to contain the object - */ - obj_desc = acpi_cm_create_internal_object (node->type); - if (!obj_desc) { - status = AE_NO_MEMORY; - goto unlock_and_exit; - } - - /* - * Get the attached object - */ - - val_desc = acpi_ns_get_attached_object (node); - if (!val_desc) { - status = AE_NULL_OBJECT; - goto unlock_and_exit; - } - - /* - * Just copy from the original to the return object - * - * TBD: [Future] - need a low-level object copy that handles - * the reference count automatically. (Don't want to copy it) - */ - - MEMCPY (obj_desc, val_desc, sizeof (ACPI_OPERAND_OBJECT)); - obj_desc->common.reference_count = 1; - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - } - - - /* - * Other objects require a reference object wrapper which we - * then attempt to resolve. - */ - else { - /* Create an Reference object to contain the object */ - - obj_desc = acpi_cm_create_internal_object (INTERNAL_TYPE_REFERENCE); - if (!obj_desc) { - status = AE_NO_MEMORY; - goto unlock_and_exit; - } - - /* Construct a descriptor pointing to the name */ - - obj_desc->reference.opcode = (u8) AML_NAME_OP; - obj_desc->reference.object = (void *) node; - - /* - * Use Resolve_to_value() to get the associated value. This call - * always deletes Obj_desc (allocated above). - * - * NOTE: we can get away with passing in NULL for a walk state - * because Obj_desc is guaranteed to not be a reference to either - * a method local or a method argument - * - * Even though we do not directly invoke the interpreter - * for this, we must enter it because we could access an opregion. - * The opregion access code assumes that the interpreter - * is locked. - * - * We must release the namespace lock before entering the - * intepreter. - */ - - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - status = acpi_aml_enter_interpreter (); - if (ACPI_SUCCESS (status)) { - status = acpi_aml_resolve_to_value (&obj_desc, NULL); - - acpi_aml_exit_interpreter (); - } - } - - /* - * If Acpi_aml_resolve_to_value() succeeded, the return value was - * placed in Obj_desc. - */ - - if (ACPI_SUCCESS (status)) { - status = AE_CTRL_RETURN_VALUE; - - *return_obj_desc = obj_desc; - } - - /* Namespace is unlocked */ - - return (status); - - -unlock_and_exit: - - /* Unlock the namespace */ - - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (status); -} diff --git a/reactos/drivers/bus/acpi/namespace/nsinit.c b/reactos/drivers/bus/acpi/namespace/nsinit.c deleted file mode 100644 index 81ed0fe3c2c..00000000000 --- a/reactos/drivers/bus/acpi/namespace/nsinit.c +++ /dev/null @@ -1,276 +0,0 @@ -/****************************************************************************** - * - * Module Name: nsinit - namespace initialization - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_NAMESPACE - MODULE_NAME ("nsinit") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_initialize_objects - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Walk the entire namespace and perform any necessary - * initialization on the objects found therein - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_initialize_objects ( - void) -{ - ACPI_STATUS status; - ACPI_INIT_WALK_INFO info; - - - info.field_count = 0; - info.field_init = 0; - info.op_region_count = 0; - info.op_region_init = 0; - info.object_count = 0; - - - /* Walk entire namespace from the supplied root */ - - status = acpi_walk_namespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, acpi_ns_init_one_object, - &info, NULL); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_initialize_devices - * - * PARAMETERS: None - * - * RETURN: ACPI_STATUS - * - * DESCRIPTION: Walk the entire namespace and initialize all ACPI devices. - * This means running _INI on all present devices. - * - * Note: We install PCI config space handler on region access, - * not here. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_initialize_devices ( - void) -{ - ACPI_STATUS status; - ACPI_DEVICE_WALK_INFO info; - - - info.device_count = 0; - info.num_STA = 0; - info.num_INI = 0; - - - status = acpi_ns_walk_namespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, FALSE, acpi_ns_init_one_device, &info, NULL); - - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_init_one_object - * - * PARAMETERS: Obj_handle - Node - * Level - Current nesting level - * Context - Points to a init info struct - * Return_value - Not used - * - * RETURN: Status - * - * DESCRIPTION: Callback from Acpi_walk_namespace. Invoked for every object - * within the namespace. - * - * Currently, the only objects that require initialization are: - * 1) Methods - * 2) Op Regions - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_init_one_object ( - ACPI_HANDLE obj_handle, - u32 level, - void *context, - void **return_value) -{ - OBJECT_TYPE_INTERNAL type; - ACPI_STATUS status; - ACPI_INIT_WALK_INFO *info = (ACPI_INIT_WALK_INFO *) context; - ACPI_NAMESPACE_NODE *node = (ACPI_NAMESPACE_NODE *) obj_handle; - ACPI_OPERAND_OBJECT *obj_desc; - - - info->object_count++; - - - /* And even then, we are only interested in a few object types */ - - type = acpi_ns_get_type (obj_handle); - obj_desc = node->object; - if (!obj_desc) { - return (AE_OK); - } - - switch (type) { - - case ACPI_TYPE_REGION: - - info->op_region_count++; - if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { - break; - } - - info->op_region_init++; - status = acpi_ds_get_region_arguments (obj_desc); - - - break; - - - case ACPI_TYPE_FIELD_UNIT: - - info->field_count++; - if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { - break; - } - - info->field_init++; - status = acpi_ds_get_field_unit_arguments (obj_desc); - - - break; - - default: - break; - } - - /* - * We ignore errors from above, and always return OK, since - * we don't want to abort the walk on a single error. - */ - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_init_one_device - * - * PARAMETERS: WALK_CALLBACK - * - * RETURN: ACPI_STATUS - * - * DESCRIPTION: This is called once per device soon after ACPI is enabled - * to initialize each device. It determines if the device is - * present, and if so, calls _INI. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_init_one_device ( - ACPI_HANDLE obj_handle, - u32 nesting_level, - void *context, - void **return_value) -{ - ACPI_STATUS status; - ACPI_NAMESPACE_NODE *node; - u32 flags; - ACPI_DEVICE_WALK_INFO *info = (ACPI_DEVICE_WALK_INFO *) context; - - - - info->device_count++; - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - node = acpi_ns_convert_handle_to_entry (obj_handle); - if (!node) { - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (AE_BAD_PARAMETER); - } - - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - - /* - * Run _STA to determine if we can run _INI on the device. - */ - - status = acpi_cm_execute_STA (node, &flags); - if (ACPI_FAILURE (status)) { - /* Ignore error and move on to next device */ - - return (AE_OK); - } - - info->num_STA++; - - if (!(flags & 0x01)) { - /* don't look at children of a not present device */ - return(AE_CTRL_DEPTH); - } - - - /* - * The device is present. Run _INI. - */ - - status = acpi_ns_evaluate_relative (obj_handle, "_INI", NULL, NULL); - if (AE_NOT_FOUND == status) { - /* No _INI means device requires no initialization */ - status = AE_OK; - } - - else if (ACPI_FAILURE (status)) { - /* Ignore error and move on to next device */ - - } - - else { - /* Count of successful INIs */ - - info->num_INI++; - } - - return (AE_OK); -} diff --git a/reactos/drivers/bus/acpi/namespace/nsload.c b/reactos/drivers/bus/acpi/namespace/nsload.c deleted file mode 100644 index a74bf573d40..00000000000 --- a/reactos/drivers/bus/acpi/namespace/nsload.c +++ /dev/null @@ -1,521 +0,0 @@ -/****************************************************************************** - * - * Module Name: nsload - namespace loading/expanding/contracting procedures - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_NAMESPACE - MODULE_NAME ("nsload") - - -/******************************************************************************* - * - * FUNCTION: Acpi_load_namespace - * - * PARAMETERS: Display_aml_during_load - * - * RETURN: Status - * - * DESCRIPTION: Load the name space from what ever is pointed to by DSDT. - * (DSDT points to either the BIOS or a buffer.) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_load_namespace ( - void) -{ - ACPI_STATUS status; - - - /* There must be at least a DSDT installed */ - - if (acpi_gbl_DSDT == NULL) { - return (AE_NO_ACPI_TABLES); - } - - - /* - * Load the namespace. The DSDT is required, - * but the SSDT and PSDT tables are optional. - */ - - status = acpi_ns_load_table_by_type (ACPI_TABLE_DSDT); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Ignore exceptions from these */ - - acpi_ns_load_table_by_type (ACPI_TABLE_SSDT); - acpi_ns_load_table_by_type (ACPI_TABLE_PSDT); - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_one_parse_pass - * - * PARAMETERS: - * - * RETURN: Status - * - * DESCRIPTION: - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_one_complete_parse ( - u32 pass_number, - ACPI_TABLE_DESC *table_desc) -{ - ACPI_PARSE_DOWNWARDS descending_callback; - ACPI_PARSE_UPWARDS ascending_callback; - ACPI_PARSE_OBJECT *parse_root; - ACPI_STATUS status; - - - switch (pass_number) { - case 1: - descending_callback = acpi_ds_load1_begin_op; - ascending_callback = acpi_ds_load1_end_op; - break; - - case 2: - descending_callback = acpi_ds_load2_begin_op; - ascending_callback = acpi_ds_load2_end_op; - break; - - case 3: - descending_callback = acpi_ds_exec_begin_op; - ascending_callback = acpi_ds_exec_end_op; - break; - - default: - return (AE_BAD_PARAMETER); - } - - /* Create and init a Root Node */ - - parse_root = acpi_ps_alloc_op (AML_SCOPE_OP); - if (!parse_root) { - return (AE_NO_MEMORY); - } - - ((ACPI_PARSE2_OBJECT *) parse_root)->name = ACPI_ROOT_NAME; - - - /* Pass 1: Parse everything except control method bodies */ - - status = acpi_ps_parse_aml (parse_root, table_desc->aml_pointer, - table_desc->aml_length, - ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE, - NULL, NULL, NULL, descending_callback, - ascending_callback); - - acpi_ps_delete_parse_tree (parse_root); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_parse_table - * - * PARAMETERS: Table_desc - An ACPI table descriptor for table to parse - * Start_node - Where to enter the table into the namespace - * - * RETURN: Status - * - * DESCRIPTION: Parse AML within an ACPI table and return a tree of ops - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_parse_table ( - ACPI_TABLE_DESC *table_desc, - ACPI_NAMESPACE_NODE *start_node) -{ - ACPI_STATUS status; - - - /* - * AML Parse, pass 1 - * - * In this pass, we load most of the namespace. Control methods - * are not parsed until later. A parse tree is not created. Instead, - * each Parser Op subtree is deleted when it is finished. This saves - * a great deal of memory, and allows a small cache of parse objects - * to service the entire parse. The second pass of the parse then - * performs another complete parse of the AML.. - */ - - status = acpi_ns_one_complete_parse (1, table_desc); - if (ACPI_FAILURE (status)) { - return (status); - } - - - /* - * AML Parse, pass 2 - * - * In this pass, we resolve forward references and other things - * that could not be completed during the first pass. - * Another complete parse of the AML is performed, but the - * overhead of this is compensated for by the fact that the - * parse objects are all cached. - */ - - status = acpi_ns_one_complete_parse (2, table_desc); - if (ACPI_FAILURE (status)) { - return (status); - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_load_table - * - * PARAMETERS: *Pcode_addr - Address of pcode block - * Pcode_length - Length of pcode block - * - * RETURN: Status - * - * DESCRIPTION: Load one ACPI table into the namespace - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_load_table ( - ACPI_TABLE_DESC *table_desc, - ACPI_NAMESPACE_NODE *node) -{ - ACPI_STATUS status; - - - if (!table_desc->aml_pointer) { - return (AE_BAD_PARAMETER); - } - - - if (!table_desc->aml_length) { - return (AE_BAD_PARAMETER); - } - - - /* - * Parse the table and load the namespace with all named - * objects found within. Control methods are NOT parsed - * at this time. In fact, the control methods cannot be - * parsed until the entire namespace is loaded, because - * if a control method makes a forward reference (call) - * to another control method, we can't continue parsing - * because we don't know how many arguments to parse next! - */ - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - status = acpi_ns_parse_table (table_desc, node->child); - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * Now we can parse the control methods. We always parse - * them here for a sanity check, and if configured for - * just-in-time parsing, we delete the control method - * parse trees. - */ - - status = acpi_ds_initialize_objects (table_desc, node); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_load_table_by_type - * - * PARAMETERS: Table_type - Id of the table type to load - * - * RETURN: Status - * - * DESCRIPTION: Load an ACPI table or tables into the namespace. All tables - * of the given type are loaded. The mechanism allows this - * routine to be called repeatedly. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_load_table_by_type ( - ACPI_TABLE_TYPE table_type) -{ - u32 i; - ACPI_STATUS status = AE_OK; - ACPI_TABLE_HEADER *table_ptr; - ACPI_TABLE_DESC *table_desc; - - - acpi_cm_acquire_mutex (ACPI_MTX_TABLES); - - - /* - * Table types supported are: - * DSDT (one), SSDT/PSDT (multiple) - */ - - switch (table_type) { - - case ACPI_TABLE_DSDT: - - table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_DSDT]; - - /* If table already loaded into namespace, just return */ - - if (table_desc->loaded_into_namespace) { - goto unlock_and_exit; - } - - table_desc->table_id = TABLE_ID_DSDT; - - /* Now load the single DSDT */ - - status = acpi_ns_load_table (table_desc, acpi_gbl_root_node); - if (ACPI_SUCCESS (status)) { - table_desc->loaded_into_namespace = TRUE; - } - - break; - - - case ACPI_TABLE_SSDT: - - /* - * Traverse list of SSDT tables - */ - - table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_SSDT]; - for (i = 0; i < acpi_gbl_acpi_tables[ACPI_TABLE_SSDT].count; i++) { - table_ptr = table_desc->pointer; - - /* - * Only attempt to load table if it is not - * already loaded! - */ - - if (!table_desc->loaded_into_namespace) { - status = acpi_ns_load_table (table_desc, acpi_gbl_root_node); - if (ACPI_FAILURE (status)) { - break; - } - - table_desc->loaded_into_namespace = TRUE; - } - - table_desc = table_desc->next; - } - break; - - - case ACPI_TABLE_PSDT: - - /* - * Traverse list of PSDT tables - */ - - table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_PSDT]; - - for (i = 0; i < acpi_gbl_acpi_tables[ACPI_TABLE_PSDT].count; i++) { - table_ptr = table_desc->pointer; - - /* Only attempt to load table if it is not already loaded! */ - - if (!table_desc->loaded_into_namespace) { - status = acpi_ns_load_table (table_desc, acpi_gbl_root_node); - if (ACPI_FAILURE (status)) { - break; - } - - table_desc->loaded_into_namespace = TRUE; - } - - table_desc = table_desc->next; - } - - break; - - - default: - status = AE_SUPPORT; - break; - } - - -unlock_and_exit: - - acpi_cm_release_mutex (ACPI_MTX_TABLES); - - return (status); - -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_delete_subtree - * - * PARAMETERS: Start_handle - Handle in namespace where search begins - * - * RETURNS Status - * - * DESCRIPTION: Walks the namespace starting at the given handle and deletes - * all objects, entries, and scopes in the entire subtree. - * - * TBD: [Investigate] What if any part of this subtree is in use? - * (i.e. on one of the object stacks?) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_delete_subtree ( - ACPI_HANDLE start_handle) -{ - ACPI_STATUS status; - ACPI_HANDLE child_handle; - ACPI_HANDLE parent_handle; - ACPI_HANDLE next_child_handle; - ACPI_HANDLE dummy; - u32 level; - - - parent_handle = start_handle; - child_handle = 0; - level = 1; - - /* - * Traverse the tree of objects until we bubble back up - * to where we started. - */ - - while (level > 0) { - /* Attempt to get the next object in this scope */ - - status = acpi_get_next_object (ACPI_TYPE_ANY, parent_handle, - child_handle, &next_child_handle); - - child_handle = next_child_handle; - - - /* Did we get a new object? */ - - if (ACPI_SUCCESS (status)) { - /* Check if this object has any children */ - - if (ACPI_SUCCESS (acpi_get_next_object (ACPI_TYPE_ANY, child_handle, - 0, &dummy))) { - /* - * There is at least one child of this object, - * visit the object - */ - - level++; - parent_handle = child_handle; - child_handle = 0; - } - } - - else { - /* - * No more children in this object, go back up to - * the object's parent - */ - level--; - - /* Delete all children now */ - - acpi_ns_delete_children (child_handle); - - child_handle = parent_handle; - acpi_get_parent (parent_handle, &parent_handle); - } - } - - /* Now delete the starting object, and we are done */ - - acpi_ns_delete_node (child_handle); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_unload_name_space - * - * PARAMETERS: Handle - Root of namespace subtree to be deleted - * - * RETURN: Status - * - * DESCRIPTION: Shrinks the namespace, typically in response to an undocking - * event. Deletes an entire subtree starting from (and - * including) the given handle. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_unload_namespace ( - ACPI_HANDLE handle) -{ - ACPI_STATUS status; - - - /* Parameter validation */ - - if (!acpi_gbl_root_node) { - return (AE_NO_NAMESPACE); - } - - if (!handle) { - return (AE_BAD_PARAMETER); - } - - - /* This function does the real work */ - - status = acpi_ns_delete_subtree (handle); - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/namespace/nsnames.c b/reactos/drivers/bus/acpi/namespace/nsnames.c deleted file mode 100644 index e39a344ff5d..00000000000 --- a/reactos/drivers/bus/acpi/namespace/nsnames.c +++ /dev/null @@ -1,245 +0,0 @@ -/******************************************************************************* - * - * Module Name: nsnames - Name manipulation and search - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_NAMESPACE - MODULE_NAME ("nsnames") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_get_table_pathname - * - * PARAMETERS: Node - Scope whose name is needed - * - * RETURN: Pointer to storage containing the fully qualified name of - * the scope, in Label format (all segments strung together - * with no separators) - * - * DESCRIPTION: Used for debug printing in Acpi_ns_search_table(). - * - ******************************************************************************/ - -NATIVE_CHAR * -acpi_ns_get_table_pathname ( - ACPI_NAMESPACE_NODE *node) -{ - NATIVE_CHAR *name_buffer; - u32 size; - ACPI_NAME name; - ACPI_NAMESPACE_NODE *child_node; - ACPI_NAMESPACE_NODE *parent_node; - - - if (!acpi_gbl_root_node || !node) { - /* - * If the name space has not been initialized, - * this function should not have been called. - */ - return (NULL); - } - - child_node = node->child; - - - /* Calculate required buffer size based on depth below root */ - - size = 1; - parent_node = child_node; - while (parent_node) { - parent_node = acpi_ns_get_parent_object (parent_node); - if (parent_node) { - size += ACPI_NAME_SIZE; - } - } - - - /* Allocate a buffer to be returned to caller */ - - name_buffer = acpi_cm_callocate (size + 1); - if (!name_buffer) { - REPORT_ERROR (("Ns_get_table_pathname: allocation failure\n")); - return (NULL); - } - - - /* Store terminator byte, then build name backwards */ - - name_buffer[size] = '\0'; - while ((size > ACPI_NAME_SIZE) && - acpi_ns_get_parent_object (child_node)) { - size -= ACPI_NAME_SIZE; - name = acpi_ns_find_parent_name (child_node); - - /* Put the name into the buffer */ - - MOVE_UNALIGNED32_TO_32 ((name_buffer + size), &name); - child_node = acpi_ns_get_parent_object (child_node); - } - - name_buffer[--size] = AML_ROOT_PREFIX; - - - return (name_buffer); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_get_pathname_length - * - * PARAMETERS: Node - Namespace node - * - * RETURN: Length of path, including prefix - * - * DESCRIPTION: Get the length of the pathname string for this node - * - ******************************************************************************/ - -u32 -acpi_ns_get_pathname_length ( - ACPI_NAMESPACE_NODE *node) -{ - u32 size; - ACPI_NAMESPACE_NODE *next_node; - - /* - * Compute length of pathname as 5 * number of name segments. - * Go back up the parent tree to the root - */ - for (size = 0, next_node = node; - acpi_ns_get_parent_object (next_node); - next_node = acpi_ns_get_parent_object (next_node)) { - size += PATH_SEGMENT_LENGTH; - } - - /* Special case for size still 0 - no parent for "special" nodes */ - - if (!size) { - size = PATH_SEGMENT_LENGTH; - } - - return (size + 1); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_handle_to_pathname - * - * PARAMETERS: Target_handle - Handle of named object whose name is - * to be found - * Buf_size - Size of the buffer provided - * User_buffer - Where the pathname is returned - * - * RETURN: Status, Buffer is filled with pathname if status is AE_OK - * - * DESCRIPTION: Build and return a full namespace pathname - * - * MUTEX: Locks Namespace - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_handle_to_pathname ( - ACPI_HANDLE target_handle, - u32 *buf_size, - NATIVE_CHAR *user_buffer) -{ - ACPI_STATUS status = AE_OK; - ACPI_NAMESPACE_NODE *node; - u32 path_length; - u32 user_buf_size; - ACPI_NAME name; - u32 size; - - - if (!acpi_gbl_root_node || !target_handle) { - /* - * If the name space has not been initialized, - * this function should not have been called. - */ - - return (AE_NO_NAMESPACE); - } - - node = acpi_ns_convert_handle_to_entry (target_handle); - if (!node) { - return (AE_BAD_PARAMETER); - } - - - /* Set return length to the required path length */ - - path_length = acpi_ns_get_pathname_length (node); - size = path_length - 1; - - user_buf_size = *buf_size; - *buf_size = path_length; - - /* Check if the user buffer is sufficiently large */ - - if (path_length > user_buf_size) { - status = AE_BUFFER_OVERFLOW; - goto exit; - } - - /* Store null terminator */ - - user_buffer[size] = 0; - size -= ACPI_NAME_SIZE; - - /* Put the original ACPI name at the end of the path */ - - MOVE_UNALIGNED32_TO_32 ((user_buffer + size), - &node->name); - - user_buffer[--size] = PATH_SEPARATOR; - - /* Build name backwards, putting "." between segments */ - - while ((size > ACPI_NAME_SIZE) && node) { - size -= ACPI_NAME_SIZE; - name = acpi_ns_find_parent_name (node); - MOVE_UNALIGNED32_TO_32 ((user_buffer + size), &name); - - user_buffer[--size] = PATH_SEPARATOR; - node = acpi_ns_get_parent_object (node); - } - - /* - * Overlay the "." preceding the first segment with - * the root name "\" - */ - - user_buffer[size] = '\\'; - -exit: - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/namespace/nsobject.c b/reactos/drivers/bus/acpi/namespace/nsobject.c deleted file mode 100644 index 0a114f6e903..00000000000 --- a/reactos/drivers/bus/acpi/namespace/nsobject.c +++ /dev/null @@ -1,356 +0,0 @@ -/******************************************************************************* - * - * Module Name: nsobject - Utilities for objects attached to namespace - * table entries - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_NAMESPACE - MODULE_NAME ("nsobject") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_attach_object - * - * PARAMETERS: Node - Parent Node - * Object - Object to be attached - * Type - Type of object, or ACPI_TYPE_ANY if not - * known - * - * DESCRIPTION: Record the given object as the value associated with the - * name whose ACPI_HANDLE is passed. If Object is NULL - * and Type is ACPI_TYPE_ANY, set the name as having no value. - * - * MUTEX: Assumes namespace is locked - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_attach_object ( - ACPI_NAMESPACE_NODE *node, - ACPI_OPERAND_OBJECT *object, - OBJECT_TYPE_INTERNAL type) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_OPERAND_OBJECT *previous_obj_desc; - OBJECT_TYPE_INTERNAL obj_type = ACPI_TYPE_ANY; - u8 flags; - u16 opcode; - - - /* - * Parameter validation - */ - - if (!acpi_gbl_root_node) { - /* Name space not initialized */ - - REPORT_ERROR (("Ns_attach_object: Namespace not initialized\n")); - return (AE_NO_NAMESPACE); - } - - if (!node) { - /* Invalid handle */ - - REPORT_ERROR (("Ns_attach_object: Null Named_obj handle\n")); - return (AE_BAD_PARAMETER); - } - - if (!object && (ACPI_TYPE_ANY != type)) { - /* Null object */ - - REPORT_ERROR (("Ns_attach_object: Null object, but type not ACPI_TYPE_ANY\n")); - return (AE_BAD_PARAMETER); - } - - if (!VALID_DESCRIPTOR_TYPE (node, ACPI_DESC_TYPE_NAMED)) { - /* Not a name handle */ - - REPORT_ERROR (("Ns_attach_object: Invalid handle\n")); - return (AE_BAD_PARAMETER); - } - - /* Check if this object is already attached */ - - if (node->object == object) { - return (AE_OK); - } - - - /* Get the current flags field of the Node */ - - flags = node->flags; - flags &= ~ANOBJ_AML_ATTACHMENT; - - - /* If null object, we will just install it */ - - if (!object) { - obj_desc = NULL; - obj_type = ACPI_TYPE_ANY; - } - - /* - * If the object is an Node with an attached object, - * we will use that (attached) object - */ - - else if (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_NAMED) && - ((ACPI_NAMESPACE_NODE *) object)->object) { - /* - * Value passed is a name handle and that name has a - * non-null value. Use that name's value and type. - */ - - obj_desc = ((ACPI_NAMESPACE_NODE *) object)->object; - obj_type = ((ACPI_NAMESPACE_NODE *) object)->type; - - /* - * Copy appropriate flags - */ - - if (((ACPI_NAMESPACE_NODE *) object)->flags & ANOBJ_AML_ATTACHMENT) { - flags |= ANOBJ_AML_ATTACHMENT; - } - } - - - /* - * Otherwise, we will use the parameter object, but we must type - * it first - */ - - else { - obj_desc = (ACPI_OPERAND_OBJECT *) object; - - - /* If a valid type (non-ANY) was given, just use it */ - - if (ACPI_TYPE_ANY != type) { - obj_type = type; - } - - - /* - * Type is TYPE_Any, we must try to determinte the - * actual type of the object - */ - - /* - * Check if value points into the AML code - */ - else if (acpi_tb_system_table_pointer (object)) { - /* - * Object points into the AML stream. - * Set a flag bit in the Node to indicate this - */ - - flags |= ANOBJ_AML_ATTACHMENT; - - /* - * The next byte (perhaps the next two bytes) - * will be the AML opcode - */ - - MOVE_UNALIGNED16_TO_16 (&opcode, object); - - /* Check for a recognized Opcode */ - - switch (opcode) { - - case AML_OP_PREFIX: - - if (opcode != AML_REVISION_OP) { - /* - * Op_prefix is unrecognized unless part - * of Revision_op - */ - - break; - } - - /* Else fall through to set type as Number */ - - - case AML_ZERO_OP: case AML_ONES_OP: case AML_ONE_OP: - case AML_BYTE_OP: case AML_WORD_OP: case AML_DWORD_OP: - - obj_type = ACPI_TYPE_INTEGER; - break; - - - case AML_STRING_OP: - - obj_type = ACPI_TYPE_STRING; - break; - - - case AML_BUFFER_OP: - - obj_type = ACPI_TYPE_BUFFER; - break; - - - case AML_MUTEX_OP: - - obj_type = ACPI_TYPE_MUTEX; - break; - - - case AML_PACKAGE_OP: - - obj_type = ACPI_TYPE_PACKAGE; - break; - - - default: - - return (AE_TYPE); - break; - } - } - - else { - /* - * Cannot figure out the type -- set to Def_any which - * will print as an error in the name table dump - */ - - - obj_type = INTERNAL_TYPE_DEF_ANY; - } - } - - - /* - * Must increment the new value's reference count - * (if it is an internal object) - */ - - acpi_cm_add_reference (obj_desc); - - /* Save the existing object (if any) for deletion later */ - - previous_obj_desc = node->object; - - /* Install the object and set the type, flags */ - - node->object = obj_desc; - node->type = (u8) obj_type; - node->flags |= flags; - - - /* - * Delete an existing attached object. - */ - - if (previous_obj_desc) { - /* One for the attach to the Node */ - - acpi_cm_remove_reference (previous_obj_desc); - - /* Now delete */ - - acpi_cm_remove_reference (previous_obj_desc); - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_detach_object - * - * PARAMETERS: Node - An object whose Value will be deleted - * - * RETURN: None. - * - * DESCRIPTION: Delete the Value associated with a namespace object. If the - * Value is an allocated object, it is freed. Otherwise, the - * field is simply cleared. - * - ******************************************************************************/ - -void -acpi_ns_detach_object ( - ACPI_NAMESPACE_NODE *node) -{ - ACPI_OPERAND_OBJECT *obj_desc; - - - obj_desc = node->object; - if (!obj_desc) { - return; - } - - /* Clear the entry in all cases */ - - node->object = NULL; - - /* Found a valid value */ - - /* - * Not every value is an object allocated via Acpi_cm_callocate, - * - must check - */ - - if (!acpi_tb_system_table_pointer (obj_desc)) { - /* Attempt to delete the object (and all subobjects) */ - - acpi_cm_remove_reference (obj_desc); - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_get_attached_object - * - * PARAMETERS: Handle - Parent Node to be examined - * - * RETURN: Current value of the object field from the Node whose - * handle is passed - * - ******************************************************************************/ - -void * -acpi_ns_get_attached_object ( - ACPI_HANDLE handle) -{ - - if (!handle) { - /* handle invalid */ - - return (NULL); - } - - return (((ACPI_NAMESPACE_NODE *) handle)->object); -} - - diff --git a/reactos/drivers/bus/acpi/namespace/nssearch.c b/reactos/drivers/bus/acpi/namespace/nssearch.c deleted file mode 100644 index 53d6f19568b..00000000000 --- a/reactos/drivers/bus/acpi/namespace/nssearch.c +++ /dev/null @@ -1,342 +0,0 @@ -/******************************************************************************* - * - * Module Name: nssearch - Namespace search - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_NAMESPACE - MODULE_NAME ("nssearch") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_search_node - * - * PARAMETERS: *Target_name - Ascii ACPI name to search for - * *Node - Starting table where search will begin - * Type - Object type to match - * **Return_node - Where the matched Named obj is returned - * - * RETURN: Status - * - * DESCRIPTION: Search a single namespace table. Performs a simple search, - * does not add entries or search parents. - * - * - * Named object lists are built (and subsequently dumped) in the - * order in which the names are encountered during the namespace load; - * - * All namespace searching is linear in this implementation, but - * could be easily modified to support any improved search - * algorithm. However, the linear search was chosen for simplicity - * and because the trees are small and the other interpreter - * execution overhead is relatively high. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_search_node ( - u32 target_name, - ACPI_NAMESPACE_NODE *node, - OBJECT_TYPE_INTERNAL type, - ACPI_NAMESPACE_NODE **return_node) -{ - ACPI_NAMESPACE_NODE *next_node; - - - /* - * Search for name in this table, which is to say that we must search - * for the name among the children of this object - */ - - next_node = node->child; - while (next_node) { - /* Check for match against the name */ - - if (next_node->name == target_name) { - /* - * Found matching entry. Capture the type if appropriate, before - * returning the entry. - * - * The Def_field_defn and Bank_field_defn cases are actually looking up - * the Region in which the field will be defined - */ - - if ((INTERNAL_TYPE_DEF_FIELD_DEFN == type) || - (INTERNAL_TYPE_BANK_FIELD_DEFN == type)) { - type = ACPI_TYPE_REGION; - } - - /* - * Scope, Def_any, and Index_field_defn are bogus "types" which do not - * actually have anything to do with the type of the name being - * looked up. For any other value of Type, if the type stored in - * the entry is Any (i.e. unknown), save the actual type. - */ - - if (type != INTERNAL_TYPE_SCOPE && - type != INTERNAL_TYPE_DEF_ANY && - type != INTERNAL_TYPE_INDEX_FIELD_DEFN && - next_node->type == ACPI_TYPE_ANY) { - next_node->type = (u8) type; - } - - *return_node = next_node; - return (AE_OK); - } - - - /* - * The last entry in the list points back to the parent, - * so a flag is used to indicate the end-of-list - */ - if (next_node->flags & ANOBJ_END_OF_PEER_LIST) { - /* Searched entire list, we are done */ - - break; - } - - /* Didn't match name, move on to the next peer object */ - - next_node = next_node->peer; - } - - - /* Searched entire table, not found */ - - - return (AE_NOT_FOUND); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_search_parent_tree - * - * PARAMETERS: *Target_name - Ascii ACPI name to search for - * *Node - Starting table where search will begin - * Type - Object type to match - * **Return_node - Where the matched Named Obj is returned - * - * RETURN: Status - * - * DESCRIPTION: Called when a name has not been found in the current namespace - * table. Before adding it or giving up, ACPI scope rules require - * searching enclosing scopes in cases identified by Acpi_ns_local(). - * - * "A name is located by finding the matching name in the current - * name space, and then in the parent name space. If the parent - * name space does not contain the name, the search continues - * recursively until either the name is found or the name space - * does not have a parent (the root of the name space). This - * indicates that the name is not found" (From ACPI Specification, - * section 5.3) - * - ******************************************************************************/ - -static ACPI_STATUS -acpi_ns_search_parent_tree ( - u32 target_name, - ACPI_NAMESPACE_NODE *node, - OBJECT_TYPE_INTERNAL type, - ACPI_NAMESPACE_NODE **return_node) -{ - ACPI_STATUS status; - ACPI_NAMESPACE_NODE *parent_node; - - - parent_node = acpi_ns_get_parent_object (node); - - /* - * If there is no parent (at the root) or type is "local", we won't be - * searching the parent tree. - */ - if ((acpi_ns_local (type)) || - (!parent_node)) { - - - return (AE_NOT_FOUND); - } - - - /* Search the parent tree */ - - /* - * Search parents until found the target or we have backed up to - * the root - */ - - while (parent_node) { - /* Search parent scope */ - /* TBD: [Investigate] Why ACPI_TYPE_ANY? */ - - status = acpi_ns_search_node (target_name, parent_node, - ACPI_TYPE_ANY, return_node); - - if (ACPI_SUCCESS (status)) { - return (status); - } - - /* - * Not found here, go up another level - * (until we reach the root) - */ - - parent_node = acpi_ns_get_parent_object (parent_node); - } - - - /* Not found in parent tree */ - - return (AE_NOT_FOUND); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_search_and_enter - * - * PARAMETERS: Target_name - Ascii ACPI name to search for (4 chars) - * Walk_state - Current state of the walk - * *Node - Starting table where search will begin - * Interpreter_mode - Add names only in MODE_Load_pass_x. - * Otherwise,search only. - * Type - Object type to match - * Flags - Flags describing the search restrictions - * **Return_node - Where the Node is returned - * - * RETURN: Status - * - * DESCRIPTION: Search for a name segment in a single name table, - * optionally adding it if it is not found. If the passed - * Type is not Any and the type previously stored in the - * entry was Any (i.e. unknown), update the stored type. - * - * In IMODE_EXECUTE, search only. - * In other modes, search and add if not found. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_search_and_enter ( - u32 target_name, - ACPI_WALK_STATE *walk_state, - ACPI_NAMESPACE_NODE *node, - OPERATING_MODE interpreter_mode, - OBJECT_TYPE_INTERNAL type, - u32 flags, - ACPI_NAMESPACE_NODE **return_node) -{ - ACPI_STATUS status; - ACPI_NAMESPACE_NODE *new_node; - - - /* Parameter validation */ - - if (!node || !target_name || !return_node) { - REPORT_ERROR (("Ns_search_and_enter: bad (null) parameter\n")); - return (AE_BAD_PARAMETER); - } - - - /* Name must consist of printable characters */ - - if (!acpi_cm_valid_acpi_name (target_name)) { - REPORT_ERROR (("Ns_search_and_enter: Bad character in ACPI Name\n")); - return (AE_BAD_CHARACTER); - } - - - /* Try to find the name in the table specified by the caller */ - - *return_node = ENTRY_NOT_FOUND; - status = acpi_ns_search_node (target_name, node, - type, return_node); - if (status != AE_NOT_FOUND) { - /* - * If we found it AND the request specifies that a find is an error, - * return the error - */ - if ((status == AE_OK) && - (flags & NS_ERROR_IF_FOUND)) { - status = AE_EXIST; - } - - /* - * Either found it or there was an error - * -- finished either way - */ - return (status); - } - - - /* - * Not found in the table. If we are NOT performing the - * first pass (name entry) of loading the namespace, search - * the parent tree (all the way to the root if necessary.) - * We don't want to perform the parent search when the - * namespace is actually being loaded. We want to perform - * the search when namespace references are being resolved - * (load pass 2) and during the execution phase. - */ - - if ((interpreter_mode != IMODE_LOAD_PASS1) && - (flags & NS_SEARCH_PARENT)) { - /* - * Not found in table - search parent tree according - * to ACPI specification - */ - - status = acpi_ns_search_parent_tree (target_name, node, - type, return_node); - if (ACPI_SUCCESS (status)) { - return (status); - } - } - - - /* - * In execute mode, just search, never add names. Exit now. - */ - if (interpreter_mode == IMODE_EXECUTE) { - return (AE_NOT_FOUND); - } - - - /* Create the new named object */ - - new_node = acpi_ns_create_node (target_name); - if (!new_node) { - return (AE_NO_MEMORY); - } - - /* Install the new object into the parent's list of children */ - - acpi_ns_install_node (walk_state, node, new_node, type); - *return_node = new_node; - - return (AE_OK); -} - diff --git a/reactos/drivers/bus/acpi/namespace/nsutils.c b/reactos/drivers/bus/acpi/namespace/nsutils.c deleted file mode 100644 index 268352075b8..00000000000 --- a/reactos/drivers/bus/acpi/namespace/nsutils.c +++ /dev/null @@ -1,811 +0,0 @@ -/****************************************************************************** - * - * Module Name: nsutils - Utilities for accessing ACPI namespace, accessing - * parents and siblings and Scope manipulation - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_NAMESPACE - MODULE_NAME ("nsutils") - - -/**************************************************************************** - * - * FUNCTION: Acpi_ns_valid_root_prefix - * - * PARAMETERS: Prefix - Character to be checked - * - * RETURN: TRUE if a valid prefix - * - * DESCRIPTION: Check if a character is a valid ACPI Root prefix - * - ***************************************************************************/ - -u8 -acpi_ns_valid_root_prefix ( - NATIVE_CHAR prefix) -{ - - return ((u8) (prefix == '\\')); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_ns_valid_path_separator - * - * PARAMETERS: Sep - Character to be checked - * - * RETURN: TRUE if a valid path separator - * - * DESCRIPTION: Check if a character is a valid ACPI path separator - * - ***************************************************************************/ - -u8 -acpi_ns_valid_path_separator ( - NATIVE_CHAR sep) -{ - - return ((u8) (sep == '.')); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_ns_get_type - * - * PARAMETERS: Handle - Parent Node to be examined - * - * RETURN: Type field from Node whose handle is passed - * - ***************************************************************************/ - -OBJECT_TYPE_INTERNAL -acpi_ns_get_type ( - ACPI_HANDLE handle) -{ - - if (!handle) { - REPORT_WARNING (("Ns_get_type: Null handle\n")); - return (ACPI_TYPE_ANY); - } - - return (((ACPI_NAMESPACE_NODE *) handle)->type); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_ns_local - * - * PARAMETERS: Type - A namespace object type - * - * RETURN: LOCAL if names must be found locally in objects of the - * passed type, 0 if enclosing scopes should be searched - * - ***************************************************************************/ - -u32 -acpi_ns_local ( - OBJECT_TYPE_INTERNAL type) -{ - - if (!acpi_cm_valid_object_type (type)) { - /* Type code out of range */ - - REPORT_WARNING (("Ns_local: Invalid Object Type\n")); - return (NSP_NORMAL); - } - - return ((u32) acpi_gbl_ns_properties[type] & NSP_LOCAL); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_ns_internalize_name - * - * PARAMETERS: *External_name - External representation of name - * **Converted Name - Where to return the resulting - * internal represention of the name - * - * RETURN: Status - * - * DESCRIPTION: Convert an external representation (e.g. "\_PR_.CPU0") - * to internal form (e.g. 5c 2f 02 5f 50 52 5f 43 50 55 30) - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ns_internalize_name ( - NATIVE_CHAR *external_name, - NATIVE_CHAR **converted_name) -{ - NATIVE_CHAR *result = NULL; - NATIVE_CHAR *internal_name; - u32 num_segments = 0; - u8 fully_qualified = FALSE; - u32 i; - u32 num_carats = 0; - - - if ((!external_name) || - (*external_name == 0) || - (!converted_name)) { - return (AE_BAD_PARAMETER); - } - - - /* - * For the internal name, the required length is 4 bytes - * per segment, plus 1 each for Root_prefix, Multi_name_prefix_op, - * segment count, trailing null (which is not really needed, - * but no there's harm in putting it there) - * - * strlen() + 1 covers the first Name_seg, which has no - * path separator - */ - - if (acpi_ns_valid_root_prefix (external_name[0])) { - fully_qualified = TRUE; - external_name++; - } - - else { - /* - * Handle Carat prefixes - */ - - while (*external_name == '^') { - num_carats++; - external_name++; - } - } - - /* - * Determine the number of ACPI name "segments" by counting - * the number of path separators within the string. Start - * with one segment since the segment count is (# separators) - * + 1, and zero separators is ok. - */ - - if (*external_name) { - num_segments = 1; - for (i = 0; external_name[i]; i++) { - if (acpi_ns_valid_path_separator (external_name[i])) { - num_segments++; - } - } - } - - - /* We need a segment to store the internal version of the name */ - - internal_name = acpi_cm_callocate ((ACPI_NAME_SIZE * num_segments) + 4 + num_carats); - if (!internal_name) { - return (AE_NO_MEMORY); - } - - - /* Setup the correct prefixes, counts, and pointers */ - - if (fully_qualified) { - internal_name[0] = '\\'; - - if (num_segments <= 1) { - result = &internal_name[1]; - } - else if (num_segments == 2) { - internal_name[1] = AML_DUAL_NAME_PREFIX; - result = &internal_name[2]; - } - else { - internal_name[1] = AML_MULTI_NAME_PREFIX_OP; - internal_name[2] = (char) num_segments; - result = &internal_name[3]; - } - - } - - else { - /* - * Not fully qualified. - * Handle Carats first, then append the name segments - */ - - i = 0; - if (num_carats) { - for (i = 0; i < num_carats; i++) { - internal_name[i] = '^'; - } - } - - if (num_segments == 1) { - result = &internal_name[i]; - } - - else if (num_segments == 2) { - internal_name[i] = AML_DUAL_NAME_PREFIX; - result = &internal_name[i+1]; - } - - else { - internal_name[i] = AML_MULTI_NAME_PREFIX_OP; - internal_name[i+1] = (char) num_segments; - result = &internal_name[i+2]; - } - } - - - /* Build the name (minus path separators) */ - - for (; num_segments; num_segments--) { - for (i = 0; i < ACPI_NAME_SIZE; i++) { - if (acpi_ns_valid_path_separator (*external_name) || - (*external_name == 0)) { - /* - * Pad the segment with underscore(s) if - * segment is short - */ - - result[i] = '_'; - } - - else { - /* Convert s8 to uppercase and save it */ - - result[i] = (char) TOUPPER (*external_name); - external_name++; - } - - } - - /* Now we must have a path separator, or the pathname is bad */ - - if (!acpi_ns_valid_path_separator (*external_name) && - (*external_name != 0)) { - acpi_cm_free (internal_name); - return (AE_BAD_PARAMETER); - } - - /* Move on the next segment */ - - external_name++; - result += ACPI_NAME_SIZE; - } - - - /* Return the completed name */ - - /* Terminate the string! */ - *result = 0; - *converted_name = internal_name; - - - - return (AE_OK); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_ns_externalize_name - * - * PARAMETERS: *Internal_name - Internal representation of name - * **Converted_name - Where to return the resulting - * external representation of name - * - * RETURN: Status - * - * DESCRIPTION: Convert internal name (e.g. 5c 2f 02 5f 50 52 5f 43 50 55 30) - * to its external form (e.g. "\_PR_.CPU0") - * - ****************************************************************************/ - -ACPI_STATUS -acpi_ns_externalize_name ( - u32 internal_name_length, - char *internal_name, - u32 *converted_name_length, - char **converted_name) -{ - u32 prefix_length = 0; - u32 names_index = 0; - u32 names_count = 0; - u32 i = 0; - u32 j = 0; - - - if (!internal_name_length || - !internal_name || - !converted_name_length || - !converted_name) { - return (AE_BAD_PARAMETER); - } - - - /* - * Check for a prefix (one '\' | one or more '^'). - */ - switch (internal_name[0]) { - case '\\': - prefix_length = 1; - break; - - case '^': - for (i = 0; i < internal_name_length; i++) { - if (internal_name[i] != '^') { - prefix_length = i + 1; - } - } - - if (i == internal_name_length) { - prefix_length = i; - } - - break; - } - - /* - * Check for object names. Note that there could be 0-255 of these - * 4-byte elements. - */ - if (prefix_length < internal_name_length) { - switch (internal_name[prefix_length]) { - - /* 4-byte names */ - - case AML_MULTI_NAME_PREFIX_OP: - names_index = prefix_length + 2; - names_count = (u32) internal_name[prefix_length + 1]; - break; - - - /* two 4-byte names */ - - case AML_DUAL_NAME_PREFIX: - names_index = prefix_length + 1; - names_count = 2; - break; - - - /* Null_name */ - - case 0: - names_index = 0; - names_count = 0; - break; - - - /* one 4-byte name */ - - default: - names_index = prefix_length; - names_count = 1; - break; - } - } - - /* - * Calculate the length of Converted_name, which equals the length - * of the prefix, length of all object names, length of any required - * punctuation ('.') between object names, plus the NULL terminator. - */ - *converted_name_length = prefix_length + (4 * names_count) + - ((names_count > 0) ? (names_count - 1) : 0) + 1; - - /* - * Check to see if we're still in bounds. If not, there's a problem - * with Internal_name (invalid format). - */ - if (*converted_name_length > internal_name_length) { - REPORT_ERROR (("Ns_externalize_name: Invalid internal name\n")); - return (AE_BAD_PATHNAME); - } - - /* - * Build Converted_name... - */ - - (*converted_name) = acpi_cm_callocate (*converted_name_length); - if (!(*converted_name)) { - return (AE_NO_MEMORY); - } - - j = 0; - - for (i = 0; i < prefix_length; i++) { - (*converted_name)[j++] = internal_name[i]; - } - - if (names_count > 0) { - for (i = 0; i < names_count; i++) { - if (i > 0) { - (*converted_name)[j++] = '.'; - } - - (*converted_name)[j++] = internal_name[names_index++]; - (*converted_name)[j++] = internal_name[names_index++]; - (*converted_name)[j++] = internal_name[names_index++]; - (*converted_name)[j++] = internal_name[names_index++]; - } - } - - return (AE_OK); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_ns_convert_handle_to_entry - * - * PARAMETERS: Handle - Handle to be converted to an Node - * - * RETURN: A Name table entry pointer - * - * DESCRIPTION: Convert a namespace handle to a real Node - * - ****************************************************************************/ - -ACPI_NAMESPACE_NODE * -acpi_ns_convert_handle_to_entry ( - ACPI_HANDLE handle) -{ - - /* - * Simple implementation for now; - * TBD: [Future] Real integer handles allow for more verification - * and keep all pointers within this subsystem! - */ - - if (!handle) { - return (NULL); - } - - if (handle == ACPI_ROOT_OBJECT) { - return (acpi_gbl_root_node); - } - - - /* We can at least attempt to verify the handle */ - - if (!VALID_DESCRIPTOR_TYPE (handle, ACPI_DESC_TYPE_NAMED)) { - return (NULL); - } - - return ((ACPI_NAMESPACE_NODE *) handle); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_ns_convert_entry_to_handle - * - * PARAMETERS: Node - Node to be converted to a Handle - * - * RETURN: An USER ACPI_HANDLE - * - * DESCRIPTION: Convert a real Node to a namespace handle - * - ****************************************************************************/ - -ACPI_HANDLE -acpi_ns_convert_entry_to_handle ( - ACPI_NAMESPACE_NODE *node) -{ - - - /* - * Simple implementation for now; - * TBD: [Future] Real integer handles allow for more verification - * and keep all pointers within this subsystem! - */ - - return ((ACPI_HANDLE) node); - - -/* --------------------------------------------------- - - if (!Node) - { - return (NULL); - } - - if (Node == Acpi_gbl_Root_node) - { - return (ACPI_ROOT_OBJECT); - } - - - return ((ACPI_HANDLE) Node); -------------------------------------------------------*/ -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ns_terminate - * - * PARAMETERS: none - * - * RETURN: none - * - * DESCRIPTION: free memory allocated for table storage. - * - ******************************************************************************/ - -void -acpi_ns_terminate (void) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_NAMESPACE_NODE *this_node; - - - this_node = acpi_gbl_root_node; - - /* - * 1) Free the entire namespace -- all objects, tables, and stacks - */ - /* - * Delete all objects linked to the root - * (additional table descriptors) - */ - - acpi_ns_delete_namespace_subtree (this_node); - - /* Detach any object(s) attached to the root */ - - obj_desc = acpi_ns_get_attached_object (this_node); - if (obj_desc) { - acpi_ns_detach_object (this_node); - acpi_cm_remove_reference (obj_desc); - } - - acpi_ns_delete_children (this_node); - - - /* - * 2) Now we can delete the ACPI tables - */ - - acpi_tb_delete_acpi_tables (); - - return; -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_ns_opens_scope - * - * PARAMETERS: Type - A valid namespace type - * - * RETURN: NEWSCOPE if the passed type "opens a name scope" according - * to the ACPI specification, else 0 - * - ***************************************************************************/ - -u32 -acpi_ns_opens_scope ( - OBJECT_TYPE_INTERNAL type) -{ - - if (!acpi_cm_valid_object_type (type)) { - /* type code out of range */ - - REPORT_WARNING (("Ns_opens_scope: Invalid Object Type\n")); - return (NSP_NORMAL); - } - - return (((u32) acpi_gbl_ns_properties[type]) & NSP_NEWSCOPE); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_ns_get_node - * - * PARAMETERS: *Pathname - Name to be found, in external (ASL) format. The - * \ (backslash) and ^ (carat) prefixes, and the - * . (period) to separate segments are supported. - * Start_node - Root of subtree to be searched, or NS_ALL for the - * root of the name space. If Name is fully - * qualified (first s8 is '\'), the passed value - * of Scope will not be accessed. - * Return_node - Where the Node is returned - * - * DESCRIPTION: Look up a name relative to a given scope and return the - * corresponding Node. NOTE: Scope can be null. - * - * MUTEX: Locks namespace - * - ***************************************************************************/ - -ACPI_STATUS -acpi_ns_get_node ( - NATIVE_CHAR *pathname, - ACPI_NAMESPACE_NODE *start_node, - ACPI_NAMESPACE_NODE **return_node) -{ - ACPI_GENERIC_STATE scope_info; - ACPI_STATUS status; - NATIVE_CHAR *internal_path = NULL; - - - /* Ensure that the namespace has been initialized */ - - if (!acpi_gbl_root_node) { - return (AE_NO_NAMESPACE); - } - - if (!pathname) { - return (AE_BAD_PARAMETER); - } - - - /* Convert path to internal representation */ - - status = acpi_ns_internalize_name (pathname, &internal_path); - if (ACPI_FAILURE (status)) { - return (status); - } - - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - /* Setup lookup scope (search starting point) */ - - scope_info.scope.node = start_node; - - /* Lookup the name in the namespace */ - - status = acpi_ns_lookup (&scope_info, internal_path, - ACPI_TYPE_ANY, IMODE_EXECUTE, - NS_NO_UPSEARCH | NS_DONT_OPEN_SCOPE, - NULL, return_node); - - - - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - - /* Cleanup */ - - acpi_cm_free (internal_path); - - return (status); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_ns_find_parent_name - * - * PARAMETERS: *Child_node - Named Obj whose name is to be found - * - * RETURN: The ACPI name - * - * DESCRIPTION: Search for the given obj in its parent scope and return the - * name segment, or "????" if the parent name can't be found - * (which "should not happen"). - * - ***************************************************************************/ - -ACPI_NAME -acpi_ns_find_parent_name ( - ACPI_NAMESPACE_NODE *child_node) -{ - ACPI_NAMESPACE_NODE *parent_node; - - - if (child_node) { - /* Valid entry. Get the parent Node */ - - parent_node = acpi_ns_get_parent_object (child_node); - if (parent_node) { - if (parent_node->name) { - return (parent_node->name); - } - } - - } - - - return (ACPI_UNKNOWN_NAME); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_ns_get_parent_object - * - * PARAMETERS: Node - Current table entry - * - * RETURN: Parent entry of the given entry - * - * DESCRIPTION: Obtain the parent entry for a given entry in the namespace. - * - ***************************************************************************/ - - -ACPI_NAMESPACE_NODE * -acpi_ns_get_parent_object ( - ACPI_NAMESPACE_NODE *node) -{ - - - if (!node) { - return (NULL); - } - - /* - * Walk to the end of this peer list. - * The last entry is marked with a flag and the peer - * pointer is really a pointer back to the parent. - * This saves putting a parent back pointer in each and - * every named object! - */ - - while (!(node->flags & ANOBJ_END_OF_PEER_LIST)) { - node = node->peer; - } - - - return (node->peer); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_ns_get_next_valid_object - * - * PARAMETERS: Node - Current table entry - * - * RETURN: Next valid object in the table. NULL if no more valid - * objects - * - * DESCRIPTION: Find the next valid object within a name table. - * Useful for implementing NULL-end-of-list loops. - * - ***************************************************************************/ - - -ACPI_NAMESPACE_NODE * -acpi_ns_get_next_valid_object ( - ACPI_NAMESPACE_NODE *node) -{ - - /* If we are at the end of this peer list, return NULL */ - - if (node->flags & ANOBJ_END_OF_PEER_LIST) { - return NULL; - } - - /* Otherwise just return the next peer */ - - return (node->peer); -} - - diff --git a/reactos/drivers/bus/acpi/namespace/nswalk.c b/reactos/drivers/bus/acpi/namespace/nswalk.c deleted file mode 100644 index ddfdecdc97c..00000000000 --- a/reactos/drivers/bus/acpi/namespace/nswalk.c +++ /dev/null @@ -1,269 +0,0 @@ -/****************************************************************************** - * - * Module Name: nswalk - Functions for walking the APCI namespace - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_NAMESPACE - MODULE_NAME ("nswalk") - - -/**************************************************************************** - * - * FUNCTION: Acpi_get_next_object - * - * PARAMETERS: Type - Type of object to be searched for - * Parent - Parent object whose children we are - * getting - * Last_child - Previous child that was found. - * The NEXT child will be returned - * - * RETURN: ACPI_NAMESPACE_NODE - Pointer to the NEXT child or NULL if - * none is found. - * - * DESCRIPTION: Return the next peer object within the namespace. If Handle - * is valid, Scope is ignored. Otherwise, the first object - * within Scope is returned. - * - ****************************************************************************/ - -ACPI_NAMESPACE_NODE * -acpi_ns_get_next_object ( - OBJECT_TYPE_INTERNAL type, - ACPI_NAMESPACE_NODE *parent_node, - ACPI_NAMESPACE_NODE *child_node) -{ - ACPI_NAMESPACE_NODE *next_node = NULL; - - - if (!child_node) { - - /* It's really the parent's _scope_ that we want */ - - if (parent_node->child) { - next_node = parent_node->child; - } - } - - else { - /* Start search at the NEXT object */ - - next_node = acpi_ns_get_next_valid_object (child_node); - } - - - /* If any type is OK, we are done */ - - if (type == ACPI_TYPE_ANY) { - /* Next_node is NULL if we are at the end-of-list */ - - return (next_node); - } - - - /* Must search for the object -- but within this scope only */ - - while (next_node) { - /* If type matches, we are done */ - - if (next_node->type == type) { - return (next_node); - } - - /* Otherwise, move on to the next object */ - - next_node = acpi_ns_get_next_valid_object (next_node); - } - - - /* Not found */ - - return (NULL); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_ns_walk_namespace - * - * PARAMETERS: Type - ACPI_OBJECT_TYPE to search for - * Start_node - Handle in namespace where search begins - * Max_depth - Depth to which search is to reach - * Unlock_before_callback- Whether to unlock the NS before invoking - * the callback routine - * User_function - Called when an object of "Type" is found - * Context - Passed to user function - * - * RETURNS Return value from the User_function if terminated early. - * Otherwise, returns NULL. - * - * DESCRIPTION: Performs a modified depth-first walk of the namespace tree, - * starting (and ending) at the object specified by Start_handle. - * The User_function is called whenever an object that matches - * the type parameter is found. If the user function returns - * a non-zero value, the search is terminated immediately and this - * value is returned to the caller. - * - * The point of this procedure is to provide a generic namespace - * walk routine that can be called from multiple places to - * provide multiple services; the User Function can be tailored - * to each task, whether it is a print function, a compare - * function, etc. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ns_walk_namespace ( - OBJECT_TYPE_INTERNAL type, - ACPI_HANDLE start_node, - u32 max_depth, - u8 unlock_before_callback, - WALK_CALLBACK user_function, - void *context, - void **return_value) -{ - ACPI_STATUS status; - ACPI_NAMESPACE_NODE *child_node; - ACPI_NAMESPACE_NODE *parent_node; - OBJECT_TYPE_INTERNAL child_type; - u32 level; - - - /* Special case for the namespace Root Node */ - - if (start_node == ACPI_ROOT_OBJECT) { - start_node = acpi_gbl_root_node; - } - - - /* Null child means "get first object" */ - - parent_node = start_node; - child_node = 0; - child_type = ACPI_TYPE_ANY; - level = 1; - - /* - * Traverse the tree of objects until we bubble back up to where we - * started. When Level is zero, the loop is done because we have - * bubbled up to (and passed) the original parent handle (Start_entry) - */ - - while (level > 0) { - /* - * Get the next typed object in this scope. Null returned - * if not found - */ - - status = AE_OK; - child_node = acpi_ns_get_next_object (ACPI_TYPE_ANY, - parent_node, - child_node); - - if (child_node) { - /* - * Found an object, Get the type if we are not - * searching for ANY - */ - - if (type != ACPI_TYPE_ANY) { - child_type = child_node->type; - } - - if (child_type == type) { - /* - * Found a matching object, invoke the user - * callback function - */ - - if (unlock_before_callback) { - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - } - - status = user_function (child_node, level, - context, return_value); - - if (unlock_before_callback) { - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - } - - switch (status) { - case AE_OK: - case AE_CTRL_DEPTH: - /* Just keep going */ - break; - - case AE_CTRL_TERMINATE: - /* Exit now, with OK status */ - return (AE_OK); - break; - - default: - /* All others are valid exceptions */ - return (status); - break; - } - } - - /* - * Depth first search: - * Attempt to go down another level in the namespace - * if we are allowed to. Don't go any further if we - * have reached the caller specified maximum depth - * or if the user function has specified that the - * maximum depth has been reached. - */ - - if ((level < max_depth) && (status != AE_CTRL_DEPTH)) { - if (acpi_ns_get_next_object (ACPI_TYPE_ANY, - child_node, 0)) { - /* - * There is at least one child of this - * object, visit the object - */ - level++; - parent_node = child_node; - child_node = 0; - } - } - } - - else { - /* - * No more children in this object (Acpi_ns_get_next_object - * failed), go back upwards in the namespace tree to - * the object's parent. - */ - level--; - child_node = parent_node; - parent_node = acpi_ns_get_parent_object (parent_node); - } - } - - /* Complete walk, not terminated by user function */ - return (AE_OK); -} - - diff --git a/reactos/drivers/bus/acpi/namespace/nsxfname.c b/reactos/drivers/bus/acpi/namespace/nsxfname.c deleted file mode 100644 index 780919c4a63..00000000000 --- a/reactos/drivers/bus/acpi/namespace/nsxfname.c +++ /dev/null @@ -1,294 +0,0 @@ -/****************************************************************************** - * - * Module Name: nsxfname - Public interfaces to the ACPI subsystem - * ACPI Namespace oriented interfaces - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_NAMESPACE - MODULE_NAME ("nsxfname") - - -/**************************************************************************** - * - * FUNCTION: Acpi_get_handle - * - * PARAMETERS: Parent - Object to search under (search scope). - * Path_name - Pointer to an asciiz string containing the - * name - * Ret_handle - Where the return handle is placed - * - * RETURN: Status - * - * DESCRIPTION: This routine will search for a caller specified name in the - * name space. The caller can restrict the search region by - * specifying a non NULL parent. The parent value is itself a - * namespace handle. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_handle ( - ACPI_HANDLE parent, - ACPI_STRING pathname, - ACPI_HANDLE *ret_handle) -{ - ACPI_STATUS status; - ACPI_NAMESPACE_NODE *node = NULL; - ACPI_NAMESPACE_NODE *prefix_node = NULL; - - - if (!ret_handle || !pathname) { - return (AE_BAD_PARAMETER); - } - - /* Convert a parent handle to a prefix node */ - - if (parent) { - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - prefix_node = acpi_ns_convert_handle_to_entry (parent); - if (!prefix_node) { - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (AE_BAD_PARAMETER); - } - - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - } - - /* Special case for root, since we can't search for it */ - - if (STRCMP (pathname, NS_ROOT_PATH) == 0) { - *ret_handle = acpi_ns_convert_entry_to_handle (acpi_gbl_root_node); - return (AE_OK); - } - - /* - * Find the Node and convert to a handle - */ - status = acpi_ns_get_node (pathname, prefix_node, &node); - - *ret_handle = NULL; - if (ACPI_SUCCESS (status)) { - *ret_handle = acpi_ns_convert_entry_to_handle (node); - } - - return (status); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_get_pathname - * - * PARAMETERS: Handle - Handle to be converted to a pathname - * Name_type - Full pathname or single segment - * Ret_path_ptr - Buffer for returned path - * - * RETURN: Pointer to a string containing the fully qualified Name. - * - * DESCRIPTION: This routine returns the fully qualified name associated with - * the Handle parameter. This and the Acpi_pathname_to_handle are - * complementary functions. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_name ( - ACPI_HANDLE handle, - u32 name_type, - ACPI_BUFFER *ret_path_ptr) -{ - ACPI_STATUS status; - ACPI_NAMESPACE_NODE *node; - - - /* Buffer pointer must be valid always */ - - if (!ret_path_ptr || (name_type > ACPI_NAME_TYPE_MAX)) { - return (AE_BAD_PARAMETER); - } - - /* Allow length to be zero and ignore the pointer */ - - if ((ret_path_ptr->length) && - (!ret_path_ptr->pointer)) { - return (AE_BAD_PARAMETER); - } - - if (name_type == ACPI_FULL_PATHNAME) { - /* Get the full pathname (From the namespace root) */ - - status = acpi_ns_handle_to_pathname (handle, &ret_path_ptr->length, - ret_path_ptr->pointer); - return (status); - } - - /* - * Wants the single segment ACPI name. - * Validate handle and convert to an Node - */ - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - node = acpi_ns_convert_handle_to_entry (handle); - if (!node) { - status = AE_BAD_PARAMETER; - goto unlock_and_exit; - } - - /* Check if name will fit in buffer */ - - if (ret_path_ptr->length < PATH_SEGMENT_LENGTH) { - ret_path_ptr->length = PATH_SEGMENT_LENGTH; - status = AE_BUFFER_OVERFLOW; - goto unlock_and_exit; - } - - /* Just copy the ACPI name from the Node and zero terminate it */ - - STRNCPY (ret_path_ptr->pointer, (NATIVE_CHAR *) &node->name, - ACPI_NAME_SIZE); - ((NATIVE_CHAR *) ret_path_ptr->pointer) [ACPI_NAME_SIZE] = 0; - status = AE_OK; - - -unlock_and_exit: - - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (status); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_get_object_info - * - * PARAMETERS: Handle - Object Handle - * Info - Where the info is returned - * - * RETURN: Status - * - * DESCRIPTION: Returns information about an object as gleaned from the - * namespace node and possibly by running several standard - * control methods (Such as in the case of a device.) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_object_info ( - ACPI_HANDLE handle, - ACPI_DEVICE_INFO *info) -{ - DEVICE_ID hid; - DEVICE_ID uid; - ACPI_STATUS status; - u32 device_status = 0; - ACPI_INTEGER address = 0; - ACPI_NAMESPACE_NODE *node; - - - /* Parameter validation */ - - if (!handle || !info) { - return (AE_BAD_PARAMETER); - } - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - node = acpi_ns_convert_handle_to_entry (handle); - if (!node) { - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (AE_BAD_PARAMETER); - } - - info->type = node->type; - info->name = node->name; - - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - - /* - * If not a device, we are all done. - */ - if (info->type != ACPI_TYPE_DEVICE) { - return (AE_OK); - } - - - /* - * Get extra info for ACPI devices only. Run the - * _HID, _UID, _STA, and _ADR methods. Note: none - * of these methods are required, so they may or may - * not be present. The Info->Valid bits are used - * to indicate which methods ran successfully. - */ - - info->valid = 0; - - /* Execute the _HID method and save the result */ - - status = acpi_cm_execute_HID (node, &hid); - if (ACPI_SUCCESS (status)) { - STRNCPY (info->hardware_id, hid.buffer, sizeof(info->hardware_id)); - - info->valid |= ACPI_VALID_HID; - } - - /* Execute the _UID method and save the result */ - - status = acpi_cm_execute_UID (node, &uid); - if (ACPI_SUCCESS (status)) { - STRCPY (info->unique_id, uid.buffer); - - info->valid |= ACPI_VALID_UID; - } - - /* - * Execute the _STA method and save the result - * _STA is not always present - */ - - status = acpi_cm_execute_STA (node, &device_status); - if (ACPI_SUCCESS (status)) { - info->current_status = device_status; - info->valid |= ACPI_VALID_STA; - } - - /* - * Execute the _ADR method and save result if successful - * _ADR is not always present - */ - - status = acpi_cm_evaluate_numeric_object (METHOD_NAME__ADR, - node, &address); - - if (ACPI_SUCCESS (status)) { - info->address = address; - info->valid |= ACPI_VALID_ADR; - } - - return (AE_OK); -} - diff --git a/reactos/drivers/bus/acpi/namespace/nsxfobj.c b/reactos/drivers/bus/acpi/namespace/nsxfobj.c deleted file mode 100644 index 1eaaedfbf7c..00000000000 --- a/reactos/drivers/bus/acpi/namespace/nsxfobj.c +++ /dev/null @@ -1,690 +0,0 @@ -/******************************************************************************* - * - * Module Name: nsxfobj - Public interfaces to the ACPI subsystem - * ACPI Object oriented interfaces - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_NAMESPACE - MODULE_NAME ("nsxfobj") - - -/******************************************************************************* - * - * FUNCTION: Acpi_evaluate_object - * - * PARAMETERS: Handle - Object handle (optional) - * *Pathname - Object pathname (optional) - * **Params - List of parameters to pass to - * method, terminated by NULL. - * Params itself may be NULL - * if no parameters are being - * passed. - * *Return_object - Where to put method's return value (if - * any). If NULL, no value is returned. - * - * RETURN: Status - * - * DESCRIPTION: Find and evaluate the given object, passing the given - * parameters if necessary. One of "Handle" or "Pathname" must - * be valid (non-null) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_evaluate_object ( - ACPI_HANDLE handle, - ACPI_STRING pathname, - ACPI_OBJECT_LIST *param_objects, - ACPI_BUFFER *return_buffer) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT **param_ptr = NULL; - ACPI_OPERAND_OBJECT *return_obj = NULL; - ACPI_OPERAND_OBJECT *object_ptr = NULL; - u32 buffer_space_needed; - u32 user_buffer_length; - u32 count; - u32 i; - u32 param_length; - u32 object_length; - - - /* - * If there are parameters to be passed to the object - * (which must be a control method), the external objects - * must be converted to internal objects - */ - - if (param_objects && param_objects->count) { - /* - * Allocate a new parameter block for the internal objects - * Add 1 to count to allow for null terminated internal list - */ - - count = param_objects->count; - param_length = (count + 1) * sizeof (void *); - object_length = count * sizeof (ACPI_OPERAND_OBJECT); - - param_ptr = acpi_cm_callocate (param_length + /* Parameter List part */ - object_length); /* Actual objects */ - if (!param_ptr) { - return (AE_NO_MEMORY); - } - - object_ptr = (ACPI_OPERAND_OBJECT *) ((u8 *) param_ptr + - param_length); - - /* - * Init the param array of pointers and NULL terminate - * the list - */ - - for (i = 0; i < count; i++) { - param_ptr[i] = &object_ptr[i]; - acpi_cm_init_static_object (&object_ptr[i]); - } - param_ptr[count] = NULL; - - /* - * Convert each external object in the list to an - * internal object - */ - for (i = 0; i < count; i++) { - status = acpi_cm_copy_eobject_to_iobject (¶m_objects->pointer[i], - param_ptr[i]); - - if (ACPI_FAILURE (status)) { - acpi_cm_delete_internal_object_list (param_ptr); - return (status); - } - } - } - - - /* - * Three major cases: - * 1) Fully qualified pathname - * 2) No handle, not fully qualified pathname (error) - * 3) Valid handle - */ - - if ((pathname) && - (acpi_ns_valid_root_prefix (pathname[0]))) { - /* - * The path is fully qualified, just evaluate by name - */ - status = acpi_ns_evaluate_by_name (pathname, param_ptr, &return_obj); - } - - else if (!handle) { - /* - * A handle is optional iff a fully qualified pathname - * is specified. Since we've already handled fully - * qualified names above, this is an error - */ - - - - status = AE_BAD_PARAMETER; - } - - else { - /* - * We get here if we have a handle -- and if we have a - * pathname it is relative. The handle will be validated - * in the lower procedures - */ - - if (!pathname) { - /* - * The null pathname case means the handle is for - * the actual object to be evaluated - */ - status = acpi_ns_evaluate_by_handle (handle, param_ptr, &return_obj); - } - - else { - /* - * Both a Handle and a relative Pathname - */ - status = acpi_ns_evaluate_relative (handle, pathname, param_ptr, - &return_obj); - } - } - - - /* - * If we are expecting a return value, and all went well above, - * copy the return value to an external object. - */ - - if (return_buffer) { - user_buffer_length = return_buffer->length; - return_buffer->length = 0; - - if (return_obj) { - if (VALID_DESCRIPTOR_TYPE (return_obj, ACPI_DESC_TYPE_NAMED)) { - /* - * If we got an Node as a return object, - * this means the object we are evaluating - * has nothing interesting to return (such - * as a mutex, etc.) We return an error - * because these types are essentially - * unsupported by this interface. We - * don't check up front because this makes - * it easier to add support for various - * types at a later date if necessary. - */ - status = AE_TYPE; - return_obj = NULL; /* No need to delete an Node */ - } - - if (ACPI_SUCCESS (status)) { - /* - * Find out how large a buffer is needed - * to contain the returned object - */ - status = acpi_cm_get_object_size (return_obj, - &buffer_space_needed); - if (ACPI_SUCCESS (status)) { - /* - * Check if there is enough room in the - * caller's buffer - */ - - if (user_buffer_length < buffer_space_needed) { - /* - * Caller's buffer is too small, can't - * give him partial results fail the call - * but return the buffer size needed - */ - - return_buffer->length = buffer_space_needed; - status = AE_BUFFER_OVERFLOW; - } - - else { - /* - * We have enough space for the object, build it - */ - status = acpi_cm_copy_iobject_to_eobject (return_obj, - return_buffer); - return_buffer->length = buffer_space_needed; - } - } - } - } - } - - - /* Delete the return and parameter objects */ - - if (return_obj) { - /* - * Delete the internal return object. (Or at least - * decrement the reference count by one) - */ - acpi_cm_remove_reference (return_obj); - } - - /* - * Free the input parameter list (if we created one), - */ - - if (param_ptr) { - /* Free the allocated parameter block */ - - acpi_cm_delete_internal_object_list (param_ptr); - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_get_next_object - * - * PARAMETERS: Type - Type of object to be searched for - * Parent - Parent object whose children we are getting - * Last_child - Previous child that was found. - * The NEXT child will be returned - * Ret_handle - Where handle to the next object is placed - * - * RETURN: Status - * - * DESCRIPTION: Return the next peer object within the namespace. If Handle is - * valid, Scope is ignored. Otherwise, the first object within - * Scope is returned. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_next_object ( - ACPI_OBJECT_TYPE type, - ACPI_HANDLE parent, - ACPI_HANDLE child, - ACPI_HANDLE *ret_handle) -{ - ACPI_STATUS status = AE_OK; - ACPI_NAMESPACE_NODE *node; - ACPI_NAMESPACE_NODE *parent_node = NULL; - ACPI_NAMESPACE_NODE *child_node = NULL; - - - /* Parameter validation */ - - if (type > ACPI_TYPE_MAX) { - return (AE_BAD_PARAMETER); - } - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - /* If null handle, use the parent */ - - if (!child) { - /* Start search at the beginning of the specified scope */ - - parent_node = acpi_ns_convert_handle_to_entry (parent); - if (!parent_node) { - status = AE_BAD_PARAMETER; - goto unlock_and_exit; - } - } - - /* Non-null handle, ignore the parent */ - - else { - /* Convert and validate the handle */ - - child_node = acpi_ns_convert_handle_to_entry (child); - if (!child_node) { - status = AE_BAD_PARAMETER; - goto unlock_and_exit; - } - } - - - /* Internal function does the real work */ - - node = acpi_ns_get_next_object ((OBJECT_TYPE_INTERNAL) type, - parent_node, child_node); - if (!node) { - status = AE_NOT_FOUND; - goto unlock_and_exit; - } - - if (ret_handle) { - *ret_handle = acpi_ns_convert_entry_to_handle (node); - } - - -unlock_and_exit: - - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_get_type - * - * PARAMETERS: Handle - Handle of object whose type is desired - * *Ret_type - Where the type will be placed - * - * RETURN: Status - * - * DESCRIPTION: This routine returns the type associatd with a particular handle - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_type ( - ACPI_HANDLE handle, - ACPI_OBJECT_TYPE *ret_type) -{ - ACPI_NAMESPACE_NODE *node; - - - /* Parameter Validation */ - - if (!ret_type) { - return (AE_BAD_PARAMETER); - } - - /* - * Special case for the predefined Root Node - * (return type ANY) - */ - if (handle == ACPI_ROOT_OBJECT) { - *ret_type = ACPI_TYPE_ANY; - return (AE_OK); - } - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - /* Convert and validate the handle */ - - node = acpi_ns_convert_handle_to_entry (handle); - if (!node) { - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (AE_BAD_PARAMETER); - } - - *ret_type = node->type; - - - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_get_parent - * - * PARAMETERS: Handle - Handle of object whose parent is desired - * Ret_handle - Where the parent handle will be placed - * - * RETURN: Status - * - * DESCRIPTION: Returns a handle to the parent of the object represented by - * Handle. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_parent ( - ACPI_HANDLE handle, - ACPI_HANDLE *ret_handle) -{ - ACPI_NAMESPACE_NODE *node; - ACPI_STATUS status = AE_OK; - - - /* No trace macro, too verbose */ - - - if (!ret_handle) { - return (AE_BAD_PARAMETER); - } - - /* Special case for the predefined Root Node (no parent) */ - - if (handle == ACPI_ROOT_OBJECT) { - return (AE_NULL_ENTRY); - } - - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - /* Convert and validate the handle */ - - node = acpi_ns_convert_handle_to_entry (handle); - if (!node) { - status = AE_BAD_PARAMETER; - goto unlock_and_exit; - } - - - /* Get the parent entry */ - - *ret_handle = - acpi_ns_convert_entry_to_handle (acpi_ns_get_parent_object (node)); - - /* Return exeption if parent is null */ - - if (!acpi_ns_get_parent_object (node)) { - status = AE_NULL_ENTRY; - } - - -unlock_and_exit: - - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_walk_namespace - * - * PARAMETERS: Type - ACPI_OBJECT_TYPE to search for - * Start_object - Handle in namespace where search begins - * Max_depth - Depth to which search is to reach - * User_function - Called when an object of "Type" is found - * Context - Passed to user function - * Return_value - Location where return value of - * User_function is put if terminated early - * - * RETURNS Return value from the User_function if terminated early. - * Otherwise, returns NULL. - * - * DESCRIPTION: Performs a modified depth-first walk of the namespace tree, - * starting (and ending) at the object specified by Start_handle. - * The User_function is called whenever an object that matches - * the type parameter is found. If the user function returns - * a non-zero value, the search is terminated immediately and this - * value is returned to the caller. - * - * The point of this procedure is to provide a generic namespace - * walk routine that can be called from multiple places to - * provide multiple services; the User Function can be tailored - * to each task, whether it is a print function, a compare - * function, etc. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_walk_namespace ( - ACPI_OBJECT_TYPE type, - ACPI_HANDLE start_object, - u32 max_depth, - WALK_CALLBACK user_function, - void *context, - void **return_value) -{ - ACPI_STATUS status; - - - /* Parameter validation */ - - if ((type > ACPI_TYPE_MAX) || - (!max_depth) || - (!user_function)) { - return (AE_BAD_PARAMETER); - } - - /* - * Lock the namespace around the walk. - * The namespace will be unlocked/locked around each call - * to the user function - since this function - * must be allowed to make Acpi calls itself. - */ - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - status = acpi_ns_walk_namespace ((OBJECT_TYPE_INTERNAL) type, - start_object, max_depth, - NS_WALK_UNLOCK, - user_function, context, - return_value); - - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ns_get_device_callback - * - * PARAMETERS: Callback from Acpi_get_device - * - * RETURN: Status - * - * DESCRIPTION: Takes callbacks from Walk_namespace and filters out all non- - * present devices, or if they specified a HID, it filters based - * on that. - * - ******************************************************************************/ - -static ACPI_STATUS -acpi_ns_get_device_callback ( - ACPI_HANDLE obj_handle, - u32 nesting_level, - void *context, - void **return_value) -{ - ACPI_STATUS status; - ACPI_NAMESPACE_NODE *node; - u32 flags; - DEVICE_ID device_id; - ACPI_GET_DEVICES_INFO *info; - - - info = context; - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - - node = acpi_ns_convert_handle_to_entry (obj_handle); - - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - - if (!node) { - return (AE_BAD_PARAMETER); - } - - /* - * Run _STA to determine if device is present - */ - - status = acpi_cm_execute_STA (node, &flags); - if (ACPI_FAILURE (status)) { - return (status); - } - - if (!(flags & 0x01)) { - /* don't return at the device or children of the device if not there */ - - return (AE_CTRL_DEPTH); - } - - /* - * Filter based on device HID - */ - if (info->hid != NULL) { - status = acpi_cm_execute_HID (node, &device_id); - - if (status == AE_NOT_FOUND) { - return (AE_OK); - } - - else if (ACPI_FAILURE (status)) { - return (status); - } - - if (STRNCMP (device_id.buffer, info->hid, sizeof (device_id.buffer)) != 0) { - return (AE_OK); - } - } - - info->user_function (obj_handle, nesting_level, info->context, return_value); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_get_devices - * - * PARAMETERS: HID - HID to search for. Can be NULL. - * User_function - Called when a matching object is found - * Context - Passed to user function - * Return_value - Location where return value of - * User_function is put if terminated early - * - * RETURNS Return value from the User_function if terminated early. - * Otherwise, returns NULL. - * - * DESCRIPTION: Performs a modified depth-first walk of the namespace tree, - * starting (and ending) at the object specified by Start_handle. - * The User_function is called whenever an object that matches - * the type parameter is found. If the user function returns - * a non-zero value, the search is terminated immediately and this - * value is returned to the caller. - * - * This is a wrapper for Walk_namespace, but the callback performs - * additional filtering. Please see Acpi_get_device_callback. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_devices ( - NATIVE_CHAR *HID, - WALK_CALLBACK user_function, - void *context, - void **return_value) -{ - ACPI_STATUS status; - ACPI_GET_DEVICES_INFO info; - - - /* Parameter validation */ - - if (!user_function) { - return (AE_BAD_PARAMETER); - } - - /* - * We're going to call their callback from OUR callback, so we need - * to know what it is, and their context parameter. - */ - info.context = context; - info.user_function = user_function; - info.hid = HID; - - /* - * Lock the namespace around the walk. - * The namespace will be unlocked/locked around each call - * to the user function - since this function - * must be allowed to make Acpi calls itself. - */ - - acpi_cm_acquire_mutex (ACPI_MTX_NAMESPACE); - status = acpi_ns_walk_namespace (ACPI_TYPE_DEVICE, - ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, - NS_WALK_UNLOCK, - acpi_ns_get_device_callback, &info, - return_value); - - acpi_cm_release_mutex (ACPI_MTX_NAMESPACE); - - return (status); -} diff --git a/reactos/drivers/bus/acpi/ospm/acpienum.c b/reactos/drivers/bus/acpi/ospm/acpienum.c deleted file mode 100644 index 6edac4e1d44..00000000000 --- a/reactos/drivers/bus/acpi/ospm/acpienum.c +++ /dev/null @@ -1,191 +0,0 @@ -/* $Id$ - * - * PROJECT: ReactOS ACPI bus driver - * FILE: acpi/ospm/acpienum.c - * PURPOSE: ACPI namespace enumerator - * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) - * UPDATE HISTORY: - * 01-05-2001 CSH Created - */ -#include - -#define NDEBUG -#include - - -#ifndef NDEBUG -static void -bm_print1 ( - BM_NODE *node, - u32 flags) -{ - ACPI_BUFFER buffer; - BM_DEVICE *device = NULL; - char *type_string = NULL; - - if (!node) - { - return; - } - - device = &(node->device); - - if (flags & BM_PRINT_PRESENT) - { - if (!BM_DEVICE_PRESENT(device)) - { - return; - } - } - - buffer.length = 256; - buffer.pointer = acpi_os_callocate(buffer.length); - if (!buffer.pointer) - { - return; - } - - acpi_get_name(device->acpi_handle, ACPI_FULL_PATHNAME, &buffer); - - switch(device->id.type) - { - case BM_TYPE_SYSTEM: - type_string = "System"; - break; - - case BM_TYPE_SCOPE: - type_string = "Scope"; - break; - - case BM_TYPE_PROCESSOR: - type_string = "Processor"; - break; - - case BM_TYPE_THERMAL_ZONE: - type_string = "ThermalZone"; - break; - - case BM_TYPE_POWER_RESOURCE: - type_string = "PowerResource"; - break; - - case BM_TYPE_FIXED_BUTTON: - type_string = "Button"; - break; - - case BM_TYPE_DEVICE: - type_string = "Device"; - break; - - default: - type_string = "Unknown"; - break; - } - - if (!(flags & BM_PRINT_GROUP)) - { - DbgPrint("+------------------------------------------------------------\n"); - } - - DbgPrint("%s[0x%02x] hid[%s] %s\n", type_string, device->handle, device->id.hid, buffer.pointer); - DbgPrint(" acpi_handle[0x%08x] flags[0x%02x] status[0x%02x]\n", device->acpi_handle, device->flags, device->status); - - if (flags & BM_PRINT_IDENTIFICATION) - { - DbgPrint(" identification: uid[%s] adr[0x%08x]\n", device->id.uid, device->id.adr); - } - - if (flags & BM_PRINT_LINKAGE) - { - DbgPrint(" linkage: this[%p] parent[%p] next[%p]\n", node, node->parent, node->next); - DbgPrint(" scope.head[%p] scope.tail[%p]\n", node->scope.head, node->scope.tail); - } - - if (flags & BM_PRINT_POWER) - { - DbgPrint(" power: state[D%d] flags[0x%08X]\n", device->power.state, device->power.flags); - DbgPrint(" S0[0x%02x] S1[0x%02x] S2[0x%02x]\n", device->power.dx_supported[0], device->power.dx_supported[1], device->power.dx_supported[2]); - DbgPrint(" S3[0x%02x] S4[0x%02x] S5[0x%02x]\n", device->power.dx_supported[3], device->power.dx_supported[4], device->power.dx_supported[5]); - } - - if (!(flags & BM_PRINT_GROUP)) - { - DbgPrint("+------------------------------------------------------------\n"); - } - - acpi_os_free(buffer.pointer); - - return; -} -#endif - - -NTSTATUS -ACPIEnumerateDevices(PFDO_DEVICE_EXTENSION DeviceExtension) -{ - BM_HANDLE_LIST HandleList; - PACPI_DEVICE AcpiDevice; - ACPI_STATUS AcpiStatus; - BM_DEVICE_ID Criteria; - BM_NODE *Node; - KIRQL OldIrql; - ULONG i; - - DPRINT("Called\n"); - - RtlZeroMemory(&Criteria, sizeof(BM_DEVICE_ID)); - Criteria.type = BM_TYPE_ALL; - - AcpiStatus = bm_search(BM_HANDLE_ROOT, &Criteria, &HandleList); - if (ACPI_SUCCESS(AcpiStatus)) - { - DPRINT("Got %d devices\n", HandleList.count); - - for (i = 0; i < HandleList.count; i++) - { - AcpiStatus = bm_get_node(HandleList.handles[i], 0, &Node); - if (ACPI_SUCCESS(AcpiStatus)) - { - DPRINT("Got BM node information: (Node 0x%X)\n", Node); - - if ((Node->device.flags & BM_FLAGS_IDENTIFIABLE) && - (Node->device.id.hid[0] != 0)) - { -#ifndef NDEBUG - bm_print1(Node, BM_PRINT_ALL - BM_PRINT_PRESENT); -#endif - - AcpiDevice = (PACPI_DEVICE)ExAllocatePool(NonPagedPool, - sizeof(ACPI_DEVICE)); - if (AcpiDevice == NULL) - { - return STATUS_INSUFFICIENT_RESOURCES; - } - - RtlZeroMemory(AcpiDevice, sizeof(ACPI_DEVICE)); - - AcpiDevice->Pdo = NULL; - AcpiDevice->BmHandle = HandleList.handles[i]; - - KeAcquireSpinLock(&DeviceExtension->DeviceListLock, &OldIrql); - InsertHeadList(&DeviceExtension->DeviceListHead, - &AcpiDevice->DeviceListEntry); - DeviceExtension->DeviceListCount++; - KeReleaseSpinLock(&DeviceExtension->DeviceListLock, OldIrql); - } - } - else - { - DPRINT("Could not get BM node\n"); - } - } - } - else - { - DPRINT("Got no devices (Status 0x%X)\n", AcpiStatus); - } - - return STATUS_SUCCESS; -} - -/* EOF */ diff --git a/reactos/drivers/bus/acpi/ospm/acpisys.c b/reactos/drivers/bus/acpi/ospm/acpisys.c deleted file mode 100644 index 148209dc233..00000000000 --- a/reactos/drivers/bus/acpi/ospm/acpisys.c +++ /dev/null @@ -1,183 +0,0 @@ -/* $Id$ - * - * PROJECT: ReactOS ACPI bus driver - * FILE: acpi/ospm/acpisys.c - * PURPOSE: Driver entry - * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) - * UPDATE HISTORY: - * 01-05-2001 CSH Created - */ -#include - -#define NDEBUG -#include - -NTSTATUS -NTAPI -DriverEntry( - IN PDRIVER_OBJECT DriverObject, - IN PUNICODE_STRING RegistryPath -); - -#ifdef ALLOC_PRAGMA - -// Make the initialization routines discardable, so that they -// don't waste space - -#pragma alloc_text(init, DriverEntry) - -#endif /* ALLOC_PRAGMA */ - - -NTSTATUS -NTAPI -ACPIDispatchDeviceControl( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) -{ - PIO_STACK_LOCATION IrpSp; - NTSTATUS Status; - - DPRINT("Called. IRP is at (0x%X)\n", Irp); - - Irp->IoStatus.Information = 0; - - IrpSp = IoGetCurrentIrpStackLocation(Irp); - switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) { - default: - DPRINT("Unknown IOCTL 0x%X\n", IrpSp->Parameters.DeviceIoControl.IoControlCode); - Status = STATUS_NOT_IMPLEMENTED; - break; - } - - if (Status != STATUS_PENDING) { - Irp->IoStatus.Status = Status; - - DPRINT("Completing IRP at 0x%X\n", Irp); - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } - - DPRINT("Leaving. Status 0x%X\n", Status); - - return Status; -} - - -NTSTATUS -NTAPI -ACPIPnpControl( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) -/* - * FUNCTION: Handle Plug and Play IRPs - * ARGUMENTS: - * DeviceObject = Pointer to PDO or FDO - * Irp = Pointer to IRP that should be handled - * RETURNS: - * Status - */ -{ - PCOMMON_DEVICE_EXTENSION DeviceExtension; - NTSTATUS Status; - - DPRINT("Called\n"); - - DeviceExtension = (PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - if (DeviceExtension->IsFDO) { - Status = FdoPnpControl(DeviceObject, Irp); - } else { - Status = PdoPnpControl(DeviceObject, Irp); - } - - return Status; -} - - -NTSTATUS -NTAPI -ACPIPowerControl( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) -{ - PCOMMON_DEVICE_EXTENSION DeviceExtension; - NTSTATUS Status; - - DPRINT("Called\n"); - - DeviceExtension = (PCOMMON_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - if (DeviceExtension->IsFDO) { - Status = FdoPowerControl(DeviceObject, Irp); - } else { - Status = PdoPowerControl(DeviceObject, Irp); - } - - return Status; -} - - -NTSTATUS -NTAPI -ACPIAddDevice( - IN PDRIVER_OBJECT DriverObject, - IN PDEVICE_OBJECT PhysicalDeviceObject) -{ - PFDO_DEVICE_EXTENSION DeviceExtension; - PDEVICE_OBJECT Fdo; - NTSTATUS Status; - - DPRINT("Called\n"); - - if (PhysicalDeviceObject == NULL) - return STATUS_SUCCESS; - - Status = IoCreateDevice(DriverObject, - sizeof(FDO_DEVICE_EXTENSION), - NULL, - FILE_DEVICE_ACPI, - FILE_DEVICE_SECURE_OPEN, - TRUE, - &Fdo); - if (!NT_SUCCESS(Status)) - { - DPRINT("IoCreateDevice() failed with status 0x%X\n", Status); - return Status; - } - - DeviceExtension = (PFDO_DEVICE_EXTENSION)Fdo->DeviceExtension; - - DeviceExtension->Pdo = PhysicalDeviceObject; - DeviceExtension->Common.IsFDO = TRUE; - - DeviceExtension->Common.Ldo = - IoAttachDeviceToDeviceStack(Fdo, PhysicalDeviceObject); - - DeviceExtension->State = dsStopped; - - Fdo->Flags &= ~DO_DEVICE_INITIALIZING; - - DPRINT("Done AddDevice\n"); - - return STATUS_SUCCESS; -} - - -NTSTATUS -NTAPI -DriverEntry( - IN PDRIVER_OBJECT DriverObject, - IN PUNICODE_STRING RegistryPath) -{ - DPRINT("Advanced Configuration and Power Interface Bus Driver\n"); - - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH) ACPIDispatchDeviceControl; - DriverObject->MajorFunction[IRP_MJ_PNP] = (PDRIVER_DISPATCH) ACPIPnpControl; - DriverObject->MajorFunction[IRP_MJ_POWER] = (PDRIVER_DISPATCH) ACPIPowerControl; - DriverObject->DriverExtension->AddDevice = ACPIAddDevice; - - return STATUS_SUCCESS; -} - -/* EOF */ diff --git a/reactos/drivers/bus/acpi/ospm/bn.c b/reactos/drivers/bus/acpi/ospm/bn.c deleted file mode 100644 index 6df7113a533..00000000000 --- a/reactos/drivers/bus/acpi/ospm/bn.c +++ /dev/null @@ -1,599 +0,0 @@ -/***************************************************************************** - * - * Module Name: bn.c - * $Revision: 1.2 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 Andrew Grover - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Plxxe, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - -#define _COMPONENT ACPI_BUTTON - MODULE_NAME ("bn") - - -static struct proc_dir_entry *bn_proc_root = NULL; - - -/***************************************************************************** - * Internal Functions - *****************************************************************************/ - -/***************************************************************************** - * - * FUNCTION: bn_print - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: Prints out information on a specific button. - * - ****************************************************************************/ - -void -bn_print ( - BN_CONTEXT *button) -{ -#ifdef ACPI_DEBUG - ACPI_BUFFER buffer; -#endif /*ACPI_DEBUG*/ - - if (!button) { - return; - } - - switch (button->type) { - - case BN_TYPE_POWER_BUTTON: - case BN_TYPE_POWER_BUTTON_FIXED: - acpi_os_printf("Power Button: found\n"); - break; - - case BN_TYPE_SLEEP_BUTTON: - case BN_TYPE_SLEEP_BUTTON_FIXED: - acpi_os_printf("Sleep Button: found\n"); - break; - - case BN_TYPE_LID_SWITCH: - acpi_os_printf("Lid Switch: found\n"); - break; - } - -#ifdef ACPI_DEBUG - buffer.length = 256; - buffer.pointer = acpi_os_callocate(buffer.length); - if (!buffer.pointer) { - return; - } - - /* - * Get the full pathname for this ACPI object. - */ - acpi_get_name(button->acpi_handle, ACPI_FULL_PATHNAME, &buffer); - - /* - * Print out basic button information. - */ - DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n")); - - switch (button->type) { - - case BN_TYPE_POWER_BUTTON: - case BN_TYPE_POWER_BUTTON_FIXED: - DEBUG_PRINT(ACPI_INFO, ("| PowerButton[0x%02x]|[%p] %s\n", button->device_handle, button->acpi_handle, buffer.pointer)); - break; - - case BN_TYPE_SLEEP_BUTTON: - case BN_TYPE_SLEEP_BUTTON_FIXED: - DEBUG_PRINT(ACPI_INFO, ("| SleepButton[0x%02x]|[%p] %s\n", button->device_handle, button->acpi_handle, buffer.pointer)); - break; - - case BN_TYPE_LID_SWITCH: - DEBUG_PRINT(ACPI_INFO, ("| LidSwitch[0x%02x]|[%p] %s\n", button->device_handle, button->acpi_handle, buffer.pointer)); - break; - } - - DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n")); - - acpi_os_free(buffer.pointer); -#endif /*ACPI_DEBUG*/ - - return; -} - - -/**************************************************************************** - * - * FUNCTION: bn_add_device - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bn_add_device( - BM_HANDLE device_handle, - void **context) -{ - ACPI_STATUS status = AE_OK; - BM_DEVICE *device = NULL; - BN_CONTEXT *button = NULL; - - FUNCTION_TRACE("bn_add_device"); - - DEBUG_PRINT(ACPI_INFO, ("Adding button device [0x%02x].\n", device_handle)); - - if (!context || *context) { - DEBUG_PRINT(ACPI_ERROR, ("Invalid context.\n")); - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - /* - * Get information on this device. - */ - status = bm_get_device_info( device_handle, &device ); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - /* - * Allocate a new BN_CONTEXT structure. - */ - button = acpi_os_callocate(sizeof(BN_CONTEXT)); - if (!button) { - return_ACPI_STATUS(AE_NO_MEMORY); - } - - button->device_handle = device->handle; - button->acpi_handle = device->acpi_handle; - - /* - * Power Button? - * ------------- - * Either fixed-feature or generic (namespace) types. - */ - if (strncmp(device->id.hid, BN_HID_POWER_BUTTON, - sizeof(BM_DEVICE_HID)) == 0) { - - if (device->id.type == BM_TYPE_FIXED_BUTTON) { - - button->type = BN_TYPE_POWER_BUTTON_FIXED; - - /* Register for fixed-feature events. */ - status = acpi_install_fixed_event_handler( - ACPI_EVENT_POWER_BUTTON, bn_notify_fixed, - (void*)button); - } - else { - button->type = BN_TYPE_POWER_BUTTON; - } - - //proc_mkdir(BN_PROC_POWER_BUTTON, bn_proc_root); - - } - - /* - * Sleep Button? - * ------------- - * Either fixed-feature or generic (namespace) types. - */ - else if (strncmp( device->id.hid, BN_HID_SLEEP_BUTTON, - sizeof(BM_DEVICE_HID)) == 0) { - - if (device->id.type == BM_TYPE_FIXED_BUTTON) { - - button->type = BN_TYPE_SLEEP_BUTTON_FIXED; - - /* Register for fixed-feature events. */ - status = acpi_install_fixed_event_handler( - ACPI_EVENT_SLEEP_BUTTON, bn_notify_fixed, - (void*)button); - } - else { - button->type = BN_TYPE_SLEEP_BUTTON; - } - - //proc_mkdir(BN_PROC_SLEEP_BUTTON, bn_proc_root); - } - - /* - * LID Switch? - * ----------- - */ - else if (strncmp( device->id.hid, BN_HID_LID_SWITCH, - sizeof(BM_DEVICE_HID)) == 0) { - - button->type = BN_TYPE_LID_SWITCH; - - //proc_mkdir(BN_PROC_LID_SWITCH, bn_proc_root); - } - - *context = button; - - bn_print(button); - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bn_remove_device - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bn_remove_device( - void **context) -{ - ACPI_STATUS status = AE_OK; - BN_CONTEXT *button = NULL; - - FUNCTION_TRACE("bn_remove_device"); - - if (!context || !*context) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - button = (BN_CONTEXT*)*context; - - DEBUG_PRINT(ACPI_INFO, ("Removing button device [0x%02x].\n", button->device_handle)); - - /* - * Remove the /proc entry for this button. - */ - switch (button->type) { - - case BN_TYPE_POWER_BUTTON: - case BN_TYPE_POWER_BUTTON_FIXED: - /* Unregister for fixed-feature events. */ - status = acpi_remove_fixed_event_handler( - ACPI_EVENT_POWER_BUTTON, bn_notify_fixed); - //remove_proc_entry(BN_PROC_POWER_BUTTON, bn_proc_root); - break; - - case BN_TYPE_SLEEP_BUTTON: - case BN_TYPE_SLEEP_BUTTON_FIXED: - /* Unregister for fixed-feature events. */ - status = acpi_remove_fixed_event_handler( - ACPI_EVENT_SLEEP_BUTTON, bn_notify_fixed); - //remove_proc_entry(BN_PROC_SLEEP_BUTTON, bn_proc_root); - break; - - case BN_TYPE_LID_SWITCH: - //remove_proc_entry(BN_PROC_LID_SWITCH, bn_proc_root); - break; - } - - acpi_os_free(button); - - *context = NULL; - - return_ACPI_STATUS(status); -} - - -/***************************************************************************** - * External Functions - *****************************************************************************/ - -/***************************************************************************** - * - * FUNCTION: bn_initialize - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - - ****************************************************************************/ - -ACPI_STATUS -bn_initialize (void) -{ - ACPI_STATUS status = AE_OK; - BM_DEVICE_ID criteria; - BM_DRIVER driver; - - FUNCTION_TRACE("bn_initialize"); - - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); - - driver.notify = &bn_notify; - driver.request = &bn_request; - - /* - * Create button's root /proc entry. - */ - //bn_proc_root = proc_mkdir(BN_PROC_ROOT, bm_proc_root); - //if (!bn_proc_root) { -// return_ACPI_STATUS(AE_ERROR); -// } - - /* - * Register for power buttons. - */ - MEMCPY(criteria.hid, BN_HID_POWER_BUTTON, sizeof(BN_HID_POWER_BUTTON)); - status = bm_register_driver(&criteria, &driver); - - /* - * Register for sleep buttons. - */ - MEMCPY(criteria.hid, BN_HID_SLEEP_BUTTON, sizeof(BN_HID_SLEEP_BUTTON)); - status = bm_register_driver(&criteria, &driver); - - /* - * Register for LID switches. - */ - MEMCPY(criteria.hid, BN_HID_LID_SWITCH, sizeof(BN_HID_LID_SWITCH)); - status = bm_register_driver(&criteria, &driver); - - if (status == AE_NOT_FOUND) - status = AE_OK; - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bn_terminate - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bn_terminate (void) -{ - ACPI_STATUS status = AE_OK; - BM_DEVICE_ID criteria; - BM_DRIVER driver; - - FUNCTION_TRACE("bn_terminate"); - - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); - - driver.notify = &bn_notify; - driver.request = &bn_request; - - /* - * Unregister for power buttons. - */ - MEMCPY(criteria.hid, BN_HID_POWER_BUTTON, sizeof(BN_HID_POWER_BUTTON)); - status = bm_unregister_driver(&criteria, &driver); - - /* - * Unregister for sleep buttons. - */ - MEMCPY(criteria.hid, BN_HID_SLEEP_BUTTON, sizeof(BN_HID_SLEEP_BUTTON)); - status = bm_unregister_driver(&criteria, &driver); - - /* - * Unregister for LID switches. - */ - MEMCPY(criteria.hid, BN_HID_LID_SWITCH, sizeof(BN_HID_LID_SWITCH)); - status = bm_unregister_driver(&criteria, &driver); - - /* - * Remove button's root /proc entry. - */ - if (bn_proc_root) { - //remove_proc_entry(BN_PROC_ROOT, bm_proc_root); - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bn_notify_fixed - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bn_notify_fixed ( - void *context) -{ - ACPI_STATUS status = AE_OK; - BN_CONTEXT *button = NULL; - - FUNCTION_TRACE("bn_notify_fixed"); - - if (!context) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - button = (BN_CONTEXT*)context; - - DbgPrint("Fixed button status change event detected.\n"); - - switch (button->type) { - - case BN_TYPE_POWER_BUTTON_FIXED: - DEBUG_PRINT(ACPI_INFO, ("Fixed-feature button status change event detected.\n")); - /*bm_generate_event(button->device_handle, BN_PROC_ROOT, - BN_PROC_POWER_BUTTON, BN_NOTIFY_STATUS_CHANGE, 0);*/ - break; - - case BN_TYPE_SLEEP_BUTTON_FIXED: - DEBUG_PRINT(ACPI_INFO, ("Fixed-feature button status change event detected.\n")); - /*bm_generate_event(button->device_handle, BN_PROC_ROOT, - BN_PROC_SLEEP_BUTTON, BN_NOTIFY_STATUS_CHANGE, 0);*/ - break; - - default: - DEBUG_PRINT(ACPI_INFO, ("Unsupported fixed-feature event detected.\n")); - status = AE_SUPPORT; - break; - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bn_notify - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bn_notify ( - BM_NOTIFY notify_type, - BM_HANDLE device_handle, - void **context) -{ - ACPI_STATUS status = AE_OK; - - FUNCTION_TRACE("bn_notify"); - - if (!context) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - switch (notify_type) { - case BM_NOTIFY_DEVICE_ADDED: - status = bn_add_device(device_handle, context); - break; - - case BM_NOTIFY_DEVICE_REMOVED: - status = bn_remove_device(context); - break; - - case BN_NOTIFY_STATUS_CHANGE: - DEBUG_PRINT(ACPI_INFO, ("Button status change event detected.\n")); - - DbgPrint("Button status change event detected.\n"); - - if (!context || !*context) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - switch(((BN_CONTEXT*)*context)->type) { - - case BN_TYPE_POWER_BUTTON: - case BN_TYPE_POWER_BUTTON_FIXED: - /*bm_generate_event(device_handle, BN_PROC_ROOT, - BN_PROC_POWER_BUTTON, notify_type, 0);*/ - break; - - case BN_TYPE_SLEEP_BUTTON: - case BN_TYPE_SLEEP_BUTTON_FIXED: - /*bm_generate_event(device_handle, BN_PROC_ROOT, - BN_PROC_SLEEP_BUTTON, notify_type, 0);*/ - break; - - case BN_TYPE_LID_SWITCH: - /*bm_generate_event(device_handle, BN_PROC_ROOT, - BN_PROC_LID_SWITCH, notify_type, 0);*/ - break; - - default: - status = AE_SUPPORT; - break; - } - - break; - - default: - status = AE_SUPPORT; - break; - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bn_request - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bn_request ( - BM_REQUEST *request, - void *context) -{ - ACPI_STATUS status = AE_OK; - - FUNCTION_TRACE("bn_request"); - - /* - * Must have a valid request structure and context. - */ - if (!request || !context) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - /* - * Handle Request: - * --------------- - */ - switch (request->command) { - - default: - status = AE_SUPPORT; - break; - } - - request->status = status; - - return_ACPI_STATUS(status); -} diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bm.c b/reactos/drivers/bus/acpi/ospm/busmgr/bm.c deleted file mode 100644 index 42253ae36dc..00000000000 --- a/reactos/drivers/bus/acpi/ospm/busmgr/bm.c +++ /dev/null @@ -1,1047 +0,0 @@ -/****************************************************************************** - * - * Module Name: bm.c - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 Andrew Grover - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - - -#define _COMPONENT ACPI_BUS_MANAGER - MODULE_NAME ("bm") - - -/**************************************************************************** - * Globals - ****************************************************************************/ - -extern FADT_DESCRIPTOR_REV2 acpi_fadt; -/* TODO: Make dynamically sizeable. */ -static BM_NODE_LIST node_list; - - -/**************************************************************************** - * Internal Functions - ****************************************************************************/ - -/**************************************************************************** - * - * FUNCTION: bm_print - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -void -bm_print ( - BM_NODE *node, - u32 flags) -{ - ACPI_BUFFER buffer; - BM_DEVICE *device = NULL; - char *type_string = NULL; - - if (!node) { - return; - } - - device = &(node->device); - - if (flags & BM_PRINT_PRESENT) { - if (!BM_DEVICE_PRESENT(device)) { - return; - } - } - - buffer.length = 256; - buffer.pointer = acpi_os_callocate(buffer.length); - if (!buffer.pointer) { - return; - } - - acpi_get_name(device->acpi_handle, ACPI_FULL_PATHNAME, &buffer); - - switch(device->id.type) { - case BM_TYPE_SYSTEM: - type_string = "System"; - break; - case BM_TYPE_SCOPE: - type_string = "Scope"; - break; - case BM_TYPE_PROCESSOR: - type_string = "Processor"; - break; - case BM_TYPE_THERMAL_ZONE: - type_string = "ThermalZone"; - break; - case BM_TYPE_POWER_RESOURCE: - type_string = "PowerResource"; - break; - case BM_TYPE_FIXED_BUTTON: - type_string = "Button"; - break; - case BM_TYPE_DEVICE: - type_string = "Device"; - break; - default: - type_string = "Unknown"; - break; - } - - if (!(flags & BM_PRINT_GROUP)) { - DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n")); - } - - DEBUG_PRINT(ACPI_INFO, ("%s[0x%02x] hid[%s] %s\n", type_string, device->handle, device->id.hid, buffer.pointer)); - DEBUG_PRINT(ACPI_INFO, (" acpi_handle[0x%08x] flags[0x%02x] status[0x%02x]\n", device->acpi_handle, device->flags, device->status)); - - if (flags & BM_PRINT_IDENTIFICATION) { - DEBUG_PRINT(ACPI_INFO, (" identification: uid[%s] adr[0x%08x]\n", device->id.uid, device->id.adr)); - } - - if (flags & BM_PRINT_LINKAGE) { - DEBUG_PRINT(ACPI_INFO, (" linkage: this[%p] parent[%p] next[%p]\n", node, node->parent, node->next)); - DEBUG_PRINT(ACPI_INFO, (" scope.head[%p] scope.tail[%p]\n", node->scope.head, node->scope.tail)); - } - - if (flags & BM_PRINT_POWER) { - DEBUG_PRINT(ACPI_INFO, (" power: state[D%d] flags[0x%08X]\n", device->power.state, device->power.flags)); - DEBUG_PRINT(ACPI_INFO, (" S0[0x%02x] S1[0x%02x] S2[0x%02x]\n", device->power.dx_supported[0], device->power.dx_supported[1], device->power.dx_supported[2])); - DEBUG_PRINT(ACPI_INFO, (" S3[0x%02x] S4[0x%02x] S5[0x%02x]\n", device->power.dx_supported[3], device->power.dx_supported[4], device->power.dx_supported[5])); - } - - if (!(flags & BM_PRINT_GROUP)) { - DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n")); - } - - acpi_os_free(buffer.pointer); - - return; -} - - -/**************************************************************************** - * - * FUNCTION: bm_print_hierarchy - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -void -bm_print_hierarchy (void) -{ - u32 i = 0; - - FUNCTION_TRACE("bm_print_hierarchy"); - - DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n")); - - for (i = 0; i < node_list.count; i++) { - bm_print(node_list.nodes[i], BM_PRINT_GROUP | BM_PRINT_PRESENT); - } - - DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n")); - - return_VOID; -} - - -/**************************************************************************** - * - * FUNCTION: bm_get_status - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_get_status ( - BM_DEVICE *device) -{ - ACPI_STATUS status = AE_OK; - - if (!device) { - return AE_BAD_PARAMETER; - } - - device->status = BM_STATUS_UNKNOWN; - - /* - * Dynamic Status? - * --------------- - * If _STA isn't present we just return the default status. - */ - if (!(device->flags & BM_FLAGS_DYNAMIC_STATUS)) { - device->status = BM_STATUS_DEFAULT; - return AE_OK; - } - - /* - * Evaluate _STA: - * -------------- - */ - status = bm_evaluate_simple_integer(device->acpi_handle, "_STA", - &(device->status)); - - return status; -} - - -/**************************************************************************** - * - * FUNCTION: bm_get_identification - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_get_identification ( - BM_DEVICE *device) -{ - ACPI_STATUS status = AE_OK; - ACPI_DEVICE_INFO info; - - if (!device) { - return AE_BAD_PARAMETER; - } - - if (!(device->flags & BM_FLAGS_IDENTIFIABLE)) { - return AE_OK; - } - - MEMSET(&(device->id.uid), 0, sizeof(device->id.uid)); - MEMSET(&(device->id.hid), 0, sizeof(device->id.hid)); - device->id.adr = BM_ADDRESS_UNKNOWN; - - /* - * Get Object Info: - * ---------------- - * Evalute _UID, _HID, _ADR, and _STA... - */ - status = acpi_get_object_info(device->acpi_handle, &info); - if (ACPI_FAILURE(status)) { - return status; - } - - if (info.valid & ACPI_VALID_UID) { - MEMCPY((void*)device->id.uid, (void*)info.unique_id, - sizeof(BM_DEVICE_UID)); - } - - if (info.valid & ACPI_VALID_HID) { - MEMCPY((void*)device->id.hid, (void*)info.hardware_id, - sizeof(BM_DEVICE_HID)); - } - - if (info.valid & ACPI_VALID_ADR) { - device->id.adr = info.address; - } - - return status; -} - - -/**************************************************************************** - * - * FUNCTION: bm_get_flags - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_get_flags ( - BM_DEVICE *device) -{ - ACPI_HANDLE acpi_handle = NULL; - - if (!device) { - return AE_BAD_PARAMETER; - } - - device->flags = BM_FLAGS_UNKNOWN; - - switch (device->id.type) { - - case BM_TYPE_DEVICE: - - /* - * Presence of _DCK indicates a docking station. - */ - if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, - "_DCK", &acpi_handle))) { - device->flags |= BM_FLAGS_DOCKING_STATION; - } - - /* - * Presence of _EJD and/or _EJx indicates 'ejectable'. - * TODO: _EJx... - */ - if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, - "_EJD", &acpi_handle))) { - device->flags |= BM_FLAGS_EJECTABLE; - } - - /* - * Presence of _PR0 or _PS0 indicates 'power manageable'. - */ - if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, - "_PR0", &acpi_handle)) || - ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, - "_PS0", &acpi_handle))) { - device->flags |= BM_FLAGS_POWER_CONTROL; - } - - /* - * Presence of _CRS indicates 'configurable'. - */ - if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, - "_CRS", &acpi_handle))) { - device->flags |= BM_FLAGS_CONFIGURABLE; - } - - /* Fall through to next case statement. */ - - case BM_TYPE_PROCESSOR: - case BM_TYPE_THERMAL_ZONE: - case BM_TYPE_POWER_RESOURCE: - /* - * Presence of _HID or _ADR indicates 'identifiable'. - */ - if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, - "_HID", &acpi_handle)) || - ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, - "_ADR", &acpi_handle))) { - device->flags |= BM_FLAGS_IDENTIFIABLE; - } - - /* - * Presence of _STA indicates 'dynamic status'. - */ - if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, - "_STA", &acpi_handle))) { - device->flags |= BM_FLAGS_DYNAMIC_STATUS; - } - - break; - } - - return AE_OK; -} - - -/**************************************************************************** - * - * FUNCTION: bm_add_namespace_device - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_add_namespace_device ( - ACPI_HANDLE acpi_handle, - ACPI_OBJECT_TYPE acpi_type, - BM_NODE *parent, - BM_NODE **child) -{ - ACPI_STATUS status = AE_OK; - BM_NODE *node = NULL; - BM_DEVICE *device = NULL; - - FUNCTION_TRACE("bm_add_namespace_device"); - - if (!parent || !child) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - if (node_list.count > BM_HANDLES_MAX) { - return_ACPI_STATUS(AE_NO_MEMORY); - } - - (*child) = NULL; - - /* - * Create Node: - * ------------ - */ - node = acpi_os_callocate(sizeof(BM_NODE)); - if (!node) { - return_ACPI_STATUS(AE_NO_MEMORY); - } - - node->parent = parent; - node->next = NULL; - - device = &(node->device); - - device->handle = node_list.count; - device->acpi_handle = acpi_handle; - - /* - * Device Type: - * ------------ - */ - switch (acpi_type) { - case INTERNAL_TYPE_SCOPE: - device->id.type = BM_TYPE_SCOPE; - break; - case ACPI_TYPE_PROCESSOR: - device->id.type = BM_TYPE_PROCESSOR; - break; - case ACPI_TYPE_THERMAL: - device->id.type = BM_TYPE_THERMAL_ZONE; - break; - case ACPI_TYPE_POWER: - device->id.type = BM_TYPE_POWER_RESOURCE; - break; - case ACPI_TYPE_DEVICE: - device->id.type = BM_TYPE_DEVICE; - break; - } - - /* - * Get Other Device Info: - * ---------------------- - * But only if this device's parent is present (which implies - * this device MAY be present). - */ - if (BM_NODE_PRESENT(node->parent)) { - /* - * Device Flags - */ - status = bm_get_flags(device); - if (ACPI_FAILURE(status)) { - goto end; - } - - /* - * Device Identification - */ - status = bm_get_identification(device); - if (ACPI_FAILURE(status)) { - goto end; - } - - /* - * Device Status - */ - status = bm_get_status(device); - if (ACPI_FAILURE(status)) { - goto end; - } - - /* - * Power Management: - * ----------------- - * If this node doesn't provide direct power control - * then we inherit PM capabilities from its parent. - * - * TODO: Inherit! - */ - if (device->flags & BM_FLAGS_POWER_CONTROL) { - status = bm_get_pm_capabilities(node); - if (ACPI_FAILURE(status)) { - goto end; - } - } - } - -end: - if (ACPI_FAILURE(status)) { - acpi_os_free(node); - } - else { - /* - * Add to the node_list. - */ - node_list.nodes[node_list.count++] = node; - - /* - * Formulate Hierarchy: - * -------------------- - * Arrange within the namespace by assigning the parent and - * adding to the parent device's list of children (scope). - */ - if (!parent->scope.head) { - parent->scope.head = node; - } - else { - if (!parent->scope.tail) { - (parent->scope.head)->next = node; - } - else { - (parent->scope.tail)->next = node; - } - } - parent->scope.tail = node; - - (*child) = node; - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_enumerate_namespace - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_enumerate_namespace (void) -{ - ACPI_STATUS status = AE_OK; - ACPI_HANDLE parent_handle = ACPI_ROOT_OBJECT; - ACPI_HANDLE child_handle = NULL; - BM_NODE *parent = NULL; - BM_NODE *child = NULL; - ACPI_OBJECT_TYPE acpi_type = 0; - u32 level = 1; - - FUNCTION_TRACE("bm_enumerate_namespace"); - - parent = node_list.nodes[0]; - - /* - * Enumerate ACPI Namespace: - * ------------------------- - * Parse through the ACPI namespace, identify all 'devices', - * and create a new entry for each in our collection. - */ - while (level > 0) { - - /* - * Get the next object at this level. - */ - status = acpi_get_next_object(ACPI_TYPE_ANY, parent_handle, child_handle, &child_handle); - if (ACPI_SUCCESS(status)) { - - /* - * TODO: This is a hack to get around the problem - * identifying scope objects. Scopes - * somehow need to be uniquely identified. - */ - status = acpi_get_type(child_handle, &acpi_type); - if (ACPI_SUCCESS(status) && (acpi_type == ACPI_TYPE_ANY)) { - status = acpi_get_next_object(ACPI_TYPE_ANY, child_handle, 0, NULL); - if (ACPI_SUCCESS(status)) { - acpi_type = INTERNAL_TYPE_SCOPE; - } - } - - /* - * Device? - * ------- - * If this object is a 'device', insert into the - * ACPI Bus Manager's local hierarchy and search - * the object's scope for any child devices (a - * depth-first search). - */ - switch (acpi_type) { - case INTERNAL_TYPE_SCOPE: - case ACPI_TYPE_DEVICE: - case ACPI_TYPE_PROCESSOR: - case ACPI_TYPE_THERMAL: - case ACPI_TYPE_POWER: - status = bm_add_namespace_device(child_handle, acpi_type, parent, &child); - if (ACPI_SUCCESS(status)) { - status = acpi_get_next_object(ACPI_TYPE_ANY, child_handle, 0, NULL); - if (ACPI_SUCCESS(status)) { - level++; - parent_handle = child_handle; - child_handle = 0; - parent = child; - } - } - break; - } - } - - /* - * Scope Exhausted: - * ---------------- - * No more children in this object's scope, Go back up - * in the namespace tree to the object's parent. - */ - else { - level--; - child_handle = parent_handle; - acpi_get_parent(parent_handle, - &parent_handle); - - if (parent) { - parent = parent->parent; - } - else { - return_ACPI_STATUS(AE_NULL_ENTRY); - } - } - } - - return_ACPI_STATUS(AE_OK); -} - - -/**************************************************************************** - * - * FUNCTION: bm_add_fixed_feature_device - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_add_fixed_feature_device ( - BM_NODE *parent, - BM_DEVICE_TYPE device_type, - char *device_hid) -{ - ACPI_STATUS status = AE_OK; - BM_NODE *node = NULL; - - FUNCTION_TRACE("bm_add_fixed_feature_device"); - - if (!parent) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - if (node_list.count > BM_HANDLES_MAX) { - return_ACPI_STATUS(AE_NO_MEMORY); - } - - /* - * Allocate the new device and add to the device array. - */ - node = acpi_os_callocate(sizeof(BM_NODE)); - if (!node) { - return_ACPI_STATUS(AE_NO_MEMORY); - } - - /* - * Get device info. - */ - node->device.handle = node_list.count; - node->device.acpi_handle = ACPI_ROOT_OBJECT; - node->device.id.type = BM_TYPE_FIXED_BUTTON; - if (device_hid) { - MEMCPY((void*)node->device.id.hid, device_hid, - sizeof(node->device.id.hid)); - } - node->device.flags = BM_FLAGS_FIXED_FEATURE; - node->device.status = BM_STATUS_DEFAULT; - /* TODO: Device PM capabilities */ - - /* - * Add to the node_list. - */ - node_list.nodes[node_list.count++] = node; - - /* - * Formulate Hierarchy: - * -------------------- - * Arrange within the namespace by assigning the parent and - * adding to the parent device's list of children (scope). - */ - node->parent = parent; - node->next = NULL; - - if (parent) { - if (!parent->scope.head) { - parent->scope.head = node; - } - else { - if (!parent->scope.tail) { - (parent->scope.head)->next = node; - } - else { - (parent->scope.tail)->next = node; - } - } - parent->scope.tail = node; - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_enumerate_fixed_features - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_enumerate_fixed_features (void) -{ - FUNCTION_TRACE("bm_enumerate_fixed_features"); - - /* - * Root Object: - * ------------ - * Fabricate the root object, which happens to always get a - * device_handle of zero. - */ - node_list.nodes[0] = acpi_os_callocate(sizeof(BM_NODE)); - if (NULL == (node_list.nodes[0])) { - return_ACPI_STATUS(AE_NO_MEMORY); - } - - node_list.nodes[0]->device.handle = BM_HANDLE_ROOT; - node_list.nodes[0]->device.acpi_handle = ACPI_ROOT_OBJECT; - node_list.nodes[0]->device.flags = BM_FLAGS_UNKNOWN; - node_list.nodes[0]->device.status = BM_STATUS_DEFAULT; - node_list.nodes[0]->device.id.type = BM_TYPE_SYSTEM; - /* TODO: Get system PM capabilities (Sx states?) */ - - node_list.count++; - - /* - * Fixed Features: - * --------------- - * Enumerate fixed-feature devices (e.g. power and sleep buttons). - */ - if (acpi_fadt.pwr_button == 0) { - bm_add_fixed_feature_device(node_list.nodes[0], - BM_TYPE_FIXED_BUTTON, BM_HID_POWER_BUTTON); - } - - if (acpi_fadt.sleep_button == 0) { - bm_add_fixed_feature_device(node_list.nodes[0], - BM_TYPE_FIXED_BUTTON, BM_HID_SLEEP_BUTTON); - } - - return_ACPI_STATUS(AE_OK); -} - - -/**************************************************************************** - * - * FUNCTION: bm_get_handle - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_get_handle ( - ACPI_HANDLE acpi_handle, - BM_HANDLE *device_handle) -{ - ACPI_STATUS status = AE_OK; - u32 i = 0; - - FUNCTION_TRACE("bm_get_handle"); - - if (!device_handle) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - *device_handle = BM_HANDLE_UNKNOWN; - - /* - * Search all devices for a match on the ACPI handle. - */ - for (i=0; idevice.acpi_handle == acpi_handle) { - *device_handle = node_list.nodes[i]->device.handle; - break; - } - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_get_node - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_get_node ( - BM_HANDLE device_handle, - ACPI_HANDLE acpi_handle, - BM_NODE **node) -{ - ACPI_STATUS status = AE_OK; - - FUNCTION_TRACE("bm_get_node"); - - if (!node) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - /* - * If no device handle, resolve acpi handle to device handle. - */ - if (!device_handle && acpi_handle) { - status = bm_get_handle(acpi_handle, &device_handle); - if (ACPI_FAILURE(status)) - return_ACPI_STATUS(status); - } - - /* - * Valid device handle? - */ - if (device_handle > BM_HANDLES_MAX) { - DEBUG_PRINT(ACPI_ERROR, ("Invalid node handle [0x%02x] detected.\n", device_handle)); - return_ACPI_STATUS(AE_ERROR); - } - - *node = node_list.nodes[device_handle]; - - /* - * Valid node? - */ - if (!(*node)) { - DEBUG_PRINT(ACPI_ERROR, ("Invalid (NULL) node entry [0x%02x] detected.\n", device_handle)); - return_ACPI_STATUS(AE_NULL_ENTRY); - } - - return_ACPI_STATUS(AE_OK); -} - - -/**************************************************************************** - * External Functions - ****************************************************************************/ - -/**************************************************************************** - * - * FUNCTION: bm_initialize - * - * PARAMETERS: - * - * RETURN: Exception code. - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_initialize (void) -{ - ACPI_STATUS status = AE_OK; - u32 start = 0; - u32 stop = 0; - u32 elapsed = 0; - - FUNCTION_TRACE("bm_initialize"); - - MEMSET(&node_list, 0, sizeof(BM_HANDLE_LIST)); - - acpi_get_timer(&start); - - DEBUG_PRINT(ACPI_INFO, ("Building device hierarchy.\n")); - - /* - * Enumerate ACPI fixed-feature devices. - */ - status = bm_enumerate_fixed_features(); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - /* - * Enumerate the ACPI namespace. - */ - status = bm_enumerate_namespace(); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - acpi_get_timer(&stop); - acpi_get_timer_duration(start, stop, &elapsed); - - DEBUG_PRINT(ACPI_INFO, ("Device heirarchy build took [%d] microseconds.\n", elapsed)); - - /* - * Display hierarchy. - */ -#ifdef ACPI_DEBUG - bm_print_hierarchy(); -#endif /*ACPI_DEBUG*/ - - /* - * Register for all standard and device-specific notifications. - */ - DEBUG_PRINT(ACPI_INFO, ("Registering for all device notifications.\n")); - - status = acpi_install_notify_handler(ACPI_ROOT_OBJECT, - ACPI_SYSTEM_NOTIFY, &bm_notify, NULL); - if (ACPI_FAILURE(status)) { - DEBUG_PRINT(ACPI_ERROR, ("Unable to register for standard notifications.\n")); - return_ACPI_STATUS(status); - } - - status = acpi_install_notify_handler(ACPI_ROOT_OBJECT, - ACPI_DEVICE_NOTIFY, &bm_notify, NULL); - if (ACPI_FAILURE(status)) { - DEBUG_PRINT(ACPI_ERROR, ("Unable to register for device-specific notifications.\n")); - return_ACPI_STATUS(status); - } - - /* - * Initialize /proc interface. - */ - //DEBUG_PRINT(ACPI_INFO, ("Initializing /proc interface.\n")); - //status = bm_proc_initialize(); - - DEBUG_PRINT(ACPI_INFO, ("ACPI Bus Manager enabled.\n")); - - /* - * Initialize built-in power resource driver. - */ - bm_pr_initialize(); - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_terminate - * - * PARAMETERS: - * - * RETURN: Exception code. - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_terminate (void) -{ - ACPI_STATUS status = AE_OK; - u32 i = 0; - - FUNCTION_TRACE("bm_terminate"); - - /* - * Terminate built-in power resource driver. - */ - bm_pr_terminate(); - - /* - * Remove the /proc interface. - */ - //DEBUG_PRINT(ACPI_INFO, ("Removing /proc interface.\n")); - //status = bm_proc_terminate(); - - - /* - * Unregister for all notifications. - */ - - DEBUG_PRINT(ACPI_INFO, ("Unregistering for device notifications.\n")); - - status = acpi_remove_notify_handler(ACPI_ROOT_OBJECT, - ACPI_SYSTEM_NOTIFY, &bm_notify); - if (ACPI_FAILURE(status)) { - DEBUG_PRINT(ACPI_ERROR, ("Unable to un-register for standard notifications.\n")); - } - - status = acpi_remove_notify_handler(ACPI_ROOT_OBJECT, - ACPI_DEVICE_NOTIFY, &bm_notify); - if (ACPI_FAILURE(status)) { - DEBUG_PRINT(ACPI_ERROR, ("Unable to un-register for device-specific notifications.\n")); - } - - /* - * Parse through the device array, freeing all entries. - */ - DEBUG_PRINT(ACPI_INFO, ("Removing device hierarchy.\n")); - for (i = 0; i < node_list.count; i++) { - if (node_list.nodes[i]) { - acpi_os_free(node_list.nodes[i]); - } - } - - DEBUG_PRINT(ACPI_INFO, ("ACPI Bus Manager disabled.\n")); - - return_ACPI_STATUS(AE_OK); -} diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bmnotify.c b/reactos/drivers/bus/acpi/ospm/busmgr/bmnotify.c deleted file mode 100644 index 1f6e4176061..00000000000 --- a/reactos/drivers/bus/acpi/ospm/busmgr/bmnotify.c +++ /dev/null @@ -1,310 +0,0 @@ -/***************************************************************************** - * - * Module Name: bmnotify.c - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 Andrew Grover - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - - -#define _COMPONENT ACPI_BUS_MANAGER - MODULE_NAME ("bmnotify") - - -/**************************************************************************** - * Internal Functions - ****************************************************************************/ - -/**************************************************************************** - * - * FUNCTION: bm_generate_notify - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_generate_notify ( - BM_NODE *node, - u32 notify_type) -{ - ACPI_STATUS status = AE_OK; - - FUNCTION_TRACE("bm_generate_notify"); - - if (!node) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - DEBUG_PRINT(ACPI_INFO, ("Sending notify [0x%02x] to device [0x%02x].\n", notify_type, node->device.handle)); - - if (!(node->device.flags & BM_FLAGS_DRIVER_CONTROL) || - !(node->driver.notify)) { - DEBUG_PRINT(ACPI_WARN, ("No driver installed for device [0x%02x].\n", node->device.handle)); - return_ACPI_STATUS(AE_NOT_EXIST); - } - - status = node->driver.notify(notify_type, node->device.handle, - &(node->driver.context)); - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_device_check - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_device_check ( - BM_NODE *node, - u32 *status_change) -{ - ACPI_STATUS status = AE_OK; - BM_DEVICE *device = NULL; - BM_DEVICE_STATUS old_status = BM_STATUS_UNKNOWN; - - FUNCTION_TRACE("bm_device_check"); - - if (!node) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - device = &(node->device); - - if (status_change) { - *status_change = FALSE; - } - - old_status = device->status; - - /* - * Parent Present? - * --------------- - * Only check this device if its parent is present (which implies - * this device MAY be present). - */ - if (!BM_NODE_PRESENT(node->parent)) { - return_ACPI_STATUS(AE_OK); - } - - /* - * Get Status: - * ----------- - * And see if the status has changed. - */ - status = bm_get_status(device); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - if (old_status == node->device.status) { - return_ACPI_STATUS(AE_OK); - } - - if (status_change) { - *status_change = TRUE; - } - - /* - * Device Insertion? - * ----------------- - */ - if ((device->status & BM_STATUS_PRESENT) && - !(old_status & BM_STATUS_PRESENT)) { - /* TODO: Make sure driver is loaded, and if not, load. */ - status = bm_generate_notify(node, BM_NOTIFY_DEVICE_ADDED); - } - - /* - * Device Removal? - * --------------- - */ - else if (!(device->status & BM_STATUS_PRESENT) && - (old_status & BM_STATUS_PRESENT)) { - /* TODO: Unload driver if last device instance. */ - status = bm_generate_notify(node, BM_NOTIFY_DEVICE_REMOVED); - } - - return_ACPI_STATUS(AE_OK); -} - - -/**************************************************************************** - * - * FUNCTION: bm_bus_check - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_bus_check ( - BM_NODE *parent_node) -{ - ACPI_STATUS status = AE_OK; - u32 status_change = FALSE; - - FUNCTION_TRACE("bm_bus_check"); - - if (!parent_node) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - /* - * Status Change? - * -------------- - */ - status = bm_device_check(parent_node, &status_change); - if (ACPI_FAILURE(status) || !status_change) { - return_ACPI_STATUS(status); - } - - /* - * Enumerate Scope: - * ---------------- - * TODO: Enumerate child devices within this device's scope and - * run bm_device_check()'s on them... - */ - - return_ACPI_STATUS(AE_OK); -} - - -/**************************************************************************** - * External Functions - ****************************************************************************/ - -/**************************************************************************** - * - * FUNCTION: bm_notify - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -void -bm_notify ( - ACPI_HANDLE acpi_handle, - u32 notify_value, - void *context) -{ - ACPI_STATUS status = AE_OK; - BM_NODE *node = NULL; - - FUNCTION_TRACE("bm_notify"); - - /* - * Resolve the ACPI handle. - */ - status = bm_get_node(0, acpi_handle, &node); - if (ACPI_FAILURE(status)) { - DEBUG_PRINT(ACPI_INFO, ("Recieved notify [0x%02x] for unknown device [%p].\n", notify_value, acpi_handle)); - return_VOID; - } - - /* - * Device-Specific or Standard? - * ---------------------------- - * Device-specific notifies are forwarded to the control module's - * notify() function for processing. Standard notifies are handled - * internally. - */ - if (notify_value > 0x7F) { - status = bm_generate_notify(node, notify_value); - } - else { - switch (notify_value) { - - case BM_NOTIFY_BUS_CHECK: - DEBUG_PRINT(ACPI_INFO, ("Received BUS CHECK notification.\n")); - status = bm_bus_check(node); - break; - - case BM_NOTIFY_DEVICE_CHECK: - DEBUG_PRINT(ACPI_INFO, ("Received DEVICE CHECK notification.\n")); - status = bm_device_check(node, NULL); - break; - - case BM_NOTIFY_DEVICE_WAKE: - DEBUG_PRINT(ACPI_INFO, ("Received DEVICE WAKE notification.\n")); - /* TODO */ - break; - - case BM_NOTIFY_EJECT_REQUEST: - DEBUG_PRINT(ACPI_INFO, ("Received EJECT REQUEST notification.\n")); - /* TODO */ - break; - - case BM_NOTIFY_DEVICE_CHECK_LIGHT: - DEBUG_PRINT(ACPI_INFO, ("Received DEVICE CHECK LIGHT notification.\n")); - /* TODO: Exactly what does the 'light' mean? */ - status = bm_device_check(node, NULL); - break; - - case BM_NOTIFY_FREQUENCY_MISMATCH: - DEBUG_PRINT(ACPI_INFO, ("Received FREQUENCY MISMATCH notification.\n")); - /* TODO */ - break; - - case BM_NOTIFY_BUS_MODE_MISMATCH: - DEBUG_PRINT(ACPI_INFO, ("Received BUS MODE MISMATCH notification.\n")); - /* TODO */ - break; - - case BM_NOTIFY_POWER_FAULT: - DEBUG_PRINT(ACPI_INFO, ("Received POWER FAULT notification.\n")); - /* TODO */ - break; - - default: - DEBUG_PRINT(ACPI_INFO, ("Received unknown/unsupported notification.\n")); - break; - } - } - - return_VOID; -} - - diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bmpm.c b/reactos/drivers/bus/acpi/ospm/busmgr/bmpm.c deleted file mode 100644 index 61d65aef58e..00000000000 --- a/reactos/drivers/bus/acpi/ospm/busmgr/bmpm.c +++ /dev/null @@ -1,395 +0,0 @@ -/***************************************************************************** - * - * Module Name: bmpm.c - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 Andrew Grover - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_POWER_CONTROL - MODULE_NAME ("bmpm") - - -/**************************************************************************** - * Internal Functions - ****************************************************************************/ - -/**************************************************************************** - * - * FUNCTION: bm_get_inferred_power_state - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_get_inferred_power_state ( - BM_DEVICE *device) -{ - ACPI_STATUS status = AE_OK; - BM_HANDLE_LIST pr_list; - BM_POWER_STATE list_state = ACPI_STATE_UNKNOWN; - char object_name[5] = {'_','P','R','0','\0'}; - u32 i = 0; - - FUNCTION_TRACE("bm_get_inferred_power_state"); - - if (!device) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - MEMSET(&pr_list, 0, sizeof(BM_HANDLE_LIST)); - - device->power.state = ACPI_STATE_D3; - - /* - * Calculate Power State: - * ---------------------- - * Try to infer the devices's power state by checking the state of - * the devices's power resources. We start by evaluating _PR0 - * (resource requirements at D0) and work through _PR1 and _PR2. - * We know the current devices power state when all resources (for - * a give Dx state) are ON. If no power resources are on then the - * device is assumed to be off (D3). - */ - for (i=ACPI_STATE_D0; iacpi_handle, - object_name, &pr_list); - - if (ACPI_SUCCESS(status)) { - - status = bm_pr_list_get_state(&pr_list, - &list_state); - - if (ACPI_SUCCESS(status)) { - - if (list_state == ACPI_STATE_D0) { - device->power.state = i; - break; - } - } - } - } - - return_ACPI_STATUS(AE_OK); -} - - -/**************************************************************************** - * External Functions - ****************************************************************************/ - -/**************************************************************************** - * - * FUNCTION: bm_get_power_state - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_get_power_state ( - BM_NODE *node) -{ - ACPI_STATUS status = AE_OK; - BM_DEVICE *device = NULL; - - FUNCTION_TRACE("bm_get_power_state"); - - if (!node) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - device = &(node->device); - - device->power.state = ACPI_STATE_UNKNOWN; - - if (device->flags & BM_FLAGS_POWER_STATE) { - status = bm_evaluate_simple_integer(device->acpi_handle, - "_PSC", &(device->power.state)); - } - else { - status = bm_get_inferred_power_state(device); - } - - if (ACPI_SUCCESS(status)) { - DEBUG_PRINT(ACPI_INFO, ("Device [0x%02x] is at power state [D%d].\n", device->handle, device->power.state)); - } - else { - DEBUG_PRINT(ACPI_INFO, ("Error getting power state for device [0x%02x]\n", device->handle)); - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_set_power_state - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_set_power_state ( - BM_NODE *node, - BM_POWER_STATE state) -{ - ACPI_STATUS status = AE_OK; - BM_DEVICE *device = NULL; - BM_DEVICE *parent_device = NULL; - BM_HANDLE_LIST current_list; - BM_HANDLE_LIST target_list; - char object_name[5] = {'_','P','R','0','\0'}; - - FUNCTION_TRACE("bm_set_power_state"); - - if (!node || !node->parent || (state > ACPI_STATE_D3)) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - MEMSET(¤t_list, 0, sizeof(BM_HANDLE_LIST)); - MEMSET(&target_list, 0, sizeof(BM_HANDLE_LIST)); - - device = &(node->device); - parent_device = &(node->parent->device); - - /* - * Check Parent's Power State: - * --------------------------- - * Can't be in a higher power state (lower Dx value) than parent. - */ - if (state < parent_device->power.state) { - DEBUG_PRINT(ACPI_WARN, ("Cannot set device [0x%02x] to a higher-powered state than parent_device.\n", device->handle)); - return_ACPI_STATUS(AE_ERROR); - } - - /* - * Get Resources: - * -------------- - * Get the power resources associated with the device's current - * and target power states. - */ - if (device->power.state != ACPI_STATE_UNKNOWN) { - object_name[3] = '0' + device->power.state; - bm_evaluate_reference_list(device->acpi_handle, - object_name, ¤t_list); - } - - object_name[3] = '0' + state; - bm_evaluate_reference_list(device->acpi_handle, object_name, - &target_list); - - /* - * Transition Resources: - * --------------------- - * Transition all power resources referenced by this device to - * the correct power state (taking into consideration sequencing - * and dependencies to other devices). - */ - if (current_list.count || target_list.count) { - status = bm_pr_list_transition(¤t_list, &target_list); - } - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - /* - * Execute _PSx: - * ------------- - * Execute the _PSx method corresponding to the target Dx state, - * if it exists. - */ - object_name[2] = 'S'; - object_name[3] = '0' + state; - bm_evaluate_object(device->acpi_handle, object_name, NULL, NULL); - - if (ACPI_SUCCESS(status)) { - DEBUG_PRINT(ACPI_INFO, ("Device [0x%02x] is now at [D%d].\n", device->handle, state)); - device->power.state = state; - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_get_pm_capabilities - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_get_pm_capabilities ( - BM_NODE *node) -{ - ACPI_STATUS status = AE_OK; - BM_DEVICE *device = NULL; - BM_DEVICE *parent_device = NULL; - ACPI_HANDLE acpi_handle = NULL; - BM_POWER_STATE dx_supported = ACPI_STATE_UNKNOWN; - char object_name[5] = {'_','S','0','D','\0'}; - u32 i = 0; - - FUNCTION_TRACE("bm_get_pm_capabilities"); - - if (!node || !node->parent) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - device = &(node->device); - parent_device = &(node->parent->device); - - /* - * Power Management Flags: - * ----------------------- - */ - if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, "_PSC", - &acpi_handle))) { - device->power.flags |= BM_FLAGS_POWER_STATE; - } - - if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, "_IRC", - &acpi_handle))) { - device->power.flags |= BM_FLAGS_INRUSH_CURRENT; - } - - if (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, "_PRW", - &acpi_handle))) { - device->power.flags |= BM_FLAGS_WAKE_CAPABLE; - } - - /* - * Device Power State: - * ------------------- - * Note that we can't get the device's power state until we've - * initialized all power resources, so for now we just set to - * unknown. - */ - device->power.state = ACPI_STATE_UNKNOWN; - - /* - * Dx Supported in S0: - * ------------------- - * Figure out which Dx states are supported by this device for the - * S0 (working) state. Note that D0 and D3 are required (assumed). - */ - device->power.dx_supported[ACPI_STATE_S0] = BM_FLAGS_D0_SUPPORT | - BM_FLAGS_D3_SUPPORT; - - if ((ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, "_PR1", - &acpi_handle))) || - (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, "_PS1", - &acpi_handle)))) { - device->power.dx_supported[ACPI_STATE_S0] |= - BM_FLAGS_D1_SUPPORT; - } - - if ((ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, "_PR2", - &acpi_handle))) || - (ACPI_SUCCESS(acpi_get_handle(device->acpi_handle, "_PS2", - &acpi_handle)))) { - device->power.dx_supported[ACPI_STATE_S0] |= - BM_FLAGS_D2_SUPPORT; - } - - /* - * Dx Supported in S1-S5: - * ---------------------- - * Figure out which Dx states are supported by this device for - * all other Sx states. - */ - for (i = ACPI_STATE_S1; i <= ACPI_STATE_S5; i++) { - - /* - * D3 support is assumed (off is always possible!). - */ - device->power.dx_supported[i] = BM_FLAGS_D3_SUPPORT; - - /* - * Evalute _SxD: - * ------------- - * Which returns the highest (power) Dx state supported in - * this system (Sx) state. We convert this value to a bit - * mask of supported states (conceptually simpler). - */ - status = bm_evaluate_simple_integer(device->acpi_handle, - object_name, &dx_supported); - if (ACPI_SUCCESS(status)) { - switch (dx_supported) { - case 0: - device->power.dx_supported[i] |= - BM_FLAGS_D0_SUPPORT; - /* fall through */ - case 1: - device->power.dx_supported[i] |= - BM_FLAGS_D1_SUPPORT; - /* fall through */ - case 2: - device->power.dx_supported[i] |= - BM_FLAGS_D2_SUPPORT; - /* fall through */ - case 3: - device->power.dx_supported[i] |= - BM_FLAGS_D3_SUPPORT; - break; - } - - /* - * Validate: - * --------- - * Mask of any states that _Sx_d falsely advertises - * (e.g.claims D1 support but neither _PR2 or _PS2 - * exist). In other words, S1-S5 can't offer a Dx - * state that isn't supported by S0. - */ - device->power.dx_supported[i] &= - device->power.dx_supported[ACPI_STATE_S0]; - } - - object_name[2]++; - } - - return_ACPI_STATUS(status); -} diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bmpower.c b/reactos/drivers/bus/acpi/ospm/busmgr/bmpower.c deleted file mode 100644 index 759c6d7cf0f..00000000000 --- a/reactos/drivers/bus/acpi/ospm/busmgr/bmpower.c +++ /dev/null @@ -1,666 +0,0 @@ -/**************************************************************************** - * - * Module Name: bmpower.c - Driver for ACPI Power Resource 'devices' - * $Revision: 1.1 $ - * - ****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 Andrew Grover - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* - * TODO: - * ----- - * 1. Sequencing of power resource list transitions. - * 2. Global serialization of power resource transtions (see ACPI - * spec section 7.1.2/7.1.3). - * 3. Better error handling. - */ - - -#include - -#define _COMPONENT ACPI_POWER_CONTROL - MODULE_NAME ("bmpower") - - -/**************************************************************************** - * Function Prototypes - ****************************************************************************/ - -ACPI_STATUS -bm_pr_notify ( - BM_NOTIFY notify_type, - BM_HANDLE device_handle, - void **context); - -ACPI_STATUS -bm_pr_request ( - BM_REQUEST *request, - void *context); - - -/**************************************************************************** - * Internal Functions - ****************************************************************************/ - -/**************************************************************************** - * - * FUNCTION: bm_pr_print - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_pr_print ( - BM_POWER_RESOURCE *pr) -{ - ACPI_BUFFER buffer; - - if (!pr) { - return(AE_BAD_PARAMETER); - } - - buffer.length = 256; - buffer.pointer = acpi_os_callocate(buffer.length); - if (!buffer.pointer) { - return(AE_NO_MEMORY); - } - - acpi_get_name(pr->acpi_handle, ACPI_FULL_PATHNAME, &buffer); - - acpi_os_printf("Power Resource: found\n"); - - DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n")); - DEBUG_PRINT(ACPI_INFO, ("PowerResource[0x%02X]|[0x%08X] %s\n", pr->device_handle, pr->acpi_handle, buffer.pointer)); - DEBUG_PRINT(ACPI_INFO, (" system_level[S%d] resource_order[%d]\n", pr->system_level, pr->resource_order)); - DEBUG_PRINT(ACPI_INFO, (" state[D%d] reference_count[%d]\n", pr->state, pr->reference_count)); - DEBUG_PRINT(ACPI_INFO, ("+------------------------------------------------------------\n")); - - acpi_os_free(buffer.pointer); - - return(AE_OK); -} - - -/**************************************************************************** - * - * FUNCTION: bm_pr_get_state - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_pr_get_state ( - BM_POWER_RESOURCE *pr) -{ - ACPI_STATUS status = AE_OK; - BM_DEVICE_STATUS device_status = BM_STATUS_UNKNOWN; - - FUNCTION_TRACE("bm_pr_get_state"); - - if (!pr) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - pr->state = ACPI_STATE_UNKNOWN; - - /* - * Evaluate _STA: - * -------------- - * Evalute _STA to determine whether the power resource is ON or OFF. - * Note that if the power resource isn't present we'll get AE_OK but - * an unknown status. - */ - status = bm_get_device_status(pr->device_handle, &device_status); - if (ACPI_FAILURE(status)) { - DEBUG_PRINT(ACPI_ERROR, ("Error reading status for power resource [0x%02x].\n", pr->device_handle)); - return_ACPI_STATUS(status); - } - if (device_status == BM_STATUS_UNKNOWN) { - DEBUG_PRINT(ACPI_ERROR, ("Error reading status for power resource [0x%02x].\n", pr->device_handle)); - return_ACPI_STATUS(AE_NOT_EXIST); - } - - /* - * Mask off all bits but the first as some systems return non-standard - * values (e.g. 0x51). - */ - switch (device_status & 0x01) { - case 0: - DEBUG_PRINT(ACPI_INFO, ("Power resource [0x%02x] is OFF.\n", pr->device_handle)); - pr->state = ACPI_STATE_D3; - break; - case 1: - DEBUG_PRINT(ACPI_INFO, ("Power resource [0x%02x] is ON.\n", pr->device_handle)); - pr->state = ACPI_STATE_D0; - break; - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_pr_set_state - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_pr_set_state ( - BM_POWER_RESOURCE *pr, - BM_POWER_STATE target_state) -{ - ACPI_STATUS status = AE_OK; - - FUNCTION_TRACE("bm_pr_set_state"); - - if (!pr) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - status = bm_pr_get_state(pr); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - if (target_state == pr->state) { - DEBUG_PRINT(ACPI_INFO, ("Power resource [0x%02X] already at target power state [D%d].\n", pr->device_handle, pr->state)); - return_ACPI_STATUS(AE_OK); - } - - switch (target_state) { - - case ACPI_STATE_D0: - DEBUG_PRINT(ACPI_INFO, ("Turning power resource [0x%02X] ON.\n", pr->device_handle)); - status = bm_evaluate_object(pr->acpi_handle, "_ON", NULL, NULL); - break; - - case ACPI_STATE_D3: - DEBUG_PRINT(ACPI_INFO, ("Turning power resource [0x%02X] OFF.\n", pr->device_handle)); - status = bm_evaluate_object(pr->acpi_handle, "_OFF", NULL, NULL); - break; - - default: - status = AE_BAD_PARAMETER; - break; - } - - status = bm_pr_get_state(pr); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_pr_list_get_state - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_pr_list_get_state ( - BM_HANDLE_LIST *pr_list, - BM_POWER_STATE *power_state) -{ - ACPI_STATUS status = AE_OK; - BM_POWER_RESOURCE *pr = NULL; - u32 i = 0; - - FUNCTION_TRACE("bm_pr_list_get_state"); - - if (!pr_list || !power_state) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - if (pr_list->count < 1) { - pr->state = ACPI_STATE_UNKNOWN; - return_ACPI_STATUS(AE_ERROR); - } - - (*power_state) = ACPI_STATE_D0; - - /* - * Calculate Current power_state: - * ----------------------------- - * The current state of a list of power resources is ON if all - * power resources are currently in the ON state. In other words, - * if any power resource in the list is OFF then the collection - * isn't fully ON. - */ - for (i = 0; i < pr_list->count; i++) { - - status = bm_get_device_context(pr_list->handles[i], - (BM_DRIVER_CONTEXT*)(&pr)); - if (ACPI_FAILURE(status)) { - DEBUG_PRINT(ACPI_WARN, ("Invalid reference to power resource [0x%02X].\n", pr_list->handles[i])); - (*power_state) = ACPI_STATE_UNKNOWN; - break; - } - - status = bm_pr_get_state(pr); - if (ACPI_FAILURE(status)) { - (*power_state) = ACPI_STATE_UNKNOWN; - break; - } - - if (pr->state != ACPI_STATE_D0) { - (*power_state) = pr->state; - break; - } - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_pr_list_transition - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_pr_list_transition ( - BM_HANDLE_LIST *current_list, - BM_HANDLE_LIST *target_list) -{ - ACPI_STATUS status = AE_OK; - BM_POWER_RESOURCE *pr = NULL; - u32 i = 0; - - FUNCTION_TRACE("bm_pr_list_transition"); - - if (!current_list || !target_list) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - /* - * Reference Target: - * ----------------- - * Reference all resources for the target power state first (so - * the device doesn't get turned off while transitioning). Power - * resources that aren't on (new reference count of 1) are turned on. - */ - for (i = 0; i < target_list->count; i++) { - - status = bm_get_device_context(target_list->handles[i], - (BM_DRIVER_CONTEXT*)(&pr)); - if (ACPI_FAILURE(status)) { - DEBUG_PRINT(ACPI_WARN, ("Invalid reference to power resource [0x%02X].\n", target_list->handles[i])); - continue; - } - - if (++pr->reference_count == 1) { - /* TODO: Need ordering based upon resource_order */ - status = bm_pr_set_state(pr, ACPI_STATE_D0); - if (ACPI_FAILURE(status)) { - /* TODO: How do we handle this? */ - DEBUG_PRINT(ACPI_WARN, ("Unable to change power state for power resource [0x%02X].\n", target_list->handles[i])); - } - } - } - - /* - * Dereference Current: - * -------------------- - * Dereference all resources for the current power state. Power - * resources no longer referenced (new reference count of 0) are - * turned off. - */ - for (i = 0; i < current_list->count; i++) { - - status = bm_get_device_context(current_list->handles[i], - (BM_DRIVER_CONTEXT*)(&pr)); - if (ACPI_FAILURE(status)) { - DEBUG_PRINT(ACPI_WARN, ("Invalid reference to power resource [0x%02X].\n", target_list->handles[i])); - continue; - } - - if (--pr->reference_count == 0) { - /* TODO: Need ordering based upon resource_order */ - status = bm_pr_set_state(pr, ACPI_STATE_D3); - if (ACPI_FAILURE(status)) { - /* TODO: How do we handle this? */ - DEBUG_PRINT(ACPI_ERROR, ("Unable to change power state for power resource [0x%02X].\n", current_list->handles[i])); - } - } - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_pr_add_device - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_pr_add_device ( - BM_HANDLE device_handle, - void **context) -{ - ACPI_STATUS status = AE_OK; - BM_POWER_RESOURCE *pr = NULL; - BM_DEVICE *device = NULL; - ACPI_BUFFER buffer; - ACPI_OBJECT acpi_object; - - FUNCTION_TRACE("bm_pr_add_device"); - - DEBUG_PRINT(ACPI_INFO, ("Adding power resource [0x%02X].\n", device_handle)); - - if (!context || *context) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - buffer.length = sizeof(ACPI_OBJECT); - buffer.pointer = &acpi_object; - - /* - * Get information on this device. - */ - status = bm_get_device_info(device_handle, &device); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - /* - * Allocate a new BM_POWER_RESOURCE structure. - */ - pr = acpi_os_callocate(sizeof(BM_POWER_RESOURCE)); - if (!pr) { - return_ACPI_STATUS(AE_NO_MEMORY); - } - - pr->device_handle = device->handle; - pr->acpi_handle = device->acpi_handle; - - /* - * Get information on this power resource. - */ - status = acpi_evaluate_object(pr->acpi_handle, NULL, NULL, &buffer); - if (ACPI_FAILURE(status)) { - goto end; - } - - pr->system_level = acpi_object.power_resource.system_level; - pr->resource_order = acpi_object.power_resource.resource_order; - pr->state = ACPI_STATE_UNKNOWN; - pr->reference_count = 0; - - /* - * Get the power resource's current state (ON|OFF). - */ - status = bm_pr_get_state(pr); - -end: - if (ACPI_FAILURE(status)) { - acpi_os_free(pr); - } - else { - *context = pr; - bm_pr_print(pr); - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_pr_remove_device - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_pr_remove_device ( - void **context) -{ - ACPI_STATUS status = AE_OK; - BM_POWER_RESOURCE *pr = NULL; - - FUNCTION_TRACE("bm_pr_remove_device"); - - if (!context || !*context) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - pr = (BM_POWER_RESOURCE*)*context; - - DEBUG_PRINT(ACPI_INFO, ("Removing power resource [0x%02X].\n", pr->device_handle)); - - acpi_os_free(pr); - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * External Functions - ****************************************************************************/ - -/**************************************************************************** - * - * FUNCTION: bm_pr_initialize - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_pr_initialize (void) -{ - ACPI_STATUS status = AE_OK; - BM_DEVICE_ID criteria; - BM_DRIVER driver; - - FUNCTION_TRACE("bm_pr_initialize"); - - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); - - criteria.type = BM_TYPE_POWER_RESOURCE; - - driver.notify = &bm_pr_notify; - driver.request = &bm_pr_request; - - status = bm_register_driver(&criteria, &driver); - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_pr_terminate - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_pr_terminate (void) -{ - ACPI_STATUS status = AE_OK; - BM_DEVICE_ID criteria; - BM_DRIVER driver; - - FUNCTION_TRACE("bm_pr_terminate"); - - MEMSET(&criteria, 0, sizeof(BM_DEVICE_ID)); - MEMSET(&driver, 0, sizeof(BM_DRIVER)); - - criteria.type = BM_TYPE_POWER_RESOURCE; - - driver.notify = &bm_pr_notify; - driver.request = &bm_pr_request; - - status = bm_unregister_driver(&criteria, &driver); - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_pr_notify - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_pr_notify ( - BM_NOTIFY notify_type, - BM_HANDLE device_handle, - void **context) -{ - ACPI_STATUS status = AE_OK; - - FUNCTION_TRACE("bm_pr_notify"); - - switch (notify_type) { - - case BM_NOTIFY_DEVICE_ADDED: - status = bm_pr_add_device(device_handle, context); - break; - - case BM_NOTIFY_DEVICE_REMOVED: - status = bm_pr_remove_device(context); - break; - - default: - status = AE_SUPPORT; - break; - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_pr_request - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_pr_request ( - BM_REQUEST *request, - void *context) -{ - ACPI_STATUS status = AE_OK; - BM_POWER_RESOURCE *pr = NULL; - - FUNCTION_TRACE("bm_pr_request"); - - /* - * Must have a valid request structure and context. - */ - if (!request || !context) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - /* - * context contains information specific to this power resource. - */ - pr = (BM_POWER_RESOURCE*)context; - - /* - * Handle request: - * --------------- - */ - switch (request->command) { - - default: - status = AE_SUPPORT; - break; - } - - request->status = status; - - return_ACPI_STATUS(status); -} - - - diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bmrequest.c b/reactos/drivers/bus/acpi/ospm/busmgr/bmrequest.c deleted file mode 100644 index d02ee941bef..00000000000 --- a/reactos/drivers/bus/acpi/ospm/busmgr/bmrequest.c +++ /dev/null @@ -1,163 +0,0 @@ -/****************************************************************************** - * - * Module Name: bmrequest.c - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 Andrew Grover - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_BUS_MANAGER - MODULE_NAME ("bmrequest") - - -/**************************************************************************** - * External Functions - ****************************************************************************/ - -/**************************************************************************** - * - * FUNCTION: bm_generate_request - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_generate_request ( - BM_NODE *node, - BM_REQUEST *request) -{ - ACPI_STATUS status = AE_OK; - - FUNCTION_TRACE("bm_generate_request"); - - if (!node || !request) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - DEBUG_PRINT(ACPI_INFO, ("Sending request [0x%02x] to device [0x%02x].\n", request->command, node->device.handle)); - - if (!(node->device.flags & BM_FLAGS_DRIVER_CONTROL) || - !(node->driver.request)) { - DEBUG_PRINT(ACPI_WARN, ("No driver installed for device [0x%02x].\n", node->device.handle)); - return_ACPI_STATUS(AE_NOT_EXIST); - } - - status = node->driver.request(request, node->driver.context); - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_request - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_request ( - BM_REQUEST *request) -{ - ACPI_STATUS status = AE_OK; - BM_NODE *node = NULL; - BM_DEVICE *device = NULL; - - FUNCTION_TRACE("bm_request"); - - /* - * Must have a valid request structure. - */ - if (!request) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - DEBUG_PRINT(ACPI_INFO, ("Received request for device [0x%02x] command [0x%08x].\n", request->handle, request->command)); - - /* - * Resolve the node. - */ - status = bm_get_node(request->handle, 0, &node); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - device = &(node->device); - - /* - * Device-Specific Request? - * ------------------------ - * If a device-specific command (>=0x80) forward this request to - * the appropriate driver. - */ - if (request->command & BM_COMMAND_DEVICE_SPECIFIC) { - status = bm_generate_request(node, request); - return_ACPI_STATUS(status); - } - - /* - * Bus-Specific Requests: - * ---------------------- - */ - switch (request->command) { - - case BM_COMMAND_GET_POWER_STATE: - status = bm_get_power_state(node); - if (ACPI_FAILURE(status)) { - break; - } - status = bm_copy_to_buffer(&(request->buffer), - &(device->power.state), sizeof(BM_POWER_STATE)); - break; - - case BM_COMMAND_SET_POWER_STATE: - { - BM_POWER_STATE *power_state = NULL; - - status = bm_cast_buffer(&(request->buffer), - (void**)&power_state, sizeof(BM_POWER_STATE)); - if (ACPI_FAILURE(status)) { - break; - } - status = bm_set_power_state(node, *power_state); - } - break; - - default: - status = AE_SUPPORT; - request->status = AE_SUPPORT; - break; - } - - return_ACPI_STATUS(status); -} diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bmsearch.c b/reactos/drivers/bus/acpi/ospm/busmgr/bmsearch.c deleted file mode 100644 index ed3714938fd..00000000000 --- a/reactos/drivers/bus/acpi/ospm/busmgr/bmsearch.c +++ /dev/null @@ -1,190 +0,0 @@ -/****************************************************************************** - * - * Module Name: bmsearch.c - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 Andrew Grover - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_BUS_MANAGER - MODULE_NAME ("bmsearch") - - -/**************************************************************************** - * External Functions - ****************************************************************************/ - -/**************************************************************************** - * - * FUNCTION: bm_compare - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_compare ( - BM_DEVICE *device, - BM_DEVICE_ID *criteria) -{ - if (!device || !criteria) { - return AE_BAD_PARAMETER; - } - - /* - * Present? - * -------- - * We're only going to match on devices that are present. - * TODO: Optimize in bm_search (don't have to call here). - */ - if (!BM_DEVICE_PRESENT(device)) { - return AE_NOT_FOUND; - } - - /* - * type? - */ - if (criteria->type && !(criteria->type & device->id.type)) { - return AE_NOT_FOUND; - } - - /* - * hid? - */ - if ((criteria->hid[0]) && (0 != STRNCMP(criteria->hid, - device->id.hid, sizeof(BM_DEVICE_HID)))) { - return AE_NOT_FOUND; - } - - /* - * adr? - */ - if ((criteria->adr) && (criteria->adr != device->id.adr)) { - return AE_NOT_FOUND; - } - - return AE_OK; -} - - -/**************************************************************************** - * - * FUNCTION: bm_search - * - * PARAMETERS: - * - * RETURN: AE_BAD_PARAMETER- invalid input parameter - * AE_NOT_EXIST - start_device_handle doesn't exist - * AE_NOT_FOUND - no matches to Search_info.criteria found - * AE_OK - success - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_search( - BM_HANDLE device_handle, - BM_DEVICE_ID *criteria, - BM_HANDLE_LIST *results) -{ - ACPI_STATUS status = AE_OK; - BM_NODE *node = NULL; - - FUNCTION_TRACE("bm_search"); - - if (!criteria || !results) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - results->count = 0; - - /* - * Locate Starting Point: - * ---------------------- - * Locate the node in the hierarchy where we'll begin our search. - */ - status = bm_get_node(device_handle, 0, &node); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - /* - * Parse Hierarchy: - * ---------------- - * Parse through the node hierarchy looking for matches. - */ - while (node && (results->count<=BM_HANDLES_MAX)) { - /* - * Depth-first: - * ------------ - * Searches are always performed depth-first. - */ - if (node->scope.head) { - status = bm_compare(&(node->device), criteria); - if (ACPI_SUCCESS(status)) { - results->handles[results->count++] = - node->device.handle; - } - node = node->scope.head; - } - - /* - * Now Breadth: - * ------------ - * Search all peers until scope is exhausted. - */ - else { - status = bm_compare(&(node->device), criteria); - if (ACPI_SUCCESS(status)) { - results->handles[results->count++] = - node->device.handle; - } - - /* - * Locate Next Device: - * ------------------- - * The next node is either a peer at this level - * (node->next is valid), or we work are way back - * up the tree until we either find a non-parsed - * peer or hit the top (node->parent is NULL). - */ - while (!node->next && node->parent) { - node = node->parent; - } - node = node->next; - } - } - - if (results->count == 0) { - return_ACPI_STATUS(AE_NOT_FOUND); - } - else { - return_ACPI_STATUS(AE_OK); - } -} diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bmutils.c b/reactos/drivers/bus/acpi/ospm/busmgr/bmutils.c deleted file mode 100644 index 5eda0703f58..00000000000 --- a/reactos/drivers/bus/acpi/ospm/busmgr/bmutils.c +++ /dev/null @@ -1,604 +0,0 @@ -/***************************************************************************** - * - * Module Name: bmutils.c - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 Andrew Grover - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_BUS_MANAGER - MODULE_NAME ("bmutils") - - -#ifdef ACPI_DEBUG -#define DEBUG_EVAL_ERROR(l,h,p,s) bm_print_eval_error(l,h,p,s) -#else -#define DEBUG_EVAL_ERROR(l,h,p,s) -#endif - - -/**************************************************************************** - * External Functions - ****************************************************************************/ - -/**************************************************************************** - * - * FUNCTION: bm_print_eval_error - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -void -bm_print_eval_error ( - u32 debug_level, - ACPI_HANDLE acpi_handle, - ACPI_STRING pathname, - ACPI_STATUS status) -{ - ACPI_BUFFER buffer; - ACPI_STRING status_string = NULL; - - buffer.length = 256; - buffer.pointer = acpi_os_callocate(buffer.length); - if (!buffer.pointer) { - return; - } - - status_string = acpi_cm_format_exception(status); - - status = acpi_get_name(acpi_handle, ACPI_FULL_PATHNAME, &buffer); - if (ACPI_FAILURE(status)) { - DEBUG_PRINT(debug_level, ("Evaluate object [0x%08x], %s\n", acpi_handle, status_string)); - return; - } - - if (pathname) { - DEBUG_PRINT(ACPI_INFO, ("Evaluate object [%s.%s], %s\n", buffer.pointer, pathname, status_string)); - } - else { - DEBUG_PRINT(ACPI_INFO, ("Evaluate object [%s], %s\n", buffer.pointer, status_string)); - } - - acpi_os_free(buffer.pointer); -} - - -/**************************************************************************** - * - * FUNCTION: bm_copy_to_buffer - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_copy_to_buffer ( - ACPI_BUFFER *buffer, - void *data, - u32 length) -{ - FUNCTION_TRACE("bm_copy_to_buffer"); - - if (!buffer || (!buffer->pointer) || !data || (length == 0)) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - if (length > buffer->length) { - buffer->length = length; - return_ACPI_STATUS(AE_BUFFER_OVERFLOW); - } - - buffer->length = length; - MEMCPY(buffer->pointer, data, length); - - return_ACPI_STATUS(AE_OK); -} - - -/**************************************************************************** - * - * FUNCTION: bm_cast_buffer - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_cast_buffer ( - ACPI_BUFFER *buffer, - void **pointer, - u32 length) -{ - FUNCTION_TRACE("bm_cast_buffer"); - - if (!buffer || !buffer->pointer || !pointer || length == 0) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - if (length > buffer->length) { - return_ACPI_STATUS(AE_BAD_DATA); - } - - *pointer = buffer->pointer; - - return_ACPI_STATUS(AE_OK); -} - - -/**************************************************************************** - * - * FUNCTION: bm_extract_package_data - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -/* - TODO: Don't assume numbers (in ASL) are 32-bit values!!!! (IA64) - TODO: Issue with 'assumed' types coming out of interpreter... - (e.g. toshiba _BIF) -*/ - -ACPI_STATUS -bm_extract_package_data ( - ACPI_OBJECT *package, - ACPI_BUFFER *package_format, - ACPI_BUFFER *buffer) -{ - ACPI_STATUS status = AE_OK; - u8 *head = NULL; - u8 *tail = NULL; - u8 **pointer = NULL; - u32 tail_offset = 0; - ACPI_OBJECT *element = NULL; - u32 size_required = 0; - char* format = NULL; - u32 format_count = 0; - u32 i = 0; - - FUNCTION_TRACE("bm_extract_package_data"); - - if (!package || (package->type != ACPI_TYPE_PACKAGE) || - (package->package.count == 0) || !package_format || - (package_format->length < 1) || - (!package_format->pointer) || !buffer) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - format_count = package_format->length - 1; - - if (format_count > package->package.count) { - DEBUG_PRINT(ACPI_WARN, ("Format specifies more objects [%d] than exist in package [%d].", format_count, package->package.count)); - return_ACPI_STATUS(AE_BAD_DATA); - } - - format = (char*)package_format->pointer; - - /* - * Calculate size_required. - */ - for (i=0; ipackage.elements[i]); - - switch (element->type) { - - case ACPI_TYPE_INTEGER: - switch (format[i]) { - case 'N': - size_required += sizeof(ACPI_INTEGER); - tail_offset += sizeof(ACPI_INTEGER); - break; - case 'S': - size_required += sizeof(u8*) + - sizeof(ACPI_INTEGER) + 1; - tail_offset += sizeof(ACPI_INTEGER); - break; - default: - DEBUG_PRINT(ACPI_WARN, ("Invalid package element [%d]: got number, expecing [%c].\n", i, format[i])); - return_ACPI_STATUS(AE_BAD_DATA); - break; - } - break; - - case ACPI_TYPE_STRING: - case ACPI_TYPE_BUFFER: - switch (format[i]) { - case 'S': - size_required += sizeof(u8*) + - element->string.length + 1; - tail_offset += sizeof(u8*); - break; - case 'B': - size_required += sizeof(u8*) + - element->buffer.length; - tail_offset += sizeof(u8*); - break; - default: - DEBUG_PRINT(ACPI_WARN, ("Invalid package element [%d] got string/buffer, expecing [%c].\n", i, format[i])); - return_ACPI_STATUS(AE_BAD_DATA); - break; - } - break; - - case ACPI_TYPE_PACKAGE: - default: - /* TODO: handle nested packages... */ - return_ACPI_STATUS(AE_SUPPORT); - break; - } - } - - if (size_required > buffer->length) { - buffer->length = size_required; - return_ACPI_STATUS(AE_BUFFER_OVERFLOW); - } - - buffer->length = size_required; - - if (!buffer->pointer) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - head = buffer->pointer; - tail = head + tail_offset; - - /* - * Extract package data: - */ - for (i=0; ipackage.elements[i]); - - switch (element->type) { - - case ACPI_TYPE_INTEGER: - switch (format[i]) { - case 'N': - *((ACPI_INTEGER*)head) = - element->integer.value; - head += sizeof(ACPI_INTEGER); - break; - case 'S': - pointer = (u8**)head; - *pointer = tail; - *((ACPI_INTEGER*)tail) = - element->integer.value; - head += sizeof(ACPI_INTEGER*); - tail += sizeof(ACPI_INTEGER); - /* NULL terminate string */ - *tail = 0; - tail++; - break; - default: - /* Should never get here */ - break; - } - break; - - case ACPI_TYPE_STRING: - case ACPI_TYPE_BUFFER: - switch (format[i]) { - case 'S': - pointer = (u8**)head; - *pointer = tail; - memcpy(tail, element->string.pointer, - element->string.length); - head += sizeof(u8*); - tail += element->string.length; - /* NULL terminate string */ - *tail = 0; - tail++; - break; - case 'B': - pointer = (u8**)head; - *pointer = tail; - memcpy(tail, element->buffer.pointer, - element->buffer.length); - head += sizeof(u8*); - tail += element->buffer.length; - break; - default: - /* Should never get here */ - break; - } - break; - - case ACPI_TYPE_PACKAGE: - /* TODO: handle nested packages... */ - default: - /* Should never get here */ - break; - } - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_evaluate_object - * - * PARAMETERS: - * - * RETURN: AE_OK - * AE_BUFFER_OVERFLOW Evaluated object returned data, but - * caller did not provide buffer. - * - * DESCRIPTION: Helper for acpi_evaluate_object that handles buffer - * allocation. Note that the caller is responsible for - * freeing buffer->pointer! - * - ****************************************************************************/ - -ACPI_STATUS -bm_evaluate_object ( - ACPI_HANDLE acpi_handle, - ACPI_STRING pathname, - ACPI_OBJECT_LIST *arguments, - ACPI_BUFFER *buffer) -{ - ACPI_STATUS status = AE_OK; - - FUNCTION_TRACE("bm_evaluate_object"); - - /* If caller provided a buffer it must be unallocated/zero'd. */ - if ((buffer) && (buffer->length != 0 || buffer->pointer)) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - /* - * Evalute Object: - * --------------- - * The first attempt is just to get the size of the object data - * (that is unless there's no return data, e.g. _INI); the second - * gets the data. - */ - status = acpi_evaluate_object(acpi_handle, pathname, arguments, buffer); - if (ACPI_SUCCESS(status)) { - return_ACPI_STATUS(status); - } - - else if ((buffer) && (status == AE_BUFFER_OVERFLOW)) { - - /* Gotta allocate -- CALLER MUST FREE! */ - buffer->pointer = acpi_os_callocate(buffer->length); - if (!buffer->pointer) { - return_ACPI_STATUS(AE_NO_MEMORY); - } - - /* Re-evaluate -- this time it should work */ - status = acpi_evaluate_object(acpi_handle, pathname, - arguments, buffer); - } - - if (ACPI_FAILURE(status)) { - DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status); - if (buffer && buffer->pointer) { - acpi_os_free(buffer->pointer); - buffer->pointer = NULL; - buffer->length = 0; - } - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_evaluate_simple_integer - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_evaluate_simple_integer ( - ACPI_HANDLE acpi_handle, - ACPI_STRING pathname, - u32 *data) -{ - ACPI_STATUS status = AE_OK; - ACPI_OBJECT *element = NULL; - ACPI_BUFFER buffer; - - FUNCTION_TRACE("bm_evaluate_simple_integer"); - - if (!data) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - MEMSET(&buffer, 0, sizeof(ACPI_BUFFER)); - - /* - * Evaluate Object: - * ---------------- - */ - status = bm_evaluate_object(acpi_handle, pathname, NULL, &buffer); - if (ACPI_FAILURE(status)) { - goto end; - } - - /* - * Validate Data: - * -------------- - */ - status = bm_cast_buffer(&buffer, (void**)&element, - sizeof(ACPI_OBJECT)); - if (ACPI_FAILURE(status)) { - DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status); - goto end; - } - - if (element->type != ACPI_TYPE_INTEGER) { - status = AE_BAD_DATA; - DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status); - goto end; - } - - *data = element->integer.value; - -end: - acpi_os_free(buffer.pointer); - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_evaluate_reference_list - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_evaluate_reference_list ( - ACPI_HANDLE acpi_handle, - ACPI_STRING pathname, - BM_HANDLE_LIST *reference_list) -{ - ACPI_STATUS status = AE_OK; - ACPI_OBJECT *package = NULL; - ACPI_OBJECT *element = NULL; - ACPI_HANDLE reference_handle = NULL; - ACPI_BUFFER buffer; - u32 i = 0; - - FUNCTION_TRACE("bm_evaluate_reference_list"); - - if (!reference_list) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - MEMSET(&buffer, 0, sizeof(ACPI_BUFFER)); - - /* - * Evaluate Object: - * ---------------- - */ - status = bm_evaluate_object(acpi_handle, pathname, NULL, &buffer); - if (ACPI_FAILURE(status)) { - goto end; - } - - /* - * Validate Package: - * ----------------- - */ - status = bm_cast_buffer(&buffer, (void**)&package, - sizeof(ACPI_OBJECT)); - if (ACPI_FAILURE(status)) { - DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status); - goto end; - } - - if (package->type != ACPI_TYPE_PACKAGE) { - status = AE_BAD_DATA; - DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status); - goto end; - } - - if (package->package.count > BM_HANDLES_MAX) { - package->package.count = BM_HANDLES_MAX; - } - - /* - * Parse Package Data: - * ------------------- - */ - for (i = 0; i < package->package.count; i++) { - - element = &(package->package.elements[i]); - - if (!element || (element->type != ACPI_TYPE_STRING)) { - status = AE_BAD_DATA; - DEBUG_PRINT(ACPI_WARN, ("Invalid element in package (not a device reference).\n")); - DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status); - break; - } - - /* - * Resolve reference string (e.g. "\_PR_.CPU_") to an - * ACPI_HANDLE. - */ - status = acpi_get_handle(acpi_handle, - element->string.pointer, &reference_handle); - if (ACPI_FAILURE(status)) { - status = AE_BAD_DATA; - DEBUG_PRINT(ACPI_WARN, ("Unable to resolve device reference [%s].\n", element->string.pointer)); - DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status); - break; - } - - /* - * Resolve ACPI_HANDLE to BM_HANDLE. - */ - status = bm_get_handle(reference_handle, - &(reference_list->handles[i])); - if (ACPI_FAILURE(status)) { - status = AE_BAD_DATA; - DEBUG_PRINT(ACPI_WARN, ("Unable to resolve device reference for [0x%08x].\n", reference_handle)); - DEBUG_EVAL_ERROR(ACPI_WARN, acpi_handle, pathname, status); - break; - } - - DEBUG_PRINT(ACPI_INFO, ("Resolved reference [%s]->[0x%08x]->[0x%02x]\n", element->string.pointer, reference_handle, reference_list->handles[i])); - - (reference_list->count)++; - } - -end: - acpi_os_free(buffer.pointer); - - return_ACPI_STATUS(status); -} - - diff --git a/reactos/drivers/bus/acpi/ospm/busmgr/bmxface.c b/reactos/drivers/bus/acpi/ospm/busmgr/bmxface.c deleted file mode 100644 index 34b86fad4e8..00000000000 --- a/reactos/drivers/bus/acpi/ospm/busmgr/bmxface.c +++ /dev/null @@ -1,330 +0,0 @@ -/***************************************************************************** - * - * Module Name: bmxface.c - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 Andrew Grover - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_BUS_MANAGER - MODULE_NAME ("bmxface") - - -/**************************************************************************** - * External Functions - ****************************************************************************/ - -/**************************************************************************** - * - * FUNCTION: bm_get_device_status - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ -ACPI_STATUS -bm_get_device_status ( - BM_HANDLE device_handle, - BM_DEVICE_STATUS *device_status) -{ - ACPI_STATUS status = AE_OK; - BM_NODE *node = NULL; - - FUNCTION_TRACE("bm_get_device_status"); - - if (!device_status) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - *device_status = BM_STATUS_UNKNOWN; - - /* - * Resolve device handle to node. - */ - status = bm_get_node(device_handle, 0, &node); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - /* - * Parent Present? - * --------------- - * If the parent isn't present we can't evalute _STA on the child. - * Return an unknown status. - */ - if (!BM_NODE_PRESENT(node->parent)) { - return_ACPI_STATUS(AE_OK); - } - - /* - * Dynamic Status? - * --------------- - * If _STA isn't present we just return the default status. - */ - if (!(node->device.flags & BM_FLAGS_DYNAMIC_STATUS)) { - *device_status = BM_STATUS_DEFAULT; - return_ACPI_STATUS(AE_OK); - } - - /* - * Evaluate _STA: - * -------------- - */ - status = bm_evaluate_simple_integer(node->device.acpi_handle, "_STA", - &(node->device.status)); - if (ACPI_SUCCESS(status)) { - *device_status = node->device.status; - } - - return_ACPI_STATUS(status); -} - - -/**************************************************************************** - * - * FUNCTION: bm_get_device_info - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ -ACPI_STATUS -bm_get_device_info ( - BM_HANDLE device_handle, - BM_DEVICE **device) -{ - ACPI_STATUS status = AE_OK; - BM_NODE *node = NULL; - - FUNCTION_TRACE("bm_get_device_info"); - - if (!device) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - /* - * Resolve device handle to internal device. - */ - status = bm_get_node(device_handle, 0, &node); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - *device = &(node->device); - - return_ACPI_STATUS(AE_OK); -} - - -/**************************************************************************** - * - * FUNCTION: bm_get_device_context - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ -ACPI_STATUS -bm_get_device_context ( - BM_HANDLE device_handle, - BM_DRIVER_CONTEXT *context) -{ - ACPI_STATUS status = AE_OK; - BM_NODE *node = NULL; - - FUNCTION_TRACE("bm_get_device_context"); - - if (!context) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - *context = NULL; - - /* - * Resolve device handle to internal device. - */ - status = bm_get_node(device_handle, 0, &node); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - if (!node->driver.context) { - return_ACPI_STATUS(AE_NULL_ENTRY); - } - - *context = node->driver.context; - - return_ACPI_STATUS(AE_OK); -} - - -/**************************************************************************** - * - * FUNCTION: bm_register_driver - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_register_driver ( - BM_DEVICE_ID *criteria, - BM_DRIVER *driver) -{ - ACPI_STATUS status = AE_NOT_FOUND; - BM_HANDLE_LIST device_list; - BM_NODE *node = NULL; - u32 i = 0; - - FUNCTION_TRACE("bm_register_driver"); - - if (!criteria || !driver || !driver->notify || !driver->request) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - MEMSET(&device_list, 0, sizeof(BM_HANDLE_LIST)); - - /* - * Find Matches: - * ------------- - * Search through the entire device hierarchy for matches against - * the given device criteria. - */ - status = bm_search(BM_HANDLE_ROOT, criteria, &device_list); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - /* - * Install driver: - * ---------------- - * For each match, record the driver information and execute the - * driver's Notify() funciton (if present) to notify the driver - * of the device's presence. - */ - for (i = 0; i < device_list.count; i++) { - - /* Resolve the device handle. */ - status = bm_get_node(device_list.handles[i], 0, &node); - if (ACPI_FAILURE(status)) { - continue; - } - - DEBUG_PRINT(ACPI_INFO, ("Registering driver for device [0x%02x].\n", node->device.handle)); - - /* Notify driver of new device. */ - status = driver->notify(BM_NOTIFY_DEVICE_ADDED, - node->device.handle, &(node->driver.context)); - if (ACPI_SUCCESS(status)) { - node->driver.notify = driver->notify; - node->driver.request = driver->request; - node->device.flags |= BM_FLAGS_DRIVER_CONTROL; - } - } - - return_ACPI_STATUS(AE_OK); -} - - -/**************************************************************************** - * - * FUNCTION: bm_unregister_driver - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ****************************************************************************/ - -ACPI_STATUS -bm_unregister_driver ( - BM_DEVICE_ID *criteria, - BM_DRIVER *driver) -{ - ACPI_STATUS status = AE_NOT_FOUND; - BM_HANDLE_LIST device_list; - BM_NODE *node = NULL; - u32 i = 0; - - FUNCTION_TRACE("bm_unregister_driver"); - - if (!criteria || !driver || !driver->notify || !driver->request) { - return_ACPI_STATUS(AE_BAD_PARAMETER); - } - - MEMSET(&device_list, 0, sizeof(BM_HANDLE_LIST)); - - /* - * Find Matches: - * ------------- - * Search through the entire device hierarchy for matches against - * the given device criteria. - */ - status = bm_search(BM_HANDLE_ROOT, criteria, &device_list); - if (ACPI_FAILURE(status)) { - return_ACPI_STATUS(status); - } - - /* - * Remove driver: - * --------------- - * For each match, execute the driver's Notify() function to allow - * the driver to cleanup each device instance. - */ - for (i = 0; i < device_list.count; i++) { - /* - * Resolve the device handle. - */ - status = bm_get_node(device_list.handles[i], 0, &node); - if (ACPI_FAILURE(status)) { - continue; - } - - DEBUG_PRINT(ACPI_INFO, ("Unregistering driver for device [0x%02x].\n", node->device.handle)); - - /* Notify driver of device removal. */ - status = node->driver.notify(BM_NOTIFY_DEVICE_REMOVED, - node->device.handle, &(node->driver.context)); - - node->device.flags &= ~BM_FLAGS_DRIVER_CONTROL; - - MEMSET(&(node->driver), 0, sizeof(BM_DRIVER)); - } - - return_ACPI_STATUS(AE_OK); -} diff --git a/reactos/drivers/bus/acpi/ospm/fdo.c b/reactos/drivers/bus/acpi/ospm/fdo.c deleted file mode 100644 index df2f3e49160..00000000000 --- a/reactos/drivers/bus/acpi/ospm/fdo.c +++ /dev/null @@ -1,983 +0,0 @@ -/* $Id$ - * - * PROJECT: ReactOS ACPI bus driver - * FILE: acpi/ospm/fdo.c - * PURPOSE: ACPI device object dispatch routines - * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) - * Herv Poussineau (hpoussin@reactos.com) - * UPDATE HISTORY: - * 08-08-2001 CSH Created - */ -#include - -#define NDEBUG -#include - -FADT_DESCRIPTOR_REV2 acpi_fadt; - -/*** PRIVATE *****************************************************************/ - - -BOOLEAN -AcpiCreateUnicodeString( - PUNICODE_STRING Destination, - PWSTR Source, - POOL_TYPE PoolType) -{ - ULONG Length; - - if (!Source) - { - RtlInitUnicodeString(Destination, NULL); - return TRUE; - } - - Length = (wcslen(Source) + 1) * sizeof(WCHAR); - - Destination->Buffer = ExAllocatePool(PoolType, Length); - if (Destination->Buffer == NULL) - { - return FALSE; - } - - RtlCopyMemory(Destination->Buffer, Source, Length); - - Destination->MaximumLength = Length; - - Destination->Length = Length - sizeof(WCHAR); - - return TRUE; -} - -BOOLEAN -AcpiCreateDeviceIDString(PUNICODE_STRING DeviceID, - BM_NODE *Node) -{ - WCHAR Buffer[256]; - - swprintf(Buffer, - L"ACPI\\%S", - Node->device.id.hid); - - return AcpiCreateUnicodeString(DeviceID, Buffer, PagedPool); -} - - -BOOLEAN -AcpiCreateHardwareIDsString(PUNICODE_STRING HardwareIDs, - BM_NODE *Node) -{ - WCHAR Buffer[256]; - ULONG Length; - ULONG Index; - - Index = 0; - Index += swprintf(&Buffer[Index], - L"ACPI\\%S", - Node->device.id.hid); - Index++; - - Index += swprintf(&Buffer[Index], - L"*%S", - Node->device.id.hid); - Index++; - Buffer[Index] = UNICODE_NULL; - - Length = (Index + 1) * sizeof(WCHAR); - HardwareIDs->Buffer = ExAllocatePool(PagedPool, Length); - if (HardwareIDs->Buffer == NULL) - { - return FALSE; - } - - HardwareIDs->Length = Length - sizeof(WCHAR); - HardwareIDs->MaximumLength = Length; - RtlCopyMemory(HardwareIDs->Buffer, Buffer, Length); - - return TRUE; -} - - -BOOLEAN -AcpiCreateInstanceIDString(PUNICODE_STRING InstanceID, - BM_NODE *Node) -{ - WCHAR Buffer[10]; - - if (Node->device.id.uid[0]) - swprintf(Buffer, L"%S", Node->device.id.uid); - else - /* FIXME: Generate unique id! */ - swprintf(Buffer, L"%S", L"0000"); - - return AcpiCreateUnicodeString(InstanceID, Buffer, PagedPool); -} - - -BOOLEAN -AcpiCreateDeviceDescriptionString(PUNICODE_STRING DeviceDescription, - BM_NODE *Node) -{ - PWSTR Buffer; - - if (RtlCompareMemory(Node->device.id.hid, "PNP000", 6) == 6) - Buffer = L"Programmable interrupt controller"; - else if (RtlCompareMemory(Node->device.id.hid, "PNP010", 6) == 6) - Buffer = L"System timer"; - else if (RtlCompareMemory(Node->device.id.hid, "PNP020", 6) == 6) - Buffer = L"DMA controller"; - else if (RtlCompareMemory(Node->device.id.hid, "PNP03", 5) == 5) - Buffer = L"Keyboard"; - else if (RtlCompareMemory(Node->device.id.hid, "PNP040", 6) == 6) - Buffer = L"Parallel port"; - else if (RtlCompareMemory(Node->device.id.hid, "PNP05", 5) == 5) - Buffer = L"Serial port"; - else if (RtlCompareMemory(Node->device.id.hid, "PNP06", 5) ==5) - Buffer = L"Disk controller"; - else if (RtlCompareMemory(Node->device.id.hid, "PNP07", 5) == 5) - Buffer = L"Disk controller"; - else if (RtlCompareMemory(Node->device.id.hid, "PNP09", 5) == 5) - Buffer = L"Display adapter"; - else if (RtlCompareMemory(Node->device.id.hid, "PNP0A0", 6) == 6) - Buffer = L"Bus controller"; - else if (RtlCompareMemory(Node->device.id.hid, "PNP0E0", 6) == 6) - Buffer = L"PCMCIA controller"; - else if (RtlCompareMemory(Node->device.id.hid, "PNP0F", 5) == 5) - Buffer = L"Mouse device"; - else if (RtlCompareMemory(Node->device.id.hid, "PNP8", 4) == 4) - Buffer = L"Network adapter"; - else if (RtlCompareMemory(Node->device.id.hid, "PNPA0", 5) == 5) - Buffer = L"SCSI controller"; - else if (RtlCompareMemory(Node->device.id.hid, "PNPB0", 5) == 5) - Buffer = L"Multimedia device"; - else if (RtlCompareMemory(Node->device.id.hid, "PNPC00", 6) == 6) - Buffer = L"Modem"; - else - Buffer = L"Other ACPI device"; - - return AcpiCreateUnicodeString(DeviceDescription, Buffer, PagedPool); -} - - -static BOOLEAN -AcpiCreateResourceList(PCM_RESOURCE_LIST* pResourceList, - PULONG ResourceListSize, - PIO_RESOURCE_REQUIREMENTS_LIST* pRequirementsList, - PULONG RequirementsListSize, - RESOURCE* resources) -{ - BOOLEAN Done; - ULONG NumberOfResources = 0; - PCM_RESOURCE_LIST ResourceList; - PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList; - PCM_PARTIAL_RESOURCE_DESCRIPTOR ResourceDescriptor; - PIO_RESOURCE_DESCRIPTOR RequirementDescriptor; - RESOURCE* resource; - ULONG i; - - /* Count number of resources */ - Done = FALSE; - resource = resources; - while (!Done) - { - switch (resource->id) - { - case irq: - { - IRQ_RESOURCE *irq_data = (IRQ_RESOURCE*) &resource->data; - NumberOfResources += irq_data->number_of_interrupts; - break; - } - case dma: - { - DMA_RESOURCE *dma_data = (DMA_RESOURCE*) &resource->data; - NumberOfResources += dma_data->number_of_channels; - break; - } - case io: - { - NumberOfResources++; - break; - } - case end_tag: - { - Done = TRUE; - break; - } - default: - { - break; - } - } - resource = NEXT_RESOURCE(resource); - } - - /* Allocate memory */ - *ResourceListSize = sizeof(CM_RESOURCE_LIST) + sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR) * (NumberOfResources - 1); - ResourceList = (PCM_RESOURCE_LIST)ExAllocatePool(PagedPool, *ResourceListSize); - *pResourceList = ResourceList; - if (!ResourceList) - return FALSE; - ResourceList->Count = 1; - ResourceList->List[0].InterfaceType = Internal; /* FIXME */ - ResourceList->List[0].BusNumber = 0; /* We're the only ACPI bus device in the system */ - ResourceList->List[0].PartialResourceList.Version = 1; - ResourceList->List[0].PartialResourceList.Revision = 1; - ResourceList->List[0].PartialResourceList.Count = NumberOfResources; - ResourceDescriptor = ResourceList->List[0].PartialResourceList.PartialDescriptors; - - *RequirementsListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + sizeof(IO_RESOURCE_DESCRIPTOR) * (NumberOfResources - 1); - RequirementsList = (PIO_RESOURCE_REQUIREMENTS_LIST)ExAllocatePool(PagedPool, *RequirementsListSize); - *pRequirementsList = RequirementsList; - if (!RequirementsList) - { - ExFreePool(ResourceList); - return FALSE; - } - RequirementsList->ListSize = *RequirementsListSize; - RequirementsList->InterfaceType = ResourceList->List[0].InterfaceType; - RequirementsList->BusNumber = ResourceList->List[0].BusNumber; - RequirementsList->SlotNumber = 0; /* Not used by WDM drivers */ - RequirementsList->AlternativeLists = 1; - RequirementsList->List[0].Version = 1; - RequirementsList->List[0].Revision = 1; - RequirementsList->List[0].Count = NumberOfResources; - RequirementDescriptor = RequirementsList->List[0].Descriptors; - - /* Fill resources list structure */ - Done = FALSE; - resource = resources; - while (!Done) - { - switch (resource->id) - { - case irq: - { - IRQ_RESOURCE *irq_data = (IRQ_RESOURCE*) &resource->data; - for (i = 0; i < irq_data->number_of_interrupts; i++) - { - ResourceDescriptor->Type = CmResourceTypeInterrupt; - - ResourceDescriptor->ShareDisposition = - (irq_data->shared_exclusive == SHARED ? CmResourceShareShared : CmResourceShareDeviceExclusive); - ResourceDescriptor->Flags = - (irq_data->edge_level == LEVEL_SENSITIVE ? CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE : CM_RESOURCE_INTERRUPT_LATCHED); - ResourceDescriptor->u.Interrupt.Level = irq_data->interrupts[i]; - ResourceDescriptor->u.Interrupt.Vector = 0; - ResourceDescriptor->u.Interrupt.Affinity = (KAFFINITY)(-1); - - RequirementDescriptor->Option = 0; /* Required */ - RequirementDescriptor->Type = ResourceDescriptor->Type; - RequirementDescriptor->ShareDisposition = ResourceDescriptor->ShareDisposition; - RequirementDescriptor->Flags = ResourceDescriptor->Flags; - RequirementDescriptor->u.Interrupt.MinimumVector = RequirementDescriptor->u.Interrupt.MaximumVector - = irq_data->interrupts[i]; - - ResourceDescriptor++; - RequirementDescriptor++; - } - break; - } - case dma: - { - DMA_RESOURCE *dma_data = (DMA_RESOURCE*) &resource->data; - for (i = 0; i < dma_data->number_of_channels; i++) - { - ResourceDescriptor->Type = CmResourceTypeDma; - ResourceDescriptor->Flags = 0; - switch (dma_data->type) - { - case TYPE_A: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_A; break; - case TYPE_B: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_B; break; - case TYPE_F: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_TYPE_F; break; - } - if (dma_data->bus_master == BUS_MASTER) - ResourceDescriptor->Flags |= CM_RESOURCE_DMA_BUS_MASTER; - switch (dma_data->transfer) - { - case TRANSFER_8: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_8; break; - case TRANSFER_16: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_16; break; - case TRANSFER_8_16: ResourceDescriptor->Flags |= CM_RESOURCE_DMA_8_AND_16; break; - } - ResourceDescriptor->u.Dma.Channel = dma_data->channels[i]; - - RequirementDescriptor->Option = 0; /* Required */ - RequirementDescriptor->Type = ResourceDescriptor->Type; - RequirementDescriptor->ShareDisposition = ResourceDescriptor->ShareDisposition; - RequirementDescriptor->Flags = ResourceDescriptor->Flags; - RequirementDescriptor->u.Dma.MinimumChannel = RequirementDescriptor->u.Dma.MaximumChannel - = ResourceDescriptor->u.Dma.Channel; - - ResourceDescriptor++; - RequirementDescriptor++; - } - break; - } - case io: - { - IO_RESOURCE *io_data = (IO_RESOURCE*) &resource->data; - ResourceDescriptor->Type = CmResourceTypePort; - ResourceDescriptor->ShareDisposition = CmResourceShareDriverExclusive; - ResourceDescriptor->Flags = CM_RESOURCE_PORT_IO; - if (io_data->io_decode == DECODE_16) - ResourceDescriptor->Flags |= CM_RESOURCE_PORT_16_BIT_DECODE; - else - ResourceDescriptor->Flags |= CM_RESOURCE_PORT_10_BIT_DECODE; - ResourceDescriptor->u.Port.Start.u.HighPart = 0; - ResourceDescriptor->u.Port.Start.u.LowPart = io_data->min_base_address; - ResourceDescriptor->u.Port.Length = io_data->range_length; - - RequirementDescriptor->Option = 0; /* Required */ - RequirementDescriptor->Type = ResourceDescriptor->Type; - RequirementDescriptor->ShareDisposition = ResourceDescriptor->ShareDisposition; - RequirementDescriptor->Flags = ResourceDescriptor->Flags; - RequirementDescriptor->u.Port.Length = ResourceDescriptor->u.Port.Length; - RequirementDescriptor->u.Port.Alignment = 1; /* Start address is specified, so it doesn't matter */ - RequirementDescriptor->u.Port.MinimumAddress = RequirementDescriptor->u.Port.MaximumAddress - = ResourceDescriptor->u.Port.Start; - - ResourceDescriptor++; - RequirementDescriptor++; - break; - } - case end_tag: - { - Done = TRUE; - break; - } - default: - { - break; - } - } - resource = NEXT_RESOURCE(resource); - } - - acpi_rs_dump_resource_list(resource); - return TRUE; -} - - -static BOOLEAN -AcpiCheckIfIsSerialDebugPort( - IN PACPI_DEVICE Device) -{ - ACPI_STATUS AcpiStatus; - BM_NODE *Node; - ACPI_BUFFER Buffer; - BOOLEAN Done; - RESOURCE* resource; - - AcpiStatus = bm_get_node(Device->BmHandle, 0, &Node); - if (!ACPI_SUCCESS(AcpiStatus)) - return FALSE; - - /* Get current resources */ - Buffer.length = 0; - AcpiStatus = acpi_get_current_resources(Node->device.acpi_handle, &Buffer); - if ((AcpiStatus & ACPI_OK) == 0) - return FALSE; - if (Buffer.length == 0) - return FALSE; - - Buffer.pointer = ExAllocatePool(PagedPool, Buffer.length); - if (!Buffer.pointer) - return FALSE; - AcpiStatus = acpi_get_current_resources(Node->device.acpi_handle, &Buffer); - if (!ACPI_SUCCESS(AcpiStatus)) - { - ExFreePool(Buffer.pointer); - return FALSE; - } - - /* Loop through the list of resources to see if the - * device is using the serial port address - */ - Done = FALSE; - resource = (RESOURCE*)Buffer.pointer; - while (!Done) - { - switch (resource->id) - { - case io: - { - IO_RESOURCE *io_data = (IO_RESOURCE*) &resource->data; - if (KdComPortInUse == UlongToPtr(io_data->min_base_address)) - { - ExFreePool(Buffer.pointer); - return TRUE; - } - break; - } - case end_tag: - { - Done = TRUE; - break; - } - default: - { - break; - } - } - resource = (RESOURCE *) ((NATIVE_UINT) resource + (NATIVE_UINT) resource->length); - } - - ExFreePool(Buffer.pointer); - return FALSE; -} - -static NTSTATUS -FdoQueryBusRelations( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - PIO_STACK_LOCATION IrpSp) -{ - PPDO_DEVICE_EXTENSION PdoDeviceExtension; - PFDO_DEVICE_EXTENSION DeviceExtension; - PDEVICE_RELATIONS Relations; - PLIST_ENTRY CurrentEntry; - ACPI_STATUS AcpiStatus; - PACPI_DEVICE Device; - NTSTATUS Status = STATUS_SUCCESS; - BM_NODE *Node; - ULONG Size; - ULONG i; - - DPRINT("Called\n"); - - DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - Size = sizeof(DEVICE_RELATIONS) + sizeof(Relations->Objects) * - (DeviceExtension->DeviceListCount - 1); - Relations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, Size); - if (!Relations) - return STATUS_INSUFFICIENT_RESOURCES; - - Relations->Count = DeviceExtension->DeviceListCount; - - i = 0; - CurrentEntry = DeviceExtension->DeviceListHead.Flink; - while (CurrentEntry != &DeviceExtension->DeviceListHead) - { - ACPI_BUFFER Buffer; - Device = CONTAINING_RECORD(CurrentEntry, ACPI_DEVICE, DeviceListEntry); - - if (AcpiCheckIfIsSerialDebugPort(Device)) - { - /* Skip this device */ - DPRINT("Found debug serial port ; skipping it\n"); - Relations->Count--; - CurrentEntry = CurrentEntry->Flink; - continue; - } - - /* FIXME: For ACPI namespace devices on the motherboard create filter DOs - and attach them just above the ACPI bus device object (PDO) */ - - /* FIXME: For other devices in ACPI namespace, but not on motherboard, - create PDOs */ - - if (!Device->Pdo) - { - /* Create a physical device object for the - device as it does not already have one */ - Status = IoCreateDevice(DeviceObject->DriverObject, - sizeof(PDO_DEVICE_EXTENSION), - NULL, - FILE_DEVICE_CONTROLLER, - FILE_AUTOGENERATED_DEVICE_NAME, - FALSE, - &Device->Pdo); - if (!NT_SUCCESS(Status)) - { - DPRINT("IoCreateDevice() failed with status 0x%X\n", Status); - /* FIXME: Cleanup all new PDOs created in this call */ - ExFreePool(Relations); - return Status; - } - - PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)Device->Pdo->DeviceExtension; - - RtlZeroMemory(PdoDeviceExtension, sizeof(PDO_DEVICE_EXTENSION)); - - Device->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE; - - Device->Pdo->Flags &= ~DO_DEVICE_INITIALIZING; - - //Device->Pdo->Flags |= DO_POWER_PAGABLE; - - PdoDeviceExtension->Common.DeviceObject = Device->Pdo; - - PdoDeviceExtension->Common.DevicePowerState = PowerDeviceD0; - -// PdoDeviceExtension->Common.Ldo = IoAttachDeviceToDeviceStack(DeviceObject, -// Device->Pdo); - - RtlInitUnicodeString(&PdoDeviceExtension->DeviceID, NULL); - RtlInitUnicodeString(&PdoDeviceExtension->InstanceID, NULL); - RtlInitUnicodeString(&PdoDeviceExtension->HardwareIDs, NULL); - - AcpiStatus = bm_get_node(Device->BmHandle, 0, &Node); - if (ACPI_SUCCESS(AcpiStatus)) - { - /* Get current resources */ - Buffer.length = 0; - Status = acpi_get_current_resources(Node->device.acpi_handle, &Buffer); - if ((Status & ACPI_OK) == 0) - { - ASSERT(FALSE); - } - if (Buffer.length > 0) - { - Buffer.pointer = ExAllocatePool(PagedPool, Buffer.length); - if (!Buffer.pointer) - { - ASSERT(FALSE); - } - Status = acpi_get_current_resources(Node->device.acpi_handle, &Buffer); - if (ACPI_FAILURE(Status)) - { - ASSERT(FALSE); - } - if (!AcpiCreateResourceList(&PdoDeviceExtension->ResourceList, - &PdoDeviceExtension->ResourceListSize, - &PdoDeviceExtension->ResourceRequirementsList, - &PdoDeviceExtension->ResourceRequirementsListSize, - (RESOURCE*)Buffer.pointer)) - { - ASSERT(FALSE); - } - ExFreePool(Buffer.pointer); - } - - /* Add Device ID string */ - if (!AcpiCreateDeviceIDString(&PdoDeviceExtension->DeviceID, - Node)) - { - ASSERT(FALSE); -// ErrorStatus = STATUS_INSUFFICIENT_RESOURCES; -// ErrorOccurred = TRUE; -// break; - } - - if (!AcpiCreateInstanceIDString(&PdoDeviceExtension->InstanceID, - Node)) - { - ASSERT(FALSE); -// ErrorStatus = STATUS_INSUFFICIENT_RESOURCES; -// ErrorOccurred = TRUE; -// break; - } - - if (!AcpiCreateHardwareIDsString(&PdoDeviceExtension->HardwareIDs, - Node)) - { - ASSERT(FALSE); -// ErrorStatus = STATUS_INSUFFICIENT_RESOURCES; -// ErrorOccurred = TRUE; -// break; - } - - if (!AcpiCreateDeviceDescriptionString(&PdoDeviceExtension->DeviceDescription, - Node)) - { - ASSERT(FALSE); -// ErrorStatus = STATUS_INSUFFICIENT_RESOURCES; -// ErrorOccurred = TRUE; -// break; - } - } - } - - /* Reference the physical device object. The PnP manager - will dereference it again when it is no longer needed */ - ObReferenceObject(Device->Pdo); - - Relations->Objects[i] = Device->Pdo; - - i++; - - CurrentEntry = CurrentEntry->Flink; - } - - Irp->IoStatus.Information = (ULONG_PTR)Relations; - - return Status; -} - -#ifndef NDEBUG -static VOID -ACPIPrintInfo( - PFDO_DEVICE_EXTENSION DeviceExtension) -{ - DbgPrint("ACPI: System firmware supports:\n"); - - /* - * Print out basic system information - */ - DbgPrint("+------------------------------------------------------------\n"); - DbgPrint("| Sx states: %cS0 %cS1 %cS2 %cS3 %cS4 %cS5\n", - (DeviceExtension->SystemStates[0]?'+':'-'), - (DeviceExtension->SystemStates[1]?'+':'-'), - (DeviceExtension->SystemStates[2]?'+':'-'), - (DeviceExtension->SystemStates[3]?'+':'-'), - (DeviceExtension->SystemStates[4]?'+':'-'), - (DeviceExtension->SystemStates[5]?'+':'-')); - DbgPrint("+------------------------------------------------------------\n"); -} -#endif - -static NTSTATUS -ACPIInitializeInternalDriver( - PFDO_DEVICE_EXTENSION DeviceExtension, - ACPI_DRIVER_FUNCTION Initialize, - ACPI_DRIVER_FUNCTION Terminate) -{ - ACPI_STATUS AcpiStatus; - - AcpiStatus = Initialize(); - if (!ACPI_SUCCESS(AcpiStatus)) { - DPRINT("BN init status 0x%X\n", AcpiStatus); - return STATUS_UNSUCCESSFUL; - } -#if 0 - AcpiDevice = (PACPI_DEVICE)ExAllocatePool( - NonPagedPool, sizeof(ACPI_DEVICE)); - if (!AcpiDevice) { - return STATUS_INSUFFICIENT_RESOURCES; - } - - AcpiDevice->Initialize = Initialize; - AcpiDevice->Terminate = Terminate; - - /* FIXME: Create PDO */ - - AcpiDevice->Pdo = NULL; - //AcpiDevice->BmHandle = HandleList.handles[i]; - - ExInterlockedInsertHeadList(&DeviceExtension->DeviceListHead, - &AcpiDevice->ListEntry, &DeviceExtension->DeviceListLock); -#endif - return STATUS_SUCCESS; -} - - -static NTSTATUS -ACPIInitializeInternalDrivers( - PFDO_DEVICE_EXTENSION DeviceExtension) -{ - NTSTATUS Status; - - Status = ACPIInitializeInternalDriver(DeviceExtension, - bn_initialize, bn_terminate); - - return STATUS_SUCCESS; -} - - -static NTSTATUS -FdoStartDevice( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) -{ - PFDO_DEVICE_EXTENSION DeviceExtension; - ACPI_PHYSICAL_ADDRESS rsdp; - ACPI_SYSTEM_INFO SysInfo; - ACPI_STATUS AcpiStatus; - ACPI_BUFFER Buffer; - UCHAR TypeA, TypeB; - ULONG i; - - DPRINT("Called\n"); - - DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - ASSERT(DeviceExtension->State == dsStopped); - - AcpiStatus = acpi_initialize_subsystem(); - if (!ACPI_SUCCESS(AcpiStatus)) { - DPRINT("acpi_initialize_subsystem() failed with status 0x%X\n", AcpiStatus); - return STATUS_UNSUCCESSFUL; - } - - AcpiStatus = acpi_find_root_pointer(&rsdp); - if (!ACPI_SUCCESS(AcpiStatus)) { - DPRINT("acpi_find_root_pointer() failed with status 0x%X\n", AcpiStatus); - return STATUS_UNSUCCESSFUL; - } - - /* From this point on, on error we must call acpi_terminate() */ - - AcpiStatus = acpi_load_tables(rsdp); - if (!ACPI_SUCCESS(AcpiStatus)) { - DPRINT("acpi_load_tables() failed with status 0x%X\n", AcpiStatus); - acpi_terminate(); - return STATUS_UNSUCCESSFUL; - } - - Buffer.length = sizeof(SysInfo); - Buffer.pointer = &SysInfo; - - AcpiStatus = acpi_get_system_info(&Buffer); - if (!ACPI_SUCCESS(AcpiStatus)) { - DPRINT("acpi_get_system_info() failed with status 0x%X\n", AcpiStatus); - acpi_terminate(); - return STATUS_UNSUCCESSFUL; - } - - DPRINT("ACPI CA Core Subsystem version 0x%X\n", SysInfo.acpi_ca_version); - - ASSERT(SysInfo.num_table_types > ACPI_TABLE_FADT); - - RtlMoveMemory(&acpi_fadt, - &SysInfo.table_info[ACPI_TABLE_FADT], - sizeof(FADT_DESCRIPTOR_REV2)); - - AcpiStatus = acpi_enable_subsystem(ACPI_FULL_INITIALIZATION); - if (!ACPI_SUCCESS(AcpiStatus)) { - DPRINT("acpi_enable_subsystem() failed with status 0x%X\n", AcpiStatus); - acpi_terminate(); - return STATUS_UNSUCCESSFUL; - } - - DPRINT("ACPI CA Core Subsystem enabled\n"); - - /* - * Sx States: - * ---------- - * Figure out which Sx states are supported - */ - for (i=0; i<=ACPI_S_STATES_MAX; i++) { - AcpiStatus = acpi_hw_obtain_sleep_type_register_data( - i, - &TypeA, - &TypeB); - DPRINT("acpi_hw_obtain_sleep_type_register_data (%d) status 0x%X\n", - i, AcpiStatus); - if (ACPI_SUCCESS(AcpiStatus)) { - DeviceExtension->SystemStates[i] = TRUE; - } - } - -#ifndef NDEBUG - ACPIPrintInfo(DeviceExtension); -#endif - - /* Initialize ACPI bus manager */ - AcpiStatus = bm_initialize(); - if (!ACPI_SUCCESS(AcpiStatus)) { - DPRINT("bm_initialize() failed with status 0x%X\n", AcpiStatus); - acpi_terminate(); - return STATUS_UNSUCCESSFUL; - } - - InitializeListHead(&DeviceExtension->DeviceListHead); - KeInitializeSpinLock(&DeviceExtension->DeviceListLock); - DeviceExtension->DeviceListCount = 0; - -#if 0 - ACPIEnumerateDevices(DeviceExtension); -#endif - - ACPIInitializeInternalDrivers(DeviceExtension); - - DeviceExtension->State = dsStarted; - - return STATUS_SUCCESS; -} - - -static NTSTATUS -FdoSetPower( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - PIO_STACK_LOCATION IrpSp) -{ - PFDO_DEVICE_EXTENSION DeviceExtension; - ACPI_STATUS AcpiStatus; - NTSTATUS Status; - ULONG AcpiState; - - DPRINT("Called\n"); - - DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - if (IrpSp->Parameters.Power.Type == SystemPowerState) { - Status = STATUS_SUCCESS; - switch (IrpSp->Parameters.Power.State.SystemState) { - case PowerSystemSleeping1: - AcpiState = ACPI_STATE_S1; - break; - case PowerSystemSleeping2: - AcpiState = ACPI_STATE_S2; - break; - case PowerSystemSleeping3: - AcpiState = ACPI_STATE_S3; - break; - case PowerSystemHibernate: - AcpiState = ACPI_STATE_S4; - break; - case PowerSystemShutdown: - AcpiState = ACPI_STATE_S5; - break; - default: - Status = STATUS_UNSUCCESSFUL; - return Status; - } - if (!DeviceExtension->SystemStates[AcpiState]) { - DPRINT("System sleep state S%d is not supported by hardware\n", AcpiState); - Status = STATUS_UNSUCCESSFUL; - } - - if (NT_SUCCESS(Status)) { - DPRINT("Trying to enter sleep state %d\n", AcpiState); - - AcpiStatus = acpi_enter_sleep_state(AcpiState); - if (!ACPI_SUCCESS(AcpiStatus)) { - DPRINT("Failed to enter sleep state %d (Status 0x%X)\n", - AcpiState, AcpiStatus); - Status = STATUS_UNSUCCESSFUL; - } - } - } else { - Status = STATUS_UNSUCCESSFUL; - } - - return Status; -} - - -/*** PUBLIC ******************************************************************/ - -NTSTATUS -NTAPI -FdoPnpControl( - PDEVICE_OBJECT DeviceObject, - PIRP Irp) -/* - * FUNCTION: Handle Plug and Play IRPs for the ACPI device - * ARGUMENTS: - * DeviceObject = Pointer to functional device object of the ACPI driver - * Irp = Pointer to IRP that should be handled - * RETURNS: - * Status - */ -{ - PIO_STACK_LOCATION IrpSp; - NTSTATUS Status; - - DPRINT("Called\n"); - - IrpSp = IoGetCurrentIrpStackLocation(Irp); - switch (IrpSp->MinorFunction) { - //case IRP_MN_CANCEL_REMOVE_DEVICE: - // Status = STATUS_NOT_IMPLEMENTED; - // break; - - //case IRP_MN_CANCEL_STOP_DEVICE: - // Status = STATUS_NOT_IMPLEMENTED; - // break; - - //case IRP_MN_DEVICE_USAGE_NOTIFICATION: - // Status = STATUS_NOT_IMPLEMENTED; - // break; - - //case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: - // Status = STATUS_NOT_IMPLEMENTED; - // break; - - case IRP_MN_QUERY_DEVICE_RELATIONS: - Status = FdoQueryBusRelations(DeviceObject, Irp, IrpSp); - break; - - //case IRP_MN_QUERY_PNP_DEVICE_STATE: - // Status = STATUS_NOT_IMPLEMENTED; - // break; - - //case IRP_MN_QUERY_REMOVE_DEVICE: - // Status = STATUS_NOT_IMPLEMENTED; - // break; - - //case IRP_MN_QUERY_STOP_DEVICE: - // Status = STATUS_NOT_IMPLEMENTED; - // break; - - //case IRP_MN_REMOVE_DEVICE: - // Status = STATUS_NOT_IMPLEMENTED; - // break; - - case IRP_MN_START_DEVICE: - DPRINT("IRP_MN_START_DEVICE received\n"); - Status = FdoStartDevice(DeviceObject, Irp); - break; - - case IRP_MN_STOP_DEVICE: - /* Currently not supported */ - //bm_terminate(); - Status = STATUS_UNSUCCESSFUL; - break; - - //case IRP_MN_SURPRISE_REMOVAL: - // Status = STATUS_NOT_IMPLEMENTED; - // break; - - default: - DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction); - Status = Irp->IoStatus.Status; - break; - } - - if (Status != STATUS_PENDING) { - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } - - DPRINT("Leaving. Status 0x%X\n", Status); - - return Status; -} - - -NTSTATUS -NTAPI -FdoPowerControl( - PDEVICE_OBJECT DeviceObject, - PIRP Irp) -/* - * FUNCTION: Handle power management IRPs for the ACPI device - * ARGUMENTS: - * DeviceObject = Pointer to functional device object of the ACPI driver - * Irp = Pointer to IRP that should be handled - * RETURNS: - * Status - */ -{ - PIO_STACK_LOCATION IrpSp; - NTSTATUS Status; - - DPRINT("Called\n"); - - IrpSp = IoGetCurrentIrpStackLocation(Irp); - - switch (IrpSp->MinorFunction) { - case IRP_MN_SET_POWER: - Status = FdoSetPower(DeviceObject, Irp, IrpSp); - break; - - default: - DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction); - Status = STATUS_NOT_IMPLEMENTED; - break; - } - - if (Status != STATUS_PENDING) { - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } - - DPRINT("Leaving. Status 0x%X\n", Status); - - return Status; -} - -/* EOF */ diff --git a/reactos/drivers/bus/acpi/ospm/include/acpisys.h b/reactos/drivers/bus/acpi/ospm/include/acpisys.h deleted file mode 100644 index 5e21d6ae1b9..00000000000 --- a/reactos/drivers/bus/acpi/ospm/include/acpisys.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * PROJECT: ReactOS ACPI bus driver - * FILE: acpi/ospm/include/acpisys.h - * PURPOSE: ACPI bus driver definitions - */ -#define ACPI_DEBUG - -typedef ACPI_STATUS (*ACPI_DRIVER_FUNCTION)(VOID); - - -typedef enum -{ - dsStopped, - dsStarted, - dsPaused, - dsRemoved, - dsSurpriseRemoved -} ACPI_DEVICE_STATE; - - -typedef struct _COMMON_DEVICE_EXTENSION -{ - // Pointer to device object, this device extension is associated with - PDEVICE_OBJECT DeviceObject; - // Wether this device extension is for an FDO or PDO - BOOLEAN IsFDO; - // Wether the device is removed - BOOLEAN Removed; - // Current device power state for the device - DEVICE_POWER_STATE DevicePowerState; - // Lower device object - PDEVICE_OBJECT Ldo; -} COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION; - - -/* Physical Device Object device extension for a child device */ -typedef struct _PDO_DEVICE_EXTENSION -{ - // Common device data - COMMON_DEVICE_EXTENSION Common; - // Device ID - UNICODE_STRING DeviceID; - // Instance ID - UNICODE_STRING InstanceID; - // Hardware IDs - UNICODE_STRING HardwareIDs; - // Textual description of device - UNICODE_STRING DeviceDescription; - // Resource list - PCM_RESOURCE_LIST ResourceList; - ULONG ResourceListSize; - // Requirement list - PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirementsList; - ULONG ResourceRequirementsListSize; -} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION; - - -typedef struct _FDO_DEVICE_EXTENSION -{ - // Common device data - COMMON_DEVICE_EXTENSION Common; - // Physical Device Object - PDEVICE_OBJECT Pdo; - // Current state of the driver - ACPI_DEVICE_STATE State; - // Supported system states - BOOLEAN SystemStates[ACPI_S_STATE_COUNT]; - // Namespace device list - LIST_ENTRY DeviceListHead; - // Number of devices in device list - ULONG DeviceListCount; - // Lock for namespace device list - KSPIN_LOCK DeviceListLock; -} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION; - - -typedef struct _ACPI_DEVICE -{ - // Entry on device list - LIST_ENTRY DeviceListEntry; - // Bus manager handle - BM_HANDLE BmHandle; - // Physical Device Object - PDEVICE_OBJECT Pdo; - // Initialization function - ACPI_DRIVER_FUNCTION Initialize; - // Cleanup function - ACPI_DRIVER_FUNCTION Terminate; -} ACPI_DEVICE, *PACPI_DEVICE; - - -/* acpienum.c */ - -NTSTATUS -ACPIEnumerateDevices( - PFDO_DEVICE_EXTENSION DeviceExtension); - - -/* fdo.c */ - -NTSTATUS -NTAPI -FdoPnpControl( - PDEVICE_OBJECT DeviceObject, - PIRP Irp); - -NTSTATUS -NTAPI -FdoPowerControl( - PDEVICE_OBJECT DeviceObject, - PIRP Irp); - -/* pdo.c */ - -NTSTATUS -NTAPI -PdoPnpControl( - PDEVICE_OBJECT DeviceObject, - PIRP Irp); - -NTSTATUS -NTAPI -PdoPowerControl( - PDEVICE_OBJECT DeviceObject, - PIRP Irp); - -/* EOF */ diff --git a/reactos/drivers/bus/acpi/ospm/include/bm.h b/reactos/drivers/bus/acpi/ospm/include/bm.h deleted file mode 100644 index 342e6288f62..00000000000 --- a/reactos/drivers/bus/acpi/ospm/include/bm.h +++ /dev/null @@ -1,624 +0,0 @@ -/***************************************************************************** - * - * Module name: bm.h - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 Andrew Grover - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __BM_H__ -#define __BM_H__ - -#include -#include - - -/***************************************************************************** - * Types & Defines - *****************************************************************************/ - -/* - * Output Flags (Debug): - * --------------------- - */ -#define BM_PRINT_ALL (0x00000000) -#define BM_PRINT_GROUP (0x00000001) -#define BM_PRINT_LINKAGE (0x00000002) -#define BM_PRINT_IDENTIFICATION (0x00000004) -#define BM_PRINT_POWER (0x00000008) -#define BM_PRINT_PRESENT (0x00000010) - - -/* - * /proc Interface: - * ---------------- - */ -#define BM_PROC_ROOT "acpi" -#define BM_PROC_EVENT "event" - -extern struct proc_dir_entry *bm_proc_root; - - -/* - * BM_COMMAND: - * ----------- - */ -typedef u32 BM_COMMAND; - -#define BM_COMMAND_UNKNOWN ((BM_COMMAND) 0x00) - -#define BM_COMMAND_GET_POWER_STATE ((BM_COMMAND) 0x01) -#define BM_COMMAND_SET_POWER_STATE ((BM_COMMAND) 0x02) - -#define BM_COMMAND_DEVICE_SPECIFIC ((BM_COMMAND) 0x80) - -/* - * BM_NOTIFY: - * ---------- - * Standard ACPI notification values, from section 5.6.3 of the ACPI 2.0 - * specification. Note that the Bus Manager internally handles all - * standard ACPI notifications -- driver modules are never sent these - * values (see "Bus Manager Notifications", below). - */ -typedef u32 BM_NOTIFY; - -#define BM_NOTIFY_BUS_CHECK ((BM_NOTIFY) 0x00) -#define BM_NOTIFY_DEVICE_CHECK ((BM_NOTIFY) 0x01) -#define BM_NOTIFY_DEVICE_WAKE ((BM_NOTIFY) 0x02) -#define BM_NOTIFY_EJECT_REQUEST ((BM_NOTIFY) 0x03) -#define BM_NOTIFY_DEVICE_CHECK_LIGHT ((BM_NOTIFY) 0x04) -#define BM_NOTIFY_FREQUENCY_MISMATCH ((BM_NOTIFY) 0x05) -#define BM_NOTIFY_BUS_MODE_MISMATCH ((BM_NOTIFY) 0x06) -#define BM_NOTIFY_POWER_FAULT ((BM_NOTIFY) 0x07) - -/* - * These are a higher-level abstraction of ACPI notifications, intended - * for consumption by driver modules to facilitate PnP. - */ -#define BM_NOTIFY_UNKNOWN ((BM_NOTIFY) 0x00) -#define BM_NOTIFY_DEVICE_ADDED ((BM_NOTIFY) 0x01) -#define BM_NOTIFY_DEVICE_REMOVED ((BM_NOTIFY) 0x02) - - -/* - * BM_HANDLE: - * ---------- - */ -typedef u32 BM_HANDLE; - -#define BM_HANDLE_UNKNOWN ((BM_HANDLE) 0x00) -#define BM_HANDLE_ROOT ((BM_HANDLE) 0x00) -#define BM_HANDLES_MAX 256 - - - -/* - * BM_HANDLE_LIST: - * --------------- - */ -typedef struct -{ - u32 count; - BM_HANDLE handles[BM_HANDLES_MAX]; -} BM_HANDLE_LIST; - - -/* - * BM_DEVICE_TYPE: - * --------------- - */ -typedef u32 BM_DEVICE_TYPE; - -#define BM_TYPE_UNKNOWN ((BM_DEVICE_TYPE) 0x00000000) - -#define BM_TYPE_SCOPE ((BM_DEVICE_TYPE) 0x00000001) -#define BM_TYPE_PROCESSOR ((BM_DEVICE_TYPE) 0x00000002) -#define BM_TYPE_THERMAL_ZONE ((BM_DEVICE_TYPE) 0x00000004) -#define BM_TYPE_POWER_RESOURCE ((BM_DEVICE_TYPE) 0x00000008) -#define BM_TYPE_DEVICE ((BM_DEVICE_TYPE) 0x00000010) -#define BM_TYPE_FIXED_BUTTON ((BM_DEVICE_TYPE) 0x00000020) -#define BM_TYPE_SYSTEM ((BM_DEVICE_TYPE) 0x80000000) -#define BM_TYPE_ALL ((BM_DEVICE_TYPE) 0xFFFFFFFF) - - -/* - * BM_DEVICE_UID: - * -------------- - */ -typedef char BM_DEVICE_UID[9]; - -#define BM_UID_UNKNOWN '0' - - -/* - * BM_DEVICE_HID: - * -------------- - */ -typedef char BM_DEVICE_HID[9]; - -#define BM_HID_UNKNOWN '\0' -#define BM_HID_POWER_BUTTON "PNP0C0C" -#define BM_HID_SLEEP_BUTTON "PNP0C0E" - -/* - * BM_DEVICE_CID: - * The compatibility ID can be a string with 44 characters - * The extra pad is in case there is a change. It also - * provides 8 byte alignment for the BM_DEVICE_ID structure. - * ------------------------------------------------------------- - */ -typedef char BM_DEVICE_CID[46]; - - -/* - * BM_DEVICE_ADR: - * -------------- - */ -typedef u32 BM_DEVICE_ADR; - -#define BM_ADDRESS_UNKNOWN 0 - - -/* - * BM_DEVICE_FLAGS: - * ---------------- - * The encoding of BM_DEVICE_FLAGS is illustrated below. - * Note that a set bit (1) indicates the property is TRUE - * (e.g. if bit 0 is set then the device has dynamic status). - * +--+------------+-+-+-+-+-+-+-+ - * |31| Bits 31:11 |6|5|4|3|2|1|0| - * +--+------------+-+-+-+-+-+-+-+ - * | | | | | | | | | - * | | | | | | | | +- Dynamic status? - * | | | | | | | +--- Identifiable? - * | | | | | | +----- Configurable? - * | | | | | +------- Power Manageable? - * | | | | +--------- Ejectable? - * | | | +----------- Docking Station? - * | | +------------- Fixed-Feature? - * | +-------------------- - * +---------------------------- Driver Control? - * - * Dynamic status: Device has a _STA object. - * Identifiable: Device has a _HID and/or _ADR and possibly other - * identification objects defined. - * Configurable: Device has a _CRS and possibly other configuration - * objects defined. - * Power Control: Device has a _PR0 and/or _PS0 and possibly other - * power management objects defined. - * Ejectable: Device has an _EJD and/or _EJx and possibly other - * dynamic insertion/removal objects defined. - * Docking Station: Device has a _DCK object defined. - * Fixed-Feature: Device does not exist in the namespace; was - * enumerated as a fixed-feature (e.g. power button). - * Power Manageable:Can change device's power consumption behavior. - * Has a HID: In the BIOS ASL this device has a hardware ID as - * defined in section 6.1.4 of ACPI Spec 2.0 - * Has a CID: In the BIOS ASL this device has a compatible ID as - * defined in section 6.1.2 of ACPI Spec 2.0 - * Has a ADR: In the BIOS ASL this device has an address ID as - * defined in section 6.1.1 of ACPI Spec 2.0 - * Is a bridge: This device is recognized as a bridge to another bus. - * Is on PCI bus: This device is on a PCI bus or within PCI configuration - * address space. - * Is on USB bus: This device is on or within USB address space. - * Is on SCSI bus: This device is on or within SCSI address space. - * Driver Control: A driver has been installed for this device. - */ -typedef u32 BM_DEVICE_FLAGS; - -#define BM_FLAGS_UNKNOWN ((BM_DEVICE_FLAGS) 0x00000000) - -#define BM_FLAGS_DYNAMIC_STATUS ((BM_DEVICE_FLAGS) 0x00000001) -#define BM_FLAGS_IDENTIFIABLE ((BM_DEVICE_FLAGS) 0x00000002) -#define BM_FLAGS_CONFIGURABLE ((BM_DEVICE_FLAGS) 0x00000004) -#define BM_FLAGS_POWER_CONTROL ((BM_DEVICE_FLAGS) 0x00000008) -#define BM_FLAGS_EJECTABLE ((BM_DEVICE_FLAGS) 0x00000010) -#define BM_FLAGS_DOCKING_STATION ((BM_DEVICE_FLAGS) 0x00000020) -#define BM_FLAGS_FIXED_FEATURE ((BM_DEVICE_FLAGS) 0x00000040) -#define BM_FLAGS_IS_POWER_MANAGEABLE ((BM_DEVICE_FLAGS) 0x00000080) -#define BM_FLAGS_HAS_A_HID ((BM_DEVICE_FLAGS) 0x00000100) -#define BM_FLAGS_HAS_A_CID ((BM_DEVICE_FLAGS) 0x00000200) -#define BM_FLAGS_HAS_A_ADR ((BM_DEVICE_FLAGS) 0x00000400) -#define BM_FLAGS_IS_A_BRIDGE ((BM_DEVICE_FLAGS) 0x00000800) -#define BM_FLAGS_IS_ON_PCI_BUS ((BM_DEVICE_FLAGS) 0x00001000) -#define BM_FLAGS_IS_ON_USB_BUS ((BM_DEVICE_FLAGS) 0x00002000) -#define BM_FLAGS_IS_ON_SCSI_BUS ((BM_DEVICE_FLAGS) 0x00004000) -#define BM_FLAGS_DRIVER_CONTROL ((BM_DEVICE_FLAGS) 0x80000000) - -/* - * Device PM Flags: - * ---------------- - * +-----------+-+-+-+-+-+-+-+ - * | Bits 31:7 |6|5|4|3|2|1|0| - * +-----------+-+-+-+-+-+-+-+ - * | | | | | | | | - * | | | | | | | +- D0 Support? - * | | | | | | +--- D1 Support? - * | | | | | +----- D2 Support? - * | | | | +------- D3 Support? - * | | | +--------- Power State Queriable? - * | | +----------- Inrush Current? - * | +------------- Wake Capable? - * +-------------------- - * - * D0-D3 Support: Device supports corresponding Dx state. - * Power State: Device has a _PSC (current power state) object defined. - * Inrush Current: Device has an _IRC (inrush current) object defined. - * Wake Capable: Device has a _PRW (wake-capable) object defined. - */ -#define BM_FLAGS_D0_SUPPORT ((BM_DEVICE_FLAGS) 0x00000001) -#define BM_FLAGS_D1_SUPPORT ((BM_DEVICE_FLAGS) 0x00000002) -#define BM_FLAGS_D2_SUPPORT ((BM_DEVICE_FLAGS) 0x00000004) -#define BM_FLAGS_D3_SUPPORT ((BM_DEVICE_FLAGS) 0x00000008) -#define BM_FLAGS_POWER_STATE ((BM_DEVICE_FLAGS) 0x00000010) -#define BM_FLAGS_INRUSH_CURRENT ((BM_DEVICE_FLAGS) 0x00000020) -#define BM_FLAGS_WAKE_CAPABLE ((BM_DEVICE_FLAGS) 0x00000040) - - -/* - * BM_DEVICE_STATUS: - * ----------------- - * The encoding of BM_DEVICE_STATUS is illustrated below. - * Note that a set bit (1) indicates the property is TRUE - * (e.g. if bit 0 is set then the device is present). - * +-----------+-+-+-+-+-+ - * | Bits 31:4 |4|3|2|1|0| - * +-----------+-+-+-+-+-+ - * | | | | | | - * | | | | | +- Present? - * | | | | +--- Enabled? - * | | | +----- Show in UI? - * | | +------- Functioning? - * | +--------- Battery Present? - * +---------------- - */ -typedef u32 BM_DEVICE_STATUS; - -#define BM_STATUS_UNKNOWN ((BM_DEVICE_STATUS) 0x00000000) -#define BM_STATUS_PRESENT ((BM_DEVICE_STATUS) 0x00000001) -#define BM_STATUS_ENABLED ((BM_DEVICE_STATUS) 0x00000002) -#define BM_STATUS_SHOW_UI ((BM_DEVICE_STATUS) 0x00000004) -#define BM_STATUS_FUNCTIONING ((BM_DEVICE_STATUS) 0x00000008) -#define BM_STATUS_BATTERY_PRESENT ((BM_DEVICE_STATUS) 0x00000010) -#define BM_STATUS_DEFAULT ((BM_DEVICE_STATUS) 0x0000000F) - - -typedef u32 BM_POWER_STATE; - -typedef u8 BM_PCI_BUS_NUM; -typedef u8 BM_PCI_DEVICE_NUM; -typedef u8 BM_PCI_FUNCTION_NUM; -typedef u8 BM_U8_RESERVED; -typedef u8 BM_PCI_DEVICE_CLASS_ID; -typedef u8 BM_PCI_DEVICE_SUBCLASS_ID; -typedef u8 BM_PCI_DEVICE_PROG_IF; -typedef u8 BM_PCI_DEVICE_REVISION; -typedef u16 BM_PCI_VENDOR_ID; -typedef u16 BM_PCI_DEVICE_ID; -typedef u32 BM_U32_RESERVED; - - -/* - * BM_DEVICE_ID: - * This structure, when filled in for a device, provides - * an "association" between hardware space and ACPI. - * ----------------------------------------------------------- - */ -typedef struct -{ - BM_DEVICE_CID cid; - BM_DEVICE_HID hid; - BM_DEVICE_UID uid; - BM_DEVICE_TYPE type; - BM_DEVICE_ADR adr; - BM_PCI_BUS_NUM pci_bus_num; - BM_PCI_DEVICE_NUM pci_device_num; - BM_PCI_FUNCTION_NUM pci_func_num; - BM_U8_RESERVED u8_reserved; - BM_PCI_DEVICE_CLASS_ID pci_device_class_id; - BM_PCI_DEVICE_SUBCLASS_ID pci_device_subclass_id; - BM_PCI_DEVICE_PROG_IF pci_device_prog_if; - BM_PCI_DEVICE_REVISION pci_device_rev_num; - BM_PCI_VENDOR_ID pci_vendor_id; - BM_PCI_DEVICE_ID pci_device_id; - BM_U32_RESERVED u32_reserved; -} BM_DEVICE_ID; - - -/* - * BM_DEVICE_POWER: - * ---------------- - * Structure containing basic device power management information. - */ -typedef struct -{ - BM_DEVICE_FLAGS flags; - BM_POWER_STATE state; - BM_DEVICE_FLAGS dx_supported[ACPI_S_STATE_COUNT]; -} BM_DEVICE_POWER; - - -/* - * BM_DEVICE: - * ---------- - */ -typedef struct -{ - BM_HANDLE handle; - ACPI_HANDLE acpi_handle; - BM_DEVICE_FLAGS flags; - BM_DEVICE_STATUS status; - BM_DEVICE_ID id; - BM_DEVICE_POWER power; -} BM_DEVICE; - - -/* - * BM_SEARCH: - * ---------- - * Structure used for searching the ACPI Bus Manager's device hierarchy. - */ -typedef struct -{ - BM_DEVICE_ID criteria; - BM_HANDLE_LIST results; -} BM_SEARCH; - - -/* - * BM_REQUEST: - * ----------- - * Structure used for sending requests to/through the ACPI Bus Manager. - */ -typedef struct -{ - ACPI_STATUS status; - BM_COMMAND command; - BM_HANDLE handle; - ACPI_BUFFER buffer; -} BM_REQUEST; - - -/* - * Driver Registration: - * -------------------- - */ - -/* Driver Context */ -typedef void * BM_DRIVER_CONTEXT; - -/* Notification Callback Function */ -typedef -ACPI_STATUS (*BM_DRIVER_NOTIFY) ( - BM_NOTIFY notify_type, - BM_HANDLE device_handle, - BM_DRIVER_CONTEXT *context); - -/* Request Callback Function */ -typedef -ACPI_STATUS (*BM_DRIVER_REQUEST) ( - BM_REQUEST *request, - BM_DRIVER_CONTEXT context); - -/* Driver Registration */ -typedef struct -{ - BM_DRIVER_NOTIFY notify; - BM_DRIVER_REQUEST request; - BM_DRIVER_CONTEXT context; -} BM_DRIVER; - - -/* - * BM_NODE: - * -------- - * Structure used to maintain the device hierarchy. - */ -typedef struct _BM_NODE -{ - BM_DEVICE device; - BM_DRIVER driver; - struct _BM_NODE *parent; - struct _BM_NODE *next; - struct - { - struct _BM_NODE *head; - struct _BM_NODE *tail; - } scope; -} BM_NODE; - - -/* - * BM_NODE_LIST: - * ------------- - * Structure used to maintain an array of node pointers. - */ -typedef struct -{ - u32 count; - BM_NODE *nodes[BM_HANDLES_MAX]; -} BM_NODE_LIST; - - -/***************************************************************************** - * Macros - *****************************************************************************/ - -#define BM_DEVICE_PRESENT(d) (d->status & BM_STATUS_PRESENT) -#define BM_NODE_PRESENT(n) (n->device.status & BM_STATUS_PRESENT) - - -/***************************************************************************** - * Function Prototypes - *****************************************************************************/ - -/* bm.c */ - -ACPI_STATUS -bm_initialize (void); - -ACPI_STATUS -bm_terminate (void); - -ACPI_STATUS -bm_get_status ( - BM_DEVICE *device); - -ACPI_STATUS -bm_get_handle ( - ACPI_HANDLE acpi_handle, - BM_HANDLE *device_handle); - -ACPI_STATUS -bm_get_node ( - BM_HANDLE device_handle, - ACPI_HANDLE acpi_handle, - BM_NODE **node); - -/* bmsearch.c */ - -ACPI_STATUS -bm_search( - BM_HANDLE device_handle, - BM_DEVICE_ID *criteria, - BM_HANDLE_LIST *results); - -/* bmnotify.c */ - -void -bm_notify ( - ACPI_HANDLE acpi_handle, - u32 notify_value, - void *context); - -/* bm_request.c */ - -ACPI_STATUS -bm_request ( - BM_REQUEST *request_info); - -/* bmxface.c */ - -ACPI_STATUS -bm_get_device_status ( - BM_HANDLE device_handle, - BM_DEVICE_STATUS *device_status); - -ACPI_STATUS -bm_get_device_info ( - BM_HANDLE device_handle, - BM_DEVICE **device_info); - -ACPI_STATUS -bm_get_device_context ( - BM_HANDLE device_handle, - BM_DRIVER_CONTEXT *context); - -ACPI_STATUS -bm_register_driver ( - BM_DEVICE_ID *criteria, - BM_DRIVER *driver); - -ACPI_STATUS -bm_unregister_driver ( - BM_DEVICE_ID *criteria, - BM_DRIVER *driver); - -/* bmpm.c */ - -ACPI_STATUS -bm_get_pm_capabilities ( - BM_NODE *node); - -ACPI_STATUS -bm_get_power_state ( - BM_NODE *node); - -ACPI_STATUS -bm_set_power_state ( - BM_NODE *node, - BM_POWER_STATE target_state); - -/* bmpower.c */ - -ACPI_STATUS -bm_pr_initialize (void); - -ACPI_STATUS -bm_pr_terminate (void); - -/* bmutils.c */ - -ACPI_STATUS -bm_cast_buffer ( - ACPI_BUFFER *buffer, - void **pointer, - u32 length); - -ACPI_STATUS -bm_copy_to_buffer ( - ACPI_BUFFER *buffer, - void *data, - u32 length); - -ACPI_STATUS -bm_extract_package_data ( - ACPI_OBJECT *package, - ACPI_BUFFER *format, - ACPI_BUFFER *buffer); - -ACPI_STATUS -bm_evaluate_object ( - ACPI_HANDLE acpi_handle, - ACPI_STRING pathname, - ACPI_OBJECT_LIST *arguments, - ACPI_BUFFER *buffer); - -ACPI_STATUS -bm_evaluate_simple_integer ( - ACPI_HANDLE acpi_handle, - ACPI_STRING pathname, - u32 *data); - -ACPI_STATUS -bm_evaluate_reference_list ( - ACPI_HANDLE acpi_handle, - ACPI_STRING pathname, - BM_HANDLE_LIST *reference_list); - -/* bm_proc.c */ - -ACPI_STATUS -bm_proc_initialize (void); - -ACPI_STATUS -bm_proc_terminate (void); - -ACPI_STATUS -bm_generate_event ( - BM_HANDLE device_handle, - char *device_type, - char *device_instance, - u32 event_type, - u32 event_data); - - -#endif /* __BM_H__ */ diff --git a/reactos/drivers/bus/acpi/ospm/include/bmpower.h b/reactos/drivers/bus/acpi/ospm/include/bmpower.h deleted file mode 100644 index 2fcbedfa217..00000000000 --- a/reactos/drivers/bus/acpi/ospm/include/bmpower.h +++ /dev/null @@ -1,75 +0,0 @@ -/***************************************************************************** - * - * Module name: bmpower.h - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 Andrew Grover - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __BMPOWER_H__ -#define __BMPOWER_H__ - -#include "bm.h" - - -/***************************************************************************** - * Types & Defines - *****************************************************************************/ - - -/* - * BM_POWER_RESOURCE: - * ------------------ - */ -typedef struct -{ - BM_HANDLE device_handle; - ACPI_HANDLE acpi_handle; - BM_POWER_STATE system_level; - u32 resource_order; - BM_POWER_STATE state; - u32 reference_count; -} BM_POWER_RESOURCE; - - -/***************************************************************************** - * Function Prototypes - *****************************************************************************/ - -/* bmpower.c */ - -ACPI_STATUS -bm_pr_initialize (void); - -ACPI_STATUS -bm_pr_terminate (void); - -ACPI_STATUS -bm_pr_list_get_state ( - BM_HANDLE_LIST *resource_list, - BM_POWER_STATE *power_state); - -ACPI_STATUS -bm_pr_list_transition ( - BM_HANDLE_LIST *current_list, - BM_HANDLE_LIST *target_list); - - -#endif /* __BMPOWER_H__ */ diff --git a/reactos/drivers/bus/acpi/ospm/include/bn.h b/reactos/drivers/bus/acpi/ospm/include/bn.h deleted file mode 100644 index 94f0e8b16a1..00000000000 --- a/reactos/drivers/bus/acpi/ospm/include/bn.h +++ /dev/null @@ -1,113 +0,0 @@ -/****************************************************************************** - * - * Module Name: bn.h - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 Andrew Grover - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#ifndef __BN_H__ -#define __BN_H__ - -#include -#include -#include - - -/***************************************************************************** - * Types & Other Defines - *****************************************************************************/ - -/* - * Notifications: - * --------------------- - */ -#define BN_NOTIFY_STATUS_CHANGE ((BM_NOTIFY) 0x80) - -/* - * Types: - * ------ - */ -#define BN_TYPE_POWER_BUTTON (0x01) -#define BN_TYPE_POWER_BUTTON_FIXED (0x02) -#define BN_TYPE_SLEEP_BUTTON (0x03) -#define BN_TYPE_SLEEP_BUTTON_FIXED (0x04) -#define BN_TYPE_LID_SWITCH (0x05) - -/* - * Hardware IDs: - * ------------- - * TODO: Power and Sleep button HIDs also exist in . Should all - * HIDs (ACPI well-known devices) exist in one place (e.g. - * acpi_hid.h)? - */ -#define BN_HID_POWER_BUTTON "PNP0C0C" -#define BN_HID_SLEEP_BUTTON "PNP0C0E" -#define BN_HID_LID_SWITCH "PNP0C0D" - -/* - * /proc Entries: - * -------------- - */ -#define BN_PROC_ROOT "button" -#define BN_PROC_POWER_BUTTON "power" -#define BN_PROC_SLEEP_BUTTON "sleep" -#define BN_PROC_LID_SWITCH "lid" - -/* - * Device Context: - * --------------- - */ -typedef struct -{ - BM_HANDLE device_handle; - ACPI_HANDLE acpi_handle; - u32 type; -} BN_CONTEXT; - - -/****************************************************************************** - * Function Prototypes - *****************************************************************************/ - -ACPI_STATUS -bn_initialize (void); - -ACPI_STATUS -bn_terminate (void); - -ACPI_STATUS -bn_notify_fixed ( - void *context); - -ACPI_STATUS -bn_notify ( - u32 notify_type, - u32 device, - void **context); - -ACPI_STATUS -bn_request( - BM_REQUEST *request_info, - void *context); - - -#endif /* __BN_H__ */ diff --git a/reactos/drivers/bus/acpi/ospm/osl.c b/reactos/drivers/bus/acpi/ospm/osl.c deleted file mode 100644 index 7c0731a3827..00000000000 --- a/reactos/drivers/bus/acpi/ospm/osl.c +++ /dev/null @@ -1,706 +0,0 @@ -/******************************************************************************* -* * -* ACPI Component Architecture Operating System Layer (OSL) for ReactOS * -* * -*******************************************************************************/ - -/* - * Copyright (C) 2000 Andrew Henroid - * Copyright (C) 2001 Andrew Grover - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include - -#define NDEBUG -#include - -static PKINTERRUPT AcpiInterrupt; -static BOOLEAN AcpiInterruptHandlerRegistered = FALSE; -static OSD_HANDLER AcpiIrqHandler = NULL; -static PVOID AcpiIrqContext = NULL; -static ULONG AcpiIrqNumber = 0; -static KDPC AcpiDpc; -static PVOID IVTVirtualAddress = NULL; - - -VOID NTAPI -OslDpcStub( - IN PKDPC Dpc, - IN PVOID DeferredContext, - IN PVOID SystemArgument1, - IN PVOID SystemArgument2) -{ - OSD_EXECUTION_CALLBACK Routine = (OSD_EXECUTION_CALLBACK)SystemArgument1; - - DPRINT("OslDpcStub()\n"); - - DPRINT("Calling [%p]([%p])\n", Routine, SystemArgument2); - - (*Routine)(SystemArgument2); -} - - -ACPI_STATUS -acpi_os_remove_interrupt_handler( - u32 irq, - OSD_HANDLER handler); - - -ACPI_STATUS -acpi_os_initialize(void) -{ - DPRINT("acpi_os_initialize()\n"); - - KeInitializeDpc(&AcpiDpc, OslDpcStub, NULL); - - return AE_OK; -} - -ACPI_STATUS -acpi_os_terminate(void) -{ - DPRINT("acpi_os_terminate()\n"); - - if (AcpiInterruptHandlerRegistered) { - acpi_os_remove_interrupt_handler(AcpiIrqNumber, AcpiIrqHandler); - } - - return AE_OK; -} - -s32 -acpi_os_printf(const NATIVE_CHAR *fmt,...) -{ - LONG Size; - va_list args; - va_start(args, fmt); - Size = acpi_os_vprintf(fmt, args); - va_end(args); - return Size; -} - -s32 -acpi_os_vprintf(const NATIVE_CHAR *fmt, va_list args) -{ - static char Buffer[512]; - LONG Size = vsprintf(Buffer, fmt, args); - - DPRINT("%s", Buffer); - return Size; -} - -void * -acpi_os_allocate(u32 size) -{ - return ExAllocatePool(NonPagedPool, size); -} - -void * -acpi_os_callocate(u32 size) -{ - PVOID ptr = ExAllocatePool(NonPagedPool, size); - if (ptr) - memset(ptr, 0, size); - return ptr; -} - -void -acpi_os_free(void *ptr) -{ - if (ptr) { - /* FIXME: There is at least one bug somewhere that - results in an attempt to release a null pointer */ - ExFreePool(ptr); - } -} - -ACPI_STATUS -acpi_os_map_memory(ACPI_PHYSICAL_ADDRESS phys, u32 size, void **virt) -{ - PHYSICAL_ADDRESS Address; - PVOID Virtual; - - DPRINT("acpi_os_map_memory(phys 0x%X size 0x%X)\n", (ULONG)phys, size); - - if (phys == 0x0) { - /* Real mode Interrupt Vector Table */ - Virtual = ExAllocatePool(NonPagedPool, size); - IVTVirtualAddress = Virtual; - *virt = Virtual; - return AE_OK; - } - - Address.QuadPart = (ULONG)phys; - *virt = MmMapIoSpace(Address, size, MmNonCached); - if (!*virt) - return AE_ERROR; - - return AE_OK; -} - -void -acpi_os_unmap_memory(void *virt, u32 size) -{ - DPRINT("acpi_os_unmap_memory()\n"); - - if (virt == IVTVirtualAddress) { - /* Real mode Interrupt Vector Table */ - ExFreePool(IVTVirtualAddress); - IVTVirtualAddress = NULL; - return; - } - MmUnmapIoSpace(virt, size); -} - -ACPI_STATUS -acpi_os_get_physical_address(void *virt, ACPI_PHYSICAL_ADDRESS *phys) -{ - PHYSICAL_ADDRESS Address; - - DPRINT("acpi_os_get_physical_address()\n"); - - if (!phys || !virt) - return AE_BAD_PARAMETER; - - Address = MmGetPhysicalAddress(virt); - - *phys = (ULONG)Address.QuadPart; - - return AE_OK; -} - -BOOLEAN NTAPI -OslIsrStub( - PKINTERRUPT Interrupt, - PVOID ServiceContext) -{ - INT32 Status; - - Status = (*AcpiIrqHandler)(AcpiIrqContext); - - if (Status == INTERRUPT_HANDLED) - return TRUE; - else - return FALSE; -} - -ACPI_STATUS -acpi_os_install_interrupt_handler(u32 irq, OSD_HANDLER handler, void *context) -{ - ULONG Vector; - KIRQL DIrql; - KAFFINITY Affinity; - NTSTATUS Status; - - DPRINT("acpi_os_install_interrupt_handler()\n"); - - Vector = HalGetInterruptVector( - Internal, - 0, - irq, - 0, - &DIrql, - &Affinity); - - AcpiIrqNumber = irq; - AcpiIrqHandler = handler; - AcpiIrqContext = context; - AcpiInterruptHandlerRegistered = TRUE; - - Status = IoConnectInterrupt( - &AcpiInterrupt, - OslIsrStub, - NULL, - NULL, - Vector, - DIrql, - DIrql, - LevelSensitive, /* FIXME: LevelSensitive or Latched? */ - TRUE, - Affinity, - FALSE); - if (!NT_SUCCESS(Status)) { - DPRINT("Could not connect to interrupt %d\n", Vector); - return AE_ERROR; - } - - return AE_OK; -} - -ACPI_STATUS -acpi_os_remove_interrupt_handler(u32 irq, OSD_HANDLER handler) -{ - DPRINT("acpi_os_remove_interrupt_handler()\n"); - - if (AcpiInterruptHandlerRegistered) { - IoDisconnectInterrupt(AcpiInterrupt); - AcpiInterrupt = NULL; - AcpiInterruptHandlerRegistered = FALSE; - } - - return AE_OK; -} - -void -acpi_os_sleep(u32 sec, u32 ms) -{ - /* FIXME: Wait */ -} - -void -acpi_os_sleep_usec(u32 us) -{ - KeStallExecutionProcessor(us); -} - -u8 -acpi_os_in8(ACPI_IO_ADDRESS port) -{ - return READ_PORT_UCHAR((PUCHAR)port); -} - -u16 -acpi_os_in16(ACPI_IO_ADDRESS port) -{ - return READ_PORT_USHORT((PUSHORT)port); -} - -u32 -acpi_os_in32(ACPI_IO_ADDRESS port) -{ - return READ_PORT_ULONG((PULONG)port); -} - -void -acpi_os_out8(ACPI_IO_ADDRESS port, u8 val) -{ - WRITE_PORT_UCHAR((PUCHAR)port, val); -} - -void -acpi_os_out16(ACPI_IO_ADDRESS port, u16 val) -{ - WRITE_PORT_USHORT((PUSHORT)port, val); -} - -void -acpi_os_out32(ACPI_IO_ADDRESS port, u32 val) -{ - WRITE_PORT_ULONG((PULONG)port, val); -} - -u8 -acpi_os_mem_in8 (ACPI_PHYSICAL_ADDRESS phys_addr) -{ - return (*(PUCHAR)(ULONG_PTR)phys_addr); -} - -u16 -acpi_os_mem_in16 (ACPI_PHYSICAL_ADDRESS phys_addr) -{ - return (*(PUSHORT)(ULONG_PTR)phys_addr); -} - -u32 -acpi_os_mem_in32 (ACPI_PHYSICAL_ADDRESS phys_addr) -{ - return (*(PULONG)(ULONG_PTR)phys_addr); -} - -void -acpi_os_mem_out8 (ACPI_PHYSICAL_ADDRESS phys_addr, u8 value) -{ - *(PUCHAR)(ULONG_PTR)phys_addr = value; -} - -void -acpi_os_mem_out16 (ACPI_PHYSICAL_ADDRESS phys_addr, u16 value) -{ - *(PUSHORT)(ULONG_PTR)phys_addr = value; -} - -void -acpi_os_mem_out32 (ACPI_PHYSICAL_ADDRESS phys_addr, u32 value) -{ - *(PULONG)(ULONG_PTR)phys_addr = value; -} - -ACPI_STATUS -acpi_os_read_pci_cfg_byte( - u32 bus, - u32 func, - u32 addr, - u8 * val) -{ - NTSTATUS ret; - PCI_SLOT_NUMBER slot; - - if (func == 0) - return AE_ERROR; - - slot.u.AsULONG = 0; - slot.u.bits.DeviceNumber = (func >> 16) & 0xFFFF; - slot.u.bits.FunctionNumber = func & 0xFFFF; - - DPRINT("acpi_os_read_pci_cfg_byte, slot=0x%X, func=0x%X\n", slot.u.AsULONG, func); - ret = HalGetBusDataByOffset(PCIConfiguration, - bus, - slot.u.AsULONG, - val, - addr, - sizeof(UCHAR)); - - if (NT_SUCCESS(ret)) - return AE_OK; - else - return AE_ERROR; -} - -ACPI_STATUS -acpi_os_read_pci_cfg_word( - u32 bus, - u32 func, - u32 addr, - u16 * val) -{ - NTSTATUS ret; - PCI_SLOT_NUMBER slot; - - if (func == 0) - return AE_ERROR; - - slot.u.AsULONG = 0; - slot.u.bits.DeviceNumber = (func >> 16) & 0xFFFF; - slot.u.bits.FunctionNumber = func & 0xFFFF; - - DPRINT("acpi_os_read_pci_cfg_word, slot=0x%x\n", slot.u.AsULONG); - ret = HalGetBusDataByOffset(PCIConfiguration, - bus, - slot.u.AsULONG, - val, - addr, - sizeof(USHORT)); - - if (NT_SUCCESS(ret)) - return AE_OK; - else - return AE_ERROR; -} - -ACPI_STATUS -acpi_os_read_pci_cfg_dword( - u32 bus, - u32 func, - u32 addr, - u32 * val) -{ - NTSTATUS ret; - PCI_SLOT_NUMBER slot; - - if (func == 0) - return AE_ERROR; - - slot.u.AsULONG = 0; - slot.u.bits.DeviceNumber = (func >> 16) & 0xFFFF; - slot.u.bits.FunctionNumber = func & 0xFFFF; - - DPRINT("acpi_os_read_pci_cfg_dword, slot=0x%x\n", slot.u.AsULONG); - ret = HalGetBusDataByOffset(PCIConfiguration, - bus, - slot.u.AsULONG, - val, - addr, - sizeof(ULONG)); - - if (NT_SUCCESS(ret)) - return AE_OK; - else - return AE_ERROR; -} - -ACPI_STATUS -acpi_os_write_pci_cfg_byte( - u32 bus, - u32 func, - u32 addr, - u8 val) -{ - NTSTATUS ret; - UCHAR buf = val; - PCI_SLOT_NUMBER slot; - - if (func == 0) - return AE_ERROR; - - slot.u.AsULONG = 0; - slot.u.bits.DeviceNumber = (func >> 16) & 0xFFFF; - slot.u.bits.FunctionNumber = func & 0xFFFF; - - DPRINT("acpi_os_write_pci_cfg_byte, slot=0x%x\n", slot.u.AsULONG); - ret = HalSetBusDataByOffset(PCIConfiguration, - bus, - slot.u.AsULONG, - &buf, - addr, - sizeof(UCHAR)); - - if (NT_SUCCESS(ret)) - return AE_OK; - else - return AE_ERROR; -} - -ACPI_STATUS -acpi_os_write_pci_cfg_word( - u32 bus, - u32 func, - u32 addr, - u16 val) -{ - NTSTATUS ret; - USHORT buf = val; - PCI_SLOT_NUMBER slot; - - if (func == 0) - return AE_ERROR; - - slot.u.AsULONG = 0; - slot.u.bits.DeviceNumber = (func >> 16) & 0xFFFF; - slot.u.bits.FunctionNumber = func & 0xFFFF; - - DPRINT("acpi_os_write_pci_cfg_byte, slot=0x%x\n", slot.u.AsULONG); - ret = HalSetBusDataByOffset(PCIConfiguration, - bus, - slot.u.AsULONG, - &buf, - addr, - sizeof(USHORT)); - - if (NT_SUCCESS(ret)) - return AE_OK; - else - return AE_ERROR; -} - -ACPI_STATUS -acpi_os_write_pci_cfg_dword( - u32 bus, - u32 func, - u32 addr, - u32 val) -{ - NTSTATUS ret; - ULONG buf = val; - PCI_SLOT_NUMBER slot; - - if (func == 0) - return AE_ERROR; - - slot.u.AsULONG = 0; - slot.u.bits.DeviceNumber = (func >> 16) & 0xFFFF; - slot.u.bits.FunctionNumber = func & 0xFFFF; - - DPRINT("acpi_os_write_pci_cfg_byte, slot=0x%x\n", slot.u.AsULONG); - ret = HalSetBusDataByOffset(PCIConfiguration, - bus, - slot.u.AsULONG, - &buf, - addr, - sizeof(ULONG)); - - if (NT_SUCCESS(ret)) - return AE_OK; - else - return AE_ERROR; -} - -ACPI_STATUS -acpi_os_load_module ( - char *module_name) -{ - DPRINT("acpi_os_load_module()\n"); - - if (!module_name) - return AE_BAD_PARAMETER; - - return AE_OK; -} - -ACPI_STATUS -acpi_os_unload_module ( - char *module_name) -{ - DPRINT("acpi_os_unload_module()\n"); - - if (!module_name) - return AE_BAD_PARAMETER; - - return AE_OK; -} - -ACPI_STATUS -acpi_os_queue_for_execution( - u32 priority, - OSD_EXECUTION_CALLBACK function, - void *context) -{ - ACPI_STATUS Status = AE_OK; - - DPRINT("acpi_os_queue_for_execution()\n"); - - if (!function) - return AE_BAD_PARAMETER; - - DPRINT("Scheduling task [%p](%p) for execution.\n", function, context); - -#if 0 - switch (priority) { - case OSD_PRIORITY_MED: - KeSetImportanceDpc(&AcpiDpc, MediumImportance); - case OSD_PRIORITY_LO: - KeSetImportanceDpc(&AcpiDpc, LowImportance); - case OSD_PRIORITY_HIGH: - default: - KeSetImportanceDpc(&AcpiDpc, HighImportance); - } -#endif - - KeInsertQueueDpc(&AcpiDpc, (PVOID)function, (PVOID)context); - - return Status; -} - -ACPI_STATUS -acpi_os_create_semaphore( - u32 max_units, - u32 initial_units, - ACPI_HANDLE *handle) -{ - PFAST_MUTEX Mutex; - - Mutex = ExAllocatePool(NonPagedPool, sizeof(FAST_MUTEX)); - if (!Mutex) - return AE_NO_MEMORY; - - DPRINT("acpi_os_create_semaphore() at 0x%X\n", Mutex); - - ExInitializeFastMutex(Mutex); - - *handle = Mutex; - return AE_OK; -} - -ACPI_STATUS -acpi_os_delete_semaphore( - ACPI_HANDLE handle) -{ - PFAST_MUTEX Mutex = (PFAST_MUTEX)handle; - - DPRINT("acpi_os_delete_semaphore(handle 0x%X)\n", handle); - - if (!Mutex) - return AE_BAD_PARAMETER; - - ExFreePool(Mutex); - - return AE_OK; -} - -ACPI_STATUS -acpi_os_wait_semaphore( - ACPI_HANDLE handle, - u32 units, - u32 timeout) -{ - PFAST_MUTEX Mutex = (PFAST_MUTEX)handle; - - if (!Mutex || (units < 1)) { - DPRINT("acpi_os_wait_semaphore(handle 0x%X, units %d) Bad parameters\n", - handle, units); - return AE_BAD_PARAMETER; - } - - DPRINT("Waiting for semaphore[%p|%d|%d]\n", handle, units, timeout); - - ExAcquireFastMutex(Mutex); - - return AE_OK; -} - -ACPI_STATUS -acpi_os_signal_semaphore( - ACPI_HANDLE handle, - u32 units) -{ - PFAST_MUTEX Mutex = (PFAST_MUTEX)handle; - - if (!Mutex || (units < 1)) { - DPRINT("acpi_os_signal_semaphore(handle 0x%X) Bad parameter\n", handle); - return AE_BAD_PARAMETER; - } - - DPRINT("Signaling semaphore[%p|%d]\n", handle, units); - - ExReleaseFastMutex(Mutex); - - return AE_OK; -} - -ACPI_STATUS -acpi_os_breakpoint(NATIVE_CHAR *msg) -{ - DPRINT1("BREAKPOINT: %s", msg); - return AE_OK; -} - -void -acpi_os_dbg_trap(char *msg) - -{ - DPRINT1("TRAP: %s", msg); -} - -void -acpi_os_dbg_assert(void *failure, void *file, u32 line, NATIVE_CHAR *msg) -{ - DPRINT1("ASSERT: %s\n", msg); -} - -u32 -acpi_os_get_line(NATIVE_CHAR *buffer) -{ - return 0; -} - -u8 -acpi_os_readable(void *ptr, u32 len) -{ - /* Always readable */ - return TRUE; -} - -u8 -acpi_os_writable(void *ptr, u32 len) -{ - /* Always writable */ - return TRUE; -} - -u32 -acpi_os_get_thread_id (void) -{ - return (ULONG_PTR)PsGetCurrentThreadId() + 1; -} diff --git a/reactos/drivers/bus/acpi/ospm/pdo.c b/reactos/drivers/bus/acpi/ospm/pdo.c deleted file mode 100644 index 9834ee05c28..00000000000 --- a/reactos/drivers/bus/acpi/ospm/pdo.c +++ /dev/null @@ -1,385 +0,0 @@ -/* $Id$ - * - * PROJECT: ReactOS ACPI bus driver - * FILE: acpi/ospm/pdo.c - * PURPOSE: Child device object dispatch routines - * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) - * UPDATE HISTORY: - * 08-08-2001 CSH Created - */ -#include - -#define NDEBUG -#include - -/*** PRIVATE *****************************************************************/ - -static NTSTATUS -AcpiDuplicateUnicodeString( - PUNICODE_STRING Destination, - PUNICODE_STRING Source, - POOL_TYPE PoolType) -{ - if (Source == NULL) - { - RtlInitUnicodeString(Destination, NULL); - return STATUS_SUCCESS; - } - - Destination->Buffer = ExAllocatePool(PoolType, Source->MaximumLength); - if (Destination->Buffer == NULL) - { - return STATUS_INSUFFICIENT_RESOURCES; - } - - Destination->MaximumLength = Source->MaximumLength; - Destination->Length = Source->Length; - RtlCopyMemory(Destination->Buffer, Source->Buffer, Source->MaximumLength); - - return STATUS_SUCCESS; -} - - -static NTSTATUS -PdoQueryDeviceText( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - PIO_STACK_LOCATION IrpSp) -{ - PPDO_DEVICE_EXTENSION DeviceExtension; - PWSTR Buffer; - NTSTATUS Status; - - DPRINT("Called\n"); - - DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - Status = STATUS_SUCCESS; - - switch (IrpSp->Parameters.QueryDeviceText.DeviceTextType) - { - case DeviceTextDescription: - DPRINT("DeviceTextDescription\n"); - Buffer = (PWSTR)ExAllocatePool(PagedPool, DeviceExtension->DeviceDescription.Length + sizeof(UNICODE_NULL)); - if (Buffer == NULL) - Status = STATUS_INSUFFICIENT_RESOURCES; - else - { - RtlCopyMemory(Buffer, DeviceExtension->DeviceDescription.Buffer, DeviceExtension->DeviceDescription.Length); - Buffer[DeviceExtension->DeviceDescription.Length / sizeof(WCHAR)] = UNICODE_NULL; - Irp->IoStatus.Information = (ULONG_PTR)Buffer; - } - break; - - default: - Irp->IoStatus.Information = 0; - Status = STATUS_INVALID_PARAMETER; - } - - return Status; -} - - -static NTSTATUS -PdoQueryId( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - PIO_STACK_LOCATION IrpSp) -{ - PPDO_DEVICE_EXTENSION DeviceExtension; - UNICODE_STRING String; - NTSTATUS Status; - - DPRINT("Called\n"); - - DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - RtlInitUnicodeString(&String, NULL); - -// Irp->IoStatus.Information = 0; - - switch (IrpSp->Parameters.QueryId.IdType) - { - case BusQueryDeviceID: - DPRINT("BusQueryDeviceID\n"); - Status = AcpiDuplicateUnicodeString(&String, - &DeviceExtension->DeviceID, - PagedPool); - DPRINT("DeviceID: %S\n", String.Buffer); - Irp->IoStatus.Information = (ULONG_PTR)String.Buffer; - break; - - case BusQueryHardwareIDs: - DPRINT("BusQueryHardwareIDs\n"); - Status = AcpiDuplicateUnicodeString(&String, - &DeviceExtension->HardwareIDs, - PagedPool); - Irp->IoStatus.Information = (ULONG_PTR)String.Buffer; - break; - - case BusQueryCompatibleIDs: - DPRINT("BusQueryCompatibleIDs\n"); - Status = STATUS_NOT_IMPLEMENTED; - break; - - case BusQueryInstanceID: - DPRINT("BusQueryInstanceID\n"); - Status = AcpiDuplicateUnicodeString(&String, - &DeviceExtension->InstanceID, - PagedPool); - DPRINT("InstanceID: %S\n", String.Buffer); - Irp->IoStatus.Information = (ULONG_PTR)String.Buffer; - break; - - case BusQueryDeviceSerialNumber: - DPRINT("BusQueryDeviceSerialNumber\n"); - Status = STATUS_NOT_IMPLEMENTED; - break; - - default: - DPRINT("Unknown id type: %lx\n", IrpSp->Parameters.QueryId.IdType); - Status = STATUS_NOT_IMPLEMENTED; - } - - return Status; -} - - -static NTSTATUS -PdoQueryResourceRequirements( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - PIO_STACK_LOCATION IrpSp) -{ - PPDO_DEVICE_EXTENSION DeviceExtension; - PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirementsList; - - DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - if (DeviceExtension->ResourceRequirementsListSize == 0) - { - return Irp->IoStatus.Status; - } - - ResourceRequirementsList = ExAllocatePool(PagedPool, DeviceExtension->ResourceRequirementsListSize); - if (!ResourceRequirementsList) - { - Irp->IoStatus.Information = 0; - return STATUS_INSUFFICIENT_RESOURCES; - } - - RtlCopyMemory(ResourceRequirementsList, DeviceExtension->ResourceRequirementsList, DeviceExtension->ResourceRequirementsListSize); - Irp->IoStatus.Information = (ULONG_PTR)ResourceRequirementsList; - return STATUS_SUCCESS; -} - - -static NTSTATUS -PdoQueryResources( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - PIO_STACK_LOCATION IrpSp) -{ - PPDO_DEVICE_EXTENSION DeviceExtension; - PCM_RESOURCE_LIST ResourceList; - - DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - if (DeviceExtension->ResourceListSize == 0) - { - return Irp->IoStatus.Status; - } - - ResourceList = ExAllocatePool(PagedPool, DeviceExtension->ResourceListSize); - if (!ResourceList) - { - Irp->IoStatus.Information = 0; - return STATUS_INSUFFICIENT_RESOURCES; - } - - RtlCopyMemory(ResourceList, DeviceExtension->ResourceList, DeviceExtension->ResourceListSize); - Irp->IoStatus.Information = (ULONG_PTR)ResourceList; - return STATUS_SUCCESS; -} - - -static NTSTATUS -PdoSetPower( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - PIO_STACK_LOCATION IrpSp) -{ - PPDO_DEVICE_EXTENSION DeviceExtension; - NTSTATUS Status; - - DPRINT("Called\n"); - - DeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - if (IrpSp->Parameters.Power.Type == DevicePowerState) { - Status = STATUS_SUCCESS; - switch (IrpSp->Parameters.Power.State.SystemState) { - default: - Status = STATUS_UNSUCCESSFUL; - } - } else { - Status = STATUS_UNSUCCESSFUL; - } - - return Status; -} - - -/*** PUBLIC ******************************************************************/ - -NTSTATUS -NTAPI -PdoPnpControl( - PDEVICE_OBJECT DeviceObject, - PIRP Irp) -/* - * FUNCTION: Handle Plug and Play IRPs for the child device - * ARGUMENTS: - * DeviceObject = Pointer to physical device object of the child device - * Irp = Pointer to IRP that should be handled - * RETURNS: - * Status - */ -{ - PIO_STACK_LOCATION IrpSp; - NTSTATUS Status; - - DPRINT("Called\n"); - - Status = Irp->IoStatus.Status; - - IrpSp = IoGetCurrentIrpStackLocation(Irp); - - switch (IrpSp->MinorFunction) { - case IRP_MN_CANCEL_REMOVE_DEVICE: - break; - - case IRP_MN_CANCEL_STOP_DEVICE: - break; - - case IRP_MN_DEVICE_USAGE_NOTIFICATION: - break; - - case IRP_MN_EJECT: - break; - - case IRP_MN_QUERY_BUS_INFORMATION: - break; - - case IRP_MN_QUERY_CAPABILITIES: - break; - - case IRP_MN_QUERY_DEVICE_RELATIONS: - /* FIXME: Possibly handle for RemovalRelations */ - break; - - case IRP_MN_QUERY_DEVICE_TEXT: - Status = PdoQueryDeviceText(DeviceObject, Irp, IrpSp); - break; - - case IRP_MN_QUERY_ID: - Status = PdoQueryId(DeviceObject, - Irp, - IrpSp); - break; - - case IRP_MN_QUERY_PNP_DEVICE_STATE: - break; - - case IRP_MN_QUERY_REMOVE_DEVICE: - break; - - case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: - Status = PdoQueryResourceRequirements(DeviceObject, - Irp, - IrpSp); - break; - - case IRP_MN_QUERY_RESOURCES: - Status = PdoQueryResources(DeviceObject, - Irp, - IrpSp); - break; - - case IRP_MN_QUERY_STOP_DEVICE: - break; - - case IRP_MN_REMOVE_DEVICE: - break; - - case IRP_MN_SET_LOCK: - break; - - case IRP_MN_START_DEVICE: - Status = STATUS_SUCCESS; - break; - - case IRP_MN_STOP_DEVICE: - break; - - case IRP_MN_SURPRISE_REMOVAL: - break; - - default: - DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction); - break; - } - - if (Status != STATUS_PENDING) { - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } - - DPRINT("Leaving. Status 0x%X\n", Status); - - return Status; -} - -NTSTATUS -NTAPI -PdoPowerControl( - PDEVICE_OBJECT DeviceObject, - PIRP Irp) -/* - * FUNCTION: Handle power management IRPs for the child device - * ARGUMENTS: - * DeviceObject = Pointer to physical device object of the child device - * Irp = Pointer to IRP that should be handled - * RETURNS: - * Status - */ -{ - PIO_STACK_LOCATION IrpSp; - NTSTATUS Status; - - DPRINT("Called\n"); - - IrpSp = IoGetCurrentIrpStackLocation(Irp); - - switch (IrpSp->MinorFunction) { - case IRP_MN_SET_POWER: - Status = PdoSetPower(DeviceObject, Irp, IrpSp); - break; - - default: - DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction); - Status = STATUS_NOT_IMPLEMENTED; - break; - } - - if (Status != STATUS_PENDING) { - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } - - DPRINT("Leaving. Status 0x%X\n", Status); - - return Status; -} - -/* EOF */ diff --git a/reactos/drivers/bus/acpi/parser/psargs.c b/reactos/drivers/bus/acpi/parser/psargs.c deleted file mode 100644 index 1eaa016c0a4..00000000000 --- a/reactos/drivers/bus/acpi/parser/psargs.c +++ /dev/null @@ -1,730 +0,0 @@ -/****************************************************************************** - * - * Module Name: psargs - Parse AML opcode arguments - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_PARSER - MODULE_NAME ("psargs") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_get_next_package_length - * - * PARAMETERS: Parser_state - Current parser state object - * - * RETURN: Decoded package length. On completion, the AML pointer points - * past the length byte or bytes. - * - * DESCRIPTION: Decode and return a package length field - * - ******************************************************************************/ - -u32 -acpi_ps_get_next_package_length ( - ACPI_PARSE_STATE *parser_state) -{ - u32 encoded_length; - u32 length = 0; - - - encoded_length = (u32) GET8 (parser_state->aml); - parser_state->aml++; - - - switch (encoded_length >> 6) /* bits 6-7 contain encoding scheme */ { - case 0: /* 1-byte encoding (bits 0-5) */ - - length = (encoded_length & 0x3F); - break; - - - case 1: /* 2-byte encoding (next byte + bits 0-3) */ - - length = ((GET8 (parser_state->aml) << 04) | - (encoded_length & 0x0F)); - parser_state->aml++; - break; - - - case 2: /* 3-byte encoding (next 2 bytes + bits 0-3) */ - - length = ((GET8 (parser_state->aml + 1) << 12) | - (GET8 (parser_state->aml) << 04) | - (encoded_length & 0x0F)); - parser_state->aml += 2; - break; - - - case 3: /* 4-byte encoding (next 3 bytes + bits 0-3) */ - - length = ((GET8 (parser_state->aml + 2) << 20) | - (GET8 (parser_state->aml + 1) << 12) | - (GET8 (parser_state->aml) << 04) | - (encoded_length & 0x0F)); - parser_state->aml += 3; - break; - } - - return (length); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_get_next_package_end - * - * PARAMETERS: Parser_state - Current parser state object - * - * RETURN: Pointer to end-of-package +1 - * - * DESCRIPTION: Get next package length and return a pointer past the end of - * the package. Consumes the package length field - * - ******************************************************************************/ - -u8 * -acpi_ps_get_next_package_end ( - ACPI_PARSE_STATE *parser_state) -{ - u8 *start = parser_state->aml; - NATIVE_UINT length; - - - length = (NATIVE_UINT) acpi_ps_get_next_package_length (parser_state); - - return (start + length); /* end of package */ -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_get_next_namestring - * - * PARAMETERS: Parser_state - Current parser state object - * - * RETURN: Pointer to the start of the name string (pointer points into - * the AML. - * - * DESCRIPTION: Get next raw namestring within the AML stream. Handles all name - * prefix characters. Set parser state to point past the string. - * (Name is consumed from the AML.) - * - ******************************************************************************/ - -NATIVE_CHAR * -acpi_ps_get_next_namestring ( - ACPI_PARSE_STATE *parser_state) -{ - u8 *start = parser_state->aml; - u8 *end = parser_state->aml; - u32 length; - - - /* Handle multiple prefix characters */ - - while (acpi_ps_is_prefix_char (GET8 (end))) { - /* include prefix '\\' or '^' */ - - end++; - } - - /* Decode the path */ - - switch (GET8 (end)) { - case 0: - - /* Null_name */ - - if (end == start) { - start = NULL; - } - end++; - break; - - - case AML_DUAL_NAME_PREFIX: - - /* two name segments */ - - end += 9; - break; - - - case AML_MULTI_NAME_PREFIX_OP: - - /* multiple name segments */ - - length = (u32) GET8 (end + 1) * 4; - end += 2 + length; - break; - - - default: - - /* single name segment */ - /* assert (Acpi_ps_is_lead (GET8 (End))); */ - - end += 4; - break; - } - - parser_state->aml = (u8*) end; - - return ((NATIVE_CHAR *) start); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_get_next_namepath - * - * PARAMETERS: Parser_state - Current parser state object - * Arg - Where the namepath will be stored - * Arg_count - If the namepath points to a control method - * the method's argument is returned here. - * Method_call - Whether the namepath can be the start - * of a method call - * - * RETURN: None - * - * DESCRIPTION: Get next name (if method call, push appropriate # args). Names - * are looked up in either the parsed or internal namespace to - * determine if the name represents a control method. If a method - * is found, the number of arguments to the method is returned. - * This information is critical for parsing to continue correctly. - * - ******************************************************************************/ - - -#ifdef PARSER_ONLY - -void -acpi_ps_get_next_namepath ( - ACPI_PARSE_STATE *parser_state, - ACPI_PARSE_OBJECT *arg, - u32 *arg_count, - u8 method_call) -{ - NATIVE_CHAR *path; - ACPI_PARSE_OBJECT *name_op; - ACPI_PARSE_OBJECT *op; - ACPI_PARSE_OBJECT *count; - - - path = acpi_ps_get_next_namestring (parser_state); - if (!path || !method_call) { - /* Null name case, create a null namepath object */ - - acpi_ps_init_op (arg, AML_NAMEPATH_OP); - arg->value.name = path; - return; - } - - - if (acpi_gbl_parsed_namespace_root) { - /* - * Lookup the name in the parsed namespace - */ - - op = NULL; - if (method_call) { - op = acpi_ps_find (acpi_ps_get_parent_scope (parser_state), - path, AML_METHOD_OP, 0); - } - - if (op) { - if (op->opcode == AML_METHOD_OP) { - /* - * The name refers to a control method, so this namepath is a - * method invocation. We need to 1) Get the number of arguments - * associated with this method, and 2) Change the NAMEPATH - * object into a METHODCALL object. - */ - - count = acpi_ps_get_arg (op, 0); - if (count && count->opcode == AML_BYTE_OP) { - name_op = acpi_ps_alloc_op (AML_NAMEPATH_OP); - if (name_op) { - /* Change arg into a METHOD CALL and attach the name */ - - acpi_ps_init_op (arg, AML_METHODCALL_OP); - - name_op->value.name = path; - - /* Point METHODCALL/NAME to the METHOD Node */ - - name_op->node = (ACPI_NAMESPACE_NODE *) op; - acpi_ps_append_arg (arg, name_op); - - *arg_count = count->value.integer & - METHOD_FLAGS_ARG_COUNT; - } - } - - return; - } - - /* - * Else this is normal named object reference. - * Just init the NAMEPATH object with the pathname. - * (See code below) - */ - } - } - - - /* - * Either we didn't find the object in the namespace, or the object is - * something other than a control method. Just initialize the Op with the - * pathname - */ - - acpi_ps_init_op (arg, AML_NAMEPATH_OP); - arg->value.name = path; - - - return; -} - - -#else - - -void -acpi_ps_get_next_namepath ( - ACPI_PARSE_STATE *parser_state, - ACPI_PARSE_OBJECT *arg, - u32 *arg_count, - u8 method_call) -{ - NATIVE_CHAR *path; - ACPI_PARSE_OBJECT *name_op; - ACPI_STATUS status; - ACPI_NAMESPACE_NODE *method_node = NULL; - ACPI_NAMESPACE_NODE *node; - ACPI_GENERIC_STATE scope_info; - - - path = acpi_ps_get_next_namestring (parser_state); - if (!path || !method_call) { - /* Null name case, create a null namepath object */ - - acpi_ps_init_op (arg, AML_NAMEPATH_OP); - arg->value.name = path; - return; - } - - - if (method_call) { - /* - * Lookup the name in the internal namespace - */ - scope_info.scope.node = NULL; - node = parser_state->start_node; - if (node) { - scope_info.scope.node = node; - } - - /* - * Lookup object. We don't want to add anything new to the namespace - * here, however. So we use MODE_EXECUTE. Allow searching of the - * parent tree, but don't open a new scope -- we just want to lookup the - * object (MUST BE mode EXECUTE to perform upsearch) - */ - - status = acpi_ns_lookup (&scope_info, path, ACPI_TYPE_ANY, IMODE_EXECUTE, - NS_SEARCH_PARENT | NS_DONT_OPEN_SCOPE, NULL, - &node); - if (ACPI_SUCCESS (status)) { - if (node->type == ACPI_TYPE_METHOD) { - method_node = node; - name_op = acpi_ps_alloc_op (AML_NAMEPATH_OP); - if (name_op) { - /* Change arg into a METHOD CALL and attach name to it */ - - acpi_ps_init_op (arg, AML_METHODCALL_OP); - - name_op->value.name = path; - - /* Point METHODCALL/NAME to the METHOD Node */ - - name_op->node = method_node; - acpi_ps_append_arg (arg, name_op); - - if (!(ACPI_OPERAND_OBJECT *) method_node->object) { - return; - } - - *arg_count = ((ACPI_OPERAND_OBJECT *) method_node->object)->method.param_count; - } - - return; - } - - /* - * Else this is normal named object reference. - * Just init the NAMEPATH object with the pathname. - * (See code below) - */ - } - } - - /* - * Either we didn't find the object in the namespace, or the object is - * something other than a control method. Just initialize the Op with the - * pathname. - */ - - acpi_ps_init_op (arg, AML_NAMEPATH_OP); - arg->value.name = path; - - - return; -} - -#endif - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_get_next_simple_arg - * - * PARAMETERS: Parser_state - Current parser state object - * Arg_type - The argument type (AML_*_ARG) - * Arg - Where the argument is returned - * - * RETURN: None - * - * DESCRIPTION: Get the next simple argument (constant, string, or namestring) - * - ******************************************************************************/ - -void -acpi_ps_get_next_simple_arg ( - ACPI_PARSE_STATE *parser_state, - u32 arg_type, - ACPI_PARSE_OBJECT *arg) -{ - - - switch (arg_type) { - - case ARGP_BYTEDATA: - - acpi_ps_init_op (arg, AML_BYTE_OP); - arg->value.integer = (u32) GET8 (parser_state->aml); - parser_state->aml++; - break; - - - case ARGP_WORDDATA: - - acpi_ps_init_op (arg, AML_WORD_OP); - - /* Get 2 bytes from the AML stream */ - - MOVE_UNALIGNED16_TO_32 (&arg->value.integer, parser_state->aml); - parser_state->aml += 2; - break; - - - case ARGP_DWORDDATA: - - acpi_ps_init_op (arg, AML_DWORD_OP); - - /* Get 4 bytes from the AML stream */ - - MOVE_UNALIGNED32_TO_32 (&arg->value.integer, parser_state->aml); - parser_state->aml += 4; - break; - - - case ARGP_CHARLIST: - - acpi_ps_init_op (arg, AML_STRING_OP); - arg->value.string = (char*) parser_state->aml; - - while (GET8 (parser_state->aml) != '\0') { - parser_state->aml++; - } - parser_state->aml++; - break; - - - case ARGP_NAME: - case ARGP_NAMESTRING: - - acpi_ps_init_op (arg, AML_NAMEPATH_OP); - arg->value.name = acpi_ps_get_next_namestring (parser_state); - break; - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_get_next_field - * - * PARAMETERS: Parser_state - Current parser state object - * - * RETURN: A newly allocated FIELD op - * - * DESCRIPTION: Get next field (Named_field, Reserved_field, or Access_field) - * - ******************************************************************************/ - -ACPI_PARSE_OBJECT * -acpi_ps_get_next_field ( - ACPI_PARSE_STATE *parser_state) -{ - ACPI_PTRDIFF aml_offset = parser_state->aml - - parser_state->aml_start; - ACPI_PARSE_OBJECT *field; - u16 opcode; - u32 name; - - - /* determine field type */ - - switch (GET8 (parser_state->aml)) { - - default: - - opcode = AML_NAMEDFIELD_OP; - break; - - - case 0x00: - - opcode = AML_RESERVEDFIELD_OP; - parser_state->aml++; - break; - - - case 0x01: - - opcode = AML_ACCESSFIELD_OP; - parser_state->aml++; - break; - } - - - /* Allocate a new field op */ - - field = acpi_ps_alloc_op (opcode); - if (field) { - field->aml_offset = aml_offset; - - /* Decode the field type */ - - switch (opcode) { - case AML_NAMEDFIELD_OP: - - /* Get the 4-character name */ - - MOVE_UNALIGNED32_TO_32 (&name, parser_state->aml); - acpi_ps_set_name (field, name); - parser_state->aml += 4; - - /* Get the length which is encoded as a package length */ - - field->value.size = acpi_ps_get_next_package_length (parser_state); - break; - - - case AML_RESERVEDFIELD_OP: - - /* Get the length which is encoded as a package length */ - - field->value.size = acpi_ps_get_next_package_length (parser_state); - break; - - - case AML_ACCESSFIELD_OP: - - /* Get Access_type and Access_atrib and merge into the field Op */ - - field->value.integer = ((GET8 (parser_state->aml) << 8) | - GET8 (parser_state->aml)); - parser_state->aml += 2; - break; - } - } - - return (field); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_get_next_arg - * - * PARAMETERS: Parser_state - Current parser state object - * Arg_type - The argument type (AML_*_ARG) - * Arg_count - If the argument points to a control method - * the method's argument is returned here. - * - * RETURN: An op object containing the next argument. - * - * DESCRIPTION: Get next argument (including complex list arguments that require - * pushing the parser stack) - * - ******************************************************************************/ - -ACPI_PARSE_OBJECT * -acpi_ps_get_next_arg ( - ACPI_PARSE_STATE *parser_state, - u32 arg_type, - u32 *arg_count) -{ - ACPI_PARSE_OBJECT *arg = NULL; - ACPI_PARSE_OBJECT *prev = NULL; - ACPI_PARSE_OBJECT *field; - u32 subop; - - - switch (arg_type) { - case ARGP_BYTEDATA: - case ARGP_WORDDATA: - case ARGP_DWORDDATA: - case ARGP_CHARLIST: - case ARGP_NAME: - case ARGP_NAMESTRING: - - /* constants, strings, and namestrings are all the same size */ - - arg = acpi_ps_alloc_op (AML_BYTE_OP); - if (arg) { - acpi_ps_get_next_simple_arg (parser_state, arg_type, arg); - } - break; - - - case ARGP_PKGLENGTH: - - /* package length, nothing returned */ - - parser_state->pkg_end = acpi_ps_get_next_package_end (parser_state); - break; - - - case ARGP_FIELDLIST: - - if (parser_state->aml < parser_state->pkg_end) { - /* non-empty list */ - - while (parser_state->aml < parser_state->pkg_end) { - field = acpi_ps_get_next_field (parser_state); - if (!field) { - break; - } - - if (prev) { - prev->next = field; - } - - else { - arg = field; - } - - prev = field; - } - - /* skip to End of byte data */ - - parser_state->aml = parser_state->pkg_end; - } - break; - - - case ARGP_BYTELIST: - - if (parser_state->aml < parser_state->pkg_end) { - /* non-empty list */ - - arg = acpi_ps_alloc_op (AML_BYTELIST_OP); - if (arg) { - /* fill in bytelist data */ - - arg->value.size = (parser_state->pkg_end - parser_state->aml); - ((ACPI_PARSE2_OBJECT *) arg)->data = parser_state->aml; - } - - /* skip to End of byte data */ - - parser_state->aml = parser_state->pkg_end; - } - break; - - - case ARGP_TARGET: - case ARGP_SUPERNAME: { - subop = acpi_ps_peek_opcode (parser_state); - if (subop == 0 || - acpi_ps_is_leading_char (subop) || - acpi_ps_is_prefix_char (subop)) { - /* Null_name or Name_string */ - - arg = acpi_ps_alloc_op (AML_NAMEPATH_OP); - if (arg) { - acpi_ps_get_next_namepath (parser_state, arg, arg_count, 0); - } - } - - else { - /* single complex argument, nothing returned */ - - *arg_count = 1; - } - } - break; - - - case ARGP_DATAOBJ: - case ARGP_TERMARG: - - /* single complex argument, nothing returned */ - - *arg_count = 1; - break; - - - case ARGP_DATAOBJLIST: - case ARGP_TERMLIST: - case ARGP_OBJLIST: - - if (parser_state->aml < parser_state->pkg_end) { - /* non-empty list of variable arguments, nothing returned */ - - *arg_count = ACPI_VAR_ARGS; - } - break; - } - - return (arg); -} diff --git a/reactos/drivers/bus/acpi/parser/psopcode.c b/reactos/drivers/bus/acpi/parser/psopcode.c deleted file mode 100644 index 5620157e779..00000000000 --- a/reactos/drivers/bus/acpi/parser/psopcode.c +++ /dev/null @@ -1,648 +0,0 @@ -/****************************************************************************** - * - * Module Name: psopcode - Parser opcode information table - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_PARSER - MODULE_NAME ("psopcode") - - -#define _UNK 0x6B -/* - * Reserved ASCII characters. Do not use any of these for - * internal opcodes, since they are used to differentiate - * name strings from AML opcodes - */ -#define _ASC 0x6C -#define _NAM 0x6C -#define _PFX 0x6D -#define _UNKNOWN_OPCODE 0x02 /* An example unknown opcode */ - -#define MAX_EXTENDED_OPCODE 0x88 -#define NUM_EXTENDED_OPCODE MAX_EXTENDED_OPCODE + 1 -#define MAX_INTERNAL_OPCODE -#define NUM_INTERNAL_OPCODE MAX_INTERNAL_OPCODE + 1 - - -/******************************************************************************* - * - * NAME: Acpi_gbl_Aml_op_info - * - * DESCRIPTION: Opcode table. Each entry contains - * The name is a simple ascii string, the operand specifier is an - * ascii string with one letter per operand. The letter specifies - * the operand type. - * - ******************************************************************************/ - - -/* - * Flags byte: 0-4 (5 bits) = Opcode Type - * 5 (1 bit) = Has arguments flag - * 6-7 (2 bits) = Reserved - */ -#define AML_NO_ARGS 0 -#define AML_HAS_ARGS ACPI_OP_ARGS_MASK - -/* - * All AML opcodes and the parse-time arguments for each. Used by the AML parser Each list is compressed - * into a 32-bit number and stored in the master opcode table at the end of this file. - */ - -#define ARGP_ZERO_OP ARG_NONE -#define ARGP_ONE_OP ARG_NONE -#define ARGP_ALIAS_OP ARGP_LIST2 (ARGP_NAMESTRING, ARGP_NAME) -#define ARGP_NAME_OP ARGP_LIST2 (ARGP_NAME, ARGP_DATAOBJ) -#define ARGP_BYTE_OP ARGP_LIST1 (ARGP_BYTEDATA) -#define ARGP_WORD_OP ARGP_LIST1 (ARGP_WORDDATA) -#define ARGP_DWORD_OP ARGP_LIST1 (ARGP_DWORDDATA) -#define ARGP_STRING_OP ARGP_LIST1 (ARGP_CHARLIST) -#define ARGP_QWORD_OP ARGP_LIST1 (ARGP_QWORDDATA) -#define ARGP_SCOPE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_TERMLIST) -#define ARGP_BUFFER_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_BYTELIST) -#define ARGP_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST) -#define ARGP_VAR_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST) -#define ARGP_METHOD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMLIST) -#define ARGP_LOCAL0 ARG_NONE -#define ARGP_LOCAL1 ARG_NONE -#define ARGP_LOCAL2 ARG_NONE -#define ARGP_LOCAL3 ARG_NONE -#define ARGP_LOCAL4 ARG_NONE -#define ARGP_LOCAL5 ARG_NONE -#define ARGP_LOCAL6 ARG_NONE -#define ARGP_LOCAL7 ARG_NONE -#define ARGP_ARG0 ARG_NONE -#define ARGP_ARG1 ARG_NONE -#define ARGP_ARG2 ARG_NONE -#define ARGP_ARG3 ARG_NONE -#define ARGP_ARG4 ARG_NONE -#define ARGP_ARG5 ARG_NONE -#define ARGP_ARG6 ARG_NONE -#define ARGP_STORE_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SUPERNAME) -#define ARGP_REF_OF_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_ADD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_CONCAT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_SUBTRACT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_INCREMENT_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_DECREMENT_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_MULTIPLY_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_DIVIDE_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET, ARGP_TARGET) -#define ARGP_SHIFT_LEFT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_SHIFT_RIGHT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_BIT_AND_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_BIT_NAND_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_BIT_OR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_BIT_NOR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_BIT_XOR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_BIT_NOT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_FIND_SET_LEFT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_FIND_SET_RIGHT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_DEREF_OF_OP ARGP_LIST1 (ARGP_TERMARG) -#define ARGP_CONCAT_RES_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_MOD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_NOTIFY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) -#define ARGP_SIZE_OF_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_INDEX_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_MATCH_OP ARGP_LIST6 (ARGP_TERMARG, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_DWORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) -#define ARGP_WORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) -#define ARGP_BYTE_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) -#define ARGP_BIT_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) -#define ARGP_TYPE_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_QWORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) -#define ARGP_LAND_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LOR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LNOT_OP ARGP_LIST1 (ARGP_TERMARG) -#define ARGP_LEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LGREATER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LLESS_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_TO_BUFFER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_TO_DEC_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_TO_HEX_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_TO_INTEGER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_TO_STRING_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_COPY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SIMPLENAME) -#define ARGP_MID_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) -#define ARGP_CONTINUE_OP ARG_NONE -#define ARGP_IF_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_TERMLIST) -#define ARGP_ELSE_OP ARGP_LIST2 (ARGP_PKGLENGTH, ARGP_TERMLIST) -#define ARGP_WHILE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_TERMLIST) -#define ARGP_NOOP_OP ARG_NONE -#define ARGP_RETURN_OP ARGP_LIST1 (ARGP_TERMARG) -#define ARGP_BREAK_OP ARG_NONE -#define ARGP_BREAK_POINT_OP ARG_NONE -#define ARGP_ONES_OP ARG_NONE -#define ARGP_MUTEX_OP ARGP_LIST2 (ARGP_NAME, ARGP_BYTEDATA) -#define ARGP_EVENT_OP ARGP_LIST1 (ARGP_NAME) -#define ARGP_COND_REF_OF_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SUPERNAME) -#define ARGP_CREATE_FIELD_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME) -#define ARGP_LOAD_TABLE_OP ARGP_LIST6 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LOAD_OP ARGP_LIST2 (ARGP_NAMESTRING, ARGP_SUPERNAME) -#define ARGP_STALL_OP ARGP_LIST1 (ARGP_TERMARG) -#define ARGP_SLEEP_OP ARGP_LIST1 (ARGP_TERMARG) -#define ARGP_ACQUIRE_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_WORDDATA) -#define ARGP_SIGNAL_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_WAIT_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) -#define ARGP_RESET_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_RELEASE_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_FROM_BCD_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_TO_BCD_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) -#define ARGP_UNLOAD_OP ARGP_LIST1 (ARGP_SUPERNAME) -#define ARGP_REVISION_OP ARG_NONE -#define ARGP_DEBUG_OP ARG_NONE -#define ARGP_FATAL_OP ARGP_LIST3 (ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_TERMARG) -#define ARGP_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_DEF_FIELD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_BYTEDATA, ARGP_FIELDLIST) -#define ARGP_DEVICE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_OBJLIST) -#define ARGP_PROCESSOR_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_BYTEDATA, ARGP_OBJLIST) -#define ARGP_POWER_RES_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_WORDDATA, ARGP_OBJLIST) -#define ARGP_THERMAL_ZONE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_OBJLIST) -#define ARGP_INDEX_FIELD_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_NAMESTRING,ARGP_BYTEDATA, ARGP_FIELDLIST) -#define ARGP_BANK_FIELD_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_NAMESTRING,ARGP_TERMARG, ARGP_BYTEDATA, ARGP_FIELDLIST) -#define ARGP_DATA_REGION_OP ARGP_LIST4 (ARGP_NAMESTRING, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LNOTEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LLESSEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_LGREATEREQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG) -#define ARGP_NAMEPATH_OP ARGP_LIST1 (ARGP_NAMESTRING) -#define ARGP_METHODCALL_OP ARGP_LIST1 (ARGP_NAMESTRING) -#define ARGP_BYTELIST_OP ARGP_LIST1 (ARGP_NAMESTRING) -#define ARGP_RESERVEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) -#define ARGP_NAMEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) -#define ARGP_ACCESSFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) -#define ARGP_STATICSTRING_OP ARGP_LIST1 (ARGP_NAMESTRING) - - -/* - * All AML opcodes and the runtime arguments for each. Used by the AML interpreter Each list is compressed - * into a 32-bit number and stored in the master opcode table at the end of this file. - * - * (Used by Acpi_aml_prep_operands procedure and the ASL Compiler) - */ - -#define ARGI_ZERO_OP ARG_NONE -#define ARGI_ONE_OP ARG_NONE -#define ARGI_ALIAS_OP ARGI_INVALID_OPCODE -#define ARGI_NAME_OP ARGI_INVALID_OPCODE -#define ARGI_BYTE_OP ARGI_INVALID_OPCODE -#define ARGI_WORD_OP ARGI_INVALID_OPCODE -#define ARGI_DWORD_OP ARGI_INVALID_OPCODE -#define ARGI_STRING_OP ARGI_INVALID_OPCODE -#define ARGI_QWORD_OP ARGI_INVALID_OPCODE -#define ARGI_SCOPE_OP ARGI_INVALID_OPCODE -#define ARGI_BUFFER_OP ARGI_INVALID_OPCODE -#define ARGI_PACKAGE_OP ARGI_INVALID_OPCODE -#define ARGI_VAR_PACKAGE_OP ARGI_INVALID_OPCODE -#define ARGI_METHOD_OP ARGI_INVALID_OPCODE -#define ARGI_LOCAL0 ARG_NONE -#define ARGI_LOCAL1 ARG_NONE -#define ARGI_LOCAL2 ARG_NONE -#define ARGI_LOCAL3 ARG_NONE -#define ARGI_LOCAL4 ARG_NONE -#define ARGI_LOCAL5 ARG_NONE -#define ARGI_LOCAL6 ARG_NONE -#define ARGI_LOCAL7 ARG_NONE -#define ARGI_ARG0 ARG_NONE -#define ARGI_ARG1 ARG_NONE -#define ARGI_ARG2 ARG_NONE -#define ARGI_ARG3 ARG_NONE -#define ARGI_ARG4 ARG_NONE -#define ARGI_ARG5 ARG_NONE -#define ARGI_ARG6 ARG_NONE -#define ARGI_STORE_OP ARGI_LIST2 (ARGI_ANYTYPE, ARGI_TARGETREF) -#define ARGI_REF_OF_OP ARGI_LIST1 (ARGI_OBJECT_REF) -#define ARGI_ADD_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_CONCAT_OP ARGI_LIST3 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA, ARGI_TARGETREF) -#define ARGI_SUBTRACT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_INCREMENT_OP ARGI_LIST1 (ARGI_INTEGER_REF) -#define ARGI_DECREMENT_OP ARGI_LIST1 (ARGI_INTEGER_REF) -#define ARGI_MULTIPLY_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_DIVIDE_OP ARGI_LIST4 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF, ARGI_TARGETREF) -#define ARGI_SHIFT_LEFT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_SHIFT_RIGHT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_BIT_AND_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_BIT_NAND_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_BIT_OR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_BIT_NOR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_BIT_XOR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_BIT_NOT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_FIND_SET_LEFT_BIT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_FIND_SET_RIGHT_BIT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_DEREF_OF_OP ARGI_LIST1 (ARGI_REFERENCE) -#define ARGI_CONCAT_RES_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_BUFFER, ARGI_TARGETREF) -#define ARGI_MOD_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_NOTIFY_OP ARGI_LIST2 (ARGI_DEVICE_REF, ARGI_INTEGER) -#define ARGI_SIZE_OF_OP ARGI_LIST1 (ARGI_DATAOBJECT) -#define ARGI_INDEX_OP ARGI_LIST3 (ARGI_COMPLEXOBJ, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_MATCH_OP ARGI_LIST6 (ARGI_PACKAGE, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_DWORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) -#define ARGI_WORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) -#define ARGI_BYTE_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) -#define ARGI_BIT_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) -#define ARGI_TYPE_OP ARGI_LIST1 (ARGI_ANYTYPE) -#define ARGI_QWORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE) -#define ARGI_LAND_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_LOR_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_LNOT_OP ARGI_LIST1 (ARGI_INTEGER) -#define ARGI_LEQUAL_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_LGREATER_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_LLESS_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_TO_BUFFER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_DEC_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_HEX_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_INTEGER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) -#define ARGI_TO_STRING_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_FIXED_TARGET) -#define ARGI_COPY_OP ARGI_LIST2 (ARGI_ANYTYPE, ARGI_SIMPLE_TARGET) -#define ARGI_MID_OP ARGI_LIST4 (ARGI_BUFFERSTRING,ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_CONTINUE_OP ARGI_INVALID_OPCODE -#define ARGI_IF_OP ARGI_INVALID_OPCODE -#define ARGI_ELSE_OP ARGI_INVALID_OPCODE -#define ARGI_WHILE_OP ARGI_INVALID_OPCODE -#define ARGI_NOOP_OP ARG_NONE -#define ARGI_RETURN_OP ARGI_INVALID_OPCODE -#define ARGI_BREAK_OP ARG_NONE -#define ARGI_BREAK_POINT_OP ARG_NONE -#define ARGI_ONES_OP ARG_NONE -#define ARGI_MUTEX_OP ARGI_INVALID_OPCODE -#define ARGI_EVENT_OP ARGI_INVALID_OPCODE -#define ARGI_COND_REF_OF_OP ARGI_LIST2 (ARGI_OBJECT_REF, ARGI_TARGETREF) -#define ARGI_CREATE_FIELD_OP ARGI_LIST4 (ARGI_BUFFER, ARGI_INTEGER, ARGI_INTEGER, ARGI_REFERENCE) -#define ARGI_LOAD_TABLE_OP ARGI_LIST6 (ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_TARGETREF) -#define ARGI_LOAD_OP ARGI_LIST2 (ARGI_REGION, ARGI_TARGETREF) -#define ARGI_STALL_OP ARGI_LIST1 (ARGI_INTEGER) -#define ARGI_SLEEP_OP ARGI_LIST1 (ARGI_INTEGER) -#define ARGI_ACQUIRE_OP ARGI_LIST2 (ARGI_MUTEX, ARGI_INTEGER) -#define ARGI_SIGNAL_OP ARGI_LIST1 (ARGI_EVENT) -#define ARGI_WAIT_OP ARGI_LIST2 (ARGI_EVENT, ARGI_INTEGER) -#define ARGI_RESET_OP ARGI_LIST1 (ARGI_EVENT) -#define ARGI_RELEASE_OP ARGI_LIST1 (ARGI_MUTEX) -#define ARGI_FROM_BCD_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF) -#define ARGI_TO_BCD_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_FIXED_TARGET) -#define ARGI_UNLOAD_OP ARGI_LIST1 (ARGI_DDBHANDLE) -#define ARGI_REVISION_OP ARG_NONE -#define ARGI_DEBUG_OP ARG_NONE -#define ARGI_FATAL_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_REGION_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER) -#define ARGI_DEF_FIELD_OP ARGI_INVALID_OPCODE -#define ARGI_DEVICE_OP ARGI_INVALID_OPCODE -#define ARGI_PROCESSOR_OP ARGI_INVALID_OPCODE -#define ARGI_POWER_RES_OP ARGI_INVALID_OPCODE -#define ARGI_THERMAL_ZONE_OP ARGI_INVALID_OPCODE -#define ARGI_INDEX_FIELD_OP ARGI_INVALID_OPCODE -#define ARGI_BANK_FIELD_OP ARGI_INVALID_OPCODE -#define ARGI_DATA_REGION_OP ARGI_LIST3 (ARGI_STRING, ARGI_STRING, ARGI_STRING) -#define ARGI_LNOTEQUAL_OP ARGI_INVALID_OPCODE -#define ARGI_LLESSEQUAL_OP ARGI_INVALID_OPCODE -#define ARGI_LGREATEREQUAL_OP ARGI_INVALID_OPCODE -#define ARGI_NAMEPATH_OP ARGI_INVALID_OPCODE -#define ARGI_METHODCALL_OP ARGI_INVALID_OPCODE -#define ARGI_BYTELIST_OP ARGI_INVALID_OPCODE -#define ARGI_RESERVEDFIELD_OP ARGI_INVALID_OPCODE -#define ARGI_NAMEDFIELD_OP ARGI_INVALID_OPCODE -#define ARGI_ACCESSFIELD_OP ARGI_INVALID_OPCODE -#define ARGI_STATICSTRING_OP ARGI_INVALID_OPCODE - - -/* - * Master Opcode information table. A summary of everything we know about each opcode, all in one place. - */ - - -static ACPI_OPCODE_INFO aml_op_info[] = -{ -/* Index Opcode Type Class Has Arguments? Name Parser Args Interpreter Args */ - -/* 00 */ /* AML_ZERO_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT| AML_NO_ARGS, "Zero", ARGP_ZERO_OP, ARGI_ZERO_OP), -/* 01 */ /* AML_ONE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT| AML_NO_ARGS, "One", ARGP_ONE_OP, ARGI_ONE_OP), -/* 02 */ /* AML_ALIAS_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS, "Alias", ARGP_ALIAS_OP, ARGI_ALIAS_OP), -/* 03 */ /* AML_NAME_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS, "Name", ARGP_NAME_OP, ARGI_NAME_OP), -/* 04 */ /* AML_BYTE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS, "Byte_const", ARGP_BYTE_OP, ARGI_BYTE_OP), -/* 05 */ /* AML_WORD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS, "Word_const", ARGP_WORD_OP, ARGI_WORD_OP), -/* 06 */ /* AML_DWORD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS, "Dword_const", ARGP_DWORD_OP, ARGI_DWORD_OP), -/* 07 */ /* AML_STRING_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS, "String", ARGP_STRING_OP, ARGI_STRING_OP), -/* 08 */ /* AML_SCOPE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS, "Scope", ARGP_SCOPE_OP, ARGI_SCOPE_OP), -/* 09 */ /* AML_BUFFER_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DATA_TERM| AML_HAS_ARGS, "Buffer", ARGP_BUFFER_OP, ARGI_BUFFER_OP), -/* 0A */ /* AML_PACKAGE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DATA_TERM| AML_HAS_ARGS, "Package", ARGP_PACKAGE_OP, ARGI_PACKAGE_OP), -/* 0B */ /* AML_METHOD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS, "Method", ARGP_METHOD_OP, ARGI_METHOD_OP), -/* 0C */ /* AML_LOCAL0 */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS, "Local0", ARGP_LOCAL0, ARGI_LOCAL0), -/* 0D */ /* AML_LOCAL1 */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS, "Local1", ARGP_LOCAL1, ARGI_LOCAL1), -/* 0E */ /* AML_LOCAL2 */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS, "Local2", ARGP_LOCAL2, ARGI_LOCAL2), -/* 0F */ /* AML_LOCAL3 */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS, "Local3", ARGP_LOCAL3, ARGI_LOCAL3), -/* 10 */ /* AML_LOCAL4 */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS, "Local4", ARGP_LOCAL4, ARGI_LOCAL4), -/* 11 */ /* AML_LOCAL5 */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS, "Local5", ARGP_LOCAL5, ARGI_LOCAL5), -/* 12 */ /* AML_LOCAL6 */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS, "Local6", ARGP_LOCAL6, ARGI_LOCAL6), -/* 13 */ /* AML_LOCAL7 */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LOCAL_VARIABLE| AML_NO_ARGS, "Local7", ARGP_LOCAL7, ARGI_LOCAL7), -/* 14 */ /* AML_ARG0 */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS, "Arg0", ARGP_ARG0, ARGI_ARG0), -/* 15 */ /* AML_ARG1 */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS, "Arg1", ARGP_ARG1, ARGI_ARG1), -/* 16 */ /* AML_ARG2 */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS, "Arg2", ARGP_ARG2, ARGI_ARG2), -/* 17 */ /* AML_ARG3 */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS, "Arg3", ARGP_ARG3, ARGI_ARG3), -/* 18 */ /* AML_ARG4 */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS, "Arg4", ARGP_ARG4, ARGI_ARG4), -/* 19 */ /* AML_ARG5 */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS, "Arg5", ARGP_ARG5, ARGI_ARG5), -/* 1_a */ /* AML_ARG6 */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_ARGUMENT| AML_NO_ARGS, "Arg6", ARGP_ARG6, ARGI_ARG6), -/* 1_b */ /* AML_STORE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "Store", ARGP_STORE_OP, ARGI_STORE_OP), -/* 1_c */ /* AML_REF_OF_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS, "Ref_of", ARGP_REF_OF_OP, ARGI_REF_OF_OP), -/* 1_d */ /* AML_ADD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS, "Add", ARGP_ADD_OP, ARGI_ADD_OP), -/* 1_e */ /* AML_CONCAT_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS, "Concatenate", ARGP_CONCAT_OP, ARGI_CONCAT_OP), -/* 1_f */ /* AML_SUBTRACT_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS, "Subtract", ARGP_SUBTRACT_OP, ARGI_SUBTRACT_OP), -/* 20 */ /* AML_INCREMENT_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS, "Increment", ARGP_INCREMENT_OP, ARGI_INCREMENT_OP), -/* 21 */ /* AML_DECREMENT_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS, "Decrement", ARGP_DECREMENT_OP, ARGI_DECREMENT_OP), -/* 22 */ /* AML_MULTIPLY_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS, "Multiply", ARGP_MULTIPLY_OP, ARGI_MULTIPLY_OP), -/* 23 */ /* AML_DIVIDE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS, "Divide", ARGP_DIVIDE_OP, ARGI_DIVIDE_OP), -/* 24 */ /* AML_SHIFT_LEFT_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS, "Shift_left", ARGP_SHIFT_LEFT_OP, ARGI_SHIFT_LEFT_OP), -/* 25 */ /* AML_SHIFT_RIGHT_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS, "Shift_right", ARGP_SHIFT_RIGHT_OP, ARGI_SHIFT_RIGHT_OP), -/* 26 */ /* AML_BIT_AND_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS, "And", ARGP_BIT_AND_OP, ARGI_BIT_AND_OP), -/* 27 */ /* AML_BIT_NAND_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS, "NAnd", ARGP_BIT_NAND_OP, ARGI_BIT_NAND_OP), -/* 28 */ /* AML_BIT_OR_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS, "Or", ARGP_BIT_OR_OP, ARGI_BIT_OR_OP), -/* 29 */ /* AML_BIT_NOR_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS, "NOr", ARGP_BIT_NOR_OP, ARGI_BIT_NOR_OP), -/* 2_a */ /* AML_BIT_XOR_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS, "XOr", ARGP_BIT_XOR_OP, ARGI_BIT_XOR_OP), -/* 2_b */ /* AML_BIT_NOT_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "Not", ARGP_BIT_NOT_OP, ARGI_BIT_NOT_OP), -/* 2_c */ /* AML_FIND_SET_LEFT_BIT_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "Find_set_left_bit", ARGP_FIND_SET_LEFT_BIT_OP, ARGI_FIND_SET_LEFT_BIT_OP), -/* 2_d */ /* AML_FIND_SET_RIGHT_BIT_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "Find_set_right_bit", ARGP_FIND_SET_RIGHT_BIT_OP, ARGI_FIND_SET_RIGHT_BIT_OP), -/* 2_e */ /* AML_DEREF_OF_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS, "Deref_of", ARGP_DEREF_OF_OP, ARGI_DEREF_OF_OP), -/* 2_f */ /* AML_NOTIFY_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC1| AML_HAS_ARGS, "Notify", ARGP_NOTIFY_OP, ARGI_NOTIFY_OP), -/* 30 */ /* AML_SIZE_OF_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS, "Size_of", ARGP_SIZE_OF_OP, ARGI_SIZE_OF_OP), -/* 31 */ /* AML_INDEX_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_INDEX| AML_HAS_ARGS, "Index", ARGP_INDEX_OP, ARGI_INDEX_OP), -/* 32 */ /* AML_MATCH_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MATCH| AML_HAS_ARGS, "Match", ARGP_MATCH_OP, ARGI_MATCH_OP), -/* 33 */ /* AML_DWORD_FIELD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS, "Create_dWord_field", ARGP_DWORD_FIELD_OP, ARGI_DWORD_FIELD_OP), -/* 34 */ /* AML_WORD_FIELD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS, "Create_word_field", ARGP_WORD_FIELD_OP, ARGI_WORD_FIELD_OP), -/* 35 */ /* AML_BYTE_FIELD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS, "Create_byte_field", ARGP_BYTE_FIELD_OP, ARGI_BYTE_FIELD_OP), -/* 36 */ /* AML_BIT_FIELD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS, "Create_bit_field", ARGP_BIT_FIELD_OP, ARGI_BIT_FIELD_OP), -/* 37 */ /* AML_TYPE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS, "Object_type", ARGP_TYPE_OP, ARGI_TYPE_OP), -/* 38 */ /* AML_LAND_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2| AML_HAS_ARGS, "LAnd", ARGP_LAND_OP, ARGI_LAND_OP), -/* 39 */ /* AML_LOR_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2| AML_HAS_ARGS, "LOr", ARGP_LOR_OP, ARGI_LOR_OP), -/* 3_a */ /* AML_LNOT_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2| AML_HAS_ARGS, "LNot", ARGP_LNOT_OP, ARGI_LNOT_OP), -/* 3_b */ /* AML_LEQUAL_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2| AML_HAS_ARGS, "LEqual", ARGP_LEQUAL_OP, ARGI_LEQUAL_OP), -/* 3_c */ /* AML_LGREATER_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2| AML_HAS_ARGS, "LGreater", ARGP_LGREATER_OP, ARGI_LGREATER_OP), -/* 3_d */ /* AML_LLESS_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2| AML_HAS_ARGS, "LLess", ARGP_LLESS_OP, ARGI_LLESS_OP), -/* 3_e */ /* AML_IF_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_HAS_ARGS, "If", ARGP_IF_OP, ARGI_IF_OP), -/* 3_f */ /* AML_ELSE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_HAS_ARGS, "Else", ARGP_ELSE_OP, ARGI_ELSE_OP), -/* 40 */ /* AML_WHILE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_HAS_ARGS, "While", ARGP_WHILE_OP, ARGI_WHILE_OP), -/* 41 */ /* AML_NOOP_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_NO_ARGS, "Noop", ARGP_NOOP_OP, ARGI_NOOP_OP), -/* 42 */ /* AML_RETURN_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_HAS_ARGS, "Return", ARGP_RETURN_OP, ARGI_RETURN_OP), -/* 43 */ /* AML_BREAK_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_NO_ARGS, "Break", ARGP_BREAK_OP, ARGI_BREAK_OP), -/* 44 */ /* AML_BREAK_POINT_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_NO_ARGS, "Break_point", ARGP_BREAK_POINT_OP, ARGI_BREAK_POINT_OP), -/* 45 */ /* AML_ONES_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT| AML_NO_ARGS, "Ones", ARGP_ONES_OP, ARGI_ONES_OP), - -/* Prefixed opcodes (Two-byte opcodes with a prefix op) */ - -/* 46 */ /* AML_MUTEX_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS, "Mutex", ARGP_MUTEX_OP, ARGI_MUTEX_OP), -/* 47 */ /* AML_EVENT_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_NO_ARGS, "Event", ARGP_EVENT_OP, ARGI_EVENT_OP), -/* 48 */ /* AML_COND_REF_OF_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "Cond_ref_of", ARGP_COND_REF_OF_OP, ARGI_COND_REF_OF_OP), -/* 49 */ /* AML_CREATE_FIELD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS, "Create_field", ARGP_CREATE_FIELD_OP, ARGI_CREATE_FIELD_OP), -/* 4_a */ /* AML_LOAD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_RECONFIGURATION| AML_HAS_ARGS, "Load", ARGP_LOAD_OP, ARGI_LOAD_OP), -/* 4_b */ /* AML_STALL_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1| AML_HAS_ARGS, "Stall", ARGP_STALL_OP, ARGI_STALL_OP), -/* 4_c */ /* AML_SLEEP_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1| AML_HAS_ARGS, "Sleep", ARGP_SLEEP_OP, ARGI_SLEEP_OP), -/* 4_d */ /* AML_ACQUIRE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_s| AML_HAS_ARGS, "Acquire", ARGP_ACQUIRE_OP, ARGI_ACQUIRE_OP), -/* 4_e */ /* AML_SIGNAL_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1| AML_HAS_ARGS, "Signal", ARGP_SIGNAL_OP, ARGI_SIGNAL_OP), -/* 4_f */ /* AML_WAIT_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_s| AML_HAS_ARGS, "Wait", ARGP_WAIT_OP, ARGI_WAIT_OP), -/* 50 */ /* AML_RESET_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1| AML_HAS_ARGS, "Reset", ARGP_RESET_OP, ARGI_RESET_OP), -/* 51 */ /* AML_RELEASE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC1| AML_HAS_ARGS, "Release", ARGP_RELEASE_OP, ARGI_RELEASE_OP), -/* 52 */ /* AML_FROM_BCD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "From_bCD", ARGP_FROM_BCD_OP, ARGI_FROM_BCD_OP), -/* 53 */ /* AML_TO_BCD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "To_bCD", ARGP_TO_BCD_OP, ARGI_TO_BCD_OP), -/* 54 */ /* AML_UNLOAD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_RECONFIGURATION| AML_HAS_ARGS, "Unload", ARGP_UNLOAD_OP, ARGI_UNLOAD_OP), -/* 55 */ /* AML_REVISION_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT| AML_NO_ARGS, "Revision", ARGP_REVISION_OP, ARGI_REVISION_OP), -/* 56 */ /* AML_DEBUG_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONSTANT| AML_NO_ARGS, "Debug", ARGP_DEBUG_OP, ARGI_DEBUG_OP), -/* 57 */ /* AML_FATAL_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_FATAL| AML_HAS_ARGS, "Fatal", ARGP_FATAL_OP, ARGI_FATAL_OP), -/* 58 */ /* AML_REGION_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS, "Op_region", ARGP_REGION_OP, ARGI_REGION_OP), -/* 59 */ /* AML_DEF_FIELD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS, "Field", ARGP_DEF_FIELD_OP, ARGI_DEF_FIELD_OP), -/* 5_a */ /* AML_DEVICE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS, "Device", ARGP_DEVICE_OP, ARGI_DEVICE_OP), -/* 5_b */ /* AML_PROCESSOR_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS, "Processor", ARGP_PROCESSOR_OP, ARGI_PROCESSOR_OP), -/* 5_c */ /* AML_POWER_RES_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS, "Power_resource", ARGP_POWER_RES_OP, ARGI_POWER_RES_OP), -/* 5_d */ /* AML_THERMAL_ZONE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS, "Thermal_zone", ARGP_THERMAL_ZONE_OP, ARGI_THERMAL_ZONE_OP), -/* 5_e */ /* AML_INDEX_FIELD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS, "Index_field", ARGP_INDEX_FIELD_OP, ARGI_INDEX_FIELD_OP), -/* 5_f */ /* AML_BANK_FIELD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_NAMED_OBJECT| AML_HAS_ARGS, "Bank_field", ARGP_BANK_FIELD_OP, ARGI_BANK_FIELD_OP), - -/* Internal opcodes that map to invalid AML opcodes */ - -/* 60 */ /* AML_LNOTEQUAL_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_HAS_ARGS, "LNot_equal", ARGP_LNOTEQUAL_OP, ARGI_LNOTEQUAL_OP), -/* 61 */ /* AML_LLESSEQUAL_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_HAS_ARGS, "LLess_equal", ARGP_LLESSEQUAL_OP, ARGI_LLESSEQUAL_OP), -/* 62 */ /* AML_LGREATEREQUAL_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_HAS_ARGS, "LGreater_equal", ARGP_LGREATEREQUAL_OP, ARGI_LGREATEREQUAL_OP), -/* 63 */ /* AML_NAMEPATH_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS, "Name_path", ARGP_NAMEPATH_OP, ARGI_NAMEPATH_OP), -/* 64 */ /* AML_METHODCALL_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_METHOD_CALL| AML_HAS_ARGS, "Method_call", ARGP_METHODCALL_OP, ARGI_METHODCALL_OP), -/* 65 */ /* AML_BYTELIST_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS, "Byte_list", ARGP_BYTELIST_OP, ARGI_BYTELIST_OP), -/* 66 */ /* AML_RESERVEDFIELD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_NO_ARGS, "Reserved_field", ARGP_RESERVEDFIELD_OP, ARGI_RESERVEDFIELD_OP), -/* 67 */ /* AML_NAMEDFIELD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_NO_ARGS, "Named_field", ARGP_NAMEDFIELD_OP, ARGI_NAMEDFIELD_OP), -/* 68 */ /* AML_ACCESSFIELD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_NO_ARGS, "Access_field", ARGP_ACCESSFIELD_OP, ARGI_ACCESSFIELD_OP), -/* 69 */ /* AML_STATICSTRING_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_BOGUS| AML_NO_ARGS, "Static_string", ARGP_STATICSTRING_OP, ARGI_STATICSTRING_OP), -/* 6_a */ /* AML_RETURN_VALUE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_RETURN| AML_HAS_ARGS, "[Return Value]", ARG_NONE, ARG_NONE), -/* 6_b */ /* UNKNOWN OPCODES */ OP_INFO_ENTRY (ACPI_OP_TYPE_UNKNOWN | OPTYPE_BOGUS| AML_HAS_ARGS, "UNKNOWN_OP!", ARG_NONE, ARG_NONE), -/* 6_c */ /* ASCII CHARACTERS */ OP_INFO_ENTRY (ACPI_OP_TYPE_ASCII | OPTYPE_BOGUS| AML_HAS_ARGS, "ASCII_ONLY!", ARG_NONE, ARG_NONE), -/* 6_d */ /* PREFIX CHARACTERS */ OP_INFO_ENTRY (ACPI_OP_TYPE_PREFIX | OPTYPE_BOGUS| AML_HAS_ARGS, "PREFIX_ONLY!", ARG_NONE, ARG_NONE), - - -/* ACPI 2.0 (new) opcodes */ - -/* 6_e */ /* AML_QWORD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_LITERAL| AML_NO_ARGS, "Qword_const", ARGP_QWORD_OP, ARGI_QWORD_OP), -/* 6_f */ /* AML_VAR_PACKAGE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DATA_TERM| AML_HAS_ARGS, "Var_package", ARGP_VAR_PACKAGE_OP, ARGI_VAR_PACKAGE_OP), -/* 70 */ /* AML_CONCAT_RES_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS, "Concat_res", ARGP_CONCAT_RES_OP, ARGI_CONCAT_RES_OP), -/* 71 */ /* AML_MOD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_DYADIC2_r| AML_HAS_ARGS, "Mod", ARGP_MOD_OP, ARGI_MOD_OP), -/* 72 */ /* AML_QWORD_FIELD_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CREATE_FIELD| AML_HAS_ARGS, "Create_qWord_field", ARGP_QWORD_FIELD_OP, ARGI_QWORD_FIELD_OP), -/* 73 */ /* AML_TO_BUFFER_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "To_buffer", ARGP_TO_BUFFER_OP, ARGI_TO_BUFFER_OP), -/* 74 */ /* AML_TO_DEC_STR_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "To_dec_string", ARGP_TO_DEC_STR_OP, ARGI_TO_DEC_STR_OP), -/* 75 */ /* AML_TO_HEX_STR_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "To_hex_string", ARGP_TO_HEX_STR_OP, ARGI_TO_HEX_STR_OP), -/* 76 */ /* AML_TO_INTEGER_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "To_integer", ARGP_TO_INTEGER_OP, ARGI_TO_INTEGER_OP), -/* 77 */ /* AML_TO_STRING_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "To_string", ARGP_TO_STRING_OP, ARGI_TO_STRING_OP), -/* 78 */ /* AML_COPY_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "Copy", ARGP_COPY_OP, ARGI_COPY_OP), -/* 79 */ /* AML_MID_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "Mid", ARGP_MID_OP, ARGI_MID_OP), -/* 7_a */ /* AML_CONTINUE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_CONTROL| AML_NO_ARGS, "Continue", ARGP_CONTINUE_OP, ARGI_CONTINUE_OP), -/* 7_b */ /* AML_LOAD_TABLE_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "Load_table", ARGP_LOAD_TABLE_OP, ARGI_LOAD_TABLE_OP), -/* 7_c */ /* AML_DATA_REGION_OP */ OP_INFO_ENTRY (ACPI_OP_TYPE_OPCODE | OPTYPE_MONADIC2_r| AML_HAS_ARGS, "Data_op_region", ARGP_DATA_REGION_OP, ARGI_DATA_REGION_OP), - -}; - -/* - * This table is directly indexed by the opcodes, and returns an - * index into the table above - */ - -static u8 aml_short_op_info_index[256] = -{ -/* 0 1 2 3 4 5 6 7 */ -/* 8 9 A B C D E F */ -/* 0x00 */ 0x00, 0x01, _UNK, _UNK, _UNK, _UNK, 0x02, _UNK, -/* 0x08 */ 0x03, _UNK, 0x04, 0x05, 0x06, 0x07, 0x6E, _UNK, -/* 0x10 */ 0x08, 0x09, 0x0a, 0x6F, 0x0b, _UNK, _UNK, _UNK, -/* 0x18 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x20 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x28 */ _UNK, _UNK, _UNK, _UNK, _UNK, 0x63, _PFX, _PFX, -/* 0x30 */ 0x67, 0x66, 0x68, 0x65, 0x69, 0x64, 0x6A, _UNK, -/* 0x38 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x40 */ _UNK, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, -/* 0x48 */ _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, -/* 0x50 */ _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, -/* 0x58 */ _ASC, _ASC, _ASC, _UNK, _PFX, _UNK, _PFX, _ASC, -/* 0x60 */ 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, -/* 0x68 */ 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, _UNK, -/* 0x70 */ 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, -/* 0x78 */ 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, -/* 0x80 */ 0x2b, 0x2c, 0x2d, 0x2e, 0x70, 0x71, 0x2f, 0x30, -/* 0x88 */ 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x72, -/* 0x90 */ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x73, 0x74, -/* 0x98 */ 0x75, 0x76, _UNK, _UNK, 0x77, 0x78, 0x79, 0x7A, -/* 0xA0 */ 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x60, 0x61, -/* 0xA8 */ 0x62, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xB0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xB8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xC0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xC8 */ _UNK, _UNK, _UNK, _UNK, 0x44, _UNK, _UNK, _UNK, -/* 0xD0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xD8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xE0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xE8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xF0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0xF8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x45, -}; - - -static u8 aml_long_op_info_index[NUM_EXTENDED_OPCODE] = -{ -/* 0 1 2 3 4 5 6 7 */ -/* 8 9 A B C D E F */ -/* 0x00 */ _UNK, 0x46, 0x47, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x08 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x10 */ _UNK, _UNK, 0x48, 0x49, _UNK, _UNK, _UNK, _UNK, -/* 0x18 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x7B, -/* 0x20 */ 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, -/* 0x28 */ 0x52, 0x53, 0x54, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x30 */ 0x55, 0x56, 0x57, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x38 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x40 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x48 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x50 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x58 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x60 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x68 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x70 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x78 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, -/* 0x80 */ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, -/* 0x88 */ 0x7C, -}; - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_get_opcode_info - * - * PARAMETERS: Opcode - The AML opcode - * - * RETURN: A pointer to the info about the opcode. NULL if the opcode was - * not found in the table. - * - * DESCRIPTION: Find AML opcode description based on the opcode. - * NOTE: This procedure must ALWAYS return a valid pointer! - * - ******************************************************************************/ - -ACPI_OPCODE_INFO * -acpi_ps_get_opcode_info ( - u16 opcode) -{ - ACPI_OPCODE_INFO *op_info; - u8 upper_opcode; - u8 lower_opcode; - - - /* Split the 16-bit opcode into separate bytes */ - - upper_opcode = (u8) (opcode >> 8); - lower_opcode = (u8) opcode; - - /* Default is "unknown opcode" */ - - op_info = &aml_op_info [_UNK]; - - - /* - * Detect normal 8-bit opcode or extended 16-bit opcode - */ - - switch (upper_opcode) { - case 0: - - /* Simple (8-bit) opcode: 0-255, can't index beyond table */ - - op_info = &aml_op_info [aml_short_op_info_index [lower_opcode]]; - break; - - - case AML_EXTOP: - - /* Extended (16-bit, prefix+opcode) opcode */ - - if (lower_opcode <= MAX_EXTENDED_OPCODE) { - op_info = &aml_op_info [aml_long_op_info_index [lower_opcode]]; - } - break; - - - case AML_LNOT_OP: - - /* This case is for the bogus opcodes LNOTEQUAL, LLESSEQUAL, LGREATEREQUAL */ - /* TBD: [Investigate] remove this case? */ - - break; - - - default: - - break; - } - - - /* Get the Op info pointer for this opcode */ - - return (op_info); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_get_opcode_name - * - * PARAMETERS: Opcode - The AML opcode - * - * RETURN: A pointer to the name of the opcode (ASCII String) - * Note: Never returns NULL. - * - * DESCRIPTION: Translate an opcode into a human-readable string - * - ******************************************************************************/ - -NATIVE_CHAR * -acpi_ps_get_opcode_name ( - u16 opcode) -{ - ACPI_OPCODE_INFO *op; - - - op = acpi_ps_get_opcode_info (opcode); - - /* Always guaranteed to return a valid pointer */ - - return ("AE_NOT_CONFIGURED"); -} - - diff --git a/reactos/drivers/bus/acpi/parser/psparse.c b/reactos/drivers/bus/acpi/parser/psparse.c deleted file mode 100644 index 479756ad487..00000000000 --- a/reactos/drivers/bus/acpi/parser/psparse.c +++ /dev/null @@ -1,1223 +0,0 @@ -/****************************************************************************** - * - * Module Name: psparse - Parser top level AML parse routines - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -/* - * Parse the AML and build an operation tree as most interpreters, - * like Perl, do. Parsing is done by hand rather than with a YACC - * generated parser to tightly constrain stack and dynamic memory - * usage. At the same time, parsing is kept flexible and the code - * fairly compact by parsing based on a list of AML opcode - * templates in Aml_op_info[] - */ - -#include - -#define _COMPONENT ACPI_PARSER - MODULE_NAME ("psparse") - - -u32 acpi_gbl_depth = 0; -extern u32 acpi_gbl_scope_depth; - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_peek_opcode - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Get next AML opcode (without incrementing AML pointer) - * - ******************************************************************************/ - -static u32 -acpi_ps_get_opcode_size ( - u32 opcode) -{ - - /* Extended (2-byte) opcode if > 255 */ - - if (opcode > 0x00FF) { - return (2); - } - - /* Otherwise, just a single byte opcode */ - - return (1); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_peek_opcode - * - * PARAMETERS: Parser_state - A parser state object - * - * RETURN: Status - * - * DESCRIPTION: Get next AML opcode (without incrementing AML pointer) - * - ******************************************************************************/ - -u16 -acpi_ps_peek_opcode ( - ACPI_PARSE_STATE *parser_state) -{ - u8 *aml; - u16 opcode; - - - aml = parser_state->aml; - opcode = (u16) GET8 (aml); - - aml++; - - - /* - * Original code special cased LNOTEQUAL, LLESSEQUAL, LGREATEREQUAL. - * These opcodes are no longer recognized. Instead, they are broken into - * two opcodes. - * - * - * if (Opcode == AML_EXTOP - * || (Opcode == AML_LNOT - * && (GET8 (Acpi_aml) == AML_LEQUAL - * || GET8 (Acpi_aml) == AML_LGREATER - * || GET8 (Acpi_aml) == AML_LLESS))) - * - * extended Opcode, !=, <=, or >= - */ - - if (opcode == AML_EXTOP) { - /* Extended opcode */ - - opcode = (u16) ((opcode << 8) | GET8 (aml)); - aml++; - } - - /* don't convert bare name to a namepath */ - - return (opcode); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_create_state - * - * PARAMETERS: Acpi_aml - Acpi_aml code pointer - * Acpi_aml_size - Length of AML code - * - * RETURN: A new parser state object - * - * DESCRIPTION: Create and initialize a new parser state object - * - ******************************************************************************/ - -ACPI_PARSE_STATE * -acpi_ps_create_state ( - u8 *aml, - u32 aml_size) -{ - ACPI_PARSE_STATE *parser_state; - - - parser_state = acpi_cm_callocate (sizeof (ACPI_PARSE_STATE)); - if (!parser_state) { - return (NULL); - } - - parser_state->aml = aml; - parser_state->aml_end = aml + aml_size; - parser_state->pkg_end = parser_state->aml_end; - parser_state->aml_start = aml; - - - return (parser_state); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_find_object - * - * PARAMETERS: Opcode - Current opcode - * Parser_state - Current state - * Walk_state - Current state - * *Op - Where found/new op is returned - * - * RETURN: Status - * - * DESCRIPTION: Find a named object. Two versions - one to search the parse - * tree (for parser-only applications such as acpidump), another - * to search the ACPI internal namespace (the parse tree may no - * longer exist) - * - ******************************************************************************/ - -#ifdef PARSER_ONLY - -ACPI_STATUS -acpi_ps_find_object ( - u16 opcode, - ACPI_PARSE_OBJECT *op, - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT **out_op) -{ - NATIVE_CHAR *path; - - - /* We are only interested in opcodes that have an associated name */ - - if (!acpi_ps_is_named_op (opcode)) { - *out_op = op; - return (AE_OK); - } - - /* Find the name in the parse tree */ - - path = acpi_ps_get_next_namestring (walk_state->parser_state); - - *out_op = acpi_ps_find (acpi_ps_get_parent_scope (walk_state->parser_state), - path, opcode, 1); - - if (!(*out_op)) { - return (AE_NOT_FOUND); - } - - return (AE_OK); -} - -#endif - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_complete_this_op - * - * PARAMETERS: Walk_state - Current State - * Op - Op to complete - * - * RETURN: TRUE if Op and subtree was deleted - * - * DESCRIPTION: Perform any cleanup at the completion of an Op. - * - ******************************************************************************/ - -static u8 -acpi_ps_complete_this_op ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op) -{ -#ifndef PARSER_ONLY - ACPI_PARSE_OBJECT *prev; - ACPI_PARSE_OBJECT *next; - ACPI_OPCODE_INFO *op_info; - ACPI_OPCODE_INFO *parent_info; - u32 opcode_class; - ACPI_PARSE_OBJECT *replacement_op = NULL; - - - op_info = acpi_ps_get_opcode_info (op->opcode); - opcode_class = ACPI_GET_OP_CLASS (op_info); - - - /* Delete this op and the subtree below it if asked to */ - - if (((walk_state->parse_flags & ACPI_PARSE_TREE_MASK) == ACPI_PARSE_DELETE_TREE) && - (opcode_class != OPTYPE_CONSTANT) && - (opcode_class != OPTYPE_LITERAL) && - (opcode_class != OPTYPE_LOCAL_VARIABLE) && - (opcode_class != OPTYPE_METHOD_ARGUMENT) && - (opcode_class != OPTYPE_DATA_TERM) && - (op->opcode != AML_NAMEPATH_OP)) { - /* Make sure that we only delete this subtree */ - - if (op->parent) { - /* - * Check if we need to replace the operator and its subtree - * with a return value op (placeholder op) - */ - - parent_info = acpi_ps_get_opcode_info (op->parent->opcode); - - switch (ACPI_GET_OP_CLASS (parent_info)) { - case OPTYPE_CONTROL: /* IF, ELSE, WHILE only */ - break; - - case OPTYPE_NAMED_OBJECT: /* Scope, method, etc. */ - - /* - * These opcodes contain Term_arg operands. The current - * op must be replace by a placeholder return op - */ - - if ((op->parent->opcode == AML_REGION_OP) || - (op->parent->opcode == AML_CREATE_FIELD_OP) || - (op->parent->opcode == AML_BIT_FIELD_OP) || - (op->parent->opcode == AML_BYTE_FIELD_OP) || - (op->parent->opcode == AML_WORD_FIELD_OP) || - (op->parent->opcode == AML_DWORD_FIELD_OP) || - (op->parent->opcode == AML_QWORD_FIELD_OP)) { - replacement_op = acpi_ps_alloc_op (AML_RETURN_VALUE_OP); - if (!replacement_op) { - return (FALSE); - } - } - - break; - - default: - replacement_op = acpi_ps_alloc_op (AML_RETURN_VALUE_OP); - if (!replacement_op) { - return (FALSE); - } - } - - /* We must unlink this op from the parent tree */ - - prev = op->parent->value.arg; - if (prev == op) { - /* This op is the first in the list */ - - if (replacement_op) { - replacement_op->parent = op->parent; - replacement_op->value.arg = NULL; - op->parent->value.arg = replacement_op; - replacement_op->next = op->next; - } - else { - op->parent->value.arg = op->next; - } - } - - /* Search the parent list */ - - else while (prev) { - /* Traverse all siblings in the parent's argument list */ - - next = prev->next; - if (next == op) { - if (replacement_op) { - replacement_op->parent = op->parent; - replacement_op->value.arg = NULL; - prev->next = replacement_op; - replacement_op->next = op->next; - next = NULL; - } - else { - prev->next = op->next; - next = NULL; - } - } - - prev = next; - } - - } - - /* Now we can actually delete the subtree rooted at op */ - - acpi_ps_delete_parse_tree (op); - - return (TRUE); - } - - return (FALSE); - -#else - return (FALSE); -#endif -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_next_parse_state - * - * PARAMETERS: Parser_state - Current parser state object - * - * RETURN: - * - * DESCRIPTION: - * - ******************************************************************************/ - -static ACPI_STATUS -acpi_ps_next_parse_state ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op, - ACPI_STATUS callback_status) -{ - ACPI_PARSE_STATE *parser_state = walk_state->parser_state; - ACPI_STATUS status = AE_CTRL_PENDING; - u8 *start; - u32 package_length; - - - switch (callback_status) { - case AE_CTRL_TERMINATE: - - /* - * A control method was terminated via a RETURN statement. - * The walk of this method is complete. - */ - - parser_state->aml = parser_state->aml_end; - status = AE_CTRL_TERMINATE; - break; - - - case AE_CTRL_PENDING: - - /* - * Predicate of a WHILE was true and the loop just completed an - * execution. Go back to the start of the loop and reevaluate the - * predicate. - */ -/* Walk_state->Control_state->Common.State = - CONTROL_PREDICATE_EXECUTING;*/ - - /* TBD: How to handle a break within a while. */ - /* This code attempts it */ - - parser_state->aml = walk_state->aml_last_while; - break; - - - case AE_CTRL_TRUE: - /* - * Predicate of an IF was true, and we are at the matching ELSE. - * Just close out this package - * - * Note: Parser_state->Aml is modified by the package length procedure - * TBD: [Investigate] perhaps it shouldn't, too much trouble - */ - start = parser_state->aml; - package_length = acpi_ps_get_next_package_length (parser_state); - parser_state->aml = start + package_length; - break; - - - case AE_CTRL_FALSE: - - /* - * Either an IF/WHILE Predicate was false or we encountered a BREAK - * opcode. In both cases, we do not execute the rest of the - * package; We simply close out the parent (finishing the walk of - * this branch of the tree) and continue execution at the parent - * level. - */ - - parser_state->aml = parser_state->scope->parse_scope.pkg_end; - - /* In the case of a BREAK, just force a predicate (if any) to FALSE */ - - walk_state->control_state->common.value = FALSE; - status = AE_CTRL_END; - break; - - - case AE_CTRL_TRANSFER: - - /* - * A method call (invocation) -- transfer control - */ - status = AE_CTRL_TRANSFER; - walk_state->prev_op = op; - walk_state->method_call_op = op; - walk_state->method_call_node = (op->value.arg)->node; - - /* Will return value (if any) be used by the caller? */ - - walk_state->return_used = acpi_ds_is_result_used (op, walk_state); - break; - - - default: - status = callback_status; - if ((callback_status & AE_CODE_MASK) == AE_CODE_CONTROL) { - status = AE_OK; - } - break; - } - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_parse_loop - * - * PARAMETERS: Parser_state - Current parser state object - * - * RETURN: Status - * - * DESCRIPTION: Parse AML (pointed to by the current parser state) and return - * a tree of ops. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ps_parse_loop ( - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status = AE_OK; - ACPI_PARSE_OBJECT *op = NULL; /* current op */ - ACPI_OPCODE_INFO *op_info; - ACPI_PARSE_OBJECT *arg = NULL; - ACPI_PARSE2_OBJECT *deferred_op; - u32 arg_count; /* push for fixed or var args */ - u32 arg_types = 0; - ACPI_PTRDIFF aml_offset; - u16 opcode; - ACPI_PARSE_OBJECT pre_op; - ACPI_PARSE_STATE *parser_state; - u8 *aml_op_start; - - - parser_state = walk_state->parser_state; - -#ifndef PARSER_ONLY - if (walk_state->walk_type & WALK_METHOD_RESTART) { - /* We are restarting a preempted control method */ - - if (acpi_ps_has_completed_scope (parser_state)) { - /* - * We must check if a predicate to an IF or WHILE statement - * was just completed - */ - if ((parser_state->scope->parse_scope.op) && - ((parser_state->scope->parse_scope.op->opcode == AML_IF_OP) || - (parser_state->scope->parse_scope.op->opcode == AML_WHILE_OP)) && - (walk_state->control_state) && - (walk_state->control_state->common.state == - CONTROL_PREDICATE_EXECUTING)) { - - /* - * A predicate was just completed, get the value of the - * predicate and branch based on that value - */ - - status = acpi_ds_get_predicate_value (walk_state, NULL, TRUE); - if (ACPI_FAILURE (status) && - ((status & AE_CODE_MASK) != AE_CODE_CONTROL)) { - return (status); - } - - status = acpi_ps_next_parse_state (walk_state, op, status); - } - - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); - } - - else if (walk_state->prev_op) { - /* We were in the middle of an op */ - - op = walk_state->prev_op; - arg_types = walk_state->prev_arg_types; - } - } -#endif - - /* - * Iterative parsing loop, while there is more aml to process: - */ - while ((parser_state->aml < parser_state->aml_end) || (op)) { - if (!op) { - /* Get the next opcode from the AML stream */ - - aml_op_start = parser_state->aml; - aml_offset = parser_state->aml - parser_state->aml_start; - opcode = acpi_ps_peek_opcode (parser_state); - - /* - * First cut to determine what we have found: - * 1) A valid AML opcode - * 2) A name string - * 3) An unknown/invalid opcode - */ - - op_info = acpi_ps_get_opcode_info (opcode); - switch (ACPI_GET_OP_TYPE (op_info)) { - case ACPI_OP_TYPE_OPCODE: - - /* Found opcode info, this is a normal opcode */ - - parser_state->aml += acpi_ps_get_opcode_size (opcode); - arg_types = op_info->parse_args; - break; - - case ACPI_OP_TYPE_ASCII: - case ACPI_OP_TYPE_PREFIX: - /* - * Starts with a valid prefix or ASCII char, this is a name - * string. Convert the bare name string to a namepath. - */ - - opcode = AML_NAMEPATH_OP; - arg_types = ARGP_NAMESTRING; - break; - - case ACPI_OP_TYPE_UNKNOWN: - - /* The opcode is unrecognized. Just skip unknown opcodes */ - - /* Assume one-byte bad opcode */ - - parser_state->aml++; - continue; - } - - - /* Create Op structure and append to parent's argument list */ - - if (acpi_ps_is_named_op (opcode)) { - pre_op.value.arg = NULL; - pre_op.opcode = opcode; - - while (GET_CURRENT_ARG_TYPE (arg_types) != ARGP_NAME) { - arg = acpi_ps_get_next_arg (parser_state, - GET_CURRENT_ARG_TYPE (arg_types), - &arg_count); - acpi_ps_append_arg (&pre_op, arg); - INCREMENT_ARG_LIST (arg_types); - } - - - /* We know that this arg is a name, move to next arg */ - - INCREMENT_ARG_LIST (arg_types); - - if (walk_state->descending_callback != NULL) { - /* - * Find the object. This will either insert the object into - * the namespace or simply look it up - */ - status = walk_state->descending_callback (opcode, NULL, walk_state, &op); - if (op == NULL) { - continue; - } - status = acpi_ps_next_parse_state (walk_state, op, status); - if (status == AE_CTRL_PENDING) { - status = AE_OK; - goto close_this_op; - } - - if (ACPI_FAILURE (status)) { - goto close_this_op; - } - } - - acpi_ps_append_arg (op, pre_op.value.arg); - acpi_gbl_depth++; - - - if (op->opcode == AML_REGION_OP) { - deferred_op = acpi_ps_to_extended_op (op); - if (deferred_op) { - /* - * Defer final parsing of an Operation_region body, - * because we don't have enough info in the first pass - * to parse it correctly (i.e., there may be method - * calls within the Term_arg elements of the body. - * - * However, we must continue parsing because - * the opregion is not a standalone package -- - * we don't know where the end is at this point. - * - * (Length is unknown until parse of the body complete) - */ - - deferred_op->data = aml_op_start; - deferred_op->length = 0; - } - } - } - - - else { - /* Not a named opcode, just allocate Op and append to parent */ - - op = acpi_ps_alloc_op (opcode); - if (!op) { - return (AE_NO_MEMORY); - } - - - if ((op->opcode == AML_CREATE_FIELD_OP) || - (op->opcode == AML_BIT_FIELD_OP) || - (op->opcode == AML_BYTE_FIELD_OP) || - (op->opcode == AML_WORD_FIELD_OP) || - (op->opcode == AML_DWORD_FIELD_OP)) { - /* - * Backup to beginning of Create_xXXfield declaration - * Body_length is unknown until we parse the body - */ - deferred_op = (ACPI_PARSE2_OBJECT *) op; - - deferred_op->data = aml_op_start; - deferred_op->length = 0; - } - - acpi_ps_append_arg (acpi_ps_get_parent_scope (parser_state), op); - - if ((walk_state->descending_callback != NULL)) { - /* - * Find the object. This will either insert the object into - * the namespace or simply look it up - */ - status = walk_state->descending_callback (opcode, op, walk_state, &op); - status = acpi_ps_next_parse_state (walk_state, op, status); - if (status == AE_CTRL_PENDING) { - status = AE_OK; - goto close_this_op; - } - - if (ACPI_FAILURE (status)) { - goto close_this_op; - } - } - } - - op->aml_offset = aml_offset; - - } - - - /* Start Arg_count at zero because we don't know if there are any args yet */ - - arg_count = 0; - - - if (arg_types) /* Are there any arguments that must be processed? */ { - /* get arguments */ - - switch (op->opcode) { - case AML_BYTE_OP: /* AML_BYTEDATA_ARG */ - case AML_WORD_OP: /* AML_WORDDATA_ARG */ - case AML_DWORD_OP: /* AML_DWORDATA_ARG */ - case AML_STRING_OP: /* AML_ASCIICHARLIST_ARG */ - - /* fill in constant or string argument directly */ - - acpi_ps_get_next_simple_arg (parser_state, - GET_CURRENT_ARG_TYPE (arg_types), op); - break; - - case AML_NAMEPATH_OP: /* AML_NAMESTRING_ARG */ - - acpi_ps_get_next_namepath (parser_state, op, &arg_count, 1); - arg_types = 0; - break; - - - default: - - /* Op is not a constant or string, append each argument */ - - while (GET_CURRENT_ARG_TYPE (arg_types) && !arg_count) { - aml_offset = parser_state->aml - parser_state->aml_start; - arg = acpi_ps_get_next_arg (parser_state, - GET_CURRENT_ARG_TYPE (arg_types), - &arg_count); - if (arg) { - arg->aml_offset = aml_offset; - acpi_ps_append_arg (op, arg); - } - - INCREMENT_ARG_LIST (arg_types); - } - - - /* For a method, save the length and address of the body */ - - if (op->opcode == AML_METHOD_OP) { - deferred_op = acpi_ps_to_extended_op (op); - if (deferred_op) { - /* - * Skip parsing of control method or opregion body, - * because we don't have enough info in the first pass - * to parse them correctly. - */ - - deferred_op->data = parser_state->aml; - deferred_op->length = parser_state->pkg_end - - parser_state->aml; - - /* - * Skip body of method. For Op_regions, we must continue - * parsing because the opregion is not a standalone - * package (We don't know where the end is). - */ - parser_state->aml = parser_state->pkg_end; - arg_count = 0; - } - } - - break; - } - } - - - /* - * Zero Arg_count means that all arguments for this op have been processed - */ - if (!arg_count) { - /* completed Op, prepare for next */ - - if (acpi_ps_is_named_op (op->opcode)) { - if (acpi_gbl_depth) { - acpi_gbl_depth--; - } - - if (op->opcode == AML_REGION_OP) { - deferred_op = acpi_ps_to_extended_op (op); - if (deferred_op) { - /* - * Skip parsing of control method or opregion body, - * because we don't have enough info in the first pass - * to parse them correctly. - * - * Completed parsing an Op_region declaration, we now - * know the length. - */ - - deferred_op->length = parser_state->aml - - deferred_op->data; - } - } - } - - if ((op->opcode == AML_CREATE_FIELD_OP) || - (op->opcode == AML_BIT_FIELD_OP) || - (op->opcode == AML_BYTE_FIELD_OP) || - (op->opcode == AML_WORD_FIELD_OP) || - (op->opcode == AML_DWORD_FIELD_OP) || - (op->opcode == AML_QWORD_FIELD_OP)) { - /* - * Backup to beginning of Create_xXXfield declaration (1 for - * Opcode) - * - * Body_length is unknown until we parse the body - */ - deferred_op = (ACPI_PARSE2_OBJECT *) op; - deferred_op->length = parser_state->aml - deferred_op->data; - } - - /* This op complete, notify the dispatcher */ - - if (walk_state->ascending_callback != NULL) { - status = walk_state->ascending_callback (walk_state, op); - status = acpi_ps_next_parse_state (walk_state, op, status); - if (status == AE_CTRL_PENDING) { - status = AE_OK; - goto close_this_op; - } - } - - -close_this_op: - - /* - * Finished one argument of the containing scope - */ - parser_state->scope->parse_scope.arg_count--; - - /* Close this Op (may result in parse subtree deletion) */ - - if (acpi_ps_complete_this_op (walk_state, op)) { - op = NULL; - } - - - switch (status) { - case AE_OK: - break; - - - case AE_CTRL_TRANSFER: - - /* - * We are about to transfer to a called method. - */ - walk_state->prev_op = op; - walk_state->prev_arg_types = arg_types; - return (status); - break; - - - case AE_CTRL_END: - - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); - - status = walk_state->ascending_callback (walk_state, op); - status = acpi_ps_next_parse_state (walk_state, op, status); - - acpi_ps_complete_this_op (walk_state, op); - op = NULL; - status = AE_OK; - break; - - - case AE_CTRL_TERMINATE: - - status = AE_OK; - - /* Clean up */ - do { - if (op) { - acpi_ps_complete_this_op (walk_state, op); - } - - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); - } while (op); - - return (status); - break; - - - default: /* All other non-AE_OK status */ - - if (op == NULL) { - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); - } - walk_state->prev_op = op; - walk_state->prev_arg_types = arg_types; - - /* - * TEMP: - */ - - return (status); - break; - } - - - /* This scope complete? */ - - if (acpi_ps_has_completed_scope (parser_state)) { - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); - } - - else { - op = NULL; - } - - } - - - /* Arg_count is non-zero */ - - else { - /* complex argument, push Op and prepare for argument */ - - acpi_ps_push_scope (parser_state, op, arg_types, arg_count); - op = NULL; - } - - } /* while Parser_state->Aml */ - - - /* - * Complete the last Op (if not completed), and clear the scope stack. - * It is easily possible to end an AML "package" with an unbounded number - * of open scopes (such as when several AML blocks are closed with - * sequential closing braces). We want to terminate each one cleanly. - */ - - do { - if (op) { - if (walk_state->ascending_callback != NULL) { - status = walk_state->ascending_callback (walk_state, op); - status = acpi_ps_next_parse_state (walk_state, op, status); - if (status == AE_CTRL_PENDING) { - status = AE_OK; - goto close_this_op; - } - - if (status == AE_CTRL_TERMINATE) { - status = AE_OK; - - /* Clean up */ - do { - if (op) { - acpi_ps_complete_this_op (walk_state, op); - } - - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); - - } while (op); - - return (status); - } - - else if (ACPI_FAILURE (status)) { - acpi_ps_complete_this_op (walk_state, op); - return (status); - } - } - - acpi_ps_complete_this_op (walk_state, op); - } - - acpi_ps_pop_scope (parser_state, &op, &arg_types, &arg_count); - - } while (op); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_parse_aml - * - * PARAMETERS: Start_scope - The starting point of the parse. Becomes the - * root of the parsed op tree. - * Aml - Pointer to the raw AML code to parse - * Aml_size - Length of the AML to parse - * - * RETURN: Status - * - * DESCRIPTION: Parse raw AML and return a tree of ops - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ps_parse_aml ( - ACPI_PARSE_OBJECT *start_scope, - u8 *aml, - u32 aml_size, - u32 parse_flags, - ACPI_NAMESPACE_NODE *method_node, - ACPI_OPERAND_OBJECT **params, - ACPI_OPERAND_OBJECT **caller_return_desc, - ACPI_PARSE_DOWNWARDS descending_callback, - ACPI_PARSE_UPWARDS ascending_callback) -{ - ACPI_STATUS status; - ACPI_PARSE_STATE *parser_state; - ACPI_WALK_STATE *walk_state; - ACPI_WALK_LIST walk_list; - ACPI_NAMESPACE_NODE *node = NULL; - ACPI_WALK_LIST *prev_walk_list = acpi_gbl_current_walk_list; - ACPI_OPERAND_OBJECT *return_desc; - ACPI_OPERAND_OBJECT *mth_desc = NULL; - - - /* Create and initialize a new parser state */ - - parser_state = acpi_ps_create_state (aml, aml_size); - if (!parser_state) { - return (AE_NO_MEMORY); - } - - acpi_ps_init_scope (parser_state, start_scope); - - if (method_node) { - mth_desc = acpi_ns_get_attached_object (method_node); - } - - /* Create and initialize a new walk list */ - - walk_list.walk_state = NULL; - walk_list.acquired_mutex_list.prev = NULL; - walk_list.acquired_mutex_list.next = NULL; - - walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, parser_state->start_op, mth_desc, &walk_list); - if (!walk_state) { - status = AE_NO_MEMORY; - goto cleanup; - } - - walk_state->method_node = method_node; - walk_state->parser_state = parser_state; - walk_state->parse_flags = parse_flags; - walk_state->descending_callback = descending_callback; - walk_state->ascending_callback = ascending_callback; - - /* TBD: [Restructure] TEMP until we pass Walk_state to the interpreter - */ - acpi_gbl_current_walk_list = &walk_list; - - - if (method_node) { - parser_state->start_node = method_node; - walk_state->walk_type = WALK_METHOD; - - /* Push start scope on scope stack and make it current */ - - status = acpi_ds_scope_stack_push (method_node, ACPI_TYPE_METHOD, walk_state); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Init arguments if this is a control method */ - /* TBD: [Restructure] add walkstate as a param */ - - acpi_ds_method_data_init_args (params, MTH_NUM_ARGS, walk_state); - } - - else { - /* Setup the current scope */ - - node = parser_state->start_op->node; - parser_state->start_node = node; - - if (node) { - /* Push start scope on scope stack and make it current */ - - status = acpi_ds_scope_stack_push (node, node->type, - walk_state); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - } - } - - - status = AE_OK; - - /* - * Execute the walk loop as long as there is a valid Walk State. This - * handles nested control method invocations without recursion. - */ - - while (walk_state) { - if (ACPI_SUCCESS (status)) { - status = acpi_ps_parse_loop (walk_state); - } - - if (status == AE_CTRL_TRANSFER) { - /* - * A method call was detected. - * Transfer control to the called control method - */ - - status = acpi_ds_call_control_method (&walk_list, walk_state, NULL); - - /* - * If the transfer to the new method method call worked, a new walk - * state was created -- get it - */ - - walk_state = acpi_ds_get_current_walk_state (&walk_list); - continue; - } - - else if (status == AE_CTRL_TERMINATE) { - status = AE_OK; - } - - /* We are done with this walk, move on to the parent if any */ - - - walk_state = acpi_ds_pop_walk_state (&walk_list); - - /* Extract return value before we delete Walk_state */ - - return_desc = walk_state->return_desc; - - /* Reset the current scope to the beginning of scope stack */ - - acpi_ds_scope_stack_clear (walk_state); - - /* - * If we just returned from the execution of a control method, - * there's lots of cleanup to do - */ - - if ((walk_state->parse_flags & ACPI_PARSE_MODE_MASK) == ACPI_PARSE_EXECUTE) { - acpi_ds_terminate_control_method (walk_state); - } - - /* Delete this walk state and all linked control states */ - - acpi_ps_cleanup_scope (walk_state->parser_state); - acpi_cm_free (walk_state->parser_state); - acpi_ds_delete_walk_state (walk_state); - - /* Check if we have restarted a preempted walk */ - - walk_state = acpi_ds_get_current_walk_state (&walk_list); - if (walk_state && - ACPI_SUCCESS (status)) { - /* There is another walk state, restart it */ - - /* - * If the method returned value is not used by the parent, - * The object is deleted - */ - - acpi_ds_restart_control_method (walk_state, return_desc); - walk_state->walk_type |= WALK_METHOD_RESTART; - } - - /* - * Just completed a 1st-level method, save the final internal return - * value (if any) - */ - - else if (caller_return_desc) { - *caller_return_desc = return_desc; /* NULL if no return value */ - } - - else if (return_desc) { - /* Caller doesn't want it, must delete it */ - - acpi_cm_remove_reference (return_desc); - } - } - - - /* Normal exit */ - - acpi_aml_release_all_mutexes ((ACPI_OPERAND_OBJECT *) &walk_list.acquired_mutex_list); - acpi_gbl_current_walk_list = prev_walk_list; - return (status); - - -cleanup: - - /* Cleanup */ - - acpi_ds_delete_walk_state (walk_state); - acpi_ps_cleanup_scope (parser_state); - acpi_cm_free (parser_state); - - acpi_aml_release_all_mutexes ((ACPI_OPERAND_OBJECT *)&walk_list.acquired_mutex_list); - acpi_gbl_current_walk_list = prev_walk_list; - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/parser/psscope.c b/reactos/drivers/bus/acpi/parser/psscope.c deleted file mode 100644 index 77ff1b43f3f..00000000000 --- a/reactos/drivers/bus/acpi/parser/psscope.c +++ /dev/null @@ -1,263 +0,0 @@ -/****************************************************************************** - * - * Module Name: psscope - Parser scope stack management routines - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_PARSER - MODULE_NAME ("psscope") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_get_parent_scope - * - * PARAMETERS: Parser_state - Current parser state object - * - * RETURN: Pointer to an Op object - * - * DESCRIPTION: Get parent of current op being parsed - * - ******************************************************************************/ - -ACPI_PARSE_OBJECT * -acpi_ps_get_parent_scope ( - ACPI_PARSE_STATE *parser_state) -{ - return (parser_state->scope->parse_scope.op); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_has_completed_scope - * - * PARAMETERS: Parser_state - Current parser state object - * - * RETURN: Boolean, TRUE = scope completed. - * - * DESCRIPTION: Is parsing of current argument complete? Determined by - * 1) AML pointer is at or beyond the end of the scope - * 2) The scope argument count has reached zero. - * - ******************************************************************************/ - -u8 -acpi_ps_has_completed_scope ( - ACPI_PARSE_STATE *parser_state) -{ - return ((u8) ((parser_state->aml >= parser_state->scope->parse_scope.arg_end || - !parser_state->scope->parse_scope.arg_count))); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_init_scope - * - * PARAMETERS: Parser_state - Current parser state object - * Root - the Root Node of this new scope - * - * RETURN: Status - * - * DESCRIPTION: Allocate and init a new scope object - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ps_init_scope ( - ACPI_PARSE_STATE *parser_state, - ACPI_PARSE_OBJECT *root_op) -{ - ACPI_GENERIC_STATE *scope; - - - scope = acpi_cm_create_generic_state (); - if (!scope) { - return (AE_NO_MEMORY); - } - - scope->parse_scope.op = root_op; - scope->parse_scope.arg_count = ACPI_VAR_ARGS; - scope->parse_scope.arg_end = parser_state->aml_end; - scope->parse_scope.pkg_end = parser_state->aml_end; - - parser_state->scope = scope; - parser_state->start_op = root_op; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_push_scope - * - * PARAMETERS: Parser_state - Current parser state object - * Op - Current op to be pushed - * Remaining_args - List of args remaining - * Arg_count - Fixed or variable number of args - * - * RETURN: Status - * - * DESCRIPTION: Push current op to begin parsing its argument - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ps_push_scope ( - ACPI_PARSE_STATE *parser_state, - ACPI_PARSE_OBJECT *op, - u32 remaining_args, - u32 arg_count) -{ - ACPI_GENERIC_STATE *scope; - - - scope = acpi_cm_create_generic_state (); - if (!scope) { - return (AE_NO_MEMORY); - } - - - scope->parse_scope.op = op; - scope->parse_scope.arg_list = remaining_args; - scope->parse_scope.arg_count = arg_count; - scope->parse_scope.pkg_end = parser_state->pkg_end; - - /* Push onto scope stack */ - - acpi_cm_push_generic_state (&parser_state->scope, scope); - - - if (arg_count == ACPI_VAR_ARGS) { - /* multiple arguments */ - - scope->parse_scope.arg_end = parser_state->pkg_end; - } - - else { - /* single argument */ - - scope->parse_scope.arg_end = ACPI_MAX_AML; - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_pop_scope - * - * PARAMETERS: Parser_state - Current parser state object - * Op - Where the popped op is returned - * Arg_list - Where the popped "next argument" is - * returned - * Arg_count - Count of objects in Arg_list - * - * RETURN: Status - * - * DESCRIPTION: Return to parsing a previous op - * - ******************************************************************************/ - -void -acpi_ps_pop_scope ( - ACPI_PARSE_STATE *parser_state, - ACPI_PARSE_OBJECT **op, - u32 *arg_list, - u32 *arg_count) -{ - ACPI_GENERIC_STATE *scope = parser_state->scope; - - - /* - * Only pop the scope if there is in fact a next scope - */ - if (scope->common.next) { - scope = acpi_cm_pop_generic_state (&parser_state->scope); - - - /* return to parsing previous op */ - - *op = scope->parse_scope.op; - *arg_list = scope->parse_scope.arg_list; - *arg_count = scope->parse_scope.arg_count; - parser_state->pkg_end = scope->parse_scope.pkg_end; - - /* All done with this scope state structure */ - - acpi_cm_delete_generic_state (scope); - } - - else { - /* empty parse stack, prepare to fetch next opcode */ - - *op = NULL; - *arg_list = 0; - *arg_count = 0; - } - - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_cleanup_scope - * - * PARAMETERS: Parser_state - Current parser state object - * - * RETURN: Status - * - * DESCRIPTION: Destroy available list, remaining stack levels, and return - * root scope - * - ******************************************************************************/ - -void -acpi_ps_cleanup_scope ( - ACPI_PARSE_STATE *parser_state) -{ - ACPI_GENERIC_STATE *scope; - - - if (!parser_state) { - return; - } - - - /* Delete anything on the scope stack */ - - while (parser_state->scope) { - scope = acpi_cm_pop_generic_state (&parser_state->scope); - acpi_cm_delete_generic_state (scope); - } - - return; -} - diff --git a/reactos/drivers/bus/acpi/parser/pstree.c b/reactos/drivers/bus/acpi/parser/pstree.c deleted file mode 100644 index 9260fca5263..00000000000 --- a/reactos/drivers/bus/acpi/parser/pstree.c +++ /dev/null @@ -1,286 +0,0 @@ -/****************************************************************************** - * - * Module Name: pstree - Parser op tree manipulation/traversal/search - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_PARSER - MODULE_NAME ("pstree") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_get_arg - * - * PARAMETERS: Op - Get an argument for this op - * Argn - Nth argument to get - * - * RETURN: The argument (as an Op object). NULL if argument does not exist - * - * DESCRIPTION: Get the specified op's argument. - * - ******************************************************************************/ - -ACPI_PARSE_OBJECT * -acpi_ps_get_arg ( - ACPI_PARSE_OBJECT *op, - u32 argn) -{ - ACPI_PARSE_OBJECT *arg = NULL; - ACPI_OPCODE_INFO *op_info; - - - /* Get the info structure for this opcode */ - - op_info = acpi_ps_get_opcode_info (op->opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { - /* Invalid opcode or ASCII character */ - - return (NULL); - } - - /* Check if this opcode requires argument sub-objects */ - - if (!(ACPI_GET_OP_ARGS (op_info))) { - /* Has no linked argument objects */ - - return (NULL); - } - - /* Get the requested argument object */ - - arg = op->value.arg; - while (arg && argn) { - argn--; - arg = arg->next; - } - - return (arg); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_append_arg - * - * PARAMETERS: Op - Append an argument to this Op. - * Arg - Argument Op to append - * - * RETURN: None. - * - * DESCRIPTION: Append an argument to an op's argument list (a NULL arg is OK) - * - ******************************************************************************/ - -void -acpi_ps_append_arg ( - ACPI_PARSE_OBJECT *op, - ACPI_PARSE_OBJECT *arg) -{ - ACPI_PARSE_OBJECT *prev_arg; - ACPI_OPCODE_INFO *op_info; - - - if (!op) { - return; - } - - /* Get the info structure for this opcode */ - - op_info = acpi_ps_get_opcode_info (op->opcode); - if (ACPI_GET_OP_TYPE (op_info) != ACPI_OP_TYPE_OPCODE) { - /* Invalid opcode */ - - return; - } - - /* Check if this opcode requires argument sub-objects */ - - if (!(ACPI_GET_OP_ARGS (op_info))) { - /* Has no linked argument objects */ - - return; - } - - - /* Append the argument to the linked argument list */ - - if (op->value.arg) { - /* Append to existing argument list */ - - prev_arg = op->value.arg; - while (prev_arg->next) { - prev_arg = prev_arg->next; - } - prev_arg->next = arg; - } - - else { - /* No argument list, this will be the first argument */ - - op->value.arg = arg; - } - - - /* Set the parent in this arg and any args linked after it */ - - while (arg) { - arg->parent = op; - arg = arg->next; - } -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_get_child - * - * PARAMETERS: Op - Get the child of this Op - * - * RETURN: Child Op, Null if none is found. - * - * DESCRIPTION: Get op's children or NULL if none - * - ******************************************************************************/ - -ACPI_PARSE_OBJECT * -acpi_ps_get_child ( - ACPI_PARSE_OBJECT *op) -{ - ACPI_PARSE_OBJECT *child = NULL; - - - switch (op->opcode) { - case AML_SCOPE_OP: - case AML_ELSE_OP: - case AML_DEVICE_OP: - case AML_THERMAL_ZONE_OP: - case AML_METHODCALL_OP: - - child = acpi_ps_get_arg (op, 0); - break; - - - case AML_BUFFER_OP: - case AML_PACKAGE_OP: - case AML_METHOD_OP: - case AML_IF_OP: - case AML_WHILE_OP: - case AML_DEF_FIELD_OP: - - child = acpi_ps_get_arg (op, 1); - break; - - - case AML_POWER_RES_OP: - case AML_INDEX_FIELD_OP: - - child = acpi_ps_get_arg (op, 2); - break; - - - case AML_PROCESSOR_OP: - case AML_BANK_FIELD_OP: - - child = acpi_ps_get_arg (op, 3); - break; - - } - - return (child); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_get_depth_next - * - * PARAMETERS: Origin - Root of subtree to search - * Op - Last (previous) Op that was found - * - * RETURN: Next Op found in the search. - * - * DESCRIPTION: Get next op in tree (walking the tree in depth-first order) - * Return NULL when reaching "origin" or when walking up from root - * - ******************************************************************************/ - -ACPI_PARSE_OBJECT * -acpi_ps_get_depth_next ( - ACPI_PARSE_OBJECT *origin, - ACPI_PARSE_OBJECT *op) -{ - ACPI_PARSE_OBJECT *next = NULL; - ACPI_PARSE_OBJECT *parent; - ACPI_PARSE_OBJECT *arg; - - - if (!op) { - return (NULL); - } - - /* look for an argument or child */ - - next = acpi_ps_get_arg (op, 0); - if (next) { - return (next); - } - - /* look for a sibling */ - - next = op->next; - if (next) { - return (next); - } - - /* look for a sibling of parent */ - - parent = op->parent; - - while (parent) { - arg = acpi_ps_get_arg (parent, 0); - while (arg && (arg != origin) && (arg != op)) { - arg = arg->next; - } - - if (arg == origin) { - /* reached parent of origin, end search */ - - return (NULL); - } - - if (parent->next) { - /* found sibling of parent */ - return (parent->next); - } - - op = parent; - parent = parent->parent; - } - - return (next); -} - - diff --git a/reactos/drivers/bus/acpi/parser/psutils.c b/reactos/drivers/bus/acpi/parser/psutils.c deleted file mode 100644 index 6b331a5f277..00000000000 --- a/reactos/drivers/bus/acpi/parser/psutils.c +++ /dev/null @@ -1,554 +0,0 @@ -/****************************************************************************** - * - * Module Name: psutils - Parser miscellaneous utilities (Parser only) - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_PARSER - MODULE_NAME ("psutils") - - -#define PARSEOP_GENERIC 0x01 -#define PARSEOP_NAMED 0x02 -#define PARSEOP_DEFERRED 0x03 -#define PARSEOP_BYTELIST 0x04 -#define PARSEOP_IN_CACHE 0x80 - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_init_op - * - * PARAMETERS: Op - A newly allocated Op object - * Opcode - Opcode to store in the Op - * - * RETURN: Status - * - * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on - * opcode - * - ******************************************************************************/ - -void -acpi_ps_init_op ( - ACPI_PARSE_OBJECT *op, - u16 opcode) -{ - ACPI_OPCODE_INFO *aml_op; - - - op->data_type = ACPI_DESC_TYPE_PARSER; - op->opcode = opcode; - - aml_op = acpi_ps_get_opcode_info (opcode); - - DEBUG_ONLY_MEMBERS (STRNCPY (op->op_name, aml_op->name, - sizeof (op->op_name))); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_alloc_op - * - * PARAMETERS: Opcode - Opcode that will be stored in the new Op - * - * RETURN: Pointer to the new Op. - * - * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on - * opcode. A cache of opcodes is available for the pure - * GENERIC_OP, since this is by far the most commonly used. - * - ******************************************************************************/ - -ACPI_PARSE_OBJECT* -acpi_ps_alloc_op ( - u16 opcode) -{ - ACPI_PARSE_OBJECT *op = NULL; - u32 size; - u8 flags; - - - /* Allocate the minimum required size object */ - - if (acpi_ps_is_deferred_op (opcode)) { - size = sizeof (ACPI_PARSE2_OBJECT); - flags = PARSEOP_DEFERRED; - } - - else if (acpi_ps_is_named_op (opcode)) { - size = sizeof (ACPI_PARSE2_OBJECT); - flags = PARSEOP_NAMED; - } - - else if (acpi_ps_is_bytelist_op (opcode)) { - size = sizeof (ACPI_PARSE2_OBJECT); - flags = PARSEOP_BYTELIST; - } - - else { - size = sizeof (ACPI_PARSE_OBJECT); - flags = PARSEOP_GENERIC; - } - - - if (size == sizeof (ACPI_PARSE_OBJECT)) { - /* - * The generic op is by far the most common (16 to 1), and therefore - * the op cache is implemented with this type. - * - * Check if there is an Op already available in the cache - */ - - acpi_cm_acquire_mutex (ACPI_MTX_CACHES); - acpi_gbl_parse_cache_requests++; - if (acpi_gbl_parse_cache) { - /* Extract an op from the front of the cache list */ - - acpi_gbl_parse_cache_depth--; - acpi_gbl_parse_cache_hits++; - - op = acpi_gbl_parse_cache; - acpi_gbl_parse_cache = op->next; - - - /* Clear the previously used Op */ - - MEMSET (op, 0, sizeof (ACPI_PARSE_OBJECT)); - - } - acpi_cm_release_mutex (ACPI_MTX_CACHES); - } - - else { - /* - * The generic op is by far the most common (16 to 1), and therefore - * the op cache is implemented with this type. - * - * Check if there is an Op already available in the cache - */ - - acpi_cm_acquire_mutex (ACPI_MTX_CACHES); - acpi_gbl_ext_parse_cache_requests++; - if (acpi_gbl_ext_parse_cache) { - /* Extract an op from the front of the cache list */ - - acpi_gbl_ext_parse_cache_depth--; - acpi_gbl_ext_parse_cache_hits++; - - op = (ACPI_PARSE_OBJECT *) acpi_gbl_ext_parse_cache; - acpi_gbl_ext_parse_cache = (ACPI_PARSE2_OBJECT *) op->next; - - - /* Clear the previously used Op */ - - MEMSET (op, 0, sizeof (ACPI_PARSE2_OBJECT)); - - } - acpi_cm_release_mutex (ACPI_MTX_CACHES); - } - - - /* Allocate a new Op if necessary */ - - if (!op) { - op = acpi_cm_callocate (size); - } - - /* Initialize the Op */ - if (op) { - acpi_ps_init_op (op, opcode); - op->flags = flags; - } - - return (op); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_free_op - * - * PARAMETERS: Op - Op to be freed - * - * RETURN: None. - * - * DESCRIPTION: Free an Op object. Either put it on the GENERIC_OP cache list - * or actually free it. - * - ******************************************************************************/ - -void -acpi_ps_free_op ( - ACPI_PARSE_OBJECT *op) -{ - - - - if (op->flags == PARSEOP_GENERIC) { - /* Is the cache full? */ - - if (acpi_gbl_parse_cache_depth < MAX_PARSE_CACHE_DEPTH) { - /* Put a GENERIC_OP back into the cache */ - - /* Clear the previously used Op */ - - MEMSET (op, 0, sizeof (ACPI_PARSE_OBJECT)); - op->flags = PARSEOP_IN_CACHE; - - acpi_cm_acquire_mutex (ACPI_MTX_CACHES); - acpi_gbl_parse_cache_depth++; - - op->next = acpi_gbl_parse_cache; - acpi_gbl_parse_cache = op; - - acpi_cm_release_mutex (ACPI_MTX_CACHES); - return; - } - } - - else { - /* Is the cache full? */ - - if (acpi_gbl_ext_parse_cache_depth < MAX_EXTPARSE_CACHE_DEPTH) { - /* Put a GENERIC_OP back into the cache */ - - /* Clear the previously used Op */ - - MEMSET (op, 0, sizeof (ACPI_PARSE2_OBJECT)); - op->flags = PARSEOP_IN_CACHE; - - acpi_cm_acquire_mutex (ACPI_MTX_CACHES); - acpi_gbl_ext_parse_cache_depth++; - - op->next = (ACPI_PARSE_OBJECT *) acpi_gbl_ext_parse_cache; - acpi_gbl_ext_parse_cache = (ACPI_PARSE2_OBJECT *) op; - - acpi_cm_release_mutex (ACPI_MTX_CACHES); - return; - } - } - - - /* - * Not a GENERIC OP, or the cache is full, just free the Op - */ - - acpi_cm_free (op); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_delete_parse_cache - * - * PARAMETERS: None - * - * RETURN: None - * - * DESCRIPTION: Free all objects that are on the parse cache list. - * - ******************************************************************************/ - -void -acpi_ps_delete_parse_cache ( - void) -{ - ACPI_PARSE_OBJECT *next; - - - /* Traverse the global cache list */ - - while (acpi_gbl_parse_cache) { - /* Delete one cached state object */ - - next = acpi_gbl_parse_cache->next; - acpi_cm_free (acpi_gbl_parse_cache); - acpi_gbl_parse_cache = next; - acpi_gbl_parse_cache_depth--; - } - - /* Traverse the global cache list */ - - while (acpi_gbl_ext_parse_cache) { - /* Delete one cached state object */ - - next = acpi_gbl_ext_parse_cache->next; - acpi_cm_free (acpi_gbl_ext_parse_cache); - acpi_gbl_ext_parse_cache = (ACPI_PARSE2_OBJECT *) next; - acpi_gbl_ext_parse_cache_depth--; - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Utility functions - * - * DESCRIPTION: Low level functions - * - * TBD: [Restructure] - * 1) Some of these functions should be macros - * 2) Some can be simplified - * - ******************************************************************************/ - - -/* - * Is "c" a namestring lead character? - */ - - -u8 -acpi_ps_is_leading_char ( - u32 c) -{ - return ((u8) (c == '_' || (c >= 'A' && c <= 'Z'))); -} - - -/* - * Is "c" a namestring prefix character? - */ -u8 -acpi_ps_is_prefix_char ( - u32 c) -{ - return ((u8) (c == '\\' || c == '^')); -} - - -u8 -acpi_ps_is_namespace_object_op ( - u16 opcode) -{ - return ((u8) - (opcode == AML_SCOPE_OP || - opcode == AML_DEVICE_OP || - opcode == AML_THERMAL_ZONE_OP || - opcode == AML_METHOD_OP || - opcode == AML_POWER_RES_OP || - opcode == AML_PROCESSOR_OP || - opcode == AML_DEF_FIELD_OP || - opcode == AML_INDEX_FIELD_OP || - opcode == AML_BANK_FIELD_OP || - opcode == AML_NAMEDFIELD_OP || - opcode == AML_NAME_OP || - opcode == AML_ALIAS_OP || - opcode == AML_MUTEX_OP || - opcode == AML_EVENT_OP || - opcode == AML_REGION_OP || - opcode == AML_CREATE_FIELD_OP || - opcode == AML_BIT_FIELD_OP || - opcode == AML_BYTE_FIELD_OP || - opcode == AML_WORD_FIELD_OP || - opcode == AML_DWORD_FIELD_OP || - opcode == AML_METHODCALL_OP || - opcode == AML_NAMEPATH_OP)); -} - -u8 -acpi_ps_is_namespace_op ( - u16 opcode) -{ - return ((u8) - (opcode == AML_SCOPE_OP || - opcode == AML_DEVICE_OP || - opcode == AML_THERMAL_ZONE_OP || - opcode == AML_METHOD_OP || - opcode == AML_POWER_RES_OP || - opcode == AML_PROCESSOR_OP || - opcode == AML_DEF_FIELD_OP || - opcode == AML_INDEX_FIELD_OP || - opcode == AML_BANK_FIELD_OP || - opcode == AML_NAME_OP || - opcode == AML_ALIAS_OP || - opcode == AML_MUTEX_OP || - opcode == AML_EVENT_OP || - opcode == AML_REGION_OP || - opcode == AML_NAMEDFIELD_OP)); -} - - -/* - * Is opcode for a named object Op? - * (Includes all named object opcodes) - * - * TBD: [Restructure] Need a better way than this brute force approach! - */ -u8 -acpi_ps_is_node_op ( - u16 opcode) -{ - return ((u8) - (opcode == AML_SCOPE_OP || - opcode == AML_DEVICE_OP || - opcode == AML_THERMAL_ZONE_OP || - opcode == AML_METHOD_OP || - opcode == AML_POWER_RES_OP || - opcode == AML_PROCESSOR_OP || - opcode == AML_NAMEDFIELD_OP || - opcode == AML_NAME_OP || - opcode == AML_ALIAS_OP || - opcode == AML_MUTEX_OP || - opcode == AML_EVENT_OP || - opcode == AML_REGION_OP || - - - opcode == AML_CREATE_FIELD_OP || - opcode == AML_BIT_FIELD_OP || - opcode == AML_BYTE_FIELD_OP || - opcode == AML_WORD_FIELD_OP || - opcode == AML_DWORD_FIELD_OP || - opcode == AML_METHODCALL_OP || - opcode == AML_NAMEPATH_OP)); -} - - -/* - * Is opcode for a named Op? - */ -u8 -acpi_ps_is_named_op ( - u16 opcode) -{ - return ((u8) - (opcode == AML_SCOPE_OP || - opcode == AML_DEVICE_OP || - opcode == AML_THERMAL_ZONE_OP || - opcode == AML_METHOD_OP || - opcode == AML_POWER_RES_OP || - opcode == AML_PROCESSOR_OP || - opcode == AML_NAME_OP || - opcode == AML_ALIAS_OP || - opcode == AML_MUTEX_OP || - opcode == AML_EVENT_OP || - opcode == AML_REGION_OP || - opcode == AML_NAMEDFIELD_OP)); -} - - -u8 -acpi_ps_is_deferred_op ( - u16 opcode) -{ - return ((u8) - (opcode == AML_METHOD_OP || - opcode == AML_CREATE_FIELD_OP || - opcode == AML_BIT_FIELD_OP || - opcode == AML_BYTE_FIELD_OP || - opcode == AML_WORD_FIELD_OP || - opcode == AML_DWORD_FIELD_OP || - opcode == AML_REGION_OP)); -} - - -/* - * Is opcode for a bytelist? - */ -u8 -acpi_ps_is_bytelist_op ( - u16 opcode) -{ - return ((u8) (opcode == AML_BYTELIST_OP)); -} - - -/* - * Is opcode for a Field, Index_field, or Bank_field - */ -u8 -acpi_ps_is_field_op ( - u16 opcode) -{ - return ((u8) - (opcode == AML_CREATE_FIELD_OP - || opcode == AML_DEF_FIELD_OP - || opcode == AML_INDEX_FIELD_OP - || opcode == AML_BANK_FIELD_OP)); -} - - -/* - * Is field creation op - */ -u8 -acpi_ps_is_create_field_op ( - u16 opcode) -{ - return ((u8) - (opcode == AML_CREATE_FIELD_OP || - opcode == AML_BIT_FIELD_OP || - opcode == AML_BYTE_FIELD_OP || - opcode == AML_WORD_FIELD_OP || - opcode == AML_DWORD_FIELD_OP)); -} - - -/* - * Cast an acpi_op to an acpi_extended_op if possible - */ - -/* TBD: This is very inefficient, fix */ -ACPI_PARSE2_OBJECT * -acpi_ps_to_extended_op ( - ACPI_PARSE_OBJECT *op) -{ - return ((acpi_ps_is_deferred_op (op->opcode) || acpi_ps_is_named_op (op->opcode) || acpi_ps_is_bytelist_op (op->opcode)) - ? ( (ACPI_PARSE2_OBJECT *) op) : NULL); -} - - -/* - * Get op's name (4-byte name segment) or 0 if unnamed - */ -u32 -acpi_ps_get_name ( - ACPI_PARSE_OBJECT *op) -{ - ACPI_PARSE2_OBJECT *named = acpi_ps_to_extended_op (op); - - return (named ? named->name : 0); -} - - -/* - * Set op's name - */ -void -acpi_ps_set_name ( - ACPI_PARSE_OBJECT *op, - u32 name) -{ - ACPI_PARSE2_OBJECT *named = acpi_ps_to_extended_op (op); - - if (named) { - named->name = name; - } -} - diff --git a/reactos/drivers/bus/acpi/parser/pswalk.c b/reactos/drivers/bus/acpi/parser/pswalk.c deleted file mode 100644 index f2a90dd6e1d..00000000000 --- a/reactos/drivers/bus/acpi/parser/pswalk.c +++ /dev/null @@ -1,278 +0,0 @@ -/****************************************************************************** - * - * Module Name: pswalk - Parser routines to walk parsed op tree(s) - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_PARSER - MODULE_NAME ("pswalk") - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_get_next_walk_op - * - * PARAMETERS: Walk_state - Current state of the walk - * Op - Current Op to be walked - * Ascending_callback - Procedure called when Op is complete - * - * RETURN: Status - * - * DESCRIPTION: Get the next Op in a walk of the parse tree. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_ps_get_next_walk_op ( - ACPI_WALK_STATE *walk_state, - ACPI_PARSE_OBJECT *op, - ACPI_PARSE_UPWARDS ascending_callback) -{ - ACPI_PARSE_OBJECT *next; - ACPI_PARSE_OBJECT *parent; - ACPI_PARSE_OBJECT *grand_parent; - ACPI_STATUS status; - - - /* Check for a argument only if we are descending in the tree */ - - if (walk_state->next_op_info != NEXT_OP_UPWARD) { - /* Look for an argument or child of the current op */ - - next = acpi_ps_get_arg (op, 0); - if (next) { - /* Still going downward in tree (Op is not completed yet) */ - - walk_state->prev_op = op; - walk_state->next_op = next; - walk_state->next_op_info = NEXT_OP_DOWNWARD; - - return (AE_OK); - } - - - /* - * No more children, this Op is complete. Save Next and Parent - * in case the Op object gets deleted by the callback routine - */ - - next = op->next; - parent = op->parent; - - status = ascending_callback (walk_state, op); - - /* - * If we are back to the starting point, the walk is complete. - */ - if (op == walk_state->origin) { - /* Reached the point of origin, the walk is complete */ - - walk_state->prev_op = op; - walk_state->next_op = NULL; - - return (status); - } - - /* - * Check for a sibling to the current op. A sibling means - * we are still going "downward" in the tree. - */ - - if (next) { - /* There is a sibling, it will be next */ - - walk_state->prev_op = op; - walk_state->next_op = next; - walk_state->next_op_info = NEXT_OP_DOWNWARD; - - /* Continue downward */ - - return (status); - } - - - /* - * Drop into the loop below because we are moving upwards in - * the tree - */ - } - - else { - /* - * We are resuming a walk, and we were (are) going upward in the tree. - * So, we want to drop into the parent loop below. - */ - - parent = op; - } - - - /* - * Look for a sibling of the current Op's parent - * Continue moving up the tree until we find a node that has not been - * visited, or we get back to where we started. - */ - while (parent) { - /* We are moving up the tree, therefore this parent Op is complete */ - - grand_parent = parent->parent; - next = parent->next; - - status = ascending_callback (walk_state, parent); - - /* - * If we are back to the starting point, the walk is complete. - */ - if (parent == walk_state->origin) { - /* Reached the point of origin, the walk is complete */ - - walk_state->prev_op = parent; - walk_state->next_op = NULL; - - return (status); - } - - /* - * If there is a sibling to this parent (it is not the starting point - * Op), then we will visit it. - */ - if (next) { - /* found sibling of parent */ - - walk_state->prev_op = parent; - walk_state->next_op = next; - walk_state->next_op_info = NEXT_OP_DOWNWARD; - - return (status); - } - - /* No siblings, no errors, just move up one more level in the tree */ - - op = parent; - parent = grand_parent; - walk_state->prev_op = op; - } - - - /* Got all the way to the top of the tree, we must be done! */ - /* However, the code should have terminated in the loop above */ - - walk_state->next_op = NULL; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_delete_completed_op - * - * PARAMETERS: State - Walk state - * Op - Completed op - * - * RETURN: AE_OK - * - * DESCRIPTION: Callback function for Acpi_ps_get_next_walk_op(). Used during - * Acpi_ps_delete_parse tree to delete Op objects when all sub-objects - * have been visited (and deleted.) - * - ******************************************************************************/ - -static ACPI_STATUS -acpi_ps_delete_completed_op ( - ACPI_WALK_STATE *state, - ACPI_PARSE_OBJECT *op) -{ - - acpi_ps_free_op (op); - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_ps_delete_parse_tree - * - * PARAMETERS: Subtree_root - Root of tree (or subtree) to delete - * - * RETURN: None - * - * DESCRIPTION: Delete a portion of or an entire parse tree. - * - ******************************************************************************/ - -void -acpi_ps_delete_parse_tree ( - ACPI_PARSE_OBJECT *subtree_root) -{ - ACPI_WALK_STATE *walk_state; - ACPI_WALK_LIST walk_list; - - - if (!subtree_root) { - return; - } - - /* Create and initialize a new walk list */ - - walk_list.walk_state = NULL; - walk_list.acquired_mutex_list.prev = NULL; - walk_list.acquired_mutex_list.next = NULL; - - walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, NULL, NULL, &walk_list); - if (!walk_state) { - return; - } - - walk_state->parser_state = NULL; - walk_state->parse_flags = 0; - walk_state->descending_callback = NULL; - walk_state->ascending_callback = NULL; - - - walk_state->origin = subtree_root; - walk_state->next_op = subtree_root; - - - /* Head downward in the tree */ - - walk_state->next_op_info = NEXT_OP_DOWNWARD; - - /* Visit all nodes in the subtree */ - - while (walk_state->next_op) { - acpi_ps_get_next_walk_op (walk_state, walk_state->next_op, - acpi_ps_delete_completed_op); - } - - /* We are done with this walk */ - - acpi_aml_release_all_mutexes ((ACPI_OPERAND_OBJECT *) &walk_list.acquired_mutex_list); - acpi_ds_delete_walk_state (walk_state); - - return; -} - - diff --git a/reactos/drivers/bus/acpi/parser/psxface.c b/reactos/drivers/bus/acpi/parser/psxface.c deleted file mode 100644 index ee25e842993..00000000000 --- a/reactos/drivers/bus/acpi/parser/psxface.c +++ /dev/null @@ -1,157 +0,0 @@ -/****************************************************************************** - * - * Module Name: psxface - Parser external interfaces - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_PARSER - MODULE_NAME ("psxface") - - -/***************************************************************************** - * - * FUNCTION: Acpi_psx_execute - * - * PARAMETERS: Method_node - A method object containing both the AML - * address and length. - * **Params - List of parameters to pass to method, - * terminated by NULL. Params itself may be - * NULL if no parameters are being passed. - * **Return_obj_desc - Return object from execution of the - * method. - * - * RETURN: Status - * - * DESCRIPTION: Execute a control method - * - ****************************************************************************/ - -ACPI_STATUS -acpi_psx_execute ( - ACPI_NAMESPACE_NODE *method_node, - ACPI_OPERAND_OBJECT **params, - ACPI_OPERAND_OBJECT **return_obj_desc) -{ - ACPI_STATUS status; - ACPI_OPERAND_OBJECT *obj_desc; - u32 i; - ACPI_PARSE_OBJECT *op; - - - /* Validate the Node and get the attached object */ - - if (!method_node) { - return (AE_NULL_ENTRY); - } - - obj_desc = acpi_ns_get_attached_object (method_node); - if (!obj_desc) { - return (AE_NULL_OBJECT); - } - - /* Init for new method, wait on concurrency semaphore */ - - status = acpi_ds_begin_method_execution (method_node, obj_desc, NULL); - if (ACPI_FAILURE (status)) { - return (status); - } - - if (params) { - /* - * The caller "owns" the parameters, so give each one an extra - * reference - */ - - for (i = 0; params[i]; i++) { - acpi_cm_add_reference (params[i]); - } - } - - /* - * Perform the first pass parse of the method to enter any - * named objects that it creates into the namespace - */ - - /* Create and init a Root Node */ - - op = acpi_ps_alloc_op (AML_SCOPE_OP); - if (!op) { - return (AE_NO_MEMORY); - } - - status = acpi_ps_parse_aml (op, obj_desc->method.pcode, - obj_desc->method.pcode_length, - ACPI_PARSE_LOAD_PASS1 | ACPI_PARSE_DELETE_TREE, - method_node, params, return_obj_desc, - acpi_ds_load1_begin_op, acpi_ds_load1_end_op); - acpi_ps_delete_parse_tree (op); - - /* Create and init a Root Node */ - - op = acpi_ps_alloc_op (AML_SCOPE_OP); - if (!op) { - return (AE_NO_MEMORY); - } - - - /* Init new op with the method name and pointer back to the NS node */ - - acpi_ps_set_name (op, method_node->name); - op->node = method_node; - - /* - * The walk of the parse tree is where we actually execute the method - */ - status = acpi_ps_parse_aml (op, obj_desc->method.pcode, - obj_desc->method.pcode_length, - ACPI_PARSE_EXECUTE | ACPI_PARSE_DELETE_TREE, - method_node, params, return_obj_desc, - acpi_ds_exec_begin_op, acpi_ds_exec_end_op); - acpi_ps_delete_parse_tree (op); - - if (params) { - /* Take away the extra reference that we gave the parameters above */ - - for (i = 0; params[i]; i++) { - acpi_cm_update_object_reference (params[i], REF_DECREMENT); - } - } - - - /* - * Normal exit is with Status == AE_RETURN_VALUE when a Return_op has been - * executed, or with Status == AE_PENDING at end of AML block (end of - * Method code) - */ - - if (*return_obj_desc) { - status = AE_CTRL_RETURN_VALUE; - } - - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/resource/rsaddr.c b/reactos/drivers/bus/acpi/resource/rsaddr.c deleted file mode 100644 index 5fdb6387eca..00000000000 --- a/reactos/drivers/bus/acpi/resource/rsaddr.c +++ /dev/null @@ -1,800 +0,0 @@ -/******************************************************************************* - * - * Module Name: rsaddr - Acpi_rs_address16_resource - * Acpi_rs_address16_stream - * Acpi_rs_address32_resource - * Acpi_rs_address32_stream - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_RESOURCES - MODULE_NAME ("rsaddr") - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_address16_resource - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte - * stream - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes consumed from - * the Byte_stream_buffer - * Output_buffer - Pointer to the user's return buffer - * Structure_size - u32 pointer that is filled with - * the number of bytes in the filled - * in structure - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the resource byte stream and fill out the appropriate - * structure pointed to by the Output_buffer. Return the - * number of bytes consumed from the byte stream. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_address16_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size) -{ - u8 *buffer = byte_stream_buffer; - RESOURCE *output_struct = (RESOURCE *) * output_buffer; - u16 temp16; - u8 temp8; - u32 index; - u32 struct_size = sizeof(ADDRESS16_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - - - /* - * Point past the Descriptor to get the number of bytes consumed - */ - buffer += 1; - - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - - *bytes_consumed = temp16 + 3; - - output_struct->id = address16; - - output_struct->length = struct_size; - - /* - * Get the Resource Type (Byte3) - */ - buffer += 2; - temp8 = *buffer; - - /* Values 0-2 are valid */ - if (temp8 > 2) { - return (AE_AML_ERROR); - } - - output_struct->data.address16.resource_type = temp8 & 0x03; - - /* - * Get the General Flags (Byte4) - */ - buffer += 1; - temp8 = *buffer; - - /* - * Producer / Consumer - */ - output_struct->data.address16.producer_consumer = temp8 & 0x01; - - /* - * Decode - */ - output_struct->data.address16.decode = (temp8 >> 1) & 0x01; - - /* - * Min Address Fixed - */ - output_struct->data.address16.min_address_fixed = (temp8 >> 2) & 0x01; - - /* - * Max Address Fixed - */ - output_struct->data.address16.max_address_fixed = (temp8 >> 3) & 0x01; - - /* - * Get the Type Specific Flags (Byte5) - */ - buffer += 1; - temp8 = *buffer; - - if (MEMORY_RANGE == output_struct->data.address16.resource_type) { - output_struct->data.address16.attribute.memory.read_write_attribute = - (u16) (temp8 & 0x01); - output_struct->data.address16.attribute.memory.cache_attribute = - (u16) ((temp8 >> 1) & 0x0F); - } - - else { - if (IO_RANGE == output_struct->data.address16.resource_type) { - output_struct->data.address16.attribute.io.range_attribute = - (u16) (temp8 & 0x03); - } - - else { - /* BUS_NUMBER_RANGE == Address32_data->Resource_type */ - /* Nothing needs to be filled in */ - } - } - - /* - * Get Granularity (Bytes 6-7) - */ - buffer += 1; - MOVE_UNALIGNED16_TO_16 (&output_struct->data.address16.granularity, - buffer); - - /* - * Get Min_address_range (Bytes 8-9) - */ - buffer += 2; - MOVE_UNALIGNED16_TO_16 (&output_struct->data.address16.min_address_range, - buffer); - - /* - * Get Max_address_range (Bytes 10-11) - */ - buffer += 2; - MOVE_UNALIGNED16_TO_16 - (&output_struct->data.address16.max_address_range, - buffer); - - /* - * Get Address_translation_offset (Bytes 12-13) - */ - buffer += 2; - MOVE_UNALIGNED16_TO_16 - (&output_struct->data.address16.address_translation_offset, - buffer); - - /* - * Get Address_length (Bytes 14-15) - */ - buffer += 2; - MOVE_UNALIGNED16_TO_16 - (&output_struct->data.address16.address_length, - buffer); - - /* - * Resource Source Index (if present) - */ - buffer += 2; - - /* - * This will leave us pointing to the Resource Source Index - * If it is present, then save it off and calculate the - * pointer to where the null terminated string goes: - * Each Interrupt takes 32-bits + the 5 bytes of the - * stream that are default. - */ - if (*bytes_consumed > 16) { - /* Dereference the Index */ - - temp8 = *buffer; - output_struct->data.address16.resource_source_index = - (u32) temp8; - - /* Point to the String */ - - buffer += 1; - - /* Copy the string into the buffer */ - - index = 0; - - while (0x00 != *buffer) { - output_struct->data.address16.resource_source[index] = - *buffer; - - buffer += 1; - index += 1; - } - - /* - * Add the terminating null - */ - output_struct->data.address16.resource_source[index] = 0x00; - - output_struct->data.address16.resource_source_string_length = - index + 1; - - /* - * In order for the Struct_size to fall on a 32-bit boundry, - * calculate the length of the string and expand the - * Struct_size to the next 32-bit boundry. - */ - temp8 = (u8) (index + 1); - struct_size += ROUND_UP_TO_32_bITS (temp8); - output_struct->length = struct_size; - } - else { - output_struct->data.address16.resource_source_index = 0x00; - output_struct->data.address16.resource_source_string_length = 0; - output_struct->data.address16.resource_source[0] = 0x00; - } - - /* - * Return the final size of the structure - */ - *structure_size = struct_size; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_address16_stream - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Output_buffer - Pointer to the user's return buffer - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes of the - * Output_buffer used - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the linked list resource structure and fills in the - * the appropriate bytes in a byte stream - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_address16_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed) -{ - u8 *buffer = *output_buffer; - u8 *length_field; - u8 temp8; - NATIVE_CHAR *temp_pointer = NULL; - u32 actual_bytes; - - - /* - * The descriptor field is static - */ - *buffer = 0x88; - buffer += 1; - - /* - * Save a pointer to the Length field - to be filled in later - */ - length_field = buffer; - buffer += 2; - - /* - * Set the Resource Type (Memory, Io, Bus_number) - */ - temp8 = (u8) (linked_list->data.address16.resource_type & 0x03); - *buffer = temp8; - buffer += 1; - - /* - * Set the general flags - */ - temp8 = (u8) (linked_list->data.address16.producer_consumer & 0x01); - - temp8 |= (linked_list->data.address16.decode & 0x01) << 1; - temp8 |= (linked_list->data.address16.min_address_fixed & 0x01) << 2; - temp8 |= (linked_list->data.address16.max_address_fixed & 0x01) << 3; - - *buffer = temp8; - buffer += 1; - - /* - * Set the type specific flags - */ - temp8 = 0; - - if (MEMORY_RANGE == linked_list->data.address16.resource_type) { - temp8 = (u8) - (linked_list->data.address16.attribute.memory.read_write_attribute & - 0x01); - - temp8 |= - (linked_list->data.address16.attribute.memory.cache_attribute & - 0x0F) << 1; - } - - else if (IO_RANGE == linked_list->data.address16.resource_type) { - temp8 = (u8) - (linked_list->data.address16.attribute.io.range_attribute & - 0x03); - } - - *buffer = temp8; - buffer += 1; - - /* - * Set the address space granularity - */ - MOVE_UNALIGNED16_TO_16 (buffer, - &linked_list->data.address16.granularity); - buffer += 2; - - /* - * Set the address range minimum - */ - MOVE_UNALIGNED16_TO_16 (buffer, - &linked_list->data.address16.min_address_range); - buffer += 2; - - /* - * Set the address range maximum - */ - MOVE_UNALIGNED16_TO_16 (buffer, - &linked_list->data.address16.max_address_range); - buffer += 2; - - /* - * Set the address translation offset - */ - MOVE_UNALIGNED16_TO_16 (buffer, - &linked_list->data.address16.address_translation_offset); - buffer += 2; - - /* - * Set the address length - */ - MOVE_UNALIGNED16_TO_16 (buffer, - &linked_list->data.address16.address_length); - buffer += 2; - - /* - * Resource Source Index and Resource Source are optional - */ - if (0 != linked_list->data.address16.resource_source_string_length) { - temp8 = (u8) linked_list->data.address16.resource_source_index; - - *buffer = temp8; - buffer += 1; - - temp_pointer = (NATIVE_CHAR *) buffer; - - /* - * Copy the string - */ - STRCPY (temp_pointer, linked_list->data.address16.resource_source); - - /* - * Buffer needs to be set to the length of the sting + one for the - * terminating null - */ - buffer += (STRLEN (linked_list->data.address16.resource_source) + 1); - } - - /* - * Return the number of bytes consumed in this operation - */ - actual_bytes = (u32) ((NATIVE_UINT) buffer - - (NATIVE_UINT) *output_buffer); - - *bytes_consumed = actual_bytes; - - /* - * Set the length field to the number of bytes consumed - * minus the header size (3 bytes) - */ - actual_bytes -= 3; - MOVE_UNALIGNED16_TO_16 (length_field, &actual_bytes); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_address32_resource - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte - * stream - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes consumed from - * the Byte_stream_buffer - * Output_buffer - Pointer to the user's return buffer - * Structure_size - u32 pointer that is filled with - * the number of bytes in the filled - * in structure - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the resource byte stream and fill out the appropriate - * structure pointed to by the Output_buffer. Return the - * number of bytes consumed from the byte stream. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_address32_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size) -{ - u8 *buffer; - RESOURCE *output_struct; - u16 temp16; - u8 temp8; - u32 struct_size; - u32 index; - - - buffer = byte_stream_buffer; - - output_struct = (RESOURCE *) *output_buffer; - - struct_size = sizeof (ADDRESS32_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - - /* - * Point past the Descriptor to get the number of bytes consumed - */ - buffer += 1; - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - - *bytes_consumed = temp16 + 3; - - output_struct->id = address32; - - /* - * Get the Resource Type (Byte3) - */ - buffer += 2; - temp8 = *buffer; - - /* Values 0-2 are valid */ - if(temp8 > 2) { - return (AE_AML_ERROR); - } - - output_struct->data.address32.resource_type = temp8 & 0x03; - - /* - * Get the General Flags (Byte4) - */ - buffer += 1; - temp8 = *buffer; - - /* - * Producer / Consumer - */ - output_struct->data.address32.producer_consumer = temp8 & 0x01; - - /* - * Decode - */ - output_struct->data.address32.decode = (temp8 >> 1) & 0x01; - - /* - * Min Address Fixed - */ - output_struct->data.address32.min_address_fixed = (temp8 >> 2) & 0x01; - - /* - * Max Address Fixed - */ - output_struct->data.address32.max_address_fixed = (temp8 >> 3) & 0x01; - - /* - * Get the Type Specific Flags (Byte5) - */ - buffer += 1; - temp8 = *buffer; - - if (MEMORY_RANGE == output_struct->data.address32.resource_type) { - output_struct->data.address32.attribute.memory.read_write_attribute = - (u16) (temp8 & 0x01); - - output_struct->data.address32.attribute.memory.cache_attribute = - (u16) ((temp8 >> 1) & 0x0F); - } - - else { - if (IO_RANGE == output_struct->data.address32.resource_type) { - output_struct->data.address32.attribute.io.range_attribute = - (u16) (temp8 & 0x03); - } - - else { - /* BUS_NUMBER_RANGE == Output_struct->Data.Address32.Resource_type */ - /* Nothing needs to be filled in */ - } - } - - /* - * Get Granularity (Bytes 6-9) - */ - buffer += 1; - MOVE_UNALIGNED32_TO_32 (&output_struct->data.address32.granularity, - buffer); - - /* - * Get Min_address_range (Bytes 10-13) - */ - buffer += 4; - MOVE_UNALIGNED32_TO_32 (&output_struct->data.address32.min_address_range, - buffer); - - /* - * Get Max_address_range (Bytes 14-17) - */ - buffer += 4; - MOVE_UNALIGNED32_TO_32 (&output_struct->data.address32.max_address_range, - buffer); - - /* - * Get Address_translation_offset (Bytes 18-21) - */ - buffer += 4; - MOVE_UNALIGNED32_TO_32 - (&output_struct->data.address32.address_translation_offset, - buffer); - - /* - * Get Address_length (Bytes 22-25) - */ - buffer += 4; - MOVE_UNALIGNED32_TO_32 (&output_struct->data.address32.address_length, - buffer); - - /* - * Resource Source Index (if present) - */ - buffer += 4; - - /* - * This will leave us pointing to the Resource Source Index - * If it is present, then save it off and calculate the - * pointer to where the null terminated string goes: - * Each Interrupt takes 32-bits + the 5 bytes of the - * stream that are default. - */ - if (*bytes_consumed > 26) { - /* Dereference the Index */ - - temp8 = *buffer; - output_struct->data.address32.resource_source_index = (u32)temp8; - - /* Point to the String */ - - buffer += 1; - - /* Copy the string into the buffer */ - - index = 0; - - while (0x00 != *buffer) { - output_struct->data.address32.resource_source[index] = *buffer; - buffer += 1; - index += 1; - } - - /* - * Add the terminating null - */ - output_struct->data.address32.resource_source[index] = 0x00; - - output_struct->data.address32.resource_source_string_length = index + 1; - - /* - * In order for the Struct_size to fall on a 32-bit boundry, - * calculate the length of the string and expand the - * Struct_size to the next 32-bit boundry. - */ - temp8 = (u8) (index + 1); - struct_size += ROUND_UP_TO_32_bITS (temp8); - } - - else { - output_struct->data.address32.resource_source_index = 0x00; - output_struct->data.address32.resource_source_string_length = 0; - output_struct->data.address32.resource_source[0] = 0x00; - } - - /* - * Set the Length parameter - */ - output_struct->length = struct_size; - - /* - * Return the final size of the structure - */ - *structure_size = struct_size; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_address32_stream - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Output_buffer - Pointer to the user's return buffer - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes of the - * Output_buffer used - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the linked list resource structure and fills in the - * the appropriate bytes in a byte stream - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_address32_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed) -{ - u8 *buffer; - u16 *length_field; - u8 temp8; - NATIVE_CHAR *temp_pointer; - - - buffer = *output_buffer; - - /* - * The descriptor field is static - */ - *buffer = 0x87; - buffer += 1; - - /* - * Set a pointer to the Length field - to be filled in later - */ - - length_field = (u16 *)buffer; - buffer += 2; - - /* - * Set the Resource Type (Memory, Io, Bus_number) - */ - temp8 = (u8) (linked_list->data.address32.resource_type & 0x03); - - *buffer = temp8; - buffer += 1; - - /* - * Set the general flags - */ - temp8 = (u8) (linked_list->data.address32.producer_consumer & 0x01); - temp8 |= (linked_list->data.address32.decode & 0x01) << 1; - temp8 |= (linked_list->data.address32.min_address_fixed & 0x01) << 2; - temp8 |= (linked_list->data.address32.max_address_fixed & 0x01) << 3; - - *buffer = temp8; - buffer += 1; - - /* - * Set the type specific flags - */ - temp8 = 0; - - if(MEMORY_RANGE == linked_list->data.address32.resource_type) { - temp8 = (u8) - (linked_list->data.address32.attribute.memory.read_write_attribute & - 0x01); - - temp8 |= - (linked_list->data.address32.attribute.memory.cache_attribute & - 0x0F) << 1; - } - - else if (IO_RANGE == linked_list->data.address32.resource_type) { - temp8 = (u8) - (linked_list->data.address32.attribute.io.range_attribute & - 0x03); - } - - *buffer = temp8; - buffer += 1; - - /* - * Set the address space granularity - */ - MOVE_UNALIGNED32_TO_32 (buffer, - &linked_list->data.address32.granularity); - buffer += 4; - - /* - * Set the address range minimum - */ - MOVE_UNALIGNED32_TO_32 (buffer, - &linked_list->data.address32.min_address_range); - buffer += 4; - - /* - * Set the address range maximum - */ - MOVE_UNALIGNED32_TO_32 (buffer, - &linked_list->data.address32.max_address_range); - buffer += 4; - - /* - * Set the address translation offset - */ - MOVE_UNALIGNED32_TO_32 (buffer, - &linked_list->data.address32.address_translation_offset); - buffer += 4; - - /* - * Set the address length - */ - MOVE_UNALIGNED32_TO_32 (buffer, - &linked_list->data.address32.address_length); - buffer += 4; - - /* - * Resource Source Index and Resource Source are optional - */ - if (0 != linked_list->data.address32.resource_source_string_length) { - temp8 = (u8) linked_list->data.address32.resource_source_index; - - *buffer = temp8; - buffer += 1; - - temp_pointer = (NATIVE_CHAR *) buffer; - - /* - * Copy the string - */ - STRCPY (temp_pointer, linked_list->data.address32.resource_source); - - /* - * Buffer needs to be set to the length of the sting + one for the - * terminating null - */ - buffer += (STRLEN (linked_list->data.address32.resource_source) + 1); - } - - /* - * Return the number of bytes consumed in this operation - */ - *bytes_consumed = (u32) ((NATIVE_UINT) buffer - - (NATIVE_UINT) *output_buffer); - - /* - * Set the length field to the number of bytes consumed - * minus the header size (3 bytes) - */ - *length_field = (u16) (*bytes_consumed - 3); - - return (AE_OK); -} - diff --git a/reactos/drivers/bus/acpi/resource/rscalc.c b/reactos/drivers/bus/acpi/resource/rscalc.c deleted file mode 100644 index 28236e86c55..00000000000 --- a/reactos/drivers/bus/acpi/resource/rscalc.c +++ /dev/null @@ -1,865 +0,0 @@ -/******************************************************************************* - * - * Module Name: rscalc - Acpi_rs_calculate_byte_stream_length - * Acpi_rs_calculate_list_length - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_RESOURCES - MODULE_NAME ("rscalc") - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_calculate_byte_stream_length - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Size_needed - u32 pointer of the size buffer needed - * to properly return the parsed data - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Takes the resource byte stream and parses it once, calculating - * the size buffer needed to hold the linked list that conveys - * the resource data. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_calculate_byte_stream_length ( - RESOURCE *linked_list, - u32 *size_needed) -{ - u32 byte_stream_size_needed = 0; - u32 segment_size; - EXTENDED_IRQ_RESOURCE *ex_irq = NULL; - u8 done = FALSE; - - - while (!done) { - - /* - * Init the variable that will hold the size to add to the - * total. - */ - segment_size = 0; - - switch (linked_list->id) { - case irq: - /* - * IRQ Resource - */ - /* - * For an IRQ Resource, Byte 3, although optional, will - * always be created - it holds IRQ information. - */ - segment_size = 4; - break; - - case dma: - /* - * DMA Resource - */ - /* - * For this resource the size is static - */ - segment_size = 3; - break; - - case start_dependent_functions: - /* - * Start Dependent Functions Resource - */ - /* - * For a Start_dependent_functions Resource, Byte 1, - * although optional, will always be created. - */ - segment_size = 2; - break; - - case end_dependent_functions: - /* - * End Dependent Functions Resource - */ - /* - * For this resource the size is static - */ - segment_size = 1; - break; - - case io: - /* - * IO Port Resource - */ - /* - * For this resource the size is static - */ - segment_size = 8; - break; - - case fixed_io: - /* - * Fixed IO Port Resource - */ - /* - * For this resource the size is static - */ - segment_size = 4; - break; - - case vendor_specific: - /* - * Vendor Defined Resource - */ - /* - * For a Vendor Specific resource, if the Length is - * between 1 and 7 it will be created as a Small - * Resource data type, otherwise it is a Large - * Resource data type. - */ - if(linked_list->data.vendor_specific.length > 7) { - segment_size = 3; - } - else { - segment_size = 1; - } - segment_size += - linked_list->data.vendor_specific.length; - break; - - case end_tag: - /* - * End Tag - */ - /* - * For this resource the size is static - */ - segment_size = 2; - done = TRUE; - break; - - case memory24: - /* - * 24-Bit Memory Resource - */ - /* - * For this resource the size is static - */ - segment_size = 12; - break; - - case memory32: - /* - * 32-Bit Memory Range Resource - */ - /* - * For this resource the size is static - */ - segment_size = 20; - break; - - case fixed_memory32: - /* - * 32-Bit Fixed Memory Resource - */ - /* - * For this resource the size is static - */ - segment_size = 12; - break; - - case address16: - /* - * 16-Bit Address Resource - */ - /* - * The base size of this byte stream is 16. If a - * Resource Source string is not NULL, add 1 for - * the Index + the length of the null terminated - * string Resource Source + 1 for the null. - */ - segment_size = 16; - - if(NULL != linked_list->data.address16.resource_source) { - segment_size += (1 + - linked_list->data.address16.resource_source_string_length); - } - break; - - case address32: - /* - * 32-Bit Address Resource - */ - /* - * The base size of this byte stream is 26. If a Resource - * Source string is not NULL, add 1 for the Index + the - * length of the null terminated string Resource Source + - * 1 for the null. - */ - segment_size = 26; - - if(NULL != linked_list->data.address16.resource_source) { - segment_size += (1 + - linked_list->data.address16.resource_source_string_length); - } - break; - - case extended_irq: - /* - * Extended IRQ Resource - */ - /* - * The base size of this byte stream is 9. This is for an - * Interrupt table length of 1. For each additional - * interrupt, add 4. - * If a Resource Source string is not NULL, add 1 for the - * Index + the length of the null terminated string - * Resource Source + 1 for the null. - */ - segment_size = 9; - - segment_size += - (linked_list->data.extended_irq.number_of_interrupts - - 1) * 4; - - if(NULL != ex_irq->resource_source) { - segment_size += (1 + - linked_list->data.extended_irq.resource_source_string_length); - } - break; - - default: - /* - * If we get here, everything is out of sync, - * so exit with an error - */ - return (AE_AML_ERROR); - break; - - } /* switch (Linked_list->Id) */ - - /* - * Update the total - */ - byte_stream_size_needed += segment_size; - - /* - * Point to the next object - */ - linked_list = (RESOURCE *) ((NATIVE_UINT) linked_list + - (NATIVE_UINT) linked_list->length); - } - - /* - * This is the data the caller needs - */ - *size_needed = byte_stream_size_needed; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_calculate_list_length - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource byte stream - * Byte_stream_buffer_length - Size of Byte_stream_buffer - * Size_needed - u32 pointer of the size buffer - * needed to properly return the - * parsed data - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Takes the resource byte stream and parses it once, calculating - * the size buffer needed to hold the linked list that conveys - * the resource data. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_calculate_list_length ( - u8 *byte_stream_buffer, - u32 byte_stream_buffer_length, - u32 *size_needed) -{ - u32 buffer_size = 0; - u32 bytes_parsed = 0; - u8 number_of_interrupts = 0; - u8 number_of_channels = 0; - u8 resource_type; - u32 structure_size; - u32 bytes_consumed; - u8 *buffer; - u8 temp8; - u16 temp16; - u8 index; - u8 additional_bytes; - - - while (bytes_parsed < byte_stream_buffer_length) { - /* - * Look at the next byte in the stream - */ - resource_type = *byte_stream_buffer; - - /* - * See if this is a small or large resource - */ - if(resource_type & 0x80) { - /* - * Large Resource Type - */ - switch (resource_type) { - case MEMORY_RANGE_24: - /* - * 24-Bit Memory Resource - */ - bytes_consumed = 12; - - structure_size = sizeof (MEMORY24_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - break; - - case LARGE_VENDOR_DEFINED: - /* - * Vendor Defined Resource - */ - buffer = byte_stream_buffer; - ++buffer; - - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - bytes_consumed = temp16 + 3; - - /* - * Ensure a 32-bit boundary for the structure - */ - temp16 = (u16) ROUND_UP_TO_32_bITS (temp16); - - structure_size = sizeof (VENDOR_RESOURCE) + - RESOURCE_LENGTH_NO_DATA + - (temp16 * sizeof (u8)); - break; - - case MEMORY_RANGE_32: - /* - * 32-Bit Memory Range Resource - */ - - bytes_consumed = 20; - - structure_size = sizeof (MEMORY32_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - break; - - case FIXED_MEMORY_RANGE_32: - /* - * 32-Bit Fixed Memory Resource - */ - bytes_consumed = 12; - - structure_size = sizeof(FIXED_MEMORY32_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - break; - - case DWORD_ADDRESS_SPACE: - /* - * 32-Bit Address Resource - */ - buffer = byte_stream_buffer; - - ++buffer; - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - - bytes_consumed = temp16 + 3; - - /* - * Resource Source Index and Resource Source are - * optional elements. Check the length of the - * Bytestream. If it is greater than 23, that - * means that an Index exists and is followed by - * a null termininated string. Therefore, set - * the temp variable to the length minus the minimum - * byte stream length plus the byte for the Index to - * determine the size of the NULL terminiated string. - */ - if (23 < temp16) { - temp8 = (u8) (temp16 - 24); - } - else { - temp8 = 0; - } - - /* - * Ensure a 32-bit boundary for the structure - */ - temp8 = (u8) ROUND_UP_TO_32_bITS (temp8); - - structure_size = sizeof (ADDRESS32_RESOURCE) + - RESOURCE_LENGTH_NO_DATA + - (temp8 * sizeof (u8)); - break; - - case WORD_ADDRESS_SPACE: - /* - * 16-Bit Address Resource - */ - buffer = byte_stream_buffer; - - ++buffer; - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - - bytes_consumed = temp16 + 3; - - /* - * Resource Source Index and Resource Source are - * optional elements. Check the length of the - * Bytestream. If it is greater than 13, that - * means that an Index exists and is followed by - * a null termininated string. Therefore, set - * the temp variable to the length minus the minimum - * byte stream length plus the byte for the Index to - * determine the size of the NULL terminiated string. - */ - if (13 < temp16) { - temp8 = (u8) (temp16 - 14); - } - else { - temp8 = 0; - } - - /* - * Ensure a 32-bit boundry for the structure - */ - temp8 = (u8) ROUND_UP_TO_32_bITS (temp8); - - structure_size = sizeof (ADDRESS16_RESOURCE) + - RESOURCE_LENGTH_NO_DATA + - (temp8 * sizeof (u8)); - break; - - case EXTENDED_IRQ: - /* - * Extended IRQ - */ - buffer = byte_stream_buffer; - - ++buffer; - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - - bytes_consumed = temp16 + 3; - - /* - * Point past the length field and the - * Interrupt vector flags to save off the - * Interrupt table length to the Temp8 variable. - */ - buffer += 3; - temp8 = *buffer; - - /* - * To compensate for multiple interrupt numbers, - * Add 4 bytes for each additional interrupts - * greater than 1 - */ - additional_bytes = (u8) ((temp8 - 1) * 4); - - /* - * Resource Source Index and Resource Source are - * optional elements. Check the length of the - * Bytestream. If it is greater than 9, that - * means that an Index exists and is followed by - * a null termininated string. Therefore, set - * the temp variable to the length minus the minimum - * byte stream length plus the byte for the Index to - * determine the size of the NULL terminiated string. - */ - if (9 + additional_bytes < temp16) { - temp8 = (u8) (temp16 - (9 + additional_bytes)); - } - - else { - temp8 = 0; - } - - /* - * Ensure a 32-bit boundry for the structure - */ - temp8 = (u8) ROUND_UP_TO_32_bITS (temp8); - - structure_size = sizeof (EXTENDED_IRQ_RESOURCE) + - RESOURCE_LENGTH_NO_DATA + - (additional_bytes * sizeof (u8)) + - (temp8 * sizeof (u8)); - - break; - -/* TBD: [Future] 64-bit not currently supported */ -/* - case 0x8A: - break; -*/ - - default: - /* - * If we get here, everything is out of sync, - * so exit with an error - */ - return (AE_AML_ERROR); - break; - } - } - - else { - /* - * Small Resource Type - * Only bits 7:3 are valid - */ - resource_type >>= 3; - - switch (resource_type) { - case IRQ_FORMAT: - /* - * IRQ Resource - */ - /* - * Determine if it there are two or three - * trailing bytes - */ - buffer = byte_stream_buffer; - temp8 = *buffer; - - if(temp8 & 0x01) { - bytes_consumed = 4; - } - - else { - bytes_consumed = 3; - } - - /* - * Point past the descriptor - */ - ++buffer; - - /* - * Look at the number of bits set - */ - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - - for (index = 0; index < 16; index++) { - if (temp16 & 0x1) { - ++number_of_interrupts; - } - - temp16 >>= 1; - } - - structure_size = sizeof (IO_RESOURCE) + - RESOURCE_LENGTH_NO_DATA + - (number_of_interrupts * sizeof (u32)); - break; - - - case DMA_FORMAT: - - /* - * DMA Resource - */ - buffer = byte_stream_buffer; - - bytes_consumed = 3; - - /* - * Point past the descriptor - */ - ++buffer; - - /* - * Look at the number of bits set - */ - temp8 = *buffer; - - for(index = 0; index < 8; index++) { - if(temp8 & 0x1) { - ++number_of_channels; - } - - temp8 >>= 1; - } - - structure_size = sizeof (DMA_RESOURCE) + - RESOURCE_LENGTH_NO_DATA + - (number_of_channels * sizeof (u32)); - break; - - - case START_DEPENDENT_TAG: - - /* - * Start Dependent Functions Resource - */ - /* - * Determine if it there are two or three trailing bytes - */ - buffer = byte_stream_buffer; - temp8 = *buffer; - - if(temp8 & 0x01) { - bytes_consumed = 2; - } - else { - bytes_consumed = 1; - } - - - structure_size = - sizeof (START_DEPENDENT_FUNCTIONS_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - break; - - - case END_DEPENDENT_TAG: - - /* - * End Dependent Functions Resource - */ - bytes_consumed = 1; - structure_size = RESOURCE_LENGTH; - break; - - - case IO_PORT_DESCRIPTOR: - /* - * IO Port Resource - */ - bytes_consumed = 8; - structure_size = sizeof (IO_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - break; - - - case FIXED_LOCATION_IO_DESCRIPTOR: - - /* - * Fixed IO Port Resource - */ - bytes_consumed = 4; - structure_size = sizeof (FIXED_IO_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - break; - - - case SMALL_VENDOR_DEFINED: - - /* - * Vendor Specific Resource - */ - buffer = byte_stream_buffer; - - temp8 = *buffer; - temp8 = (u8) (temp8 & 0x7); - bytes_consumed = temp8 + 1; - - /* - * Ensure a 32-bit boundry for the structure - */ - temp8 = (u8) ROUND_UP_TO_32_bITS (temp8); - structure_size = sizeof (VENDOR_RESOURCE) + - RESOURCE_LENGTH_NO_DATA + - (temp8 * sizeof (u8)); - break; - - - case END_TAG: - - /* - * End Tag - */ - bytes_consumed = 2; - structure_size = RESOURCE_LENGTH; - byte_stream_buffer_length = bytes_parsed; - break; - - - default: - /* - * If we get here, everything is out of sync, - * so exit with an error - */ - return (AE_AML_ERROR); - break; - - } /* switch */ - - } /* if(Resource_type & 0x80) */ - - /* - * Update the return value and counter - */ - buffer_size += structure_size; - bytes_parsed += bytes_consumed; - - /* - * Set the byte stream to point to the next resource - */ - byte_stream_buffer += bytes_consumed; - - } - - /* - * This is the data the caller needs - */ - *size_needed = buffer_size; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_calculate_pci_routing_table_length - * - * PARAMETERS: Package_object - Pointer to the package object - * Buffer_size_needed - u32 pointer of the size buffer - * needed to properly return the - * parsed data - * - * RETURN: Status AE_OK - * - * DESCRIPTION: Given a package representing a PCI routing table, this - * calculates the size of the corresponding linked list of - * descriptions. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_calculate_pci_routing_table_length ( - ACPI_OPERAND_OBJECT *package_object, - u32 *buffer_size_needed) -{ - u32 number_of_elements; - u32 temp_size_needed = 0; - ACPI_OPERAND_OBJECT **top_object_list; - u32 index; - ACPI_OPERAND_OBJECT *package_element; - ACPI_OPERAND_OBJECT **sub_object_list; - u8 name_found; - u32 table_index; - - - number_of_elements = package_object->package.count; - - /* - * Calculate the size of the return buffer. - * The base size is the number of elements * the sizes of the - * structures. Additional space for the strings is added below. - * The minus one is to subtract the size of the u8 Source[1] - * member because it is added below. - */ - - /* - * But each PRT_ENTRY structure has a pointer to a string and - * the size of that string must be found. - */ - top_object_list = package_object->package.elements; - - for (index = 0; index < number_of_elements; index++) { - /* - * Dereference the sub-package - */ - package_element = *top_object_list; - - /* - * The Sub_object_list will now point to an array of the - * four IRQ elements: Address, Pin, Source and Source_index - */ - sub_object_list = package_element->package.elements; - - /* - * Scan the Irq_table_elements for the Source Name String - */ - name_found = FALSE; - - for (table_index = 0; table_index < 4 && !name_found; table_index++) { - if ((ACPI_TYPE_STRING == (*sub_object_list)->common.type) || - ((INTERNAL_TYPE_REFERENCE == (*sub_object_list)->common.type) && - ((*sub_object_list)->reference.opcode == AML_NAMEPATH_OP))) { - name_found = TRUE; - } - - else { - /* - * Look at the next element - */ - sub_object_list++; - } - } - - temp_size_needed += (sizeof (PCI_ROUTING_TABLE) - 4); - - /* - * Was a String type found? - */ - if (TRUE == name_found) { - if (ACPI_TYPE_STRING == (*sub_object_list)->common.type) { - /* - * The length String.Length field includes the - * terminating NULL - */ - temp_size_needed += (*sub_object_list)->string.length; - } - else { - temp_size_needed += acpi_ns_get_pathname_length ((*sub_object_list)->reference.node); - } - } - - else { - /* - * If no name was found, then this is a NULL, which is - * translated as a u32 zero. - */ - temp_size_needed += sizeof(u32); - } - - - /* Round up the size since each element must be aligned */ - - temp_size_needed = ROUND_UP_TO_64_bITS (temp_size_needed); - - /* - * Point to the next ACPI_OPERAND_OBJECT - */ - top_object_list++; - } - - - /* - * Adding an extra element to the end of the list, essentially a NULL terminator - */ - *buffer_size_needed = temp_size_needed + sizeof (PCI_ROUTING_TABLE); - - return (AE_OK); -} diff --git a/reactos/drivers/bus/acpi/resource/rscreate.c b/reactos/drivers/bus/acpi/resource/rscreate.c deleted file mode 100644 index a856093d6a9..00000000000 --- a/reactos/drivers/bus/acpi/resource/rscreate.c +++ /dev/null @@ -1,418 +0,0 @@ -/******************************************************************************* - * - * Module Name: rscreate - Acpi_rs_create_resource_list - * Acpi_rs_create_pci_routing_table - * Acpi_rs_create_byte_stream - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_RESOURCES - MODULE_NAME ("rscreate") - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_create_resource_list - * - * PARAMETERS: - * Byte_stream_buffer - Pointer to the resource byte stream - * Output_buffer - Pointer to the user's buffer - * Output_buffer_length - Pointer to the size of Output_buffer - * - * RETURN: Status - AE_OK if okay, else a valid ACPI_STATUS code - * If Output_buffer is not large enough, Output_buffer_length - * indicates how large Output_buffer should be, else it - * indicates how may u8 elements of Output_buffer are valid. - * - * DESCRIPTION: Takes the byte stream returned from a _CRS, _PRS control method - * execution and parses the stream to create a linked list - * of device resources. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_create_resource_list ( - ACPI_OPERAND_OBJECT *byte_stream_buffer, - u8 *output_buffer, - u32 *output_buffer_length) -{ - - ACPI_STATUS status; - u8 *byte_stream_start = NULL; - u32 list_size_needed = 0; - u32 byte_stream_buffer_length = 0; - - - /* - * Params already validated, so we don't re-validate here - */ - - byte_stream_buffer_length = byte_stream_buffer->buffer.length; - byte_stream_start = byte_stream_buffer->buffer.pointer; - - /* - * Pass the Byte_stream_buffer into a module that can calculate - * the buffer size needed for the linked list - */ - status = acpi_rs_calculate_list_length (byte_stream_start, - byte_stream_buffer_length, - &list_size_needed); - - /* - * Exit with the error passed back - */ - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * If the linked list will fit into the available buffer - * call to fill in the list - */ - - if (list_size_needed <= *output_buffer_length) { - /* - * Zero out the return buffer before proceeding - */ - MEMSET (output_buffer, 0x00, *output_buffer_length); - - status = acpi_rs_byte_stream_to_list (byte_stream_start, - byte_stream_buffer_length, - &output_buffer); - - /* - * Exit with the error passed back - */ - if (ACPI_FAILURE (status)) { - return (status); - } - - } - - else { - *output_buffer_length = list_size_needed; - return (AE_BUFFER_OVERFLOW); - } - - *output_buffer_length = list_size_needed; - return (AE_OK); - -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_create_pci_routing_table - * - * PARAMETERS: - * Package_object - Pointer to an ACPI_OPERAND_OBJECT - * package - * Output_buffer - Pointer to the user's buffer - * Output_buffer_length - Size of Output_buffer - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code. - * If the Output_buffer is too small, the error will be - * AE_BUFFER_OVERFLOW and Output_buffer_length will point - * to the size buffer needed. - * - * DESCRIPTION: Takes the ACPI_OPERAND_OBJECT package and creates a - * linked list of PCI interrupt descriptions - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_create_pci_routing_table ( - ACPI_OPERAND_OBJECT *package_object, - u8 *output_buffer, - u32 *output_buffer_length) -{ - u8 *buffer = output_buffer; - ACPI_OPERAND_OBJECT **top_object_list = NULL; - ACPI_OPERAND_OBJECT **sub_object_list = NULL; - ACPI_OPERAND_OBJECT *package_element = NULL; - u32 buffer_size_needed = 0; - u32 number_of_elements = 0; - u32 index = 0; - PCI_ROUTING_TABLE *user_prt = NULL; - ACPI_NAMESPACE_NODE *node; - ACPI_STATUS status; - - - /* - * Params already validated, so we don't re-validate here - */ - - status = acpi_rs_calculate_pci_routing_table_length(package_object, - &buffer_size_needed); - - /* - * If the data will fit into the available buffer - * call to fill in the list - */ - if (buffer_size_needed <= *output_buffer_length) { - /* - * Zero out the return buffer before proceeding - */ - MEMSET (output_buffer, 0x00, *output_buffer_length); - - /* - * Loop through the ACPI_INTERNAL_OBJECTS - Each object should - * contain a u32 Address, a u8 Pin, a Name and a u8 - * Source_index. - */ - top_object_list = package_object->package.elements; - number_of_elements = package_object->package.count; - user_prt = (PCI_ROUTING_TABLE *) buffer; - - - buffer = ROUND_PTR_UP_TO_8 (buffer, u8); - - for (index = 0; index < number_of_elements; index++) { - /* - * Point User_prt past this current structure - * - * NOTE: On the first iteration, User_prt->Length will - * be zero because we cleared the return buffer earlier - */ - buffer += user_prt->length; - user_prt = (PCI_ROUTING_TABLE *) buffer; - - - /* - * Fill in the Length field with the information we - * have at this point. - * The minus four is to subtract the size of the - * u8 Source[4] member because it is added below. - */ - user_prt->length = (sizeof (PCI_ROUTING_TABLE) -4); - - /* - * Dereference the sub-package - */ - package_element = *top_object_list; - - /* - * The Sub_object_list will now point to an array of - * the four IRQ elements: Address, Pin, Source and - * Source_index - */ - sub_object_list = package_element->package.elements; - - /* - * 1) First subobject: Dereference the Address - */ - if (ACPI_TYPE_INTEGER == (*sub_object_list)->common.type) { - user_prt->address = (*sub_object_list)->integer.value; - } - - else { - return (AE_BAD_DATA); - } - - /* - * 2) Second subobject: Dereference the Pin - */ - sub_object_list++; - - if (ACPI_TYPE_INTEGER == (*sub_object_list)->common.type) { - user_prt->pin = - (u32) (*sub_object_list)->integer.value; - } - - else { - return (AE_BAD_DATA); - } - - /* - * 3) Third subobject: Dereference the Source Name - */ - sub_object_list++; - - switch ((*sub_object_list)->common.type) { - case INTERNAL_TYPE_REFERENCE: - if ((*sub_object_list)->reference.opcode != AML_NAMEPATH_OP) { - return (AE_BAD_DATA); - } - - node = (*sub_object_list)->reference.node; - - /* TBD: use *remaining* length of the buffer! */ - - status = acpi_ns_handle_to_pathname ((ACPI_HANDLE *) node, - output_buffer_length, user_prt->source); - - user_prt->length += STRLEN (user_prt->source) + 1; /* include null terminator */ - break; - - - case ACPI_TYPE_STRING: - - STRCPY (user_prt->source, - (*sub_object_list)->string.pointer); - - /* - * Add to the Length field the length of the string - */ - user_prt->length += (*sub_object_list)->string.length; - break; - - - case ACPI_TYPE_INTEGER: - /* - * If this is a number, then the Source Name - * is NULL, since the entire buffer was zeroed - * out, we can leave this alone. - */ - /* - * Add to the Length field the length of - * the u32 NULL - */ - user_prt->length += sizeof (u32); - break; - - - default: - return (AE_BAD_DATA); - break; - } - - /* Now align the current length */ - - user_prt->length = ROUND_UP_TO_64_bITS (user_prt->length); - - /* - * 4) Fourth subobject: Dereference the Source Index - */ - sub_object_list++; - - if (ACPI_TYPE_INTEGER == (*sub_object_list)->common.type) { - user_prt->source_index = - (u32) (*sub_object_list)->integer.value; - } - - else { - return (AE_BAD_DATA); - } - - /* - * Point to the next ACPI_OPERAND_OBJECT - */ - top_object_list++; - } - - } - - else { - *output_buffer_length = buffer_size_needed; - - return (AE_BUFFER_OVERFLOW); - } - - /* - * Report the amount of buffer used - */ - *output_buffer_length = buffer_size_needed; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_create_byte_stream - * - * PARAMETERS: - * Linked_list_buffer - Pointer to the resource linked list - * Output_buffer - Pointer to the user's buffer - * Output_buffer_length - Size of Output_buffer - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code. - * If the Output_buffer is too small, the error will be - * AE_BUFFER_OVERFLOW and Output_buffer_length will point - * to the size buffer needed. - * - * DESCRIPTION: Takes the linked list of device resources and - * creates a bytestream to be used as input for the - * _SRS control method. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_create_byte_stream ( - RESOURCE *linked_list_buffer, - u8 *output_buffer, - u32 *output_buffer_length) -{ - ACPI_STATUS status; - u32 byte_stream_size_needed = 0; - - - /* - * Params already validated, so we don't re-validate here - * - * Pass the Linked_list_buffer into a module that can calculate - * the buffer size needed for the byte stream. - */ - status = acpi_rs_calculate_byte_stream_length (linked_list_buffer, - &byte_stream_size_needed); - - /* - * Exit with the error passed back - */ - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * If the linked list will fit into the available buffer - * call to fill in the list - */ - - if (byte_stream_size_needed <= *output_buffer_length) { - /* - * Zero out the return buffer before proceeding - */ - MEMSET (output_buffer, 0x00, *output_buffer_length); - - status = acpi_rs_list_to_byte_stream (linked_list_buffer, - byte_stream_size_needed, - &output_buffer); - - /* - * Exit with the error passed back - */ - if (ACPI_FAILURE (status)) { - return (status); - } - - } - else { - *output_buffer_length = byte_stream_size_needed; - return (AE_BUFFER_OVERFLOW); - } - - return (AE_OK); -} - diff --git a/reactos/drivers/bus/acpi/resource/rsdump.c b/reactos/drivers/bus/acpi/resource/rsdump.c deleted file mode 100644 index d28061352e8..00000000000 --- a/reactos/drivers/bus/acpi/resource/rsdump.c +++ /dev/null @@ -1,928 +0,0 @@ -/******************************************************************************* - * - * Module Name: rsdump - Functions do dump out the resource structures. - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_RESOURCES - MODULE_NAME ("rsdump") - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dump_irq - * - * PARAMETERS: Data - pointer to the resource structure to dump. - * - * RETURN: - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -void -acpi_rs_dump_irq ( - RESOURCE_DATA *data) -{ - IRQ_RESOURCE *irq_data = (IRQ_RESOURCE*) data; - u8 index = 0; - - - acpi_os_printf ("\t_iRQ Resource\n"); - - acpi_os_printf ("\t\t%s Triggered\n", - LEVEL_SENSITIVE == irq_data->edge_level ? - "Level" : "Edge"); - - acpi_os_printf ("\t\t_active %s\n", - ACTIVE_LOW == irq_data->active_high_low ? - "Low" : "High"); - - acpi_os_printf ("\t\t%s\n", - SHARED == irq_data->shared_exclusive ? - "Shared" : "Exclusive"); - - acpi_os_printf ("\t\t%X Interrupts ( ", - irq_data->number_of_interrupts); - - for (index = 0; index < irq_data->number_of_interrupts; index++) { - acpi_os_printf ("%X ", irq_data->interrupts[index]); - } - - acpi_os_printf (")\n"); - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dump_dma - * - * PARAMETERS: Data - pointer to the resource structure to dump. - * - * RETURN: - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -void -acpi_rs_dump_dma ( - RESOURCE_DATA *data) -{ - DMA_RESOURCE *dma_data = (DMA_RESOURCE*) data; - u8 index = 0; - - - acpi_os_printf ("\t_dMA Resource\n"); - - switch (dma_data->type) { - case COMPATIBILITY: - acpi_os_printf ("\t\t_compatibility mode\n"); - break; - - case TYPE_A: - acpi_os_printf ("\t\t_type A\n"); - break; - - case TYPE_B: - acpi_os_printf ("\t\t_type B\n"); - break; - - case TYPE_F: - acpi_os_printf ("\t\t_type F\n"); - break; - - default: - acpi_os_printf ("\t\t_invalid DMA type\n"); - break; - } - - acpi_os_printf ("\t\t%sBus Master\n", - BUS_MASTER == dma_data->bus_master ? - "" : "Not a "); - - switch (dma_data->transfer) { - case TRANSFER_8: - acpi_os_printf ("\t\t8-bit only transfer\n"); - break; - - case TRANSFER_8_16: - acpi_os_printf ("\t\t8 and 16-bit transfer\n"); - break; - - case TRANSFER_16: - acpi_os_printf ("\t\t16 bit only transfer\n"); - break; - - default: - acpi_os_printf ("\t\t_invalid transfer preference\n"); - break; - } - - acpi_os_printf ("\t\t_number of Channels: %X ( ", - dma_data->number_of_channels); - - for (index = 0; index < dma_data->number_of_channels; index++) { - acpi_os_printf ("%X ", dma_data->channels[index]); - } - - acpi_os_printf (")\n"); - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dump_start_dependent_functions - * - * PARAMETERS: Data - pointer to the resource structure to dump. - * - * RETURN: - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -void -acpi_rs_dump_start_dependent_functions ( - RESOURCE_DATA *data) -{ - START_DEPENDENT_FUNCTIONS_RESOURCE *sdf_data = - (START_DEPENDENT_FUNCTIONS_RESOURCE*) data; - - - acpi_os_printf ("\t_start Dependent Functions Resource\n"); - - switch (sdf_data->compatibility_priority) { - case GOOD_CONFIGURATION: - acpi_os_printf ("\t\t_good configuration\n"); - break; - - case ACCEPTABLE_CONFIGURATION: - acpi_os_printf ("\t\t_acceptable configuration\n"); - break; - - case SUB_OPTIMAL_CONFIGURATION: - acpi_os_printf ("\t\t_sub-optimal configuration\n"); - break; - - default: - acpi_os_printf ("\t\t_invalid compatibility priority\n"); - break; - } - - switch(sdf_data->performance_robustness) { - case GOOD_CONFIGURATION: - acpi_os_printf ("\t\t_good configuration\n"); - break; - - case ACCEPTABLE_CONFIGURATION: - acpi_os_printf ("\t\t_acceptable configuration\n"); - break; - - case SUB_OPTIMAL_CONFIGURATION: - acpi_os_printf ("\t\t_sub-optimal configuration\n"); - break; - - default: - acpi_os_printf ("\t\t_invalid performance " - "robustness preference\n"); - break; - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dump_io - * - * PARAMETERS: Data - pointer to the resource structure to dump. - * - * RETURN: - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -void -acpi_rs_dump_io ( - RESOURCE_DATA *data) -{ - IO_RESOURCE *io_data = (IO_RESOURCE*) data; - - - acpi_os_printf ("\t_io Resource\n"); - - acpi_os_printf ("\t\t%d bit decode\n", - DECODE_16 == io_data->io_decode ? 16 : 10); - - acpi_os_printf ("\t\t_range minimum base: %08X\n", - io_data->min_base_address); - - acpi_os_printf ("\t\t_range maximum base: %08X\n", - io_data->max_base_address); - - acpi_os_printf ("\t\t_alignment: %08X\n", - io_data->alignment); - - acpi_os_printf ("\t\t_range Length: %08X\n", - io_data->range_length); - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dump_fixed_io - * - * PARAMETERS: Data - pointer to the resource structure to dump. - * - * RETURN: - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -void -acpi_rs_dump_fixed_io ( - RESOURCE_DATA *data) -{ - FIXED_IO_RESOURCE *fixed_io_data = (FIXED_IO_RESOURCE*) data; - - - acpi_os_printf ("\t_fixed Io Resource\n"); - acpi_os_printf ("\t\t_range base address: %08X", - fixed_io_data->base_address); - - acpi_os_printf ("\t\t_range length: %08X", - fixed_io_data->range_length); - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dump_vendor_specific - * - * PARAMETERS: Data - pointer to the resource structure to dump. - * - * RETURN: - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -void -acpi_rs_dump_vendor_specific ( - RESOURCE_DATA *data) -{ - VENDOR_RESOURCE *vendor_data = (VENDOR_RESOURCE*) data; - u16 index = 0; - - - acpi_os_printf ("\t_vendor Specific Resource\n"); - - acpi_os_printf ("\t\t_length: %08X\n", vendor_data->length); - - for (index = 0; index < vendor_data->length; index++) { - acpi_os_printf ("\t\t_byte %X: %08X\n", - index, vendor_data->reserved[index]); - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dump_memory24 - * - * PARAMETERS: Data - pointer to the resource structure to dump. - * - * RETURN: - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -void -acpi_rs_dump_memory24 ( - RESOURCE_DATA *data) -{ - MEMORY24_RESOURCE *memory24_data = (MEMORY24_RESOURCE*) data; - - - acpi_os_printf ("\t24-Bit Memory Range Resource\n"); - - acpi_os_printf ("\t\t_read%s\n", - READ_WRITE_MEMORY == - memory24_data->read_write_attribute ? - "/Write" : " only"); - - acpi_os_printf ("\t\t_range minimum base: %08X\n", - memory24_data->min_base_address); - - acpi_os_printf ("\t\t_range maximum base: %08X\n", - memory24_data->max_base_address); - - acpi_os_printf ("\t\t_alignment: %08X\n", - memory24_data->alignment); - - acpi_os_printf ("\t\t_range length: %08X\n", - memory24_data->range_length); - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dump_memory32 - * - * PARAMETERS: Data - pointer to the resource structure to dump. - * - * RETURN: - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -void -acpi_rs_dump_memory32 ( - RESOURCE_DATA *data) -{ - MEMORY32_RESOURCE *memory32_data = (MEMORY32_RESOURCE*) data; - - - acpi_os_printf ("\t32-Bit Memory Range Resource\n"); - - acpi_os_printf ("\t\t_read%s\n", - READ_WRITE_MEMORY == - memory32_data->read_write_attribute ? - "/Write" : " only"); - - acpi_os_printf ("\t\t_range minimum base: %08X\n", - memory32_data->min_base_address); - - acpi_os_printf ("\t\t_range maximum base: %08X\n", - memory32_data->max_base_address); - - acpi_os_printf ("\t\t_alignment: %08X\n", - memory32_data->alignment); - - acpi_os_printf ("\t\t_range length: %08X\n", - memory32_data->range_length); - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dump_fixed_memory32 - * - * PARAMETERS: Data - pointer to the resource structure to dump. - * - * RETURN: - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -void -acpi_rs_dump_fixed_memory32 ( - RESOURCE_DATA *data) -{ - FIXED_MEMORY32_RESOURCE *fixed_memory32_data = (FIXED_MEMORY32_RESOURCE*) data; - - - acpi_os_printf ("\t32-Bit Fixed Location Memory Range Resource\n"); - - acpi_os_printf ("\t\t_read%s\n", - READ_WRITE_MEMORY == - fixed_memory32_data->read_write_attribute ? - "/Write" : " Only"); - - acpi_os_printf ("\t\t_range base address: %08X\n", - fixed_memory32_data->range_base_address); - - acpi_os_printf ("\t\t_range length: %08X\n", - fixed_memory32_data->range_length); - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dump_address16 - * - * PARAMETERS: Data - pointer to the resource structure to dump. - * - * RETURN: - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -void -acpi_rs_dump_address16 ( - RESOURCE_DATA *data) -{ - ADDRESS16_RESOURCE *address16_data = (ADDRESS16_RESOURCE*) data; - - - acpi_os_printf ("\t16-Bit Address Space Resource\n"); - acpi_os_printf ("\t\t_resource Type: "); - - switch (address16_data->resource_type) { - case MEMORY_RANGE: - - acpi_os_printf ("Memory Range\n"); - - switch (address16_data->attribute.memory.cache_attribute) { - case NON_CACHEABLE_MEMORY: - acpi_os_printf ("\t\t_type Specific: " - "Noncacheable memory\n"); - break; - - case CACHABLE_MEMORY: - acpi_os_printf ("\t\t_type Specific: " - "Cacheable memory\n"); - break; - - case WRITE_COMBINING_MEMORY: - acpi_os_printf ("\t\t_type Specific: " - "Write-combining memory\n"); - break; - - case PREFETCHABLE_MEMORY: - acpi_os_printf ("\t\t_type Specific: " - "Prefetchable memory\n"); - break; - - default: - acpi_os_printf ("\t\t_type Specific: " - "Invalid cache attribute\n"); - break; - } - - acpi_os_printf ("\t\t_type Specific: Read%s\n", - READ_WRITE_MEMORY == - address16_data->attribute.memory.read_write_attribute ? - "/Write" : " Only"); - break; - - case IO_RANGE: - - acpi_os_printf ("I/O Range\n"); - - switch (address16_data->attribute.io.range_attribute) { - case NON_ISA_ONLY_RANGES: - acpi_os_printf ("\t\t_type Specific: " - "Non-ISA Io Addresses\n"); - break; - - case ISA_ONLY_RANGES: - acpi_os_printf ("\t\t_type Specific: " - "ISA Io Addresses\n"); - break; - - case ENTIRE_RANGE: - acpi_os_printf ("\t\t_type Specific: " - "ISA and non-ISA Io Addresses\n"); - break; - - default: - acpi_os_printf ("\t\t_type Specific: " - "Invalid range attribute\n"); - break; - } - break; - - case BUS_NUMBER_RANGE: - - acpi_os_printf ("Bus Number Range\n"); - break; - - default: - - acpi_os_printf ("Invalid resource type. Exiting.\n"); - return; - } - - acpi_os_printf ("\t\t_resource %s\n", - CONSUMER == address16_data->producer_consumer ? - "Consumer" : "Producer"); - - acpi_os_printf ("\t\t%s decode\n", - SUB_DECODE == address16_data->decode ? - "Subtractive" : "Positive"); - - acpi_os_printf ("\t\t_min address is %s fixed\n", - ADDRESS_FIXED == address16_data->min_address_fixed ? - "" : "not"); - - acpi_os_printf ("\t\t_max address is %s fixed\n", - ADDRESS_FIXED == address16_data->max_address_fixed ? - "" : "not"); - - acpi_os_printf ("\t\t_granularity: %08X\n", - address16_data->granularity); - - acpi_os_printf ("\t\t_address range min: %08X\n", - address16_data->min_address_range); - - acpi_os_printf ("\t\t_address range max: %08X\n", - address16_data->max_address_range); - - acpi_os_printf ("\t\t_address translation offset: %08X\n", - address16_data->address_translation_offset); - - acpi_os_printf ("\t\t_address Length: %08X\n", - address16_data->address_length); - - if (0xFF != address16_data->resource_source_index) { - acpi_os_printf ("\t\t_resource Source Index: %X\n", - address16_data->resource_source_index); - acpi_os_printf ("\t\t_resource Source: %s\n", - address16_data->resource_source); - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dump_address32 - * - * PARAMETERS: Data - pointer to the resource structure to dump. - * - * RETURN: - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -void -acpi_rs_dump_address32 ( - RESOURCE_DATA *data) -{ - ADDRESS32_RESOURCE *address32_data = (ADDRESS32_RESOURCE*) data; - - - acpi_os_printf ("\t32-Bit Address Space Resource\n"); - - switch (address32_data->resource_type) { - case MEMORY_RANGE: - - acpi_os_printf ("\t\t_resource Type: Memory Range\n"); - - switch (address32_data->attribute.memory.cache_attribute) { - case NON_CACHEABLE_MEMORY: - acpi_os_printf ("\t\t_type Specific: " - "Noncacheable memory\n"); - break; - - case CACHABLE_MEMORY: - acpi_os_printf ("\t\t_type Specific: " - "Cacheable memory\n"); - break; - - case WRITE_COMBINING_MEMORY: - acpi_os_printf ("\t\t_type Specific: " - "Write-combining memory\n"); - break; - - case PREFETCHABLE_MEMORY: - acpi_os_printf ("\t\t_type Specific: " - "Prefetchable memory\n"); - break; - - default: - acpi_os_printf ("\t\t_type Specific: " - "Invalid cache attribute\n"); - break; - } - - acpi_os_printf ("\t\t_type Specific: Read%s\n", - READ_WRITE_MEMORY == - address32_data->attribute.memory.read_write_attribute ? - "/Write" : " Only"); - break; - - case IO_RANGE: - - acpi_os_printf ("\t\t_resource Type: Io Range\n"); - - switch (address32_data->attribute.io.range_attribute) { - case NON_ISA_ONLY_RANGES: - acpi_os_printf ("\t\t_type Specific: " - "Non-ISA Io Addresses\n"); - break; - - case ISA_ONLY_RANGES: - acpi_os_printf ("\t\t_type Specific: " - "ISA Io Addresses\n"); - break; - - case ENTIRE_RANGE: - acpi_os_printf ("\t\t_type Specific: " - "ISA and non-ISA Io Addresses\n"); - break; - - default: - acpi_os_printf ("\t\t_type Specific: " - "Invalid Range attribute"); - break; - } - break; - - case BUS_NUMBER_RANGE: - - acpi_os_printf ("\t\t_resource Type: Bus Number Range\n"); - break; - - default: - - acpi_os_printf ("\t\t_invalid Resource Type..exiting.\n"); - return; - } - - acpi_os_printf ("\t\t_resource %s\n", - CONSUMER == address32_data->producer_consumer ? - "Consumer" : "Producer"); - - acpi_os_printf ("\t\t%s decode\n", - SUB_DECODE == address32_data->decode ? - "Subtractive" : "Positive"); - - acpi_os_printf ("\t\t_min address is %s fixed\n", - ADDRESS_FIXED == address32_data->min_address_fixed ? - "" : "not "); - - acpi_os_printf ("\t\t_max address is %s fixed\n", - ADDRESS_FIXED == address32_data->max_address_fixed ? - "" : "not "); - - acpi_os_printf ("\t\t_granularity: %08X\n", - address32_data->granularity); - - acpi_os_printf ("\t\t_address range min: %08X\n", - address32_data->min_address_range); - - acpi_os_printf ("\t\t_address range max: %08X\n", - address32_data->max_address_range); - - acpi_os_printf ("\t\t_address translation offset: %08X\n", - address32_data->address_translation_offset); - - acpi_os_printf ("\t\t_address Length: %08X\n", - address32_data->address_length); - - if(0xFF != address32_data->resource_source_index) { - acpi_os_printf ("\t\t_resource Source Index: %X\n", - address32_data->resource_source_index); - acpi_os_printf ("\t\t_resource Source: %s\n", - address32_data->resource_source); - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dump_extended_irq - * - * PARAMETERS: Data - pointer to the resource structure to dump. - * - * RETURN: - * - * DESCRIPTION: Prints out the various members of the Data structure type. - * - ******************************************************************************/ - -void -acpi_rs_dump_extended_irq ( - RESOURCE_DATA *data) -{ - EXTENDED_IRQ_RESOURCE *ext_irq_data = (EXTENDED_IRQ_RESOURCE*) data; - u8 index = 0; - - - acpi_os_printf ("\t_extended IRQ Resource\n"); - - acpi_os_printf ("\t\t_resource %s\n", - CONSUMER == ext_irq_data->producer_consumer ? - "Consumer" : "Producer"); - - acpi_os_printf ("\t\t%s\n", - LEVEL_SENSITIVE == ext_irq_data->edge_level ? - "Level" : "Edge"); - - acpi_os_printf ("\t\t_active %s\n", - ACTIVE_LOW == ext_irq_data->active_high_low ? - "low" : "high"); - - acpi_os_printf ("\t\t%s\n", - SHARED == ext_irq_data->shared_exclusive ? - "Shared" : "Exclusive"); - - acpi_os_printf ("\t\t_interrupts : %X ( ", - ext_irq_data->number_of_interrupts); - - for (index = 0; index < ext_irq_data->number_of_interrupts; index++) { - acpi_os_printf ("%X ", ext_irq_data->interrupts[index]); - } - - acpi_os_printf (")\n"); - - if(0xFF != ext_irq_data->resource_source_index) { - acpi_os_printf ("\t\t_resource Source Index: %X", - ext_irq_data->resource_source_index); - acpi_os_printf ("\t\t_resource Source: %s", - ext_irq_data->resource_source); - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dump_resource_list - * - * PARAMETERS: Data - pointer to the resource structure to dump. - * - * RETURN: - * - * DESCRIPTION: Dispatches the structure to the correct dump routine. - * - ******************************************************************************/ - -void -acpi_rs_dump_resource_list ( - RESOURCE *resource) -{ - u8 count = 0; - u8 done = FALSE; - - - if (acpi_dbg_level & TRACE_RESOURCES && _COMPONENT & acpi_dbg_layer) { - while (!done) { - acpi_os_printf ("\t_resource structure %x.\n", count++); - - switch (resource->id) { - case irq: - acpi_rs_dump_irq (&resource->data); - break; - - case dma: - acpi_rs_dump_dma (&resource->data); - break; - - case start_dependent_functions: - acpi_rs_dump_start_dependent_functions (&resource->data); - break; - - case end_dependent_functions: - acpi_os_printf ("\t_end_dependent_functions Resource\n"); - /* Acpi_rs_dump_end_dependent_functions (Resource->Data);*/ - break; - - case io: - acpi_rs_dump_io (&resource->data); - break; - - case fixed_io: - acpi_rs_dump_fixed_io (&resource->data); - break; - - case vendor_specific: - acpi_rs_dump_vendor_specific (&resource->data); - break; - - case end_tag: - /*Rs_dump_end_tag (Resource->Data);*/ - acpi_os_printf ("\t_end_tag Resource\n"); - done = TRUE; - break; - - case memory24: - acpi_rs_dump_memory24 (&resource->data); - break; - - case memory32: - acpi_rs_dump_memory32 (&resource->data); - break; - - case fixed_memory32: - acpi_rs_dump_fixed_memory32 (&resource->data); - break; - - case address16: - acpi_rs_dump_address16 (&resource->data); - break; - - case address32: - acpi_rs_dump_address32 (&resource->data); - break; - - case extended_irq: - acpi_rs_dump_extended_irq (&resource->data); - break; - - default: - acpi_os_printf ("Invalid resource type\n"); - break; - - } - - resource = (RESOURCE *) ((NATIVE_UINT) resource + - (NATIVE_UINT) resource->length); - } - } - - return; -} - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dump_irq_list - * - * PARAMETERS: Data - pointer to the routing table to dump. - * - * RETURN: - * - * DESCRIPTION: Dispatches the structures to the correct dump routine. - * - ******************************************************************************/ - -void -acpi_rs_dump_irq_list ( - u8 *route_table) -{ - u8 *buffer = route_table; - u8 count = 0; - u8 done = FALSE; - PCI_ROUTING_TABLE *prt_element; - - - if (acpi_dbg_level & TRACE_RESOURCES && _COMPONENT & acpi_dbg_layer) { - prt_element = (PCI_ROUTING_TABLE *) buffer; - - while (!done) { - acpi_os_printf ("\t_pCI IRQ Routing Table structure %X.\n", count++); - - acpi_os_printf ("\t\t_address: %X\n", - prt_element->address); - - acpi_os_printf ("\t\t_pin: %X\n", prt_element->pin); - - acpi_os_printf ("\t\t_source: %s\n", prt_element->source); - - acpi_os_printf ("\t\t_source_index: %X\n", - prt_element->source_index); - - buffer += prt_element->length; - - prt_element = (PCI_ROUTING_TABLE *) buffer; - - if(0 == prt_element->length) { - done = TRUE; - } - } - } - - return; -} - diff --git a/reactos/drivers/bus/acpi/resource/rsio.c b/reactos/drivers/bus/acpi/resource/rsio.c deleted file mode 100644 index a84b2a26b93..00000000000 --- a/reactos/drivers/bus/acpi/resource/rsio.c +++ /dev/null @@ -1,526 +0,0 @@ -/******************************************************************************* - * - * Module Name: rsio - Acpi_rs_io_resource - * Acpi_rs_fixed_io_resource - * Acpi_rs_io_stream - * Acpi_rs_fixed_io_stream - * Acpi_rs_dma_resource - * Acpi_rs_dma_stream - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include -#define _COMPONENT ACPI_RESOURCES - MODULE_NAME ("rsio") - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_io_resource - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte - * stream - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes consumed from - * the Byte_stream_buffer - * Output_buffer - Pointer to the user's return buffer - * Structure_size - u32 pointer that is filled with - * the number of bytes in the filled - * in structure - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the resource byte stream and fill out the appropriate - * structure pointed to by the Output_buffer. Return the - * number of bytes consumed from the byte stream. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_io_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size) -{ - u8 *buffer = byte_stream_buffer; - RESOURCE *output_struct = (RESOURCE *) * output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - u32 struct_size = sizeof (IO_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - - - /* - * The number of bytes consumed are Constant - */ - *bytes_consumed = 8; - - output_struct->id = io; - - /* - * Check Decode - */ - buffer += 1; - temp8 = *buffer; - - output_struct->data.io.io_decode = temp8 & 0x01; - - /* - * Check Min_base Address - */ - buffer += 1; - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - - output_struct->data.io.min_base_address = temp16; - - /* - * Check Max_base Address - */ - buffer += 2; - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - - output_struct->data.io.max_base_address = temp16; - - /* - * Check Base alignment - */ - buffer += 2; - temp8 = *buffer; - - output_struct->data.io.alignment = temp8; - - /* - * Check Range_length - */ - buffer += 1; - temp8 = *buffer; - - output_struct->data.io.range_length = temp8; - - /* - * Set the Length parameter - */ - output_struct->length = struct_size; - - /* - * Return the final size of the structure - */ - *structure_size = struct_size; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_fixed_io_resource - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte - * stream - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes consumed from - * the Byte_stream_buffer - * Output_buffer - Pointer to the user's return buffer - * Structure_size - u32 pointer that is filled with - * the number of bytes in the filled - * in structure - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the resource byte stream and fill out the appropriate - * structure pointed to by the Output_buffer. Return the - * number of bytes consumed from the byte stream. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_fixed_io_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size) -{ - u8 *buffer = byte_stream_buffer; - RESOURCE *output_struct = (RESOURCE *) * output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - u32 struct_size = sizeof (FIXED_IO_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - - - /* - * The number of bytes consumed are Constant - */ - *bytes_consumed = 4; - - output_struct->id = fixed_io; - - /* - * Check Range Base Address - */ - buffer += 1; - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - - output_struct->data.fixed_io.base_address = temp16; - - /* - * Check Range_length - */ - buffer += 2; - temp8 = *buffer; - - output_struct->data.fixed_io.range_length = temp8; - - /* - * Set the Length parameter - */ - output_struct->length = struct_size; - - /* - * Return the final size of the structure - */ - *structure_size = struct_size; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_io_stream - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Output_buffer - Pointer to the user's return buffer - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes of the - * Output_buffer used - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the linked list resource structure and fills in the - * the appropriate bytes in a byte stream - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_io_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed) -{ - u8 *buffer = *output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - - - /* - * The descriptor field is static - */ - *buffer = 0x47; - buffer += 1; - - /* - * Io Information Byte - */ - temp8 = (u8) (linked_list->data.io.io_decode & 0x01); - - *buffer = temp8; - buffer += 1; - - /* - * Set the Range minimum base address - */ - temp16 = (u16) linked_list->data.io.min_base_address; - - MOVE_UNALIGNED16_TO_16 (buffer, &temp16); - buffer += 2; - - /* - * Set the Range maximum base address - */ - temp16 = (u16) linked_list->data.io.max_base_address; - - MOVE_UNALIGNED16_TO_16 (buffer, &temp16); - buffer += 2; - - /* - * Set the base alignment - */ - temp8 = (u8) linked_list->data.io.alignment; - - *buffer = temp8; - buffer += 1; - - /* - * Set the range length - */ - temp8 = (u8) linked_list->data.io.range_length; - - *buffer = temp8; - buffer += 1; - - /* - * Return the number of bytes consumed in this operation - */ - *bytes_consumed = (u32) ((NATIVE_UINT) buffer - - (NATIVE_UINT) *output_buffer); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_fixed_io_stream - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Output_buffer - Pointer to the user's return buffer - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes of the - * Output_buffer used - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the linked list resource structure and fills in the - * the appropriate bytes in a byte stream - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_fixed_io_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed) -{ - u8 *buffer = *output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - - - /* - * The descriptor field is static - */ - *buffer = 0x4B; - - buffer += 1; - - /* - * Set the Range base address - */ - temp16 = (u16) linked_list->data.fixed_io.base_address; - - MOVE_UNALIGNED16_TO_16 (buffer, &temp16); - buffer += 2; - - /* - * Set the range length - */ - temp8 = (u8) linked_list->data.fixed_io.range_length; - - *buffer = temp8; - buffer += 1; - - /* - * Return the number of bytes consumed in this operation - */ - *bytes_consumed = (u32) ((NATIVE_UINT) buffer - - (NATIVE_UINT) *output_buffer); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dma_resource - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte - * stream - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes consumed from - * the Byte_stream_buffer - * Output_buffer - Pointer to the user's return buffer - * Structure_size - u32 pointer that is filled with - * the number of bytes in the filled - * in structure - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the resource byte stream and fill out the appropriate - * structure pointed to by the Output_buffer. Return the - * number of bytes consumed from the byte stream. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_dma_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size) -{ - u8 *buffer = byte_stream_buffer; - RESOURCE *output_struct = (RESOURCE *) * output_buffer; - u8 temp8 = 0; - u8 index; - u8 i; - u32 struct_size = sizeof(DMA_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - - - /* - * The number of bytes consumed are Constant - */ - *bytes_consumed = 3; - output_struct->id = dma; - - /* - * Point to the 8-bits of Byte 1 - */ - buffer += 1; - temp8 = *buffer; - - /* Decode the IRQ bits */ - - for (i = 0, index = 0; index < 8; index++) { - if ((temp8 >> index) & 0x01) { - output_struct->data.dma.channels[i] = index; - i++; - } - } - output_struct->data.dma.number_of_channels = i; - - - /* - * Calculate the structure size based upon the number of interrupts - */ - struct_size += (output_struct->data.dma.number_of_channels - 1) * 4; - - /* - * Point to Byte 2 - */ - buffer += 1; - temp8 = *buffer; - - /* - * Check for transfer preference (Bits[1:0]) - */ - output_struct->data.dma.transfer = temp8 & 0x03; - - if (0x03 == output_struct->data.dma.transfer) { - return (AE_BAD_DATA); - } - - /* - * Get bus master preference (Bit[2]) - */ - output_struct->data.dma.bus_master = (temp8 >> 2) & 0x01; - - /* - * Get channel speed support (Bits[6:5]) - */ - output_struct->data.dma.type = (temp8 >> 5) & 0x03; - - /* - * Set the Length parameter - */ - output_struct->length = struct_size; - - /* - * Return the final size of the structure - */ - *structure_size = struct_size; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_dma_stream - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Output_buffer - Pointer to the user's return buffer - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes of the - * Output_buffer used - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the linked list resource structure and fills in the - * the appropriate bytes in a byte stream - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_dma_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed) -{ - u8 *buffer = *output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - u8 index; - - - /* - * The descriptor field is static - */ - *buffer = 0x2A; - buffer += 1; - temp8 = 0; - - /* - * Loop through all of the Channels and set the mask bits - */ - for (index = 0; - index < linked_list->data.dma.number_of_channels; - index++) { - temp16 = (u16) linked_list->data.dma.channels[index]; - temp8 |= 0x1 << temp16; - } - - *buffer = temp8; - buffer += 1; - - /* - * Set the DMA Info - */ - temp8 = (u8) ((linked_list->data.dma.type & 0x03) << 5); - temp8 |= ((linked_list->data.dma.bus_master & 0x01) << 2); - temp8 |= (linked_list->data.dma.transfer & 0x03); - - *buffer = temp8; - buffer += 1; - - /* - * Return the number of bytes consumed in this operation - */ - *bytes_consumed = (u32) ((NATIVE_UINT) buffer - - (NATIVE_UINT) *output_buffer); - - return (AE_OK); -} - diff --git a/reactos/drivers/bus/acpi/resource/rsirq.c b/reactos/drivers/bus/acpi/resource/rsirq.c deleted file mode 100644 index b5dccbbd599..00000000000 --- a/reactos/drivers/bus/acpi/resource/rsirq.c +++ /dev/null @@ -1,555 +0,0 @@ -/******************************************************************************* - * - * Module Name: rsirq - Acpi_rs_irq_resource, - * Acpi_rs_irq_stream - * Acpi_rs_extended_irq_resource - * Acpi_rs_extended_irq_stream - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_RESOURCES - MODULE_NAME ("rsirq") - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_irq_resource - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte - * stream - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes consumed from - * the Byte_stream_buffer - * Output_buffer - Pointer to the user's return buffer - * Structure_size - u32 pointer that is filled with - * the number of bytes in the filled - * in structure - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the resource byte stream and fill out the appropriate - * structure pointed to by the Output_buffer. Return the - * number of bytes consumed from the byte stream. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_irq_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size) -{ - u8 *buffer = byte_stream_buffer; - RESOURCE *output_struct = (RESOURCE *) * output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - u8 index; - u8 i; - u32 struct_size = sizeof (IRQ_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - - - /* - * The number of bytes consumed are contained in the descriptor - * (Bits:0-1) - */ - temp8 = *buffer; - *bytes_consumed = (temp8 & 0x03) + 1; - output_struct->id = irq; - - /* - * Point to the 16-bits of Bytes 1 and 2 - */ - buffer += 1; - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - - output_struct->data.irq.number_of_interrupts = 0; - - /* Decode the IRQ bits */ - - for (i = 0, index = 0; index < 16; index++) { - if((temp16 >> index) & 0x01) { - output_struct->data.irq.interrupts[i] = index; - i++; - } - } - output_struct->data.irq.number_of_interrupts = i; - - /* - * Calculate the structure size based upon the number of interrupts - */ - struct_size += (output_struct->data.irq.number_of_interrupts - 1) * 4; - - /* - * Point to Byte 3 if it is used - */ - if (4 == *bytes_consumed) { - buffer += 2; - temp8 = *buffer; - - /* - * Check for HE, LL or HL - */ - if (temp8 & 0x01) { - output_struct->data.irq.edge_level = EDGE_SENSITIVE; - output_struct->data.irq.active_high_low = ACTIVE_HIGH; - } - - else { - if (temp8 & 0x8) { - output_struct->data.irq.edge_level = LEVEL_SENSITIVE; - output_struct->data.irq.active_high_low = ACTIVE_LOW; - } - - else { - /* - * Only _LL and _HE polarity/trigger interrupts - * are allowed (ACPI spec v1.0b ection 6.4.2.1), - * so an error will occur if we reach this point - */ - return (AE_BAD_DATA); - } - } - - /* - * Check for sharable - */ - output_struct->data.irq.shared_exclusive = (temp8 >> 3) & 0x01; - } - - else { - /* - * Assume Edge Sensitive, Active High, Non-Sharable - * per ACPI Specification - */ - output_struct->data.irq.edge_level = EDGE_SENSITIVE; - output_struct->data.irq.active_high_low = ACTIVE_HIGH; - output_struct->data.irq.shared_exclusive = EXCLUSIVE; - } - - /* - * Set the Length parameter - */ - output_struct->length = struct_size; - - /* - * Return the final size of the structure - */ - *structure_size = struct_size; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_irq_stream - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Output_buffer - Pointer to the user's return buffer - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes of the - * Output_buffer used - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the linked list resource structure and fills in the - * the appropriate bytes in a byte stream - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_irq_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed) -{ - u8 *buffer = *output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - u8 index; - u8 IRQinfo_byte_needed; - - - /* - * The descriptor field is set based upon whether a third byte is - * needed to contain the IRQ Information. - */ - if (EDGE_SENSITIVE == linked_list->data.irq.edge_level && - ACTIVE_HIGH == linked_list->data.irq.active_high_low && - EXCLUSIVE == linked_list->data.irq.shared_exclusive) { - *buffer = 0x22; - IRQinfo_byte_needed = FALSE; - } - else { - *buffer = 0x23; - IRQinfo_byte_needed = TRUE; - } - - buffer += 1; - temp16 = 0; - - /* - * Loop through all of the interrupts and set the mask bits - */ - for(index = 0; - index < linked_list->data.irq.number_of_interrupts; - index++) { - temp8 = (u8) linked_list->data.irq.interrupts[index]; - temp16 |= 0x1 << temp8; - } - - MOVE_UNALIGNED16_TO_16 (buffer, &temp16); - buffer += 2; - - /* - * Set the IRQ Info byte if needed. - */ - if (IRQinfo_byte_needed) { - temp8 = 0; - temp8 = (u8) ((linked_list->data.irq.shared_exclusive & - 0x01) << 4); - - if (LEVEL_SENSITIVE == linked_list->data.irq.edge_level && - ACTIVE_LOW == linked_list->data.irq.active_high_low) { - temp8 |= 0x08; - } - - else { - temp8 |= 0x01; - } - - *buffer = temp8; - buffer += 1; - } - - /* - * Return the number of bytes consumed in this operation - */ - *bytes_consumed = (u32) ((NATIVE_UINT) buffer - - (NATIVE_UINT) *output_buffer); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_extended_irq_resource - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte - * stream - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes consumed from - * the Byte_stream_buffer - * Output_buffer - Pointer to the user's return buffer - * Structure_size - u32 pointer that is filled with - * the number of bytes in the filled - * in structure - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the resource byte stream and fill out the appropriate - * structure pointed to by the Output_buffer. Return the - * number of bytes consumed from the byte stream. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_extended_irq_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size) -{ - u8 *buffer = byte_stream_buffer; - RESOURCE *output_struct = (RESOURCE *) * output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - u8 index; - u32 struct_size = sizeof (EXTENDED_IRQ_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - - - /* - * Point past the Descriptor to get the number of bytes consumed - */ - buffer += 1; - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - - *bytes_consumed = temp16 + 3; - output_struct->id = extended_irq; - - /* - * Point to the Byte3 - */ - buffer += 2; - temp8 = *buffer; - - output_struct->data.extended_irq.producer_consumer = temp8 & 0x01; - - /* - * Check for HE, LL or HL - */ - if(temp8 & 0x02) { - output_struct->data.extended_irq.edge_level = EDGE_SENSITIVE; - output_struct->data.extended_irq.active_high_low = ACTIVE_HIGH; - } - - else { - if(temp8 & 0x4) { - output_struct->data.extended_irq.edge_level = LEVEL_SENSITIVE; - output_struct->data.extended_irq.active_high_low = ACTIVE_LOW; - } - - else { - /* - * Only _LL and _HE polarity/trigger interrupts - * are allowed (ACPI spec v1.0b ection 6.4.2.1), - * so an error will occur if we reach this point - */ - return (AE_BAD_DATA); - } - } - - /* - * Check for sharable - */ - output_struct->data.extended_irq.shared_exclusive = - (temp8 >> 3) & 0x01; - - /* - * Point to Byte4 (IRQ Table length) - */ - buffer += 1; - temp8 = *buffer; - - output_struct->data.extended_irq.number_of_interrupts = temp8; - - /* - * Add any additional structure size to properly calculate - * the next pointer at the end of this function - */ - struct_size += (temp8 - 1) * 4; - - /* - * Point to Byte5 (First IRQ Number) - */ - buffer += 1; - - /* - * Cycle through every IRQ in the table - */ - for (index = 0; index < temp8; index++) { - output_struct->data.extended_irq.interrupts[index] = - (u32)*buffer; - - /* Point to the next IRQ */ - - buffer += 4; - } - - /* - * This will leave us pointing to the Resource Source Index - * If it is present, then save it off and calculate the - * pointer to where the null terminated string goes: - * Each Interrupt takes 32-bits + the 5 bytes of the - * stream that are default. - */ - if (*bytes_consumed > - (u32)(output_struct->data.extended_irq.number_of_interrupts * - 4) + 5) { - /* Dereference the Index */ - - temp8 = *buffer; - output_struct->data.extended_irq.resource_source_index = - (u32)temp8; - - /* Point to the String */ - - buffer += 1; - - /* Copy the string into the buffer */ - - index = 0; - - while (0x00 != *buffer) { - output_struct->data.extended_irq.resource_source[index] = - *buffer; - - buffer += 1; - index += 1; - } - - /* - * Add the terminating null - */ - output_struct->data.extended_irq.resource_source[index] = 0x00; - output_struct->data.extended_irq.resource_source_string_length = - index + 1; - - /* - * In order for the Struct_size to fall on a 32-bit boundry, - * calculate the length of the string and expand the - * Struct_size to the next 32-bit boundry. - */ - temp8 = (u8) (index + 1); - temp8 = (u8) ROUND_UP_TO_32_bITS (temp8); - } - - else { - output_struct->data.extended_irq.resource_source_index = 0x00; - output_struct->data.extended_irq.resource_source_string_length = 0; - output_struct->data.extended_irq.resource_source[0] = 0x00; - } - - /* - * Set the Length parameter - */ - output_struct->length = struct_size; - - /* - * Return the final size of the structure - */ - *structure_size = struct_size; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_extended_irq_stream - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Output_buffer - Pointer to the user's return buffer - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes of the - * Output_buffer used - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the linked list resource structure and fills in the - * the appropriate bytes in a byte stream - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_extended_irq_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed) -{ - u8 *buffer = *output_buffer; - u16 *length_field; - u8 temp8 = 0; - u8 index; - NATIVE_CHAR *temp_pointer = NULL; - - - /* - * The descriptor field is static - */ - *buffer = 0x89; - buffer += 1; - - /* - * Set a pointer to the Length field - to be filled in later - */ - - length_field = (u16 *)buffer; - buffer += 2; - - /* - * Set the Interrupt vector flags - */ - temp8 = (u8)(linked_list->data.extended_irq.producer_consumer & 0x01); - - temp8 |= ((linked_list->data.extended_irq.shared_exclusive & 0x01) << 3); - - if (LEVEL_SENSITIVE == linked_list->data.extended_irq.edge_level && - ACTIVE_LOW == linked_list->data.extended_irq.active_high_low) { - temp8 |= 0x04; - } - else { - temp8 |= 0x02; - } - - *buffer = temp8; - buffer += 1; - - /* - * Set the Interrupt table length - */ - temp8 = (u8) linked_list->data.extended_irq.number_of_interrupts; - - *buffer = temp8; - buffer += 1; - - for (index = 0; - index < linked_list->data.extended_irq.number_of_interrupts; - index++) { - MOVE_UNALIGNED32_TO_32 (buffer, - &linked_list->data.extended_irq.interrupts[index]); - buffer += 4; - } - - /* - * Resource Source Index and Resource Source are optional - */ - if (0 != linked_list->data.extended_irq.resource_source_string_length) { - *buffer = (u8) linked_list->data.extended_irq.resource_source_index; - buffer += 1; - - temp_pointer = (NATIVE_CHAR *) buffer; - - /* - * Copy the string - */ - STRCPY (temp_pointer, linked_list->data.extended_irq.resource_source); - - /* - * Buffer needs to be set to the length of the sting + one for the - * terminating null - */ - buffer += (STRLEN (linked_list->data.extended_irq.resource_source) + 1); - } - - /* - * Return the number of bytes consumed in this operation - */ - *bytes_consumed = (u32) ((NATIVE_UINT) buffer - - (NATIVE_UINT) *output_buffer); - - /* - * Set the length field to the number of bytes consumed - * minus the header size (3 bytes) - */ - *length_field = (u16) (*bytes_consumed - 3); - - return (AE_OK); -} - diff --git a/reactos/drivers/bus/acpi/resource/rslist.c b/reactos/drivers/bus/acpi/resource/rslist.c deleted file mode 100644 index 9c255d10846..00000000000 --- a/reactos/drivers/bus/acpi/resource/rslist.c +++ /dev/null @@ -1,499 +0,0 @@ -/******************************************************************************* - * - * Module Name: rslist - Acpi_rs_byte_stream_to_list - * Acpi_list_to_byte_stream - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_RESOURCES - MODULE_NAME ("rslist") - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_byte_stream_to_list - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource byte stream - * Byte_stream_buffer_length - Length of Byte_stream_buffer - * Output_buffer - Pointer to the buffer that will - * contain the output structures - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Takes the resource byte stream and parses it, creating a - * linked list of resources in the caller's output buffer - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_byte_stream_to_list ( - u8 *byte_stream_buffer, - u32 byte_stream_buffer_length, - u8 **output_buffer) -{ - ACPI_STATUS status; - u32 bytes_parsed = 0; - u8 resource_type = 0; - u32 bytes_consumed = 0; - u8 **buffer = output_buffer; - u32 structure_size = 0; - u8 end_tag_processed = FALSE; - - - while (bytes_parsed < byte_stream_buffer_length && - FALSE == end_tag_processed) { - /* - * Look at the next byte in the stream - */ - resource_type = *byte_stream_buffer; - - /* - * See if this is a small or large resource - */ - if(resource_type & 0x80) { - /* - * Large Resource Type - */ - switch (resource_type) { - case MEMORY_RANGE_24: - /* - * 24-Bit Memory Resource - */ - status = acpi_rs_memory24_resource(byte_stream_buffer, - &bytes_consumed, - buffer, - &structure_size); - - break; - - case LARGE_VENDOR_DEFINED: - /* - * Vendor Defined Resource - */ - status = acpi_rs_vendor_resource(byte_stream_buffer, - &bytes_consumed, - buffer, - &structure_size); - - break; - - case MEMORY_RANGE_32: - /* - * 32-Bit Memory Range Resource - */ - status = acpi_rs_memory32_range_resource(byte_stream_buffer, - &bytes_consumed, - buffer, - &structure_size); - - break; - - case FIXED_MEMORY_RANGE_32: - /* - * 32-Bit Fixed Memory Resource - */ - status = acpi_rs_fixed_memory32_resource(byte_stream_buffer, - &bytes_consumed, - buffer, - &structure_size); - - break; - - case DWORD_ADDRESS_SPACE: - /* - * 32-Bit Address Resource - */ - status = acpi_rs_address32_resource(byte_stream_buffer, - &bytes_consumed, - buffer, - &structure_size); - - break; - - case WORD_ADDRESS_SPACE: - /* - * 16-Bit Address Resource - */ - status = acpi_rs_address16_resource(byte_stream_buffer, - &bytes_consumed, - buffer, - &structure_size); - - break; - - case EXTENDED_IRQ: - /* - * Extended IRQ - */ - status = acpi_rs_extended_irq_resource(byte_stream_buffer, - &bytes_consumed, - buffer, - &structure_size); - - break; - -/* TBD: [Future] 64-bit not currently supported */ -/* - case 0x8A: - break; -*/ - - default: - /* - * If we get here, everything is out of sync, - * so exit with an error - */ - return (AE_AML_ERROR); - break; - } - } - - else { - /* - * Small Resource Type - * Only bits 7:3 are valid - */ - resource_type >>= 3; - - switch(resource_type) { - case IRQ_FORMAT: - /* - * IRQ Resource - */ - status = acpi_rs_irq_resource(byte_stream_buffer, - &bytes_consumed, - buffer, - &structure_size); - - break; - - case DMA_FORMAT: - /* - * DMA Resource - */ - status = acpi_rs_dma_resource(byte_stream_buffer, - &bytes_consumed, - buffer, - &structure_size); - - break; - - case START_DEPENDENT_TAG: - /* - * Start Dependent Functions Resource - */ - status = acpi_rs_start_dependent_functions_resource(byte_stream_buffer, - &bytes_consumed, - buffer, - &structure_size); - - break; - - case END_DEPENDENT_TAG: - /* - * End Dependent Functions Resource - */ - status = acpi_rs_end_dependent_functions_resource(byte_stream_buffer, - &bytes_consumed, - buffer, - &structure_size); - - break; - - case IO_PORT_DESCRIPTOR: - /* - * IO Port Resource - */ - status = acpi_rs_io_resource(byte_stream_buffer, - &bytes_consumed, - buffer, - &structure_size); - - break; - - case FIXED_LOCATION_IO_DESCRIPTOR: - /* - * Fixed IO Port Resource - */ - status = acpi_rs_fixed_io_resource(byte_stream_buffer, - &bytes_consumed, - buffer, - &structure_size); - - break; - - case SMALL_VENDOR_DEFINED: - /* - * Vendor Specific Resource - */ - status = acpi_rs_vendor_resource(byte_stream_buffer, - &bytes_consumed, - buffer, - &structure_size); - - break; - - case END_TAG: - /* - * End Tag - */ - status = acpi_rs_end_tag_resource(byte_stream_buffer, - &bytes_consumed, - buffer, - &structure_size); - end_tag_processed = TRUE; - - break; - - default: - /* - * If we get here, everything is out of sync, - * so exit with an error - */ - return (AE_AML_ERROR); - break; - - } /* switch */ - } /* end else */ - - /* - * Update the return value and counter - */ - bytes_parsed += bytes_consumed; - - /* - * Set the byte stream to point to the next resource - */ - byte_stream_buffer += bytes_consumed; - - /* - * Set the Buffer to the next structure - */ - *buffer += structure_size; - - } /* end while */ - - /* - * Check the reason for exiting the while loop - */ - if (TRUE != end_tag_processed) { - return (AE_AML_ERROR); - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_list_to_byte_stream - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Byte_steam_size_needed - Calculated size of the byte stream - * needed from calling - * Acpi_rs_calculate_byte_stream_length() - * The size of the Output_buffer is - * guaranteed to be >= - * Byte_stream_size_needed - * Output_buffer - Pointer to the buffer that will - * contain the byte stream - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Takes the resource linked list and parses it, creating a - * byte stream of resources in the caller's output buffer - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_list_to_byte_stream ( - RESOURCE *linked_list, - u32 byte_stream_size_needed, - u8 **output_buffer) -{ - ACPI_STATUS status; - u8 *buffer = *output_buffer; - u32 bytes_consumed = 0; - u8 done = FALSE; - - - while (!done) { - switch (linked_list->id) { - case irq: - /* - * IRQ Resource - */ - status = acpi_rs_irq_stream (linked_list, - &buffer, - &bytes_consumed); - break; - - case dma: - /* - * DMA Resource - */ - status = acpi_rs_dma_stream (linked_list, - &buffer, - &bytes_consumed); - break; - - case start_dependent_functions: - /* - * Start Dependent Functions Resource - */ - status = acpi_rs_start_dependent_functions_stream (linked_list, - &buffer, - &bytes_consumed); - break; - - case end_dependent_functions: - /* - * End Dependent Functions Resource - */ - status = acpi_rs_end_dependent_functions_stream (linked_list, - &buffer, - &bytes_consumed); - break; - - case io: - /* - * IO Port Resource - */ - status = acpi_rs_io_stream (linked_list, - &buffer, - &bytes_consumed); - break; - - case fixed_io: - /* - * Fixed IO Port Resource - */ - status = acpi_rs_fixed_io_stream (linked_list, - &buffer, - &bytes_consumed); - break; - - case vendor_specific: - /* - * Vendor Defined Resource - */ - status = acpi_rs_vendor_stream (linked_list, - &buffer, - &bytes_consumed); - break; - - case end_tag: - /* - * End Tag - */ - status = acpi_rs_end_tag_stream (linked_list, - &buffer, - &bytes_consumed); - - /* - * An End Tag indicates the end of the Resource Template - */ - done = TRUE; - break; - - case memory24: - /* - * 24-Bit Memory Resource - */ - status = acpi_rs_memory24_stream (linked_list, - &buffer, - &bytes_consumed); - break; - - case memory32: - /* - * 32-Bit Memory Range Resource - */ - status = acpi_rs_memory32_range_stream (linked_list, - &buffer, - &bytes_consumed); - break; - - case fixed_memory32: - /* - * 32-Bit Fixed Memory Resource - */ - status = acpi_rs_fixed_memory32_stream (linked_list, - &buffer, - &bytes_consumed); - break; - - case address16: - /* - * 16-Bit Address Descriptor Resource - */ - status = acpi_rs_address16_stream (linked_list, - &buffer, - &bytes_consumed); - break; - - case address32: - /* - * 32-Bit Address Descriptor Resource - */ - status = acpi_rs_address32_stream (linked_list, - &buffer, - &bytes_consumed); - break; - - case extended_irq: - /* - * Extended IRQ Resource - */ - status = acpi_rs_extended_irq_stream (linked_list, - &buffer, - &bytes_consumed); - break; - - default: - /* - * If we get here, everything is out of sync, - * so exit with an error - */ - return (AE_BAD_DATA); - break; - - } /* switch (Linked_list->Id) */ - - /* - * Set the Buffer to point to the open byte - */ - buffer += bytes_consumed; - - /* - * Point to the next object - */ - linked_list = (RESOURCE *) ((NATIVE_UINT) linked_list + - (NATIVE_UINT) linked_list->length); - } - - return (AE_OK); -} - diff --git a/reactos/drivers/bus/acpi/resource/rsmemory.c b/reactos/drivers/bus/acpi/resource/rsmemory.c deleted file mode 100644 index 3efab7d0695..00000000000 --- a/reactos/drivers/bus/acpi/resource/rsmemory.c +++ /dev/null @@ -1,556 +0,0 @@ -/******************************************************************************* - * - * Module Name: rsmem24 - Acpi_rs_memory24_resource - * Acpi_rs_memory24_stream - * Acpi_rs_memory32_range_resource - * Acpi_rs_fixed_memory32_resource - * Acpi_rs_memory32_range_stream - * Acpi_rs_fixed_memory32_stream - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_RESOURCES - MODULE_NAME ("rsmemory") - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_memory24_resource - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte - * stream - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes consumed from - * the Byte_stream_buffer - * Output_buffer - Pointer to the user's return buffer - * Structure_size - u32 pointer that is filled with - * the number of bytes in the filled - * in structure - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the resource byte stream and fill out the appropriate - * structure pointed to by the Output_buffer. Return the - * number of bytes consumed from the byte stream. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_memory24_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size) -{ - u8 *buffer = byte_stream_buffer; - RESOURCE *output_struct = (RESOURCE *) * output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - u32 struct_size = sizeof (MEMORY24_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - - - /* - * Point past the Descriptor to get the number of bytes consumed - */ - buffer += 1; - - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - buffer += 2; - *bytes_consumed = temp16 + 3; - output_struct->id = memory24; - - /* - * Check Byte 3 the Read/Write bit - */ - temp8 = *buffer; - buffer += 1; - output_struct->data.memory24.read_write_attribute = temp8 & 0x01; - - /* - * Get Min_base_address (Bytes 4-5) - */ - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - buffer += 2; - output_struct->data.memory24.min_base_address = temp16; - - /* - * Get Max_base_address (Bytes 6-7) - */ - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - buffer += 2; - output_struct->data.memory24.max_base_address = temp16; - - /* - * Get Alignment (Bytes 8-9) - */ - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - buffer += 2; - output_struct->data.memory24.alignment = temp16; - - /* - * Get Range_length (Bytes 10-11) - */ - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - output_struct->data.memory24.range_length = temp16; - - /* - * Set the Length parameter - */ - output_struct->length = struct_size; - - /* - * Return the final size of the structure - */ - *structure_size = struct_size; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_memory24_stream - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Output_buffer - Pointer to the user's return buffer - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes of the - * Output_buffer used - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the linked list resource structure and fills in the - * the appropriate bytes in a byte stream - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_memory24_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed) -{ - u8 *buffer = *output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - - - /* - * The descriptor field is static - */ - *buffer = 0x81; - buffer += 1; - - /* - * The length field is static - */ - temp16 = 0x09; - MOVE_UNALIGNED16_TO_16 (buffer, &temp16); - buffer += 2; - - /* - * Set the Information Byte - */ - temp8 = (u8) (linked_list->data.memory24.read_write_attribute & 0x01); - *buffer = temp8; - buffer += 1; - - /* - * Set the Range minimum base address - */ - MOVE_UNALIGNED16_TO_16 (buffer, &linked_list->data.memory24.min_base_address); - buffer += 2; - - /* - * Set the Range maximum base address - */ - MOVE_UNALIGNED16_TO_16 (buffer, &linked_list->data.memory24.max_base_address); - buffer += 2; - - /* - * Set the base alignment - */ - MOVE_UNALIGNED16_TO_16 (buffer, &linked_list->data.memory24.alignment); - buffer += 2; - - /* - * Set the range length - */ - MOVE_UNALIGNED16_TO_16 (buffer, &linked_list->data.memory24.range_length); - buffer += 2; - - /* - * Return the number of bytes consumed in this operation - */ - *bytes_consumed = (u32) ((NATIVE_UINT) buffer - - (NATIVE_UINT) *output_buffer); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_memory32_range_resource - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte - * stream - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes consumed from - * the Byte_stream_buffer - * Output_buffer - Pointer to the user's return buffer - * Structure_size - u32 pointer that is filled with - * the number of bytes in the filled - * in structure - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the resource byte stream and fill out the appropriate - * structure pointed to by the Output_buffer. Return the - * number of bytes consumed from the byte stream. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_memory32_range_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size) -{ - u8 *buffer = byte_stream_buffer; - RESOURCE *output_struct = (RESOURCE *) * output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - u32 struct_size = sizeof (MEMORY32_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - - - /* - * Point past the Descriptor to get the number of bytes consumed - */ - buffer += 1; - - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - buffer += 2; - *bytes_consumed = temp16 + 3; - - output_struct->id = memory32; - - /* - * Point to the place in the output buffer where the data portion will - * begin. - * 1. Set the RESOURCE_DATA * Data to point to it's own address, then - * 2. Set the pointer to the next address. - * - * NOTE: Output_struct->Data is cast to u8, otherwise, this addition adds - * 4 * sizeof(RESOURCE_DATA) instead of 4 * sizeof(u8) - */ - - /* - * Check Byte 3 the Read/Write bit - */ - temp8 = *buffer; - buffer += 1; - - output_struct->data.memory32.read_write_attribute = temp8 & 0x01; - - /* - * Get Min_base_address (Bytes 4-7) - */ - MOVE_UNALIGNED32_TO_32 (&output_struct->data.memory32.min_base_address, - buffer); - buffer += 4; - - /* - * Get Max_base_address (Bytes 8-11) - */ - MOVE_UNALIGNED32_TO_32 (&output_struct->data.memory32.max_base_address, - buffer); - buffer += 4; - - /* - * Get Alignment (Bytes 12-15) - */ - MOVE_UNALIGNED32_TO_32 (&output_struct->data.memory32.alignment, buffer); - buffer += 4; - - /* - * Get Range_length (Bytes 16-19) - */ - MOVE_UNALIGNED32_TO_32 (&output_struct->data.memory32.range_length, buffer); - - /* - * Set the Length parameter - */ - output_struct->length = struct_size; - - /* - * Return the final size of the structure - */ - *structure_size = struct_size; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_fixed_memory32_resource - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte - * stream - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes consumed from - * the Byte_stream_buffer - * Output_buffer - Pointer to the user's return buffer - * Structure_size - u32 pointer that is filled with - * the number of bytes in the filled - * in structure - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the resource byte stream and fill out the appropriate - * structure pointed to by the Output_buffer. Return the - * number of bytes consumed from the byte stream. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_fixed_memory32_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size) -{ - u8 *buffer = byte_stream_buffer; - RESOURCE *output_struct = (RESOURCE *) * output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - u32 struct_size = sizeof (FIXED_MEMORY32_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - - - /* - * Point past the Descriptor to get the number of bytes consumed - */ - buffer += 1; - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - - buffer += 2; - *bytes_consumed = temp16 + 3; - - output_struct->id = fixed_memory32; - - /* - * Check Byte 3 the Read/Write bit - */ - temp8 = *buffer; - buffer += 1; - output_struct->data.fixed_memory32.read_write_attribute = temp8 & 0x01; - - /* - * Get Range_base_address (Bytes 4-7) - */ - MOVE_UNALIGNED32_TO_32 (&output_struct->data.fixed_memory32.range_base_address, - buffer); - buffer += 4; - - /* - * Get Range_length (Bytes 8-11) - */ - MOVE_UNALIGNED32_TO_32 (&output_struct->data.fixed_memory32.range_length, - buffer); - - /* - * Set the Length parameter - */ - output_struct->length = struct_size; - - /* - * Return the final size of the structure - */ - *structure_size = struct_size; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_memory32_range_stream - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Output_buffer - Pointer to the user's return buffer - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes of the - * Output_buffer used - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the linked list resource structure and fills in the - * the appropriate bytes in a byte stream - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_memory32_range_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed) -{ - u8 *buffer = *output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - - - /* - * The descriptor field is static - */ - *buffer = 0x85; - buffer += 1; - - /* - * The length field is static - */ - temp16 = 0x11; - - MOVE_UNALIGNED16_TO_16 (buffer, &temp16); - buffer += 2; - - /* - * Set the Information Byte - */ - temp8 = (u8) (linked_list->data.memory32.read_write_attribute & 0x01); - *buffer = temp8; - buffer += 1; - - /* - * Set the Range minimum base address - */ - MOVE_UNALIGNED32_TO_32 (buffer, &linked_list->data.memory32.min_base_address); - buffer += 4; - - /* - * Set the Range maximum base address - */ - MOVE_UNALIGNED32_TO_32 (buffer, &linked_list->data.memory32.max_base_address); - buffer += 4; - - /* - * Set the base alignment - */ - MOVE_UNALIGNED32_TO_32 (buffer, &linked_list->data.memory32.alignment); - buffer += 4; - - /* - * Set the range length - */ - MOVE_UNALIGNED32_TO_32 (buffer, &linked_list->data.memory32.range_length); - buffer += 4; - - /* - * Return the number of bytes consumed in this operation - */ - *bytes_consumed = (u32) ((NATIVE_UINT) buffer - - (NATIVE_UINT) *output_buffer); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_fixed_memory32_stream - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Output_buffer - Pointer to the user's return buffer - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes of the - * Output_buffer used - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the linked list resource structure and fills in the - * the appropriate bytes in a byte stream - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_fixed_memory32_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed) -{ - u8 *buffer = *output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - - - /* - * The descriptor field is static - */ - *buffer = 0x86; - buffer += 1; - - /* - * The length field is static - */ - temp16 = 0x09; - - MOVE_UNALIGNED16_TO_16 (buffer, &temp16); - buffer += 2; - - /* - * Set the Information Byte - */ - temp8 = (u8) (linked_list->data.fixed_memory32.read_write_attribute & 0x01); - *buffer = temp8; - buffer += 1; - - /* - * Set the Range base address - */ - MOVE_UNALIGNED32_TO_32 (buffer, - &linked_list->data.fixed_memory32.range_base_address); - buffer += 4; - - /* - * Set the range length - */ - MOVE_UNALIGNED32_TO_32 (buffer, - &linked_list->data.fixed_memory32.range_length); - buffer += 4; - - /* - * Return the number of bytes consumed in this operation - */ - *bytes_consumed = (u32) ((NATIVE_UINT) buffer - - (NATIVE_UINT) *output_buffer); - - return (AE_OK); -} - diff --git a/reactos/drivers/bus/acpi/resource/rsmisc.c b/reactos/drivers/bus/acpi/resource/rsmisc.c deleted file mode 100644 index 134ca94012b..00000000000 --- a/reactos/drivers/bus/acpi/resource/rsmisc.c +++ /dev/null @@ -1,605 +0,0 @@ -/******************************************************************************* - * - * Module Name: rsmisc - Acpi_rs_end_tag_resource - * Acpi_rs_end_tag_stream - * Acpi_rs_vendor_resource - * Acpi_rs_vendor_stream - * Acpi_rs_start_dependent_functions_resource - * Acpi_rs_end_dependent_functions_resource - * Acpi_rs_start_dependent_functions_stream - * Acpi_rs_end_dependent_functions_stream - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_RESOURCES - MODULE_NAME ("rsmisc") - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_end_tag_resource - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte - * stream - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes consumed from - * the Byte_stream_buffer - * Output_buffer - Pointer to the user's return buffer - * Structure_size - u32 pointer that is filled with - * the number of bytes in the filled - * in structure - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the resource byte stream and fill out the appropriate - * structure pointed to by the Output_buffer. Return the - * number of bytes consumed from the byte stream. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_end_tag_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size) -{ - RESOURCE *output_struct = (RESOURCE *) * output_buffer; - u32 struct_size = RESOURCE_LENGTH; - - - /* - * The number of bytes consumed is static - */ - *bytes_consumed = 2; - - /* - * Fill out the structure - */ - output_struct->id = end_tag; - - /* - * Set the Length parameter - */ - output_struct->length = 0; - - /* - * Return the final size of the structure - */ - *structure_size = struct_size; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_end_tag_stream - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Output_buffer - Pointer to the user's return buffer - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes of the - * Output_buffer used - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the linked list resource structure and fills in the - * the appropriate bytes in a byte stream - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_end_tag_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed) -{ - u8 *buffer = *output_buffer; - u8 temp8 = 0; - - - /* - * The descriptor field is static - */ - *buffer = 0x79; - buffer += 1; - - /* - * Set the Checksum - zero means that the resource data is treated as if - * the checksum operation succeeded (ACPI Spec 1.0b Section 6.4.2.8) - */ - temp8 = 0; - - *buffer = temp8; - buffer += 1; - - /* - * Return the number of bytes consumed in this operation - */ - *bytes_consumed = (u32) ((NATIVE_UINT) buffer - - (NATIVE_UINT) *output_buffer); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_vendor_resource - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte - * stream - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes consumed from - * the Byte_stream_buffer - * Output_buffer - Pointer to the user's return buffer - * Structure_size - u32 pointer that is filled with - * the number of bytes in the filled - * in structure - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the resource byte stream and fill out the appropriate - * structure pointed to by the Output_buffer. Return the - * number of bytes consumed from the byte stream. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_vendor_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size) -{ - u8 *buffer = byte_stream_buffer; - RESOURCE *output_struct = (RESOURCE *) * output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - u8 index; - u32 struct_size = sizeof (VENDOR_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - - - /* - * Dereference the Descriptor to find if this is a large or small item. - */ - temp8 = *buffer; - - if (temp8 & 0x80) { - /* - * Large Item - */ - /* Point to the length field */ - - buffer += 1; - - /* Dereference */ - - MOVE_UNALIGNED16_TO_16 (&temp16, buffer); - - /* Calculate bytes consumed */ - - *bytes_consumed = temp16 + 3; - - /* Point to the first vendor byte */ - - buffer += 2; - } - - else { - /* - * Small Item - */ - - /* Dereference the size */ - - temp16 = (u8)(*buffer & 0x07); - - /* Calculate bytes consumed */ - - *bytes_consumed = temp16 + 1; - - /* Point to the first vendor byte */ - - buffer += 1; - } - - output_struct->id = vendor_specific; - output_struct->data.vendor_specific.length = temp16; - - for (index = 0; index < temp16; index++) { - output_struct->data.vendor_specific.reserved[index] = *buffer; - buffer += 1; - } - - /* - * In order for the Struct_size to fall on a 32-bit boundry, - * calculate the length of the vendor string and expand the - * Struct_size to the next 32-bit boundry. - */ - struct_size += ROUND_UP_TO_32_bITS (temp16); - - /* - * Set the Length parameter - */ - output_struct->length = struct_size; - - /* - * Return the final size of the structure - */ - *structure_size = struct_size; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_vendor_stream - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Output_buffer - Pointer to the user's return buffer - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes of the - * Output_buffer used - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the linked list resource structure and fills in the - * the appropriate bytes in a byte stream - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_vendor_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed) -{ - u8 *buffer = *output_buffer; - u16 temp16 = 0; - u8 temp8 = 0; - u8 index; - - - /* - * Dereference the length to find if this is a large or small item. - */ - - if(linked_list->data.vendor_specific.length > 7) { - /* - * Large Item - */ - /* - * Set the descriptor field and length bytes - */ - *buffer = 0x84; - buffer += 1; - - temp16 = (u16) linked_list->data.vendor_specific.length; - - MOVE_UNALIGNED16_TO_16 (buffer, &temp16); - buffer += 2; - } - - else { - /* - * Small Item - */ - - /* - * Set the descriptor field - */ - temp8 = 0x70; - temp8 |= linked_list->data.vendor_specific.length; - - *buffer = temp8; - buffer += 1; - } - - /* - * Loop through all of the Vendor Specific fields - */ - for (index = 0; index < linked_list->data.vendor_specific.length; index++) { - temp8 = linked_list->data.vendor_specific.reserved[index]; - - *buffer = temp8; - buffer += 1; - } - - /* - * Return the number of bytes consumed in this operation - */ - *bytes_consumed = (u32) ((NATIVE_UINT) buffer - - (NATIVE_UINT) *output_buffer); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_start_dependent_functions_resource - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte - * stream - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes consumed from - * the Byte_stream_buffer - * Output_buffer - Pointer to the user's return buffer - * Structure_size - u32 pointer that is filled with - * the number of bytes in the filled - * in structure - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the resource byte stream and fill out the appropriate - * structure pointed to by the Output_buffer. Return the - * number of bytes consumed from the byte stream. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_start_dependent_functions_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size) -{ - u8 *buffer = byte_stream_buffer; - RESOURCE *output_struct = (RESOURCE *) * output_buffer; - u8 temp8 = 0; - u32 struct_size = - sizeof(START_DEPENDENT_FUNCTIONS_RESOURCE) + - RESOURCE_LENGTH_NO_DATA; - - - /* - * The number of bytes consumed are contained in the descriptor (Bits:0-1) - */ - temp8 = *buffer; - - *bytes_consumed = (temp8 & 0x01) + 1; - - output_struct->id = start_dependent_functions; - - /* - * Point to Byte 1 if it is used - */ - if (2 == *bytes_consumed) { - buffer += 1; - temp8 = *buffer; - - /* - * Check Compatibility priority - */ - output_struct->data.start_dependent_functions.compatibility_priority = - temp8 & 0x03; - - if (3 == output_struct->data.start_dependent_functions.compatibility_priority) { - return (AE_AML_ERROR); - } - - /* - * Check Performance/Robustness preference - */ - output_struct->data.start_dependent_functions.performance_robustness = - (temp8 >> 2) & 0x03; - - if (3 == output_struct->data.start_dependent_functions.performance_robustness) { - return (AE_AML_ERROR); - } - } - - else { - output_struct->data.start_dependent_functions.compatibility_priority = - ACCEPTABLE_CONFIGURATION; - - output_struct->data.start_dependent_functions.performance_robustness = - ACCEPTABLE_CONFIGURATION; - } - - /* - * Set the Length parameter - */ - output_struct->length = struct_size; - - /* - * Return the final size of the structure - */ - *structure_size = struct_size; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_end_dependent_functions_resource - * - * PARAMETERS: Byte_stream_buffer - Pointer to the resource input byte - * stream - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes consumed from - * the Byte_stream_buffer - * Output_buffer - Pointer to the user's return buffer - * Structure_size - u32 pointer that is filled with - * the number of bytes in the filled - * in structure - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the resource byte stream and fill out the appropriate - * structure pointed to by the Output_buffer. Return the - * number of bytes consumed from the byte stream. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_end_dependent_functions_resource ( - u8 *byte_stream_buffer, - u32 *bytes_consumed, - u8 **output_buffer, - u32 *structure_size) -{ - RESOURCE *output_struct = (RESOURCE *) * output_buffer; - u32 struct_size = RESOURCE_LENGTH; - - - /* - * The number of bytes consumed is static - */ - *bytes_consumed = 1; - - /* - * Fill out the structure - */ - output_struct->id = end_dependent_functions; - - /* - * Set the Length parameter - */ - output_struct->length = struct_size; - - /* - * Return the final size of the structure - */ - *structure_size = struct_size; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_start_dependent_functions_stream - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Output_buffer - Pointer to the user's return buffer - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes of the - * Output_buffer used - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the linked list resource structure and fills in the - * the appropriate bytes in a byte stream - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_start_dependent_functions_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed) -{ - u8 *buffer = *output_buffer; - u8 temp8 = 0; - - - /* - * The descriptor field is set based upon whether a byte is needed - * to contain Priority data. - */ - if (ACCEPTABLE_CONFIGURATION == - linked_list->data.start_dependent_functions.compatibility_priority && - ACCEPTABLE_CONFIGURATION == - linked_list->data.start_dependent_functions.performance_robustness) { - *buffer = 0x30; - } - else { - *buffer = 0x31; - buffer += 1; - - /* - * Set the Priority Byte Definition - */ - temp8 = 0; - temp8 = (u8) - ((linked_list->data.start_dependent_functions.performance_robustness & - 0x03) << 2); - temp8 |= - (linked_list->data.start_dependent_functions.compatibility_priority & - 0x03); - - *buffer = temp8; - } - - buffer += 1; - - /* - * Return the number of bytes consumed in this operation - */ - *bytes_consumed = (u32) ((NATIVE_UINT) buffer - - (NATIVE_UINT) *output_buffer); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_end_dependent_functions_stream - * - * PARAMETERS: Linked_list - Pointer to the resource linked list - * Output_buffer - Pointer to the user's return buffer - * Bytes_consumed - u32 pointer that is filled with - * the number of bytes of the - * Output_buffer used - * - * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code - * - * DESCRIPTION: Take the linked list resource structure and fills in the - * the appropriate bytes in a byte stream - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_end_dependent_functions_stream ( - RESOURCE *linked_list, - u8 **output_buffer, - u32 *bytes_consumed - ) -{ - u8 *buffer = *output_buffer; - - - /* - * The descriptor field is static - */ - *buffer = 0x38; - buffer += 1; - - /* - * Return the number of bytes consumed in this operation - */ - *bytes_consumed = (u32) ((NATIVE_UINT) buffer - - (NATIVE_UINT) *output_buffer); - - return (AE_OK); -} - diff --git a/reactos/drivers/bus/acpi/resource/rsutils.c b/reactos/drivers/bus/acpi/resource/rsutils.c deleted file mode 100644 index a71b856d32a..00000000000 --- a/reactos/drivers/bus/acpi/resource/rsutils.c +++ /dev/null @@ -1,384 +0,0 @@ -/******************************************************************************* - * - * Module Name: rsutils - Utilities for the resource manager - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_RESOURCES - MODULE_NAME ("rsutils") - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_get_prt_method_data - * - * PARAMETERS: Handle - a handle to the containing object - * Ret_buffer - a pointer to a buffer structure for the - * results - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: This function is called to get the _PRT value of an object - * contained in an object specified by the handle passed in - * - * If the function fails an appropriate status will be returned - * and the contents of the callers buffer is undefined. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_get_prt_method_data ( - ACPI_HANDLE handle, - ACPI_BUFFER *ret_buffer) -{ - ACPI_OPERAND_OBJECT *ret_obj; - ACPI_STATUS status; - u32 buffer_space_needed; - - - /* already validated params, so we won't repeat here */ - - buffer_space_needed = ret_buffer->length; - - /* - * Execute the method, no parameters - */ - status = acpi_ns_evaluate_relative (handle, "_PRT", NULL, &ret_obj); - if (ACPI_FAILURE (status)) { - return (status); - } - - if (!ret_obj) { - /* Return object is required */ - - return (AE_TYPE); - } - - - /* - * The return object will be a package, so check the - * parameters. If the return object is not a package, - * then the underlying AML code is corrupt or improperly - * written. - */ - if (ACPI_TYPE_PACKAGE != ret_obj->common.type) { - status = AE_AML_OPERAND_TYPE; - goto cleanup; - } - - /* - * Make the call to create a resource linked list from the - * byte stream buffer that comes back from the _CRS method - * execution. - */ - status = acpi_rs_create_pci_routing_table (ret_obj, - ret_buffer->pointer, - &buffer_space_needed); - - /* - * Tell the user how much of the buffer we have used or is needed - * and return the final status. - */ - ret_buffer->length = buffer_space_needed; - - - /* On exit, we must delete the object returned by evaluate_object */ - -cleanup: - - acpi_cm_remove_reference (ret_obj); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_get_crs_method_data - * - * PARAMETERS: Handle - a handle to the containing object - * Ret_buffer - a pointer to a buffer structure for the - * results - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: This function is called to get the _CRS value of an object - * contained in an object specified by the handle passed in - * - * If the function fails an appropriate status will be returned - * and the contents of the callers buffer is undefined. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_get_crs_method_data ( - ACPI_HANDLE handle, - ACPI_BUFFER *ret_buffer) -{ - ACPI_OPERAND_OBJECT *ret_obj; - ACPI_STATUS status; - u32 buffer_space_needed = ret_buffer->length; - - - /* already validated params, so we won't repeat here */ - - /* - * Execute the method, no parameters - */ - status = acpi_ns_evaluate_relative (handle, "_CRS", NULL, &ret_obj); - if (ACPI_FAILURE (status)) { - return (status); - } - - if (!ret_obj) { - /* Return object is required */ - - return (AE_TYPE); - } - - /* - * The return object will be a buffer, but check the - * parameters. If the return object is not a buffer, - * then the underlying AML code is corrupt or improperly - * written. - */ - if (ACPI_TYPE_BUFFER != ret_obj->common.type) { - status = AE_AML_OPERAND_TYPE; - goto cleanup; - } - - /* - * Make the call to create a resource linked list from the - * byte stream buffer that comes back from the _CRS method - * execution. - */ - status = acpi_rs_create_resource_list (ret_obj, - ret_buffer->pointer, - &buffer_space_needed); - - - - /* - * Tell the user how much of the buffer we have used or is needed - * and return the final status. - */ - ret_buffer->length = buffer_space_needed; - - - /* On exit, we must delete the object returned by evaluate_object */ - -cleanup: - - acpi_cm_remove_reference (ret_obj); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_get_prs_method_data - * - * PARAMETERS: Handle - a handle to the containing object - * Ret_buffer - a pointer to a buffer structure for the - * results - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: This function is called to get the _PRS value of an object - * contained in an object specified by the handle passed in - * - * If the function fails an appropriate status will be returned - * and the contents of the callers buffer is undefined. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_get_prs_method_data ( - ACPI_HANDLE handle, - ACPI_BUFFER *ret_buffer) -{ - ACPI_OPERAND_OBJECT *ret_obj; - ACPI_STATUS status; - u32 buffer_space_needed = ret_buffer->length; - - - /* already validated params, so we won't repeat here */ - - /* - * Execute the method, no parameters - */ - status = acpi_ns_evaluate_relative (handle, "_PRS", NULL, &ret_obj); - if (ACPI_FAILURE (status)) { - return (status); - } - - if (!ret_obj) { - /* Return object is required */ - - return (AE_TYPE); - } - - /* - * The return object will be a buffer, but check the - * parameters. If the return object is not a buffer, - * then the underlying AML code is corrupt or improperly - * written.. - */ - if (ACPI_TYPE_BUFFER != ret_obj->common.type) { - status = AE_AML_OPERAND_TYPE; - goto cleanup; - } - - /* - * Make the call to create a resource linked list from the - * byte stream buffer that comes back from the _CRS method - * execution. - */ - status = acpi_rs_create_resource_list (ret_obj, - ret_buffer->pointer, - &buffer_space_needed); - - /* - * Tell the user how much of the buffer we have used or is needed - * and return the final status. - */ - ret_buffer->length = buffer_space_needed; - - - /* On exit, we must delete the object returned by evaluate_object */ - -cleanup: - - acpi_cm_remove_reference (ret_obj); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_rs_set_srs_method_data - * - * PARAMETERS: Handle - a handle to the containing object - * In_buffer - a pointer to a buffer structure of the - * parameter - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: This function is called to set the _SRS of an object contained - * in an object specified by the handle passed in - * - * If the function fails an appropriate status will be returned - * and the contents of the callers buffer is undefined. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_rs_set_srs_method_data ( - ACPI_HANDLE handle, - ACPI_BUFFER *in_buffer) -{ - ACPI_OPERAND_OBJECT *params[2]; - ACPI_OPERAND_OBJECT param_obj; - ACPI_STATUS status; - u8 *byte_stream = NULL; - u32 buffer_size_needed = 0; - - - /* already validated params, so we won't repeat here */ - - /* - * The In_buffer parameter will point to a linked list of - * resource parameters. It needs to be formatted into a - * byte stream to be sent in as an input parameter. - */ - buffer_size_needed = 0; - - /* - * First call is to get the buffer size needed - */ - status = acpi_rs_create_byte_stream (in_buffer->pointer, - byte_stream, - &buffer_size_needed); - /* - * We expect a return of AE_BUFFER_OVERFLOW - * if not, exit with the error - */ - if (AE_BUFFER_OVERFLOW != status) { - return (status); - } - - /* - * Allocate the buffer needed - */ - byte_stream = acpi_cm_callocate(buffer_size_needed); - if (NULL == byte_stream) { - return (AE_NO_MEMORY); - } - - /* - * Now call to convert the linked list into a byte stream - */ - status = acpi_rs_create_byte_stream (in_buffer->pointer, - byte_stream, - &buffer_size_needed); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - /* - * Init the param object - */ - acpi_cm_init_static_object (¶m_obj); - - /* - * Method requires one parameter. Set it up - */ - params [0] = ¶m_obj; - params [1] = NULL; - - /* - * Set up the parameter object - */ - param_obj.common.type = ACPI_TYPE_BUFFER; - param_obj.buffer.length = buffer_size_needed; - param_obj.buffer.pointer = byte_stream; - - /* - * Execute the method, no return value - */ - status = acpi_ns_evaluate_relative (handle, "_SRS", params, NULL); - - /* - * Clean up and return the status from Acpi_ns_evaluate_relative - */ - -cleanup: - - acpi_cm_free (byte_stream); - return (status); -} - diff --git a/reactos/drivers/bus/acpi/resource/rsxface.c b/reactos/drivers/bus/acpi/resource/rsxface.c deleted file mode 100644 index b19536e9a3b..00000000000 --- a/reactos/drivers/bus/acpi/resource/rsxface.c +++ /dev/null @@ -1,218 +0,0 @@ -/******************************************************************************* - * - * Module Name: rsxface - Public interfaces to the ACPI subsystem - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_RESOURCES - MODULE_NAME ("rsxface") - - -/******************************************************************************* - * - * FUNCTION: Acpi_get_irq_routing_table - * - * PARAMETERS: Device_handle - a handle to the Bus device we are querying - * Ret_buffer - a pointer to a buffer to receive the - * current resources for the device - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: This function is called to get the IRQ routing table for a - * specific bus. The caller must first acquire a handle for the - * desired bus. The routine table is placed in the buffer pointed - * to by the Ret_buffer variable parameter. - * - * If the function fails an appropriate status will be returned - * and the value of Ret_buffer is undefined. - * - * This function attempts to execute the _PRT method contained in - * the object indicated by the passed Device_handle. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_irq_routing_table ( - ACPI_HANDLE device_handle, - ACPI_BUFFER *ret_buffer) -{ - ACPI_STATUS status; - - - /* - * Must have a valid handle and buffer, So we have to have a handle - * and a return buffer structure, and if there is a non-zero buffer length - * we also need a valid pointer in the buffer. If it's a zero buffer length, - * we'll be returning the needed buffer size, so keep going. - */ - if ((!device_handle) || - (!ret_buffer) || - ((!ret_buffer->pointer) && (ret_buffer->length))) { - return (AE_BAD_PARAMETER); - } - - status = acpi_rs_get_prt_method_data (device_handle, ret_buffer); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_get_current_resources - * - * PARAMETERS: Device_handle - a handle to the device object for the - * device we are querying - * Ret_buffer - a pointer to a buffer to receive the - * current resources for the device - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: This function is called to get the current resources for a - * specific device. The caller must first acquire a handle for - * the desired device. The resource data is placed in the buffer - * pointed to by the Ret_buffer variable parameter. - * - * If the function fails an appropriate status will be returned - * and the value of Ret_buffer is undefined. - * - * This function attempts to execute the _CRS method contained in - * the object indicated by the passed Device_handle. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_current_resources ( - ACPI_HANDLE device_handle, - ACPI_BUFFER *ret_buffer) -{ - ACPI_STATUS status; - - - /* - * Must have a valid handle and buffer, So we have to have a handle - * and a return buffer structure, and if there is a non-zero buffer length - * we also need a valid pointer in the buffer. If it's a zero buffer length, - * we'll be returning the needed buffer size, so keep going. - */ - if ((!device_handle) || - (!ret_buffer) || - ((ret_buffer->length) && (!ret_buffer->pointer))) { - return (AE_BAD_PARAMETER); - } - - status = acpi_rs_get_crs_method_data (device_handle, ret_buffer); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_get_possible_resources - * - * PARAMETERS: Device_handle - a handle to the device object for the - * device we are querying - * Ret_buffer - a pointer to a buffer to receive the - * resources for the device - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: This function is called to get a list of the possible resources - * for a specific device. The caller must first acquire a handle - * for the desired device. The resource data is placed in the - * buffer pointed to by the Ret_buffer variable. - * - * If the function fails an appropriate status will be returned - * and the value of Ret_buffer is undefined. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_possible_resources ( - ACPI_HANDLE device_handle, - ACPI_BUFFER *ret_buffer) -{ - ACPI_STATUS status; - - - /* - * Must have a valid handle and buffer, So we have to have a handle - * and a return buffer structure, and if there is a non-zero buffer length - * we also need a valid pointer in the buffer. If it's a zero buffer length, - * we'll be returning the needed buffer size, so keep going. - */ - if ((!device_handle) || - (!ret_buffer) || - ((ret_buffer->length) && (!ret_buffer->pointer))) { - return (AE_BAD_PARAMETER); - } - - status = acpi_rs_get_prs_method_data (device_handle, ret_buffer); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_set_current_resources - * - * PARAMETERS: Device_handle - a handle to the device object for the - * device we are changing the resources of - * In_buffer - a pointer to a buffer containing the - * resources to be set for the device - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: This function is called to set the current resources for a - * specific device. The caller must first acquire a handle for - * the desired device. The resource data is passed to the routine - * the buffer pointed to by the In_buffer variable. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_set_current_resources ( - ACPI_HANDLE device_handle, - ACPI_BUFFER *in_buffer) -{ - ACPI_STATUS status; - - - /* - * Must have a valid handle and buffer - */ - if ((!device_handle) || - (!in_buffer) || - (!in_buffer->pointer) || - (!in_buffer->length)) { - return (AE_BAD_PARAMETER); - } - - status = acpi_rs_set_srs_method_data (device_handle, in_buffer); - - return (status); -} diff --git a/reactos/drivers/bus/acpi/tables/tbconvrt.c b/reactos/drivers/bus/acpi/tables/tbconvrt.c deleted file mode 100644 index 77ece2ae07a..00000000000 --- a/reactos/drivers/bus/acpi/tables/tbconvrt.c +++ /dev/null @@ -1,547 +0,0 @@ -/****************************************************************************** - * - * Module Name: tbconvrt - ACPI Table conversion utilities - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_TABLES - MODULE_NAME ("tbconvrt") - - -/* - * Build a GAS structure from earlier ACPI table entries (V1.0 and 0.71 extensions) - * - * 1) Address space - * 2) Length in bytes -- convert to length in bits - * 3) Bit offset is zero - * 4) Reserved field is zero - * 5) Expand address to 64 bits - */ -#define ASL_BUILD_GAS_FROM_ENTRY(a,b,c,d) {a.address_space_id = (u8) d;\ - a.register_bit_width = (u8) MUL_8 (b);\ - a.register_bit_offset = 0;\ - a.reserved = 0;\ - ACPI_STORE_ADDRESS (a.address,c);} - - -/* ACPI V1.0 entries -- address space is always I/O */ - -#define ASL_BUILD_GAS_FROM_V1_ENTRY(a,b,c) ASL_BUILD_GAS_FROM_ENTRY(a,b,c,ADDRESS_SPACE_SYSTEM_IO) - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_convert_to_xsdt - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_convert_to_xsdt ( - ACPI_TABLE_DESC *table_info, - u32 *number_of_tables) { - u32 table_size; - u32 pointer_size; - u32 i; - XSDT_DESCRIPTOR *new_table; - - -#ifndef _IA64 - - if (acpi_gbl_RSDP->revision < 2) { - pointer_size = sizeof (u32); - } - - else -#endif - { - pointer_size = sizeof (UINT64); - } - - /* - * Determine the number of tables pointed to by the RSDT/XSDT. - * This is defined by the ACPI Specification to be the number of - * pointers contained within the RSDT/XSDT. The size of the pointers - * is architecture-dependent. - */ - - table_size = table_info->pointer->length; - *number_of_tables = (table_size - - sizeof (ACPI_TABLE_HEADER)) / pointer_size; - - /* Compute size of the converted XSDT */ - - table_size = (*number_of_tables * sizeof (UINT64)) + sizeof (ACPI_TABLE_HEADER); - - - /* Allocate an XSDT */ - - new_table = acpi_cm_callocate (table_size); - if (!new_table) { - return (AE_NO_MEMORY); - } - - /* Copy the header and set the length */ - - MEMCPY (new_table, table_info->pointer, sizeof (ACPI_TABLE_HEADER)); - new_table->header.length = table_size; - - /* Copy the table pointers */ - - for (i = 0; i < *number_of_tables; i++) { - if (acpi_gbl_RSDP->revision < 2) { -#ifdef _IA64 - new_table->table_offset_entry[i] = - ((RSDT_DESCRIPTOR_REV071 *) table_info->pointer)->table_offset_entry[i]; -#else - ACPI_STORE_ADDRESS (new_table->table_offset_entry[i], - ((RSDT_DESCRIPTOR_REV1 *) table_info->pointer)->table_offset_entry[i]); -#endif - } - else { - new_table->table_offset_entry[i] = - ((XSDT_DESCRIPTOR *) table_info->pointer)->table_offset_entry[i]; - } - } - - - /* Delete the original table (either mapped or in a buffer) */ - - acpi_tb_delete_single_table (table_info); - - - /* Point the table descriptor to the new table */ - - table_info->pointer = (ACPI_TABLE_HEADER *) new_table; - table_info->base_pointer = (ACPI_TABLE_HEADER *) new_table; - table_info->length = table_size; - table_info->allocation = ACPI_MEM_ALLOCATED; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_convert_table_fadt - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * Converts BIOS supplied 1.0 and 0.71 ACPI FADT to an intermediate - * ACPI 2.0 FADT. If the BIOS supplied a 2.0 FADT then it is simply - * copied to the intermediate FADT. The ACPI CA software uses this - * intermediate FADT. Thus a significant amount of special #ifdef - * type codeing is saved. This intermediate FADT will need to be - * freed at some point. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_convert_table_fadt (void) -{ - -#ifdef _IA64 - FADT_DESCRIPTOR_REV071 *FADT71; - u8 pm1_address_space; - u8 pm2_address_space; - u8 pm_timer_address_space; - u8 gpe0address_space; - u8 gpe1_address_space; -#else - FADT_DESCRIPTOR_REV1 *FADT1; -#endif - - FADT_DESCRIPTOR_REV2 *FADT2; - ACPI_TABLE_DESC *table_desc; - - - /* Acpi_gbl_FADT is valid */ - /* Allocate and zero the 2.0 buffer */ - - FADT2 = acpi_cm_callocate (sizeof (FADT_DESCRIPTOR_REV2)); - if (FADT2 == NULL) { - return (AE_NO_MEMORY); - } - - - /* The ACPI FADT revision number is FADT2_REVISION_ID=3 */ - /* So, if the current table revision is less than 3 it is type 1.0 or 0.71 */ - - if (acpi_gbl_FADT->header.revision >= FADT2_REVISION_ID) { - /* We have an ACPI 2.0 FADT but we must copy it to our local buffer */ - - *FADT2 = *((FADT_DESCRIPTOR_REV2*) acpi_gbl_FADT); - - } - - else { - -#ifdef _IA64 - /* - * For the 64-bit case only, a revision ID less than V2.0 means the - * tables are the 0.71 extensions - */ - - /* The BIOS stored FADT should agree with Revision 0.71 */ - - FADT71 = (FADT_DESCRIPTOR_REV071 *) acpi_gbl_FADT; - - /* Copy the table header*/ - - FADT2->header = FADT71->header; - - /* Copy the common fields */ - - FADT2->sci_int = FADT71->sci_int; - FADT2->acpi_enable = FADT71->acpi_enable; - FADT2->acpi_disable = FADT71->acpi_disable; - FADT2->S4_bios_req = FADT71->S4_bios_req; - FADT2->plvl2_lat = FADT71->plvl2_lat; - FADT2->plvl3_lat = FADT71->plvl3_lat; - FADT2->day_alrm = FADT71->day_alrm; - FADT2->mon_alrm = FADT71->mon_alrm; - FADT2->century = FADT71->century; - FADT2->gpe1_base = FADT71->gpe1_base; - - /* - * We still use the block length registers even though - * the GAS structure should obsolete them. This is because - * these registers are byte lengths versus the GAS which - * contains a bit width - */ - FADT2->pm1_evt_len = FADT71->pm1_evt_len; - FADT2->pm1_cnt_len = FADT71->pm1_cnt_len; - FADT2->pm2_cnt_len = FADT71->pm2_cnt_len; - FADT2->pm_tm_len = FADT71->pm_tm_len; - FADT2->gpe0blk_len = FADT71->gpe0blk_len; - FADT2->gpe1_blk_len = FADT71->gpe1_blk_len; - FADT2->gpe1_base = FADT71->gpe1_base; - - /* Copy the existing 0.71 flags to 2.0. The other bits are zero.*/ - - FADT2->wb_invd = FADT71->flush_cash; - FADT2->proc_c1 = FADT71->proc_c1; - FADT2->plvl2_up = FADT71->plvl2_up; - FADT2->pwr_button = FADT71->pwr_button; - FADT2->sleep_button = FADT71->sleep_button; - FADT2->fixed_rTC = FADT71->fixed_rTC; - FADT2->rtcs4 = FADT71->rtcs4; - FADT2->tmr_val_ext = FADT71->tmr_val_ext; - FADT2->dock_cap = FADT71->dock_cap; - - - /* We should not use these next two addresses */ - /* Since our buffer is pre-zeroed nothing to do for */ - /* the next three data items in the structure */ - /* FADT2->Firmware_ctrl = 0; */ - /* FADT2->Dsdt = 0; */ - - /* System Interrupt Model isn't used in ACPI 2.0*/ - /* FADT2->Reserved1 = 0; */ - - /* This field is set by the OEM to convey the preferred */ - /* power management profile to OSPM. It doesn't have any*/ - /* 0.71 equivalence. Since we don't know what kind of */ - /* 64-bit system this is, we will pick unspecified. */ - - FADT2->prefer_PM_profile = PM_UNSPECIFIED; - - - /* Port address of SMI command port */ - /* We shouldn't use this port because IA64 doesn't */ - /* have or use SMI. It has PMI. */ - - FADT2->smi_cmd = (u32)(FADT71->smi_cmd & 0xFFFFFFFF); - - - /* processor performance state control*/ - /* The value OSPM writes to the SMI_CMD register to assume */ - /* processor performance state control responsibility. */ - /* There isn't any equivalence in 0.71 */ - /* Again this should be meaningless for IA64 */ - /* FADT2->Pstate_cnt = 0; */ - - /* The 32-bit Power management and GPE registers are */ - /* not valid in IA-64 and we are not going to use them */ - /* so leaving them pre-zeroed. */ - - /* Support for the _CST object and C States change notification.*/ - /* This data item hasn't any 0.71 equivalence so leaving it zero.*/ - /* FADT2->Cst_cnt = 0; */ - - /* number of flush strides that need to be read */ - /* No 0.71 equivalence. Leave pre-zeroed. */ - /* FADT2->Flush_size = 0; */ - - /* Processor's memory cache line width, in bytes */ - /* No 0.71 equivalence. Leave pre-zeroed. */ - /* FADT2->Flush_stride = 0; */ - - /* Processor's duty cycle index in processor's P_CNT reg*/ - /* No 0.71 equivalence. Leave pre-zeroed. */ - /* FADT2->Duty_offset = 0; */ - - /* Processor's duty cycle value bit width in P_CNT register.*/ - /* No 0.71 equivalence. Leave pre-zeroed. */ - /* FADT2->Duty_width = 0; */ - - - /* Since there isn't any equivalence in 0.71 */ - /* and since Big_sur had to support legacy */ - - FADT2->iapc_boot_arch = BAF_LEGACY_DEVICES; - - /* Copy to ACPI 2.0 64-BIT Extended Addresses */ - - FADT2->Xfirmware_ctrl = FADT71->firmware_ctrl; - FADT2->Xdsdt = FADT71->dsdt; - - - /* Extract the address space IDs */ - - pm1_address_space = (u8)((FADT71->address_space & PM1_BLK_ADDRESS_SPACE) >> 1); - pm2_address_space = (u8)((FADT71->address_space & PM2_CNT_BLK_ADDRESS_SPACE) >> 2); - pm_timer_address_space = (u8)((FADT71->address_space & PM_TMR_BLK_ADDRESS_SPACE) >> 3); - gpe0address_space = (u8)((FADT71->address_space & GPE0_BLK_ADDRESS_SPACE) >> 4); - gpe1_address_space = (u8)((FADT71->address_space & GPE1_BLK_ADDRESS_SPACE) >> 5); - - /* - * Convert the 0.71 (non-GAS style) Block addresses to V2.0 GAS structures, - * in this order: - * - * PM 1_a Events - * PM 1_b Events - * PM 1_a Control - * PM 1_b Control - * PM 2 Control - * PM Timer Control - * GPE Block 0 - * GPE Block 1 - */ - - ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xpm1a_evt_blk, FADT71->pm1_evt_len, FADT71->pm1a_evt_blk, pm1_address_space); - ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xpm1b_evt_blk, FADT71->pm1_evt_len, FADT71->pm1b_evt_blk, pm1_address_space); - ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xpm1a_cnt_blk, FADT71->pm1_cnt_len, FADT71->pm1a_cnt_blk, pm1_address_space); - ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xpm1b_cnt_blk, FADT71->pm1_cnt_len, FADT71->pm1b_cnt_blk, pm1_address_space); - ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xpm2_cnt_blk, FADT71->pm2_cnt_len, FADT71->pm2_cnt_blk, pm2_address_space); - ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xpm_tmr_blk, FADT71->pm_tm_len, FADT71->pm_tmr_blk, pm_timer_address_space); - ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xgpe0blk, FADT71->gpe0blk_len, FADT71->gpe0blk, gpe0address_space); - ASL_BUILD_GAS_FROM_ENTRY (FADT2->Xgpe1_blk, FADT71->gpe1_blk_len, FADT71->gpe1_blk, gpe1_address_space); - -#else - - /* ACPI 1.0 FACS */ - - - /* The BIOS stored FADT should agree with Revision 1.0 */ - - FADT1 = (FADT_DESCRIPTOR_REV1*) acpi_gbl_FADT; - - /* - * Copy the table header and the common part of the tables - * The 2.0 table is an extension of the 1.0 table, so the - * entire 1.0 table can be copied first, then expand some - * fields to 64 bits. - */ - - MEMCPY (FADT2, FADT1, sizeof (FADT_DESCRIPTOR_REV1)); - - - /* Convert table pointers to 64-bit fields */ - - ACPI_STORE_ADDRESS (FADT2->Xfirmware_ctrl, FADT1->firmware_ctrl); - ACPI_STORE_ADDRESS (FADT2->Xdsdt, FADT1->dsdt); - - /* System Interrupt Model isn't used in ACPI 2.0*/ - /* FADT2->Reserved1 = 0; */ - - /* This field is set by the OEM to convey the preferred */ - /* power management profile to OSPM. It doesn't have any*/ - /* 1.0 equivalence. Since we don't know what kind of */ - /* 32-bit system this is, we will pick unspecified. */ - - FADT2->prefer_PM_profile = PM_UNSPECIFIED; - - - /* Processor Performance State Control. This is the value */ - /* OSPM writes to the SMI_CMD register to assume processor */ - /* performance state control responsibility. There isn't */ - /* any equivalence in 1.0. So leave it zeroed. */ - - FADT2->pstate_cnt = 0; - - - /* Support for the _CST object and C States change notification.*/ - /* This data item hasn't any 1.0 equivalence so leaving it zero.*/ - - FADT2->cst_cnt = 0; - - - /* Since there isn't any equivalence in 1.0 and since it */ - /* is highly likely that a 1.0 system has legacy support. */ - - FADT2->iapc_boot_arch = BAF_LEGACY_DEVICES; - - - /* - * Convert the V1.0 Block addresses to V2.0 GAS structures - * in this order: - * - * PM 1_a Events - * PM 1_b Events - * PM 1_a Control - * PM 1_b Control - * PM 2 Control - * PM Timer Control - * GPE Block 0 - * GPE Block 1 - */ - - ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xpm1a_evt_blk, FADT1->pm1_evt_len, FADT1->pm1a_evt_blk); - ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xpm1b_evt_blk, FADT1->pm1_evt_len, FADT1->pm1b_evt_blk); - ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xpm1a_cnt_blk, FADT1->pm1_cnt_len, FADT1->pm1a_cnt_blk); - ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xpm1b_cnt_blk, FADT1->pm1_cnt_len, FADT1->pm1b_cnt_blk); - ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xpm2_cnt_blk, FADT1->pm2_cnt_len, FADT1->pm2_cnt_blk); - ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xpm_tmr_blk, FADT1->pm_tm_len, FADT1->pm_tmr_blk); - ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xgpe0blk, FADT1->gpe0blk_len, FADT1->gpe0blk); - ASL_BUILD_GAS_FROM_V1_ENTRY (FADT2->Xgpe1_blk, FADT1->gpe1_blk_len, FADT1->gpe1_blk); -#endif - } - - - /* - * Global FADT pointer will point to the common V2.0 FADT - */ - acpi_gbl_FADT = FADT2; - acpi_gbl_FADT->header.length = sizeof (FADT_DESCRIPTOR); - - - /* Free the original table */ - - table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_FADT]; - acpi_tb_delete_single_table (table_desc); - - - /* Install the new table */ - - table_desc->pointer = (ACPI_TABLE_HEADER *) acpi_gbl_FADT; - table_desc->base_pointer = acpi_gbl_FADT; - table_desc->allocation = ACPI_MEM_ALLOCATED; - table_desc->length = sizeof (FADT_DESCRIPTOR_REV2); - - - /* Dump the entire FADT */ - - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_convert_table_facs - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_build_common_facs ( - ACPI_TABLE_DESC *table_info) -{ - ACPI_COMMON_FACS *common_facs; - -#ifdef _IA64 - FACS_DESCRIPTOR_REV071 *FACS71; -#else - FACS_DESCRIPTOR_REV1 *FACS1; -#endif - - FACS_DESCRIPTOR_REV2 *FACS2; - - - /* Allocate a common FACS */ - - common_facs = acpi_cm_callocate (sizeof (ACPI_COMMON_FACS)); - if (!common_facs) { - return (AE_NO_MEMORY); - } - - - /* Copy fields to the new FACS */ - - if (acpi_gbl_RSDP->revision < 2) { -#ifdef _IA64 - /* 0.71 FACS */ - - FACS71 = (FACS_DESCRIPTOR_REV071 *) acpi_gbl_FACS; - - common_facs->global_lock = (u32 *) &(FACS71->global_lock); - common_facs->firmware_waking_vector = &FACS71->firmware_waking_vector; - common_facs->vector_width = 64; -#else - /* ACPI 1.0 FACS */ - - FACS1 = (FACS_DESCRIPTOR_REV1 *) acpi_gbl_FACS; - - common_facs->global_lock = &(FACS1->global_lock); - common_facs->firmware_waking_vector = (UINT64 *) &FACS1->firmware_waking_vector; - common_facs->vector_width = 32; - -#endif - } - - else { - /* ACPI 2.0 FACS */ - - FACS2 = (FACS_DESCRIPTOR_REV2 *) acpi_gbl_FACS; - - common_facs->global_lock = &(FACS2->global_lock); - common_facs->firmware_waking_vector = &FACS2->Xfirmware_waking_vector; - common_facs->vector_width = 64; - } - - - /* Set the global FACS pointer to point to the common FACS */ - - - acpi_gbl_FACS = common_facs; - - return (AE_OK); -} - - diff --git a/reactos/drivers/bus/acpi/tables/tbget.c b/reactos/drivers/bus/acpi/tables/tbget.c deleted file mode 100644 index e16db9d26b3..00000000000 --- a/reactos/drivers/bus/acpi/tables/tbget.c +++ /dev/null @@ -1,608 +0,0 @@ -/****************************************************************************** - * - * Module Name: tbget - ACPI Table get* routines - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_TABLES - MODULE_NAME ("tbget") - -#define RSDP_CHECKSUM_LENGTH 20 - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_get_table_ptr - * - * PARAMETERS: Table_type - one of the defined table types - * Instance - Which table of this type - * Table_ptr_loc - pointer to location to place the pointer for - * return - * - * RETURN: Status - * - * DESCRIPTION: This function is called to get the pointer to an ACPI table. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_get_table_ptr ( - ACPI_TABLE_TYPE table_type, - u32 instance, - ACPI_TABLE_HEADER **table_ptr_loc) -{ - ACPI_TABLE_DESC *table_desc; - u32 i; - - - if (!acpi_gbl_DSDT) { - return (AE_NO_ACPI_TABLES); - } - - if (table_type > ACPI_TABLE_MAX) { - return (AE_BAD_PARAMETER); - } - - - /* - * For all table types (Single/Multiple), the first - * instance is always in the list head. - */ - - if (instance == 1) { - /* - * Just pluck the pointer out of the global table! - * Will be null if no table is present - */ - - *table_ptr_loc = acpi_gbl_acpi_tables[table_type].pointer; - return (AE_OK); - } - - - /* - * Check for instance out of range - */ - if (instance > acpi_gbl_acpi_tables[table_type].count) { - return (AE_NOT_EXIST); - } - - /* Walk the list to get the desired table - * Since the if (Instance == 1) check above checked for the - * first table, setting Table_desc equal to the .Next member - * is actually pointing to the second table. Therefore, we - * need to walk from the 2nd table until we reach the Instance - * that the user is looking for and return its table pointer. - */ - table_desc = acpi_gbl_acpi_tables[table_type].next; - for (i = 2; i < instance; i++) { - table_desc = table_desc->next; - } - - /* We are now pointing to the requested table's descriptor */ - - *table_ptr_loc = table_desc->pointer; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_get_table - * - * PARAMETERS: Physical_address - Physical address of table to retrieve - * *Buffer_ptr - If Buffer_ptr is valid, read data from - * buffer rather than searching memory - * *Table_info - Where the table info is returned - * - * RETURN: Status - * - * DESCRIPTION: Maps the physical address of table into a logical address - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_get_table ( - ACPI_PHYSICAL_ADDRESS physical_address, - ACPI_TABLE_HEADER *buffer_ptr, - ACPI_TABLE_DESC *table_info) -{ - ACPI_TABLE_HEADER *table_header = NULL; - ACPI_TABLE_HEADER *full_table = NULL; - u32 size; - u8 allocation; - ACPI_STATUS status = AE_OK; - - - if (!table_info) { - return (AE_BAD_PARAMETER); - } - - - if (buffer_ptr) { - /* - * Getting data from a buffer, not BIOS tables - */ - - table_header = buffer_ptr; - status = acpi_tb_validate_table_header (table_header); - if (ACPI_FAILURE (status)) { - /* Table failed verification, map all errors to BAD_DATA */ - - return (AE_BAD_DATA); - } - - /* Allocate buffer for the entire table */ - - full_table = acpi_cm_allocate (table_header->length); - if (!full_table) { - return (AE_NO_MEMORY); - } - - /* Copy the entire table (including header) to the local buffer */ - - size = table_header->length; - MEMCPY (full_table, buffer_ptr, size); - - /* Save allocation type */ - - allocation = ACPI_MEM_ALLOCATED; - } - - - /* - * Not reading from a buffer, just map the table's physical memory - * into our address space. - */ - else { - size = SIZE_IN_HEADER; - - status = acpi_tb_map_acpi_table (physical_address, &size, - (void **) &full_table); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Save allocation type */ - - allocation = ACPI_MEM_MAPPED; - } - - - /* Return values */ - - table_info->pointer = full_table; - table_info->length = size; - table_info->allocation = allocation; - table_info->base_pointer = full_table; - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_get_all_tables - * - * PARAMETERS: Number_of_tables - Number of tables to get - * Table_ptr - Input buffer pointer, optional - * - * RETURN: Status - * - * DESCRIPTION: Load and validate all tables other than the RSDT. The RSDT must - * already be loaded and validated. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_get_all_tables ( - u32 number_of_tables, - ACPI_TABLE_HEADER *table_ptr) -{ - ACPI_STATUS status = AE_OK; - u32 index; - ACPI_TABLE_DESC table_info; - - - /* - * Loop through all table pointers found in RSDT. - * This will NOT include the FACS and DSDT - we must get - * them after the loop - */ - - for (index = 0; index < number_of_tables; index++) { - /* Clear the Table_info each time */ - - MEMSET (&table_info, 0, sizeof (ACPI_TABLE_DESC)); - - /* Get the table via the XSDT */ - - status = acpi_tb_get_table ((ACPI_PHYSICAL_ADDRESS) - ACPI_GET_ADDRESS (acpi_gbl_XSDT->table_offset_entry[index]), - table_ptr, &table_info); - - /* Ignore a table that failed verification */ - - if (status == AE_BAD_DATA) { - continue; - } - - /* However, abort on serious errors */ - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Recognize and install the table */ - - status = acpi_tb_install_table (table_ptr, &table_info); - if (ACPI_FAILURE (status)) { - /* - * Unrecognized or unsupported table, delete it and ignore the - * error. Just get as many tables as we can, later we will - * determine if there are enough tables to continue. - */ - - acpi_tb_uninstall_table (&table_info); - } - } - - - /* - * Convert the FADT to a common format. This allows earlier revisions of the - * table to coexist with newer versions, using common access code. - */ - status = acpi_tb_convert_table_fadt (); - if (ACPI_FAILURE (status)) { - return (status); - } - - - /* - * Get the minimum set of ACPI tables, namely: - * - * 1) FADT (via RSDT in loop above) - * 2) FACS - * 3) DSDT - * - */ - - - /* - * Get the FACS (must have the FADT first, from loop above) - * Acpi_tb_get_table_facs will fail if FADT pointer is not valid - */ - - status = acpi_tb_get_table_facs (table_ptr, &table_info); - if (ACPI_FAILURE (status)) { - return (status); - } - - - /* Install the FACS */ - - status = acpi_tb_install_table (table_ptr, &table_info); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * Create the common FACS pointer table - * (Contains pointers to the original table) - */ - - status = acpi_tb_build_common_facs (&table_info); - if (ACPI_FAILURE (status)) { - return (status); - } - - - /* - * Get the DSDT (We know that the FADT is valid now) - */ - - status = acpi_tb_get_table ((ACPI_PHYSICAL_ADDRESS) ACPI_GET_ADDRESS (acpi_gbl_FADT->Xdsdt), - table_ptr, &table_info); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Install the DSDT */ - - status = acpi_tb_install_table (table_ptr, &table_info); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Dump the DSDT Header */ - - /* Dump the entire DSDT */ - - /* - * Initialize the capabilities flags. - * Assumes that platform supports ACPI_MODE since we have tables! - */ - acpi_gbl_system_flags |= acpi_hw_get_mode_capabilities (); - - - /* Always delete the RSDP mapping, we are done with it */ - - acpi_tb_delete_acpi_table (ACPI_TABLE_RSDP); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_verify_rsdp - * - * PARAMETERS: Number_of_tables - Where the table count is placed - * - * RETURN: Status - * - * DESCRIPTION: Load and validate the RSDP (ptr) and RSDT (table) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_verify_rsdp ( - ACPI_PHYSICAL_ADDRESS rsdp_physical_address) -{ - ACPI_TABLE_DESC table_info; - ACPI_STATUS status; - u8 *table_ptr; - - - /* - * Obtain access to the RSDP structure - */ - status = acpi_os_map_memory (rsdp_physical_address, - sizeof (RSDP_DESCRIPTOR), - (void **) &table_ptr); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * The signature and checksum must both be correct - */ - if (STRNCMP ((NATIVE_CHAR *) table_ptr, RSDP_SIG, sizeof (RSDP_SIG)-1) != 0) { - /* Nope, BAD Signature */ - - status = AE_BAD_SIGNATURE; - goto cleanup; - } - - if (acpi_tb_checksum (table_ptr, RSDP_CHECKSUM_LENGTH) != 0) { - /* Nope, BAD Checksum */ - - status = AE_BAD_CHECKSUM; - goto cleanup; - } - - /* TBD: Check extended checksum if table version >= 2 */ - - /* The RSDP supplied is OK */ - - table_info.pointer = (ACPI_TABLE_HEADER *) table_ptr; - table_info.length = sizeof (RSDP_DESCRIPTOR); - table_info.allocation = ACPI_MEM_MAPPED; - table_info.base_pointer = table_ptr; - - /* Save the table pointers and allocation info */ - - status = acpi_tb_init_table_descriptor (ACPI_TABLE_RSDP, &table_info); - if (ACPI_FAILURE (status)) { - goto cleanup; - } - - - /* Save the RSDP in a global for easy access */ - - acpi_gbl_RSDP = (RSDP_DESCRIPTOR *) table_info.pointer; - return (status); - - - /* Error exit */ -cleanup: - - acpi_os_unmap_memory (table_ptr, sizeof (RSDP_DESCRIPTOR)); - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_get_table_rsdt - * - * PARAMETERS: Number_of_tables - Where the table count is placed - * - * RETURN: Status - * - * DESCRIPTION: Load and validate the RSDP (ptr) and RSDT (table) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_get_table_rsdt ( - u32 *number_of_tables) -{ - ACPI_TABLE_DESC table_info; - ACPI_STATUS status = AE_OK; - ACPI_PHYSICAL_ADDRESS physical_address; - u32 signature_length; - char *table_signature; - - - /* - * Get the RSDT from the RSDP - */ - - /* - * For RSDP revision 0 or 1, we use the RSDT. - * For RSDP revision 2 (and above), we use the XSDT - */ - if (acpi_gbl_RSDP->revision < 2) { -#ifdef _IA64 - /* 0.71 RSDP has 64bit Rsdt address field */ - physical_address = ((RSDP_DESCRIPTOR_REV071 *)acpi_gbl_RSDP)->rsdt_physical_address; -#else - physical_address = (ACPI_PHYSICAL_ADDRESS) acpi_gbl_RSDP->rsdt_physical_address; -#endif - table_signature = RSDT_SIG; - signature_length = sizeof (RSDT_SIG) -1; - } - else { - physical_address = (ACPI_PHYSICAL_ADDRESS) - ACPI_GET_ADDRESS (acpi_gbl_RSDP->xsdt_physical_address); - table_signature = XSDT_SIG; - signature_length = sizeof (XSDT_SIG) -1; - } - - - /* Get the RSDT/XSDT */ - - status = acpi_tb_get_table (physical_address, NULL, &table_info); - if (ACPI_FAILURE (status)) { - return (status); - } - - - /* Check the RSDT or XSDT signature */ - - if (STRNCMP ((char *) table_info.pointer, table_signature, - signature_length)) { - /* Invalid RSDT or XSDT signature */ - - REPORT_ERROR (("Invalid signature where RSDP indicates %s should be located\n", - table_signature)); - - return (AE_NO_ACPI_TABLES); - } - - - /* Valid RSDT signature, verify the checksum */ - - status = acpi_tb_verify_table_checksum (table_info.pointer); - - - /* Convert and/or copy to an XSDT structure */ - - status = acpi_tb_convert_to_xsdt (&table_info, number_of_tables); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Save the table pointers and allocation info */ - - status = acpi_tb_init_table_descriptor (ACPI_TABLE_XSDT, &table_info); - if (ACPI_FAILURE (status)) { - return (status); - } - - acpi_gbl_XSDT = (XSDT_DESCRIPTOR *) table_info.pointer; - - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_tb_get_table_facs - * - * PARAMETERS: *Buffer_ptr - If Buffer_ptr is valid, read data from - * buffer rather than searching memory - * *Table_info - Where the table info is returned - * - * RETURN: Status - * - * DESCRIPTION: Returns a pointer to the FACS as defined in FADT. This - * function assumes the global variable FADT has been - * correctly initialized. The value of FADT->Firmware_ctrl - * into a far pointer which is returned. - * - *****************************************************************************/ - -ACPI_STATUS -acpi_tb_get_table_facs ( - ACPI_TABLE_HEADER *buffer_ptr, - ACPI_TABLE_DESC *table_info) -{ - void *table_ptr = NULL; - u32 size; - u8 allocation; - ACPI_STATUS status = AE_OK; - - - /* Must have a valid FADT pointer */ - - if (!acpi_gbl_FADT) { - return (AE_NO_ACPI_TABLES); - } - - size = sizeof (FACS_DESCRIPTOR); - if (buffer_ptr) { - /* - * Getting table from a file -- allocate a buffer and - * read the table. - */ - table_ptr = acpi_cm_allocate (size); - if(!table_ptr) { - return (AE_NO_MEMORY); - } - - MEMCPY (table_ptr, buffer_ptr, size); - - /* Save allocation type */ - - allocation = ACPI_MEM_ALLOCATED; - } - - else { - /* Just map the physical memory to our address space */ - - status = acpi_tb_map_acpi_table ((ACPI_PHYSICAL_ADDRESS) ACPI_GET_ADDRESS (acpi_gbl_FADT->Xfirmware_ctrl), - &size, &table_ptr); - if (ACPI_FAILURE(status)) { - return (status); - } - - /* Save allocation type */ - - allocation = ACPI_MEM_MAPPED; - } - - - /* Return values */ - - table_info->pointer = table_ptr; - table_info->length = size; - table_info->allocation = allocation; - table_info->base_pointer = table_ptr; - - return (status); -} - diff --git a/reactos/drivers/bus/acpi/tables/tbinstal.c b/reactos/drivers/bus/acpi/tables/tbinstal.c deleted file mode 100644 index 91c176f81a8..00000000000 --- a/reactos/drivers/bus/acpi/tables/tbinstal.c +++ /dev/null @@ -1,531 +0,0 @@ -/****************************************************************************** - * - * Module Name: tbinstal - ACPI table installation and removal - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_TABLES - MODULE_NAME ("tbinstal") - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_install_table - * - * PARAMETERS: Table_ptr - Input buffer pointer, optional - * Table_info - Return value from Acpi_tb_get_table - * - * RETURN: Status - * - * DESCRIPTION: Load and validate all tables other than the RSDT. The RSDT must - * already be loaded and validated. - * Install the table into the global data structs. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_install_table ( - ACPI_TABLE_HEADER *table_ptr, - ACPI_TABLE_DESC *table_info) -{ - ACPI_STATUS status; - - - /* - * Check the table signature and make sure it is recognized - * Also checks the header checksum - */ - - status = acpi_tb_recognize_table (table_ptr, table_info); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Lock tables while installing */ - - acpi_cm_acquire_mutex (ACPI_MTX_TABLES); - - /* Install the table into the global data structure */ - - status = acpi_tb_init_table_descriptor (table_info->type, table_info); - - acpi_cm_release_mutex (ACPI_MTX_TABLES); - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_recognize_table - * - * PARAMETERS: Table_ptr - Input buffer pointer, optional - * Table_info - Return value from Acpi_tb_get_table - * - * RETURN: Status - * - * DESCRIPTION: Check a table signature for a match against known table types - * - * NOTE: All table pointers are validated as follows: - * 1) Table pointer must point to valid physical memory - * 2) Signature must be 4 ASCII chars, even if we don't recognize the - * name - * 3) Table must be readable for length specified in the header - * 4) Table checksum must be valid (with the exception of the FACS - * which has no checksum for some odd reason) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_recognize_table ( - ACPI_TABLE_HEADER *table_ptr, - ACPI_TABLE_DESC *table_info) -{ - ACPI_TABLE_HEADER *table_header; - ACPI_STATUS status; - ACPI_TABLE_TYPE table_type = 0; - u32 i; - - - /* Ensure that we have a valid table pointer */ - - table_header = (ACPI_TABLE_HEADER *) table_info->pointer; - if (!table_header) { - return (AE_BAD_PARAMETER); - } - - /* - * Search for a signature match among the known table types - * Start at index one -> Skip the RSDP - */ - - status = AE_SUPPORT; - for (i = 1; i < NUM_ACPI_TABLES; i++) { - if (!STRNCMP (table_header->signature, - acpi_gbl_acpi_table_data[i].signature, - acpi_gbl_acpi_table_data[i].sig_length)) { - /* - * Found a signature match, get the pertinent info from the - * Table_data structure - */ - - table_type = i; - status = acpi_gbl_acpi_table_data[i].status; - - break; - } - } - - /* Return the table type and length via the info struct */ - - table_info->type = (u8) table_type; - table_info->length = table_header->length; - - - /* - * Validate checksum for _most_ tables, - * even the ones whose signature we don't recognize - */ - - if (table_type != ACPI_TABLE_FACS) { - /* But don't abort if the checksum is wrong */ - /* TBD: [Future] make this a configuration option? */ - - acpi_tb_verify_table_checksum (table_header); - } - - /* - * An AE_SUPPORT means that the table was not recognized. - * We basically ignore this; just print a debug message - */ - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_init_table_descriptor - * - * PARAMETERS: Table_type - The type of the table - * Table_info - A table info struct - * - * RETURN: None. - * - * DESCRIPTION: Install a table into the global data structs. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_init_table_descriptor ( - ACPI_TABLE_TYPE table_type, - ACPI_TABLE_DESC *table_info) -{ - ACPI_TABLE_DESC *list_head; - ACPI_TABLE_DESC *table_desc; - - - /* - * Install the table into the global data structure - */ - - list_head = &acpi_gbl_acpi_tables[table_type]; - table_desc = list_head; - - - /* - * Two major types of tables: 1) Only one instance is allowed. This - * includes most ACPI tables such as the DSDT. 2) Multiple instances of - * the table are allowed. This includes SSDT and PSDTs. - */ - - if (IS_SINGLE_TABLE (acpi_gbl_acpi_table_data[table_type].flags)) { - /* - * Only one table allowed, and a table has alread been installed - * at this location, so return an error. - */ - - if (list_head->pointer) { - return (AE_EXIST); - } - - table_desc->count = 1; - } - - - else { - /* - * Multiple tables allowed for this table type, we must link - * the new table in to the list of tables of this type. - */ - - if (list_head->pointer) { - table_desc = acpi_cm_callocate (sizeof (ACPI_TABLE_DESC)); - if (!table_desc) { - return (AE_NO_MEMORY); - } - - list_head->count++; - - /* Update the original previous */ - - list_head->prev->next = table_desc; - - /* Update new entry */ - - table_desc->prev = list_head->prev; - table_desc->next = list_head; - - /* Update list head */ - - list_head->prev = table_desc; - } - - else { - table_desc->count = 1; - } - } - - - /* Common initialization of the table descriptor */ - - table_desc->pointer = table_info->pointer; - table_desc->base_pointer = table_info->base_pointer; - table_desc->length = table_info->length; - table_desc->allocation = table_info->allocation; - table_desc->aml_pointer = (u8 *) (table_desc->pointer + 1), - table_desc->aml_length = (u32) (table_desc->length - - (u32) sizeof (ACPI_TABLE_HEADER)); - table_desc->table_id = acpi_cm_allocate_owner_id (OWNER_TYPE_TABLE); - table_desc->loaded_into_namespace = FALSE; - - /* - * Set the appropriate global pointer (if there is one) to point to the - * newly installed table - */ - - if (acpi_gbl_acpi_table_data[table_type].global_ptr) { - *(acpi_gbl_acpi_table_data[table_type].global_ptr) = table_info->pointer; - } - - - /* Return Data */ - - table_info->table_id = table_desc->table_id; - table_info->installed_desc = table_desc; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_delete_acpi_tables - * - * PARAMETERS: None. - * - * RETURN: None. - * - * DESCRIPTION: Delete all internal ACPI tables - * - ******************************************************************************/ - -void -acpi_tb_delete_acpi_tables (void) -{ - ACPI_TABLE_TYPE type; - - - /* - * Free memory allocated for ACPI tables - * Memory can either be mapped or allocated - */ - - for (type = 0; type < NUM_ACPI_TABLES; type++) { - acpi_tb_delete_acpi_table (type); - } - -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_delete_acpi_table - * - * PARAMETERS: Type - The table type to be deleted - * - * RETURN: None. - * - * DESCRIPTION: Delete an internal ACPI table - * Locks the ACPI table mutex - * - ******************************************************************************/ - -void -acpi_tb_delete_acpi_table ( - ACPI_TABLE_TYPE type) -{ - - if (type > ACPI_TABLE_MAX) { - return; - } - - - acpi_cm_acquire_mutex (ACPI_MTX_TABLES); - - /* Free the table */ - - acpi_tb_free_acpi_tables_of_type (&acpi_gbl_acpi_tables[type]); - - - /* Clear the appropriate "typed" global table pointer */ - - switch (type) { - case ACPI_TABLE_RSDP: - acpi_gbl_RSDP = NULL; - break; - - case ACPI_TABLE_DSDT: - acpi_gbl_DSDT = NULL; - break; - - case ACPI_TABLE_FADT: - acpi_gbl_FADT = NULL; - break; - - case ACPI_TABLE_FACS: - acpi_gbl_FACS = NULL; - break; - - case ACPI_TABLE_XSDT: - acpi_gbl_XSDT = NULL; - break; - - case ACPI_TABLE_SSDT: - case ACPI_TABLE_PSDT: - default: - break; - } - - acpi_cm_release_mutex (ACPI_MTX_TABLES); - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_free_acpi_tables_of_type - * - * PARAMETERS: Table_info - A table info struct - * - * RETURN: None. - * - * DESCRIPTION: Free the memory associated with an internal ACPI table - * Table mutex should be locked. - * - ******************************************************************************/ - -void -acpi_tb_free_acpi_tables_of_type ( - ACPI_TABLE_DESC *list_head) -{ - ACPI_TABLE_DESC *table_desc; - u32 count; - u32 i; - - - /* Get the head of the list */ - - table_desc = list_head; - count = list_head->count; - - /* - * Walk the entire list, deleting both the allocated tables - * and the table descriptors - */ - - for (i = 0; i < count; i++) { - table_desc = acpi_tb_uninstall_table (table_desc); - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_delete_single_table - * - * PARAMETERS: Table_info - A table info struct - * - * RETURN: None. - * - * DESCRIPTION: Low-level free for a single ACPI table. Handles cases where - * the table was allocated a buffer or was mapped. - * - ******************************************************************************/ - -void -acpi_tb_delete_single_table ( - ACPI_TABLE_DESC *table_desc) -{ - - if (!table_desc) { - return; - } - - if (table_desc->pointer) { - /* Valid table, determine type of memory allocation */ - - switch (table_desc->allocation) { - - case ACPI_MEM_NOT_ALLOCATED: - break; - - - case ACPI_MEM_ALLOCATED: - - acpi_cm_free (table_desc->base_pointer); - break; - - - case ACPI_MEM_MAPPED: - - acpi_os_unmap_memory (table_desc->base_pointer, table_desc->length); - break; - } - } -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_uninstall_table - * - * PARAMETERS: Table_info - A table info struct - * - * RETURN: None. - * - * DESCRIPTION: Free the memory associated with an internal ACPI table that - * is either installed or has never been installed. - * Table mutex should be locked. - * - ******************************************************************************/ - -ACPI_TABLE_DESC * -acpi_tb_uninstall_table ( - ACPI_TABLE_DESC *table_desc) -{ - ACPI_TABLE_DESC *next_desc; - - - if (!table_desc) { - return (NULL); - } - - - /* Unlink the descriptor */ - - if (table_desc->prev) { - table_desc->prev->next = table_desc->next; - } - - if (table_desc->next) { - table_desc->next->prev = table_desc->prev; - } - - - /* Free the memory allocated for the table itself */ - - acpi_tb_delete_single_table (table_desc); - - - /* Free the table descriptor (Don't delete the list head, tho) */ - - if ((table_desc->prev) == (table_desc->next)) { - - next_desc = NULL; - - /* Clear the list head */ - - table_desc->pointer = NULL; - table_desc->length = 0; - table_desc->count = 0; - - } - - else { - /* Free the table descriptor */ - - next_desc = table_desc->next; - acpi_cm_free (table_desc); - } - - - return (next_desc); -} - - diff --git a/reactos/drivers/bus/acpi/tables/tbutils.c b/reactos/drivers/bus/acpi/tables/tbutils.c deleted file mode 100644 index 4d1cbbf3a2a..00000000000 --- a/reactos/drivers/bus/acpi/tables/tbutils.c +++ /dev/null @@ -1,352 +0,0 @@ -/****************************************************************************** - * - * Module Name: tbutils - Table manipulation utilities - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_TABLES - MODULE_NAME ("tbutils") - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_handle_to_object - * - * PARAMETERS: Table_id - Id for which the function is searching - * Table_desc - Pointer to return the matching table - * descriptor. - * - * RETURN: Search the tables to find one with a matching Table_id and - * return a pointer to that table descriptor. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_handle_to_object ( - u16 table_id, - ACPI_TABLE_DESC **table_desc) -{ - u32 i; - ACPI_TABLE_DESC *list_head; - - - for (i = 0; i < ACPI_TABLE_MAX; i++) { - list_head = &acpi_gbl_acpi_tables[i]; - do { - if (list_head->table_id == table_id) { - *table_desc = list_head; - return (AE_OK); - } - - list_head = list_head->next; - - } while (list_head != &acpi_gbl_acpi_tables[i]); - } - - - return (AE_BAD_PARAMETER); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_system_table_pointer - * - * PARAMETERS: *Where - Pointer to be examined - * - * RETURN: TRUE if Where is within the AML stream (in one of the ACPI - * system tables such as the DSDT or an SSDT.) - * FALSE otherwise - * - ******************************************************************************/ - -u8 -acpi_tb_system_table_pointer ( - void *where) -{ - u32 i; - ACPI_TABLE_DESC *table_desc; - ACPI_TABLE_HEADER *table; - - - /* No function trace, called too often! */ - - - /* Ignore null pointer */ - - if (!where) { - return (FALSE); - } - - - /* Check for a pointer within the DSDT */ - - if ((acpi_gbl_DSDT) && - (IS_IN_ACPI_TABLE (where, acpi_gbl_DSDT))) { - return (TRUE); - } - - - /* Check each of the loaded SSDTs (if any)*/ - - table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_SSDT]; - - for (i = 0; i < acpi_gbl_acpi_tables[ACPI_TABLE_SSDT].count; i++) { - table = table_desc->pointer; - - if (IS_IN_ACPI_TABLE (where, table)) { - return (TRUE); - } - - table_desc = table_desc->next; - } - - - /* Check each of the loaded PSDTs (if any)*/ - - table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_PSDT]; - - for (i = 0; i < acpi_gbl_acpi_tables[ACPI_TABLE_PSDT].count; i++) { - table = table_desc->pointer; - - if (IS_IN_ACPI_TABLE (where, table)) { - return (TRUE); - } - - table_desc = table_desc->next; - } - - - /* Pointer does not point into any system table */ - - return (FALSE); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_validate_table_header - * - * PARAMETERS: Table_header - Logical pointer to the table - * - * RETURN: Status - * - * DESCRIPTION: Check an ACPI table header for validity - * - * NOTE: Table pointers are validated as follows: - * 1) Table pointer must point to valid physical memory - * 2) Signature must be 4 ASCII chars, even if we don't recognize the - * name - * 3) Table must be readable for length specified in the header - * 4) Table checksum must be valid (with the exception of the FACS - * which has no checksum for some odd reason) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_validate_table_header ( - ACPI_TABLE_HEADER *table_header) -{ - ACPI_NAME signature; - - - /* Verify that this is a valid address */ - - if (!acpi_os_readable (table_header, sizeof (ACPI_TABLE_HEADER))) { - return (AE_BAD_ADDRESS); - } - - - /* Ensure that the signature is 4 ASCII characters */ - - MOVE_UNALIGNED32_TO_32 (&signature, &table_header->signature); - if (!acpi_cm_valid_acpi_name (signature)) { - REPORT_WARNING (("Invalid table signature found\n")); - return (AE_BAD_SIGNATURE); - } - - - /* Validate the table length */ - - if (table_header->length < sizeof (ACPI_TABLE_HEADER)) { - REPORT_WARNING (("Invalid table header length found\n")); - return (AE_BAD_HEADER); - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_map_acpi_table - * - * PARAMETERS: Physical_address - Physical address of table to map - * *Size - Size of the table. If zero, the size - * from the table header is used. - * Actual size is returned here. - * **Logical_address - Logical address of mapped table - * - * RETURN: Logical address of the mapped table. - * - * DESCRIPTION: Maps the physical address of table into a logical address - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_map_acpi_table ( - ACPI_PHYSICAL_ADDRESS physical_address, - u32 *size, - void **logical_address) -{ - ACPI_TABLE_HEADER *table; - u32 table_size = *size; - ACPI_STATUS status = AE_OK; - - - /* If size is zero, look at the table header to get the actual size */ - - if ((*size) == 0) { - /* Get the table header so we can extract the table length */ - - status = acpi_os_map_memory (physical_address, sizeof (ACPI_TABLE_HEADER), - (void **) &table); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Extract the full table length before we delete the mapping */ - - table_size = table->length; - - /* - * Validate the header and delete the mapping. - * We will create a mapping for the full table below. - */ - - status = acpi_tb_validate_table_header (table); - - /* Always unmap the memory for the header */ - - acpi_os_unmap_memory (table, sizeof (ACPI_TABLE_HEADER)); - - /* Exit if header invalid */ - - if (ACPI_FAILURE (status)) { - return (status); - } - } - - - /* Map the physical memory for the correct length */ - - status = acpi_os_map_memory (physical_address, table_size, (void **) &table); - if (ACPI_FAILURE (status)) { - return (status); - } - - *size = table_size; - *logical_address = table; - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_verify_table_checksum - * - * PARAMETERS: *Table_header - ACPI table to verify - * - * RETURN: 8 bit checksum of table - * - * DESCRIPTION: Does an 8 bit checksum of table and returns status. A correct - * table should have a checksum of 0. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_verify_table_checksum ( - ACPI_TABLE_HEADER *table_header) -{ - u8 checksum; - ACPI_STATUS status = AE_OK; - - - /* Compute the checksum on the table */ - - checksum = acpi_tb_checksum (table_header, table_header->length); - - /* Return the appropriate exception */ - - if (checksum) { - REPORT_WARNING (("Invalid checksum (%X) in table %4.4s\n", - checksum, &table_header->signature)); - - status = AE_BAD_CHECKSUM; - } - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_checksum - * - * PARAMETERS: Buffer - Buffer to checksum - * Length - Size of the buffer - * - * RETURNS 8 bit checksum of buffer - * - * DESCRIPTION: Computes an 8 bit checksum of the buffer(length) and returns it. - * - ******************************************************************************/ - -u8 -acpi_tb_checksum ( - void *buffer, - u32 length) -{ - u8 *limit; - u8 *rover; - u8 sum = 0; - - - if (buffer && length) { - /* Buffer and Length are valid */ - - limit = (u8 *) buffer + length; - - for (rover = buffer; rover < limit; rover++) { - sum = (u8) (sum + *rover); - } - } - - return (sum); -} - - diff --git a/reactos/drivers/bus/acpi/tables/tbxface.c b/reactos/drivers/bus/acpi/tables/tbxface.c deleted file mode 100644 index ff44010c4df..00000000000 --- a/reactos/drivers/bus/acpi/tables/tbxface.c +++ /dev/null @@ -1,383 +0,0 @@ -/****************************************************************************** - * - * Module Name: tbxface - Public interfaces to the ACPI subsystem - * ACPI table oriented interfaces - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_TABLES - MODULE_NAME ("tbxface") - - -/******************************************************************************* - * - * FUNCTION: Acpi_load_tables - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: This function is called to load the ACPI tables from the - * provided RSDT - * - ******************************************************************************/ - -ACPI_STATUS -acpi_load_tables ( - ACPI_PHYSICAL_ADDRESS rsdp_physical_address) -{ - ACPI_STATUS status = AE_OK; - u32 number_of_tables = 0; - - - /* Map and validate the RSDP */ - - status = acpi_tb_verify_rsdp (rsdp_physical_address); - if (ACPI_FAILURE (status)) { - REPORT_ERROR (("Acpi_load_tables: RSDP Failed validation: %s\n", - acpi_cm_format_exception (status))); - goto error_exit; - } - - /* Get the RSDT via the RSDP */ - - status = acpi_tb_get_table_rsdt (&number_of_tables); - if (ACPI_FAILURE (status)) { - REPORT_ERROR (("Acpi_load_tables: Could not load RSDT: %s\n", - acpi_cm_format_exception (status))); - goto error_exit; - } - - /* Now get the rest of the tables */ - - status = acpi_tb_get_all_tables (number_of_tables, NULL); - if (ACPI_FAILURE (status)) { - REPORT_ERROR (("Acpi_load_tables: Error getting required tables (DSDT/FADT/FACS): %s\n", - acpi_cm_format_exception (status))); - goto error_exit; - } - - - /* Load the namespace from the tables */ - - status = acpi_ns_load_namespace (); - if (ACPI_FAILURE (status)) { - REPORT_ERROR (("Acpi_load_tables: Could not load namespace: %s\n", - acpi_cm_format_exception (status))); - goto error_exit; - } - - return (AE_OK); - - -error_exit: - REPORT_ERROR (("Acpi_load_tables: Could not load tables: %s\n", - acpi_cm_format_exception (status))); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_load_table - * - * PARAMETERS: Table_ptr - pointer to a buffer containing the entire - * table to be loaded - * - * RETURN: Status - * - * DESCRIPTION: This function is called to load a table from the caller's - * buffer. The buffer must contain an entire ACPI Table including - * a valid header. The header fields will be verified, and if it - * is determined that the table is invalid, the call will fail. - * - * If the call fails an appropriate status will be returned. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_load_table ( - ACPI_TABLE_HEADER *table_ptr) -{ - ACPI_STATUS status; - ACPI_TABLE_DESC table_info; - - - if (!table_ptr) { - return (AE_BAD_PARAMETER); - } - - /* Copy the table to a local buffer */ - - status = acpi_tb_get_table (0, table_ptr, &table_info); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* Install the new table into the local data structures */ - - status = acpi_tb_install_table (NULL, &table_info); - if (ACPI_FAILURE (status)) { - /* Free table allocated by Acpi_tb_get_table */ - - acpi_tb_delete_single_table (&table_info); - return (status); - } - - - status = acpi_ns_load_table (table_info.installed_desc, acpi_gbl_root_node); - if (ACPI_FAILURE (status)) { - /* Uninstall table and free the buffer */ - - acpi_tb_uninstall_table (table_info.installed_desc); - return (status); - } - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_unload_table - * - * PARAMETERS: Table_type - Type of table to be unloaded - * - * RETURN: Status - * - * DESCRIPTION: This routine is used to force the unload of a table - * - ******************************************************************************/ - -ACPI_STATUS -acpi_unload_table ( - ACPI_TABLE_TYPE table_type) -{ - ACPI_TABLE_DESC *list_head; - - - /* Parameter validation */ - - if (table_type > ACPI_TABLE_MAX) { - return (AE_BAD_PARAMETER); - } - - - /* Find all tables of the requested type */ - - list_head = &acpi_gbl_acpi_tables[table_type]; - do { - /* - * Delete all namespace entries owned by this table. Note that these - * entries can appear anywhere in the namespace by virtue of the AML - * "Scope" operator. Thus, we need to track ownership by an ID, not - * simply a position within the hierarchy - */ - - acpi_ns_delete_namespace_by_owner (list_head->table_id); - - /* Delete (or unmap) the actual table */ - - acpi_tb_delete_acpi_table (table_type); - - } while (list_head != &acpi_gbl_acpi_tables[table_type]); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_get_table_header - * - * PARAMETERS: Table_type - one of the defined table types - * Instance - the non zero instance of the table, allows - * support for multiple tables of the same type - * see Acpi_gbl_Acpi_table_flag - * Out_table_header - pointer to the ACPI_TABLE_HEADER if successful - * - * DESCRIPTION: This function is called to get an ACPI table header. The caller - * supplies an pointer to a data area sufficient to contain an ACPI - * ACPI_TABLE_HEADER structure. - * - * The header contains a length field that can be used to determine - * the size of the buffer needed to contain the entire table. This - * function is not valid for the RSD PTR table since it does not - * have a standard header and is fixed length. - * - * If the operation fails for any reason an appropriate status will - * be returned and the contents of Out_table_header are undefined. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_table_header ( - ACPI_TABLE_TYPE table_type, - u32 instance, - ACPI_TABLE_HEADER *out_table_header) -{ - ACPI_TABLE_HEADER *tbl_ptr; - ACPI_STATUS status; - - - if ((instance == 0) || - (table_type == ACPI_TABLE_RSDP) || - (!out_table_header)) { - return (AE_BAD_PARAMETER); - } - - /* Check the table type and instance */ - - if ((table_type > ACPI_TABLE_MAX) || - (IS_SINGLE_TABLE (acpi_gbl_acpi_table_data[table_type].flags) && - instance > 1)) { - return (AE_BAD_PARAMETER); - } - - - /* Get a pointer to the entire table */ - - status = acpi_tb_get_table_ptr (table_type, instance, &tbl_ptr); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * The function will return a NULL pointer if the table is not loaded - */ - if (tbl_ptr == NULL) { - return (AE_NOT_EXIST); - } - - /* - * Copy the header to the caller's buffer - */ - MEMCPY ((void *) out_table_header, (void *) tbl_ptr, - sizeof (ACPI_TABLE_HEADER)); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_get_table - * - * PARAMETERS: Table_type - one of the defined table types - * Instance - the non zero instance of the table, allows - * support for multiple tables of the same type - * see Acpi_gbl_Acpi_table_flag - * Ret_buffer - pointer to a structure containing a buffer to - * receive the table - * - * RETURN: Status - * - * DESCRIPTION: This function is called to get an ACPI table. The caller - * supplies an Out_buffer large enough to contain the entire ACPI - * table. The caller should call the Acpi_get_table_header function - * first to determine the buffer size needed. Upon completion - * the Out_buffer->Length field will indicate the number of bytes - * copied into the Out_buffer->Buf_ptr buffer. This table will be - * a complete table including the header. - * - * If the operation fails an appropriate status will be returned - * and the contents of Out_buffer are undefined. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_table ( - ACPI_TABLE_TYPE table_type, - u32 instance, - ACPI_BUFFER *ret_buffer) -{ - ACPI_TABLE_HEADER *tbl_ptr; - ACPI_STATUS status; - u32 ret_buf_len; - - - /* - * If we have a buffer, we must have a length too - */ - if ((instance == 0) || - (!ret_buffer) || - ((!ret_buffer->pointer) && (ret_buffer->length))) { - return (AE_BAD_PARAMETER); - } - - /* Check the table type and instance */ - - if ((table_type > ACPI_TABLE_MAX) || - (IS_SINGLE_TABLE (acpi_gbl_acpi_table_data[table_type].flags) && - instance > 1)) { - return (AE_BAD_PARAMETER); - } - - - /* Get a pointer to the entire table */ - - status = acpi_tb_get_table_ptr (table_type, instance, &tbl_ptr); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * Acpi_tb_get_table_ptr will return a NULL pointer if the - * table is not loaded. - */ - if (tbl_ptr == NULL) { - return (AE_NOT_EXIST); - } - - /* - * Got a table ptr, assume it's ok and copy it to the user's buffer - */ - if (table_type == ACPI_TABLE_RSDP) { - /* - * RSD PTR is the only "table" without a header - */ - ret_buf_len = sizeof (RSDP_DESCRIPTOR); - } - else { - ret_buf_len = tbl_ptr->length; - } - - /* - * Verify we have space in the caller's buffer for the table - */ - if (ret_buffer->length < ret_buf_len) { - ret_buffer->length = ret_buf_len; - return (AE_BUFFER_OVERFLOW); - } - - ret_buffer->length = ret_buf_len; - - MEMCPY ((void *) ret_buffer->pointer, (void *) tbl_ptr, ret_buf_len); - - return (AE_OK); -} - diff --git a/reactos/drivers/bus/acpi/tables/tbxfroot.c b/reactos/drivers/bus/acpi/tables/tbxfroot.c deleted file mode 100644 index c15bf6d3a9c..00000000000 --- a/reactos/drivers/bus/acpi/tables/tbxfroot.c +++ /dev/null @@ -1,209 +0,0 @@ -/****************************************************************************** - * - * Module Name: tbxfroot - Find the root ACPI table (RSDT) - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_TABLES - MODULE_NAME ("tbxfroot") - -#define RSDP_CHECKSUM_LENGTH 20 - - -/******************************************************************************* - * - * FUNCTION: Acpi_find_root_pointer - * - * PARAMETERS: **Rsdp_physical_address - Where to place the RSDP address - * - * RETURN: Status, Physical address of the RSDP - * - * DESCRIPTION: Find the RSDP - * - ******************************************************************************/ - -ACPI_STATUS -acpi_find_root_pointer ( - ACPI_PHYSICAL_ADDRESS *rsdp_physical_address) -{ - ACPI_TABLE_DESC table_info; - ACPI_STATUS status; - - - /* Get the RSDP */ - - status = acpi_tb_find_rsdp (&table_info); - if (ACPI_FAILURE (status)) { - return (AE_NO_ACPI_TABLES); - } - - *rsdp_physical_address = table_info.physical_address; - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_scan_memory_for_rsdp - * - * PARAMETERS: Start_address - Starting pointer for search - * Length - Maximum length to search - * - * RETURN: Pointer to the RSDP if found, otherwise NULL. - * - * DESCRIPTION: Search a block of memory for the RSDP signature - * - ******************************************************************************/ - -u8 * -acpi_tb_scan_memory_for_rsdp ( - u8 *start_address, - u32 length) -{ - u32 offset; - u8 *mem_rover; - - - /* Search from given start addr for the requested length */ - - for (offset = 0, mem_rover = start_address; - offset < length; - offset += RSDP_SCAN_STEP, mem_rover += RSDP_SCAN_STEP) { - - /* The signature and checksum must both be correct */ - - if (STRNCMP ((NATIVE_CHAR *) mem_rover, - RSDP_SIG, sizeof (RSDP_SIG)-1) == 0 && - acpi_tb_checksum (mem_rover, RSDP_CHECKSUM_LENGTH) == 0) { - /* If so, we have found the RSDP */ - - return (mem_rover); - } - } - - /* Searched entire block, no RSDP was found */ - - return (NULL); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_tb_find_rsdp - * - * PARAMETERS: *Buffer_ptr - If == NULL, read data from buffer - * rather than searching memory - * *Table_info - Where the table info is returned - * - * RETURN: Status - * - * DESCRIPTION: Search lower 1_mbyte of memory for the root system descriptor - * pointer structure. If it is found, set *RSDP to point to it. - * - * NOTE: The RSDP must be either in the first 1_k of the Extended - * BIOS Data Area or between E0000 and FFFFF (ACPI 1.0 section - * 5.2.2; assertion #421). - * - ******************************************************************************/ - -ACPI_STATUS -acpi_tb_find_rsdp ( - ACPI_TABLE_DESC *table_info) -{ - u8 *table_ptr; - u8 *mem_rover; - UINT64 phys_addr; - ACPI_STATUS status = AE_OK; - - - /* - * Search memory for RSDP. First map low physical memory. - */ - - status = acpi_os_map_memory (LO_RSDP_WINDOW_BASE, LO_RSDP_WINDOW_SIZE, - (void **)&table_ptr); - - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * 1) Search EBDA (low memory) paragraphs - */ - - mem_rover = acpi_tb_scan_memory_for_rsdp (table_ptr, LO_RSDP_WINDOW_SIZE); - - /* This mapping is no longer needed */ - - acpi_os_unmap_memory (table_ptr, LO_RSDP_WINDOW_SIZE); - - if (mem_rover) { - /* Found it, return the physical address */ - - phys_addr = LO_RSDP_WINDOW_BASE; - phys_addr += (mem_rover - table_ptr); - - table_info->physical_address = phys_addr; - - return (AE_OK); - } - - - /* - * 2) Search upper memory: 16-byte boundaries in E0000h-F0000h - */ - - status = acpi_os_map_memory (HI_RSDP_WINDOW_BASE, HI_RSDP_WINDOW_SIZE, - (void **)&table_ptr); - - if (ACPI_FAILURE (status)) { - return (status); - } - - mem_rover = acpi_tb_scan_memory_for_rsdp (table_ptr, HI_RSDP_WINDOW_SIZE); - - /* This mapping is no longer needed */ - - acpi_os_unmap_memory (table_ptr, HI_RSDP_WINDOW_SIZE); - - if (mem_rover) { - /* Found it, return the physical address */ - - phys_addr = HI_RSDP_WINDOW_BASE; - phys_addr += (mem_rover - table_ptr); - - table_info->physical_address = phys_addr; - - return (AE_OK); - } - - - /* RSDP signature was not found */ - - return (AE_NOT_FOUND); -} - - diff --git a/reactos/drivers/bus/acpi/utils/cmalloc.c b/reactos/drivers/bus/acpi/utils/cmalloc.c deleted file mode 100644 index 03e743fb19d..00000000000 --- a/reactos/drivers/bus/acpi/utils/cmalloc.c +++ /dev/null @@ -1,166 +0,0 @@ -/****************************************************************************** - * - * Module Name: cmalloc - local memory allocation routines - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_UTILITIES - MODULE_NAME ("cmalloc") - - -/***************************************************************************** - * - * FUNCTION: _Cm_allocate - * - * PARAMETERS: Size - Size of the allocation - * Component - Component type of caller - * Module - Source file name of caller - * Line - Line number of caller - * - * RETURN: Address of the allocated memory on success, NULL on failure. - * - * DESCRIPTION: The subsystem's equivalent of malloc. - * - ****************************************************************************/ - -void * -_cm_allocate ( - u32 size, - u32 component, - NATIVE_CHAR *module, - u32 line) -{ - void *address = NULL; - - - /* Check for an inadvertent size of zero bytes */ - - if (!size) { - _REPORT_ERROR (module, line, component, - ("Cm_allocate: Attempt to allocate zero bytes\n")); - size = 1; - } - - address = acpi_os_allocate (size); - if (!address) { - /* Report allocation error */ - - _REPORT_ERROR (module, line, component, - ("Cm_allocate: Could not allocate size %X\n", size)); - - return (NULL); - } - - - return (address); -} - - -/***************************************************************************** - * - * FUNCTION: _Cm_callocate - * - * PARAMETERS: Size - Size of the allocation - * Component - Component type of caller - * Module - Source file name of caller - * Line - Line number of caller - * - * RETURN: Address of the allocated memory on success, NULL on failure. - * - * DESCRIPTION: Subsystem equivalent of calloc. - * - ****************************************************************************/ - -void * -_cm_callocate ( - u32 size, - u32 component, - NATIVE_CHAR *module, - u32 line) -{ - void *address = NULL; - - - /* Check for an inadvertent size of zero bytes */ - - if (!size) { - _REPORT_ERROR (module, line, component, - ("Cm_callocate: Attempt to allocate zero bytes\n")); - return (NULL); - } - - - address = acpi_os_callocate (size); - - if (!address) { - /* Report allocation error */ - - _REPORT_ERROR (module, line, component, - ("Cm_callocate: Could not allocate size %X\n", size)); - return (NULL); - } - - - return (address); -} - - -/***************************************************************************** - * - * FUNCTION: _Cm_free - * - * PARAMETERS: Address - Address of the memory to deallocate - * Component - Component type of caller - * Module - Source file name of caller - * Line - Line number of caller - * - * RETURN: None - * - * DESCRIPTION: Frees the memory at Address - * - ****************************************************************************/ - -void -_cm_free ( - void *address, - u32 component, - NATIVE_CHAR *module, - u32 line) -{ - - if (NULL == address) { - _REPORT_ERROR (module, line, component, - ("_Cm_free: Trying to delete a NULL address\n")); - - return; - } - - - acpi_os_free (address); - - return; -} - - diff --git a/reactos/drivers/bus/acpi/utils/cmclib.c b/reactos/drivers/bus/acpi/utils/cmclib.c deleted file mode 100644 index 29f1d4f6f7f..00000000000 --- a/reactos/drivers/bus/acpi/utils/cmclib.c +++ /dev/null @@ -1,810 +0,0 @@ -/****************************************************************************** - * - * Module Name: cmclib - Local implementation of C library functions - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -/* - * These implementations of standard C Library routines can optionally be - * used if a C library is not available. In general, they are less efficient - * than an inline or assembly implementation - */ - -#define _COMPONENT MISCELLANEOUS - MODULE_NAME ("cmclib") - - -#ifndef ACPI_USE_SYSTEM_CLIBRARY - -/******************************************************************************* - * - * FUNCTION: strlen - * - * PARAMETERS: String - Null terminated string - * - * RETURN: Length - * - * DESCRIPTION: Returns the length of the input string - * - ******************************************************************************/ - - -u32 -acpi_cm_strlen ( - const NATIVE_CHAR *string) -{ - u32 length = 0; - - - /* Count the string until a null is encountered */ - - while (*string) { - length++; - string++; - } - - return (length); -} - - -/******************************************************************************* - * - * FUNCTION: strcpy - * - * PARAMETERS: Dst_string - Target of the copy - * Src_string - The source string to copy - * - * RETURN: Dst_string - * - * DESCRIPTION: Copy a null terminated string - * - ******************************************************************************/ - -NATIVE_CHAR * -acpi_cm_strcpy ( - NATIVE_CHAR *dst_string, - const NATIVE_CHAR *src_string) -{ - NATIVE_CHAR *string = dst_string; - - - /* Move bytes brute force */ - - while (*src_string) { - *string = *src_string; - - string++; - src_string++; - } - - /* Null terminate */ - - *string = 0; - - return (dst_string); -} - - -/******************************************************************************* - * - * FUNCTION: strncpy - * - * PARAMETERS: Dst_string - Target of the copy - * Src_string - The source string to copy - * Count - Maximum # of bytes to copy - * - * RETURN: Dst_string - * - * DESCRIPTION: Copy a null terminated string, with a maximum length - * - ******************************************************************************/ - -NATIVE_CHAR * -acpi_cm_strncpy ( - NATIVE_CHAR *dst_string, - const NATIVE_CHAR *src_string, - NATIVE_UINT count) -{ - NATIVE_CHAR *string = dst_string; - - - /* Copy the string */ - - for (string = dst_string; - count && (count--, (*string++ = *src_string++)); ) {;} - - /* Pad with nulls if necessary */ - - while (count--) { - *string = 0; - string++; - } - - /* Return original pointer */ - - return (dst_string); -} - - -/******************************************************************************* - * - * FUNCTION: strcmp - * - * PARAMETERS: String1 - First string - * String2 - Second string - * - * RETURN: Index where strings mismatched, or 0 if strings matched - * - * DESCRIPTION: Compare two null terminated strings - * - ******************************************************************************/ - -u32 -acpi_cm_strcmp ( - const NATIVE_CHAR *string1, - const NATIVE_CHAR *string2) -{ - - - for ( ; (*string1 == *string2); string2++) { - if (!*string1++) { - return (0); - } - } - - - return ((unsigned char) *string1 - (unsigned char) *string2); -} - - -/******************************************************************************* - * - * FUNCTION: strncmp - * - * PARAMETERS: String1 - First string - * String2 - Second string - * Count - Maximum # of bytes to compare - * - * RETURN: Index where strings mismatched, or 0 if strings matched - * - * DESCRIPTION: Compare two null terminated strings, with a maximum length - * - ******************************************************************************/ - -u32 -acpi_cm_strncmp ( - const NATIVE_CHAR *string1, - const NATIVE_CHAR *string2, - NATIVE_UINT count) -{ - - - for ( ; count-- && (*string1 == *string2); string2++) { - if (!*string1++) { - return (0); - } - } - - return ((count == -1) ? 0 : ((unsigned char) *string1 - - (unsigned char) *string2)); -} - - -/******************************************************************************* - * - * FUNCTION: Strcat - * - * PARAMETERS: Dst_string - Target of the copy - * Src_string - The source string to copy - * - * RETURN: Dst_string - * - * DESCRIPTION: Append a null terminated string to a null terminated string - * - ******************************************************************************/ - -NATIVE_CHAR * -acpi_cm_strcat ( - NATIVE_CHAR *dst_string, - const NATIVE_CHAR *src_string) -{ - NATIVE_CHAR *string; - - - /* Find end of the destination string */ - - for (string = dst_string; *string++; ) { ; } - - /* Concatinate the string */ - - for (--string; (*string++ = *src_string++); ) { ; } - - return (dst_string); -} - - -/******************************************************************************* - * - * FUNCTION: strncat - * - * PARAMETERS: Dst_string - Target of the copy - * Src_string - The source string to copy - * Count - Maximum # of bytes to copy - * - * RETURN: Dst_string - * - * DESCRIPTION: Append a null terminated string to a null terminated string, - * with a maximum count. - * - ******************************************************************************/ - -NATIVE_CHAR * -acpi_cm_strncat ( - NATIVE_CHAR *dst_string, - const NATIVE_CHAR *src_string, - NATIVE_UINT count) -{ - NATIVE_CHAR *string; - - - if (count) { - /* Find end of the destination string */ - - for (string = dst_string; *string++; ) { ; } - - /* Concatinate the string */ - - for (--string; (*string++ = *src_string++) && --count; ) { ; } - - /* Null terminate if necessary */ - - if (!count) { - *string = 0; - } - } - - return (dst_string); -} - - -/******************************************************************************* - * - * FUNCTION: memcpy - * - * PARAMETERS: Dest - Target of the copy - * Src - Source buffer to copy - * Count - Number of bytes to copy - * - * RETURN: Dest - * - * DESCRIPTION: Copy arbitrary bytes of memory - * - ******************************************************************************/ - -void * -acpi_cm_memcpy ( - void *dest, - const void *src, - NATIVE_UINT count) -{ - NATIVE_CHAR *new = (NATIVE_CHAR *) dest; - NATIVE_CHAR *old = (NATIVE_CHAR *) src; - - - while (count) { - *new = *old; - new++; - old++; - count--; - } - - return (dest); -} - - -/******************************************************************************* - * - * FUNCTION: memset - * - * PARAMETERS: Dest - Buffer to set - * Value - Value to set each byte of memory - * Count - Number of bytes to set - * - * RETURN: Dest - * - * DESCRIPTION: Initialize a buffer to a known value. - * - ******************************************************************************/ - -void * -acpi_cm_memset ( - void *dest, - NATIVE_UINT value, - NATIVE_UINT count) -{ - NATIVE_CHAR *new = (NATIVE_CHAR *) dest; - - - while (count) { - *new = (char) value; - new++; - count--; - } - - return (dest); -} - - -#define NEGATIVE 1 -#define POSITIVE 0 - - -#define _ACPI_XA 0x00 /* extra alphabetic - not supported */ -#define _ACPI_XS 0x40 /* extra space */ -#define _ACPI_BB 0x00 /* BEL, BS, etc. - not supported */ -#define _ACPI_CN 0x20 /* CR, FF, HT, NL, VT */ -#define _ACPI_DI 0x04 /* '0'-'9' */ -#define _ACPI_LO 0x02 /* 'a'-'z' */ -#define _ACPI_PU 0x10 /* punctuation */ -#define _ACPI_SP 0x08 /* space */ -#define _ACPI_UP 0x01 /* 'A'-'Z' */ -#define _ACPI_XD 0x80 /* '0'-'9', 'A'-'F', 'a'-'f' */ - -static const u8 _acpi_ctype[257] = { - _ACPI_CN, /* 0x0 0. */ - _ACPI_CN, /* 0x1 1. */ - _ACPI_CN, /* 0x2 2. */ - _ACPI_CN, /* 0x3 3. */ - _ACPI_CN, /* 0x4 4. */ - _ACPI_CN, /* 0x5 5. */ - _ACPI_CN, /* 0x6 6. */ - _ACPI_CN, /* 0x7 7. */ - _ACPI_CN, /* 0x8 8. */ - _ACPI_CN|_ACPI_SP, /* 0x9 9. */ - _ACPI_CN|_ACPI_SP, /* 0xA 10. */ - _ACPI_CN|_ACPI_SP, /* 0xB 11. */ - _ACPI_CN|_ACPI_SP, /* 0xC 12. */ - _ACPI_CN|_ACPI_SP, /* 0xD 13. */ - _ACPI_CN, /* 0xE 14. */ - _ACPI_CN, /* 0xF 15. */ - _ACPI_CN, /* 0x10 16. */ - _ACPI_CN, /* 0x11 17. */ - _ACPI_CN, /* 0x12 18. */ - _ACPI_CN, /* 0x13 19. */ - _ACPI_CN, /* 0x14 20. */ - _ACPI_CN, /* 0x15 21. */ - _ACPI_CN, /* 0x16 22. */ - _ACPI_CN, /* 0x17 23. */ - _ACPI_CN, /* 0x18 24. */ - _ACPI_CN, /* 0x19 25. */ - _ACPI_CN, /* 0x1A 26. */ - _ACPI_CN, /* 0x1B 27. */ - _ACPI_CN, /* 0x1C 28. */ - _ACPI_CN, /* 0x1D 29. */ - _ACPI_CN, /* 0x1E 30. */ - _ACPI_CN, /* 0x1F 31. */ - _ACPI_XS|_ACPI_SP, /* 0x20 32. ' ' */ - _ACPI_PU, /* 0x21 33. '!' */ - _ACPI_PU, /* 0x22 34. '"' */ - _ACPI_PU, /* 0x23 35. '#' */ - _ACPI_PU, /* 0x24 36. '$' */ - _ACPI_PU, /* 0x25 37. '%' */ - _ACPI_PU, /* 0x26 38. '&' */ - _ACPI_PU, /* 0x27 39. ''' */ - _ACPI_PU, /* 0x28 40. '(' */ - _ACPI_PU, /* 0x29 41. ')' */ - _ACPI_PU, /* 0x2A 42. '*' */ - _ACPI_PU, /* 0x2B 43. '+' */ - _ACPI_PU, /* 0x2C 44. ',' */ - _ACPI_PU, /* 0x2D 45. '-' */ - _ACPI_PU, /* 0x2E 46. '.' */ - _ACPI_PU, /* 0x2F 47. '/' */ - _ACPI_XD|_ACPI_DI, /* 0x30 48. '0' */ - _ACPI_XD|_ACPI_DI, /* 0x31 49. '1' */ - _ACPI_XD|_ACPI_DI, /* 0x32 50. '2' */ - _ACPI_XD|_ACPI_DI, /* 0x33 51. '3' */ - _ACPI_XD|_ACPI_DI, /* 0x34 52. '4' */ - _ACPI_XD|_ACPI_DI, /* 0x35 53. '5' */ - _ACPI_XD|_ACPI_DI, /* 0x36 54. '6' */ - _ACPI_XD|_ACPI_DI, /* 0x37 55. '7' */ - _ACPI_XD|_ACPI_DI, /* 0x38 56. '8' */ - _ACPI_XD|_ACPI_DI, /* 0x39 57. '9' */ - _ACPI_PU, /* 0x3A 58. ':' */ - _ACPI_PU, /* 0x3B 59. ';' */ - _ACPI_PU, /* 0x3C 60. '<' */ - _ACPI_PU, /* 0x3D 61. '=' */ - _ACPI_PU, /* 0x3E 62. '>' */ - _ACPI_PU, /* 0x3F 63. '?' */ - _ACPI_PU, /* 0x40 64. '@' */ - _ACPI_XD|_ACPI_UP, /* 0x41 65. 'A' */ - _ACPI_XD|_ACPI_UP, /* 0x42 66. 'B' */ - _ACPI_XD|_ACPI_UP, /* 0x43 67. 'C' */ - _ACPI_XD|_ACPI_UP, /* 0x44 68. 'D' */ - _ACPI_XD|_ACPI_UP, /* 0x45 69. 'E' */ - _ACPI_XD|_ACPI_UP, /* 0x46 70. 'F' */ - _ACPI_UP, /* 0x47 71. 'G' */ - _ACPI_UP, /* 0x48 72. 'H' */ - _ACPI_UP, /* 0x49 73. 'I' */ - _ACPI_UP, /* 0x4A 74. 'J' */ - _ACPI_UP, /* 0x4B 75. 'K' */ - _ACPI_UP, /* 0x4C 76. 'L' */ - _ACPI_UP, /* 0x4D 77. 'M' */ - _ACPI_UP, /* 0x4E 78. 'N' */ - _ACPI_UP, /* 0x4F 79. 'O' */ - _ACPI_UP, /* 0x50 80. 'P' */ - _ACPI_UP, /* 0x51 81. 'Q' */ - _ACPI_UP, /* 0x52 82. 'R' */ - _ACPI_UP, /* 0x53 83. 'S' */ - _ACPI_UP, /* 0x54 84. 'T' */ - _ACPI_UP, /* 0x55 85. 'U' */ - _ACPI_UP, /* 0x56 86. 'V' */ - _ACPI_UP, /* 0x57 87. 'W' */ - _ACPI_UP, /* 0x58 88. 'X' */ - _ACPI_UP, /* 0x59 89. 'Y' */ - _ACPI_UP, /* 0x5A 90. 'Z' */ - _ACPI_PU, /* 0x5B 91. '[' */ - _ACPI_PU, /* 0x5C 92. '\' */ - _ACPI_PU, /* 0x5D 93. ']' */ - _ACPI_PU, /* 0x5E 94. '^' */ - _ACPI_PU, /* 0x5F 95. '_' */ - _ACPI_PU, /* 0x60 96. '`' */ - _ACPI_XD|_ACPI_LO, /* 0x61 97. 'a' */ - _ACPI_XD|_ACPI_LO, /* 0x62 98. 'b' */ - _ACPI_XD|_ACPI_LO, /* 0x63 99. 'c' */ - _ACPI_XD|_ACPI_LO, /* 0x64 100. 'd' */ - _ACPI_XD|_ACPI_LO, /* 0x65 101. 'e' */ - _ACPI_XD|_ACPI_LO, /* 0x66 102. 'f' */ - _ACPI_LO, /* 0x67 103. 'g' */ - _ACPI_LO, /* 0x68 104. 'h' */ - _ACPI_LO, /* 0x69 105. 'i' */ - _ACPI_LO, /* 0x6A 106. 'j' */ - _ACPI_LO, /* 0x6B 107. 'k' */ - _ACPI_LO, /* 0x6C 108. 'l' */ - _ACPI_LO, /* 0x6D 109. 'm' */ - _ACPI_LO, /* 0x6E 110. 'n' */ - _ACPI_LO, /* 0x6F 111. 'o' */ - _ACPI_LO, /* 0x70 112. 'p' */ - _ACPI_LO, /* 0x71 113. 'q' */ - _ACPI_LO, /* 0x72 114. 'r' */ - _ACPI_LO, /* 0x73 115. 's' */ - _ACPI_LO, /* 0x74 116. 't' */ - _ACPI_LO, /* 0x75 117. 'u' */ - _ACPI_LO, /* 0x76 118. 'v' */ - _ACPI_LO, /* 0x77 119. 'w' */ - _ACPI_LO, /* 0x78 120. 'x' */ - _ACPI_LO, /* 0x79 121. 'y' */ - _ACPI_LO, /* 0x7A 122. 'z' */ - _ACPI_PU, /* 0x7B 123. '{' */ - _ACPI_PU, /* 0x7C 124. '|' */ - _ACPI_PU, /* 0x7D 125. '}' */ - _ACPI_PU, /* 0x7E 126. '~' */ - _ACPI_CN, /* 0x7F 127. */ - - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x80 to 0x8F */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x90 to 0x9F */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xA0 to 0xAF */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xB0 to 0xBF */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xC0 to 0xCF */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xD0 to 0xDF */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xE0 to 0xEF */ - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* 0xF0 to 0x100 */ -}; - -#define IS_UPPER(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_UP)) -#define IS_LOWER(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO)) -#define IS_DIGIT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_DI)) -#define IS_SPACE(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_SP)) -#define IS_XDIGIT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_XD)) - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_to_upper - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: Convert character to uppercase - * - ******************************************************************************/ - -u32 -acpi_cm_to_upper ( - u32 c) -{ - - return (IS_LOWER(c) ? ((c)-0x20) : (c)); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_to_lower - * - * PARAMETERS: - * - * RETURN: - * - * DESCRIPTION: Convert character to lowercase - * - ******************************************************************************/ - -u32 -acpi_cm_to_lower ( - u32 c) -{ - - return (IS_UPPER(c) ? ((c)+0x20) : (c)); -} - - -/******************************************************************************* - * - * FUNCTION: strupr - * - * PARAMETERS: Src_string - The source string to convert to - * - * RETURN: Src_string - * - * DESCRIPTION: Convert string to uppercase - * - ******************************************************************************/ - -NATIVE_CHAR * -acpi_cm_strupr ( - NATIVE_CHAR *src_string) -{ - NATIVE_CHAR *string; - - - /* Walk entire string, uppercasing the letters */ - - for (string = src_string; *string; ) { - *string = (char) acpi_cm_to_upper (*string); - string++; - } - - - return (src_string); -} - - -/******************************************************************************* - * - * FUNCTION: strstr - * - * PARAMETERS: String1 - - * String2 - * - * RETURN: - * - * DESCRIPTION: Checks if String2 occurs in String1. This is not really a - * full implementation of strstr, only sufficient for command - * matching - * - ******************************************************************************/ - -NATIVE_CHAR * -acpi_cm_strstr ( - NATIVE_CHAR *string1, - NATIVE_CHAR *string2) -{ - NATIVE_CHAR *string; - - - if (acpi_cm_strlen (string2) > acpi_cm_strlen (string1)) { - return (NULL); - } - - /* Walk entire string, comparing the letters */ - - for (string = string1; *string2; ) { - if (*string2 != *string) { - return (NULL); - } - - string2++; - string++; - } - - - return (string1); -} - - -/******************************************************************************* - * - * FUNCTION: strtoul - * - * PARAMETERS: String - Null terminated string - * Terminater - Where a pointer to the terminating byte is returned - * Base - Radix of the string - * - * RETURN: Converted value - * - * DESCRIPTION: Convert a string into an unsigned value. - * - ******************************************************************************/ - -NATIVE_UINT -acpi_cm_strtoul ( - const NATIVE_CHAR *string, - NATIVE_CHAR **terminator, - NATIVE_UINT base) -{ - u32 converted = 0; - u32 index; - u32 sign; - const NATIVE_CHAR *string_start; - NATIVE_UINT return_value = 0; - ACPI_STATUS status = AE_OK; - - - /* - * Save the value of the pointer to the buffer's first - * character, save the current errno value, and then - * skip over any white space in the buffer: - */ - string_start = string; - while (IS_SPACE (*string) || *string == '\t') { - ++string; - } - - /* - * The buffer may contain an optional plus or minus sign. - * If it does, then skip over it but remember what is was: - */ - if (*string == '-') { - sign = NEGATIVE; - ++string; - } - - else if (*string == '+') { - ++string; - sign = POSITIVE; - } - - else { - sign = POSITIVE; - } - - /* - * If the input parameter Base is zero, then we need to - * determine if it is octal, decimal, or hexadecimal: - */ - if (base == 0) { - if (*string == '0') { - if (acpi_cm_to_lower (*(++string)) == 'x') { - base = 16; - ++string; - } - - else { - base = 8; - } - } - - else { - base = 10; - } - } - - else if (base < 2 || base > 36) { - /* - * The specified Base parameter is not in the domain of - * this function: - */ - goto done; - } - - /* - * For octal and hexadecimal bases, skip over the leading - * 0 or 0x, if they are present. - */ - if (base == 8 && *string == '0') { - string++; - } - - if (base == 16 && - *string == '0' && - acpi_cm_to_lower (*(++string)) == 'x') { - string++; - } - - - /* - * Main loop: convert the string to an unsigned long: - */ - while (*string) { - if (IS_DIGIT (*string)) { - index = *string - '0'; - } - - else { - index = acpi_cm_to_upper (*string); - if (IS_UPPER (index)) { - index = index - 'A' + 10; - } - - else { - goto done; - } - } - - if (index >= base) { - goto done; - } - - /* - * Check to see if value is out of range: - */ - - if (return_value > ((ACPI_UINT32_MAX - (u32) index) / - (u32) base)) { - status = AE_ERROR; - return_value = 0L; /* reset */ - } - - else { - return_value *= base; - return_value += index; - converted = 1; - } - - ++string; - } - -done: - /* - * If appropriate, update the caller's pointer to the next - * unconverted character in the buffer. - */ - if (terminator) { - if (converted == 0 && return_value == 0L && string != NULL) { - *terminator = (NATIVE_CHAR *) string_start; - } - - else { - *terminator = (NATIVE_CHAR *) string; - } - } - - if (status == AE_ERROR) { - return_value = ACPI_UINT32_MAX; - } - - /* - * If a minus sign was present, then "the conversion is negated": - */ - if (sign == NEGATIVE) { - return_value = (ACPI_UINT32_MAX - return_value) + 1; - } - - return (return_value); -} - -#endif /* ACPI_USE_SYSTEM_CLIBRARY */ - diff --git a/reactos/drivers/bus/acpi/utils/cmcopy.c b/reactos/drivers/bus/acpi/utils/cmcopy.c deleted file mode 100644 index f09c35c7505..00000000000 --- a/reactos/drivers/bus/acpi/utils/cmcopy.c +++ /dev/null @@ -1,704 +0,0 @@ -/****************************************************************************** - * - * Module Name: cmcopy - Internal to external object translation utilities - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_UTILITIES - MODULE_NAME ("cmcopy") - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_copy_isimple_to_esimple - * - * PARAMETERS: *Internal_object - Pointer to the object we are examining - * *Buffer - Where the object is returned - * *Space_used - Where the data length is returned - * - * RETURN: Status - * - * DESCRIPTION: This function is called to place a simple object in a user - * buffer. - * - * The buffer is assumed to have sufficient space for the object. - * - ******************************************************************************/ - -static ACPI_STATUS -acpi_cm_copy_isimple_to_esimple ( - ACPI_OPERAND_OBJECT *internal_object, - ACPI_OBJECT *external_object, - u8 *data_space, - u32 *buffer_space_used) -{ - u32 length = 0; - ACPI_STATUS status = AE_OK; - - - /* - * Check for NULL object case (could be an uninitialized - * package element - */ - - if (!internal_object) { - *buffer_space_used = 0; - return (AE_OK); - } - - /* Always clear the external object */ - - MEMSET (external_object, 0, sizeof (ACPI_OBJECT)); - - /* - * In general, the external object will be the same type as - * the internal object - */ - - external_object->type = internal_object->common.type; - - /* However, only a limited number of external types are supported */ - - switch (internal_object->common.type) { - - case ACPI_TYPE_STRING: - - length = internal_object->string.length + 1; - external_object->string.length = internal_object->string.length; - external_object->string.pointer = (NATIVE_CHAR *) data_space; - MEMCPY ((void *) data_space, (void *) internal_object->string.pointer, length); - break; - - - case ACPI_TYPE_BUFFER: - - length = internal_object->buffer.length; - external_object->buffer.length = internal_object->buffer.length; - external_object->buffer.pointer = data_space; - MEMCPY ((void *) data_space, (void *) internal_object->buffer.pointer, length); - break; - - - case ACPI_TYPE_INTEGER: - - external_object->integer.value= internal_object->integer.value; - break; - - - case INTERNAL_TYPE_REFERENCE: - - /* - * This is an object reference. Attempt to dereference it. - */ - - switch (internal_object->reference.opcode) { - case AML_ZERO_OP: - external_object->type = ACPI_TYPE_INTEGER; - external_object->integer.value = 0; - break; - - case AML_ONE_OP: - external_object->type = ACPI_TYPE_INTEGER; - external_object->integer.value = 1; - break; - - case AML_ONES_OP: - external_object->type = ACPI_TYPE_INTEGER; - external_object->integer.value = ACPI_INTEGER_MAX; - break; - - case AML_NAMEPATH_OP: - /* - * This is a named reference, get the string. We already know that - * we have room for it, use max length - */ - length = MAX_STRING_LENGTH; - external_object->type = ACPI_TYPE_STRING; - external_object->string.pointer = (NATIVE_CHAR *) data_space; - status = acpi_ns_handle_to_pathname ((ACPI_HANDLE *) internal_object->reference.node, - &length, (char *) data_space); - - /* Converted (external) string length is returned from above */ - - external_object->string.length = length; - break; - - default: - /* - * Use the object type of "Any" to indicate a reference - * to object containing a handle to an ACPI named object. - */ - external_object->type = ACPI_TYPE_ANY; - external_object->reference.handle = internal_object->reference.node; - break; - } - break; - - - case ACPI_TYPE_PROCESSOR: - - external_object->processor.proc_id = internal_object->processor.proc_id; - external_object->processor.pblk_address = internal_object->processor.address; - external_object->processor.pblk_length = internal_object->processor.length; - break; - - - case ACPI_TYPE_POWER: - - external_object->power_resource.system_level = - internal_object->power_resource.system_level; - - external_object->power_resource.resource_order = - internal_object->power_resource.resource_order; - break; - - - default: - /* - * There is no corresponding external object type - */ - return (AE_SUPPORT); - break; - } - - - *buffer_space_used = (u32) ROUND_UP_TO_NATIVE_WORD (length); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_copy_ielement_to_eelement - * - * PARAMETERS: ACPI_PKG_CALLBACK - * - * RETURN: Status - * - * DESCRIPTION: Copy one package element to another package element - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_copy_ielement_to_eelement ( - u8 object_type, - ACPI_OPERAND_OBJECT *source_object, - ACPI_GENERIC_STATE *state, - void *context) -{ - ACPI_STATUS status = AE_OK; - ACPI_PKG_INFO *info = (ACPI_PKG_INFO *) context; - u32 object_space; - u32 this_index; - ACPI_OBJECT *target_object; - - - this_index = state->pkg.index; - target_object = (ACPI_OBJECT *) - &((ACPI_OBJECT *)(state->pkg.dest_object))->package.elements[this_index]; - - - switch (object_type) { - case ACPI_COPY_TYPE_SIMPLE: - - /* - * This is a simple or null object -- get the size - */ - - status = acpi_cm_copy_isimple_to_esimple (source_object, - target_object, info->free_space, &object_space); - if (ACPI_FAILURE (status)) { - return (status); - } - - break; - - case ACPI_COPY_TYPE_PACKAGE: - - /* - * Build the package object - */ - target_object->type = ACPI_TYPE_PACKAGE; - target_object->package.count = source_object->package.count; - target_object->package.elements = (ACPI_OBJECT *) info->free_space; - - /* - * Pass the new package object back to the package walk routine - */ - state->pkg.this_target_obj = target_object; - - /* - * Save space for the array of objects (Package elements) - * update the buffer length counter - */ - object_space = (u32) ROUND_UP_TO_NATIVE_WORD ( - target_object->package.count * sizeof (ACPI_OBJECT)); - break; - - default: - return (AE_BAD_PARAMETER); - } - - - info->free_space += object_space; - info->length += object_space; - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_copy_ipackage_to_epackage - * - * PARAMETERS: *Internal_object - Pointer to the object we are returning - * *Buffer - Where the object is returned - * *Space_used - Where the object length is returned - * - * RETURN: Status - * - * DESCRIPTION: This function is called to place a package object in a user - * buffer. A package object by definition contains other objects. - * - * The buffer is assumed to have sufficient space for the object. - * The caller must have verified the buffer length needed using the - * Acpi_cm_get_object_size function before calling this function. - * - ******************************************************************************/ - -static ACPI_STATUS -acpi_cm_copy_ipackage_to_epackage ( - ACPI_OPERAND_OBJECT *internal_object, - u8 *buffer, - u32 *space_used) -{ - ACPI_OBJECT *external_object; - ACPI_STATUS status; - ACPI_PKG_INFO info; - - - /* - * First package at head of the buffer - */ - external_object = (ACPI_OBJECT *) buffer; - - /* - * Free space begins right after the first package - */ - info.length = 0; - info.object_space = 0; - info.num_packages = 1; - info.free_space = buffer + ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)); - - - external_object->type = internal_object->common.type; - external_object->package.count = internal_object->package.count; - external_object->package.elements = (ACPI_OBJECT *) info.free_space; - - - /* - * Build an array of ACPI_OBJECTS in the buffer - * and move the free space past it - */ - - info.free_space += external_object->package.count * - ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)); - - - status = acpi_cm_walk_package_tree (internal_object, external_object, - acpi_cm_copy_ielement_to_eelement, &info); - - *space_used = info.length; - - return (status); - -} - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_copy_iobject_to_eobject - * - * PARAMETERS: *Internal_object - The internal object to be converted - * *Buffer_ptr - Where the object is returned - * - * RETURN: Status - * - * DESCRIPTION: This function is called to build an API object to be returned to - * the caller. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_copy_iobject_to_eobject ( - ACPI_OPERAND_OBJECT *internal_object, - ACPI_BUFFER *ret_buffer) -{ - ACPI_STATUS status; - - - if (IS_THIS_OBJECT_TYPE (internal_object, ACPI_TYPE_PACKAGE)) { - /* - * Package object: Copy all subobjects (including - * nested packages) - */ - status = acpi_cm_copy_ipackage_to_epackage (internal_object, - ret_buffer->pointer, &ret_buffer->length); - } - - else { - /* - * Build a simple object (no nested objects) - */ - status = acpi_cm_copy_isimple_to_esimple (internal_object, - (ACPI_OBJECT *) ret_buffer->pointer, - ((u8 *) ret_buffer->pointer + - ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT))), - &ret_buffer->length); - /* - * build simple does not include the object size in the length - * so we add it in here - */ - ret_buffer->length += sizeof (ACPI_OBJECT); - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_copy_esimple_to_isimple - * - * PARAMETERS: *External_object - The external object to be converted - * *Internal_object - Where the internal object is returned - * - * RETURN: Status - * - * DESCRIPTION: This function copies an external object to an internal one. - * NOTE: Pointers can be copied, we don't need to copy data. - * (The pointers have to be valid in our address space no matter - * what we do with them!) - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_copy_esimple_to_isimple ( - ACPI_OBJECT *external_object, - ACPI_OPERAND_OBJECT *internal_object) -{ - - - internal_object->common.type = (u8) external_object->type; - - switch (external_object->type) { - - case ACPI_TYPE_STRING: - - internal_object->string.length = external_object->string.length; - internal_object->string.pointer = external_object->string.pointer; - break; - - - case ACPI_TYPE_BUFFER: - - internal_object->buffer.length = external_object->buffer.length; - internal_object->buffer.pointer = external_object->buffer.pointer; - break; - - - case ACPI_TYPE_INTEGER: - /* - * Number is included in the object itself - */ - internal_object->integer.value = external_object->integer.value; - break; - - - default: - return (AE_CTRL_RETURN_VALUE); - break; - } - - - return (AE_OK); -} - - -#ifdef ACPI_FUTURE_IMPLEMENTATION - -/* Code to convert packages that are parameters to control methods */ - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_copy_epackage_to_ipackage - * - * PARAMETERS: *Internal_object - Pointer to the object we are returning - * *Buffer - Where the object is returned - * *Space_used - Where the length of the object is returned - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: This function is called to place a package object in a user - * buffer. A package object by definition contains other objects. - * - * The buffer is assumed to have sufficient space for the object. - * The caller must have verified the buffer length needed using the - * Acpi_cm_get_object_size function before calling this function. - * - ******************************************************************************/ - -static ACPI_STATUS -acpi_cm_copy_epackage_to_ipackage ( - ACPI_OPERAND_OBJECT *internal_object, - u8 *buffer, - u32 *space_used) -{ - u8 *free_space; - ACPI_OBJECT *external_object; - u32 length = 0; - u32 this_index; - u32 object_space = 0; - ACPI_OPERAND_OBJECT *this_internal_obj; - ACPI_OBJECT *this_external_obj; - - - /* - * First package at head of the buffer - */ - external_object = (ACPI_OBJECT *)buffer; - - /* - * Free space begins right after the first package - */ - free_space = buffer + sizeof(ACPI_OBJECT); - - - external_object->type = internal_object->common.type; - external_object->package.count = internal_object->package.count; - external_object->package.elements = (ACPI_OBJECT *)free_space; - - - /* - * Build an array of ACPI_OBJECTS in the buffer - * and move the free space past it - */ - - free_space += external_object->package.count * sizeof(ACPI_OBJECT); - - - /* Call Walk_package */ - -} - -#endif /* Future implementation */ - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_copy_eobject_to_iobject - * - * PARAMETERS: *Internal_object - The external object to be converted - * *Buffer_ptr - Where the internal object is returned - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: Converts an external object to an internal object. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_copy_eobject_to_iobject ( - ACPI_OBJECT *external_object, - ACPI_OPERAND_OBJECT *internal_object) -{ - ACPI_STATUS status; - - - if (external_object->type == ACPI_TYPE_PACKAGE) { - /* - * Package objects contain other objects (which can be objects) - * buildpackage does it all - * - * TBD: Package conversion must be completed and tested - * NOTE: this code converts packages as input parameters to - * control methods only. This is a very, very rare case. - */ -/* - Status = Acpi_cm_copy_epackage_to_ipackage(Internal_object, - Ret_buffer->Pointer, - &Ret_buffer->Length); -*/ - return (AE_NOT_IMPLEMENTED); - } - - else { - /* - * Build a simple object (no nested objects) - */ - status = acpi_cm_copy_esimple_to_isimple (external_object, internal_object); - /* - * build simple does not include the object size in the length - * so we add it in here - */ - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_copy_ielement_to_ielement - * - * PARAMETERS: ACPI_PKG_CALLBACK - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: Copy one package element to another package element - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_copy_ielement_to_ielement ( - u8 object_type, - ACPI_OPERAND_OBJECT *source_object, - ACPI_GENERIC_STATE *state, - void *context) -{ - ACPI_STATUS status = AE_OK; - u32 this_index; - ACPI_OPERAND_OBJECT **this_target_ptr; - ACPI_OPERAND_OBJECT *target_object; - - - this_index = state->pkg.index; - this_target_ptr = (ACPI_OPERAND_OBJECT **) - &state->pkg.dest_object->package.elements[this_index]; - - switch (object_type) { - case 0: - - /* - * This is a simple object, just copy it - */ - target_object = acpi_cm_create_internal_object (source_object->common.type); - if (!target_object) { - return (AE_NO_MEMORY); - } - - status = acpi_aml_store_object_to_object (source_object, target_object, - (ACPI_WALK_STATE *) context); - if (ACPI_FAILURE (status)) { - return (status); - } - - *this_target_ptr = target_object; - break; - - - case 1: - /* - * This object is a package - go down another nesting level - * Create and build the package object - */ - target_object = acpi_cm_create_internal_object (ACPI_TYPE_PACKAGE); - if (!target_object) { - /* TBD: must delete package created up to this point */ - - return (AE_NO_MEMORY); - } - - target_object->package.count = source_object->package.count; - - /* - * Pass the new package object back to the package walk routine - */ - state->pkg.this_target_obj = target_object; - - /* - * Store the object pointer in the parent package object - */ - *this_target_ptr = target_object; - break; - - default: - return (AE_BAD_PARAMETER); - } - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_copy_ipackage_to_ipackage - * - * PARAMETERS: *Source_obj - Pointer to the source package object - * *Dest_obj - Where the internal object is returned - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: This function is called to copy an internal package object - * into another internal package object. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_copy_ipackage_to_ipackage ( - ACPI_OPERAND_OBJECT *source_obj, - ACPI_OPERAND_OBJECT *dest_obj, - ACPI_WALK_STATE *walk_state) -{ - ACPI_STATUS status = AE_OK; - - - dest_obj->common.type = source_obj->common.type; - dest_obj->package.count = source_obj->package.count; - - - /* - * Create the object array and walk the source package tree - */ - - dest_obj->package.elements = acpi_cm_callocate ((source_obj->package.count + 1) * - sizeof (void *)); - dest_obj->package.next_element = dest_obj->package.elements; - - if (!dest_obj->package.elements) { - REPORT_ERROR ( - ("Aml_build_copy_internal_package_object: Package allocation failure\n")); - return (AE_NO_MEMORY); - } - - - status = acpi_cm_walk_package_tree (source_obj, dest_obj, - acpi_cm_copy_ielement_to_ielement, walk_state); - - return (status); -} - diff --git a/reactos/drivers/bus/acpi/utils/cmdebug.c b/reactos/drivers/bus/acpi/utils/cmdebug.c deleted file mode 100644 index afcb0ece698..00000000000 --- a/reactos/drivers/bus/acpi/utils/cmdebug.c +++ /dev/null @@ -1,555 +0,0 @@ -/****************************************************************************** - * - * Module Name: cmdebug - Debug print routines - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_UTILITIES - MODULE_NAME ("cmdebug") - - -/***************************************************************************** - * - * FUNCTION: Get/Set debug level - * - * DESCRIPTION: Get or set value of the debug flag - * - * These are used to allow user's to get/set the debug level - * - ****************************************************************************/ - - -u32 -get_debug_level (void) -{ - - return (acpi_dbg_level); -} - -void -set_debug_level ( - u32 new_debug_level) -{ - - acpi_dbg_level = new_debug_level; -} - - -/***************************************************************************** - * - * FUNCTION: Function_trace - * - * PARAMETERS: Module_name - Caller's module name (for error output) - * Line_number - Caller's line number (for error output) - * Component_id - Caller's component ID (for error output) - * Function_name - Name of Caller's function - * - * RETURN: None - * - * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is - * set in Debug_level - * - ****************************************************************************/ - -void -function_trace ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name) -{ - - acpi_gbl_nesting_level++; - - debug_print (module_name, line_number, component_id, - TRACE_FUNCTIONS, - " %2.2ld Entered Function: %s\n", - acpi_gbl_nesting_level, function_name); -} - - -/***************************************************************************** - * - * FUNCTION: Function_trace_ptr - * - * PARAMETERS: Module_name - Caller's module name (for error output) - * Line_number - Caller's line number (for error output) - * Component_id - Caller's component ID (for error output) - * Function_name - Name of Caller's function - * Pointer - Pointer to display - * - * RETURN: None - * - * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is - * set in Debug_level - * - ****************************************************************************/ - -void -function_trace_ptr ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name, - void *pointer) -{ - - acpi_gbl_nesting_level++; - debug_print (module_name, line_number, component_id, TRACE_FUNCTIONS, - " %2.2ld Entered Function: %s, %p\n", - acpi_gbl_nesting_level, function_name, pointer); -} - - -/***************************************************************************** - * - * FUNCTION: Function_trace_str - * - * PARAMETERS: Module_name - Caller's module name (for error output) - * Line_number - Caller's line number (for error output) - * Component_id - Caller's component ID (for error output) - * Function_name - Name of Caller's function - * String - Additional string to display - * - * RETURN: None - * - * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is - * set in Debug_level - * - ****************************************************************************/ - -void -function_trace_str ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name, - NATIVE_CHAR *string) -{ - - acpi_gbl_nesting_level++; - debug_print (module_name, line_number, component_id, TRACE_FUNCTIONS, - " %2.2ld Entered Function: %s, %s\n", - acpi_gbl_nesting_level, function_name, string); -} - - -/***************************************************************************** - * - * FUNCTION: Function_trace_u32 - * - * PARAMETERS: Module_name - Caller's module name (for error output) - * Line_number - Caller's line number (for error output) - * Component_id - Caller's component ID (for error output) - * Function_name - Name of Caller's function - * Integer - Integer to display - * - * RETURN: None - * - * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is - * set in Debug_level - * - ****************************************************************************/ - -void -function_trace_u32 ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name, - u32 integer) -{ - - acpi_gbl_nesting_level++; - debug_print (module_name, line_number, component_id, TRACE_FUNCTIONS, - " %2.2ld Entered Function: %s, %lX\n", - acpi_gbl_nesting_level, function_name, integer); -} - - -/***************************************************************************** - * - * FUNCTION: Function_exit - * - * PARAMETERS: Module_name - Caller's module name (for error output) - * Line_number - Caller's line number (for error output) - * Component_id - Caller's component ID (for error output) - * Function_name - Name of Caller's function - * - * RETURN: None - * - * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is - * set in Debug_level - * - ****************************************************************************/ - -void -function_exit ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name) -{ - - debug_print (module_name, line_number, component_id, TRACE_FUNCTIONS, - " %2.2ld Exiting Function: %s\n", - acpi_gbl_nesting_level, function_name); - - acpi_gbl_nesting_level--; -} - - -/***************************************************************************** - * - * FUNCTION: Function_status_exit - * - * PARAMETERS: Module_name - Caller's module name (for error output) - * Line_number - Caller's line number (for error output) - * Component_id - Caller's component ID (for error output) - * Function_name - Name of Caller's function - * Status - Exit status code - * - * RETURN: None - * - * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is - * set in Debug_level. Prints exit status also. - * - ****************************************************************************/ - -void -function_status_exit ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name, - ACPI_STATUS status) -{ - - debug_print (module_name, line_number, component_id, - TRACE_FUNCTIONS, - " %2.2ld Exiting Function: %s, %s\n", - acpi_gbl_nesting_level, - function_name, - acpi_cm_format_exception (status)); - - acpi_gbl_nesting_level--; -} - - -/***************************************************************************** - * - * FUNCTION: Function_value_exit - * - * PARAMETERS: Module_name - Caller's module name (for error output) - * Line_number - Caller's line number (for error output) - * Component_id - Caller's component ID (for error output) - * Function_name - Name of Caller's function - * Value - Value to be printed with exit msg - * - * RETURN: None - * - * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is - * set in Debug_level. Prints exit value also. - * - ****************************************************************************/ - -void -function_value_exit ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name, - ACPI_INTEGER value) -{ - - debug_print (module_name, line_number, component_id, TRACE_FUNCTIONS, - " %2.2ld Exiting Function: %s, %X\n", - acpi_gbl_nesting_level, function_name, value); - - acpi_gbl_nesting_level--; -} - - -/***************************************************************************** - * - * FUNCTION: Function_ptr_exit - * - * PARAMETERS: Module_name - Caller's module name (for error output) - * Line_number - Caller's line number (for error output) - * Component_id - Caller's component ID (for error output) - * Function_name - Name of Caller's function - * Value - Value to be printed with exit msg - * - * RETURN: None - * - * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is - * set in Debug_level. Prints exit value also. - * - ****************************************************************************/ - -void -function_ptr_exit ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - NATIVE_CHAR *function_name, - u8 *ptr) -{ - - debug_print (module_name, line_number, component_id, TRACE_FUNCTIONS, - " %2.2ld Exiting Function: %s, %p\n", - acpi_gbl_nesting_level, function_name, ptr); - - acpi_gbl_nesting_level--; -} - - -/***************************************************************************** - * - * FUNCTION: Debug_print - * - * PARAMETERS: Module_name - Caller's module name (for error output) - * Line_number - Caller's line number (for error output) - * Component_id - Caller's component ID (for error output) - * Print_level - Requested debug print level - * Format - Printf format field - * ... - Optional printf arguments - * - * RETURN: None - * - * DESCRIPTION: Print error message with prefix consisting of the module name, - * line number, and component ID. - * - ****************************************************************************/ - -void -debug_print ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - u32 print_level, - NATIVE_CHAR *format, - ...) -{ - va_list args; - - - /* Both the level and the component must be enabled */ - - if ((print_level & acpi_dbg_level) && - (component_id & acpi_dbg_layer)) { - va_start (args, format); - - acpi_os_printf ("%8s-%04d: ", module_name, line_number); - acpi_os_vprintf (format, args); - } -} - - -/***************************************************************************** - * - * FUNCTION: Debug_print_prefix - * - * PARAMETERS: Module_name - Caller's module name (for error output) - * Line_number - Caller's line number (for error output) - * Component_id - Caller's component ID (for error output) - * - * RETURN: None - * - * DESCRIPTION: Print the prefix part of an error message, consisting of the - * module name, and line number - * - ****************************************************************************/ - -void -debug_print_prefix ( - NATIVE_CHAR *module_name, - u32 line_number) -{ - - - acpi_os_printf ("%8s-%04d: ", module_name, line_number); -} - - -/***************************************************************************** - * - * FUNCTION: Debug_print_raw - * - * PARAMETERS: Format - Printf format field - * ... - Optional printf arguments - * - * RETURN: None - * - * DESCRIPTION: Print error message -- without module/line indentifiers - * - ****************************************************************************/ - -void -debug_print_raw ( - NATIVE_CHAR *format, - ...) -{ - va_list args; - - - va_start (args, format); - - acpi_os_vprintf (format, args); - - va_end (args); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_cm_dump_buffer - * - * PARAMETERS: Buffer - Buffer to dump - * Count - Amount to dump, in bytes - * Component_iD - Caller's component ID - * - * RETURN: None - * - * DESCRIPTION: Generic dump buffer in both hex and ascii. - * - ****************************************************************************/ - -void -acpi_cm_dump_buffer ( - u8 *buffer, - u32 count, - u32 display, - u32 component_id) -{ - u32 i = 0; - u32 j; - u32 temp32; - u8 buf_char; - - - /* Only dump the buffer if tracing is enabled */ - - if (!((TRACE_TABLES & acpi_dbg_level) && - (component_id & acpi_dbg_layer))) { - return; - } - - - /* - * Nasty little dump buffer routine! - */ - while (i < count) { - /* Print current offset */ - - acpi_os_printf ("%05X ", i); - - - /* Print 16 hex chars */ - - for (j = 0; j < 16;) { - if (i + j >= count) { - acpi_os_printf ("\n"); - return; - } - - /* Make sure that the s8 doesn't get sign-extended! */ - - switch (display) { - /* Default is BYTE display */ - - default: - - acpi_os_printf ("%02X ", - *((u8 *) &buffer[i + j])); - j += 1; - break; - - - case DB_WORD_DISPLAY: - - MOVE_UNALIGNED16_TO_32 (&temp32, - &buffer[i + j]); - acpi_os_printf ("%04X ", temp32); - j += 2; - break; - - - case DB_DWORD_DISPLAY: - - MOVE_UNALIGNED32_TO_32 (&temp32, - &buffer[i + j]); - acpi_os_printf ("%08X ", temp32); - j += 4; - break; - - - case DB_QWORD_DISPLAY: - - MOVE_UNALIGNED32_TO_32 (&temp32, - &buffer[i + j]); - acpi_os_printf ("%08X", temp32); - - MOVE_UNALIGNED32_TO_32 (&temp32, - &buffer[i + j + 4]); - acpi_os_printf ("%08X ", temp32); - j += 8; - break; - } - } - - - /* - * Print the ASCII equivalent characters - * But watch out for the bad unprintable ones... - */ - - for (j = 0; j < 16; j++) { - if (i + j >= count) { - acpi_os_printf ("\n"); - return; - } - - buf_char = buffer[i + j]; - if ((buf_char > 0x1F && buf_char < 0x2E) || - (buf_char > 0x2F && buf_char < 0x61) || - (buf_char > 0x60 && buf_char < 0x7F)) { - acpi_os_printf ("%c", buf_char); - } - else { - acpi_os_printf ("."); - } - } - - /* Done with that line. */ - - acpi_os_printf ("\n"); - i += 16; - } - - return; -} - - diff --git a/reactos/drivers/bus/acpi/utils/cmdelete.c b/reactos/drivers/bus/acpi/utils/cmdelete.c deleted file mode 100644 index a0fc962944a..00000000000 --- a/reactos/drivers/bus/acpi/utils/cmdelete.c +++ /dev/null @@ -1,585 +0,0 @@ -/******************************************************************************* - * - * Module Name: cmdelete - object deletion and reference count utilities - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_UTILITIES - MODULE_NAME ("cmdelete") - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_delete_internal_obj - * - * PARAMETERS: *Object - Pointer to the list to be deleted - * - * RETURN: None - * - * DESCRIPTION: Low level object deletion, after reference counts have been - * updated (All reference counts, including sub-objects!) - * - ******************************************************************************/ - -void -acpi_cm_delete_internal_obj ( - ACPI_OPERAND_OBJECT *object) -{ - void *obj_pointer = NULL; - ACPI_OPERAND_OBJECT *handler_desc; - - - if (!object) { - return; - } - - /* - * Must delete or free any pointers within the object that are not - * actual ACPI objects (for example, a raw buffer pointer). - */ - - switch (object->common.type) { - - case ACPI_TYPE_STRING: - - /* Free the actual string buffer */ - - obj_pointer = object->string.pointer; - break; - - - case ACPI_TYPE_BUFFER: - - /* Free the actual buffer */ - - obj_pointer = object->buffer.pointer; - break; - - - case ACPI_TYPE_PACKAGE: - - /* - * Elements of the package are not handled here, they are deleted - * separately - */ - - /* Free the (variable length) element pointer array */ - - obj_pointer = object->package.elements; - break; - - - case ACPI_TYPE_MUTEX: - - acpi_aml_unlink_mutex (object); - acpi_os_delete_semaphore (object->mutex.semaphore); - break; - - - case ACPI_TYPE_EVENT: - - acpi_os_delete_semaphore (object->event.semaphore); - object->event.semaphore = NULL; - break; - - - case ACPI_TYPE_METHOD: - - /* Delete the method semaphore if it exists */ - - if (object->method.semaphore) { - acpi_os_delete_semaphore (object->method.semaphore); - object->method.semaphore = NULL; - } - - break; - - - case ACPI_TYPE_REGION: - - - if (object->region.extra) { - /* - * Free the Region_context if and only if the handler is one of the - * default handlers -- and therefore, we created the context object - * locally, it was not created by an external caller. - */ - handler_desc = object->region.addr_handler; - if ((handler_desc) && - (handler_desc->addr_handler.hflags == ADDR_HANDLER_DEFAULT_INSTALLED)) { - obj_pointer = object->region.extra->extra.region_context; - } - - /* Now we can free the Extra object */ - - acpi_cm_delete_object_desc (object->region.extra); - } - break; - - - case ACPI_TYPE_FIELD_UNIT: - - if (object->field_unit.extra) { - acpi_cm_delete_object_desc (object->field_unit.extra); - } - break; - - default: - break; - } - - - /* - * Delete any allocated memory found above - */ - - if (obj_pointer) { - if (!acpi_tb_system_table_pointer (obj_pointer)) { - acpi_cm_free (obj_pointer); - } - } - - - /* Only delete the object if it was dynamically allocated */ - - - if (!(object->common.flags & AOPOBJ_STATIC_ALLOCATION)) { - acpi_cm_delete_object_desc (object); - - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_delete_internal_object_list - * - * PARAMETERS: *Obj_list - Pointer to the list to be deleted - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: This function deletes an internal object list, including both - * simple objects and package objects - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_delete_internal_object_list ( - ACPI_OPERAND_OBJECT **obj_list) -{ - ACPI_OPERAND_OBJECT **internal_obj; - - - /* Walk the null-terminated internal list */ - - for (internal_obj = obj_list; *internal_obj; internal_obj++) { - /* - * Check for a package - * Simple objects are simply stored in the array and do not - * need to be deleted separately. - */ - - if (IS_THIS_OBJECT_TYPE ((*internal_obj), ACPI_TYPE_PACKAGE)) { - /* Delete the package */ - - /* - * TBD: [Investigate] This might not be the right thing to do, - * depending on how the internal package object was allocated!!! - */ - acpi_cm_delete_internal_obj (*internal_obj); - } - - } - - /* Free the combined parameter pointer list and object array */ - - acpi_cm_free (obj_list); - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_update_ref_count - * - * PARAMETERS: *Object - Object whose ref count is to be updated - * Action - What to do - * - * RETURN: New ref count - * - * DESCRIPTION: Modify the ref count and return it. - * - ******************************************************************************/ - -static void -acpi_cm_update_ref_count ( - ACPI_OPERAND_OBJECT *object, - u32 action) -{ - u16 count; - u16 new_count; - - - if (!object) { - return; - } - - - count = object->common.reference_count; - new_count = count; - - /* - * Reference count action (increment, decrement, or force delete) - */ - - switch (action) { - - case REF_INCREMENT: - - new_count++; - object->common.reference_count = new_count; - - break; - - - case REF_DECREMENT: - - if (count < 1) { - new_count = 0; - } - - else { - new_count--; - - } - - - object->common.reference_count = new_count; - if (new_count == 0) { - acpi_cm_delete_internal_obj (object); - } - - break; - - - case REF_FORCE_DELETE: - - new_count = 0; - object->common.reference_count = new_count; - acpi_cm_delete_internal_obj (object); - break; - - - default: - - break; - } - - - /* - * Sanity check the reference count, for debug purposes only. - * (A deleted object will have a huge reference count) - */ - - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_update_object_reference - * - * PARAMETERS: *Object - Increment ref count for this object - * and all sub-objects - * Action - Either REF_INCREMENT or REF_DECREMENT or - * REF_FORCE_DELETE - * - * RETURN: Status - * - * DESCRIPTION: Increment the object reference count - * - * Object references are incremented when: - * 1) An object is attached to a Node (namespace object) - * 2) An object is copied (all subobjects must be incremented) - * - * Object references are decremented when: - * 1) An object is detached from an Node - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_update_object_reference ( - ACPI_OPERAND_OBJECT *object, - u16 action) -{ - ACPI_STATUS status; - u32 i; - ACPI_OPERAND_OBJECT *next; - ACPI_OPERAND_OBJECT *new; - ACPI_GENERIC_STATE *state_list = NULL; - ACPI_GENERIC_STATE *state; - - - /* Ignore a null object ptr */ - - if (!object) { - return (AE_OK); - } - - - /* - * Make sure that this isn't a namespace handle or an AML pointer - */ - - if (VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_NAMED)) { - return (AE_OK); - } - - if (acpi_tb_system_table_pointer (object)) { - return (AE_OK); - } - - - state = acpi_cm_create_update_state (object, action); - - while (state) { - - object = state->update.object; - action = state->update.value; - acpi_cm_delete_generic_state (state); - - /* - * All sub-objects must have their reference count incremented also. - * Different object types have different subobjects. - */ - switch (object->common.type) { - - case ACPI_TYPE_DEVICE: - - status = acpi_cm_create_update_state_and_push (object->device.addr_handler, - action, &state_list); - if (ACPI_FAILURE (status)) { - return (status); - } - - acpi_cm_update_ref_count (object->device.sys_handler, action); - acpi_cm_update_ref_count (object->device.drv_handler, action); - break; - - - case INTERNAL_TYPE_ADDRESS_HANDLER: - - /* Must walk list of address handlers */ - - next = object->addr_handler.next; - while (next) { - new = next->addr_handler.next; - acpi_cm_update_ref_count (next, action); - - next = new; - } - break; - - - case ACPI_TYPE_PACKAGE: - - /* - * We must update all the sub-objects of the package - * (Each of whom may have their own sub-objects, etc. - */ - for (i = 0; i < object->package.count; i++) { - /* - * Push each element onto the stack for later processing. - * Note: There can be null elements within the package, - * these are simply ignored - */ - - status = acpi_cm_create_update_state_and_push ( - object->package.elements[i], action, &state_list); - if (ACPI_FAILURE (status)) { - return (status); - } - } - break; - - - case ACPI_TYPE_FIELD_UNIT: - - status = acpi_cm_create_update_state_and_push ( - object->field_unit.container, action, &state_list); - - if (ACPI_FAILURE (status)) { - return (status); - } - break; - - - case INTERNAL_TYPE_DEF_FIELD: - - status = acpi_cm_create_update_state_and_push ( - object->field.container, action, &state_list); - if (ACPI_FAILURE (status)) { - return (status); - } - break; - - - case INTERNAL_TYPE_BANK_FIELD: - - status = acpi_cm_create_update_state_and_push ( - object->bank_field.bank_select, action, &state_list); - if (ACPI_FAILURE (status)) { - return (status); - } - - status = acpi_cm_create_update_state_and_push ( - object->bank_field.container, action, &state_list); - if (ACPI_FAILURE (status)) { - return (status); - } - break; - - - case ACPI_TYPE_REGION: - - /* TBD: [Investigate] - Acpi_cm_update_ref_count (Object->Region.Addr_handler, Action); - */ -/* - Status = - Acpi_cm_create_update_state_and_push (Object->Region.Addr_handler, - Action, &State_list); - if (ACPI_FAILURE (Status)) - { - return (Status); - } -*/ - break; - - - case INTERNAL_TYPE_REFERENCE: - - break; - } - - - /* - * Now we can update the count in the main object. This can only - * happen after we update the sub-objects in case this causes the - * main object to be deleted. - */ - - acpi_cm_update_ref_count (object, action); - - - /* Move on to the next object to be updated */ - - state = acpi_cm_pop_generic_state (&state_list); - } - - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_add_reference - * - * PARAMETERS: *Object - Object whose reference count is to be - * incremented - * - * RETURN: None - * - * DESCRIPTION: Add one reference to an ACPI object - * - ******************************************************************************/ - -void -acpi_cm_add_reference ( - ACPI_OPERAND_OBJECT *object) -{ - - - /* - * Ensure that we have a valid object - */ - - if (!acpi_cm_valid_internal_object (object)) { - return; - } - - /* - * We have a valid ACPI internal object, now increment the reference count - */ - - acpi_cm_update_object_reference (object, REF_INCREMENT); - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_remove_reference - * - * PARAMETERS: *Object - Object whose ref count will be decremented - * - * RETURN: None - * - * DESCRIPTION: Decrement the reference count of an ACPI internal object - * - ******************************************************************************/ - -void -acpi_cm_remove_reference ( - ACPI_OPERAND_OBJECT *object) -{ - - - /* - * Ensure that we have a valid object - */ - - if (!acpi_cm_valid_internal_object (object)) { - return; - } - - /* - * Decrement the reference count, and only actually delete the object - * if the reference count becomes 0. (Must also decrement the ref count - * of all subobjects!) - */ - - acpi_cm_update_object_reference (object, REF_DECREMENT); - - return; -} - - diff --git a/reactos/drivers/bus/acpi/utils/cmeval.c b/reactos/drivers/bus/acpi/utils/cmeval.c deleted file mode 100644 index 0ad04066dd0..00000000000 --- a/reactos/drivers/bus/acpi/utils/cmeval.c +++ /dev/null @@ -1,303 +0,0 @@ -/****************************************************************************** - * - * Module Name: cmeval - Object evaluation - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_UTILITIES - MODULE_NAME ("cmeval") - - -/**************************************************************************** - * - * FUNCTION: Acpi_cm_evaluate_numeric_object - * - * PARAMETERS: *Object_name - Object name to be evaluated - * Device_node - Node for the device - * *Address - Where the value is returned - * - * RETURN: Status - * - * DESCRIPTION: evaluates a numeric namespace object for a selected device - * and stores results in *Address. - * - * NOTE: Internal function, no parameter validation - * - ***************************************************************************/ - -ACPI_STATUS -acpi_cm_evaluate_numeric_object ( - NATIVE_CHAR *object_name, - ACPI_NAMESPACE_NODE *device_node, - ACPI_INTEGER *address) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_STATUS status; - - - /* Execute the method */ - - status = acpi_ns_evaluate_relative (device_node, object_name, NULL, &obj_desc); - if (ACPI_FAILURE (status)) { - - return (status); - } - - - /* Did we get a return object? */ - - if (!obj_desc) { - return (AE_TYPE); - } - - /* Is the return object of the correct type? */ - - if (obj_desc->common.type != ACPI_TYPE_INTEGER) { - status = AE_TYPE; - } - else { - /* - * Since the structure is a union, setting any field will set all - * of the variables in the union - */ - *address = obj_desc->integer.value; - } - - /* On exit, we must delete the return object */ - - acpi_cm_remove_reference (obj_desc); - - return (status); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_cm_execute_HID - * - * PARAMETERS: Device_node - Node for the device - * *Hid - Where the HID is returned - * - * RETURN: Status - * - * DESCRIPTION: Executes the _HID control method that returns the hardware - * ID of the device. - * - * NOTE: Internal function, no parameter validation - * - ***************************************************************************/ - -ACPI_STATUS -acpi_cm_execute_HID ( - ACPI_NAMESPACE_NODE *device_node, - DEVICE_ID *hid) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_STATUS status; - - - /* Execute the method */ - - status = acpi_ns_evaluate_relative (device_node, - METHOD_NAME__HID, NULL, &obj_desc); - if (ACPI_FAILURE (status)) { - - - return (status); - } - - /* Did we get a return object? */ - - if (!obj_desc) { - return (AE_TYPE); - } - - /* - * A _HID can return either a Number (32 bit compressed EISA ID) or - * a string - */ - - if ((obj_desc->common.type != ACPI_TYPE_INTEGER) && - (obj_desc->common.type != ACPI_TYPE_STRING)) { - status = AE_TYPE; - } - - else { - if (obj_desc->common.type == ACPI_TYPE_INTEGER) { - /* Convert the Numeric HID to string */ - - acpi_aml_eisa_id_to_string ((u32) obj_desc->integer.value, hid->buffer); - } - - else { - /* Copy the String HID from the returned object */ - - STRNCPY(hid->buffer, obj_desc->string.pointer, sizeof(hid->buffer)); - } - } - - - /* On exit, we must delete the return object */ - - acpi_cm_remove_reference (obj_desc); - - return (status); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_cm_execute_UID - * - * PARAMETERS: Device_node - Node for the device - * *Uid - Where the UID is returned - * - * RETURN: Status - * - * DESCRIPTION: Executes the _UID control method that returns the hardware - * ID of the device. - * - * NOTE: Internal function, no parameter validation - * - ***************************************************************************/ - -ACPI_STATUS -acpi_cm_execute_UID ( - ACPI_NAMESPACE_NODE *device_node, - DEVICE_ID *uid) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_STATUS status; - - - /* Execute the method */ - - status = acpi_ns_evaluate_relative (device_node, - METHOD_NAME__UID, NULL, &obj_desc); - if (ACPI_FAILURE (status)) { - - - return (status); - } - - /* Did we get a return object? */ - - if (!obj_desc) { - return (AE_TYPE); - } - - /* - * A _UID can return either a Number (32 bit compressed EISA ID) or - * a string - */ - - if ((obj_desc->common.type != ACPI_TYPE_INTEGER) && - (obj_desc->common.type != ACPI_TYPE_STRING)) { - status = AE_TYPE; - } - - else { - if (obj_desc->common.type == ACPI_TYPE_INTEGER) { - /* Convert the Numeric UID to string */ - - acpi_aml_unsigned_integer_to_string (obj_desc->integer.value, uid->buffer); - } - - else { - /* Copy the String UID from the returned object */ - - STRNCPY(uid->buffer, obj_desc->string.pointer, sizeof(uid->buffer)); - } - } - - - /* On exit, we must delete the return object */ - - acpi_cm_remove_reference (obj_desc); - - return (status); -} - -/**************************************************************************** - * - * FUNCTION: Acpi_cm_execute_STA - * - * PARAMETERS: Device_node - Node for the device - * *Flags - Where the status flags are returned - * - * RETURN: Status - * - * DESCRIPTION: Executes _STA for selected device and stores results in - * *Flags. - * - * NOTE: Internal function, no parameter validation - * - ***************************************************************************/ - -ACPI_STATUS -acpi_cm_execute_STA ( - ACPI_NAMESPACE_NODE *device_node, - u32 *flags) -{ - ACPI_OPERAND_OBJECT *obj_desc; - ACPI_STATUS status; - - - /* Execute the method */ - - status = acpi_ns_evaluate_relative (device_node, - METHOD_NAME__STA, NULL, &obj_desc); - if (AE_NOT_FOUND == status) { - *flags = 0x0F; - status = AE_OK; - } - - - else /* success */ { - /* Did we get a return object? */ - - if (!obj_desc) { - return (AE_TYPE); - } - - /* Is the return object of the correct type? */ - - if (obj_desc->common.type != ACPI_TYPE_INTEGER) { - status = AE_TYPE; - } - - else { - /* Extract the status flags */ - - *flags = (u32) obj_desc->integer.value; - } - - /* On exit, we must delete the return object */ - - acpi_cm_remove_reference (obj_desc); - } - - return (status); -} diff --git a/reactos/drivers/bus/acpi/utils/cmglobal.c b/reactos/drivers/bus/acpi/utils/cmglobal.c deleted file mode 100644 index a66677ea394..00000000000 --- a/reactos/drivers/bus/acpi/utils/cmglobal.c +++ /dev/null @@ -1,568 +0,0 @@ -/****************************************************************************** - * - * Module Name: cmglobal - Global variables for the ACPI subsystem - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include - - -#define _COMPONENT ACPI_UTILITIES - MODULE_NAME ("cmglobal") - - -/****************************************************************************** - * - * Static global variable initialization. - * - ******************************************************************************/ - -/* - * We want the debug switches statically initialized so they - * are already set when the debugger is entered. - */ - -/* Debug switch - level and trace mask */ - -u32 acpi_dbg_level = NORMAL_DEFAULT; - -/* Debug switch - layer (component) mask */ - -u32 acpi_dbg_layer = ACPI_COMPONENT_DEFAULT; -u32 acpi_gbl_nesting_level = 0; - - -/* Debugger globals */ - -u8 acpi_gbl_db_terminate_threads = FALSE; -u8 acpi_gbl_method_executing = FALSE; - -/* System flags */ - -u32 acpi_gbl_system_flags = 0; -u32 acpi_gbl_startup_flags = 0; - -/* System starts unitialized! */ -u8 acpi_gbl_shutdown = TRUE; - - -u8 acpi_gbl_decode_to8bit [8] = {1,2,4,8,16,32,64,128}; - - -/****************************************************************************** - * - * Namespace globals - * - ******************************************************************************/ - - -/* - * Names built-in to the interpreter - * - * Initial values are currently supported only for types String and Number. - * To avoid type punning, both are specified as strings in this table. - * - * NOTES: - * 1) _SB_ is defined to be a device to allow _SB_/_INI to be run - * during the initialization sequence. - */ - -PREDEFINED_NAMES acpi_gbl_pre_defined_names[] = -{ {"_GPE", INTERNAL_TYPE_DEF_ANY}, - {"_PR_", INTERNAL_TYPE_DEF_ANY}, - {"_SB_", ACPI_TYPE_DEVICE}, - {"_SI_", INTERNAL_TYPE_DEF_ANY}, - {"_TZ_", INTERNAL_TYPE_DEF_ANY}, - {"_REV", ACPI_TYPE_INTEGER, "2"}, - {"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME}, - {"_GL_", ACPI_TYPE_MUTEX, "0"}, - {NULL, ACPI_TYPE_ANY} /* Table terminator */ -}; - - -/* - * Properties of the ACPI Object Types, both internal and external. - * - * Elements of Acpi_ns_properties are bit significant - * and the table is indexed by values of ACPI_OBJECT_TYPE - */ - -u8 acpi_gbl_ns_properties[] = -{ - NSP_NORMAL, /* 00 Any */ - NSP_NORMAL, /* 01 Number */ - NSP_NORMAL, /* 02 String */ - NSP_NORMAL, /* 03 Buffer */ - NSP_LOCAL, /* 04 Package */ - NSP_NORMAL, /* 05 Field_unit */ - NSP_NEWSCOPE | NSP_LOCAL, /* 06 Device */ - NSP_LOCAL, /* 07 Acpi_event */ - NSP_NEWSCOPE | NSP_LOCAL, /* 08 Method */ - NSP_LOCAL, /* 09 Mutex */ - NSP_LOCAL, /* 10 Region */ - NSP_NEWSCOPE | NSP_LOCAL, /* 11 Power */ - NSP_NEWSCOPE | NSP_LOCAL, /* 12 Processor */ - NSP_NEWSCOPE | NSP_LOCAL, /* 13 Thermal */ - NSP_NORMAL, /* 14 Buffer_field */ - NSP_NORMAL, /* 15 Ddb_handle */ - NSP_NORMAL, /* 16 Debug Object */ - NSP_NORMAL, /* 17 Def_field */ - NSP_NORMAL, /* 18 Bank_field */ - NSP_NORMAL, /* 19 Index_field */ - NSP_NORMAL, /* 20 Reference */ - NSP_NORMAL, /* 21 Alias */ - NSP_NORMAL, /* 22 Notify */ - NSP_NORMAL, /* 23 Address Handler */ - NSP_NEWSCOPE | NSP_LOCAL, /* 24 Resource */ - NSP_NORMAL, /* 25 Def_field_defn */ - NSP_NORMAL, /* 26 Bank_field_defn */ - NSP_NORMAL, /* 27 Index_field_defn */ - NSP_NORMAL, /* 28 If */ - NSP_NORMAL, /* 29 Else */ - NSP_NORMAL, /* 30 While */ - NSP_NEWSCOPE, /* 31 Scope */ - NSP_LOCAL, /* 32 Def_any */ - NSP_NORMAL, /* 33 Extra */ - NSP_NORMAL /* 34 Invalid */ -}; - - -/* Hex to ASCII conversion table */ - -NATIVE_CHAR acpi_gbl_hex_to_ascii[] = - {'0','1','2','3','4','5','6','7', - '8','9','A','B','C','D','E','F'}; - - -/****************************************************************************** - * - * Table globals - * - * NOTE: This table includes ONLY the ACPI tables that the subsystem consumes. - * it is NOT an exhaustive list of all possible ACPI tables. All ACPI tables - * that are not used by the subsystem are simply ignored. - * - ******************************************************************************/ - - -ACPI_TABLE_DESC acpi_gbl_acpi_tables[NUM_ACPI_TABLES]; - - -ACPI_TABLE_SUPPORT acpi_gbl_acpi_table_data[NUM_ACPI_TABLES] = -{ - /*********** Name, Signature, Signature size, How many allowed?, Supported? Global typed pointer */ - - /* RSDP 0 */ {RSDP_NAME, RSDP_SIG, sizeof (RSDP_SIG)-1, ACPI_TABLE_SINGLE, AE_OK, NULL}, - /* DSDT 1 */ {DSDT_SIG, DSDT_SIG, sizeof (DSDT_SIG)-1, ACPI_TABLE_SINGLE, AE_OK, (void **) &acpi_gbl_DSDT}, - /* FADT 2 */ {FADT_SIG, FADT_SIG, sizeof (FADT_SIG)-1, ACPI_TABLE_SINGLE, AE_OK, (void **) &acpi_gbl_FADT}, - /* FACS 3 */ {FACS_SIG, FACS_SIG, sizeof (FACS_SIG)-1, ACPI_TABLE_SINGLE, AE_OK, (void **) &acpi_gbl_FACS}, - /* PSDT 4 */ {PSDT_SIG, PSDT_SIG, sizeof (PSDT_SIG)-1, ACPI_TABLE_MULTIPLE, AE_OK, NULL}, - /* SSDT 5 */ {SSDT_SIG, SSDT_SIG, sizeof (SSDT_SIG)-1, ACPI_TABLE_MULTIPLE, AE_OK, NULL}, - /* XSDT 6 */ {XSDT_SIG, XSDT_SIG, sizeof (RSDT_SIG)-1, ACPI_TABLE_SINGLE, AE_OK, NULL}, -}; - -/* - * String versions of the exception codes above - * These strings must match the corresponding defines exactly - */ -NATIVE_CHAR *acpi_gbl_exception_names_env[] = -{ - "AE_OK", - "AE_ERROR", - "AE_NO_ACPI_TABLES", - "AE_NO_NAMESPACE", - "AE_NO_MEMORY", - "AE_NOT_FOUND", - "AE_NOT_EXIST", - "AE_EXIST", - "AE_TYPE", - "AE_NULL_OBJECT", - "AE_NULL_ENTRY", - "AE_BUFFER_OVERFLOW", - "AE_STACK_OVERFLOW", - "AE_STACK_UNDERFLOW", - "AE_NOT_IMPLEMENTED", - "AE_VERSION_MISMATCH", - "AE_SUPPORT", - "AE_SHARE", - "AE_LIMIT", - "AE_TIME", - "AE_UNKNOWN_STATUS", - "AE_ACQUIRE_DEADLOCK", - "AE_RELEASE_DEADLOCK", - "AE_NOT_ACQUIRED", - "AE_ALREADY_ACQUIRED", - "AE_NO_HARDWARE_RESPONSE", - "AE_NO_GLOBAL_LOCK", -}; - -static NATIVE_CHAR *acpi_gbl_exception_names_pgm[] = -{ - "AE_BAD_PARAMETER", - "AE_BAD_CHARACTER", - "AE_BAD_PATHNAME", - "AE_BAD_DATA", - "AE_BAD_ADDRESS", -}; - -static NATIVE_CHAR *acpi_gbl_exception_names_tbl[] = -{ - "AE_BAD_SIGNATURE", - "AE_BAD_HEADER", - "AE_BAD_CHECKSUM", - "AE_BAD_VALUE", -}; - -static NATIVE_CHAR *acpi_gbl_exception_names_aml[] = -{ - "AE_AML_ERROR", - "AE_AML_PARSE", - "AE_AML_BAD_OPCODE", - "AE_AML_NO_OPERAND", - "AE_AML_OPERAND_TYPE", - "AE_AML_OPERAND_VALUE", - "AE_AML_UNINITIALIZED_LOCAL", - "AE_AML_UNINITIALIZED_ARG", - "AE_AML_UNINITIALIZED_ELEMENT", - "AE_AML_NUMERIC_OVERFLOW", - "AE_AML_REGION_LIMIT", - "AE_AML_BUFFER_LIMIT", - "AE_AML_PACKAGE_LIMIT", - "AE_AML_DIVIDE_BY_ZERO", - "AE_AML_BAD_NAME", - "AE_AML_NAME_NOT_FOUND", - "AE_AML_INTERNAL", - "AE_AML_INVALID_SPACE_ID", - "AE_AML_STRING_LIMIT", - "AE_AML_NO_RETURN_VALUE", - "AE_AML_METHOD_LIMIT", - "AE_AML_NOT_OWNER", - "AE_AML_MUTEX_ORDER", - "AE_AML_MUTEX_NOT_ACQUIRED", -}; - -static NATIVE_CHAR *acpi_gbl_exception_names_ctrl[] = -{ - "AE_CTRL_RETURN_VALUE", - "AE_CTRL_PENDING", - "AE_CTRL_TERMINATE", - "AE_CTRL_TRUE", - "AE_CTRL_FALSE", - "AE_CTRL_DEPTH", - "AE_CTRL_END", - "AE_CTRL_TRANSFER", -}; - -/***************************************************************************** - * - * FUNCTION: Acpi_cm_valid_object_type - * - * PARAMETERS: None. - * - * RETURN: TRUE if valid object type - * - * DESCRIPTION: Validate an object type - * - ****************************************************************************/ - -u8 -acpi_cm_valid_object_type ( - u32 type) -{ - - if (type > ACPI_TYPE_MAX) - { - if ((type < INTERNAL_TYPE_BEGIN) || - (type > INTERNAL_TYPE_MAX)) - { - return (FALSE); - } - } - - return (TRUE); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_cm_format_exception - * - * PARAMETERS: Status - Acpi status to be formatted - * - * RETURN: Formatted status string - * - * DESCRIPTION: Convert an ACPI exception to a string - * - ****************************************************************************/ - -NATIVE_CHAR * -acpi_cm_format_exception ( - ACPI_STATUS status) -{ - NATIVE_CHAR *exception = "UNKNOWN_STATUS"; - ACPI_STATUS sub_status; - - - sub_status = (status & ~AE_CODE_MASK); - - - switch (status & AE_CODE_MASK) - { - case AE_CODE_ENVIRONMENTAL: - - if (sub_status <= AE_CODE_ENV_MAX) - { - exception = acpi_gbl_exception_names_env [sub_status]; - } - break; - - case AE_CODE_PROGRAMMER: - - if (sub_status <= AE_CODE_PGM_MAX) - { - exception = acpi_gbl_exception_names_pgm [sub_status -1]; - } - break; - - case AE_CODE_ACPI_TABLES: - - if (sub_status <= AE_CODE_TBL_MAX) - { - exception = acpi_gbl_exception_names_tbl [sub_status -1]; - } - break; - - case AE_CODE_AML: - - if (sub_status <= AE_CODE_AML_MAX) - { - exception = acpi_gbl_exception_names_aml [sub_status -1]; - } - break; - - case AE_CODE_CONTROL: - - if (sub_status <= AE_CODE_CTRL_MAX) - { - exception = acpi_gbl_exception_names_ctrl [sub_status -1]; - } - break; - - default: - break; - } - - - return (exception); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_cm_allocate_owner_id - * - * PARAMETERS: Id_type - Type of ID (method or table) - * - * DESCRIPTION: Allocate a table or method owner id - * - ***************************************************************************/ - -ACPI_OWNER_ID -acpi_cm_allocate_owner_id ( - u32 id_type) -{ - ACPI_OWNER_ID owner_id = 0xFFFF; - - - acpi_cm_acquire_mutex (ACPI_MTX_CACHES); - - switch (id_type) - { - case OWNER_TYPE_TABLE: - - owner_id = acpi_gbl_next_table_owner_id; - acpi_gbl_next_table_owner_id++; - - if (acpi_gbl_next_table_owner_id == FIRST_METHOD_ID) - { - acpi_gbl_next_table_owner_id = FIRST_TABLE_ID; - } - break; - - - case OWNER_TYPE_METHOD: - - owner_id = acpi_gbl_next_method_owner_id; - acpi_gbl_next_method_owner_id++; - - if (acpi_gbl_next_method_owner_id == FIRST_TABLE_ID) - { - acpi_gbl_next_method_owner_id = FIRST_METHOD_ID; - } - break; - } - - - acpi_cm_release_mutex (ACPI_MTX_CACHES); - - return (owner_id); -} - - -/**************************************************************************** - * - * FUNCTION: Acpi_cm_init_globals - * - * PARAMETERS: none - * - * DESCRIPTION: Init library globals. All globals that require specific - * initialization should be initialized here! - * - ***************************************************************************/ - -void -acpi_cm_init_globals ( - void) -{ - u32 i; - - - /* ACPI table structure */ - - for (i = 0; i < NUM_ACPI_TABLES; i++) - { - acpi_gbl_acpi_tables[i].prev = &acpi_gbl_acpi_tables[i]; - acpi_gbl_acpi_tables[i].next = &acpi_gbl_acpi_tables[i]; - acpi_gbl_acpi_tables[i].pointer = NULL; - acpi_gbl_acpi_tables[i].length = 0; - acpi_gbl_acpi_tables[i].allocation = ACPI_MEM_NOT_ALLOCATED; - acpi_gbl_acpi_tables[i].count = 0; - } - - - /* Address Space handler array */ - - for (i = 0; i < ACPI_NUM_ADDRESS_SPACES; i++) - { - acpi_gbl_address_spaces[i].handler = NULL; - acpi_gbl_address_spaces[i].context = NULL; - } - - /* Mutex locked flags */ - - for (i = 0; i < NUM_MTX; i++) - { - acpi_gbl_acpi_mutex_info[i].mutex = NULL; - acpi_gbl_acpi_mutex_info[i].locked = FALSE; - acpi_gbl_acpi_mutex_info[i].use_count = 0; - acpi_gbl_acpi_mutex_info[i].owner_id = 0; - } - - /* Global notify handlers */ - - acpi_gbl_sys_notify.handler = NULL; - acpi_gbl_drv_notify.handler = NULL; - - /* Global "typed" ACPI table pointers */ - - acpi_gbl_RSDP = NULL; - acpi_gbl_XSDT = NULL; - acpi_gbl_FACS = NULL; - acpi_gbl_FADT = NULL; - acpi_gbl_DSDT = NULL; - - - /* Global Lock support */ - - acpi_gbl_global_lock_acquired = FALSE; - acpi_gbl_global_lock_thread_count = 0; - - /* Miscellaneous variables */ - - acpi_gbl_system_flags = 0; - acpi_gbl_startup_flags = 0; - acpi_gbl_rsdp_original_location = 0; - acpi_gbl_cm_single_step = FALSE; - acpi_gbl_db_terminate_threads = FALSE; - acpi_gbl_shutdown = FALSE; - acpi_gbl_ns_lookup_count = 0; - acpi_gbl_ps_find_count = 0; - acpi_gbl_acpi_hardware_present = TRUE; - acpi_gbl_next_table_owner_id = FIRST_TABLE_ID; - acpi_gbl_next_method_owner_id = FIRST_METHOD_ID; - acpi_gbl_debugger_configuration = DEBUGGER_THREADING; - - /* Cache of small "state" objects */ - - acpi_gbl_generic_state_cache = NULL; - acpi_gbl_generic_state_cache_depth = 0; - acpi_gbl_state_cache_requests = 0; - acpi_gbl_state_cache_hits = 0; - - acpi_gbl_parse_cache = NULL; - acpi_gbl_parse_cache_depth = 0; - acpi_gbl_parse_cache_requests = 0; - acpi_gbl_parse_cache_hits = 0; - - acpi_gbl_ext_parse_cache = NULL; - acpi_gbl_ext_parse_cache_depth = 0; - acpi_gbl_ext_parse_cache_requests = 0; - acpi_gbl_ext_parse_cache_hits = 0; - - acpi_gbl_object_cache = NULL; - acpi_gbl_object_cache_depth = 0; - acpi_gbl_object_cache_requests = 0; - acpi_gbl_object_cache_hits = 0; - - acpi_gbl_walk_state_cache = NULL; - acpi_gbl_walk_state_cache_depth = 0; - acpi_gbl_walk_state_cache_requests = 0; - acpi_gbl_walk_state_cache_hits = 0; - - /* Hardware oriented */ - - acpi_gbl_gpe0enable_register_save = NULL; - acpi_gbl_gpe1_enable_register_save = NULL; - acpi_gbl_original_mode = SYS_MODE_UNKNOWN; /* original ACPI/legacy mode */ - acpi_gbl_gpe_registers = NULL; - acpi_gbl_gpe_info = NULL; - - /* Namespace */ - - acpi_gbl_root_node = NULL; - - acpi_gbl_root_node_struct.name = ACPI_ROOT_NAME; - acpi_gbl_root_node_struct.data_type = ACPI_DESC_TYPE_NAMED; - acpi_gbl_root_node_struct.type = ACPI_TYPE_ANY; - acpi_gbl_root_node_struct.child = NULL; - acpi_gbl_root_node_struct.peer = NULL; - acpi_gbl_root_node_struct.object = NULL; - acpi_gbl_root_node_struct.flags = ANOBJ_END_OF_PEER_LIST; - - /* Memory allocation metrics - compiled out in non-debug mode. */ - - INITIALIZE_ALLOCATION_METRICS(); - - return; -} - - diff --git a/reactos/drivers/bus/acpi/utils/cminit.c b/reactos/drivers/bus/acpi/utils/cminit.c deleted file mode 100644 index 42523f8ed3e..00000000000 --- a/reactos/drivers/bus/acpi/utils/cminit.c +++ /dev/null @@ -1,242 +0,0 @@ -/****************************************************************************** - * - * Module Name: cminit - Common ACPI subsystem initialization - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_UTILITIES - MODULE_NAME ("cminit") - - -#define ACPI_OFFSET(d,o) ((NATIVE_INT) &(((d *)0)->o)) -#define ACPI_FADT_OFFSET(o) ACPI_OFFSET (FADT_DESCRIPTOR, o) - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_fadt_register_error - * - * PARAMETERS: *Register_name - Pointer to string identifying register - * Value - Actual register contents value - * Acpi_test_spec_section - TDS section containing assertion - * Acpi_assertion - Assertion number being tested - * - * RETURN: AE_BAD_VALUE - * - * DESCRIPTION: Display failure message and link failure to TDS assertion - * - ******************************************************************************/ - -static ACPI_STATUS -acpi_cm_fadt_register_error ( - NATIVE_CHAR *register_name, - u32 value, - u32 offset) -{ - - REPORT_ERROR ( - ("Invalid FADT value %s=%lX at offset %lX FADT=%p\n", - register_name, value, offset, acpi_gbl_FADT)); - - - return (AE_BAD_VALUE); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_cm_validate_fadt - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Validate various ACPI registers in the FADT - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_validate_fadt ( - void) -{ - ACPI_STATUS status = AE_OK; - - - /* - * Verify Fixed ACPI Description Table fields, - * but don't abort on any problems, just display error - */ - - if (acpi_gbl_FADT->pm1_evt_len < 4) { - status = acpi_cm_fadt_register_error ("PM1_EVT_LEN", - (u32) acpi_gbl_FADT->pm1_evt_len, - ACPI_FADT_OFFSET (pm1_evt_len)); - } - - if (!acpi_gbl_FADT->pm1_cnt_len) { - status = acpi_cm_fadt_register_error ("PM1_CNT_LEN", 0, - ACPI_FADT_OFFSET (pm1_cnt_len)); - } - - if (!ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm1a_evt_blk.address)) { - status = acpi_cm_fadt_register_error ("X_PM1a_EVT_BLK", 0, - ACPI_FADT_OFFSET (Xpm1a_evt_blk.address)); - } - - if (!ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm1a_cnt_blk.address)) { - status = acpi_cm_fadt_register_error ("X_PM1a_CNT_BLK", 0, - ACPI_FADT_OFFSET (Xpm1a_cnt_blk.address)); - } - - if (!ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm_tmr_blk.address)) { - status = acpi_cm_fadt_register_error ("X_PM_TMR_BLK", 0, - ACPI_FADT_OFFSET (Xpm_tmr_blk.address)); - } - - if ((ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xpm2_cnt_blk.address) && - !acpi_gbl_FADT->pm2_cnt_len)) { - status = acpi_cm_fadt_register_error ("PM2_CNT_LEN", - (u32) acpi_gbl_FADT->pm2_cnt_len, - ACPI_FADT_OFFSET (pm2_cnt_len)); - } - - if (acpi_gbl_FADT->pm_tm_len < 4) { - status = acpi_cm_fadt_register_error ("PM_TM_LEN", - (u32) acpi_gbl_FADT->pm_tm_len, - ACPI_FADT_OFFSET (pm_tm_len)); - } - - /* length of GPE blocks must be a multiple of 2 */ - - - if (ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xgpe0blk.address) && - (acpi_gbl_FADT->gpe0blk_len & 1)) { - status = acpi_cm_fadt_register_error ("(x)GPE0_BLK_LEN", - (u32) acpi_gbl_FADT->gpe0blk_len, - ACPI_FADT_OFFSET (gpe0blk_len)); - } - - if (ACPI_VALID_ADDRESS (acpi_gbl_FADT->Xgpe1_blk.address) && - (acpi_gbl_FADT->gpe1_blk_len & 1)) { - status = acpi_cm_fadt_register_error ("(x)GPE1_BLK_LEN", - (u32) acpi_gbl_FADT->gpe1_blk_len, - ACPI_FADT_OFFSET (gpe1_blk_len)); - } - - return (status); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_cm_terminate - * - * PARAMETERS: none - * - * RETURN: none - * - * DESCRIPTION: free memory allocated for table storage. - * - ******************************************************************************/ - -void -acpi_cm_terminate (void) -{ - - - /* Free global tables, etc. */ - - if (acpi_gbl_gpe0enable_register_save) { - acpi_cm_free (acpi_gbl_gpe0enable_register_save); - } - - if (acpi_gbl_gpe1_enable_register_save) { - acpi_cm_free (acpi_gbl_gpe1_enable_register_save); - } - - - return; -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_cm_subsystem_shutdown - * - * PARAMETERS: none - * - * RETURN: none - * - * DESCRIPTION: Shutdown the various subsystems. Don't delete the mutex - * objects here -- because the AML debugger may be still running. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_subsystem_shutdown (void) -{ - - /* Just exit if subsystem is already shutdown */ - - if (acpi_gbl_shutdown) { - return (AE_OK); - } - - /* Subsystem appears active, go ahead and shut it down */ - - acpi_gbl_shutdown = TRUE; - - /* Close the Namespace */ - - acpi_ns_terminate (); - - /* Close the Acpi_event Handling */ - - acpi_ev_terminate (); - - /* Close the globals */ - - acpi_cm_terminate (); - - /* Flush the local cache(s) */ - - acpi_cm_delete_generic_state_cache (); - acpi_cm_delete_object_cache (); - acpi_ds_delete_walk_state_cache (); - - /* Close the Parser */ - - /* TBD: [Restructure] Acpi_ps_terminate () */ - - acpi_ps_delete_parse_cache (); - - /* Debug only - display leftover memory allocation, if any */ -#ifdef ENABLE_DEBUGGER - acpi_cm_dump_current_allocations (ACPI_UINT32_MAX, NULL); -#endif - - return (AE_OK); -} - - diff --git a/reactos/drivers/bus/acpi/utils/cmobject.c b/reactos/drivers/bus/acpi/utils/cmobject.c deleted file mode 100644 index cab18b546a4..00000000000 --- a/reactos/drivers/bus/acpi/utils/cmobject.c +++ /dev/null @@ -1,618 +0,0 @@ -/****************************************************************************** - * - * Module Name: cmobject - ACPI object create/delete/size/cache routines - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - - -#define _COMPONENT ACPI_UTILITIES - MODULE_NAME ("cmobject") - - -/******************************************************************************* - * - * FUNCTION: _Cm_create_internal_object - * - * PARAMETERS: Address - Address of the memory to deallocate - * Component - Component type of caller - * Module - Source file name of caller - * Line - Line number of caller - * Type - ACPI Type of the new object - * - * RETURN: Object - The new object. Null on failure - * - * DESCRIPTION: Create and initialize a new internal object. - * - * NOTE: We always allocate the worst-case object descriptor because - * these objects are cached, and we want them to be - * one-size-satisifies-any-request. This in itself may not be - * the most memory efficient, but the efficiency of the object - * cache should more than make up for this! - * - ******************************************************************************/ - -ACPI_OPERAND_OBJECT * -_cm_create_internal_object ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id, - OBJECT_TYPE_INTERNAL type) -{ - ACPI_OPERAND_OBJECT *object; - - - /* Allocate the raw object descriptor */ - - object = _cm_allocate_object_desc (module_name, line_number, component_id); - if (!object) { - /* Allocation failure */ - - return (NULL); - } - - /* Save the object type in the object descriptor */ - - object->common.type = type; - - /* Init the reference count */ - - object->common.reference_count = 1; - - /* Any per-type initialization should go here */ - - - return (object); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_valid_internal_object - * - * PARAMETERS: Operand - Object to be validated - * - * RETURN: Validate a pointer to be an ACPI_OPERAND_OBJECT - * - ******************************************************************************/ - -u8 -acpi_cm_valid_internal_object ( - void *object) -{ - - /* Check for a null pointer */ - - if (!object) { - return (FALSE); - } - - /* Check for a pointer within one of the ACPI tables */ - - if (acpi_tb_system_table_pointer (object)) { - return (FALSE); - } - - /* Check the descriptor type field */ - - if (!VALID_DESCRIPTOR_TYPE (object, ACPI_DESC_TYPE_INTERNAL)) { - /* Not an ACPI internal object, do some further checking */ - - - - - return (FALSE); - } - - - /* The object appears to be a valid ACPI_OPERAND_OBJECT */ - - return (TRUE); -} - - -/******************************************************************************* - * - * FUNCTION: _Cm_allocate_object_desc - * - * PARAMETERS: Module_name - Caller's module name (for error output) - * Line_number - Caller's line number (for error output) - * Component_id - Caller's component ID (for error output) - * Message - Error message to use on failure - * - * RETURN: Pointer to newly allocated object descriptor. Null on error - * - * DESCRIPTION: Allocate a new object descriptor. Gracefully handle - * error conditions. - * - ******************************************************************************/ - -void * -_cm_allocate_object_desc ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id) -{ - ACPI_OPERAND_OBJECT *object; - - - acpi_cm_acquire_mutex (ACPI_MTX_CACHES); - - acpi_gbl_object_cache_requests++; - - /* Check the cache first */ - - if (acpi_gbl_object_cache) { - /* There is an object available, use it */ - - object = acpi_gbl_object_cache; - acpi_gbl_object_cache = object->cache.next; - object->cache.next = NULL; - - acpi_gbl_object_cache_hits++; - acpi_gbl_object_cache_depth--; - - acpi_cm_release_mutex (ACPI_MTX_CACHES); - } - - else { - /* The cache is empty, create a new object */ - - acpi_cm_release_mutex (ACPI_MTX_CACHES); - - /* Attempt to allocate new descriptor */ - - object = _cm_callocate (sizeof (ACPI_OPERAND_OBJECT), component_id, - module_name, line_number); - if (!object) { - /* Allocation failed */ - - _REPORT_ERROR (module_name, line_number, component_id, - ("Could not allocate an object descriptor\n")); - - return (NULL); - } - - /* Memory allocation metrics - compiled out in non debug mode. */ - - INCREMENT_OBJECT_METRICS (sizeof (ACPI_OPERAND_OBJECT)); - } - - /* Mark the descriptor type */ - - object->common.data_type = ACPI_DESC_TYPE_INTERNAL; - - return (object); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_delete_object_desc - * - * PARAMETERS: Object - Acpi internal object to be deleted - * - * RETURN: None. - * - * DESCRIPTION: Free an ACPI object descriptor or add it to the object cache - * - ******************************************************************************/ - -void -acpi_cm_delete_object_desc ( - ACPI_OPERAND_OBJECT *object) -{ - - - /* Make sure that the object isn't already in the cache */ - - if (object->common.data_type == (ACPI_DESC_TYPE_INTERNAL | ACPI_CACHED_OBJECT)) { - return; - } - - /* Object must be an ACPI_OPERAND_OBJECT */ - - if (object->common.data_type != ACPI_DESC_TYPE_INTERNAL) { - return; - } - - - /* If cache is full, just free this object */ - - if (acpi_gbl_object_cache_depth >= MAX_OBJECT_CACHE_DEPTH) { - /* - * Memory allocation metrics. Call the macro here since we only - * care about dynamically allocated objects. - */ - DECREMENT_OBJECT_METRICS (sizeof (ACPI_OPERAND_OBJECT)); - - acpi_cm_free (object); - return; - } - - acpi_cm_acquire_mutex (ACPI_MTX_CACHES); - - /* Clear the entire object. This is important! */ - - MEMSET (object, 0, sizeof (ACPI_OPERAND_OBJECT)); - object->common.data_type = ACPI_DESC_TYPE_INTERNAL | ACPI_CACHED_OBJECT; - - /* Put the object at the head of the global cache list */ - - object->cache.next = acpi_gbl_object_cache; - acpi_gbl_object_cache = object; - acpi_gbl_object_cache_depth++; - - - acpi_cm_release_mutex (ACPI_MTX_CACHES); - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_delete_object_cache - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Purge the global state object cache. Used during subsystem - * termination. - * - ******************************************************************************/ - -void -acpi_cm_delete_object_cache ( - void) -{ - ACPI_OPERAND_OBJECT *next; - - - /* Traverse the global cache list */ - - while (acpi_gbl_object_cache) { - /* Delete one cached state object */ - - next = acpi_gbl_object_cache->cache.next; - acpi_gbl_object_cache->cache.next = NULL; - - /* - * Memory allocation metrics. Call the macro here since we only - * care about dynamically allocated objects. - */ - DECREMENT_OBJECT_METRICS (sizeof (ACPI_OPERAND_OBJECT)); - - acpi_cm_free (acpi_gbl_object_cache); - acpi_gbl_object_cache = next; - acpi_gbl_object_cache_depth--; - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_init_static_object - * - * PARAMETERS: Obj_desc - Pointer to a "static" object - on stack - * or in the data segment. - * - * RETURN: None. - * - * DESCRIPTION: Initialize a static object. Sets flags to disallow dynamic - * deletion of the object. - * - ******************************************************************************/ - -void -acpi_cm_init_static_object ( - ACPI_OPERAND_OBJECT *obj_desc) -{ - - - if (!obj_desc) { - return; - } - - - /* - * Clear the entire descriptor - */ - MEMSET ((void *) obj_desc, 0, sizeof (ACPI_OPERAND_OBJECT)); - - - /* - * Initialize the header fields - * 1) This is an ACPI_OPERAND_OBJECT descriptor - * 2) The size is the full object (worst case) - * 3) The flags field indicates static allocation - * 4) Reference count starts at one (not really necessary since the - * object can't be deleted, but keeps everything sane) - */ - - obj_desc->common.data_type = ACPI_DESC_TYPE_INTERNAL; - obj_desc->common.flags = AOPOBJ_STATIC_ALLOCATION; - obj_desc->common.reference_count = 1; - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_get_simple_object_size - * - * PARAMETERS: *Internal_object - Pointer to the object we are examining - * *Ret_length - Where the length is returned - * - * RETURN: Status - * - * DESCRIPTION: This function is called to determine the space required to - * contain a simple object for return to an API user. - * - * The length includes the object structure plus any additional - * needed space. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_get_simple_object_size ( - ACPI_OPERAND_OBJECT *internal_object, - u32 *obj_length) -{ - u32 length; - ACPI_STATUS status = AE_OK; - - - /* Handle a null object (Could be a uninitialized package element -- which is legal) */ - - if (!internal_object) { - *obj_length = 0; - return (AE_OK); - } - - - /* Start with the length of the Acpi object */ - - length = sizeof (ACPI_OBJECT); - - if (VALID_DESCRIPTOR_TYPE (internal_object, ACPI_DESC_TYPE_NAMED)) { - /* Object is a named object (reference), just return the length */ - - *obj_length = (u32) ROUND_UP_TO_NATIVE_WORD (length); - return (status); - } - - - /* - * The final length depends on the object type - * Strings and Buffers are packed right up against the parent object and - * must be accessed bytewise or there may be alignment problems on - * certain processors - */ - - switch (internal_object->common.type) { - - case ACPI_TYPE_STRING: - - length += internal_object->string.length + 1; - break; - - - case ACPI_TYPE_BUFFER: - - length += internal_object->buffer.length; - break; - - - case ACPI_TYPE_INTEGER: - case ACPI_TYPE_PROCESSOR: - case ACPI_TYPE_POWER: - - /* - * No extra data for these types - */ - break; - - - case INTERNAL_TYPE_REFERENCE: - - /* - * The only type that should be here is opcode AML_NAMEPATH_OP -- since - * this means an object reference - */ - if (internal_object->reference.opcode != AML_NAMEPATH_OP) { - status = AE_TYPE; - } - - else { - /* - * Get the actual length of the full pathname to this object. - * The reference will be converted to the pathname to the object - */ - length += ROUND_UP_TO_NATIVE_WORD (acpi_ns_get_pathname_length (internal_object->reference.node)); - } - break; - - - default: - - status = AE_TYPE; - break; - } - - - /* - * Account for the space required by the object rounded up to the next - * multiple of the machine word size. This keeps each object aligned - * on a machine word boundary. (preventing alignment faults on some - * machines.) - */ - *obj_length = (u32) ROUND_UP_TO_NATIVE_WORD (length); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_get_element_length - * - * PARAMETERS: ACPI_PKG_CALLBACK - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: Get the length of one package element. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_get_element_length ( - u8 object_type, - ACPI_OPERAND_OBJECT *source_object, - ACPI_GENERIC_STATE *state, - void *context) -{ - ACPI_STATUS status = AE_OK; - ACPI_PKG_INFO *info = (ACPI_PKG_INFO *) context; - u32 object_space; - - - switch (object_type) { - case 0: - - /* - * Simple object - just get the size (Null object/entry is handled - * here also) and sum it into the running package length - */ - status = acpi_cm_get_simple_object_size (source_object, &object_space); - if (ACPI_FAILURE (status)) { - return (status); - } - - info->length += object_space; - break; - - - case 1: - /* Package - nothing much to do here, let the walk handle it */ - - info->num_packages++; - state->pkg.this_target_obj = NULL; - break; - - default: - return (AE_BAD_PARAMETER); - } - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_get_package_object_size - * - * PARAMETERS: *Internal_object - Pointer to the object we are examining - * *Ret_length - Where the length is returned - * - * RETURN: Status - * - * DESCRIPTION: This function is called to determine the space required to - * contain a package object for return to an API user. - * - * This is moderately complex since a package contains other - * objects including packages. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_get_package_object_size ( - ACPI_OPERAND_OBJECT *internal_object, - u32 *obj_length) -{ - ACPI_STATUS status; - ACPI_PKG_INFO info; - - - info.length = 0; - info.object_space = 0; - info.num_packages = 1; - - status = acpi_cm_walk_package_tree (internal_object, NULL, - acpi_cm_get_element_length, &info); - - /* - * We have handled all of the objects in all levels of the package. - * just add the length of the package objects themselves. - * Round up to the next machine word. - */ - info.length += ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)) * - info.num_packages; - - /* Return the total package length */ - - *obj_length = info.length; - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_get_object_size - * - * PARAMETERS: *Internal_object - Pointer to the object we are examining - * *Ret_length - Where the length will be returned - * - * RETURN: Status - * - * DESCRIPTION: This function is called to determine the space required to - * contain an object for return to an API user. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_get_object_size( - ACPI_OPERAND_OBJECT *internal_object, - u32 *obj_length) -{ - ACPI_STATUS status; - - - if ((VALID_DESCRIPTOR_TYPE (internal_object, ACPI_DESC_TYPE_INTERNAL)) && - (IS_THIS_OBJECT_TYPE (internal_object, ACPI_TYPE_PACKAGE))) { - status = acpi_cm_get_package_object_size (internal_object, obj_length); - } - - else { - status = acpi_cm_get_simple_object_size (internal_object, obj_length); - } - - return (status); -} - - diff --git a/reactos/drivers/bus/acpi/utils/cmutils.c b/reactos/drivers/bus/acpi/utils/cmutils.c deleted file mode 100644 index 387c64909b3..00000000000 --- a/reactos/drivers/bus/acpi/utils/cmutils.c +++ /dev/null @@ -1,999 +0,0 @@ -/******************************************************************************* - * - * Module Name: cmutils - common utility procedures - * $Revision: 1.1 $ - * - ******************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_UTILITIES - MODULE_NAME ("cmutils") - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_valid_acpi_name - * - * PARAMETERS: Character - The character to be examined - * - * RETURN: 1 if Character may appear in a name, else 0 - * - * DESCRIPTION: Check for a valid ACPI name. Each character must be one of: - * 1) Upper case alpha - * 2) numeric - * 3) underscore - * - ******************************************************************************/ - -u8 -acpi_cm_valid_acpi_name ( - u32 name) -{ - NATIVE_CHAR *name_ptr = (NATIVE_CHAR *) &name; - u32 i; - - - for (i = 0; i < ACPI_NAME_SIZE; i++) { - if (!((name_ptr[i] == '_') || - (name_ptr[i] >= 'A' && name_ptr[i] <= 'Z') || - (name_ptr[i] >= '0' && name_ptr[i] <= '9'))) { - return (FALSE); - } - } - - - return (TRUE); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_valid_acpi_character - * - * PARAMETERS: Character - The character to be examined - * - * RETURN: 1 if Character may appear in a name, else 0 - * - * DESCRIPTION: Check for a printable character - * - ******************************************************************************/ - -u8 -acpi_cm_valid_acpi_character ( - NATIVE_CHAR character) -{ - - return ((u8) ((character == '_') || - (character >= 'A' && character <= 'Z') || - (character >= '0' && character <= '9'))); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_mutex_initialize - * - * PARAMETERS: None. - * - * RETURN: Status - * - * DESCRIPTION: Create the system mutex objects. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_mutex_initialize ( - void) -{ - u32 i; - ACPI_STATUS status; - - - /* - * Create each of the predefined mutex objects - */ - for (i = 0; i < NUM_MTX; i++) { - status = acpi_cm_create_mutex (i); - if (ACPI_FAILURE (status)) { - return (status); - } - } - - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_mutex_terminate - * - * PARAMETERS: None. - * - * RETURN: None. - * - * DESCRIPTION: Delete all of the system mutex objects. - * - ******************************************************************************/ - -void -acpi_cm_mutex_terminate ( - void) -{ - u32 i; - - - /* - * Delete each predefined mutex object - */ - for (i = 0; i < NUM_MTX; i++) { - acpi_cm_delete_mutex (i); - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_create_mutex - * - * PARAMETERS: Mutex_iD - ID of the mutex to be created - * - * RETURN: Status - * - * DESCRIPTION: Create a mutex object. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_create_mutex ( - ACPI_MUTEX_HANDLE mutex_id) -{ - ACPI_STATUS status = AE_OK; - - - if (mutex_id > MAX_MTX) { - return (AE_BAD_PARAMETER); - } - - - if (!acpi_gbl_acpi_mutex_info[mutex_id].mutex) { - status = acpi_os_create_semaphore (1, 1, - &acpi_gbl_acpi_mutex_info[mutex_id].mutex); - acpi_gbl_acpi_mutex_info[mutex_id].locked = FALSE; - acpi_gbl_acpi_mutex_info[mutex_id].use_count = 0; - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_delete_mutex - * - * PARAMETERS: Mutex_iD - ID of the mutex to be deleted - * - * RETURN: Status - * - * DESCRIPTION: Delete a mutex object. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_delete_mutex ( - ACPI_MUTEX_HANDLE mutex_id) -{ - ACPI_STATUS status; - - - if (mutex_id > MAX_MTX) { - return (AE_BAD_PARAMETER); - } - - - status = acpi_os_delete_semaphore (acpi_gbl_acpi_mutex_info[mutex_id].mutex); - - acpi_gbl_acpi_mutex_info[mutex_id].mutex = NULL; - acpi_gbl_acpi_mutex_info[mutex_id].locked = FALSE; - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_acquire_mutex - * - * PARAMETERS: Mutex_iD - ID of the mutex to be acquired - * - * RETURN: Status - * - * DESCRIPTION: Acquire a mutex object. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_acquire_mutex ( - ACPI_MUTEX_HANDLE mutex_id) -{ - ACPI_STATUS status; - u32 i; - u32 this_thread_id; - - - if (mutex_id > MAX_MTX) { - return (AE_BAD_PARAMETER); - } - - - this_thread_id = acpi_os_get_thread_id (); - - /* - * Deadlock prevention. Check if this thread owns any mutexes of value - * greater than or equal to this one. If so, the thread has violated - * the mutex ordering rule. This indicates a coding error somewhere in - * the ACPI subsystem code. - */ - for (i = mutex_id; i < MAX_MTX; i++) { - if (acpi_gbl_acpi_mutex_info[i].owner_id == this_thread_id) { - if (i == mutex_id) { - return (AE_ALREADY_ACQUIRED); - } - - return (AE_ACQUIRE_DEADLOCK); - } - } - - - status = acpi_os_wait_semaphore (acpi_gbl_acpi_mutex_info[mutex_id].mutex, - 1, WAIT_FOREVER); - - if (ACPI_SUCCESS (status)) { - acpi_gbl_acpi_mutex_info[mutex_id].locked = TRUE; - acpi_gbl_acpi_mutex_info[mutex_id].use_count++; - acpi_gbl_acpi_mutex_info[mutex_id].owner_id = this_thread_id; - } - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_release_mutex - * - * PARAMETERS: Mutex_iD - ID of the mutex to be released - * - * RETURN: Status - * - * DESCRIPTION: Release a mutex object. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_release_mutex ( - ACPI_MUTEX_HANDLE mutex_id) -{ - ACPI_STATUS status; - u32 i; - u32 this_thread_id; - - - if (mutex_id > MAX_MTX) { - return (AE_BAD_PARAMETER); - } - - - /* - * Mutex must be acquired in order to release it! - */ - if (!acpi_gbl_acpi_mutex_info[mutex_id].locked) { - return (AE_NOT_ACQUIRED); - } - - - /* - * Deadlock prevention. Check if this thread owns any mutexes of value - * greater than this one. If so, the thread has violated - * the mutex ordering rule. This indicates a coding error somewhere in - * the ACPI subsystem code. - */ - this_thread_id = acpi_os_get_thread_id (); - for (i = mutex_id; i < MAX_MTX; i++) { - if (acpi_gbl_acpi_mutex_info[i].owner_id == this_thread_id) { - if (i == mutex_id) { - continue; - } - - return (AE_RELEASE_DEADLOCK); - } - } - - acpi_gbl_acpi_mutex_info[mutex_id].locked = FALSE; /* Mark before unlocking */ - acpi_gbl_acpi_mutex_info[mutex_id].owner_id = 0; - - status = acpi_os_signal_semaphore (acpi_gbl_acpi_mutex_info[mutex_id].mutex, 1); - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_create_update_state_and_push - * - * PARAMETERS: *Object - Object to be added to the new state - * Action - Increment/Decrement - * State_list - List the state will be added to - * - * RETURN: None - * - * DESCRIPTION: Create a new state and push it - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_create_update_state_and_push ( - ACPI_OPERAND_OBJECT *object, - u16 action, - ACPI_GENERIC_STATE **state_list) -{ - ACPI_GENERIC_STATE *state; - - - /* Ignore null objects; these are expected */ - - if (!object) { - return (AE_OK); - } - - state = acpi_cm_create_update_state (object, action); - if (!state) { - return (AE_NO_MEMORY); - } - - - acpi_cm_push_generic_state (state_list, state); - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_create_pkg_state_and_push - * - * PARAMETERS: *Object - Object to be added to the new state - * Action - Increment/Decrement - * State_list - List the state will be added to - * - * RETURN: None - * - * DESCRIPTION: Create a new state and push it - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_create_pkg_state_and_push ( - void *internal_object, - void *external_object, - u16 index, - ACPI_GENERIC_STATE **state_list) -{ - ACPI_GENERIC_STATE *state; - - - state = acpi_cm_create_pkg_state (internal_object, external_object, index); - if (!state) { - return (AE_NO_MEMORY); - } - - - acpi_cm_push_generic_state (state_list, state); - return (AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_push_generic_state - * - * PARAMETERS: List_head - Head of the state stack - * State - State object to push - * - * RETURN: Status - * - * DESCRIPTION: Push a state object onto a state stack - * - ******************************************************************************/ - -void -acpi_cm_push_generic_state ( - ACPI_GENERIC_STATE **list_head, - ACPI_GENERIC_STATE *state) -{ - /* Push the state object onto the front of the list (stack) */ - - state->common.next = *list_head; - *list_head = state; - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_pop_generic_state - * - * PARAMETERS: List_head - Head of the state stack - * - * RETURN: Status - * - * DESCRIPTION: Pop a state object from a state stack - * - ******************************************************************************/ - -ACPI_GENERIC_STATE * -acpi_cm_pop_generic_state ( - ACPI_GENERIC_STATE **list_head) -{ - ACPI_GENERIC_STATE *state; - - - /* Remove the state object at the head of the list (stack) */ - - state = *list_head; - if (state) { - /* Update the list head */ - - *list_head = state->common.next; - } - - return (state); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_create_generic_state - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Create a generic state object. Attempt to obtain one from - * the global state cache; If none available, create a new one. - * - ******************************************************************************/ - -ACPI_GENERIC_STATE * -acpi_cm_create_generic_state (void) -{ - ACPI_GENERIC_STATE *state; - - - acpi_cm_acquire_mutex (ACPI_MTX_CACHES); - - acpi_gbl_state_cache_requests++; - - /* Check the cache first */ - - if (acpi_gbl_generic_state_cache) { - /* There is an object available, use it */ - - state = acpi_gbl_generic_state_cache; - acpi_gbl_generic_state_cache = state->common.next; - state->common.next = NULL; - - acpi_gbl_state_cache_hits++; - acpi_gbl_generic_state_cache_depth--; - - acpi_cm_release_mutex (ACPI_MTX_CACHES); - - } - - else { - /* The cache is empty, create a new object */ - - acpi_cm_release_mutex (ACPI_MTX_CACHES); - - state = acpi_cm_callocate (sizeof (ACPI_GENERIC_STATE)); - } - - /* Initialize */ - - if (state) { - /* Always zero out the object before init */ - - MEMSET (state, 0, sizeof (ACPI_GENERIC_STATE)); - - state->common.data_type = ACPI_DESC_TYPE_STATE; - } - - return (state); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_create_update_state - * - * PARAMETERS: Object - Initial Object to be installed in the - * state - * Action - Update action to be performed - * - * RETURN: Status - * - * DESCRIPTION: Create an "Update State" - a flavor of the generic state used - * to update reference counts and delete complex objects such - * as packages. - * - ******************************************************************************/ - -ACPI_GENERIC_STATE * -acpi_cm_create_update_state ( - ACPI_OPERAND_OBJECT *object, - u16 action) -{ - ACPI_GENERIC_STATE *state; - - - /* Create the generic state object */ - - state = acpi_cm_create_generic_state (); - if (!state) { - return (NULL); - } - - /* Init fields specific to the update struct */ - - state->update.object = object; - state->update.value = action; - - return (state); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_create_pkg_state - * - * PARAMETERS: Object - Initial Object to be installed in the - * state - * Action - Update action to be performed - * - * RETURN: Status - * - * DESCRIPTION: Create an "Update State" - a flavor of the generic state used - * to update reference counts and delete complex objects such - * as packages. - * - ******************************************************************************/ - -ACPI_GENERIC_STATE * -acpi_cm_create_pkg_state ( - void *internal_object, - void *external_object, - u16 index) -{ - ACPI_GENERIC_STATE *state; - - - /* Create the generic state object */ - - state = acpi_cm_create_generic_state (); - if (!state) { - return (NULL); - } - - /* Init fields specific to the update struct */ - - state->pkg.source_object = (ACPI_OPERAND_OBJECT *) internal_object; - state->pkg.dest_object = external_object; - state->pkg.index = index; - state->pkg.num_packages = 1; - - return (state); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_create_control_state - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Create a "Control State" - a flavor of the generic state used - * to support nested IF/WHILE constructs in the AML. - * - ******************************************************************************/ - -ACPI_GENERIC_STATE * -acpi_cm_create_control_state ( - void) -{ - ACPI_GENERIC_STATE *state; - - - /* Create the generic state object */ - - state = acpi_cm_create_generic_state (); - if (!state) { - return (NULL); - } - - - /* Init fields specific to the control struct */ - - state->common.state = CONTROL_CONDITIONAL_EXECUTING; - - return (state); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_delete_generic_state - * - * PARAMETERS: State - The state object to be deleted - * - * RETURN: Status - * - * DESCRIPTION: Put a state object back into the global state cache. The object - * is not actually freed at this time. - * - ******************************************************************************/ - -void -acpi_cm_delete_generic_state ( - ACPI_GENERIC_STATE *state) -{ - - /* If cache is full, just free this state object */ - - if (acpi_gbl_generic_state_cache_depth >= MAX_STATE_CACHE_DEPTH) { - acpi_cm_free (state); - } - - /* Otherwise put this object back into the cache */ - - else { - acpi_cm_acquire_mutex (ACPI_MTX_CACHES); - - /* Clear the state */ - - MEMSET (state, 0, sizeof (ACPI_GENERIC_STATE)); - state->common.data_type = ACPI_DESC_TYPE_STATE; - - /* Put the object at the head of the global cache list */ - - state->common.next = acpi_gbl_generic_state_cache; - acpi_gbl_generic_state_cache = state; - acpi_gbl_generic_state_cache_depth++; - - - acpi_cm_release_mutex (ACPI_MTX_CACHES); - } - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_delete_generic_state_cache - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Purge the global state object cache. Used during subsystem - * termination. - * - ******************************************************************************/ - -void -acpi_cm_delete_generic_state_cache ( - void) -{ - ACPI_GENERIC_STATE *next; - - - /* Traverse the global cache list */ - - while (acpi_gbl_generic_state_cache) { - /* Delete one cached state object */ - - next = acpi_gbl_generic_state_cache->common.next; - acpi_cm_free (acpi_gbl_generic_state_cache); - acpi_gbl_generic_state_cache = next; - acpi_gbl_generic_state_cache_depth--; - } - - return; -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_resolve_package_references - * - * PARAMETERS: Obj_desc - The Package object on which to resolve refs - * - * RETURN: Status - * - * DESCRIPTION: Walk through a package and turn internal references into values - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_resolve_package_references ( - ACPI_OPERAND_OBJECT *obj_desc) -{ - u32 count; - ACPI_OPERAND_OBJECT *sub_object; - - - if (obj_desc->common.type != ACPI_TYPE_PACKAGE) { - /* The object must be a package */ - - REPORT_ERROR (("Must resolve Package Refs on a Package\n")); - return(AE_ERROR); - } - - /* - * TBD: what about nested packages? */ - - for (count = 0; count < obj_desc->package.count; count++) { - sub_object = obj_desc->package.elements[count]; - - if (sub_object->common.type == INTERNAL_TYPE_REFERENCE) { - if (sub_object->reference.opcode == AML_ZERO_OP) { - sub_object->common.type = ACPI_TYPE_INTEGER; - sub_object->integer.value = 0; - } - - else if (sub_object->reference.opcode == AML_ONE_OP) { - sub_object->common.type = ACPI_TYPE_INTEGER; - sub_object->integer.value = 1; - } - - else if (sub_object->reference.opcode == AML_ONES_OP) { - sub_object->common.type = ACPI_TYPE_INTEGER; - sub_object->integer.value = ACPI_INTEGER_MAX; - } - } - } - - return(AE_OK); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_cm_walk_package_tree - * - * PARAMETERS: Obj_desc - The Package object on which to resolve refs - * - * RETURN: Status - * - * DESCRIPTION: Walk through a package - * - ******************************************************************************/ - -ACPI_STATUS -acpi_cm_walk_package_tree ( - ACPI_OPERAND_OBJECT *source_object, - void *target_object, - ACPI_PKG_CALLBACK walk_callback, - void *context) -{ - ACPI_STATUS status = AE_OK; - ACPI_GENERIC_STATE *state_list = NULL; - ACPI_GENERIC_STATE *state; - u32 this_index; - ACPI_OPERAND_OBJECT *this_source_obj; - - - state = acpi_cm_create_pkg_state (source_object, target_object, 0); - if (!state) { - return (AE_NO_MEMORY); - } - - while (state) { - this_index = state->pkg.index; - this_source_obj = (ACPI_OPERAND_OBJECT *) - state->pkg.source_object->package.elements[this_index]; - - /* - * Check for - * 1) An uninitialized package element. It is completely - * legal to declare a package and leave it uninitialized - * 2) Not an internal object - can be a namespace node instead - * 3) Any type other than a package. Packages are handled in else - * case below. - */ - if ((!this_source_obj) || - (!VALID_DESCRIPTOR_TYPE ( - this_source_obj, ACPI_DESC_TYPE_INTERNAL)) || - (!IS_THIS_OBJECT_TYPE ( - this_source_obj, ACPI_TYPE_PACKAGE))) { - - status = walk_callback (ACPI_COPY_TYPE_SIMPLE, this_source_obj, - state, context); - if (ACPI_FAILURE (status)) { - /* TBD: must delete package created up to this point */ - - return (status); - } - - state->pkg.index++; - while (state->pkg.index >= state->pkg.source_object->package.count) { - /* - * We've handled all of the objects at this level, This means - * that we have just completed a package. That package may - * have contained one or more packages itself. - * - * Delete this state and pop the previous state (package). - */ - acpi_cm_delete_generic_state (state); - state = acpi_cm_pop_generic_state (&state_list); - - - /* Finished when there are no more states */ - - if (!state) { - /* - * We have handled all of the objects in the top level - * package just add the length of the package objects - * and exit - */ - return (AE_OK); - } - - /* - * Go back up a level and move the index past the just - * completed package object. - */ - state->pkg.index++; - } - } - - else { - /* This is a sub-object of type package */ - - status = walk_callback (ACPI_COPY_TYPE_PACKAGE, this_source_obj, - state, context); - if (ACPI_FAILURE (status)) { - /* TBD: must delete package created up to this point */ - - return (status); - } - - - /* - * The callback above returned a new target package object. - */ - - /* - * Push the current state and create a new one - */ - acpi_cm_push_generic_state (&state_list, state); - state = acpi_cm_create_pkg_state (this_source_obj, - state->pkg.this_target_obj, 0); - if (!state) { - /* TBD: must delete package created up to this point */ - - return (AE_NO_MEMORY); - } - } - } - - /* We should never get here */ - - return (AE_AML_INTERNAL); - -} - - -/******************************************************************************* - * - * FUNCTION: _Report_error - * - * PARAMETERS: Module_name - Caller's module name (for error output) - * Line_number - Caller's line number (for error output) - * Component_id - Caller's component ID (for error output) - * Message - Error message to use on failure - * - * RETURN: None - * - * DESCRIPTION: Print error message - * - ******************************************************************************/ - -void -_report_error ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id) -{ - - - acpi_os_printf ("%8s-%04d: *** Error: ", module_name, line_number); -} - - -/******************************************************************************* - * - * FUNCTION: _Report_warning - * - * PARAMETERS: Module_name - Caller's module name (for error output) - * Line_number - Caller's line number (for error output) - * Component_id - Caller's component ID (for error output) - * Message - Error message to use on failure - * - * RETURN: None - * - * DESCRIPTION: Print warning message - * - ******************************************************************************/ - -void -_report_warning ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id) -{ - - acpi_os_printf ("%8s-%04d: *** Warning: ", module_name, line_number); -} - - -/******************************************************************************* - * - * FUNCTION: _Report_info - * - * PARAMETERS: Module_name - Caller's module name (for error output) - * Line_number - Caller's line number (for error output) - * Component_id - Caller's component ID (for error output) - * Message - Error message to use on failure - * - * RETURN: None - * - * DESCRIPTION: Print information message - * - ******************************************************************************/ - -void -_report_info ( - NATIVE_CHAR *module_name, - u32 line_number, - u32 component_id) -{ - - acpi_os_printf ("%8s-%04d: *** Info: ", module_name, line_number); -} - - diff --git a/reactos/drivers/bus/acpi/utils/cmxface.c b/reactos/drivers/bus/acpi/utils/cmxface.c deleted file mode 100644 index ce5124b487d..00000000000 --- a/reactos/drivers/bus/acpi/utils/cmxface.c +++ /dev/null @@ -1,452 +0,0 @@ -/****************************************************************************** - * - * Module Name: cmxface - External interfaces for "global" ACPI functions - * $Revision: 1.1 $ - * - *****************************************************************************/ - -/* - * Copyright (C) 2000, 2001 R. Byron Moore - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include - -#define _COMPONENT ACPI_UTILITIES - MODULE_NAME ("cmxface") - - -/******************************************************************************* - * - * FUNCTION: Acpi_initialize_subsystem - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Initializes all global variables. This is the first function - * called, so any early initialization belongs here. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_initialize_subsystem ( - void) -{ - ACPI_STATUS status; - - - /* Initialize all globals used by the subsystem */ - - acpi_cm_init_globals (); - - /* Initialize the OS-Dependent layer */ - - status = acpi_os_initialize (); - if (ACPI_FAILURE (status)) { - REPORT_ERROR (("OSD failed to initialize, %s\n", - acpi_cm_format_exception (status))); - return (status); - } - - /* Create the default mutex objects */ - - status = acpi_cm_mutex_initialize (); - if (ACPI_FAILURE (status)) { - REPORT_ERROR (("Global mutex creation failure, %s\n", - acpi_cm_format_exception (status))); - return (status); - } - - /* - * Initialize the namespace manager and - * the root of the namespace tree - */ - - status = acpi_ns_root_initialize (); - if (ACPI_FAILURE (status)) { - REPORT_ERROR (("Namespace initialization failure, %s\n", - acpi_cm_format_exception (status))); - return (status); - } - - - /* If configured, initialize the AML debugger */ - - DEBUGGER_EXEC (acpi_db_initialize ()); - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_enable_subsystem - * - * PARAMETERS: Flags - Init/enable Options - * - * RETURN: Status - * - * DESCRIPTION: Completes the subsystem initialization including hardware. - * Puts system into ACPI mode if it isn't already. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_enable_subsystem ( - u32 flags) -{ - ACPI_STATUS status = AE_OK; - - - /* Sanity check the FADT for valid values */ - - status = acpi_cm_validate_fadt (); - if (ACPI_FAILURE (status)) { - return (status); - } - - /* - * Install the default Op_region handlers. These are - * installed unless other handlers have already been - * installed via the Install_address_space_handler interface - */ - - if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) { - status = acpi_ev_install_default_address_space_handlers (); - if (ACPI_FAILURE (status)) { - return (status); - } - } - - /* - * We must initialize the hardware before we can enable ACPI. - */ - - if (!(flags & ACPI_NO_HARDWARE_INIT)) { - status = acpi_hw_initialize (); - if (ACPI_FAILURE (status)) { - return (status); - } - } - - /* - * Enable ACPI on this platform - */ - - if (!(flags & ACPI_NO_ACPI_ENABLE)) { - status = acpi_enable (); - if (ACPI_FAILURE (status)) { - return (status); - } - } - - /* - * Note: - * We must have the hardware AND events initialized before we can execute - * ANY control methods SAFELY. Any control method can require ACPI hardware - * support, so the hardware MUST be initialized before execution! - */ - - if (!(flags & ACPI_NO_EVENT_INIT)) { - status = acpi_ev_initialize (); - if (ACPI_FAILURE (status)) { - return (status); - } - } - - - /* - * Initialize all device objects in the namespace - * This runs the _STA and _INI methods. - */ - - if (!(flags & ACPI_NO_DEVICE_INIT)) { - status = acpi_ns_initialize_devices (); - if (ACPI_FAILURE (status)) { - return (status); - } - } - - - /* - * Initialize the objects that remain uninitialized. This - * runs the executable AML that is part of the declaration of Op_regions - * and Fields. - */ - - if (!(flags & ACPI_NO_OBJECT_INIT)) { - status = acpi_ns_initialize_objects (); - if (ACPI_FAILURE (status)) { - return (status); - } - } - - - return (status); -} - - -/******************************************************************************* - * - * FUNCTION: Acpi_terminate - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Shutdown the ACPI subsystem. Release all resources. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_terminate (void) -{ - - /* Terminate the AML Debuger if present */ - - DEBUGGER_EXEC(acpi_gbl_db_terminate_threads = TRUE); - - /* TBD: [Investigate] This is no longer needed?*/ -/* Acpi_cm_release_mutex (ACPI_MTX_DEBUG_CMD_READY); */ - - - /* Shutdown and free all resources */ - - acpi_cm_subsystem_shutdown (); - - - /* Free the mutex objects */ - - acpi_cm_mutex_terminate (); - - - /* Now we can shutdown the OS-dependent layer */ - - acpi_os_terminate (); - - return (AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_get_system_info - * - * PARAMETERS: Out_buffer - a pointer to a buffer to receive the - * resources for the device - * Buffer_length - the number of bytes available in the buffer - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: This function is called to get information about the current - * state of the ACPI subsystem. It will return system information - * in the Out_buffer. - * - * If the function fails an appropriate status will be returned - * and the value of Out_buffer is undefined. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_get_system_info ( - ACPI_BUFFER *out_buffer) -{ - ACPI_SYSTEM_INFO *info_ptr; - u32 i; - - - /* - * Must have a valid buffer - */ - if ((!out_buffer) || - (!out_buffer->pointer)) { - return (AE_BAD_PARAMETER); - } - - if (out_buffer->length < sizeof (ACPI_SYSTEM_INFO)) { - /* - * Caller's buffer is too small - */ - out_buffer->length = sizeof (ACPI_SYSTEM_INFO); - - return (AE_BUFFER_OVERFLOW); - } - - - /* - * Set return length and get data - */ - out_buffer->length = sizeof (ACPI_SYSTEM_INFO); - info_ptr = (ACPI_SYSTEM_INFO *) out_buffer->pointer; - - info_ptr->acpi_ca_version = ACPI_CA_VERSION; - - /* System flags (ACPI capabilities) */ - - info_ptr->flags = acpi_gbl_system_flags; - - /* Timer resolution - 24 or 32 bits */ - if (!acpi_gbl_FADT) { - info_ptr->timer_resolution = 0; - } - else if (acpi_gbl_FADT->tmr_val_ext == 0) { - info_ptr->timer_resolution = 24; - } - else { - info_ptr->timer_resolution = 32; - } - - /* Clear the reserved fields */ - - info_ptr->reserved1 = 0; - info_ptr->reserved2 = 0; - - /* Current debug levels */ - - info_ptr->debug_layer = acpi_dbg_layer; - info_ptr->debug_level = acpi_dbg_level; - - /* Current status of the ACPI tables, per table type */ - - info_ptr->num_table_types = NUM_ACPI_TABLES; - for (i = 0; i < NUM_ACPI_TABLES; i++) { - info_ptr->table_info[i].count = acpi_gbl_acpi_tables[i].count; - } - - return (AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: Acpi_format_exception - * - * PARAMETERS: Out_buffer - a pointer to a buffer to receive the - * exception name - * - * RETURN: Status - the status of the call - * - * DESCRIPTION: This function translates an ACPI exception into an ASCII string. - * - ******************************************************************************/ - -ACPI_STATUS -acpi_format_exception ( - ACPI_STATUS exception, - ACPI_BUFFER *out_buffer) -{ - u32 length; - NATIVE_CHAR *formatted_exception; - - - /* - * Must have a valid buffer - */ - if ((!out_buffer) || - (!out_buffer->pointer)) { - return (AE_BAD_PARAMETER); - } - - - /* Convert the exception code (Handles bad exception codes) */ - - formatted_exception = acpi_cm_format_exception (exception); - - /* - * Get length of string and check if it will fit in caller's buffer - */ - - length = STRLEN (formatted_exception); - if (out_buffer->length < length) { - out_buffer->length = length; - return (AE_BUFFER_OVERFLOW); - } - - - /* Copy the string, all done */ - - STRCPY (out_buffer->pointer, formatted_exception); - - return (AE_OK); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_allocate - * - * PARAMETERS: Size - Size of the allocation - * - * RETURN: Address of the allocated memory on success, NULL on failure. - * - * DESCRIPTION: The subsystem's equivalent of malloc. - * External front-end to the Cm* memory manager - * - ****************************************************************************/ - -void * -acpi_allocate ( - u32 size) -{ - - return (acpi_cm_allocate (size)); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_callocate - * - * PARAMETERS: Size - Size of the allocation - * - * RETURN: Address of the allocated memory on success, NULL on failure. - * - * DESCRIPTION: The subsystem's equivalent of calloc. - * External front-end to the Cm* memory manager - * - ****************************************************************************/ - -void * -acpi_callocate ( - u32 size) -{ - - return (acpi_cm_callocate (size)); -} - - -/***************************************************************************** - * - * FUNCTION: Acpi_free - * - * PARAMETERS: Address - Address of the memory to deallocate - * - * RETURN: None - * - * DESCRIPTION: Frees the memory at Address - * External front-end to the Cm* memory manager - * - ****************************************************************************/ - -void -acpi_free ( - void *address) -{ - - acpi_cm_free (address); -} diff --git a/reactos/drivers/bus/isapnp/isapnp.h b/reactos/drivers/bus/isapnp/isapnp.h index 003dbe823a4..59697b9848e 100644 --- a/reactos/drivers/bus/isapnp/isapnp.h +++ b/reactos/drivers/bus/isapnp/isapnp.h @@ -1,5 +1,4 @@ -#ifndef __ISAPNP_H -#define __ISAPNP_H +#pragma once #include @@ -337,5 +336,3 @@ DriverEntry( #ifdef __cplusplus } #endif - -#endif /* __ISAPNP_H */ diff --git a/reactos/drivers/bus/pci/pci.h b/reactos/drivers/bus/pci/pci.h index 5cd7e538704..2c4043396aa 100644 --- a/reactos/drivers/bus/pci/pci.h +++ b/reactos/drivers/bus/pci/pci.h @@ -1,5 +1,4 @@ -#ifndef __PCI_H -#define __PCI_H +#pragma once #include #include @@ -175,5 +174,3 @@ NTAPI DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath); - -#endif /* __PCI_H */ diff --git a/reactos/drivers/bus/pci/pcidef.h b/reactos/drivers/bus/pci/pcidef.h index 75b6a494013..34407c4e856 100644 --- a/reactos/drivers/bus/pci/pcidef.h +++ b/reactos/drivers/bus/pci/pcidef.h @@ -17,8 +17,7 @@ * Casper S. Hornstrup (chorns@users.sourceforge.net) */ -#ifndef _PCIDEF_H -#define _PCIDEF_H +#pragma once /* * Under PCI, each device has 256 bytes of configuration address space, @@ -300,5 +299,3 @@ #define PCI_NUM_RESOURCES 11 #define PCI_REGION_FLAG_MASK 0x0f /* These bits of resource flags tell us the PCI region flags */ - -#endif /* _PCIDEF_H */ diff --git a/reactos/drivers/directx/directory.rbuild b/reactos/drivers/directx/directory.rbuild index 850deb34bf1..04d6ae9e340 100644 --- a/reactos/drivers/directx/directory.rbuild +++ b/reactos/drivers/directx/directory.rbuild @@ -1,5 +1,5 @@ - + diff --git a/reactos/drivers/directx/dxapi/dxapi.rbuild b/reactos/drivers/directx/dxapi/dxapi.rbuild index b7bd1d029f7..010702c2193 100644 --- a/reactos/drivers/directx/dxapi/dxapi.rbuild +++ b/reactos/drivers/directx/dxapi/dxapi.rbuild @@ -1,5 +1,5 @@ - + diff --git a/reactos/drivers/directx/dxg/dxg.rbuild b/reactos/drivers/directx/dxg/dxg.rbuild index 9f0cd8181ef..3303dc5d488 100644 --- a/reactos/drivers/directx/dxg/dxg.rbuild +++ b/reactos/drivers/directx/dxg/dxg.rbuild @@ -1,5 +1,5 @@ - + . diff --git a/reactos/drivers/directx/dxgthk/dxgthk.rbuild b/reactos/drivers/directx/dxgthk/dxgthk.rbuild index 4bf33cbac9a..924c3c94bde 100644 --- a/reactos/drivers/directx/dxgthk/dxgthk.rbuild +++ b/reactos/drivers/directx/dxgthk/dxgthk.rbuild @@ -1,5 +1,5 @@ - + diff --git a/reactos/drivers/drivers.rbuild b/reactos/drivers/drivers.rbuild index 5cc82caaca0..970810f015d 100644 --- a/reactos/drivers/drivers.rbuild +++ b/reactos/drivers/drivers.rbuild @@ -4,6 +4,9 @@ + + + diff --git a/reactos/drivers/filesystems/fastfat/fsctl.c b/reactos/drivers/filesystems/fastfat/fsctl.c index 8b47aa82837..c76f04f0ae9 100644 --- a/reactos/drivers/filesystems/fastfat/fsctl.c +++ b/reactos/drivers/filesystems/fastfat/fsctl.c @@ -33,8 +33,6 @@ #define CACHEPAGESIZE(pDeviceExt) ((pDeviceExt)->FatInfo.BytesPerCluster > PAGE_SIZE ? \ (pDeviceExt)->FatInfo.BytesPerCluster : PAGE_SIZE) -#define VOLUME_IS_DIRTY 0x00000001 - static NTSTATUS VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, PBOOLEAN RecognizedFS, diff --git a/reactos/drivers/filesystems/fastfat_new/fat.h b/reactos/drivers/filesystems/fastfat_new/fat.h index 3e240c374c5..222755df5a1 100644 --- a/reactos/drivers/filesystems/fastfat_new/fat.h +++ b/reactos/drivers/filesystems/fastfat_new/fat.h @@ -1,5 +1,4 @@ -#ifndef __FAT_H__ -#define __FAT_H__ +#pragma once // // Might be a good idea to have this as a shared @@ -288,5 +287,3 @@ typedef struct _LONG_FILE_NAME_ENTRY { FAT_DIRENT_ATTR_HIDDEN | \ FAT_DIRENT_ATTR_SYSTEM | \ FAT_DIRENT_ATTR_VOLUME_ID) - -#endif//__FAT_H__ diff --git a/reactos/drivers/filesystems/fastfat_new/fatstruc.h b/reactos/drivers/filesystems/fastfat_new/fatstruc.h index 50661e1f0a0..dff04c59ec7 100644 --- a/reactos/drivers/filesystems/fastfat_new/fatstruc.h +++ b/reactos/drivers/filesystems/fastfat_new/fatstruc.h @@ -1,5 +1,4 @@ -#ifndef __STRUCT_H__ -#define __STRUCT_H__ +#pragma once typedef struct _FAT_SCAN_CONTEXT *PFAT_SCAN_CONTEXT; typedef struct _FAT_IO_CONTEXT *PFAT_IO_CONTEXT; @@ -404,5 +403,3 @@ typedef enum _FILE_TIME_INDEX #define CCB_SEARCH_PATTERN_HAS_WILD_CARD 0x04 #define CCB_DASD_IO 0x10 extern FAT_GLOBAL_DATA FatGlobalData; - -#endif//__STRUCT_H__ diff --git a/reactos/drivers/filesystems/mup/mup.h b/reactos/drivers/filesystems/mup/mup.h index 39a42ad29b1..7eca3a24f25 100644 --- a/reactos/drivers/filesystems/mup/mup.h +++ b/reactos/drivers/filesystems/mup/mup.h @@ -1,5 +1,4 @@ -#ifndef MUP_H -#define MUP_H +#pragma once #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S)) @@ -24,5 +23,3 @@ MupCreate(PDEVICE_OBJECT DeviceObject, NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath); - -#endif /* MUP_H */ diff --git a/reactos/drivers/input/i8042prt/i8042prt.h b/reactos/drivers/input/i8042prt/i8042prt.h index e3f6478797f..035feaf9ea9 100644 --- a/reactos/drivers/input/i8042prt/i8042prt.h +++ b/reactos/drivers/input/i8042prt/i8042prt.h @@ -1,5 +1,4 @@ -#ifndef _I8042PRT_H_ -#define _I8042PRT_H_ +#pragma once #include #include @@ -452,5 +451,3 @@ NTSTATUS i8042AddLegacyKeyboard( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath); - -#endif // _I8042PRT_H_ diff --git a/reactos/drivers/ksfilter/ks/kcom.c b/reactos/drivers/ksfilter/ks/kcom.c index 8921caf1268..96d763aeb14 100644 --- a/reactos/drivers/ksfilter/ks/kcom.c +++ b/reactos/drivers/ksfilter/ks/kcom.c @@ -9,7 +9,7 @@ #include "priv.h" -const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x46}}; +const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; /* http://msdn2.microsoft.com/en-us/library/ms809781.aspx */ COMDDKAPI NTSTATUS NTAPI diff --git a/reactos/drivers/ksfilter/ks/ksfunc.h b/reactos/drivers/ksfilter/ks/ksfunc.h index 99f0b202285..3395a94b0b6 100644 --- a/reactos/drivers/ksfilter/ks/ksfunc.h +++ b/reactos/drivers/ksfilter/ks/ksfunc.h @@ -1,5 +1,4 @@ -#ifndef KSFUNC_H__ -#define KSFUNC_H__ +#pragma once #include "ksiface.h" #include "kstypes.h" @@ -145,6 +144,3 @@ KspPropertyHandler( IN const KSPROPERTY_SET* PropertySet, IN PFNKSALLOCATOR Allocator OPTIONAL, IN ULONG PropertyItemSize OPTIONAL); - - -#endif diff --git a/reactos/drivers/ksfilter/ks/ksiface.h b/reactos/drivers/ksfilter/ks/ksiface.h index 8954528703a..ffea3ed8a7c 100644 --- a/reactos/drivers/ksfilter/ks/ksiface.h +++ b/reactos/drivers/ksfilter/ks/ksiface.h @@ -1,5 +1,4 @@ -#ifndef KSIFACE_H__ -#define KSIFACE_H__ +#pragma once #include #include @@ -308,5 +307,3 @@ DECLARE_INTERFACE_(IKsDevice, IUnknown) STDMETHOD_(NTSTATUS, CheckIoCapability)(THIS_ IN ULONG Unknown)PURE; }; - -#endif diff --git a/reactos/drivers/ksfilter/ks/kstypes.h b/reactos/drivers/ksfilter/ks/kstypes.h index 503fc01079e..a24464eec88 100644 --- a/reactos/drivers/ksfilter/ks/kstypes.h +++ b/reactos/drivers/ksfilter/ks/kstypes.h @@ -1,5 +1,4 @@ -#ifndef KSTYPES_H__ -#define KSTYPES_H__ +#pragma once #include #include @@ -158,6 +157,3 @@ typedef struct WCHAR BusIdentifier[1]; }BUS_ENUM_DEVICE_EXTENSION, *PBUS_ENUM_DEVICE_EXTENSION; - - -#endif diff --git a/reactos/drivers/ksfilter/ks/priv.h b/reactos/drivers/ksfilter/ks/priv.h index 6b9aced499f..cc0b8f95fef 100644 --- a/reactos/drivers/ksfilter/ks/priv.h +++ b/reactos/drivers/ksfilter/ks/priv.h @@ -1,5 +1,4 @@ -#ifndef PRIV_H__ -#define PRIV_H__ +#pragma once #define _KSDDK_ @@ -36,5 +35,3 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\ DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral),\ DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(PropGeneral)\ } - -#endif diff --git a/reactos/drivers/ksfilter/swenum/precomp.h b/reactos/drivers/ksfilter/swenum/precomp.h index 6a357ef0b97..5706a0c84aa 100644 --- a/reactos/drivers/ksfilter/swenum/precomp.h +++ b/reactos/drivers/ksfilter/swenum/precomp.h @@ -1,13 +1,7 @@ -#ifndef PRECOMP_H__ -#define PRECOMP_H__ +#pragma once #include #include #include #include #include - - - - -#endif diff --git a/reactos/drivers/multimedia/audio/mpu401_nt4/mpu401.h b/reactos/drivers/multimedia/audio/mpu401_nt4/mpu401.h index e5e2a5b1cea..03a8c0b93a6 100644 --- a/reactos/drivers/multimedia/audio/mpu401_nt4/mpu401.h +++ b/reactos/drivers/multimedia/audio/mpu401_nt4/mpu401.h @@ -9,8 +9,7 @@ * Sept 26, 2003: Created */ -#ifndef __INCLUDES_MPU401_H__ -#define __INCLUDES_MPU401_H__ +#pragma once //#include //#include @@ -151,5 +150,3 @@ NTSTATUS NTAPI LoadSettings( NTSTATUS NTAPI DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath); - -#endif diff --git a/reactos/drivers/multimedia/audio/sb16_nt4.old/sndblst.h b/reactos/drivers/multimedia/audio/sb16_nt4.old/sndblst.h index 16bfa097a16..31f3474b6d8 100644 --- a/reactos/drivers/multimedia/audio/sb16_nt4.old/sndblst.h +++ b/reactos/drivers/multimedia/audio/sb16_nt4.old/sndblst.h @@ -1,5 +1,4 @@ -#ifndef SNDBLST_H -#define SNDBLST_H +#pragma once #include #include @@ -151,5 +150,3 @@ StartSoundOutput( NTSTATUS EnableIrq( PDEVICE_OBJECT DeviceObject); - -#endif diff --git a/reactos/drivers/multimedia/audio/sndblst.old/sndblst.h b/reactos/drivers/multimedia/audio/sndblst.old/sndblst.h index 8afd207aa60..6d6e3b14464 100644 --- a/reactos/drivers/multimedia/audio/sndblst.old/sndblst.h +++ b/reactos/drivers/multimedia/audio/sndblst.old/sndblst.h @@ -9,8 +9,7 @@ * Sept 28, 2003: Created */ -#ifndef __INCLUDES_SNDBLST_H__ -#define __INCLUDES_SNDBLST_H__ +#pragma once #include @@ -172,5 +171,3 @@ VOID SetOutputSampleRate(ULONG BasePort, ULONG SampleRate); VOID EnableSpeaker(ULONG BasePort, BOOLEAN SpeakerOn); BOOLEAN IsSpeakerEnabled(ULONG BasePort); VOID BeginPlayback(ULONG BasePort, ULONG BitDepth, ULONG Channels, ULONG BlockSize); - -#endif diff --git a/reactos/drivers/multimedia/bdasup/precomp.h b/reactos/drivers/multimedia/bdasup/precomp.h index dda9c1bbc28..927bc960af2 100644 --- a/reactos/drivers/multimedia/bdasup/precomp.h +++ b/reactos/drivers/multimedia/bdasup/precomp.h @@ -1,5 +1,4 @@ -#ifndef PRECOMP_H__ -#define PRECOMP_H__ +#pragma once #include #include @@ -38,7 +37,3 @@ AllocateItem( VOID FreeItem( IN PVOID Item); - - - -#endif diff --git a/reactos/drivers/network/acd/include/acdapi.h b/reactos/drivers/network/acd/include/acdapi.h index ab8868f0f6d..40fa87ef317 100644 --- a/reactos/drivers/network/acd/include/acdapi.h +++ b/reactos/drivers/network/acd/include/acdapi.h @@ -8,9 +8,6 @@ * 25/05/2008 Created */ -#ifndef _ACDAPI_H -#define _ACDAPI_H +#pragma once #define FILE_DEVICE_RASACD 0xf1 - -#endif /* _ACDAPI_H */ diff --git a/reactos/drivers/network/afd/include/debug.h b/reactos/drivers/network/afd/include/debug.h index 6127fa4637e..f4ed29a3955 100644 --- a/reactos/drivers/network/afd/include/debug.h +++ b/reactos/drivers/network/afd/include/debug.h @@ -6,8 +6,8 @@ * DEFINES: DBG - Enable debug output * NASSERT - Disable assertions */ -#ifndef __DEBUG_H -#define __DEBUG_H + +#pragma once #define NORMAL_MASK 0x000000FF #define SPECIAL_MASK 0xFFFFFF00 @@ -89,6 +89,4 @@ extern DWORD DebugTraceLevel; #define CP CHECKPOINT -#endif /* __DEBUG_H */ - /* EOF */ diff --git a/reactos/drivers/network/afd/include/tdi_proto.h b/reactos/drivers/network/afd/include/tdi_proto.h index 93354baef25..a70c810e697 100644 --- a/reactos/drivers/network/afd/include/tdi_proto.h +++ b/reactos/drivers/network/afd/include/tdi_proto.h @@ -1,5 +1,4 @@ -#ifndef _TDI_PROTO_H -#define _TDI_PROTO_H +#pragma once NTSTATUS TdiConnect( PIRP *PendingIrp, PFILE_OBJECT ConnectionObject, @@ -45,5 +44,3 @@ NTSTATUS TdiQueryDeviceControl( PVOID OutputBuffer, ULONG OutputBufferLength, PULONG Return); - -#endif/*_TDI_PROTO_H*/ diff --git a/reactos/drivers/network/afd/include/tdiconn.h b/reactos/drivers/network/afd/include/tdiconn.h index 0ada133d961..54f83fc722a 100644 --- a/reactos/drivers/network/afd/include/tdiconn.h +++ b/reactos/drivers/network/afd/include/tdiconn.h @@ -1,5 +1,4 @@ -#ifndef _TDICONN_H -#define _TDICONN_H +#pragma once #ifdef _MSC_VER #include @@ -29,5 +28,3 @@ NTSTATUS TdiBuildConnectionInfoPair PTRANSPORT_ADDRESS From, PTRANSPORT_ADDRESS To ); PTA_ADDRESS TdiGetRemoteAddress( PTDI_CONNECTION_INFORMATION TdiConn ); - -#endif/*_TDICONN_H*/ diff --git a/reactos/drivers/network/dd/ne2000/include/8390.h b/reactos/drivers/network/dd/ne2000/include/8390.h index 29c724e8062..7776bc79d2d 100644 --- a/reactos/drivers/network/dd/ne2000/include/8390.h +++ b/reactos/drivers/network/dd/ne2000/include/8390.h @@ -4,8 +4,8 @@ * FILE: include/8390.h * PURPOSE: National Semiconductor 8390 NIC definitions */ -#ifndef __8390_H -#define __8390_H + +#pragma once /* Page 0 register layout (PS1 = 0, PS0 = 0) */ #define PG0_CR 0x00 /* Command Register (R/W) */ @@ -169,6 +169,4 @@ typedef struct _DISCARD_HEADER { VOID NTAPI MiniportHandleInterrupt( IN NDIS_HANDLE MiniportAdapterContext); -#endif /* __8390_H */ - /* EOF */ diff --git a/reactos/drivers/network/dd/ne2000/include/debug.h b/reactos/drivers/network/dd/ne2000/include/debug.h index 9f352f6dba3..f495766a059 100644 --- a/reactos/drivers/network/dd/ne2000/include/debug.h +++ b/reactos/drivers/network/dd/ne2000/include/debug.h @@ -6,8 +6,8 @@ * DEFINES: DBG - Enable debug output * NASSERT - Disable assertions */ -#ifndef __DEBUG_H -#define __DEBUG_H + +#pragma once #define NORMAL_MASK 0x000000FF #define SPECIAL_MASK 0xFFFFFF00 @@ -79,6 +79,4 @@ extern ULONG DebugTraceLevel; #define CHECKPOINT \ do { NDIS_DbgPrint(MIN_TRACE, ("%s:%d\n", __FILE__, __LINE__)); } while(0); -#endif /* __DEBUG_H */ - /* EOF */ diff --git a/reactos/drivers/network/dd/ne2000/include/ne2000.h b/reactos/drivers/network/dd/ne2000/include/ne2000.h index 44d4de31bea..4c4e28bdbcd 100644 --- a/reactos/drivers/network/dd/ne2000/include/ne2000.h +++ b/reactos/drivers/network/dd/ne2000/include/ne2000.h @@ -4,8 +4,8 @@ * FILE: include/ne2000.h * PURPOSE: NE2000 driver definitions */ -#ifndef __NE2000_H -#define __NE2000_H + +#pragma once #define NDIS_MINIPORT_DRIVER 1 #define NDIS_LEGACY_MINIPORT 1 @@ -246,6 +246,4 @@ VOID NICWriteData( VOID NICTransmit( PNIC_ADAPTER Adapter); -#endif /* __NE2000_H */ - /* EOF */ diff --git a/reactos/drivers/network/dd/pcnet/pci.h b/reactos/drivers/network/dd/pcnet/pci.h index db0b8011133..d30a251d243 100644 --- a/reactos/drivers/network/dd/pcnet/pci.h +++ b/reactos/drivers/network/dd/pcnet/pci.h @@ -23,8 +23,7 @@ * 01-Sept-2003 vizzini - Created */ -#ifndef _PCI_ -#define _PCI_ +#pragma once /* PCI Config Space Offset Definitions */ #define PCI_PCIID 0x0 /* pci id - query 32 bits */ @@ -67,5 +66,3 @@ #define PCI_RTABORT 0x1000 /* received target abort */ #define PCI_SERR 0x2000 /* signalled error */ #define PCI_PERR 0x4000 /* parity error */ - -#endif /* _PCI_ */ diff --git a/reactos/drivers/network/dd/pcnet/pcnet.h b/reactos/drivers/network/dd/pcnet/pcnet.h index ebf898069d9..1a23ba53ec6 100644 --- a/reactos/drivers/network/dd/pcnet/pcnet.h +++ b/reactos/drivers/network/dd/pcnet/pcnet.h @@ -25,8 +25,7 @@ * - this assumes 32-bit physical addresses */ -#ifndef _PCNET_H_ -#define _PCNET_H_ +#pragma once /* statistics struct */ typedef struct _ADAPTER_STATS @@ -160,6 +159,3 @@ MiGetMediaDuplex(PADAPTER Adapter); /* memory pool tag */ #define PCNET_TAG 'tNcP' - -#endif // _PCNET_H_ - diff --git a/reactos/drivers/network/dd/pcnet/pcnethw.h b/reactos/drivers/network/dd/pcnet/pcnethw.h index 9e045c50b84..be79003834c 100644 --- a/reactos/drivers/network/dd/pcnet/pcnethw.h +++ b/reactos/drivers/network/dd/pcnet/pcnethw.h @@ -26,8 +26,7 @@ * PCNet II chip documentation (Am79C790A, pub# 19436). */ -#ifndef _PCNETHW_ -#define _PCNETHW_ +#pragma once /* when in 32-bit mode, most registers require the top 16 bits be 0. */ #define MASK16(__x__) ((__x__) & 0x0000ffff) @@ -414,5 +413,3 @@ typedef struct _TRANSMIT_DESCRIPTOR #define TD2_EXDEF 0x2000 /* excessive deferral */ #define TD2_UFLO 0x4000 /* buffer underflow */ #define TD2_BUFF 0x8000 /* buffer error */ - -#endif /* _PCNETHW_ */ diff --git a/reactos/drivers/network/lan/include/debug.h b/reactos/drivers/network/lan/include/debug.h index bef235757d8..fc72311e088 100644 --- a/reactos/drivers/network/lan/include/debug.h +++ b/reactos/drivers/network/lan/include/debug.h @@ -6,8 +6,8 @@ * DEFINES: DBG - Enable debug output * NASSERT - Disable assertions */ -#ifndef __DEBUG_H -#define __DEBUG_H + +#pragma once #define NORMAL_MASK 0x000000FF #define SPECIAL_MASK 0xFFFFFF00 @@ -96,7 +96,3 @@ extern DWORD DebugTraceLevel; #define CP CHECKPOINT #include - -#endif /* __DEBUG_H */ - -/* EOF */ diff --git a/reactos/drivers/network/lan/include/lan.h b/reactos/drivers/network/lan/include/lan.h index 431441fefa4..fb7e1e0a4e3 100644 --- a/reactos/drivers/network/lan/include/lan.h +++ b/reactos/drivers/network/lan/include/lan.h @@ -4,8 +4,8 @@ * FILE: include/lan.h * PURPOSE: LAN adapter definitions */ -#ifndef __LAN_H -#define __LAN_H + +#pragma once /* NDIS version this driver supports */ #define NDIS_VERSION_MAJOR 4 @@ -161,6 +161,4 @@ VOID CloseNdisPools(); PLAN_ADAPTER FindAdapterByIndex( PLAN_DEVICE_EXT DeviceExt, UINT Index ); -#endif /* __LAN_H */ - /* EOF */ diff --git a/reactos/drivers/network/lan/include/memtrack.h b/reactos/drivers/network/lan/include/memtrack.h index 62f45cc9b0e..a5b7dfd324f 100644 --- a/reactos/drivers/network/lan/include/memtrack.h +++ b/reactos/drivers/network/lan/include/memtrack.h @@ -1,5 +1,4 @@ -#ifndef MEMTRACK_H -#define MEMTRACK_H +#pragma once #ifndef FOURCC #define FOURCC(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d)) @@ -19,5 +18,3 @@ #define exFreePool(x) ExFreePool(x) #define TrackWithTag(w,x,y,z) #define UntrackFL(x,y,z) - -#endif/*MEMMTRAC_H*/ diff --git a/reactos/drivers/network/lan/include/net_lan.h b/reactos/drivers/network/lan/include/net_lan.h index c61a7341a00..0a3223acfc6 100644 --- a/reactos/drivers/network/lan/include/net_lan.h +++ b/reactos/drivers/network/lan/include/net_lan.h @@ -1,4 +1,4 @@ -#ifndef _NET_LAN_H +#pragma once #include "net_wh.h" @@ -75,5 +75,3 @@ typedef struct _LAN_ADAPTER_INFO_S { (Types), \ sizeof(USHORT) * (NumTypes) ); \ } - -#endif/*_NET_LAN_H*/ diff --git a/reactos/drivers/network/lan/include/net_wh.h b/reactos/drivers/network/lan/include/net_wh.h index b277271db3c..b4736131836 100644 --- a/reactos/drivers/network/lan/include/net_wh.h +++ b/reactos/drivers/network/lan/include/net_wh.h @@ -1,5 +1,4 @@ -#ifndef _NET_WH_H -#define _NET_WH_H +#pragma once #ifdef i386 @@ -46,5 +45,3 @@ (w) #endif /* i386 */ - -#endif/*_NET_WH_H*/ diff --git a/reactos/drivers/network/lan/include/precomp.h b/reactos/drivers/network/lan/include/precomp.h index 31c14790fbc..33626a94f2e 100644 --- a/reactos/drivers/network/lan/include/precomp.h +++ b/reactos/drivers/network/lan/include/precomp.h @@ -1,5 +1,4 @@ -#ifndef _LAN_PRECOMP_H -#define _LAN_PRECOMP_H +#pragma once #include #include @@ -8,5 +7,3 @@ #include #include "net_lan.h" #include "lan.h" - -#endif/*_LAN_PRECOMP_H*/ diff --git a/reactos/drivers/network/ndis/include/buffer.h b/reactos/drivers/network/ndis/include/buffer.h index 62f9fce7bcf..b938cedb70d 100644 --- a/reactos/drivers/network/ndis/include/buffer.h +++ b/reactos/drivers/network/ndis/include/buffer.h @@ -4,8 +4,8 @@ * FILE: include/buffer.h * PURPOSE: Buffer management routine definitions */ -#ifndef __BUFFER_H -#define __BUFFER_H + +#pragma once #include "ndissys.h" @@ -57,6 +57,4 @@ UINT CopyPacketToBufferChain( UINT SrcOffset, UINT Length); -#endif /* __BUFFER_H */ - /* EOF */ diff --git a/reactos/drivers/network/ndis/include/debug.h b/reactos/drivers/network/ndis/include/debug.h index 7a4c40ee6ab..32cf70f78e0 100644 --- a/reactos/drivers/network/ndis/include/debug.h +++ b/reactos/drivers/network/ndis/include/debug.h @@ -5,8 +5,8 @@ * PURPOSE: Debugging support macros * DEFINES: DBG - Enable debug output */ -#ifndef __DEBUG_H -#define __DEBUG_H + +#pragma once #define NORMAL_MASK 0x000000FF #define SPECIAL_MASK 0xFFFFFF00 @@ -68,6 +68,4 @@ extern ULONG DebugTraceLevel; #define CP CHECKPOINT -#endif /* __DEBUG_H */ - /* EOF */ diff --git a/reactos/drivers/network/ndis/include/efilter.h b/reactos/drivers/network/ndis/include/efilter.h index 96d095dc562..3b564f740d2 100644 --- a/reactos/drivers/network/ndis/include/efilter.h +++ b/reactos/drivers/network/ndis/include/efilter.h @@ -5,8 +5,7 @@ * PURPOSE: Definitions for Ethernet filter */ -#ifndef __EFILTER_H -#define __EFILTER_H +#pragma once #define DECLARE_UNKNOWN_STRUCT(BaseName) \ typedef struct _##BaseName BaseName, *P##BaseName; @@ -76,7 +75,4 @@ NTAPI EthFilterDprIndicateReceiveComplete( IN PETH_FILTER Filter); -#endif /* __EFILTER_H */ - /* EOF */ - diff --git a/reactos/drivers/network/ndis/include/miniport.h b/reactos/drivers/network/ndis/include/miniport.h index 32aab60ace5..7dd615db1bf 100644 --- a/reactos/drivers/network/ndis/include/miniport.h +++ b/reactos/drivers/network/ndis/include/miniport.h @@ -5,8 +5,7 @@ * PURPOSE: Definitions for routines used by NDIS miniport drivers */ -#ifndef __MINIPORT_H -#define __MINIPORT_H +#pragma once #include #include @@ -197,7 +196,4 @@ VOID MiniDoAddressingReset( PLOGICAL_ADAPTER Adapter); -#endif /* __MINIPORT_H */ - /* EOF */ - diff --git a/reactos/drivers/network/ndis/include/protocol.h b/reactos/drivers/network/ndis/include/protocol.h index ecebc2d118c..99f92ea244d 100644 --- a/reactos/drivers/network/ndis/include/protocol.h +++ b/reactos/drivers/network/ndis/include/protocol.h @@ -5,8 +5,7 @@ * PURPOSE: Definitions for routines used by NDIS protocol drivers */ -#ifndef __PROTOCOL_H -#define __PROTOCOL_H +#pragma once typedef struct _PROTOCOL_BINDING { LIST_ENTRY ListEntry; /* Entry on global list */ @@ -70,7 +69,4 @@ NdisIPnPCancelStopDevice( NDIS_STATUS proSendPacketToMiniport(PLOGICAL_ADAPTER Adapter, PNDIS_PACKET Packet); -#endif /* __PROTOCOL_H */ - /* EOF */ - diff --git a/reactos/drivers/network/tcpip/include/address.h b/reactos/drivers/network/tcpip/include/address.h index 1bd1dbd5c15..7a9dacf8eba 100644 --- a/reactos/drivers/network/tcpip/include/address.h +++ b/reactos/drivers/network/tcpip/include/address.h @@ -4,8 +4,8 @@ * FILE: include/address.h * PURPOSE: Address manipulation prototypes */ -#ifndef __ADDRESS_H -#define __ADDRESS_H + +#pragma once /* * Initialize an IPv4 style address @@ -75,6 +75,4 @@ UINT AddrCountPrefixBits( PIP_ADDRESS Netmask ); VOID AddrWidenAddress( PIP_ADDRESS Network, PIP_ADDRESS Source, PIP_ADDRESS Netmask ); -#endif /* __ADDRESS_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/arp.h b/reactos/drivers/network/tcpip/include/arp.h index dd9f23a53af..710cbdb5cf0 100644 --- a/reactos/drivers/network/tcpip/include/arp.h +++ b/reactos/drivers/network/tcpip/include/arp.h @@ -4,8 +4,8 @@ * FILE: include/arp.h * PURPOSE: Address Resolution Protocol definitions */ -#ifndef __ARP_H -#define __ARP_H + +#pragma once typedef struct ARP_HEADER { USHORT HWType; /* Hardware Type */ @@ -30,6 +30,4 @@ VOID ARPReceive( PVOID Context, PIP_PACKET Packet); -#endif /* __ARP_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/checksum.h b/reactos/drivers/network/tcpip/include/checksum.h index 3ee66aedb78..0eb491033ab 100644 --- a/reactos/drivers/network/tcpip/include/checksum.h +++ b/reactos/drivers/network/tcpip/include/checksum.h @@ -4,8 +4,8 @@ * FILE: include/checksum.h * PURPOSE: Checksum routine definitions */ -#ifndef __CHECKSUM_H -#define __CHECKSUM_H + +#pragma once ULONG ChecksumFold( @@ -48,5 +48,3 @@ UDPv4ChecksumCalculate( (BOOLEAN)(TCPv4Checksum(Data, Count, \ TCPv4Checksum(TcpPseudoHeader, sizeof(TCPv4_PSEUDO_HEADER), \ 0)) == DH2N(0x0000FFFF)) - -#endif /* __CHECKSUM_H */ diff --git a/reactos/drivers/network/tcpip/include/datagram.h b/reactos/drivers/network/tcpip/include/datagram.h index f05107a7de1..29cf82ddff2 100644 --- a/reactos/drivers/network/tcpip/include/datagram.h +++ b/reactos/drivers/network/tcpip/include/datagram.h @@ -4,8 +4,8 @@ * FILE: include/datagram.h * PURPOSE: Datagram types and constants */ -#ifndef __DATAGRAM_H -#define __DATAGRAM_H + +#pragma once #include @@ -34,6 +34,4 @@ VOID DGDeliverData( PIP_PACKET IPPacket, UINT DataSize); -#endif /* __DATAGRAM_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/debug.h b/reactos/drivers/network/tcpip/include/debug.h index 7f6d86b8e27..303d66a5556 100644 --- a/reactos/drivers/network/tcpip/include/debug.h +++ b/reactos/drivers/network/tcpip/include/debug.h @@ -6,8 +6,8 @@ * DEFINES: DBG - Enable debug output * NASSERT - Disable assertions */ -#ifndef __DEBUG_H -#define __DEBUG_H + +#pragma once #define MIN_TRACE ((1 << DPFLTR_WARNING_LEVEL)) #define MID_TRACE ((1 << DPFLTR_WARNING_LEVEL) | (1 << DPFLTR_TRACE_LEVEL)) @@ -75,6 +75,4 @@ ASSERT(((PVOID)_x) != (PVOID)0xcccccccc); \ ASSERT(((PVOID)_x) >= (PVOID)0x80000000); -#endif /* __DEBUG_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/dispatch.h b/reactos/drivers/network/tcpip/include/dispatch.h index 6be0f269aed..9effe5f975d 100644 --- a/reactos/drivers/network/tcpip/include/dispatch.h +++ b/reactos/drivers/network/tcpip/include/dispatch.h @@ -4,8 +4,8 @@ * FILE: include/dispatch.h * PURPOSE: Dispatch routine prototypes */ -#ifndef __DISPATCH_H -#define __DISPATCH_H + +#pragma once typedef struct _DISCONNECT_TYPE { UINT Type; @@ -74,6 +74,4 @@ VOID DispDoDisconnect( NTSTATUS IRPFinish( PIRP Irp, NTSTATUS Status ); -#endif /* __DISPATCH_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/fileobjs.h b/reactos/drivers/network/tcpip/include/fileobjs.h index 12327701db8..d45ec7b7934 100644 --- a/reactos/drivers/network/tcpip/include/fileobjs.h +++ b/reactos/drivers/network/tcpip/include/fileobjs.h @@ -4,9 +4,8 @@ * FILE: include/fileobjs.h * PURPOSE: File object routine prototypes */ -#ifndef __FILEOBJS_H -#define __FILEOBJS_H +#pragma once extern LIST_ENTRY AddressFileListHead; extern KSPIN_LOCK AddressFileListLock; @@ -35,6 +34,4 @@ NTSTATUS FileOpenControlChannel( NTSTATUS FileCloseControlChannel( PTDI_REQUEST Request); -#endif /* __FILEOBJS_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/icmp.h b/reactos/drivers/network/tcpip/include/icmp.h index bb0e28a890a..aaaefa24b5f 100644 --- a/reactos/drivers/network/tcpip/include/icmp.h +++ b/reactos/drivers/network/tcpip/include/icmp.h @@ -4,8 +4,8 @@ * FILE: include/icmp.h * PURPOSE: Internet Control Message Protocol definitions */ -#ifndef __ICMP_H -#define __ICMP_H + +#pragma once typedef struct ICMP_HEADER { UCHAR Type; /* ICMP message type */ @@ -74,6 +74,4 @@ VOID ICMPReply( UCHAR Type, UCHAR Code); -#endif /* __ICMP_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/info.h b/reactos/drivers/network/tcpip/include/info.h index ee8a6d1cdfe..a05b0b2944e 100644 --- a/reactos/drivers/network/tcpip/include/info.h +++ b/reactos/drivers/network/tcpip/include/info.h @@ -4,8 +4,8 @@ * FILE: include/info.h * PURPOSE: TdiQueryInformation definitions */ -#ifndef __INFO_H -#define __INFO_H + +#pragma once #include @@ -194,6 +194,4 @@ VOID AddEntity(ULONG EntityType, VOID RemoveEntityByContext(PVOID Context); -#endif /* __INFO_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/interface.h b/reactos/drivers/network/tcpip/include/interface.h index 18b69b4ff30..c79bcabce3f 100644 --- a/reactos/drivers/network/tcpip/include/interface.h +++ b/reactos/drivers/network/tcpip/include/interface.h @@ -1,5 +1,4 @@ -#ifndef _TCPIP_INTERFACE_H -#define _TCPIP_INTERFACE_H +#pragma once #include @@ -16,5 +15,3 @@ NTSTATUS GetInterfaceName( PIP_INTERFACE Interface, PCHAR NameBuffer, NTSTATUS GetInterfaceConnectionStatus( PIP_INTERFACE Interface, PULONG OperStatus ); PIP_INTERFACE FindOnLinkInterface(PIP_ADDRESS Address); - -#endif//_TCPIP_INTERFACE_H diff --git a/reactos/drivers/network/tcpip/include/ip.h b/reactos/drivers/network/tcpip/include/ip.h index 068992f4839..dc6898d1d8a 100644 --- a/reactos/drivers/network/tcpip/include/ip.h +++ b/reactos/drivers/network/tcpip/include/ip.h @@ -4,8 +4,8 @@ * FILE: include/ip.h * PURPOSE: Internet Protocol related definitions */ -#ifndef __IP_H -#define __IP_H + +#pragma once typedef VOID (*OBJECT_FREE_ROUTINE)(PVOID Object); @@ -246,8 +246,4 @@ NTSTATUS IPStartup(PUNICODE_STRING RegistryPath); NTSTATUS IPShutdown(VOID); - - -#endif /* __IP_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/lan.h b/reactos/drivers/network/tcpip/include/lan.h index 7cdf49ac988..226d354e421 100644 --- a/reactos/drivers/network/tcpip/include/lan.h +++ b/reactos/drivers/network/tcpip/include/lan.h @@ -4,9 +4,8 @@ * FILE: include/lan.h * PURPOSE: LAN adapter definitions */ -#ifndef __LAN_H -#define __LAN_H +#pragma once /* Media we support */ #define MEDIA_ETH 0 @@ -108,6 +107,4 @@ NDIS_STATUS NDISCall( PVOID Buffer, UINT Length); -#endif /* __LAN_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/linux.h b/reactos/drivers/network/tcpip/include/linux.h index a4f3bf35e1f..9c4ad1c82ff 100755 --- a/reactos/drivers/network/tcpip/include/linux.h +++ b/reactos/drivers/network/tcpip/include/linux.h @@ -1,5 +1,4 @@ -#ifndef _LINUX_TYPES_H -#define _LINUX_TYPES_H +#pragma once #include @@ -1872,5 +1871,3 @@ struct pollfd { }; #endif /* poll */ - -#endif /* _LINUX_TYPES_H */ diff --git a/reactos/drivers/network/tcpip/include/lock.h b/reactos/drivers/network/tcpip/include/lock.h index 31ed91a8495..cac01ebeb6e 100644 --- a/reactos/drivers/network/tcpip/include/lock.h +++ b/reactos/drivers/network/tcpip/include/lock.h @@ -1,5 +1,4 @@ -#ifndef _LOCK_H -#define _LOCK_H +#pragma once extern KIRQL TcpipGetCurrentIrql(); extern VOID TcpipInitializeSpinLock( PKSPIN_LOCK SpinLock ); @@ -12,5 +11,3 @@ extern VOID TcpipInterlockedInsertTailList( PLIST_ENTRY ListHead, PKSPIN_LOCK Lock ); extern VOID TcpipAcquireFastMutex( PFAST_MUTEX Mutex ); extern VOID TcpipReleaseFastMutex( PFAST_MUTEX Mutex ); - -#endif/*_LOCK_H*/ diff --git a/reactos/drivers/network/tcpip/include/loopback.h b/reactos/drivers/network/tcpip/include/loopback.h index 02ba55f8723..9988a264dcc 100644 --- a/reactos/drivers/network/tcpip/include/loopback.h +++ b/reactos/drivers/network/tcpip/include/loopback.h @@ -4,8 +4,8 @@ * FILE: include/loopback.h * PURPOSE: Loopback adapter definitions */ -#ifndef __LOOPBACK_H -#define __LOOPBACK_H + +#pragma once #include @@ -18,6 +18,4 @@ NDIS_STATUS LoopRegisterAdapter( NDIS_STATUS LoopUnregisterAdapter( PLAN_ADAPTER Adapter); -#endif /* __LOOPBACK_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/neighbor.h b/reactos/drivers/network/tcpip/include/neighbor.h index 6f125f06c51..d35f64143d8 100644 --- a/reactos/drivers/network/tcpip/include/neighbor.h +++ b/reactos/drivers/network/tcpip/include/neighbor.h @@ -4,9 +4,8 @@ * FILE: include/neighbor.h * PURPOSE: Neighbor definitions */ -#ifndef __NEIGHBOR_H -#define __NEIGHBOR_H +#pragma once #define NB_HASHMASK 0xF /* Hash mask for neighbor cache */ @@ -103,6 +102,4 @@ ULONG NBCopyNeighbors( VOID NBResetNeighborTimeout( PIP_ADDRESS Address); -#endif /* __NEIGHBOR_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/pool.h b/reactos/drivers/network/tcpip/include/pool.h index 846fcea6935..93db9805870 100644 --- a/reactos/drivers/network/tcpip/include/pool.h +++ b/reactos/drivers/network/tcpip/include/pool.h @@ -4,12 +4,10 @@ * FILE: include/pool.h * PURPOSE: Prototypes for memory pooling */ -#ifndef __POOL_H -#define __POOL_H + +#pragma once NDIS_STATUS PrependPacket( PNDIS_PACKET Packet, PCHAR Data, UINT Len, BOOLEAN Copy ); -#endif /* __POOL_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/ports.h b/reactos/drivers/network/tcpip/include/ports.h index 3be359097fb..f63332b4fed 100644 --- a/reactos/drivers/network/tcpip/include/ports.h +++ b/reactos/drivers/network/tcpip/include/ports.h @@ -1,6 +1,3 @@ -#ifndef _TCPIP_PORTS_H -#define _TCPIP_PORTS_H - /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS TCP/IP protocol driver @@ -11,6 +8,8 @@ * arty 20041114 Created */ +#pragma once + typedef struct _PORT_SET { RTL_BITMAP ProtoBitmap; PVOID ProtoBitBuffer; @@ -27,5 +26,3 @@ VOID DeallocatePort( PPORT_SET PortSet, ULONG Port ); BOOLEAN AllocatePort( PPORT_SET PortSet, ULONG Port ); ULONG AllocateAnyPort( PPORT_SET PortSet ); ULONG AllocatePortFromRange( PPORT_SET PortSet, ULONG Lowest, ULONG Highest ); - -#endif/*_TCPIP_PORTS_H*/ diff --git a/reactos/drivers/network/tcpip/include/rawip.h b/reactos/drivers/network/tcpip/include/rawip.h index 872dec55cda..821fdb4f868 100644 --- a/reactos/drivers/network/tcpip/include/rawip.h +++ b/reactos/drivers/network/tcpip/include/rawip.h @@ -4,8 +4,8 @@ * FILE: include/rawip.h * PURPOSE: Raw IP types and constants */ -#ifndef __RAWIP_H -#define __RAWIP_H + +#pragma once NTSTATUS RawIPSendDatagram( PADDRESS_FILE AddrFile, @@ -36,6 +36,4 @@ NTSTATUS AddGenericHeaderIPv4( UINT ExtraLength, PVOID *NextHeader ); -#endif /* __RAWIP_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/receive.h b/reactos/drivers/network/tcpip/include/receive.h index 2681732bf23..6f78828067a 100644 --- a/reactos/drivers/network/tcpip/include/receive.h +++ b/reactos/drivers/network/tcpip/include/receive.h @@ -4,8 +4,8 @@ * FILE: include/receive.h * PURPOSE: Internet Protocol receive prototypes */ -#ifndef __RECEIVE_H -#define __RECEIVE_H + +#pragma once #include @@ -61,6 +61,4 @@ VOID IPReceive( PIP_INTERFACE IF, PIP_PACKET IPPacket); -#endif /* __RECEIVE_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/route.h b/reactos/drivers/network/tcpip/include/route.h index 19f1323bfbc..b92c984b96d 100644 --- a/reactos/drivers/network/tcpip/include/route.h +++ b/reactos/drivers/network/tcpip/include/route.h @@ -4,8 +4,8 @@ * FILE: include/route.h * PURPOSE: Routing cache definitions */ -#ifndef __ROUTE_H -#define __ROUTE_H + +#pragma once #include #include @@ -16,6 +16,4 @@ PNEIGHBOR_CACHE_ENTRY RouteGetRouteToDestination(PIP_ADDRESS Destination); -#endif /* __ROUTE_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/router.h b/reactos/drivers/network/tcpip/include/router.h index 73d2409f22a..6b2b2bb5010 100644 --- a/reactos/drivers/network/tcpip/include/router.h +++ b/reactos/drivers/network/tcpip/include/router.h @@ -4,8 +4,8 @@ * FILE: include/router.h * PURPOSE: IP routing definitions */ -#ifndef __ROUTER_H -#define __ROUTER_H + +#pragma once #include @@ -47,6 +47,4 @@ UINT CountFIBs(PIP_INTERFACE IF); UINT CopyFIBs( PIP_INTERFACE IF, PFIB_ENTRY Target ); -#endif /* __ROUTER_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/routines.h b/reactos/drivers/network/tcpip/include/routines.h index 1fda0e5aee8..223444244b0 100644 --- a/reactos/drivers/network/tcpip/include/routines.h +++ b/reactos/drivers/network/tcpip/include/routines.h @@ -4,9 +4,8 @@ * FILE: include/routines.h * PURPOSE: Common routine prototypes */ -#ifndef __ROUTINES_H -#define __ROUTINES_H +#pragma once UINT Random(VOID); @@ -71,6 +70,4 @@ VOID DisplayTCPPacket( #define DISPLAY_TCP_PACKET(x) #endif /* DBG */ -#endif /* __ROUTINES_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/tags.h b/reactos/drivers/network/tcpip/include/tags.h index 52c16a45cc9..bd552766e89 100644 --- a/reactos/drivers/network/tcpip/include/tags.h +++ b/reactos/drivers/network/tcpip/include/tags.h @@ -4,8 +4,8 @@ * FILE: include/tags.h * PURPOSE: Memory tags */ -#ifndef __TAGS_H -#define __TAGS_H + +#pragma once #define CONN_ENDPT_TAG 'pEnC' #define ADDR_FILE_TAG 'FrdA' @@ -35,5 +35,3 @@ #define OSK_SMALL_TAG 'SKSO' #define LAN_ADAPTER_TAG ' NAL' #define WQ_CONTEXT_TAG 'noCW' - -#endif diff --git a/reactos/drivers/network/tcpip/include/tcp.h b/reactos/drivers/network/tcpip/include/tcp.h index 4b5318f60bc..637900a5424 100644 --- a/reactos/drivers/network/tcpip/include/tcp.h +++ b/reactos/drivers/network/tcpip/include/tcp.h @@ -4,8 +4,8 @@ * FILE: include/tcp.h * PURPOSE: Transmission Control Protocol definitions */ -#ifndef __TCP_H -#define __TCP_H + +#pragma once typedef VOID (*PTCP_COMPLETION_ROUTINE)( PVOID Context, NTSTATUS Status, ULONG Count ); @@ -181,5 +181,3 @@ NTSTATUS TCPShutdown( VOID); BOOLEAN TCPRemoveIRP( PCONNECTION_ENDPOINT Connection, PIRP Irp ); - -#endif /* __TCP_H */ diff --git a/reactos/drivers/network/tcpip/include/tcpcore.h b/reactos/drivers/network/tcpip/include/tcpcore.h index 9478c817494..5034e859fa0 100755 --- a/reactos/drivers/network/tcpip/include/tcpcore.h +++ b/reactos/drivers/network/tcpip/include/tcpcore.h @@ -24,8 +24,8 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ -#ifndef __TCPCORE_H -#define __TCPCORE_H + +#pragma once #include "tcpdef.h" @@ -3853,4 +3853,3 @@ static __inline int tcp_paws_check(struct tcp_opt *tp, int rst) // #endif -#endif diff --git a/reactos/drivers/network/tcpip/include/tcpdef.h b/reactos/drivers/network/tcpip/include/tcpdef.h index e70e5ad38c3..fa77e9f0413 100755 --- a/reactos/drivers/network/tcpip/include/tcpdef.h +++ b/reactos/drivers/network/tcpip/include/tcpdef.h @@ -14,8 +14,8 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ -#ifndef _LINUX_TCP_H -#define _LINUX_TCP_H + +#pragma once #include "linux.h" @@ -183,5 +183,3 @@ struct tcp_info __u32 tcpi_advmss; __u32 tcpi_reordering; }; - -#endif /* _LINUX_TCP_H */ diff --git a/reactos/drivers/network/tcpip/include/tcpip.h b/reactos/drivers/network/tcpip/include/tcpip.h index a9fefc9775d..563e662f602 100644 --- a/reactos/drivers/network/tcpip/include/tcpip.h +++ b/reactos/drivers/network/tcpip/include/tcpip.h @@ -11,8 +11,8 @@ * - Neighbor cache lock * - Route cache lock */ -#ifndef __TCPIP_H -#define __TCPIP_H + +#pragma once #ifdef _MSC_VER #include @@ -180,6 +180,4 @@ extern ULONG EntityMax; extern NTSTATUS TiGetProtocolNumber( PUNICODE_STRING FileName, PULONG Protocol ); -#endif /* __TCPIP_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/ticonsts.h b/reactos/drivers/network/tcpip/include/ticonsts.h index ca26064f111..ede93c91974 100644 --- a/reactos/drivers/network/tcpip/include/ticonsts.h +++ b/reactos/drivers/network/tcpip/include/ticonsts.h @@ -4,8 +4,8 @@ * FILE: include/ticonsts.h * PURPOSE: TCP/IP protocol driver constants */ -#ifndef __TICONSTS_H -#define __TICONSTS_H + +#pragma once /* NDIS version this driver supports */ #define NDIS_VERSION_MAJOR 4 @@ -59,6 +59,4 @@ #define IP_NO_RESOURCES 0x0001 /* Not enough free resources */ #define IP_NO_ROUTE_TO_DESTINATION 0x0002 /* No route to destination */ -#endif /* __TICONSTS_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/tilists.h b/reactos/drivers/network/tcpip/include/tilists.h index 3134522a00c..8200e0dd9f3 100644 --- a/reactos/drivers/network/tcpip/include/tilists.h +++ b/reactos/drivers/network/tcpip/include/tilists.h @@ -1,5 +1,4 @@ -#ifndef _TILISTS_H -#define _TILISTS_H +#pragma once #define TIPASTE(x,y) x ## y @@ -23,5 +22,3 @@ TIPASTE(n,Entry->Flink))); \ TIPASTE(n,Entry) = TIPASTE(n,Entry)->Flink; \ } - -#endif/*_TILISTS_H*/ diff --git a/reactos/drivers/network/tcpip/include/titypes.h b/reactos/drivers/network/tcpip/include/titypes.h index fb8ec7749d6..5400010db5e 100644 --- a/reactos/drivers/network/tcpip/include/titypes.h +++ b/reactos/drivers/network/tcpip/include/titypes.h @@ -4,8 +4,8 @@ * FILE: include/titypes.h * PURPOSE: TCP/IP protocol driver types */ -#ifndef __TITYPES_H -#define __TITYPES_H + +#pragma once /* * VOID ReferenceObject( @@ -306,6 +306,4 @@ typedef struct _TI_QUERY_CONTEXT { TCP_REQUEST_QUERY_INFORMATION_EX QueryInfo; } TI_QUERY_CONTEXT, *PTI_QUERY_CONTEXT; -#endif /* __TITYPES_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/transmit.h b/reactos/drivers/network/tcpip/include/transmit.h index f2ab2d308b3..cef0b998742 100644 --- a/reactos/drivers/network/tcpip/include/transmit.h +++ b/reactos/drivers/network/tcpip/include/transmit.h @@ -4,8 +4,8 @@ * FILE: include/transmit.h * PURPOSE: Internet Protocol transmit prototypes */ -#ifndef __TRANSMIT_H -#define __TRANSMIT_H + +#pragma once typedef VOID (*PIP_TRANSMIT_COMPLETE)( PVOID Context, PNDIS_PACKET Packet, @@ -33,6 +33,4 @@ typedef struct IPFRAGMENT_CONTEXT { NTSTATUS IPSendDatagram(PIP_PACKET IPPacket, PNEIGHBOR_CACHE_ENTRY NCE, PIP_TRANSMIT_COMPLETE Complete, PVOID Context); -#endif /* __TRANSMIT_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/udp.h b/reactos/drivers/network/tcpip/include/udp.h index 55547572a96..e5b52c042f9 100644 --- a/reactos/drivers/network/tcpip/include/udp.h +++ b/reactos/drivers/network/tcpip/include/udp.h @@ -4,8 +4,8 @@ * FILE: include/udp.h * PURPOSE: User Datagram Protocol definitions */ -#ifndef __UDP_H -#define __UDP_H + +#pragma once #define UDP_STARTING_PORT 0x8000 #define UDP_DYNAMIC_PORTS 0x8000 @@ -62,6 +62,4 @@ NTSTATUS UDPShutdown( UINT UDPAllocatePort( UINT HintPort ); VOID UDPFreePort( UINT Port ); -#endif /* __UDP_H */ - /* EOF */ diff --git a/reactos/drivers/network/tcpip/include/wait.h b/reactos/drivers/network/tcpip/include/wait.h index 655fcd5ab72..37a841d9773 100644 --- a/reactos/drivers/network/tcpip/include/wait.h +++ b/reactos/drivers/network/tcpip/include/wait.h @@ -1,10 +1,7 @@ -#ifndef _TCPIP_WAIT_H -#define _TCPIP_WAIT_H +#pragma once NTSTATUS TcpipWaitForSingleObject( PVOID Object, KWAIT_REASON Reason, KPROCESSOR_MODE WaitMode, BOOLEAN Alertable, PLARGE_INTEGER Timeout ); - -#endif/*_TCPIP_WAIT_H*/ diff --git a/reactos/drivers/parallel/parallel/parallel.h b/reactos/drivers/parallel/parallel/parallel.h index c28e27e45fa..bf09f1ac4e9 100644 --- a/reactos/drivers/parallel/parallel/parallel.h +++ b/reactos/drivers/parallel/parallel/parallel.h @@ -1,5 +1,4 @@ -#ifndef _LINUX_LP_H -#define _LINUX_LP_H +#pragma once /* * usr/include/linux/lp.h c.1991-1992 James Wiegand @@ -133,5 +132,3 @@ * It is used only in the lp_init() routine. */ #define LP_DELAY 150000 - -#endif diff --git a/reactos/drivers/storage/class/include/class2.h b/reactos/drivers/storage/class/include/class2.h index 786233c7ad0..efd55a7f94d 100644 --- a/reactos/drivers/storage/class/include/class2.h +++ b/reactos/drivers/storage/class/include/class2.h @@ -7,8 +7,7 @@ * PROGRAMMER: Eric Kohl */ -#ifndef __INCLUDE_DDK_CLASS2_H -#define __INCLUDE_DDK_CLASS2_H +#pragma once #include "ntddscsi.h" #include "srb.h" @@ -265,7 +264,4 @@ ScsiClassCheckVerifyComplete( IN PVOID Context ); - -#endif /* __INCLUDE_DDK_CLASS2_H */ - /* EOF */ diff --git a/reactos/drivers/storage/class/ramdisk/ramdisk.c b/reactos/drivers/storage/class/ramdisk/ramdisk.c index e3d3d8ecff9..1ebe19664c8 100644 --- a/reactos/drivers/storage/class/ramdisk/ramdisk.c +++ b/reactos/drivers/storage/class/ramdisk/ramdisk.c @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -27,6 +28,8 @@ #define NDEBUG #include +#define DO_XIP 0x00020000 + /* GLOBALS ********************************************************************/ #define RAMDISK_SESSION_SIZE \ diff --git a/reactos/drivers/storage/floppy/floppy.c b/reactos/drivers/storage/floppy/floppy.c index 03c5e8595d9..05d15983fe9 100644 --- a/reactos/drivers/storage/floppy/floppy.c +++ b/reactos/drivers/storage/floppy/floppy.c @@ -686,19 +686,20 @@ static NTSTATUS NTAPI InitController(PCONTROLLER_INFO ControllerInfo) return STATUS_IO_DEVICE_ERROR; } - /* Check if floppy drive exists */ - if(HwSenseInterruptStatus(ControllerInfo) != STATUS_SUCCESS) + /* All controllers should support this so + * if we get something strange back then we + * know that this isn't a floppy controller + */ + if (HwGetVersion(ControllerInfo) <= 0) { - WARN_(FLOPPY, "Floppy drive not detected!\n"); + WARN_(FLOPPY, "InitController: unable to contact controller\n"); return STATUS_NO_SUCH_DEVICE; } - INFO_(FLOPPY, "InitController: resetting the controller after floppy detection\n"); - - /* Reset the controller again after drive detection */ + /* Reset the controller to avoid interrupt garbage on certain controllers */ if(HwReset(ControllerInfo) != STATUS_SUCCESS) { - WARN_(FLOPPY, "InitController: unable to reset controller\n"); + WARN_(FLOPPY, "InitController: unable to reset controller #2\n"); return STATUS_IO_DEVICE_ERROR; } @@ -971,7 +972,7 @@ static BOOLEAN NTAPI AddControllers(PDRIVER_OBJECT DriverObject) } /* 3e: Set up the DPC */ - IoInitializeDpcRequest(gControllerInfo[i].DriveInfo[j].DeviceObject, DpcForIsr); + IoInitializeDpcRequest(gControllerInfo[i].DriveInfo[j].DeviceObject, (PIO_DPC_ROUTINE)DpcForIsr); /* 3f: Point the device extension at our DriveInfo struct */ gControllerInfo[i].DriveInfo[j].DeviceObject->DeviceExtension = &gControllerInfo[i].DriveInfo[j]; diff --git a/reactos/drivers/storage/floppy/hardware.c b/reactos/drivers/storage/floppy/hardware.c index 206e56e50a1..d89b5dc9224 100644 --- a/reactos/drivers/storage/floppy/hardware.c +++ b/reactos/drivers/storage/floppy/hardware.c @@ -45,7 +45,6 @@ * with the bit position in the register, or they *might not*. This should * all be converted to standardize on absolute values or shifts. * I prefer bit fields, but they break endianness. - * TODO: Figure out the right delays in Send_Byte and Get_Byte */ #include @@ -54,13 +53,6 @@ #include "floppy.h" #include "hardware.h" -/* - * Global variable that tracks the amount of time we've - * been waiting on the controller - */ -static ULONG TimeIncrement = 0; - - /* * Hardware Support Routines */ @@ -131,60 +123,35 @@ static NTSTATUS NTAPI Send_Byte(PCONTROLLER_INFO ControllerInfo, * - Function designed after flowchart in intel datasheet * - 250us max delay. Note that this is exactly 5 times longer * than Microsoft recommends stalling the processor - * - Remember that we can be interrupted here, so this might - * take much more wall clock time than 250us * - PAGED_CODE, because we spin for more than the Microsoft-recommended * maximum. * - This function is necessary because sometimes the FIFO reacts slowly * and isn't yet ready to read or write the next byte - * FIXME: time interval here and in Get_Byte */ { - LARGE_INTEGER StartingTickCount; - LARGE_INTEGER CurrentTickCount; - PUCHAR Address; + int i; PAGED_CODE(); - Address = ControllerInfo->BaseAddress + FIFO; - - if(!TimeIncrement) - TimeIncrement = KeQueryTimeIncrement(); - - StartingTickCount.QuadPart = 0; - - for(;;) + for(i = 0; i < 5; i++) { - if(!ReadyForWrite(ControllerInfo)) - { - ULONG64 ElapsedTicks; - ULONG64 TimeUnits; + if(ReadyForWrite(ControllerInfo)) + break; - /* If this is the first time through... */ - if(!StartingTickCount.QuadPart) - { - KeQueryTickCount(&StartingTickCount); - continue; - } - - /* Otherwise, only do this for 250 us == 2500 100ns units */ - KeQueryTickCount(&CurrentTickCount); - ElapsedTicks = CurrentTickCount.QuadPart - StartingTickCount.QuadPart; - TimeUnits = ElapsedTicks * TimeIncrement; - - if(TimeUnits > 25000000) - break; - - continue; - } - - WRITE_PORT_UCHAR(Address, Byte); - return STATUS_SUCCESS; + KeStallExecutionProcessor(50); } - INFO_(FLOPPY, "Send_Byte: timed out trying to write\n"); - HwDumpRegisters(ControllerInfo); - return STATUS_UNSUCCESSFUL; + if (i < 5) + { + WRITE_PORT_UCHAR(ControllerInfo->BaseAddress + FIFO, Byte); + return STATUS_SUCCESS; + } + else + { + INFO_(FLOPPY, "Send_Byte: timed out trying to write\n"); + HwDumpRegisters(ControllerInfo); + return STATUS_UNSUCCESSFUL; + } } @@ -208,52 +175,29 @@ static NTSTATUS NTAPI Get_Byte(PCONTROLLER_INFO ControllerInfo, * - PAGED_CODE because we spin for longer than Microsoft recommends */ { - LARGE_INTEGER StartingTickCount; - LARGE_INTEGER CurrentTickCount; - PUCHAR Address; + int i; PAGED_CODE(); - Address = ControllerInfo->BaseAddress + FIFO; - - if(!TimeIncrement) - TimeIncrement = KeQueryTimeIncrement(); - - StartingTickCount.QuadPart = 0; - - for(;;) + for(i = 0; i < 5; i++) { - if(!ReadyForRead(ControllerInfo)) - { - ULONG64 ElapsedTicks; - ULONG64 TimeUnits; + if(ReadyForRead(ControllerInfo)) + break; - /* if this is the first time through, start the timer */ - if(!StartingTickCount.QuadPart) - { - KeQueryTickCount(&StartingTickCount); - continue; - } - - /* Otherwise, only do this for 250 us == 2500 100ns units */ - KeQueryTickCount(&CurrentTickCount); - ElapsedTicks = CurrentTickCount.QuadPart - StartingTickCount.QuadPart; - TimeUnits = ElapsedTicks * TimeIncrement; - - if(TimeUnits > 25000000) - break; - - continue; - } - - *Byte = READ_PORT_UCHAR(Address); - - return STATUS_SUCCESS; + KeStallExecutionProcessor(50); } - WARN_(FLOPPY, "Get_Byte: timed out trying to read\n"); - HwDumpRegisters(ControllerInfo); - return STATUS_UNSUCCESSFUL; + if (i < 5) + { + *Byte = READ_PORT_UCHAR(ControllerInfo->BaseAddress + FIFO); + return STATUS_SUCCESS; + } + else + { + INFO_(FLOPPY, "Get_Byte: timed out trying to write\n"); + HwDumpRegisters(ControllerInfo); + return STATUS_UNSUCCESSFUL; + } } diff --git a/reactos/drivers/storage/ide/atapi/atapi.rbuild b/reactos/drivers/storage/ide/atapi/atapi.rbuild index 708522b1248..2f6b428acdd 100644 --- a/reactos/drivers/storage/ide/atapi/atapi.rbuild +++ b/reactos/drivers/storage/ide/atapi/atapi.rbuild @@ -3,8 +3,6 @@ . - ntoskrnl - hal scsiport atapi.c atapi.rc diff --git a/reactos/drivers/storage/ide/uniata/id_ata.cpp b/reactos/drivers/storage/ide/uniata/id_ata.cpp index 8795f1f5465..b279b34c72a 100644 --- a/reactos/drivers/storage/ide/uniata/id_ata.cpp +++ b/reactos/drivers/storage/ide/uniata/id_ata.cpp @@ -687,7 +687,7 @@ AtapiSoftReset( GetBaseStatus(chan, statusByte2); KdPrint2((PRINT_PREFIX " statusByte2 %x:\n", statusByte2)); SelectDrive(chan, DeviceNumber); - AtapiStallExecution(10000); + AtapiStallExecution(500); AtapiWritePort1(chan, IDX_IO1_o_Command, IDE_COMMAND_ATAPI_RESET); // ReactOS modification: Already stop looping when we know that the drive has finished resetting. diff --git a/reactos/drivers/storage/ide/uniata/id_probe.cpp b/reactos/drivers/storage/ide/uniata/id_probe.cpp index 5a617cbe913..f254236e05d 100644 --- a/reactos/drivers/storage/ide/uniata/id_probe.cpp +++ b/reactos/drivers/storage/ide/uniata/id_probe.cpp @@ -2723,6 +2723,7 @@ CheckDevice( signatureHigh; UCHAR statusByte; ULONG RetVal=0; + ULONG waitCount = 10000; KdPrint2((PRINT_PREFIX "CheckDevice: Device %#x\n", deviceNumber)); @@ -2745,7 +2746,22 @@ CheckDevice( // Perform hard-reset. KdPrint2((PRINT_PREFIX "CheckDevice: BUSY\n")); + + AtapiWritePort1(chan, IDX_IO2_o_Control, IDE_DC_RESET_CONTROLLER ); + AtapiStallExecution(500 * 1000); + AtapiWritePort1(chan, IDX_IO2_o_Control, IDE_DC_REENABLE_CONTROLLER); + SelectDrive(chan, deviceNumber & 0x01); + + do { + // Wait for Busy to drop. + AtapiStallExecution(100); + GetStatus(chan, statusByte); + + } while ((statusByte & IDE_STATUS_BUSY) && waitCount--); + GetBaseStatus(chan, statusByte); + KdPrint2((PRINT_PREFIX + "CheckDevice: status after hard reset %x\n", statusByte)); } if((statusByte | IDE_STATUS_BUSY) == 0xff) { diff --git a/reactos/drivers/storage/ide/uniata/ntddk_ex.h b/reactos/drivers/storage/ide/uniata/ntddk_ex.h index 221ba792316..e13ca480909 100644 --- a/reactos/drivers/storage/ide/uniata/ntddk_ex.h +++ b/reactos/drivers/storage/ide/uniata/ntddk_ex.h @@ -8,8 +8,8 @@ #endif #ifndef FILE_CHARACTERISTIC_PNP_DEVICE // DDK 2003 - #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800 +#endif // !FILE_CHARACTERISTIC_PNP_DEVICE typedef enum _SYSTEM_INFORMATION_CLASS { SystemBasicInformation, @@ -127,8 +127,6 @@ typedef enum _SYSTEM_INFORMATION_CLASS { #endif //__REACTOS__ } SYSTEM_INFORMATION_CLASS; -#endif // !FILE_CHARACTERISTIC_PNP_DEVICE - NTSYSAPI NTSTATUS diff --git a/reactos/drivers/storage/port/buslogic/BT958dt.h b/reactos/drivers/storage/port/buslogic/BT958dt.h index fea7c9013c4..51dce2c11f9 100644 --- a/reactos/drivers/storage/port/buslogic/BT958dt.h +++ b/reactos/drivers/storage/port/buslogic/BT958dt.h @@ -20,9 +20,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ - -#ifndef _BT958dt_h_ -#define _BT958dt_h_ +#pragma once // BT958ExtendedSetupInfoGuid - BT958ExtendedSetupInfo // BT958 Extended Setup Information (Operation Code 8Dh) @@ -101,5 +99,3 @@ typedef struct _BT958ExtendedSetupInfo #define BT958ExtendedSetupInfo_HostSmartTermination_ID 13 } BT958ExtendedSetupInfo, *PBT958ExtendedSetupInfo; - -#endif diff --git a/reactos/drivers/storage/port/buslogic/BusLogic958.h b/reactos/drivers/storage/port/buslogic/BusLogic958.h index 4af8d0a78f4..9ca15dec94c 100644 --- a/reactos/drivers/storage/port/buslogic/BusLogic958.h +++ b/reactos/drivers/storage/port/buslogic/BusLogic958.h @@ -34,8 +34,7 @@ // Prototype for functions -#ifndef _BT958_H_ -#define _BT958_H_ +#pragma once #include #include @@ -1182,5 +1181,3 @@ BusLogic_IncrementErrorCounter(unsigned short *ErrorCounter) if (*ErrorCounter < 65535) (*ErrorCounter)++; } //____________________________________________________________________________________________ - -#endif // _BT958_H_ diff --git a/reactos/drivers/storage/port/buslogic/buslogic.rbuild b/reactos/drivers/storage/port/buslogic/buslogic.rbuild index f5b652dd8e6..3347f10b98d 100644 --- a/reactos/drivers/storage/port/buslogic/buslogic.rbuild +++ b/reactos/drivers/storage/port/buslogic/buslogic.rbuild @@ -1,10 +1,8 @@ - + . - ntoskrnl - hal scsiport BusLogic958.c BusLogic958.rc diff --git a/reactos/drivers/usb/usbehci/common.c b/reactos/drivers/usb/usbehci/common.c index f03325dc7b8..79ecbadf25f 100644 --- a/reactos/drivers/usb/usbehci/common.c +++ b/reactos/drivers/usb/usbehci/common.c @@ -103,7 +103,6 @@ ForwardIrpAndForget(PDEVICE_OBJECT DeviceObject, PIRP Irp) PDEVICE_OBJECT LowerDevice; LowerDevice = ((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->LowerDevice; -DPRINT1("DeviceObject %x, LowerDevice %x\n", DeviceObject, LowerDevice); ASSERT(LowerDevice); IoSkipCurrentIrpStackLocation(Irp); diff --git a/reactos/drivers/usb/usbehci/fdo.c b/reactos/drivers/usb/usbehci/fdo.c index 5435f7260c7..eebc0c0905a 100644 --- a/reactos/drivers/usb/usbehci/fdo.c +++ b/reactos/drivers/usb/usbehci/fdo.c @@ -10,15 +10,36 @@ /* INCLUDES *******************************************************************/ #include "usbehci.h" #include + //#include "ntstrsafe.h" +VOID NTAPI +DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context) +{ + PWORKITEM_DATA WorkItemData; + PPDO_DEVICE_EXTENSION PdoDeviceExtension; + + WorkItemData = (PWORKITEM_DATA)Context; + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension; + + if (PdoDeviceExtension->CallbackRoutine) + PdoDeviceExtension->CallbackRoutine(PdoDeviceExtension->CallbackContext); + else + DPRINT1("PdoDeviceExtension->CallbackRoutine is NULL!\n"); + + IoFreeWorkItem(WorkItemData->IoWorkItem); + ExFreePool(WorkItemData); +} + VOID NTAPI EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2) { PFDO_DEVICE_EXTENSION FdoDeviceExtension; + PPDO_DEVICE_EXTENSION PdoDeviceExtension; ULONG CStatus; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) DeferredContext; + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) FdoDeviceExtension->Pdo->DeviceExtension; CStatus = (ULONG) SystemArgument2; @@ -40,7 +61,6 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO if (tmp & 0x02) { PWORKITEM_DATA WorkItemData = NULL; - /* Connect or Disconnect? */ if (tmp & 0x01) { @@ -81,27 +101,12 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO tmp = READ_REGISTER_ULONG((PULONG)((Base + EHCI_PORTSC) + (4 * i))); DPRINT("port tmp %x\n", tmp); - GetDeviceDescriptor(FdoDeviceExtension, 0); - FdoDeviceExtension->ChildDeviceCount++; - CompletePendingRequest(FdoDeviceExtension); - + GetDeviceDescriptor(FdoDeviceExtension, 0, 0, FALSE); + PdoDeviceExtension->ChildDeviceCount++; WorkItemData = ExAllocatePool(NonPagedPool, sizeof(WORKITEM_DATA)); - if (!WorkItemData) - { - DPRINT1("No memory\n"); - break; - } - - WorkItemData->IoWorkItem = IoAllocateWorkItem(FdoDeviceExtension->Pdo); - if (!WorkItemData->IoWorkItem) - { - DPRINT1("WorkItem allocation failed!\n"); - break; - } - - - WorkItemData->FdoDeviceExtension = FdoDeviceExtension; - + if (!WorkItemData) ASSERT(FALSE); + WorkItemData->IoWorkItem = IoAllocateWorkItem(PdoDeviceExtension->DeviceObject); + WorkItemData->PdoDeviceExtension = PdoDeviceExtension; IoQueueWorkItem(WorkItemData->IoWorkItem, (PIO_WORKITEM_ROUTINE)DeviceArrivalWorkItem, DelayedWorkQueue, @@ -116,7 +121,6 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO tmp |= 0x02; WRITE_REGISTER_ULONG((PULONG) ((Base + EHCI_PORTSC) + (4 * i)), tmp); } - } } } @@ -180,7 +184,6 @@ InterruptService(PKINTERRUPT Interrupt, PVOID ServiceContext) BOOLEAN ResetPort(PDEVICE_OBJECT DeviceObject) { - /*FIXME: Implement me */ return TRUE; @@ -310,8 +313,6 @@ StartEhci(PDEVICE_OBJECT DeviceObject) EHCI_USBINTR_INTE | EHCI_USBINTR_ERR | EHCI_USBINTR_ASYNC | EHCI_USBINTR_HSERR | EHCI_USBINTR_FLROVR | EHCI_USBINTR_PC); - //UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; - UsbCmd->Run = 1; WRITE_REGISTER_ULONG((PULONG)(base + EHCI_USBCMD), tmp); @@ -351,14 +352,12 @@ GetCapabilities(PFDO_DEVICE_EXTENSION DeviceExtension, ULONG Base) PCap->HCSParamsLong = READ_REGISTER_ULONG((PULONG)(Base + 4)); PCap->HCCParams = READ_REGISTER_ULONG((PULONG)(Base + 8)); - 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"); @@ -412,8 +411,8 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART DeviceDescription.MaximumLength = EHCI_MAX_SIZE_TRANSFER; FdoDeviceExtension->pDmaAdapter = IoGetDmaAdapter(FdoDeviceExtension->LowerDevice, - &DeviceDescription, - &FdoDeviceExtension->MapRegisters); + &DeviceDescription, + &FdoDeviceExtension->MapRegisters); if (FdoDeviceExtension->pDmaAdapter == NULL) { @@ -561,14 +560,16 @@ FdoQueryBusRelations( NTSTATUS Status; ULONG UsbDeviceNumber = 0; WCHAR CharDeviceName[64]; + UNICODE_STRING DeviceName; DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - /* Create the PDO */ + + /* Create the PDO with the next available number */ while (TRUE) { - /* FIXME: Use safe string sprintf*/ - /* RtlStringCchPrintfW(CharDeviceName, 64, L"USBFDO-%d", UsbDeviceNumber); */ + /* FIXME: Use safe string */ + /* RtlStringCchPrintfW(CharDeviceName, 64, L"USBPDO-%d", UsbDeviceNumber); */ swprintf(CharDeviceName, L"\\Device\\USBPDO-%d", UsbDeviceNumber); RtlInitUnicodeString(&DeviceName, CharDeviceName); DPRINT("DeviceName %wZ\n", &DeviceName); @@ -604,20 +605,17 @@ FdoQueryBusRelations( PdoDeviceExtension->Common.IsFdo = FALSE; PdoDeviceExtension->ControllerFdo = DeviceObject; + PdoDeviceExtension->DeviceObject = Pdo; + + InitializeListHead(&PdoDeviceExtension->IrpQueue); + KeInitializeSpinLock(&PdoDeviceExtension->IrpQueueLock); Pdo->Flags &= ~DO_DEVICE_INITIALIZING; + DeviceExtension->Pdo = Pdo; - /*swprintf(CharSymLinkName, L"\\Device\\HCD%d", UsbDeviceNumber); - RtlInitUnicodeString(&SymLinkName, CharSymLinkName); - Status = IoCreateSymbolicLink(&SymLinkName, &DeviceName); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("Warning: Unable to create symbolic link for ehci usb device!\n"); - }*/ - DeviceRelations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS)); + if (!DeviceRelations) { return STATUS_INSUFFICIENT_RESOURCES; @@ -646,7 +644,7 @@ FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { case IRP_MN_START_DEVICE: { - DPRINT("START_DEVICE\n"); + DPRINT1("START_DEVICE\n"); Irp->IoStatus.Status = STATUS_SUCCESS; Status = ForwardAndWait(DeviceObject, Irp); @@ -657,7 +655,7 @@ FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) } case IRP_MN_QUERY_DEVICE_RELATIONS: { - DPRINT("IRP_MN_QUERY_DEVICE_RELATIONS\n"); + DPRINT1("IRP_MN_QUERY_DEVICE_RELATIONS\n"); switch(Stack->Parameters.QueryDeviceRelations.Type) { case BusRelations: @@ -687,6 +685,14 @@ FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { DPRINT("IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n"); } + case IRP_MN_QUERY_INTERFACE: + { + Status = STATUS_SUCCESS; + Information = 0; + Status = ForwardIrpAndForget(DeviceObject, Irp); + return Status; + break; + } default: { DPRINT1("IRP_MJ_PNP / Unhandled minor function 0x%lx\n", Stack->MinorFunction); @@ -710,21 +716,22 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) WCHAR CharSymLinkName[64]; UNICODE_STRING DeviceName; UNICODE_STRING SymLinkName; + UNICODE_STRING InterfaceSymLinkName; ULONG BytesRead; PCI_COMMON_CONFIG PciConfig; PFDO_DEVICE_EXTENSION FdoDeviceExtension; - DPRINT1("Ehci AddDevice\n"); + DPRINT("Ehci AddDevice\n"); - /* Create the FDO */ + /* Create the FDO with next available number */ while (TRUE) { /* FIXME: Use safe string sprintf*/ /* RtlStringCchPrintfW(CharDeviceName, 64, L"USBFDO-%d", UsbDeviceNumber); */ swprintf(CharDeviceName, L"\\Device\\USBFDO-%d", UsbDeviceNumber); RtlInitUnicodeString(&DeviceName, CharDeviceName); - DPRINT1("DeviceName %wZ\n", &DeviceName); + DPRINT("DeviceName %wZ\n", &DeviceName); Status = IoCreateDevice(DriverObject, sizeof(FDO_DEVICE_EXTENSION), @@ -734,8 +741,8 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) FALSE, &Fdo); - if (NT_SUCCESS(Status)) - break; + if (NT_SUCCESS(Status)) + break; if ((Status == STATUS_OBJECT_NAME_EXISTS) || (Status == STATUS_OBJECT_NAME_COLLISION)) { @@ -758,21 +765,17 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) if (!NT_SUCCESS(Status)) { - DPRINT1("Warning: Unable to create symbolic link for ehci usb device!\n"); + DPRINT1("Warning: Unable to create symbolic link for ehci host controller!\n"); } - DPRINT("Attaching created device %x to %x\n", Fdo, Pdo); - FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) Fdo->DeviceExtension; RtlZeroMemory(FdoDeviceExtension, sizeof(PFDO_DEVICE_EXTENSION)); - InitializeListHead(&FdoDeviceExtension->IrpQueue); - KeInitializeSpinLock(&FdoDeviceExtension->IrpQueueLock); - FdoDeviceExtension->Common.IsFdo = TRUE; FdoDeviceExtension->DeviceObject = Fdo; FdoDeviceExtension->LowerDevice = IoAttachDeviceToDeviceStack(Fdo, Pdo); + if (FdoDeviceExtension->LowerDevice == NULL) { DPRINT1("UsbEhci: Failed to attach to device stack!\n"); @@ -782,10 +785,10 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) return STATUS_NO_SUCH_DEVICE; } - Fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE; + Fdo->Flags |= DO_BUFFERED_IO;// | DO_POWER_PAGABLE; - DPRINT("Attached %x!\n", FdoDeviceExtension->LowerDevice); ASSERT(FdoDeviceExtension->LowerDevice == Pdo); + Status = GetBusInterface(FdoDeviceExtension->LowerDevice, &FdoDeviceExtension->BusInterface); if (!NT_SUCCESS(Status)) @@ -797,8 +800,6 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) return Status; } - DPRINT("Context %x\n", FdoDeviceExtension->BusInterface.Context); - BytesRead = (*FdoDeviceExtension->BusInterface.GetBusData)( FdoDeviceExtension->BusInterface.Context, PCI_WHICHSPACE_CONFIG, @@ -827,15 +828,24 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) DPRINT("PCI_ENABLE_BUS_MASTER\n"); DPRINT("BaseAddress[0] %x\n", PciConfig.u.type0.BaseAddresses[0]); - DPRINT("Vendor %x\n", PciConfig.VendorID); - DPRINT("Device %x\n", PciConfig.DeviceID); + DPRINT1("Vendor %x\n", PciConfig.VendorID); + DPRINT1("Device %x\n", PciConfig.DeviceID); FdoDeviceExtension->VendorId = PciConfig.VendorID; FdoDeviceExtension->DeviceId = PciConfig.DeviceID; - DPRINT("FdoDeviceExtension->NextLowerDevice %x\n", FdoDeviceExtension->LowerDevice); FdoDeviceExtension->DeviceState = DEVICEINTIALIZED; + Status = IoRegisterDeviceInterface(Pdo, &GUID_DEVINTERFACE_USB_HOST_CONTROLLER, NULL, &InterfaceSymLinkName); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Unable to register device interface!\n"); + } + else + { + Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE); + DPRINT1("SetInterfaceState %x\n", Status); + } Fdo->Flags &= ~DO_DEVICE_INITIALIZING; return STATUS_SUCCESS; diff --git a/reactos/drivers/usb/usbehci/irp.c b/reactos/drivers/usb/usbehci/irp.c index 9be9e8b0f30..29af1f92ce7 100644 --- a/reactos/drivers/usb/usbehci/irp.c +++ b/reactos/drivers/usb/usbehci/irp.c @@ -10,28 +10,26 @@ #include "usbehci.h" VOID -RequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp) +RequestURBCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp) { PPDO_DEVICE_EXTENSION PdoDeviceExtension; - PFDO_DEVICE_EXTENSION FdoDeviceExtension; PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension; - FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension; KIRQL OldIrql = Irp->CancelIrql; IoReleaseCancelSpinLock(DISPATCH_LEVEL); - KeAcquireSpinLockAtDpcLevel(&FdoDeviceExtension->IrpQueueLock); + KeAcquireSpinLockAtDpcLevel(&PdoDeviceExtension->IrpQueueLock); RemoveEntryList(&Irp->Tail.Overlay.ListEntry); - KeReleaseSpinLock(&FdoDeviceExtension->IrpQueueLock, OldIrql); + KeReleaseSpinLock(&PdoDeviceExtension->IrpQueueLock, OldIrql); - Irp->IoStatus.Status = STATUS_CANCELLED; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + Irp->IoStatus.Status = STATUS_CANCELLED; + IoCompleteRequest(Irp, IO_NO_INCREMENT); } VOID -QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp) +QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp) { KIRQL OldIrql; @@ -51,10 +49,13 @@ QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp) } VOID -CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension) +CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) { PLIST_ENTRY NextIrp = NULL; + NTSTATUS Status = STATUS_UNSUCCESSFUL; + ULONG_PTR Information = 0; PIO_STACK_LOCATION Stack; + PUSB_DEVICE UsbDevice = NULL; KIRQL oldIrql; PIRP Irp = NULL; URB *Urb; @@ -75,18 +76,354 @@ CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension) Urb = (PURB) Stack->Parameters.Others.Argument1; ASSERT(Urb); - /* FIXME: Fill in information for Argument1/URB */ + Information = 0; + Status = STATUS_SUCCESS; - DPRINT("TransferBuffer %x\n", Urb->UrbControlDescriptorRequest.TransferBuffer); - DPRINT("TransferBufferLength %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); - DPRINT("Index %x\n", Urb->UrbControlDescriptorRequest.Index); - DPRINT("DescriptorType %x\n", Urb->UrbControlDescriptorRequest.DescriptorType); - DPRINT("LanguageId %x\n", Urb->UrbControlDescriptorRequest.LanguageId); + DPRINT1("TransferBuffer %x\n", Urb->UrbControlDescriptorRequest.TransferBuffer); + DPRINT1("TransferBufferLength %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); + DPRINT1("UsbdDeviceHandle = %x\n", Urb->UrbHeader.UsbdDeviceHandle); - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; + UsbDevice = Urb->UrbHeader.UsbdDeviceHandle; + /* UsbdDeviceHandle of 0 is root hub */ + if (UsbDevice == NULL) + UsbDevice = DeviceExtension->UsbDevices[0]; + + switch (Urb->UrbHeader.Function) + { + case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: + { + /* Are we suppose to only return on this request when a device is connected + or is it the RootHubInitNotification Callback */ + DPRINT1("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:\n"); + DPRINT1("--->TransferBufferLength %x\n",Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); + DPRINT1("--->TransferBuffer %x\n",Urb->UrbBulkOrInterruptTransfer.TransferBuffer); + DPRINT1("--->PipeHandle %x\n",Urb->UrbBulkOrInterruptTransfer.PipeHandle); + DPRINT1("--->TransferFlags %x\n", Urb->UrbBulkOrInterruptTransfer.TransferFlags); + /* FIXME */ + RtlZeroMemory(Urb->UrbBulkOrInterruptTransfer.TransferBuffer, Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); + ((PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0] = 1; + /* Turn off Irp handling as nothing is handled beyond this */ + DeviceExtension->HaltUrbHandling = TRUE; + break; + } + case URB_FUNCTION_GET_STATUS_FROM_DEVICE: + { + DPRINT1("Get Status from Device\n"); + break; + } + case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE: + { + Urb->UrbHeader.Function = 0x08; + Urb->UrbHeader.UsbdFlags = 0; + Urb->UrbHeader.UsbdDeviceHandle = UsbDevice; + + switch(Urb->UrbControlDescriptorRequest.DescriptorType) + { + case USB_DEVICE_DESCRIPTOR_TYPE: + { + DPRINT1("USB DEVICE DESC\n"); + if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= sizeof(USB_DEVICE_DESCRIPTOR)) + { + Urb->UrbControlDescriptorRequest.TransferBufferLength = sizeof(USB_DEVICE_DESCRIPTOR); + } + + RtlCopyMemory(Urb->UrbControlDescriptorRequest.TransferBuffer, + &UsbDevice->DeviceDescriptor, + Urb->UrbControlDescriptorRequest.TransferBufferLength); + + Urb->UrbHeader.Status = USBD_STATUS_SUCCESS; + + break; + } + case USB_CONFIGURATION_DESCRIPTOR_TYPE: + { + DPRINT1("USB CONFIG DESC\n"); + ULONG FullDescriptorLength = sizeof(USB_CONFIGURATION_DESCRIPTOR) + + sizeof(USB_INTERFACE_DESCRIPTOR) + + sizeof(USB_ENDPOINT_DESCRIPTOR); + + if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= FullDescriptorLength) + { + Urb->UrbControlDescriptorRequest.TransferBufferLength = FullDescriptorLength; + } + + RtlCopyMemory(Urb->UrbControlDescriptorRequest.TransferBuffer, + &UsbDevice->ConfigurationDescriptor, + Urb->UrbControlDescriptorRequest.TransferBufferLength); + + Urb->UrbHeader.Status = USBD_STATUS_SUCCESS; + + break; + } + case USB_STRING_DESCRIPTOR_TYPE: + { + DPRINT1("Usb String Descriptor not implemented\n"); + break; + } + default: + { + DPRINT1("Descriptor Type %x not supported!\n", Urb->UrbControlDescriptorRequest.DescriptorType); + } + } + break; + } + case URB_FUNCTION_SELECT_CONFIGURATION: + { + PUSBD_INTERFACE_INFORMATION InterfaceInfo; + LONG iCount, pCount; + + DPRINT("Selecting Configuration\n"); + DPRINT("Length %x\n", Urb->UrbHeader.Length); + DPRINT("Urb->UrbSelectConfiguration.ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle); + + if (Urb->UrbSelectConfiguration.ConfigurationDescriptor) + { + DPRINT("ConfigurationDescriptor = %p\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor); + DPRINT(" bLength = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bLength); + DPRINT(" bDescriptorType = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bDescriptorType); + DPRINT(" wTotalLength = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->wTotalLength); + DPRINT(" bNumInterfaces = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bNumInterfaces); + DPRINT(" bConfigurationValue = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bConfigurationValue); + DPRINT(" iConfiguration = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->iConfiguration); + DPRINT(" bmAttributes = %04x\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->bmAttributes); + DPRINT(" MaxPower = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->MaxPower); + + + Urb->UrbSelectConfiguration.ConfigurationHandle = (PVOID)&DeviceExtension->UsbDevices[0]->ConfigurationDescriptor; + DPRINT("ConfigHandle %x\n", Urb->UrbSelectConfiguration.ConfigurationHandle); + InterfaceInfo = &Urb->UrbSelectConfiguration.Interface; + + for (iCount = 0; iCount < Urb->UrbSelectConfiguration.ConfigurationDescriptor->bNumInterfaces; iCount++) + { + DPRINT("InterfaceInformation[%d]\n", iCount); + DPRINT(" Length = %d\n", InterfaceInfo->Length); + DPRINT(" InterfaceNumber = %d\n", InterfaceInfo->InterfaceNumber); + DPRINT(" AlternateSetting = %d\n", InterfaceInfo->AlternateSetting); + DPRINT(" Class = %02x\n", (ULONG)InterfaceInfo->Class); + DPRINT(" SubClass = %02x\n", (ULONG)InterfaceInfo->SubClass); + DPRINT(" Protocol = %02x\n", (ULONG)InterfaceInfo->Protocol); + DPRINT(" Reserved = %02x\n", (ULONG)InterfaceInfo->Reserved); + DPRINT(" InterfaceHandle = %p\n", InterfaceInfo->InterfaceHandle); + DPRINT(" NumberOfPipes = %d\n", InterfaceInfo->NumberOfPipes); + InterfaceInfo->InterfaceHandle = (PVOID)&UsbDevice->InterfaceDescriptor; + InterfaceInfo->Class = UsbDevice->InterfaceDescriptor.bInterfaceClass; + InterfaceInfo->SubClass = UsbDevice->InterfaceDescriptor.bInterfaceSubClass; + InterfaceInfo->Protocol = UsbDevice->InterfaceDescriptor.bInterfaceProtocol; + InterfaceInfo->Reserved = 0; + + for (pCount = 0; pCount < InterfaceInfo->NumberOfPipes; pCount++) + { + DPRINT("Pipe[%d]\n", pCount); + DPRINT(" MaximumPacketSize = %d\n", InterfaceInfo->Pipes[pCount].MaximumPacketSize); + DPRINT(" EndpointAddress = %d\n", InterfaceInfo->Pipes[pCount].EndpointAddress); + DPRINT(" Interval = %d\n", InterfaceInfo->Pipes[pCount].Interval); + DPRINT(" PipeType = %d\n", InterfaceInfo->Pipes[pCount].PipeType); + DPRINT(" PipeHandle = %x\n", InterfaceInfo->Pipes[pCount].PipeHandle); + DPRINT(" MaximumTransferSize = %d\n", InterfaceInfo->Pipes[pCount].MaximumTransferSize); + DPRINT(" PipeFlags = %08x\n", InterfaceInfo->Pipes[pCount].PipeFlags); + InterfaceInfo->Pipes[pCount].MaximumPacketSize = UsbDevice->EndPointDescriptor.wMaxPacketSize; + InterfaceInfo->Pipes[pCount].EndpointAddress = UsbDevice->EndPointDescriptor.bEndpointAddress; + InterfaceInfo->Pipes[pCount].Interval = UsbDevice->EndPointDescriptor.bInterval; + InterfaceInfo->Pipes[pCount].PipeType = UsbdPipeTypeInterrupt; + InterfaceInfo->Pipes[pCount].PipeHandle = (PVOID)&UsbDevice->EndPointDescriptor; + if (InterfaceInfo->Pipes[pCount].MaximumTransferSize == 0) + InterfaceInfo->Pipes[pCount].MaximumTransferSize = 4096; + /* InterfaceInfo->Pipes[j].PipeFlags = 0; */ + } + InterfaceInfo = (PUSBD_INTERFACE_INFORMATION)((PUCHAR)InterfaceInfo + InterfaceInfo->Length); + } + + Urb->UrbHeader.UsbdDeviceHandle = UsbDevice; + Urb->UrbHeader.UsbdFlags = 0; + Urb->UrbHeader.Status = USBD_STATUS_SUCCESS; + } + else + { + /* FIXME: Set device to unconfigured state */ + } + break; + } + case URB_FUNCTION_CLASS_DEVICE: + { + 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: + case USB_DEVICE_CLASS_HUB: + { + PUSB_HUB_DESCRIPTOR UsbHubDescr = Urb->UrbControlVendorClassRequest.TransferBuffer; + /* FIXME: Handle more than root hub? */ + if(Urb->UrbControlVendorClassRequest.TransferBufferLength >= sizeof(USB_HUB_DESCRIPTOR)) + { + Urb->UrbControlVendorClassRequest.TransferBufferLength = sizeof(USB_HUB_DESCRIPTOR); + } + else + { + /* FIXME: Handle this correctly */ + UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR); + UsbHubDescr->bDescriptorType = 0x29; + return; + } + DPRINT1("USB_DEVICE_CLASS_HUB request\n"); + UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR); + UsbHubDescr->bDescriptorType = 0x29; + UsbHubDescr->bNumberOfPorts = 0x08; + UsbHubDescr->wHubCharacteristics = 0x0012; + UsbHubDescr->bPowerOnToPowerGood = 0x01; + UsbHubDescr->bHubControlCurrent = 0x00; + UsbHubDescr->bRemoveAndPowerMask[0] = 0x00; + UsbHubDescr->bRemoveAndPowerMask[1] = 0x00; + UsbHubDescr->bRemoveAndPowerMask[2] = 0xff; + break; + } + default: + { + DPRINT1("Unknown UrbControlVendorClassRequest Value\n"); + } + } + Urb->UrbHeader.Function = 0x08; + Urb->UrbHeader.Status = USBD_STATUS_SUCCESS; + Urb->UrbHeader.UsbdDeviceHandle = UsbDevice; + Urb->UrbHeader.UsbdFlags = 0; + break; + } + default: + { + DPRINT1("Unhandled URB request for class device\n"); + Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; + } + } + break; + } + case URB_FUNCTION_CLASS_OTHER: + { + switch (Urb->UrbControlVendorClassRequest.Request) + { + case USB_REQUEST_GET_STATUS: + { + DPRINT1("USB_REQUEST_GET_STATUS\n"); + break; + } + case USB_REQUEST_CLEAR_FEATURE: + { + DPRINT1("USB_REQUEST_CLEAR_FEATURE\n"); + break; + } + case USB_REQUEST_SET_FEATURE: + { + DPRINT1("USB_REQUEST_SET_FEATURE value %x\n", Urb->UrbControlVendorClassRequest.Value); + switch(Urb->UrbControlVendorClassRequest.Value) + { + /* FIXME: Needs research */ + case 0x01: + { + } + } + 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; + } + } + break; + } + default: + { + DPRINT1("Unhandled URB %x\n", Urb->UrbHeader.Function); + Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; + } + + } KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql); + + Irp->IoStatus.Status = Status; + Irp->IoStatus.Information = Information; + IoCompleteRequest(Irp, IO_NO_INCREMENT); KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &oldIrql); } @@ -94,64 +431,3 @@ CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension) KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql); } -NTSTATUS -NTAPI -ArrivalNotificationCompletion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID PContext) -{ - PDEVICE_OBJECT PortDeviceObject = (PDEVICE_OBJECT) PContext; - IoFreeIrp(Irp); - ObDereferenceObject(PortDeviceObject); - return STATUS_MORE_PROCESSING_REQUIRED; -} - -VOID -DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context) -{ - PWORKITEM_DATA WorkItemData; - PIO_STACK_LOCATION IrpStack = NULL; - PDEVICE_OBJECT PortDeviceObject = NULL; - PIRP Irp = NULL; - - WorkItemData = (PWORKITEM_DATA)Context; - - PortDeviceObject = IoGetAttachedDeviceReference(WorkItemData->FdoDeviceExtension->Pdo); - - if (!PortDeviceObject) - { - DPRINT1("Unable to notify Pdos parent of device arrival.\n"); - goto Cleanup; - } - - if (PortDeviceObject == DeviceObject) - { - /* Piontless to send query relations to ourself */ - ObDereferenceObject(PortDeviceObject); - goto Cleanup; - } - - Irp = IoAllocateIrp(PortDeviceObject->StackSize, FALSE); - - if (!Irp) - { - DPRINT1("Unable to allocate IRP\n"); - } - - IoSetCompletionRoutine(Irp, - (PIO_COMPLETION_ROUTINE)ArrivalNotificationCompletion, - (PVOID) PortDeviceObject, - TRUE, - TRUE, - TRUE); - - IrpStack = IoGetNextIrpStackLocation(Irp); - IrpStack->Parameters.QueryDeviceRelations.Type = TargetDeviceRelation; - IrpStack->MajorFunction = IRP_MJ_PNP; - IrpStack->MinorFunction = IRP_MN_QUERY_DEVICE_RELATIONS; - - IoCallDriver(PortDeviceObject, Irp); - -Cleanup: - IoFreeWorkItem(WorkItemData->IoWorkItem); - ExFreePool(WorkItemData); -} - diff --git a/reactos/drivers/usb/usbehci/pdo.c b/reactos/drivers/usb/usbehci/pdo.c index 8334a2d1977..3ab717f0f56 100644 --- a/reactos/drivers/usb/usbehci/pdo.c +++ b/reactos/drivers/usb/usbehci/pdo.c @@ -7,15 +7,111 @@ * Michael Martin */ -/* INCLUDES *******************************************************************/ #define INITGUID +#define NDEBUG + #include "usbehci.h" #include +#include "usbiffn.h" #include - -#define NDEBUG #include +/* Lifted from Linux with slight changes */ +const UCHAR ROOTHUB2_DEVICE_DESCRIPTOR [] = +{ + 0x12, /* bLength; */ + USB_DEVICE_DESCRIPTOR_TYPE, /* bDescriptorType; Device */ + 0x00, 0x20, /* bcdUSB; v1.1 */ + USB_DEVICE_CLASS_HUB, /* bDeviceClass; HUB_CLASSCODE */ + 0x01, /* bDeviceSubClass; */ + 0x00, /* bDeviceProtocol; [ low/full speeds only ] */ + 0x08, /* bMaxPacketSize0; 8 Bytes */ + /* Fill Vendor and Product in when init root hub */ + 0x00, 0x00, /* idVendor; */ + 0x00, 0x00, /* idProduct; */ + 0x00, 0x00, /* bcdDevice */ + 0x00, /* iManufacturer; */ + 0x00, /* iProduct; */ + 0x00, /* iSerialNumber; */ + 0x01 /* bNumConfigurations; */ + +}; + +const UCHAR ROOTHUB2_CONFIGURATION_DESCRIPTOR [] = +{ + /* one configuration */ + 0x09, /* bLength; */ + 0x02, /* bDescriptorType; Configuration */ + 0x19, 0x00, /* wTotalLength; */ + 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; */ + + /* one interface */ + 0x09, /* bLength: Interface; */ + 0x04, /* bDescriptorType; Interface */ + 0x00, /* bInterfaceNumber; */ + 0x00, /* bAlternateSetting; */ + 0x01, /* bNumEndpoints; */ + 0x09, /* bInterfaceClass; HUB_CLASSCODE */ + 0x01, /* bInterfaceSubClass; */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface; */ + + /* one endpoint (status change endpoint) */ + 0x07, /* bLength; */ + 0x05, /* bDescriptorType; Endpoint */ + 0x81, /* bEndpointAddress; IN Endpoint 1 */ + 0x03, /* bmAttributes; Interrupt */ + 0x08, 0x00, /* wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8) */ + 0xFF /* bInterval; (255ms -- usb 2.0 spec) */ +}; + +/* FIXME: Do something better */ +VOID NTAPI +UrbWorkerThread(PVOID Context) +{ + PPDO_DEVICE_EXTENSION PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)Context; + + while (PdoDeviceExtension->HaltUrbHandling == FALSE) + { + CompletePendingURBRequest(PdoDeviceExtension); + KeStallExecutionProcessor(10); + } + DPRINT1("Thread terminated\n"); +} + +/* FIXME: Do something better */ +PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub) +{ + PUSB_DEVICE UsbDevicePointer = NULL; + UsbDevicePointer = ExAllocatePool(NonPagedPool, sizeof(USB_DEVICE)); + if (!UsbDevicePointer) + { + DPRINT1("Out of memory\n"); + return NULL; + } + + if ((Hub) && (!Parent)) + { + DPRINT1("This is the root hub\n"); + } + + UsbDevicePointer->Address = DeviceNumber; + UsbDevicePointer->Port = Port; + UsbDevicePointer->ParentDevice = Parent; + + UsbDevicePointer->IsHub = Hub; + + return UsbDevicePointer; +} + NTSTATUS NTAPI PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) { @@ -24,125 +120,101 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) PIO_STACK_LOCATION Stack = NULL; NTSTATUS Status = STATUS_UNSUCCESSFUL; ULONG_PTR Information = 0; - DPRINT("PdoDispatchInternalDeviceControl\n"); PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension; FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension; ASSERT(PdoDeviceExtension->Common.IsFdo == FALSE); + Stack = IoGetCurrentIrpStackLocation(Irp); - DPRINT("IoControlCode %x\n", Stack->Parameters.DeviceIoControl.IoControlCode); + switch(Stack->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_INTERNAL_USB_SUBMIT_URB: { URB *Urb; - DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_URB\n"); - DPRINT("Stack->Parameters.DeviceIoControl.InputBufferLength %d\n", - Stack->Parameters.DeviceIoControl.InputBufferLength); - DPRINT("Stack->Parameters.Others.Argument1 %x\n", Stack->Parameters.Others.Argument1); - Urb = (PURB) Stack->Parameters.Others.Argument1; - DPRINT("Header Size %d\n", Urb->UrbHeader.Length); - DPRINT("Header Type %d\n", Urb->UrbHeader.Function); - DPRINT("Index %x\n", Urb->UrbControlDescriptorRequest.Index); + DPRINT("Header Length %d\n", Urb->UrbHeader.Length); + DPRINT("Header Function %d\n", Urb->UrbHeader.Function); - /* Check the type */ - switch(Urb->UrbHeader.Function) - { - case URB_FUNCTION_SELECT_CONFIGURATION: - { - DPRINT1("URB_FUNCTION_SELECT_CONFIGURATION\n"); - break; - } - case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE: - { - URB *Urb; - DPRINT1("URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n"); - Urb = (PURB) Stack->Parameters.Others.Argument1; - Urb->UrbHeader.Status = 0; - - DPRINT1("Irp->CancelRoutine %x\n",Irp->CancelRoutine); - QueueRequest(FdoDeviceExtension, Irp); - - Information = 0; - - IoMarkIrpPending(Irp); - Status = STATUS_PENDING; - - break; - } - /* FIXME: Handle all other Functions */ - default: - DPRINT1("Not handled yet!\n"); - } + /* Queue all request for now, kernel thread will complete them */ + QueueURBRequest(PdoDeviceExtension, Irp); + Information = 0; + IoMarkIrpPending(Irp); + Status = STATUS_PENDING; break; } case IOCTL_INTERNAL_USB_CYCLE_PORT: { - DPRINT("IOCTL_INTERNAL_USB_CYCLE_PORT\n"); + DPRINT1("IOCTL_INTERNAL_USB_CYCLE_PORT\n"); break; } case IOCTL_INTERNAL_USB_ENABLE_PORT: { - DPRINT("IOCTL_INTERNAL_USB_ENABLE_PORT\n"); + DPRINT1("IOCTL_INTERNAL_USB_ENABLE_PORT\n"); break; } case IOCTL_INTERNAL_USB_GET_BUS_INFO: { - DPRINT("IOCTL_INTERNAL_USB_GET_BUS_INFO\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_BUS_INFO\n"); break; } case IOCTL_INTERNAL_USB_GET_BUSGUID_INFO: { - DPRINT("IOCTL_INTERNAL_USB_GET_BUSGUID_INFO\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_BUSGUID_INFO\n"); break; } case IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME: { - DPRINT("IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME\n"); break; } case IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE: { - DPRINT("IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE\n"); break; } case IOCTL_INTERNAL_USB_GET_HUB_COUNT: { - DPRINT("IOCTL_INTERNAL_USB_GET_HUB_COUNT\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_HUB_COUNT\n"); + + if (Stack->Parameters.Others.Argument1) + { + /* FIXME: Determine the number of hubs between the usb device and root hub */ + /* For now return 0 */ + *(PVOID *)Stack->Parameters.Others.Argument1 = 0; + } break; } case IOCTL_INTERNAL_USB_GET_HUB_NAME: { - DPRINT("IOCTL_INTERNAL_USB_GET_HUB_NAME\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_HUB_NAME\n"); break; } case IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO: { - DPRINT("IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO\n"); break; } case IOCTL_INTERNAL_USB_GET_PORT_STATUS: { - DPRINT("IOCTL_INTERNAL_USB_GET_PORT_STATUS\n"); + DPRINT1("IOCTL_INTERNAL_USB_GET_PORT_STATUS\n"); break; } case IOCTL_INTERNAL_USB_RESET_PORT: { - DPRINT("IOCTL_INTERNAL_USB_RESET_PORT\n"); + DPRINT1("IOCTL_INTERNAL_USB_RESET_PORT\n"); break; } case IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO: { - DPRINT("IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO\n"); - /* This is document as Argument1 = PDO and Argument2 = FDO. - Its actually reversed, the FDO goes in Argument1 and PDO goes in Argument2 */ + DPRINT1("IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO\n"); + if (Stack->Parameters.Others.Argument1) - Stack->Parameters.Others.Argument1 = FdoDeviceExtension->DeviceObject; + *(PVOID *)Stack->Parameters.Others.Argument1 = FdoDeviceExtension->Pdo; if (Stack->Parameters.Others.Argument2) - Stack->Parameters.Others.Argument2 = FdoDeviceExtension->Pdo; + *(PVOID *)Stack->Parameters.Others.Argument2 = IoGetAttachedDevice(FdoDeviceExtension->DeviceObject); Irp->IoStatus.Information = 0; Irp->IoStatus.Status = STATUS_SUCCESS; @@ -151,7 +223,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION: { - DPRINT("IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n"); + DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n"); break; } default: @@ -162,6 +234,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } Irp->IoStatus.Information = Information; + if (Status != STATUS_PENDING) IoCompleteRequest(Irp, IO_NO_INCREMENT); @@ -171,8 +244,6 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) NTSTATUS PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information) { - PPDO_DEVICE_EXTENSION PdoDeviceExtension; - PFDO_DEVICE_EXTENSION FdoDeviceExtension; WCHAR Buffer[256]; ULONG Index = 0; ULONG IdType; @@ -181,25 +252,18 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information) NTSTATUS Status; IdType = IoGetCurrentIrpStackLocation(Irp)->Parameters.QueryId.IdType; - PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; - - /* FIXME: Read values from registry */ switch (IdType) { case BusQueryDeviceID: { - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryDeviceID\n"); RtlInitUnicodeString(&SourceString, L"USB\\ROOT_HUB20"); break; } case BusQueryHardwareIDs: { - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryHardwareIDs\n"); - Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265C&REV0000") + 1; - Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265") + 1; + Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265C") + 1; Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20") + 1; Buffer[Index] = UNICODE_NULL; @@ -209,24 +273,12 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information) } case BusQueryCompatibleIDs: { - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryCompatibleIDs\n"); - /* We have none */ + /* We have none */ return STATUS_SUCCESS; - break; } case BusQueryInstanceID: { - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_ID / BusQueryInstanceID\n"); - - /* - Do we need to implement this? - At one point I hade DeviceCapabilities->UniqueID set to TRUE. - And caused usbhub to fail attaching - to the PDO. Setting UniqueID to FALSE, it works - */ - return STATUS_SUCCESS; - break; } default: { @@ -247,18 +299,15 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information) NTSTATUS PdoQueryDeviceRelations(PDEVICE_OBJECT DeviceObject, PDEVICE_RELATIONS* pDeviceRelations) { - PFDO_DEVICE_EXTENSION DeviceExtension; PDEVICE_RELATIONS DeviceRelations; - DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - DeviceRelations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS)); if (!DeviceRelations) return STATUS_INSUFFICIENT_RESOURCES; - ObReferenceObject(DeviceObject); DeviceRelations->Count = 1; DeviceRelations->Objects[0] = DeviceObject; + ObReferenceObject(DeviceObject); *pDeviceRelations = DeviceRelations; return STATUS_SUCCESS; @@ -271,8 +320,8 @@ PdoDispatchPnp( { ULONG MinorFunction; PIO_STACK_LOCATION Stack; - ULONG_PTR Information = 0; - NTSTATUS Status; + ULONG_PTR Information = Irp->IoStatus.Information; + NTSTATUS Status = Irp->IoStatus.Status; Stack = IoGetCurrentIrpStackLocation(Irp); MinorFunction = Stack->MinorFunction; @@ -284,17 +333,67 @@ PdoDispatchPnp( case IRP_MN_CANCEL_REMOVE_DEVICE: case IRP_MN_STOP_DEVICE: case IRP_MN_QUERY_STOP_DEVICE: + case IRP_MN_CANCEL_STOP_DEVICE: case IRP_MN_QUERY_DEVICE_TEXT: case IRP_MN_SURPRISE_REMOVAL: + case IRP_MN_QUERY_RESOURCES: + case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: + case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: { - Information = Irp->IoStatus.Information; Status = STATUS_SUCCESS; break; } case IRP_MN_START_DEVICE: { - DPRINT("IRP_MJ_PNP / IRP_MN_START_DEVICE\n"); + PUSB_DEVICE RootHubDevice; + PPDO_DEVICE_EXTENSION PdoDeviceExtension; + PFDO_DEVICE_EXTENSION FdoDeviceExtension; + UNICODE_STRING InterfaceSymLinkName; + + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; + + /* Create the root hub */ + RootHubDevice = InternalCreateUsbDevice(1, 0, NULL, TRUE); + + RtlCopyMemory(&RootHubDevice->DeviceDescriptor, + ROOTHUB2_DEVICE_DESCRIPTOR, + sizeof(ROOTHUB2_DEVICE_DESCRIPTOR)); + + RootHubDevice->DeviceDescriptor.idVendor = FdoDeviceExtension->VendorId; + RootHubDevice->DeviceDescriptor.idProduct = FdoDeviceExtension->DeviceId; + + RtlCopyMemory(&RootHubDevice->ConfigurationDescriptor, + ROOTHUB2_CONFIGURATION_DESCRIPTOR, + sizeof(ROOTHUB2_CONFIGURATION_DESCRIPTOR)); + + PdoDeviceExtension->UsbDevices[0] = RootHubDevice; + + /* Create a thread to handle the URB's */ + Status = PsCreateSystemThread(&PdoDeviceExtension->ThreadHandle, + THREAD_ALL_ACCESS, + NULL, + NULL, + NULL, + UrbWorkerThread, + (PVOID)PdoDeviceExtension); + + if (!NT_SUCCESS(Status)) + DPRINT1("Failed Thread Creation with Status: %x\n", Status); + + Status = IoRegisterDeviceInterface(DeviceObject, &GUID_DEVINTERFACE_USB_HUB, NULL, &InterfaceSymLinkName); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to register interface\n"); + } + else + { + Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE); + DPRINT1("Set interface state %x\n", Status); + } + + Status = STATUS_SUCCESS; break; } @@ -305,16 +404,17 @@ PdoDispatchPnp( case TargetDeviceRelation: { PDEVICE_RELATIONS DeviceRelations = NULL; - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / TargetDeviceRelation\n"); Status = PdoQueryDeviceRelations(DeviceObject, &DeviceRelations); Information = (ULONG_PTR)DeviceRelations; break; } + case BusRelations: + case RemovalRelations: + case EjectionRelations: default: { DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unhandled type 0x%lx\n", Stack->Parameters.QueryDeviceRelations.Type); - //ASSERT(FALSE); Status = STATUS_NOT_SUPPORTED; break; } @@ -325,17 +425,20 @@ PdoDispatchPnp( { PDEVICE_CAPABILITIES DeviceCapabilities; ULONG i; - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_CAPABILITIES\n"); + DeviceCapabilities = (PDEVICE_CAPABILITIES)Stack->Parameters.DeviceCapabilities.Capabilities; - /* FIXME: capabilities can change with connected device */ + DeviceCapabilities->LockSupported = FALSE; DeviceCapabilities->EjectSupported = FALSE; DeviceCapabilities->Removable = FALSE; DeviceCapabilities->DockDevice = FALSE; - DeviceCapabilities->UniqueID = FALSE;//TRUE; + DeviceCapabilities->UniqueID = FALSE; DeviceCapabilities->SilentInstall = FALSE; - DeviceCapabilities->RawDeviceOK = TRUE; + DeviceCapabilities->RawDeviceOK = FALSE; DeviceCapabilities->SurpriseRemovalOK = FALSE; + DeviceCapabilities->Address = 0; + DeviceCapabilities->UINumber = 0; + DeviceCapabilities->DeviceD2 = 1; /* FIXME */ DeviceCapabilities->HardwareDisabled = FALSE; @@ -343,47 +446,101 @@ PdoDispatchPnp( DeviceCapabilities->DeviceState[0] = PowerDeviceD0; for (i = 0; i < PowerSystemMaximum; i++) DeviceCapabilities->DeviceState[i] = PowerDeviceD3; - //DeviceCapabilities->DeviceWake = PowerDeviceUndefined; + DeviceCapabilities->DeviceWake = 0; DeviceCapabilities->D1Latency = 0; DeviceCapabilities->D2Latency = 0; DeviceCapabilities->D3Latency = 0; + Information = 0; Status = STATUS_SUCCESS; break; } - case IRP_MN_QUERY_RESOURCES: - { - Information = Irp->IoStatus.Information; - Status = Irp->IoStatus.Status; - break; - } - case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: - { - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n"); - Information = Irp->IoStatus.Information; - Status = Irp->IoStatus.Status; - break; - } /*case IRP_MN_QUERY_DEVICE_TEXT: { Status = STATUS_NOT_SUPPORTED; break; }*/ - case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: - { - DPRINT("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); - Information = Irp->IoStatus.Information; - Status = Irp->IoStatus.Status; - break; - } + case IRP_MN_QUERY_ID: { Status = PdoQueryId(DeviceObject, Irp, &Information); break; } + case IRP_MN_QUERY_INTERFACE: + { + UNICODE_STRING GuidString; + PUSB_BUS_INTERFACE_HUB_V5 InterfaceHub; + PUSB_BUS_INTERFACE_USBDI_V2 InterfaceDI; + PPDO_DEVICE_EXTENSION PdoDeviceExtension; + PFDO_DEVICE_EXTENSION FdoDeviceExtension; + + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; + + Status = RtlStringFromGUID(Stack->Parameters.QueryInterface.InterfaceType, &GuidString); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to create string from GUID!\n"); + } + DPRINT1("Interface GUID requested %wZ\n", &GuidString); + DPRINT1("QueryInterface.Size %x\n", Stack->Parameters.QueryInterface.Size); + DPRINT1("QueryInterface.Version %x\n", Stack->Parameters.QueryInterface.Version); + + Status = STATUS_SUCCESS; + Information = 0; + + /* FIXME: Check the actual Guid */ + if (Stack->Parameters.QueryInterface.Size == sizeof(USB_BUS_INTERFACE_USBDI_V2) && (Stack->Parameters.QueryInterface.Version == 2)) + { + InterfaceDI = (PUSB_BUS_INTERFACE_USBDI_V2) Stack->Parameters.QueryInterface.Interface; + InterfaceDI->Size = sizeof(USB_BUS_INTERFACE_USBDI_V2); + InterfaceDI->Version = 2; + InterfaceDI->BusContext = PdoDeviceExtension->DeviceObject; + InterfaceDI->InterfaceReference = (PINTERFACE_REFERENCE)InterfaceReference; + InterfaceDI->InterfaceDereference = (PINTERFACE_DEREFERENCE)InterfaceDereference; + InterfaceDI->GetUSBDIVersion = GetUSBDIVersion; + InterfaceDI->QueryBusTime = QueryBusTime; + InterfaceDI->SubmitIsoOutUrb = SubmitIsoOutUrb; + InterfaceDI->QueryBusInformation = QueryBusInformation; + InterfaceDI->IsDeviceHighSpeed = IsDeviceHighSpeed; + InterfaceDI->EnumLogEntry = EnumLogEntry; + } + /* FIXME: Check the actual Guid */ + else if (Stack->Parameters.QueryInterface.Size == sizeof(USB_BUS_INTERFACE_HUB_V5) && + (Stack->Parameters.QueryInterface.Version == 5)) + { + InterfaceHub = (PUSB_BUS_INTERFACE_HUB_V5)Stack->Parameters.QueryInterface.Interface; + InterfaceHub->Version = 5; + InterfaceHub->Size = sizeof(USB_BUS_INTERFACE_HUB_V5); + InterfaceHub->BusContext = PdoDeviceExtension->DeviceObject; + InterfaceHub->InterfaceReference = (PINTERFACE_REFERENCE)InterfaceReference; + InterfaceHub->InterfaceDereference = (PINTERFACE_DEREFERENCE)InterfaceDereference; + InterfaceHub->CreateUsbDevice = CreateUsbDevice; + InterfaceHub->InitializeUsbDevice = InitializeUsbDevice; + InterfaceHub->GetUsbDescriptors = GetUsbDescriptors; + InterfaceHub->RemoveUsbDevice = RemoveUsbDevice; + InterfaceHub->RestoreUsbDevice = RestoreUsbDevice; + InterfaceHub->GetPortHackFlags = GetPortHackFlags; + InterfaceHub->QueryDeviceInformation = QueryDeviceInformation; + InterfaceHub->GetControllerInformation = GetControllerInformation; + InterfaceHub->ControllerSelectiveSuspend = ControllerSelectiveSuspend; + InterfaceHub->GetExtendedHubInformation = GetExtendedHubInformation; + InterfaceHub->GetRootHubSymbolicName = GetRootHubSymbolicName; + InterfaceHub->GetDeviceBusContext = GetDeviceBusContext; + InterfaceHub->Initialize20Hub = Initialize20Hub; + InterfaceHub->RootHubInitNotification = RootHubInitNotification; + InterfaceHub->FlushTransfers = FlushTransfers; + InterfaceHub->SetDeviceHandleData = SetDeviceHandleData; + } + else + { + DPRINT1("Not Supported\n"); + Status = STATUS_NOT_SUPPORTED; + } + break; + } case IRP_MN_QUERY_BUS_INFORMATION: { PPNP_BUS_INFORMATION BusInfo; - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_BUS_INFORMATION\n"); BusInfo = (PPNP_BUS_INFORMATION)ExAllocatePool(PagedPool, sizeof(PNP_BUS_INFORMATION)); if (!BusInfo) @@ -407,9 +564,6 @@ PdoDispatchPnp( { /* We are the PDO. So ignore */ DPRINT1("IRP_MJ_PNP / Unknown minor function 0x%lx\n", MinorFunction); - - Information = Irp->IoStatus.Information; - Status = Irp->IoStatus.Status; break; } } diff --git a/reactos/drivers/usb/usbehci/urbreq.c b/reactos/drivers/usb/usbehci/urbreq.c index 8ff24016c0e..d9a85ba1338 100644 --- a/reactos/drivers/usb/usbehci/urbreq.c +++ b/reactos/drivers/usb/usbehci/urbreq.c @@ -68,7 +68,7 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead, /* Must be Page aligned */ *CtrlSetup = (PEHCI_SETUP_FORMAT) (( (ULONG)(*CtrlTD3) + sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0xFFF) & ~0xFFF); - *CtrlData = (PSTANDARD_DEVICE_DESC) (( (ULONG)(*CtrlSetup) + sizeof(EHCI_SETUP_FORMAT) + 0xFFF) & ~0xFFF); + *CtrlData = (PUSB_DEVICE_DESCRIPTOR) (( (ULONG)(*CtrlSetup) + sizeof(EHCI_SETUP_FORMAT) + 0xFFF) & ~0xFFF); (*CtrlTD1)->NextPointer = TERMINATE_POINTER; (*CtrlTD1)->AlternateNextPointer = TERMINATE_POINTER; @@ -105,10 +105,10 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead, } BOOLEAN -GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index) +GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index, PUSB_DEVICE_DESCRIPTOR OutBuffer, BOOLEAN Hub) { PEHCI_SETUP_FORMAT CtrlSetup = NULL; - PSTANDARD_DEVICE_DESC CtrlData = NULL; + PUSB_DEVICE_DESCRIPTOR CtrlData = NULL; PQUEUE_TRANSFER_DESCRIPTOR CtrlTD1 = NULL; PQUEUE_TRANSFER_DESCRIPTOR CtrlTD2 = NULL; PQUEUE_TRANSFER_DESCRIPTOR CtrlTD3 = NULL; @@ -129,14 +129,22 @@ GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index) &CtrlTD3, &CtrlSetup, (PVOID)&CtrlData, - sizeof(STANDARD_DEVICE_DESC)); + sizeof(USB_DEVICE_DESCRIPTOR)); /* FIXME: Use defines and handle other than Device Desciptors */ - CtrlSetup->bmRequestType = 0x80; + if (Hub) + { + CtrlSetup->bmRequestType = 0x80; + CtrlSetup->wValue = 0x0600; + } + else + { + CtrlSetup->bmRequestType = 0x80; + CtrlSetup->wValue = 0x0100; + } CtrlSetup->bRequest = 0x06; - CtrlSetup->wValue = 0x0100; CtrlSetup->wIndex = 0; - CtrlSetup->wLength = sizeof(STANDARD_DEVICE_DESC); + CtrlSetup->wLength = sizeof(USB_DEVICE_DESCRIPTOR); tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD)); UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; @@ -182,13 +190,31 @@ GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index) break; } + if (OutBuffer != NULL) + { + OutBuffer->bLength = CtrlData->bLength; + OutBuffer->bDescriptorType = CtrlData->bDescriptorType; + OutBuffer->bcdUSB = CtrlData->bcdUSB; + OutBuffer->bDeviceClass = CtrlData->bDeviceClass; + OutBuffer->bDeviceSubClass = CtrlData->bDeviceSubClass; + OutBuffer->bDeviceProtocol = CtrlData->bDeviceProtocol; + OutBuffer->bMaxPacketSize0 = CtrlData->bMaxPacketSize0; + OutBuffer->idVendor = CtrlData->idVendor; + OutBuffer->idProduct = CtrlData->idProduct; + OutBuffer->bcdDevice = CtrlData->bcdDevice; + OutBuffer->iManufacturer = CtrlData->iManufacturer; + OutBuffer->iProduct = CtrlData->iProduct; + OutBuffer->iSerialNumber = CtrlData->iSerialNumber; + OutBuffer->bNumConfigurations = CtrlData->bNumConfigurations; + } + DPRINT1("bLength %d\n", CtrlData->bLength); DPRINT1("bDescriptorType %x\n", CtrlData->bDescriptorType); DPRINT1("bcdUSB %x\n", CtrlData->bcdUSB); DPRINT1("CtrlData->bDeviceClass %x\n", CtrlData->bDeviceClass); DPRINT1("CtrlData->bDeviceSubClass %x\n", CtrlData->bDeviceSubClass); - DPRINT1("CtrlData->bDeviceProtocal %x\n", CtrlData->bDeviceProtocal); - DPRINT1("CtrlData->bMaxPacketSize %x\n", CtrlData->bMaxPacketSize); + DPRINT1("CtrlData->bDeviceProtocal %x\n", CtrlData->bDeviceProtocol); + DPRINT1("CtrlData->bMaxPacketSize %x\n", CtrlData->bMaxPacketSize0); DPRINT1("CtrlData->idVendor %x\n", CtrlData->idVendor); DPRINT1("CtrlData->idProduct %x\n", CtrlData->idProduct); DPRINT1("CtrlData->bcdDevice %x\n", CtrlData->bcdDevice); @@ -202,7 +228,7 @@ GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index) { /* We got valid data, try for strings */ UCHAR Manufacturer = CtrlData->iManufacturer; - UCHAR Product = CtrlData->iManufacturer; + UCHAR Product = CtrlData->iProduct; UCHAR SerialNumber = CtrlData->iSerialNumber; GetDeviceStringDescriptor(DeviceExtension, Manufacturer); @@ -228,7 +254,7 @@ GetDeviceStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index) LONG tmp; Base = (ULONG) DeviceExtension->ResourceMemory; -DPRINT1("Index: %d\n", Index); + /* Set up the QUEUE HEAD in memory */ QueueHead = (PQUEUE_HEAD) ((ULONG)DeviceExtension->AsyncListQueueHeadPtr); diff --git a/reactos/drivers/usb/usbehci/usbehci.c b/reactos/drivers/usb/usbehci/usbehci.c index dd35b0d6dd1..15540694bf1 100644 --- a/reactos/drivers/usb/usbehci/usbehci.c +++ b/reactos/drivers/usb/usbehci/usbehci.c @@ -94,6 +94,7 @@ VOID NTAPI DriverUnload(PDRIVER_OBJECT DriverObject) { DPRINT1("Unloading Driver\n"); + /* FIXME: Clean up */ } NTSTATUS NTAPI diff --git a/reactos/drivers/usb/usbehci/usbehci.h b/reactos/drivers/usb/usbehci/usbehci.h index ca3765b5f95..f4c440df616 100644 --- a/reactos/drivers/usb/usbehci/usbehci.h +++ b/reactos/drivers/usb/usbehci/usbehci.h @@ -1,12 +1,11 @@ - -#ifndef __EHCI_H__ -#define __EHCI_H__ +#pragma once #include #include #include #define NDEBUG #include +#include "usbiffn.h" #include #include @@ -176,24 +175,6 @@ typedef struct _EHCI_SETUP_FORMAT USHORT wLength; } EHCI_SETUP_FORMAT, *PEHCI_SETUP_FORMAT; -typedef struct _STANDARD_DEVICE_DESC -{ - UCHAR bLength; - UCHAR bDescriptorType; - USHORT bcdUSB; - UCHAR bDeviceClass; - UCHAR bDeviceSubClass; - UCHAR bDeviceProtocal; - UCHAR bMaxPacketSize; - USHORT idVendor; - USHORT idProduct; - USHORT bcdDevice; - UCHAR iManufacturer; - UCHAR iProduct; - UCHAR iSerialNumber; - UCHAR bNumConfigurations; -} STANDARD_DEVICE_DESC, *PSTANDARD_DEVICE_DESC; - typedef struct _STRING_DESCRIPTOR { UCHAR bLength; /* Size of this descriptor in bytes */ @@ -201,6 +182,18 @@ typedef struct _STRING_DESCRIPTOR UCHAR bString[0]; /* UNICODE encoded string */ } STRING_DESCRIPTOR, *PSTRING_DESCRIPTOR; +typedef struct _USB_DEVICE +{ + UCHAR Address; + ULONG Port; + PVOID ParentDevice; + BOOLEAN IsHub; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; + USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; + USB_INTERFACE_DESCRIPTOR InterfaceDescriptor; + USB_ENDPOINT_DESCRIPTOR EndPointDescriptor; +} USB_DEVICE, *PUSB_DEVICE; + /* USBCMD register 32 bits */ typedef struct _EHCI_USBCMD_CONTENT { @@ -292,7 +285,6 @@ typedef struct _EHCI_CAPS { UCHAR PortRoute [8]; } EHCI_CAPS, *PEHCI_CAPS; - typedef struct _COMMON_DEVICE_EXTENSION { BOOLEAN IsFdo; @@ -309,9 +301,7 @@ typedef struct _FDO_DEVICE_EXTENSION PDEVICE_OBJECT Pdo; ULONG DeviceState; - /* USB Specs says a max of 127 devices */ - ULONG ChildDeviceCount; - + PVOID RootHubDeviceHandle; PDMA_ADAPTER pDmaAdapter; ULONG Vector; @@ -323,10 +313,6 @@ typedef struct _FDO_DEVICE_EXTENSION KDPC DpcObject; KAFFINITY Affinity; - LIST_ENTRY IrpQueue; - KSPIN_LOCK IrpQueueLock; - PIRP CurrentIrp; - ULONG MapRegisters; ULONG BusNumber; @@ -354,7 +340,6 @@ typedef struct _FDO_DEVICE_EXTENSION PULONG ResourceBase; ULONG Size; - } FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION; typedef struct _PDO_DEVICE_EXTENSION @@ -362,16 +347,28 @@ typedef struct _PDO_DEVICE_EXTENSION COMMON_DEVICE_EXTENSION Common; PDEVICE_OBJECT DeviceObject; PDEVICE_OBJECT ControllerFdo; - + PUSB_DEVICE UsbDevices[127]; + LIST_ENTRY IrpQueue; + KSPIN_LOCK IrpQueueLock; + PIRP CurrentIrp; + HANDLE ThreadHandle; + ULONG ChildDeviceCount; + BOOLEAN HaltUrbHandling; + PVOID CallbackContext; + PRH_INIT_CALLBACK CallbackRoutine; } PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION; - typedef struct _WORKITEM_DATA { PIO_WORKITEM IoWorkItem; - PFDO_DEVICE_EXTENSION FdoDeviceExtension; + PPDO_DEVICE_EXTENSION PdoDeviceExtension; + PDEVICE_OBJECT PortDeviceObject; } WORKITEM_DATA, *PWORKITEM_DATA; + +VOID NTAPI +UrbWorkerThread(PVOID Context); + NTSTATUS NTAPI GetBusInterface(PDEVICE_OBJECT pcifido, PBUS_INTERFACE_STANDARD busInterface); @@ -406,27 +403,19 @@ NTSTATUS NTAPI PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp); BOOLEAN -GetDeviceDescriptor (PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index); +GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index, PUSB_DEVICE_DESCRIPTOR OutBuffer, BOOLEAN Hub); BOOLEAN GetDeviceStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index); VOID -CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension); +QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp); VOID -QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp); +CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension); VOID -QueueRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp); +URBRequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp); -VOID -CompletePendingRequest(PFDO_DEVICE_EXTENSION DeviceExtension); - -VOID +VOID NTAPI DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context); - -VOID -RequestCancel (PDEVICE_OBJECT DeviceObject, PIRP Irp); - -#endif diff --git a/reactos/drivers/usb/usbehci/usbehci.rbuild b/reactos/drivers/usb/usbehci/usbehci.rbuild index c49c039e15a..3f6f1e6c8f3 100644 --- a/reactos/drivers/usb/usbehci/usbehci.rbuild +++ b/reactos/drivers/usb/usbehci/usbehci.rbuild @@ -9,5 +9,6 @@ common.c misc.c irp.c + usbiffn.c urbreq.c diff --git a/reactos/drivers/usb/usbehci/usbiffn.c b/reactos/drivers/usb/usbehci/usbiffn.c new file mode 100644 index 00000000000..47fefb610b3 --- /dev/null +++ b/reactos/drivers/usb/usbehci/usbiffn.c @@ -0,0 +1,265 @@ +/* + * PROJECT: ReactOS Universal Serial Bus Bulk Enhanced Host Controller Interface + * LICENSE: GPL - See COPYING in the top level directory + * FILE: drivers/usb/usbehci/usbiffn.c + * PURPOSE: Direct Call Interface Functions. + * PROGRAMMERS: + * Michael Martin + */ + +/* usbbusif.h and hubbusif.h need to be imported */ +#include "usbehci.h" +#include "usbiffn.h" +#define NDEBUG +#include + +VOID +USB_BUSIFFN +InterfaceReference(PVOID BusContext) +{ + DPRINT1("InterfaceReference called\n"); +} + +VOID +USB_BUSIFFN +InterfaceDereference(PVOID BusContext) +{ + DPRINT1("InterfaceDereference called\n"); +} + +/* Bus Interface Hub V5 Functions */ + +NTSTATUS +USB_BUSIFFN +CreateUsbDevice(PVOID BusContext, + PUSB_DEVICE_HANDLE *NewDevice, + PUSB_DEVICE_HANDLE HubDeviceHandle, + USHORT PortStatus, USHORT PortNumber) +{ + DPRINT1("CreateUsbDevice called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) +{ + DPRINT1("InitializeUsbDevice called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +GetUsbDescriptors(PVOID BusContext, + PUSB_DEVICE_HANDLE DeviceHandle, + PUCHAR DeviceDescriptorBuffer, + PULONG DeviceDescriptorBufferLength, + PUCHAR ConfigurationBuffer, + PULONG ConfigDescriptorBufferLength) +{ + DPRINT1("GetUsbDescriptor called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags) +{ + DPRINT1("RemoveUsbDevice called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVICE_HANDLE NewDeviceHandle) +{ + DPRINT1("RestoreUsbDevice called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +GetPortHackFlags(PVOID BusContext, PULONG Flags) +{ + DPRINT1("GetPortHackFlags called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +QueryDeviceInformation(PVOID BusContext, + PUSB_DEVICE_HANDLE DeviceHandle, + PVOID DeviceInformationBuffer, + ULONG DeviceInformationBufferLength, + PULONG LengthReturned) +{ + DPRINT1("QueryDeviceInformation called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +GetControllerInformation(PVOID BusContext, + PVOID ControllerInformationBuffer, + ULONG ControllerInformationBufferLength, + PULONG LengthReturned) +{ + DPRINT1("GetControllerInformation called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +ControllerSelectiveSuspend(PVOID BusContext, BOOLEAN Enable) +{ + DPRINT1("ControllerSelectiveSuspend called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +GetExtendedHubInformation(PVOID BusContext, + PDEVICE_OBJECT HubPhysicalDeviceObject, + PVOID HubInformationBuffer, + ULONG HubInformationBufferLength, + PULONG LengthReturned) +{ + + PUSB_EXTHUB_INFORMATION_0 UsbExtHubInfo = HubInformationBuffer; + PPDO_DEVICE_EXTENSION PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; + PFDO_DEVICE_EXTENSION FdoDeviceExntension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; + LONG i; + + /* Set the default return value */ + *LengthReturned = 0; + /* Caller must have set InformationLevel to 0 */ + if (UsbExtHubInfo->InformationLevel != 0) + { + return STATUS_NOT_SUPPORTED; + } + + UsbExtHubInfo->NumberOfPorts = 8; + + for (i=0; i < UsbExtHubInfo->NumberOfPorts; i++) + { + UsbExtHubInfo->Port[i].PhysicalPortNumber = i + 1; + UsbExtHubInfo->Port[i].PortLabelNumber = FdoDeviceExntension->ECHICaps.HCSParams.PortCount; + UsbExtHubInfo->Port[i].VidOverride = 0; + UsbExtHubInfo->Port[i].PidOverride = 0; + UsbExtHubInfo->Port[i].PortAttributes = USB_PORTATTR_SHARED_USB2; + } + + *LengthReturned = FIELD_OFFSET(USB_EXTHUB_INFORMATION_0, Port[8]); + + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +GetRootHubSymbolicName(PVOID BusContext, + PVOID HubSymNameBuffer, + ULONG HubSymNameBufferLength, + PULONG HubSymNameActualLength) +{ + DPRINT1("GetRootHubSymbolicName called\n"); + return STATUS_SUCCESS; +} + +PVOID +USB_BUSIFFN +GetDeviceBusContext(PVOID HubBusContext, PVOID DeviceHandle) +{ + DPRINT1("GetDeviceBusContext called\n"); + return NULL; +} + +NTSTATUS +USB_BUSIFFN +Initialize20Hub(PVOID BusContext, PUSB_DEVICE_HANDLE HubDeviceHandle, ULONG TtCount) +{ + DPRINT1("Initialize20Hub called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +RootHubInitNotification(PVOID BusContext, PVOID CallbackContext, PRH_INIT_CALLBACK CallbackRoutine) +{ + PPDO_DEVICE_EXTENSION PdoDeviceExtension; + DPRINT1("RootHubInitNotification %x, %x, %x\n", BusContext, CallbackContext, CallbackRoutine); + + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; + PdoDeviceExtension->CallbackContext = CallbackContext; + PdoDeviceExtension->CallbackRoutine = CallbackRoutine; + return STATUS_SUCCESS; +} + +VOID +USB_BUSIFFN +FlushTransfers(PVOID BusContext, PVOID DeviceHandle) +{ + DPRINT1("FlushTransfers\n"); +} + +VOID +USB_BUSIFFN +SetDeviceHandleData(PVOID BusContext, PVOID DeviceHandle, PDEVICE_OBJECT UsbDevicePdo) +{ + DPRINT1("SetDeviceHandleData called\n"); +} + + +/* USB_BUS_INTERFACE_USBDI_V2 Functions */ + +NTSTATUS +USB_BUSIFFN +GetUSBDIVersion(PVOID BusContext, PUSBD_VERSION_INFORMATION VersionInformation, PULONG HcdCapabilites) +{ + DPRINT1("GetUSBDIVersion called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +QueryBusTime(PVOID BusContext, PULONG CurrentFrame) +{ + DPRINT1("QueryBusTime called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +SubmitIsoOutUrb(PVOID BusContext, PURB Urb) +{ + DPRINT1("SubmitIsoOutUrb called\n"); + return STATUS_SUCCESS; +} + +NTSTATUS +USB_BUSIFFN +QueryBusInformation(PVOID BusContext, + ULONG Level, + PVOID BusInformationBuffer, + PULONG BusInformationBufferLength, + PULONG BusInformationActualLength) +{ + DPRINT1("QueryBusInformation called\n"); + return STATUS_SUCCESS; +} + +BOOLEAN +USB_BUSIFFN +IsDeviceHighSpeed(PVOID BusContext) +{ + DPRINT1("IsDeviceHighSpeed called\n"); + return TRUE; +} + +NTSTATUS +USB_BUSIFFN +EnumLogEntry(PVOID BusContext, ULONG DriverTag, ULONG EnumTag, ULONG P1, ULONG P2) +{ + DPRINT1("EnumLogEntry called\n"); + return STATUS_SUCCESS; +} + diff --git a/reactos/drivers/usb/usbehci/usbiffn.h b/reactos/drivers/usb/usbehci/usbiffn.h new file mode 100644 index 00000000000..e9c2de469be --- /dev/null +++ b/reactos/drivers/usb/usbehci/usbiffn.h @@ -0,0 +1,196 @@ +#pragma once + +#define USB_BUSIFFN __stdcall +#include +#include +#include + +/* usbbusif.h and hubbusif.h need to be imported */ +typedef PVOID PUSB_DEVICE_HANDLE; + +typedef +VOID +USB_BUSIFFN +RH_INIT_CALLBACK (PVOID CallBackContext); + +typedef RH_INIT_CALLBACK *PRH_INIT_CALLBACK; + +typedef struct _USB_EXTPORT_INFORMATION_0 +{ + ULONG PhysicalPortNumber; + ULONG PortLabelNumber; + USHORT VidOverride; + USHORT PidOverride; + ULONG PortAttributes; +} USB_EXTPORT_INFORMATION_0, *PUSB_EXTPORT_INFORMATION; + +typedef struct _USB_EXTHUB_INFORMATION_0 +{ + ULONG InformationLevel; + ULONG NumberOfPorts; + USB_EXTPORT_INFORMATION_0 Port[255]; +} USB_EXTHUB_INFORMATION_0, *PUSB_EXTHUB_INFORMATION_0; + +typedef struct _USB_BUS_INTERFACE_USBDI_V2 +{ + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + + PVOID GetUSBDIVersion; + PVOID QueryBusTime; + PVOID SubmitIsoOutUrb; + PVOID QueryBusInformation; + PVOID IsDeviceHighSpeed; + PVOID EnumLogEntry; +} USB_BUS_INTERFACE_USBDI_V2, *PUSB_BUS_INTERFACE_USBDI_V2; + +typedef struct _USB_BUS_INTERFACE_HUB_V5 +{ + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + + PVOID CreateUsbDevice; + PVOID InitializeUsbDevice; + PVOID GetUsbDescriptors; + PVOID RemoveUsbDevice; + PVOID RestoreUsbDevice; + PVOID GetPortHackFlags; + PVOID QueryDeviceInformation; + PVOID GetControllerInformation; + PVOID ControllerSelectiveSuspend; + PVOID GetExtendedHubInformation; + PVOID GetRootHubSymbolicName; + PVOID GetDeviceBusContext; + PVOID Initialize20Hub; + PVOID RootHubInitNotification; + PVOID FlushTransfers; + PVOID SetDeviceHandleData; +} USB_BUS_INTERFACE_HUB_V5, *PUSB_BUS_INTERFACE_HUB_V5; + +VOID +USB_BUSIFFN +InterfaceReference(PVOID BusContext); + +VOID +USB_BUSIFFN +InterfaceDereference(PVOID BusContext); + +NTSTATUS +USB_BUSIFFN +CreateUsbDevice(PVOID BusContext, + PUSB_DEVICE_HANDLE *NewDevice, + PUSB_DEVICE_HANDLE HubDeviceHandle, + USHORT PortStatus, USHORT PortNumber); + +NTSTATUS +USB_BUSIFFN +InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle); + +NTSTATUS +USB_BUSIFFN +GetUsbDescriptors(PVOID BusContext, + PUSB_DEVICE_HANDLE DeviceHandle, + PUCHAR DeviceDescriptorBuffer, + PULONG DeviceDescriptorBufferLength, + PUCHAR ConfigurationBuffer, + PULONG ConfigDescriptorBufferLength); + +NTSTATUS +USB_BUSIFFN +RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags); + +NTSTATUS +USB_BUSIFFN +RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVICE_HANDLE NewDeviceHandle); + +NTSTATUS +USB_BUSIFFN +GetPortHackFlags(PVOID BusContext, PULONG Flags); + +NTSTATUS +USB_BUSIFFN +QueryDeviceInformation(PVOID BusContext, + PUSB_DEVICE_HANDLE DeviceHandle, + PVOID DeviceInformationBuffer, + ULONG DeviceInformationBufferLength, + PULONG LengthReturned); + +NTSTATUS +USB_BUSIFFN +GetControllerInformation(PVOID BusContext, + PVOID ControllerInformationBuffer, + ULONG ControllerInformationBufferLength, + PULONG LengthReturned); + +NTSTATUS +USB_BUSIFFN +ControllerSelectiveSuspend(PVOID BusContext, BOOLEAN Enable); + +NTSTATUS +USB_BUSIFFN +GetExtendedHubInformation(PVOID BusContext, + PDEVICE_OBJECT HubPhysicalDeviceObject, + PVOID HubInformationBuffer, + ULONG HubInformationBufferLength, + PULONG LengthReturned); + +NTSTATUS +USB_BUSIFFN +GetRootHubSymbolicName(PVOID BusContext, + PVOID HubSymNameBuffer, + ULONG HubSymNameBufferLength, + PULONG HubSymNameActualLength); + +PVOID +USB_BUSIFFN +GetDeviceBusContext(PVOID HubBusContext, PVOID DeviceHandle); + +NTSTATUS +USB_BUSIFFN +Initialize20Hub(PVOID BusContext, PUSB_DEVICE_HANDLE HubDeviceHandle, ULONG TtCount); + +NTSTATUS +USB_BUSIFFN +RootHubInitNotification(PVOID BusContext, PVOID CallbackContext, PRH_INIT_CALLBACK CallbackRoutine); + +VOID +USB_BUSIFFN +FlushTransfers(PVOID BusContext, PVOID DeviceHandle); + +VOID +USB_BUSIFFN +SetDeviceHandleData(PVOID BusContext, PVOID DeviceHandle, PDEVICE_OBJECT UsbDevicePdo); + +NTSTATUS +USB_BUSIFFN +GetUSBDIVersion(PVOID BusContext, PUSBD_VERSION_INFORMATION VersionInformation, PULONG HcdCapabilites); + +NTSTATUS +USB_BUSIFFN +QueryBusTime(PVOID BusContext, PULONG CurrentFrame); + +NTSTATUS +USB_BUSIFFN +SubmitIsoOutUrb(PVOID BusContext, PURB Urb); + +NTSTATUS +USB_BUSIFFN +QueryBusInformation(PVOID BusContext, + ULONG Level, + PVOID BusInformationBuffer, + PULONG BusInformationBufferLength, + PULONG BusInformationActualLength); + +BOOLEAN +USB_BUSIFFN +IsDeviceHighSpeed(PVOID BusCOntext); + +NTSTATUS +USB_BUSIFFN +EnumLogEntry(PVOID BusContext, ULONG DriverTag, ULONG EnumTag, ULONG P1, ULONG P2); diff --git a/reactos/drivers/video/displays/directory.rbuild b/reactos/drivers/video/displays/directory.rbuild index eb650854819..514fd432fd2 100644 --- a/reactos/drivers/video/displays/directory.rbuild +++ b/reactos/drivers/video/displays/directory.rbuild @@ -7,4 +7,7 @@ + + + diff --git a/reactos/drivers/video/displays/framebuf/framebuf.h b/reactos/drivers/video/displays/framebuf/framebuf.h index 3a18e860509..7f222c8ce84 100644 --- a/reactos/drivers/video/displays/framebuf/framebuf.h +++ b/reactos/drivers/video/displays/framebuf/framebuf.h @@ -18,8 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef FRAMEBUF_H -#define FRAMEBUF_H +#pragma once #include #include @@ -160,5 +159,3 @@ IntSetPalette( IN PPALETTEENTRY ppalent, IN ULONG iStart, IN ULONG cColors); - -#endif /* FRAMEBUF_H */ diff --git a/reactos/drivers/video/displays/framebuf_new/debug.c b/reactos/drivers/video/displays/framebuf_new/debug.c new file mode 100755 index 00000000000..ada125df7ec --- /dev/null +++ b/reactos/drivers/video/displays/framebuf_new/debug.c @@ -0,0 +1,59 @@ +/* + * PROJECT: ReactOS Framebuffer Display Driver + * LICENSE: Microsoft NT4 DDK Sample Code License + * FILE: boot/drivers/video/displays/framebuf/debug.c + * PURPOSE: Debug Support + * PROGRAMMERS: Copyright (c) 1992-1995 Microsoft Corporation + */ + +#include "driver.h" + +#if DBG + +ULONG DebugLevel = 0xFFFFFFFF; + +/***************************************************************************** + * + * Routine Description: + * + * This function is variable-argument, level-sensitive debug print + * routine. + * If the specified debug level for the print statement is lower or equal + * to the current debug level, the message will be printed. + * + * Arguments: + * + * DebugPrintLevel - Specifies at which debugging level the string should + * be printed + * + * DebugMessage - Variable argument ascii c string + * + * Return Value: + * + * None. + * + ***************************************************************************/ + +VOID +DebugPrint( + ULONG DebugPrintLevel, + PCHAR DebugMessage, + ... + ) + +{ + + va_list ap; + + va_start(ap, DebugMessage); + + if (DebugPrintLevel <= DebugLevel) + { + EngDebugPrint(STANDARD_DEBUG_PREFIX, DebugMessage, ap); + } + + va_end(ap); + +} + +#endif diff --git a/reactos/drivers/video/displays/framebuf_new/debug.h b/reactos/drivers/video/displays/framebuf_new/debug.h new file mode 100755 index 00000000000..d73a223baaf --- /dev/null +++ b/reactos/drivers/video/displays/framebuf_new/debug.h @@ -0,0 +1,26 @@ +/* + * PROJECT: ReactOS Framebuffer Display Driver + * LICENSE: Microsoft NT4 DDK Sample Code License + * FILE: boot/drivers/video/displays/framebuf/debug.h + * PURPOSE: Debug Support Header + * PROGRAMMERS: Copyright (c) 1992-1995 Microsoft Corporation + */ + +#if DBG + +VOID +DebugPrint( + ULONG DebugPrintLevel, + PCHAR DebugMessage, + ... + ); + +#define DISPDBG(arg) DebugPrint arg +#define RIP(x) { DebugPrint(0, x); EngDebugBreak();} + +#else + +#define DISPDBG(arg) +#define RIP(x) + +#endif diff --git a/reactos/drivers/video/displays/framebuf_new/driver.h b/reactos/drivers/video/displays/framebuf_new/driver.h new file mode 100755 index 00000000000..e9e617190c0 --- /dev/null +++ b/reactos/drivers/video/displays/framebuf_new/driver.h @@ -0,0 +1,75 @@ +/* + * PROJECT: ReactOS Framebuffer Display Driver + * LICENSE: Microsoft NT4 DDK Sample Code License + * FILE: boot/drivers/video/displays/framebuf/driver.h + * PURPOSE: Main Driver Header File + * PROGRAMMERS: Copyright (c) 1992-1995 Microsoft Corporation + * ReactOS Portable Systems Group + */ + +//#define DBG 1 +#include "stddef.h" +#include +#include "windef.h" +#include "wingdi.h" +#include "winddi.h" +#include "devioctl.h" +#include "ntddvdeo.h" +#include "debug.h" + +typedef struct _PDEV +{ + HANDLE hDriver; // Handle to \Device\Screen + HDEV hdevEng; // Engine's handle to PDEV + HSURF hsurfEng; // Engine's handle to surface + HPALETTE hpalDefault; // Handle to the default palette for device. + PBYTE pjScreen; // This is pointer to base screen address + ULONG cxScreen; // Visible screen width + ULONG cyScreen; // Visible screen height + ULONG ulMode; // Mode the mini-port driver is in. + LONG lDeltaScreen; // Distance from one scan to the next. + ULONG cScreenSize; // size of video memory, including + // offscreen memory. + PVOID pOffscreenList; // linked list of DCI offscreen surfaces. + FLONG flRed; // For bitfields device, Red Mask + FLONG flGreen; // For bitfields device, Green Mask + FLONG flBlue; // For bitfields device, Blue Mask + ULONG cPaletteShift; // number of bits the 8-8-8 palette must + // be shifted by to fit in the hardware + // palette. + ULONG ulBitCount; // # of bits per pel 8,16,24,32 are only supported. + POINTL ptlHotSpot; // adjustment for pointer hot spot + VIDEO_POINTER_CAPABILITIES PointerCapabilities; // HW pointer abilities + PVIDEO_POINTER_ATTRIBUTES pPointerAttributes; // hardware pointer attributes + DWORD cjPointerAttributes; // Size of buffer allocated + BOOL fHwCursorActive; // Are we currently using the hw cursor + PALETTEENTRY *pPal; // If this is pal managed, this is the pal + BOOL bSupportDCI; // Does the miniport support DCI? +// eVb: 3.1 [DDK Change] - Support new VGA Miniport behavior w.r.t updated framebuffer remapping + LONG flHooks; +// eVb: 3.1 [END] +} PDEV, *PPDEV; + +DWORD getAvailableModes(HANDLE, PVIDEO_MODE_INFORMATION *, DWORD *); +BOOL bInitPDEV(PPDEV, PDEVMODEW, GDIINFO *, DEVINFO *); +BOOL bInitSURF(PPDEV, BOOL); +BOOL bInitPaletteInfo(PPDEV, DEVINFO *); +BOOL bInitPointer(PPDEV, DEVINFO *); +BOOL bInit256ColorPalette(PPDEV); +VOID vDisablePalette(PPDEV); +VOID vDisableSURF(PPDEV); + +#define MAX_CLUT_SIZE (sizeof(VIDEO_CLUT) + (sizeof(ULONG) * 256)) + +// +// Determines the size of the DriverExtra information in the DEVMODE +// structure passed to and from the display driver. +// + +#define DRIVER_EXTRA_SIZE 0 + +#define DLL_NAME L"framebuf" // Name of the DLL in UNICODE +#define STANDARD_DEBUG_PREFIX "FRAMEBUF: " // All debug output is prefixed +#define ALLOC_TAG 'bfDD' // Four byte tag (characters in + // reverse order) used for memory + // allocations diff --git a/reactos/drivers/video/displays/framebuf_new/enable.c b/reactos/drivers/video/displays/framebuf_new/enable.c new file mode 100644 index 00000000000..8031da8a173 --- /dev/null +++ b/reactos/drivers/video/displays/framebuf_new/enable.c @@ -0,0 +1,476 @@ +/* + * PROJECT: ReactOS Framebuffer Display Driver + * LICENSE: Microsoft NT4 DDK Sample Code License + * FILE: boot/drivers/video/displays/framebuf/enable.c + * PURPOSE: Main Driver Initialization and PDEV Enabling + * PROGRAMMERS: Copyright (c) 1992-1995 Microsoft Corporation + * ReactOS Portable Systems Group + */ + +#include "driver.h" + +// The driver function table with all function index/address pairs + +static DRVFN gadrvfn[] = +{ + { INDEX_DrvEnablePDEV, (PFN) DrvEnablePDEV }, + { INDEX_DrvCompletePDEV, (PFN) DrvCompletePDEV }, + { INDEX_DrvDisablePDEV, (PFN) DrvDisablePDEV }, + { INDEX_DrvEnableSurface, (PFN) DrvEnableSurface }, + { INDEX_DrvDisableSurface, (PFN) DrvDisableSurface }, + { INDEX_DrvAssertMode, (PFN) DrvAssertMode }, + { INDEX_DrvSetPalette, (PFN) DrvSetPalette }, + { INDEX_DrvMovePointer, (PFN) DrvMovePointer }, + { INDEX_DrvSetPointerShape, (PFN) DrvSetPointerShape }, + { INDEX_DrvGetModes, (PFN) DrvGetModes } +}; + +// Define the functions you want to hook for 8/16/24/32 pel formats + +#define HOOKS_BMF8BPP 0 + +#define HOOKS_BMF16BPP 0 + +#define HOOKS_BMF24BPP 0 + +#define HOOKS_BMF32BPP 0 + +/******************************Public*Routine******************************\ +* DrvEnableDriver +* +* Enables the driver by retrieving the drivers function table and version. +* +\**************************************************************************/ + +BOOL DrvEnableDriver( +ULONG iEngineVersion, +ULONG cj, +PDRVENABLEDATA pded) +{ +// Engine Version is passed down so future drivers can support previous +// engine versions. A next generation driver can support both the old +// and new engine conventions if told what version of engine it is +// working with. For the first version the driver does nothing with it. +// eVb: 1.1 [DDK Change] - Remove bogus statement + //iEngineVersion; +// eVb: 1.1 [END] +// Fill in as much as we can. + + if (cj >= sizeof(DRVENABLEDATA)) + pded->pdrvfn = gadrvfn; + + if (cj >= (sizeof(ULONG) * 2)) + pded->c = sizeof(gadrvfn) / sizeof(DRVFN); + +// DDI version this driver was targeted for is passed back to engine. +// Future graphic's engine may break calls down to old driver format. + + if (cj >= sizeof(ULONG)) +// eVb: 1.2 [DDK Change] - Use DDI_DRIVER_VERSION_NT4 instead of DDI_DRIVER_VERSION + pded->iDriverVersion = DDI_DRIVER_VERSION_NT4; +// eVb: 1.2 [END] + + return(TRUE); +} + +/******************************Public*Routine******************************\ +* DrvEnablePDEV +* +* DDI function, Enables the Physical Device. +* +* Return Value: device handle to pdev. +* +\**************************************************************************/ + +DHPDEV DrvEnablePDEV( +DEVMODEW *pDevmode, // Pointer to DEVMODE +PWSTR pwszLogAddress, // Logical address +ULONG cPatterns, // number of patterns +HSURF *ahsurfPatterns, // return standard patterns +ULONG cjGdiInfo, // Length of memory pointed to by pGdiInfo +ULONG *pGdiInfo, // Pointer to GdiInfo structure +ULONG cjDevInfo, // Length of following PDEVINFO structure +DEVINFO *pDevInfo, // physical device information structure +HDEV hdev, // HDEV, used for callbacks +PWSTR pwszDeviceName, // DeviceName - not used +HANDLE hDriver) // Handle to base driver +{ + GDIINFO GdiInfo; + DEVINFO DevInfo; + PPDEV ppdev = (PPDEV) NULL; + + UNREFERENCED_PARAMETER(pwszLogAddress); + UNREFERENCED_PARAMETER(pwszDeviceName); + + // Allocate a physical device structure. + + ppdev = (PPDEV) EngAllocMem(0, sizeof(PDEV), ALLOC_TAG); + + if (ppdev == (PPDEV) NULL) + { + RIP("DISP DrvEnablePDEV failed EngAllocMem\n"); + return((DHPDEV) 0); + } + + memset(ppdev, 0, sizeof(PDEV)); + + // Save the screen handle in the PDEV. + + ppdev->hDriver = hDriver; + + // Get the current screen mode information. Set up device caps and devinfo. + + if (!bInitPDEV(ppdev, pDevmode, &GdiInfo, &DevInfo)) + { + DISPDBG((0,"DISP DrvEnablePDEV failed\n")); + goto error_free; + } + + // Initialize the cursor information. + + if (!bInitPointer(ppdev, &DevInfo)) + { + // Not a fatal error... + DISPDBG((0, "DrvEnablePDEV failed bInitPointer\n")); + } + + // Initialize palette information. + + if (!bInitPaletteInfo(ppdev, &DevInfo)) + { + RIP("DrvEnablePDEV failed bInitPalette\n"); + goto error_free; + } + + // Copy the devinfo into the engine buffer. + + memcpy(pDevInfo, &DevInfo, min(sizeof(DEVINFO), cjDevInfo)); + + // Set the pdevCaps with GdiInfo we have prepared to the list of caps for this + // pdev. + + memcpy(pGdiInfo, &GdiInfo, min(cjGdiInfo, sizeof(GDIINFO))); + + return((DHPDEV) ppdev); + + // Error case for failure. +error_free: + EngFreeMem(ppdev); + return((DHPDEV) 0); +} + +/******************************Public*Routine******************************\ +* DrvCompletePDEV +* +* Store the HPDEV, the engines handle for this PDEV, in the DHPDEV. +* +\**************************************************************************/ + +VOID DrvCompletePDEV( +DHPDEV dhpdev, +HDEV hdev) +{ + ((PPDEV) dhpdev)->hdevEng = hdev; +} + +/******************************Public*Routine******************************\ +* DrvDisablePDEV +* +* Release the resources allocated in DrvEnablePDEV. If a surface has been +* enabled DrvDisableSurface will have already been called. +* +\**************************************************************************/ + +VOID DrvDisablePDEV( +DHPDEV dhpdev) +{ + vDisablePalette((PPDEV) dhpdev); + EngFreeMem(dhpdev); +} + +/******************************Public*Routine******************************\ +* DrvEnableSurface +* +* Enable the surface for the device. Hook the calls this driver supports. +* +* Return: Handle to the surface if successful, 0 for failure. +* +\**************************************************************************/ + +HSURF DrvEnableSurface( +DHPDEV dhpdev) +{ + PPDEV ppdev; + HSURF hsurf; + SIZEL sizl; + ULONG ulBitmapType; + FLONG flHooks; + + // Create engine bitmap around frame buffer. + + ppdev = (PPDEV) dhpdev; + + if (!bInitSURF(ppdev, TRUE)) + { + RIP("DISP DrvEnableSurface failed bInitSURF\n"); + return(FALSE); + } + + sizl.cx = ppdev->cxScreen; + sizl.cy = ppdev->cyScreen; + + if (ppdev->ulBitCount == 8) + { + if (!bInit256ColorPalette(ppdev)) { + RIP("DISP DrvEnableSurface failed to init the 8bpp palette\n"); + return(FALSE); + } + ulBitmapType = BMF_8BPP; + flHooks = HOOKS_BMF8BPP; + } + else if (ppdev->ulBitCount == 16) + { + ulBitmapType = BMF_16BPP; + flHooks = HOOKS_BMF16BPP; + } + else if (ppdev->ulBitCount == 24) + { + ulBitmapType = BMF_24BPP; + flHooks = HOOKS_BMF24BPP; + } + else + { + ulBitmapType = BMF_32BPP; + flHooks = HOOKS_BMF32BPP; + } +// eVb: 1.3 [DDK Change] - Support new VGA Miniport behavior w.r.t updated framebuffer remapping + ppdev->flHooks = flHooks; +// eVb: 1.3 [END] +// eVb: 1.4 [DDK Change] - Use EngCreateDeviceSurface instead of EngCreateBitmap + hsurf = (HSURF)EngCreateDeviceSurface((DHSURF)ppdev, + sizl, + ulBitmapType); + + if (hsurf == (HSURF) 0) + { + RIP("DISP DrvEnableSurface failed EngCreateDeviceSurface\n"); + return(FALSE); + } +// eVb: 1.4 [END] + +// eVb: 1.5 [DDK Change] - Use EngModifySurface instead of EngAssociateSurface + if ( !EngModifySurface(hsurf, + ppdev->hdevEng, + ppdev->flHooks | HOOK_SYNCHRONIZE, + MS_NOTSYSTEMMEMORY, + (DHSURF)ppdev, + ppdev->pjScreen, + ppdev->lDeltaScreen, + NULL)) + { + RIP("DISP DrvEnableSurface failed EngModifySurface\n"); + return(FALSE); + } +// eVb: 1.5 [END] + ppdev->hsurfEng = hsurf; + + return(hsurf); +} + +/******************************Public*Routine******************************\ +* DrvDisableSurface +* +* Free resources allocated by DrvEnableSurface. Release the surface. +* +\**************************************************************************/ + +VOID DrvDisableSurface( +DHPDEV dhpdev) +{ + EngDeleteSurface(((PPDEV) dhpdev)->hsurfEng); + vDisableSURF((PPDEV) dhpdev); + ((PPDEV) dhpdev)->hsurfEng = (HSURF) 0; +} + +/******************************Public*Routine******************************\ +* DrvAssertMode +* +* This asks the device to reset itself to the mode of the pdev passed in. +* +\**************************************************************************/ + +BOOL DrvAssertMode( +DHPDEV dhpdev, +BOOL bEnable) +{ + PPDEV ppdev = (PPDEV) dhpdev; + ULONG ulReturn; + PBYTE pjScreen; + + if (bEnable) + { + // + // The screen must be reenabled, reinitialize the device to clean state. + // +// eVb: 1.6 [DDK Change] - Support new VGA Miniport behavior w.r.t updated framebuffer remapping + pjScreen = ppdev->pjScreen; + + if (!bInitSURF(ppdev, FALSE)) + { + DISPDBG((0, "DISP DrvAssertMode failed bInitSURF\n")); + return (FALSE); + } + + if (pjScreen != ppdev->pjScreen) { + + if ( !EngModifySurface(ppdev->hsurfEng, + ppdev->hdevEng, + ppdev->flHooks | HOOK_SYNCHRONIZE, + MS_NOTSYSTEMMEMORY, + (DHSURF)ppdev, + ppdev->pjScreen, + ppdev->lDeltaScreen, + NULL)) + { + DISPDBG((0, "DISP DrvAssertMode failed EngModifySurface\n")); + return (FALSE); + } + } +// eVb: 1.6 [END] + return (TRUE); + } + else + { + // + // We must give up the display. + // Call the kernel driver to reset the device to a known state. + // + + if (EngDeviceIoControl(ppdev->hDriver, + IOCTL_VIDEO_RESET_DEVICE, + NULL, + 0, + NULL, + 0, + &ulReturn)) + { + RIP("DISP DrvAssertMode failed IOCTL"); + return FALSE; + } + else + { + return TRUE; + } + } +} + +/******************************Public*Routine******************************\ +* DrvGetModes +* +* Returns the list of available modes for the device. +* +\**************************************************************************/ + +ULONG DrvGetModes( +HANDLE hDriver, +ULONG cjSize, +DEVMODEW *pdm) + +{ + + DWORD cModes; + DWORD cbOutputSize; + PVIDEO_MODE_INFORMATION pVideoModeInformation, pVideoTemp; + DWORD cOutputModes = cjSize / (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE); + DWORD cbModeSize; + + DISPDBG((3, "DrvGetModes\n")); + + cModes = getAvailableModes(hDriver, + (PVIDEO_MODE_INFORMATION *) &pVideoModeInformation, + &cbModeSize); + + if (cModes == 0) + { + DISPDBG((0, "DrvGetModes failed to get mode information")); + return 0; + } + + if (pdm == NULL) + { + cbOutputSize = cModes * (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE); + } + else + { + // + // Now copy the information for the supported modes back into the output + // buffer + // + + cbOutputSize = 0; + + pVideoTemp = pVideoModeInformation; + + do + { + if (pVideoTemp->Length != 0) + { + if (cOutputModes == 0) + { + break; + } + + // + // Zero the entire structure to start off with. + // + + memset(pdm, 0, sizeof(DEVMODEW)); + + // + // Set the name of the device to the name of the DLL. + // + + memcpy(pdm->dmDeviceName, DLL_NAME, sizeof(DLL_NAME)); + + pdm->dmSpecVersion = DM_SPECVERSION; + pdm->dmDriverVersion = DM_SPECVERSION; + pdm->dmSize = sizeof(DEVMODEW); + pdm->dmDriverExtra = DRIVER_EXTRA_SIZE; + + pdm->dmBitsPerPel = pVideoTemp->NumberOfPlanes * + pVideoTemp->BitsPerPlane; + pdm->dmPelsWidth = pVideoTemp->VisScreenWidth; + pdm->dmPelsHeight = pVideoTemp->VisScreenHeight; + pdm->dmDisplayFrequency = pVideoTemp->Frequency; + pdm->dmDisplayFlags = 0; + + pdm->dmFields = DM_BITSPERPEL | + DM_PELSWIDTH | + DM_PELSHEIGHT | + DM_DISPLAYFREQUENCY | + DM_DISPLAYFLAGS ; + + // + // Go to the next DEVMODE entry in the buffer. + // + + cOutputModes--; + + pdm = (LPDEVMODEW) ( ((ULONG)pdm) + sizeof(DEVMODEW) + + DRIVER_EXTRA_SIZE); + + cbOutputSize += (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE); + + } + + pVideoTemp = (PVIDEO_MODE_INFORMATION) + (((PUCHAR)pVideoTemp) + cbModeSize); + + } while (--cModes); + } + + EngFreeMem(pVideoModeInformation); + + return cbOutputSize; + +} diff --git a/reactos/drivers/video/displays/framebuf_new/framebuf_new.rbuild b/reactos/drivers/video/displays/framebuf_new/framebuf_new.rbuild new file mode 100644 index 00000000000..991954e44e2 --- /dev/null +++ b/reactos/drivers/video/displays/framebuf_new/framebuf_new.rbuild @@ -0,0 +1,19 @@ + + + + + . + win32k + debug.c + enable.c + palette.c + pointer.c + screen.c + framebuf_new.rc + + -mrtd + -fno-builtin + -Wno-unused-variable + + driver.h + diff --git a/reactos/drivers/video/displays/framebuf_new/framebuf_new.rc b/reactos/drivers/video/displays/framebuf_new/framebuf_new.rc new file mode 100644 index 00000000000..98ba2627f11 --- /dev/null +++ b/reactos/drivers/video/displays/framebuf_new/framebuf_new.rc @@ -0,0 +1,5 @@ +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "Framebuffer Display Driver\0" +#define REACTOS_STR_INTERNAL_NAME "framebuf\0" +#define REACTOS_STR_ORIGINAL_FILENAME "framebuf.dll\0" +#include diff --git a/reactos/drivers/video/displays/framebuf_new/framebuf_new.spec b/reactos/drivers/video/displays/framebuf_new/framebuf_new.spec new file mode 100644 index 00000000000..aec115e4ef7 --- /dev/null +++ b/reactos/drivers/video/displays/framebuf_new/framebuf_new.spec @@ -0,0 +1 @@ +@ stdcall DrvEnableDriver(long long ptr) diff --git a/reactos/drivers/video/displays/framebuf_new/palette.c b/reactos/drivers/video/displays/framebuf_new/palette.c new file mode 100755 index 00000000000..c8cff990e2b --- /dev/null +++ b/reactos/drivers/video/displays/framebuf_new/palette.c @@ -0,0 +1,332 @@ +/* + * PROJECT: ReactOS Framebuffer Display Driver + * LICENSE: Microsoft NT4 DDK Sample Code License + * FILE: boot/drivers/video/displays/framebuf/palette.c + * PURPOSE: Palette Support + * PROGRAMMERS: Copyright (c) 1992-1995 Microsoft Corporation + */ + +#include "driver.h" + +// Global Table defining the 20 Window Default Colors. For 256 color +// palettes the first 10 must be put at the beginning of the palette +// and the last 10 at the end of the palette. + +const PALETTEENTRY BASEPALETTE[20] = +{ + { 0, 0, 0, 0 }, // 0 + { 0x80,0, 0, 0 }, // 1 + { 0, 0x80,0, 0 }, // 2 + { 0x80,0x80,0, 0 }, // 3 + { 0, 0, 0x80,0 }, // 4 + { 0x80,0, 0x80,0 }, // 5 + { 0, 0x80,0x80,0 }, // 6 + { 0xC0,0xC0,0xC0,0 }, // 7 + { 192, 220, 192, 0 }, // 8 + { 166, 202, 240, 0 }, // 9 + { 255, 251, 240, 0 }, // 10 + { 160, 160, 164, 0 }, // 11 + { 0x80,0x80,0x80,0 }, // 12 + { 0xFF,0, 0 ,0 }, // 13 + { 0, 0xFF,0 ,0 }, // 14 + { 0xFF,0xFF,0 ,0 }, // 15 + { 0 ,0, 0xFF,0 }, // 16 + { 0xFF,0, 0xFF,0 }, // 17 + { 0, 0xFF,0xFF,0 }, // 18 + { 0xFF,0xFF,0xFF,0 }, // 19 +}; + +BOOL bInitDefaultPalette(PPDEV ppdev, DEVINFO *pDevInfo); + +/******************************Public*Routine******************************\ +* bInitPaletteInfo +* +* Initializes the palette information for this PDEV. +* +* Called by DrvEnablePDEV. +* +\**************************************************************************/ + +BOOL bInitPaletteInfo(PPDEV ppdev, DEVINFO *pDevInfo) +{ + if (!bInitDefaultPalette(ppdev, pDevInfo)) + return(FALSE); + + return(TRUE); +} + +/******************************Public*Routine******************************\ +* vDisablePalette +* +* Frees resources allocated by bInitPaletteInfo. +* +\**************************************************************************/ + +VOID vDisablePalette(PPDEV ppdev) +{ +// Delete the default palette if we created one. + + if (ppdev->hpalDefault) + { + EngDeletePalette(ppdev->hpalDefault); + ppdev->hpalDefault = (HPALETTE) 0; + } + + if (ppdev->pPal != (PPALETTEENTRY)NULL) + EngFreeMem((PVOID)ppdev->pPal); +} + +/******************************Public*Routine******************************\ +* bInitDefaultPalette +* +* Initializes default palette for PDEV. +* +\**************************************************************************/ + +BOOL bInitDefaultPalette(PPDEV ppdev, DEVINFO *pDevInfo) +{ + if (ppdev->ulBitCount == 8) + { + ULONG ulLoop; + BYTE jRed,jGre,jBlu; + + // + // Allocate our palette + // + + ppdev->pPal = (PPALETTEENTRY)EngAllocMem(0, sizeof(PALETTEENTRY) * 256, + ALLOC_TAG); + + if ((ppdev->pPal) == NULL) { + RIP("DISP bInitDefaultPalette() failed EngAllocMem\n"); + return(FALSE); + } + + // + // Generate 256 (8*4*4) RGB combinations to fill the palette + // + + jRed = jGre = jBlu = 0; + + for (ulLoop = 0; ulLoop < 256; ulLoop++) + { + ppdev->pPal[ulLoop].peRed = jRed; + ppdev->pPal[ulLoop].peGreen = jGre; + ppdev->pPal[ulLoop].peBlue = jBlu; + ppdev->pPal[ulLoop].peFlags = (BYTE)0; + + if (!(jRed += 32)) + if (!(jGre += 32)) + jBlu += 64; + } + + // + // Fill in Windows Reserved Colors from the WIN 3.0 DDK + // The Window Manager reserved the first and last 10 colors for + // painting windows borders and for non-palette managed applications. + // + + for (ulLoop = 0; ulLoop < 10; ulLoop++) + { + // + // First 10 + // + + ppdev->pPal[ulLoop] = BASEPALETTE[ulLoop]; + + // + // Last 10 + // + + ppdev->pPal[246 + ulLoop] = BASEPALETTE[ulLoop+10]; + } + + // + // Create handle for palette. + // + + ppdev->hpalDefault = + pDevInfo->hpalDefault = EngCreatePalette(PAL_INDEXED, + 256, + (PULONG) ppdev->pPal, + 0,0,0); + + if (ppdev->hpalDefault == (HPALETTE) 0) + { + RIP("DISP bInitDefaultPalette failed EngCreatePalette\n"); + EngFreeMem(ppdev->pPal); + return(FALSE); + } + + // + // Initialize the hardware with the initial palette. + // + + return(TRUE); + + } else { + + ppdev->hpalDefault = + pDevInfo->hpalDefault = EngCreatePalette(PAL_BITFIELDS, + 0,(PULONG) NULL, + ppdev->flRed, + ppdev->flGreen, + ppdev->flBlue); + + if (ppdev->hpalDefault == (HPALETTE) 0) + { + RIP("DISP bInitDefaultPalette failed EngCreatePalette\n"); + return(FALSE); + } + } + + return(TRUE); +} + +/******************************Public*Routine******************************\ +* bInit256ColorPalette +* +* Initialize the hardware's palette registers. +* +\**************************************************************************/ + +BOOL bInit256ColorPalette(PPDEV ppdev) +{ + BYTE ajClutSpace[MAX_CLUT_SIZE]; + PVIDEO_CLUT pScreenClut; + ULONG ulReturnedDataLength; + ULONG cColors; + PVIDEO_CLUTDATA pScreenClutData; + + if (ppdev->ulBitCount == 8) + { + // + // Fill in pScreenClut header info: + // + + pScreenClut = (PVIDEO_CLUT) ajClutSpace; + pScreenClut->NumEntries = 256; + pScreenClut->FirstEntry = 0; + + // + // Copy colours in: + // + + cColors = 256; + pScreenClutData = (PVIDEO_CLUTDATA) (&(pScreenClut->LookupTable[0])); + + while(cColors--) + { + pScreenClutData[cColors].Red = ppdev->pPal[cColors].peRed >> + ppdev->cPaletteShift; + pScreenClutData[cColors].Green = ppdev->pPal[cColors].peGreen >> + ppdev->cPaletteShift; + pScreenClutData[cColors].Blue = ppdev->pPal[cColors].peBlue >> + ppdev->cPaletteShift; + pScreenClutData[cColors].Unused = 0; + } + + // + // Set palette registers: + // + + if (EngDeviceIoControl(ppdev->hDriver, + IOCTL_VIDEO_SET_COLOR_REGISTERS, + pScreenClut, + MAX_CLUT_SIZE, + NULL, + 0, + &ulReturnedDataLength)) + { + DISPDBG((0, "Failed bEnablePalette")); + return(FALSE); + } + } + + DISPDBG((5, "Passed bEnablePalette")); + + return(TRUE); +} + +/******************************Public*Routine******************************\ +* DrvSetPalette +* +* DDI entry point for manipulating the palette. +* +\**************************************************************************/ + +BOOL DrvSetPalette( +DHPDEV dhpdev, +PALOBJ* ppalo, +FLONG fl, +ULONG iStart, +ULONG cColors) +{ + BYTE ajClutSpace[MAX_CLUT_SIZE]; + PVIDEO_CLUT pScreenClut; + PVIDEO_CLUTDATA pScreenClutData; + PDEV* ppdev; + + UNREFERENCED_PARAMETER(fl); + + ppdev = (PDEV*) dhpdev; + + // + // Fill in pScreenClut header info: + // + + pScreenClut = (PVIDEO_CLUT) ajClutSpace; + pScreenClut->NumEntries = (USHORT) cColors; + pScreenClut->FirstEntry = (USHORT) iStart; + + pScreenClutData = (PVIDEO_CLUTDATA) (&(pScreenClut->LookupTable[0])); + + if (cColors != PALOBJ_cGetColors(ppalo, iStart, cColors, + (ULONG*) pScreenClutData)) + { + DISPDBG((0, "DrvSetPalette failed PALOBJ_cGetColors\n")); + return (FALSE); + } + + // + // Set the high reserved byte in each palette entry to 0. + // Do the appropriate palette shifting to fit in the DAC. + // + + if (ppdev->cPaletteShift) + { + while(cColors--) + { + pScreenClutData[cColors].Red >>= ppdev->cPaletteShift; + pScreenClutData[cColors].Green >>= ppdev->cPaletteShift; + pScreenClutData[cColors].Blue >>= ppdev->cPaletteShift; + pScreenClutData[cColors].Unused = 0; + } + } + else + { + while(cColors--) + { + pScreenClutData[cColors].Unused = 0; + } + } + + // + // Set palette registers + // + + if (EngDeviceIoControl(ppdev->hDriver, + IOCTL_VIDEO_SET_COLOR_REGISTERS, + pScreenClut, + MAX_CLUT_SIZE, + NULL, + 0, + &cColors)) + { + DISPDBG((0, "DrvSetPalette failed EngDeviceIoControl\n")); + return (FALSE); + } + + return(TRUE); + +} diff --git a/reactos/drivers/video/displays/framebuf_new/pointer.c b/reactos/drivers/video/displays/framebuf_new/pointer.c new file mode 100755 index 00000000000..d3752a2763c --- /dev/null +++ b/reactos/drivers/video/displays/framebuf_new/pointer.c @@ -0,0 +1,455 @@ +/* + * PROJECT: ReactOS Framebuffer Display Driver + * LICENSE: Microsoft NT4 DDK Sample Code License + * FILE: boot/drivers/video/displays/framebuf/pointer.c + * PURPOSE: Hardware Pointer Support + * PROGRAMMERS: Copyright (c) 1992-1995 Microsoft Corporation + */ + +#include "driver.h" + +BOOL bCopyColorPointer( +PPDEV ppdev, +SURFOBJ *psoMask, +SURFOBJ *psoColor, +XLATEOBJ *pxlo); + +BOOL bCopyMonoPointer( +PPDEV ppdev, +SURFOBJ *psoMask); + +BOOL bSetHardwarePointerShape( +SURFOBJ *pso, +SURFOBJ *psoMask, +SURFOBJ *psoColor, +XLATEOBJ *pxlo, +LONG x, +LONG y, +FLONG fl); + +/******************************Public*Routine******************************\ +* DrvMovePointer +* +* Moves the hardware pointer to a new position. +* +\**************************************************************************/ + +VOID DrvMovePointer +( + SURFOBJ *pso, + LONG x, + LONG y, + RECTL *prcl +) +{ + PPDEV ppdev = (PPDEV) pso->dhpdev; + DWORD returnedDataLength; + VIDEO_POINTER_POSITION NewPointerPosition; + + // We don't use the exclusion rectangle because we only support + // hardware Pointers. If we were doing our own Pointer simulations + // we would want to update prcl so that the engine would call us + // to exclude out pointer before drawing to the pixels in prcl. + + UNREFERENCED_PARAMETER(prcl); + + if (x == -1) + { + // + // A new position of (-1,-1) means hide the pointer. + // + + if (EngDeviceIoControl(ppdev->hDriver, + IOCTL_VIDEO_DISABLE_POINTER, + NULL, + 0, + NULL, + 0, + &returnedDataLength)) + { + // + // Not the end of the world, print warning in checked build. + // + + DISPDBG((1, "DISP vMoveHardwarePointer failed IOCTL_VIDEO_DISABLE_POINTER\n")); + } + } + else + { + NewPointerPosition.Column = (SHORT) x - (SHORT) (ppdev->ptlHotSpot.x); + NewPointerPosition.Row = (SHORT) y - (SHORT) (ppdev->ptlHotSpot.y); + + // + // Call miniport driver to move Pointer. + // + + if (EngDeviceIoControl(ppdev->hDriver, + IOCTL_VIDEO_SET_POINTER_POSITION, + &NewPointerPosition, + sizeof(VIDEO_POINTER_POSITION), + NULL, + 0, + &returnedDataLength)) + { + // + // Not the end of the world, print warning in checked build. + // + + DISPDBG((1, "DISP vMoveHardwarePointer failed IOCTL_VIDEO_SET_POINTER_POSITION\n")); + } + } +} + +/******************************Public*Routine******************************\ +* DrvSetPointerShape +* +* Sets the new pointer shape. +* +\**************************************************************************/ + +ULONG DrvSetPointerShape +( + SURFOBJ *pso, + SURFOBJ *psoMask, + SURFOBJ *psoColor, + XLATEOBJ *pxlo, + LONG xHot, + LONG yHot, + LONG x, + LONG y, + RECTL *prcl, + FLONG fl +) +{ + PPDEV ppdev = (PPDEV) pso->dhpdev; + DWORD returnedDataLength; + + // We don't use the exclusion rectangle because we only support + // hardware Pointers. If we were doing our own Pointer simulations + // we would want to update prcl so that the engine would call us + // to exclude out pointer before drawing to the pixels in prcl. + UNREFERENCED_PARAMETER(prcl); + + if (ppdev->pPointerAttributes == (PVIDEO_POINTER_ATTRIBUTES) NULL) + { + // Mini-port has no hardware Pointer support. + return(SPS_ERROR); + } + + // See if we are being asked to hide the pointer + + if (psoMask == (SURFOBJ *) NULL) + { + if (EngDeviceIoControl(ppdev->hDriver, + IOCTL_VIDEO_DISABLE_POINTER, + NULL, + 0, + NULL, + 0, + &returnedDataLength)) + { + // + // It should never be possible to fail. + // Message supplied for debugging. + // + + DISPDBG((1, "DISP bSetHardwarePointerShape failed IOCTL_VIDEO_DISABLE_POINTER\n")); + } + + return(TRUE); + } + + ppdev->ptlHotSpot.x = xHot; + ppdev->ptlHotSpot.y = yHot; + + if (!bSetHardwarePointerShape(pso,psoMask,psoColor,pxlo,x,y,fl)) + { + if (ppdev->fHwCursorActive) { + ppdev->fHwCursorActive = FALSE; + + if (EngDeviceIoControl(ppdev->hDriver, + IOCTL_VIDEO_DISABLE_POINTER, + NULL, + 0, + NULL, + 0, + &returnedDataLength)) { + + DISPDBG((1, "DISP bSetHardwarePointerShape failed IOCTL_VIDEO_DISABLE_POINTER\n")); + } + } + + // + // Mini-port declines to realize this Pointer + // + + return(SPS_DECLINE); + } + else + { + ppdev->fHwCursorActive = TRUE; + } + + return(SPS_ACCEPT_NOEXCLUDE); +} + +/******************************Public*Routine******************************\ +* bSetHardwarePointerShape +* +* Changes the shape of the Hardware Pointer. +* +* Returns: True if successful, False if Pointer shape can't be hardware. +* +\**************************************************************************/ + +BOOL bSetHardwarePointerShape( +SURFOBJ *pso, +SURFOBJ *psoMask, +SURFOBJ *psoColor, +XLATEOBJ *pxlo, +LONG x, +LONG y, +FLONG fl) +{ + PPDEV ppdev = (PPDEV) pso->dhpdev; + PVIDEO_POINTER_ATTRIBUTES pPointerAttributes = ppdev->pPointerAttributes; + DWORD returnedDataLength; + + if (psoColor != (SURFOBJ *) NULL) + { + if ((ppdev->PointerCapabilities.Flags & VIDEO_MODE_COLOR_POINTER) && + bCopyColorPointer(ppdev, psoMask, psoColor, pxlo)) + { + pPointerAttributes->Flags |= VIDEO_MODE_COLOR_POINTER; + } else { + return(FALSE); + } + + } else { + + if ((ppdev->PointerCapabilities.Flags & VIDEO_MODE_MONO_POINTER) && + bCopyMonoPointer(ppdev, psoMask)) + { + pPointerAttributes->Flags |= VIDEO_MODE_MONO_POINTER; + } else { + return(FALSE); + } + } + + // + // Initialize Pointer attributes and position + // + + pPointerAttributes->Enable = 1; + + // + // if x,y = -1,-1 then pass them directly to the miniport so that + // the cursor will be disabled + + pPointerAttributes->Column = (SHORT)(x); + pPointerAttributes->Row = (SHORT)(y); + + if ((x != -1) || (y != -1)) { + pPointerAttributes->Column -= (SHORT)(ppdev->ptlHotSpot.x); + pPointerAttributes->Row -= (SHORT)(ppdev->ptlHotSpot.y); + } + + // + // set animate flags + // + + if (fl & SPS_ANIMATESTART) { + pPointerAttributes->Flags |= VIDEO_MODE_ANIMATE_START; + } else if (fl & SPS_ANIMATEUPDATE) { + pPointerAttributes->Flags |= VIDEO_MODE_ANIMATE_UPDATE; + } + + // + // Set the new Pointer shape. + // + + if (EngDeviceIoControl(ppdev->hDriver, + IOCTL_VIDEO_SET_POINTER_ATTR, + pPointerAttributes, + ppdev->cjPointerAttributes, + NULL, + 0, + &returnedDataLength)) { + + DISPDBG((1, "DISP:Failed IOCTL_VIDEO_SET_POINTER_ATTR call\n")); + return(FALSE); + } + + return(TRUE); +} + +/******************************Public*Routine******************************\ +* bCopyMonoPointer +* +* Copies two monochrome masks into a buffer of the maximum size handled by the +* miniport, with any extra bits set to 0. The masks are converted to topdown +* form if they aren't already. Returns TRUE if we can handle this pointer in +* hardware, FALSE if not. +* +\**************************************************************************/ + +BOOL bCopyMonoPointer( + PPDEV ppdev, + SURFOBJ *pso) +{ + ULONG cy; + PBYTE pjSrcAnd, pjSrcXor; + LONG lDeltaSrc, lDeltaDst; + LONG lSrcWidthInBytes; + ULONG cxSrc = pso->sizlBitmap.cx; + ULONG cySrc = pso->sizlBitmap.cy; + ULONG cxSrcBytes; + PVIDEO_POINTER_ATTRIBUTES pPointerAttributes = ppdev->pPointerAttributes; + PBYTE pjDstAnd = pPointerAttributes->Pixels; + PBYTE pjDstXor = pPointerAttributes->Pixels; + + // Make sure the new pointer isn't too big to handle + // (*2 because both masks are in there) + if ((cxSrc > ppdev->PointerCapabilities.MaxWidth) || + (cySrc > (ppdev->PointerCapabilities.MaxHeight * 2))) + { + return(FALSE); + } + + pjDstXor += ((ppdev->PointerCapabilities.MaxWidth + 7) / 8) * + ppdev->pPointerAttributes->Height; + + // set the desk and mask to 0xff + RtlFillMemory(pjDstAnd, ppdev->pPointerAttributes->WidthInBytes * + ppdev->pPointerAttributes->Height, 0xFF); + + // Zero the dest XOR mask + RtlZeroMemory(pjDstXor, ppdev->pPointerAttributes->WidthInBytes * + ppdev->pPointerAttributes->Height); + + cxSrcBytes = (cxSrc + 7) / 8; + + if ((lDeltaSrc = pso->lDelta) < 0) + { + lSrcWidthInBytes = -lDeltaSrc; + } else { + lSrcWidthInBytes = lDeltaSrc; + } + + pjSrcAnd = (PBYTE) pso->pvBits; + + // If the incoming pointer bitmap is bottomup, we'll flip it to topdown to + // save the miniport some work + if (!(pso->fjBitmap & BMF_TOPDOWN)) + { + // Copy from the bottom + pjSrcAnd += lSrcWidthInBytes * (cySrc - 1); + } + + // Height of just AND mask + cySrc = cySrc / 2; + + // Point to XOR mask + pjSrcXor = pjSrcAnd + (cySrc * lDeltaSrc); + + // Offset from end of one dest scan to start of next + lDeltaDst = ppdev->pPointerAttributes->WidthInBytes; + + for (cy = 0; cy < cySrc; ++cy) + { + RtlCopyMemory(pjDstAnd, pjSrcAnd, cxSrcBytes); + RtlCopyMemory(pjDstXor, pjSrcXor, cxSrcBytes); + + // Point to next source and dest scans + pjSrcAnd += lDeltaSrc; + pjSrcXor += lDeltaSrc; + pjDstAnd += lDeltaDst; + pjDstXor += lDeltaDst; + } + + return(TRUE); +} + +/******************************Public*Routine******************************\ +* bCopyColorPointer +* +* Copies the mono and color masks into the buffer of maximum size +* handled by the miniport with any extra bits set to 0. Color translation +* is handled at this time. The masks are converted to topdown form if they +* aren't already. Returns TRUE if we can handle this pointer in hardware, +* FALSE if not. +* +\**************************************************************************/ +BOOL bCopyColorPointer( +PPDEV ppdev, +SURFOBJ *psoMask, +SURFOBJ *psoColor, +XLATEOBJ *pxlo) +{ + return(FALSE); +} + + +/******************************Public*Routine******************************\ +* bInitPointer +* +* Initialize the Pointer attributes. +* +\**************************************************************************/ + +BOOL bInitPointer(PPDEV ppdev, DEVINFO *pdevinfo) +{ + DWORD returnedDataLength; + + ppdev->pPointerAttributes = (PVIDEO_POINTER_ATTRIBUTES) NULL; + ppdev->cjPointerAttributes = 0; // initialized in screen.c + + // + // Ask the miniport whether it provides pointer support. + // + + if (EngDeviceIoControl(ppdev->hDriver, + IOCTL_VIDEO_QUERY_POINTER_CAPABILITIES, + &ppdev->ulMode, + sizeof(PVIDEO_MODE), + &ppdev->PointerCapabilities, + sizeof(ppdev->PointerCapabilities), + &returnedDataLength)) + { + return(FALSE); + } + + // + // If neither mono nor color hardware pointer is supported, there's no + // hardware pointer support and we're done. + // + + if ((!(ppdev->PointerCapabilities.Flags & VIDEO_MODE_MONO_POINTER)) && + (!(ppdev->PointerCapabilities.Flags & VIDEO_MODE_COLOR_POINTER))) + { + return(TRUE); + } + + // + // Note: The buffer itself is allocated after we set the + // mode. At that time we know the pixel depth and we can + // allocate the correct size for the color pointer if supported. + // + + // + // Set the asynchronous support status (async means miniport is capable of + // drawing the Pointer at any time, with no interference with any ongoing + // drawing operation) + // + + if (ppdev->PointerCapabilities.Flags & VIDEO_MODE_ASYNC_POINTER) + { + pdevinfo->flGraphicsCaps |= GCAPS_ASYNCMOVE; + } + else + { + pdevinfo->flGraphicsCaps &= ~GCAPS_ASYNCMOVE; + } + + return(TRUE); +} diff --git a/reactos/drivers/video/displays/framebuf_new/screen.c b/reactos/drivers/video/displays/framebuf_new/screen.c new file mode 100755 index 00000000000..7ea4443c323 --- /dev/null +++ b/reactos/drivers/video/displays/framebuf_new/screen.c @@ -0,0 +1,604 @@ +/* + * PROJECT: ReactOS Framebuffer Display Driver + * LICENSE: Microsoft NT4 DDK Sample Code License + * FILE: boot/drivers/video/displays/framebuf/screen.c + * PURPOSE: Surface, Screen and PDEV support/initialization + * PROGRAMMERS: Copyright (c) 1992-1995 Microsoft Corporation + * ReactOS Portable Systems Group + */ +#include "driver.h" + +#define SYSTM_LOGFONT {16,7,0,0,700,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH | FF_DONTCARE,L"System"} +#define HELVE_LOGFONT {12,9,0,0,400,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_STROKE_PRECIS,PROOF_QUALITY,VARIABLE_PITCH | FF_DONTCARE,L"MS Sans Serif"} +#define COURI_LOGFONT {12,9,0,0,400,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_STROKE_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_DONTCARE, L"Courier"} + +// This is the basic devinfo for a default driver. This is used as a base and customized based +// on information passed back from the miniport driver. + +const DEVINFO gDevInfoFrameBuffer = { + ( GCAPS_OPAQUERECT +// eVb: 2.8 [DDK CHANGE] - No dithering support +// eVb: 2.8 [END] + ), /* Graphics capabilities */ + SYSTM_LOGFONT, /* Default font description */ + HELVE_LOGFONT, /* ANSI variable font description */ + COURI_LOGFONT, /* ANSI fixed font description */ + 0, /* Count of device fonts */ + 0, /* Preferred DIB format */ +// eVb: 2.9 [DDK CHANGE] - No dithering support + 0, /* Width of color dither */ + 0, /* Height of color dither */ +// eVb: 2.9 [END] + 0 /* Default palette to use for this device */ +}; + +/******************************Public*Routine******************************\ +* bInitSURF +* +* Enables the surface. Maps the frame buffer into memory. +* +\**************************************************************************/ + +BOOL bInitSURF(PPDEV ppdev, BOOL bFirst) +{ + DWORD returnedDataLength; + DWORD MaxWidth, MaxHeight; + VIDEO_MEMORY videoMemory; + VIDEO_MEMORY_INFORMATION videoMemoryInformation; +// eVb: 2.1 [DDK Change] - Support new VGA Miniport behavior w.r.t updated framebuffer remapping + ULONG RemappingNeeded = 0; +// eVb: 2.1 [END] + // + // Set the current mode into the hardware. + // + + if (EngDeviceIoControl(ppdev->hDriver, + IOCTL_VIDEO_SET_CURRENT_MODE, + &(ppdev->ulMode), + sizeof(ULONG), +// eVb: 2.2 [DDK Change] - Support new VGA Miniport behavior w.r.t updated framebuffer remapping + &RemappingNeeded, + sizeof(ULONG), +// eVb: 2.2 [END] + &returnedDataLength)) + { + RIP("DISP bInitSURF failed IOCTL_SET_MODE\n"); + return(FALSE); + } + + // + // If this is the first time we enable the surface we need to map in the + // memory also. + // +// eVb: 2.3 [DDK Change] - Support new VGA Miniport behavior w.r.t updated framebuffer remapping + if (bFirst || RemappingNeeded) + { +// eVb: 2.3 [END] + videoMemory.RequestedVirtualAddress = NULL; + + if (EngDeviceIoControl(ppdev->hDriver, + IOCTL_VIDEO_MAP_VIDEO_MEMORY, + &videoMemory, + sizeof(VIDEO_MEMORY), + &videoMemoryInformation, + sizeof(VIDEO_MEMORY_INFORMATION), + &returnedDataLength)) + { + RIP("DISP bInitSURF failed IOCTL_VIDEO_MAP\n"); + return(FALSE); + } + + ppdev->pjScreen = (PBYTE)(videoMemoryInformation.FrameBufferBase); + + if (videoMemoryInformation.FrameBufferBase != + videoMemoryInformation.VideoRamBase) + { + RIP("VideoRamBase does not correspond to FrameBufferBase\n"); + } +// eVb: 2.4 [DDK Change] - Make sure frame buffer mapping worked + // + // Make sure we can access this video memory + // + + *(PULONG)(ppdev->pjScreen) = 0xaa55aa55; + + if (*(PULONG)(ppdev->pjScreen) != 0xaa55aa55) { + + DISPDBG((1, "Frame buffer memory is not accessible.\n")); + return(FALSE); + } +// eVb: 2.4 [END] + ppdev->cScreenSize = videoMemoryInformation.VideoRamLength; + + // + // Initialize the head of the offscreen list to NULL. + // + + ppdev->pOffscreenList = NULL; + + // It's a hardware pointer; set up pointer attributes. + + MaxHeight = ppdev->PointerCapabilities.MaxHeight; + + // Allocate space for two DIBs (data/mask) for the pointer. If this + // device supports a color Pointer, we will allocate a larger bitmap. + // If this is a color bitmap we allocate for the largest possible + // bitmap because we have no idea of what the pixel depth might be. + + // Width rounded up to nearest byte multiple + + if (!(ppdev->PointerCapabilities.Flags & VIDEO_MODE_COLOR_POINTER)) + { + MaxWidth = (ppdev->PointerCapabilities.MaxWidth + 7) / 8; + } + else + { + MaxWidth = ppdev->PointerCapabilities.MaxWidth * sizeof(DWORD); + } + + ppdev->cjPointerAttributes = + sizeof(VIDEO_POINTER_ATTRIBUTES) + + ((sizeof(UCHAR) * MaxWidth * MaxHeight) * 2); + + ppdev->pPointerAttributes = (PVIDEO_POINTER_ATTRIBUTES) + EngAllocMem(0, ppdev->cjPointerAttributes, ALLOC_TAG); + + if (ppdev->pPointerAttributes == NULL) { + + DISPDBG((0, "bInitPointer EngAllocMem failed\n")); + return(FALSE); + } + + ppdev->pPointerAttributes->Flags = ppdev->PointerCapabilities.Flags; + ppdev->pPointerAttributes->WidthInBytes = MaxWidth; + ppdev->pPointerAttributes->Width = ppdev->PointerCapabilities.MaxWidth; + ppdev->pPointerAttributes->Height = MaxHeight; + ppdev->pPointerAttributes->Column = 0; + ppdev->pPointerAttributes->Row = 0; + ppdev->pPointerAttributes->Enable = 0; + } + + return(TRUE); +} + +/******************************Public*Routine******************************\ +* vDisableSURF +* +* Disable the surface. Un-Maps the frame in memory. +* +\**************************************************************************/ + +VOID vDisableSURF(PPDEV ppdev) +{ + DWORD returnedDataLength; + VIDEO_MEMORY videoMemory; + + videoMemory.RequestedVirtualAddress = (PVOID) ppdev->pjScreen; + + if (EngDeviceIoControl(ppdev->hDriver, + IOCTL_VIDEO_UNMAP_VIDEO_MEMORY, + &videoMemory, + sizeof(VIDEO_MEMORY), + NULL, + 0, + &returnedDataLength)) + { + RIP("DISP vDisableSURF failed IOCTL_VIDEO_UNMAP\n"); + } +} + + +/******************************Public*Routine******************************\ +* bInitPDEV +* +* Determine the mode we should be in based on the DEVMODE passed in. +* Query mini-port to get information needed to fill in the DevInfo and the +* GdiInfo . +* +\**************************************************************************/ + +BOOL bInitPDEV( +PPDEV ppdev, +DEVMODEW *pDevMode, +GDIINFO *pGdiInfo, +DEVINFO *pDevInfo) +{ + ULONG cModes; + PVIDEO_MODE_INFORMATION pVideoBuffer, pVideoModeSelected, pVideoTemp; + VIDEO_COLOR_CAPABILITIES colorCapabilities; + ULONG ulTemp; + BOOL bSelectDefault; + ULONG cbModeSize; + + // + // calls the miniport to get mode information. + // + + cModes = getAvailableModes(ppdev->hDriver, &pVideoBuffer, &cbModeSize); + + if (cModes == 0) + { + return(FALSE); + } + + // + // Now see if the requested mode has a match in that table. + // + + pVideoModeSelected = NULL; + pVideoTemp = pVideoBuffer; + + if ((pDevMode->dmPelsWidth == 0) && + (pDevMode->dmPelsHeight == 0) && + (pDevMode->dmBitsPerPel == 0) && + (pDevMode->dmDisplayFrequency == 0)) + { + DISPDBG((2, "Default mode requested")); + bSelectDefault = TRUE; + } + else + { +// eVb: 2.5 [DDK Change] - Add missing newlines to debug output + DISPDBG((2, "Requested mode...\n")); + DISPDBG((2, " Screen width -- %li\n", pDevMode->dmPelsWidth)); + DISPDBG((2, " Screen height -- %li\n", pDevMode->dmPelsHeight)); + DISPDBG((2, " Bits per pel -- %li\n", pDevMode->dmBitsPerPel)); + DISPDBG((2, " Frequency -- %li\n", pDevMode->dmDisplayFrequency)); +// eVb: 2.5 [END] + bSelectDefault = FALSE; + } + + while (cModes--) + { + if (pVideoTemp->Length != 0) + { + if (bSelectDefault || + ((pVideoTemp->VisScreenWidth == pDevMode->dmPelsWidth) && + (pVideoTemp->VisScreenHeight == pDevMode->dmPelsHeight) && + (pVideoTemp->BitsPerPlane * + pVideoTemp->NumberOfPlanes == pDevMode->dmBitsPerPel) && + (pVideoTemp->Frequency == pDevMode->dmDisplayFrequency))) + { + pVideoModeSelected = pVideoTemp; + DISPDBG((3, "Found a match\n")) ; + break; + } + } + + pVideoTemp = (PVIDEO_MODE_INFORMATION) + (((PUCHAR)pVideoTemp) + cbModeSize); + } + + // + // If no mode has been found, return an error + // + + if (pVideoModeSelected == NULL) + { + EngFreeMem(pVideoBuffer); + DISPDBG((0,"DISP bInitPDEV failed - no valid modes\n")); + return(FALSE); + } + + // + // Fill in the GDIINFO data structure with the information returned from + // the kernel driver. + // + + ppdev->ulMode = pVideoModeSelected->ModeIndex; + ppdev->cxScreen = pVideoModeSelected->VisScreenWidth; + ppdev->cyScreen = pVideoModeSelected->VisScreenHeight; + ppdev->ulBitCount = pVideoModeSelected->BitsPerPlane * + pVideoModeSelected->NumberOfPlanes; + ppdev->lDeltaScreen = pVideoModeSelected->ScreenStride; + + ppdev->flRed = pVideoModeSelected->RedMask; + ppdev->flGreen = pVideoModeSelected->GreenMask; + ppdev->flBlue = pVideoModeSelected->BlueMask; + + + pGdiInfo->ulVersion = GDI_DRIVER_VERSION; + pGdiInfo->ulTechnology = DT_RASDISPLAY; + pGdiInfo->ulHorzSize = pVideoModeSelected->XMillimeter; + pGdiInfo->ulVertSize = pVideoModeSelected->YMillimeter; + + pGdiInfo->ulHorzRes = ppdev->cxScreen; + pGdiInfo->ulVertRes = ppdev->cyScreen; + pGdiInfo->ulPanningHorzRes = ppdev->cxScreen; + pGdiInfo->ulPanningVertRes = ppdev->cyScreen; + pGdiInfo->cBitsPixel = pVideoModeSelected->BitsPerPlane; + pGdiInfo->cPlanes = pVideoModeSelected->NumberOfPlanes; + pGdiInfo->ulVRefresh = pVideoModeSelected->Frequency; + pGdiInfo->ulBltAlignment = 1; // We don't have accelerated screen- + // to-screen blts, and any + // window alignment is okay + + pGdiInfo->ulLogPixelsX = pDevMode->dmLogPixels; + pGdiInfo->ulLogPixelsY = pDevMode->dmLogPixels; + +#ifdef MIPS + if (ppdev->ulBitCount == 8) + pGdiInfo->flTextCaps = (TC_RA_ABLE | TC_SCROLLBLT); + else +#endif + pGdiInfo->flTextCaps = TC_RA_ABLE; + + pGdiInfo->flRaster = 0; // flRaster is reserved by DDI + + pGdiInfo->ulDACRed = pVideoModeSelected->NumberRedBits; + pGdiInfo->ulDACGreen = pVideoModeSelected->NumberGreenBits; + pGdiInfo->ulDACBlue = pVideoModeSelected->NumberBlueBits; + + pGdiInfo->ulAspectX = 0x24; // One-to-one aspect ratio + pGdiInfo->ulAspectY = 0x24; + pGdiInfo->ulAspectXY = 0x33; + + pGdiInfo->xStyleStep = 1; // A style unit is 3 pels + pGdiInfo->yStyleStep = 1; + pGdiInfo->denStyleStep = 3; + + pGdiInfo->ptlPhysOffset.x = 0; + pGdiInfo->ptlPhysOffset.y = 0; + pGdiInfo->szlPhysSize.cx = 0; + pGdiInfo->szlPhysSize.cy = 0; + + // RGB and CMY color info. + + // + // try to get it from the miniport. + // if the miniport doesn ot support this feature, use defaults. + // + + if (EngDeviceIoControl(ppdev->hDriver, + IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES, + NULL, + 0, + &colorCapabilities, + sizeof(VIDEO_COLOR_CAPABILITIES), + &ulTemp)) + { + + DISPDBG((2, "getcolorCapabilities failed \n")); + + pGdiInfo->ciDevice.Red.x = 6700; + pGdiInfo->ciDevice.Red.y = 3300; + pGdiInfo->ciDevice.Red.Y = 0; + pGdiInfo->ciDevice.Green.x = 2100; + pGdiInfo->ciDevice.Green.y = 7100; + pGdiInfo->ciDevice.Green.Y = 0; + pGdiInfo->ciDevice.Blue.x = 1400; + pGdiInfo->ciDevice.Blue.y = 800; + pGdiInfo->ciDevice.Blue.Y = 0; + pGdiInfo->ciDevice.AlignmentWhite.x = 3127; + pGdiInfo->ciDevice.AlignmentWhite.y = 3290; + pGdiInfo->ciDevice.AlignmentWhite.Y = 0; + + pGdiInfo->ciDevice.RedGamma = 20000; + pGdiInfo->ciDevice.GreenGamma = 20000; + pGdiInfo->ciDevice.BlueGamma = 20000; + + } + else + { + pGdiInfo->ciDevice.Red.x = colorCapabilities.RedChromaticity_x; + pGdiInfo->ciDevice.Red.y = colorCapabilities.RedChromaticity_y; + pGdiInfo->ciDevice.Red.Y = 0; + pGdiInfo->ciDevice.Green.x = colorCapabilities.GreenChromaticity_x; + pGdiInfo->ciDevice.Green.y = colorCapabilities.GreenChromaticity_y; + pGdiInfo->ciDevice.Green.Y = 0; + pGdiInfo->ciDevice.Blue.x = colorCapabilities.BlueChromaticity_x; + pGdiInfo->ciDevice.Blue.y = colorCapabilities.BlueChromaticity_y; + pGdiInfo->ciDevice.Blue.Y = 0; + pGdiInfo->ciDevice.AlignmentWhite.x = colorCapabilities.WhiteChromaticity_x; + pGdiInfo->ciDevice.AlignmentWhite.y = colorCapabilities.WhiteChromaticity_y; + pGdiInfo->ciDevice.AlignmentWhite.Y = colorCapabilities.WhiteChromaticity_Y; + + // if we have a color device store the three color gamma values, + // otherwise store the unique gamma value in all three. + + if (colorCapabilities.AttributeFlags & VIDEO_DEVICE_COLOR) + { + pGdiInfo->ciDevice.RedGamma = colorCapabilities.RedGamma; + pGdiInfo->ciDevice.GreenGamma = colorCapabilities.GreenGamma; + pGdiInfo->ciDevice.BlueGamma = colorCapabilities.BlueGamma; + } + else + { + pGdiInfo->ciDevice.RedGamma = colorCapabilities.WhiteGamma; + pGdiInfo->ciDevice.GreenGamma = colorCapabilities.WhiteGamma; + pGdiInfo->ciDevice.BlueGamma = colorCapabilities.WhiteGamma; + } + + }; + + pGdiInfo->ciDevice.Cyan.x = 0; + pGdiInfo->ciDevice.Cyan.y = 0; + pGdiInfo->ciDevice.Cyan.Y = 0; + pGdiInfo->ciDevice.Magenta.x = 0; + pGdiInfo->ciDevice.Magenta.y = 0; + pGdiInfo->ciDevice.Magenta.Y = 0; + pGdiInfo->ciDevice.Yellow.x = 0; + pGdiInfo->ciDevice.Yellow.y = 0; + pGdiInfo->ciDevice.Yellow.Y = 0; + + // No dye correction for raster displays. + + pGdiInfo->ciDevice.MagentaInCyanDye = 0; + pGdiInfo->ciDevice.YellowInCyanDye = 0; + pGdiInfo->ciDevice.CyanInMagentaDye = 0; + pGdiInfo->ciDevice.YellowInMagentaDye = 0; + pGdiInfo->ciDevice.CyanInYellowDye = 0; + pGdiInfo->ciDevice.MagentaInYellowDye = 0; + + pGdiInfo->ulDevicePelsDPI = 0; // For printers only + pGdiInfo->ulPrimaryOrder = PRIMARY_ORDER_CBA; + + // BUGBUG this should be modified to take into account the size + // of the display and the resolution. + + pGdiInfo->ulHTPatternSize = HT_PATSIZE_4x4_M; + + pGdiInfo->flHTFlags = HT_FLAG_ADDITIVE_PRIMS; + + // Fill in the basic devinfo structure + + *pDevInfo = gDevInfoFrameBuffer; + + // Fill in the rest of the devinfo and GdiInfo structures. + + if (ppdev->ulBitCount == 8) + { + // It is Palette Managed. + + pGdiInfo->ulNumColors = 20; + pGdiInfo->ulNumPalReg = 1 << ppdev->ulBitCount; +// eVb: 2.7 [DDK CHANGE] - No dithering support + pDevInfo->flGraphicsCaps |= GCAPS_PALMANAGED; +// eVb: 2.7 [END] + pGdiInfo->ulHTOutputFormat = HT_FORMAT_8BPP; + pDevInfo->iDitherFormat = BMF_8BPP; + + // Assuming palette is orthogonal - all colors are same size. + + ppdev->cPaletteShift = 8 - pGdiInfo->ulDACRed; + } + else + { + pGdiInfo->ulNumColors = (ULONG) (-1); + pGdiInfo->ulNumPalReg = 0; + + if (ppdev->ulBitCount == 16) + { + pGdiInfo->ulHTOutputFormat = HT_FORMAT_16BPP; + pDevInfo->iDitherFormat = BMF_16BPP; + } + else if (ppdev->ulBitCount == 24) + { + pGdiInfo->ulHTOutputFormat = HT_FORMAT_24BPP; + pDevInfo->iDitherFormat = BMF_24BPP; + } + else + { + pGdiInfo->ulHTOutputFormat = HT_FORMAT_32BPP; + pDevInfo->iDitherFormat = BMF_32BPP; + } + } + + EngFreeMem(pVideoBuffer); + + return(TRUE); +} + + +/******************************Public*Routine******************************\ +* getAvailableModes +* +* Calls the miniport to get the list of modes supported by the kernel driver, +* and returns the list of modes supported by the diplay driver among those +* +* returns the number of entries in the videomode buffer. +* 0 means no modes are supported by the miniport or that an error occured. +* +* NOTE: the buffer must be freed up by the caller. +* +\**************************************************************************/ + +DWORD getAvailableModes( +HANDLE hDriver, +PVIDEO_MODE_INFORMATION *modeInformation, +DWORD *cbModeSize) +{ + ULONG ulTemp; + VIDEO_NUM_MODES modes; + PVIDEO_MODE_INFORMATION pVideoTemp; + + // + // Get the number of modes supported by the mini-port + // + + if (EngDeviceIoControl(hDriver, + IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES, + NULL, + 0, + &modes, + sizeof(VIDEO_NUM_MODES), + &ulTemp)) + { + DISPDBG((0, "getAvailableModes failed VIDEO_QUERY_NUM_AVAIL_MODES\n")); + return(0); + } + + *cbModeSize = modes.ModeInformationLength; + + // + // Allocate the buffer for the mini-port to write the modes in. + // + + *modeInformation = (PVIDEO_MODE_INFORMATION) + EngAllocMem(0, modes.NumModes * + modes.ModeInformationLength, ALLOC_TAG); + + if (*modeInformation == (PVIDEO_MODE_INFORMATION) NULL) + { + DISPDBG((0, "getAvailableModes failed EngAllocMem\n")); + + return 0; + } + + // + // Ask the mini-port to fill in the available modes. + // + + if (EngDeviceIoControl(hDriver, + IOCTL_VIDEO_QUERY_AVAIL_MODES, + NULL, + 0, + *modeInformation, + modes.NumModes * modes.ModeInformationLength, + &ulTemp)) + { + + DISPDBG((0, "getAvailableModes failed VIDEO_QUERY_AVAIL_MODES\n")); + + EngFreeMem(*modeInformation); + *modeInformation = (PVIDEO_MODE_INFORMATION) NULL; + + return(0); + } + + // + // Now see which of these modes are supported by the display driver. + // As an internal mechanism, set the length to 0 for the modes we + // DO NOT support. + // + + ulTemp = modes.NumModes; + pVideoTemp = *modeInformation; + + // + // Mode is rejected if it is not one plane, or not graphics, or is not + // one of 8, 16 or 32 bits per pel. + // + + while (ulTemp--) + { + if ((pVideoTemp->NumberOfPlanes != 1 ) || + !(pVideoTemp->AttributeFlags & VIDEO_MODE_GRAPHICS) || +// eVb: 2.6 [DDK CHANGE] - Do not process banked video modes + (pVideoTemp->AttributeFlags & VIDEO_MODE_BANKED) || +// eVb: 2.6 [END] + ((pVideoTemp->BitsPerPlane != 8) && + (pVideoTemp->BitsPerPlane != 16) && + (pVideoTemp->BitsPerPlane != 24) && + (pVideoTemp->BitsPerPlane != 32))) + { + pVideoTemp->Length = 0; + } + + pVideoTemp = (PVIDEO_MODE_INFORMATION) + (((PUCHAR)pVideoTemp) + modes.ModeInformationLength); + } + + return modes.NumModes; + +} diff --git a/reactos/drivers/video/displays/framebufacc/framebufacc.h b/reactos/drivers/video/displays/framebufacc/framebufacc.h index 8f8f05a5e48..bd38ca2adaf 100644 --- a/reactos/drivers/video/displays/framebufacc/framebufacc.h +++ b/reactos/drivers/video/displays/framebufacc/framebufacc.h @@ -18,8 +18,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef FRAMEBUF_H -#define FRAMEBUF_H +#pragma once #include #include @@ -197,5 +196,3 @@ CopyColorPointer(PPDEV ppdev, SURFOBJ *psoMask, SURFOBJ *psoColor, XLATEOBJ *pxlo); - -#endif /* FRAMEBUF_H */ diff --git a/reactos/drivers/video/displays/vga/vgaddi.h b/reactos/drivers/video/displays/vga/vgaddi.h index 7b4a3c606a7..97282f882dc 100644 --- a/reactos/drivers/video/displays/vga/vgaddi.h +++ b/reactos/drivers/video/displays/vga/vgaddi.h @@ -1,5 +1,4 @@ -#ifndef _VGADDI_H_ -#define _VGADDI_H_ +#pragma once #define _WINBASE_ #define _WINDOWS_H @@ -288,5 +287,3 @@ vgaReadScan(int x, int y, int w, void *b); VOID FASTCALL vgaWriteScan(int x, int y, int w, void *b); - -#endif /* _VGADDI_H_ */ diff --git a/reactos/drivers/video/font/bmfd/bmfd.rbuild b/reactos/drivers/video/font/bmfd/bmfd.rbuild index 964548b57c1..2f424df95b8 100644 --- a/reactos/drivers/video/font/bmfd/bmfd.rbuild +++ b/reactos/drivers/video/font/bmfd/bmfd.rbuild @@ -1,5 +1,5 @@ - + win32k libcntpr diff --git a/reactos/drivers/video/font/directory.rbuild b/reactos/drivers/video/font/directory.rbuild index f7e7f3cef04..2ed97e32ca0 100644 --- a/reactos/drivers/video/font/directory.rbuild +++ b/reactos/drivers/video/font/directory.rbuild @@ -1,5 +1,5 @@ - + diff --git a/reactos/drivers/video/font/ftfd/freetype.def b/reactos/drivers/video/font/ftfd/freetype.def index 78f842588ee..883a977f464 100644 --- a/reactos/drivers/video/font/ftfd/freetype.def +++ b/reactos/drivers/video/font/ftfd/freetype.def @@ -1,5 +1,8 @@ LIBRARY ftfd.dll EXPORTS + FT_Bitmap_Convert + FT_Bitmap_Done + FT_Bitmap_New FT_Done_Face FT_Done_Glyph FT_Get_Char_Index diff --git a/reactos/drivers/video/font/ftfd/ftfd.rbuild b/reactos/drivers/video/font/ftfd/ftfd.rbuild index 869964c701f..34d822af2a7 100644 --- a/reactos/drivers/video/font/ftfd/ftfd.rbuild +++ b/reactos/drivers/video/font/ftfd/ftfd.rbuild @@ -1,5 +1,5 @@ - + include diff --git a/reactos/drivers/video/miniport/directory.rbuild b/reactos/drivers/video/miniport/directory.rbuild index 2575e1a7677..363c9097fee 100644 --- a/reactos/drivers/video/miniport/directory.rbuild +++ b/reactos/drivers/video/miniport/directory.rbuild @@ -7,6 +7,9 @@ + + + diff --git a/reactos/drivers/video/miniport/vbe/vbemp.c b/reactos/drivers/video/miniport/vbe/vbemp.c index 55b2bcb980c..2107e5ff70e 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -71,6 +71,9 @@ VBEFindAdapter( IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo, OUT PUCHAR Again) { + if (VideoPortIsNoVesa()) + return ERROR_DEV_NOT_EXIST; + return NO_ERROR; } diff --git a/reactos/drivers/video/miniport/vbe/vbemp.h b/reactos/drivers/video/miniport/vbe/vbemp.h index c5423bd0629..34807b2f978 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.h +++ b/reactos/drivers/video/miniport/vbe/vbemp.h @@ -18,22 +18,13 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef VBEMP_H -#define VBEMP_H +#pragma once /* INCLUDES *******************************************************************/ -#ifdef _MSC_VER -#pragma message ("INVESTIGATE ME") -#endif - -#if 0 //#ifdef _MSC_VER -#include "devioctl.h" -#else -#include -#endif - +#include "ntdef.h" #include "dderror.h" +#include "devioctl.h" #include "miniport.h" #include "ntddvdeo.h" #include "video.h" @@ -313,5 +304,3 @@ VBESetColorRegisters( PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_CLUT ColorLookUpTable, PSTATUS_BLOCK StatusBlock); - -#endif /* VBEMP_H */ diff --git a/reactos/drivers/video/miniport/vga/vgamp.h b/reactos/drivers/video/miniport/vga/vgamp.h index efe0bc558eb..2e018e4b116 100644 --- a/reactos/drivers/video/miniport/vga/vgamp.h +++ b/reactos/drivers/video/miniport/vga/vgamp.h @@ -23,17 +23,9 @@ /* INCLUDES *******************************************************************/ -#ifdef _MSC_VER -#pragma message ("INVESTIGATE ME") -#endif - -#if 0 //#ifdef _MSC_VER -#include "devioctl.h" -#else -#include -#endif - +#include "ntdef.h" #include "dderror.h" +#include "devioctl.h" #include "miniport.h" #include "ntddvdeo.h" #include "video.h" diff --git a/reactos/drivers/video/miniport/vga_new/cmdcnst.h b/reactos/drivers/video/miniport/vga_new/cmdcnst.h new file mode 100644 index 00000000000..c818b49d494 --- /dev/null +++ b/reactos/drivers/video/miniport/vga_new/cmdcnst.h @@ -0,0 +1,92 @@ +/* + * PROJECT: ReactOS VGA Miniport Driver + * LICENSE: Microsoft NT4 DDK Sample Code License + * FILE: boot/drivers/video/miniport/vga/cmdcnst.h + * PURPOSE: Command Code Definitions for VGA Command Streams + * PROGRAMMERS: Copyright (c) 1992 Microsoft Corporation + */ + + +//-------------------------------------------------------------------------- +// Definition of the set/clear mode command language. +// +// Each command is composed of a major portion and a minor portion. +// The major portion of a command can be found in the most significant +// nibble of a command byte, while the minor portion is in the least +// significant portion of a command byte. +// +// maj minor Description +// ---- ----- -------------------------------------------- +// 00 End of data +// +// 10 in and out type commands as described by flags +// flags: +// +// xxxx +// |||| +// |||+-------- unused +// ||+--------- 0/1 single/multiple values to output (in's are always +// |+---------- 0/1 8/16 bit operation single) +// +----------- 0/1 out/in instruction +// +// Outs +// ---------------------------------------------- +// 0 reg:W val:B +// 2 reg:W cnt:W val1:B val2:B...valN:B +// 4 reg:W val:W +// 6 reg:W cnt:W val1:W val2:W...valN:W +// +// Ins +// ---------------------------------------------- +// 8 reg:W +// a reg:W cnt:W +// c reg:W +// e reg:W cnt:W +// +// 20 Special purpose outs +// 00 do indexed outs for seq, crtc, and gdc +// indexreg:W cnt:B startindex:B val1:B val2:B...valN:B +// 01 do indexed outs for atc +// index-data_reg:W cnt:B startindex:B val1:B val2:B...valN:B +// 02 do masked outs +// indexreg:W andmask:B xormask:B +// +// F0 Nop +// +//--------------------------------------------------------------------------- + +// some useful equates - major commands + +#define EOD 0x000 // end of data +#define INOUT 0x010 // do ins or outs +#define METAOUT 0x020 // do special types of outs +#define NCMD 0x0f0 // Nop command + + +// flags for INOUT major command + +//#define UNUSED 0x01 // reserved +#define MULTI 0x02 // multiple or single outs +#define BW 0x04 // byte/word size of operation +#define IO 0x08 // out/in instruction + +// minor commands for metout + +#define INDXOUT 0x00 // do indexed outs +#define ATCOUT 0x01 // do indexed outs for atc +#define MASKOUT 0x02 // do masked outs using and-xor masks + + +// composite inout type commands + +#define OB (INOUT) // output 8 bit value +#define OBM (INOUT+MULTI) // output multiple bytes +#define OW (INOUT+BW) // output single word value +#define OWM (INOUT+BW+MULTI) // output multiple words + +#define IB (INOUT+IO) // input byte +#define IBM (INOUT+IO+MULTI) // input multiple bytes +#define IW (INOUT+IO+BW) // input word +#define IWM (INOUT+IO+BW+MULTI) // input multiple words + +/* EOF */ diff --git a/reactos/drivers/video/miniport/vga_new/modeset.c b/reactos/drivers/video/miniport/vga_new/modeset.c new file mode 100644 index 00000000000..abe1191a8a9 --- /dev/null +++ b/reactos/drivers/video/miniport/vga_new/modeset.c @@ -0,0 +1,888 @@ +/* + * PROJECT: ReactOS VGA Miniport Driver + * LICENSE: Microsoft NT4 DDK Sample Code License + * FILE: boot/drivers/video/miniport/vga/modeset.c + * PURPOSE: Handles switching to Standard VGA Modes for compatible cards + * PROGRAMMERS: Copyright (c) 1992 Microsoft Corporation + * ReactOS Portable Systems Group + */ + +#include "vga.h" + +VP_STATUS +VgaInterpretCmdStream( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PUSHORT pusCmdStream + ); + +VP_STATUS +VgaSetMode( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_MODE Mode, + ULONG ModeSize, +// eVb: 2.1 [SET MODE] - Add new output parameter for framebuffer update functionality + PULONG PhysPtrChange +// eVb: 2.1 [END] + ); + +VP_STATUS +VgaQueryAvailableModes( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_MODE_INFORMATION ModeInformation, + ULONG ModeInformationSize, + PULONG OutputSize + ); + +VP_STATUS +VgaQueryNumberOfAvailableModes( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_NUM_MODES NumModes, + ULONG NumModesSize, + PULONG OutputSize + ); + +VP_STATUS +VgaQueryCurrentMode( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_MODE_INFORMATION ModeInformation, + ULONG ModeInformationSize, + PULONG OutputSize + ); + +VOID +VgaZeroVideoMemory( + PHW_DEVICE_EXTENSION HwDeviceExtension + ); + +#if defined(ALLOC_PRAGMA) +#pragma alloc_text(PAGE,VgaInterpretCmdStream) +#pragma alloc_text(PAGE,VgaSetMode) +#pragma alloc_text(PAGE,VgaQueryAvailableModes) +#pragma alloc_text(PAGE,VgaQueryNumberOfAvailableModes) +#pragma alloc_text(PAGE,VgaZeroVideoMemory) +#endif + +//--------------------------------------------------------------------------- +VP_STATUS +VgaInterpretCmdStream( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PUSHORT pusCmdStream + ) + +/*++ + +Routine Description: + + Interprets the appropriate command array to set up VGA registers for the + requested mode. Typically used to set the VGA into a particular mode by + programming all of the registers + +Arguments: + + HwDeviceExtension - Pointer to the miniport driver's device extension. + + pusCmdStream - array of commands to be interpreted. + +Return Value: + + The status of the operation (can only fail on a bad command); TRUE for + success, FALSE for failure. + +--*/ + +{ + ULONG ulCmd; + ULONG ulPort; + UCHAR jValue; + USHORT usValue; + ULONG culCount; + ULONG ulIndex; + ULONG ulBase; + + if (pusCmdStream == NULL) { + + VideoDebugPrint((1, "VgaInterpretCmdStream - Invalid pusCmdStream\n")); + return TRUE; + } + + ulBase = (ULONG)HwDeviceExtension->IOAddress; + + // + // Now set the adapter to the desired mode. + // + + while ((ulCmd = *pusCmdStream++) != EOD) { + + // + // Determine major command type + // + + switch (ulCmd & 0xF0) { + + // + // Basic input/output command + // + + case INOUT: + + // + // Determine type of inout instruction + // + + if (!(ulCmd & IO)) { + + // + // Out instruction. Single or multiple outs? + // + + if (!(ulCmd & MULTI)) { + + // + // Single out. Byte or word out? + // + + if (!(ulCmd & BW)) { + + // + // Single byte out + // + + ulPort = *pusCmdStream++; + jValue = (UCHAR) *pusCmdStream++; + VideoPortWritePortUchar((PUCHAR)(ulBase+ulPort), + jValue); + + } else { + + // + // Single word out + // + + ulPort = *pusCmdStream++; + usValue = *pusCmdStream++; + VideoPortWritePortUshort((PUSHORT)(ulBase+ulPort), + usValue); + + } + + } else { + + // + // Output a string of values + // Byte or word outs? + // + + if (!(ulCmd & BW)) { + + // + // String byte outs. Do in a loop; can't use + // VideoPortWritePortBufferUchar because the data + // is in USHORT form + // + + ulPort = ulBase + *pusCmdStream++; + culCount = *pusCmdStream++; + + while (culCount--) { + jValue = (UCHAR) *pusCmdStream++; + VideoPortWritePortUchar((PUCHAR)ulPort, + jValue); + + } + + } else { + + // + // String word outs + // + + ulPort = *pusCmdStream++; + culCount = *pusCmdStream++; + VideoPortWritePortBufferUshort((PUSHORT) + (ulBase + ulPort), pusCmdStream, culCount); + pusCmdStream += culCount; + + } + } + + } else { + + // In instruction + // + // Currently, string in instructions aren't supported; all + // in instructions are handled as single-byte ins + // + // Byte or word in? + // + + if (!(ulCmd & BW)) { + // + // Single byte in + // + + ulPort = *pusCmdStream++; + jValue = VideoPortReadPortUchar((PUCHAR)ulBase+ulPort); + + } else { + + // + // Single word in + // + + ulPort = *pusCmdStream++; + usValue = VideoPortReadPortUshort((PUSHORT) + (ulBase+ulPort)); + + } + + } + + break; + + // + // Higher-level input/output commands + // + + case METAOUT: + + // + // Determine type of metaout command, based on minor + // command field + // + switch (ulCmd & 0x0F) { + + // + // Indexed outs + // + + case INDXOUT: + + ulPort = ulBase + *pusCmdStream++; + culCount = *pusCmdStream++; + ulIndex = *pusCmdStream++; + + while (culCount--) { + + usValue = (USHORT) (ulIndex + + (((ULONG)(*pusCmdStream++)) << 8)); + VideoPortWritePortUshort((PUSHORT)ulPort, usValue); + + ulIndex++; + + } + + break; + + // + // Masked out (read, AND, XOR, write) + // + + case MASKOUT: + + ulPort = *pusCmdStream++; + jValue = VideoPortReadPortUchar((PUCHAR)ulBase+ulPort); + jValue &= *pusCmdStream++; + jValue ^= *pusCmdStream++; + VideoPortWritePortUchar((PUCHAR)ulBase + ulPort, + jValue); + break; + + // + // Attribute Controller out + // + + case ATCOUT: + + ulPort = ulBase + *pusCmdStream++; + culCount = *pusCmdStream++; + ulIndex = *pusCmdStream++; + + while (culCount--) { + + // Write Attribute Controller index + VideoPortWritePortUchar((PUCHAR)ulPort, + (UCHAR)ulIndex); + + // Write Attribute Controller data + jValue = (UCHAR) *pusCmdStream++; + VideoPortWritePortUchar((PUCHAR)ulPort, jValue); + + ulIndex++; + + } + + break; + + // + // None of the above; error + // + default: + + return FALSE; + + } + + + break; + + // + // NOP + // + + case NCMD: + + break; + + // + // Unknown command; error + // + + default: + + return FALSE; + + } + + } + + return TRUE; + +} // end VgaInterpretCmdStream() + + +VP_STATUS +VgaSetMode( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_MODE Mode, + ULONG ModeSize, +// eVb: 2.2 [SET MODE] - Add new output parameter for framebuffer update functionality + PULONG PhysPtrChange +// eVb: 2.2 [END] + ) + +/*++ + +Routine Description: + + This routine sets the vga into the requested mode. + +Arguments: + + HwDeviceExtension - Pointer to the miniport driver's device extension. + + Mode - Pointer to the structure containing the information about the + font to be set. + + ModeSize - Length of the input buffer supplied by the user. + +Return Value: + + ERROR_INSUFFICIENT_BUFFER if the input buffer was not large enough + for the input data. + + ERROR_INVALID_PARAMETER if the mode number is invalid. + + NO_ERROR if the operation completed successfully. + +--*/ + +{ + PVIDEOMODE pRequestedMode; + VP_STATUS status; + ULONG RequestedModeNum; +// eVb: 2.3 [SET MODE] - Add new output parameter for framebuffer update functionality + *PhysPtrChange = FALSE; +// eVb: 2.3 [END] + // + // Check if the size of the data in the input buffer is large enough. + // + + if (ModeSize < sizeof(VIDEO_MODE)) + { + return ERROR_INSUFFICIENT_BUFFER; + } + + // + // Extract the clear memory, and map linear bits. + // + + RequestedModeNum = Mode->RequestedMode & + ~(VIDEO_MODE_NO_ZERO_MEMORY | VIDEO_MODE_MAP_MEM_LINEAR); + + + if (!(Mode->RequestedMode & VIDEO_MODE_NO_ZERO_MEMORY)) + { +#if defined(_X86_) + VgaZeroVideoMemory(HwDeviceExtension); +#endif + } + + // + // Check to see if we are requesting a valid mode + // +// eVb: 2.4 [CIRRUS] - Remove Cirrus-specific check for valid mode + if ( (RequestedModeNum >= NumVideoModes) ) +// eVb: 2.4 [END] + { + VideoDebugPrint((0, "Invalide Mode Number = %d!\n", RequestedModeNum)); + + return ERROR_INVALID_PARAMETER; + } + + VideoDebugPrint((2, "Attempting to set mode %d\n", + RequestedModeNum)); +// eVb: 2.5 [VBE] - Use dynamic VBE mode list instead of hard-coded VGA list + pRequestedMode = &VgaModeList[RequestedModeNum]; +// eVb: 2.5 [END] + VideoDebugPrint((2, "Info on Requested Mode:\n" + "\tResolution: %dx%d\n", + pRequestedMode->hres, + pRequestedMode->vres )); + + // + // VESA BIOS mode switch + // +// eVb: 2.6 [VBE] - VBE Mode Switch Support + status = VbeSetMode(HwDeviceExtension, pRequestedMode, PhysPtrChange); + if (status == ERROR_INVALID_FUNCTION) + { + // + // VGA mode switch + // + + if (!pRequestedMode->CmdStream) return ERROR_INVALID_FUNCTION; + if (!VgaInterpretCmdStream(HwDeviceExtension, pRequestedMode->CmdStream)) return ERROR_INVALID_FUNCTION; + goto Cleanup; + } + else if (status != NO_ERROR) return status; +// eVb: 2.6 [END] +// eVb: 2.7 [MODE-X] - Windows VGA Miniport Supports Mode-X, we should too + // + // ModeX check + // + + if (pRequestedMode->hres == 320) + { + VideoPortDebugPrint(0, "ModeX not support!!!\n"); + return ERROR_INVALID_PARAMETER; + } +// eVb: 2.7 [END] + // + // Text mode check + // + + if (!(pRequestedMode->fbType & VIDEO_MODE_GRAPHICS)) + { +// eVb: 2.8 [TODO] - This code path is not implemented yet + VideoPortDebugPrint(0, "Text-mode not support!!!\n"); + return ERROR_INVALID_PARAMETER; +// eVb: 2.8 [END] + } + +Cleanup: + // + // Update the location of the physical frame buffer within video memory. + // +// eVb: 2.9 [VBE] - Linear and banked support is unified in VGA, unlike Cirrus + HwDeviceExtension->PhysicalVideoMemoryBase.LowPart = pRequestedMode->PhysBase; + HwDeviceExtension->PhysicalVideoMemoryLength = pRequestedMode->PhysSize; + + HwDeviceExtension->PhysicalFrameLength = + pRequestedMode->FrameBufferSize; + + HwDeviceExtension->PhysicalFrameOffset.LowPart = + pRequestedMode->FrameBufferBase; +// eVb: 2.9 [END] + + // + // Store the new mode value. + // + + HwDeviceExtension->CurrentMode = pRequestedMode; + HwDeviceExtension->ModeIndex = Mode->RequestedMode; + + return NO_ERROR; + +} //end VgaSetMode() + +VP_STATUS +VgaQueryAvailableModes( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_MODE_INFORMATION ModeInformation, + ULONG ModeInformationSize, + PULONG OutputSize + ) + +/*++ + +Routine Description: + + This routine returns the list of all available available modes on the + card. + +Arguments: + + HwDeviceExtension - Pointer to the miniport driver's device extension. + + ModeInformation - Pointer to the output buffer supplied by the user. + This is where the list of all valid modes is stored. + + ModeInformationSize - Length of the output buffer supplied by the user. + + OutputSize - Pointer to a buffer in which to return the actual size of + the data in the buffer. If the buffer was not large enough, this + contains the minimum required buffer size. + +Return Value: + + ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough + for the data being returned. + + NO_ERROR if the operation completed successfully. + +--*/ + +{ + PVIDEO_MODE_INFORMATION videoModes = ModeInformation; + ULONG i; + + // + // Find out the size of the data to be put in the buffer and return + // that in the status information (whether or not the information is + // there). If the buffer passed in is not large enough return an + // appropriate error code. + // + + if (ModeInformationSize < (*OutputSize = +// eVb: 2.10 [VBE] - We store VBE/VGA mode count in this global, not in DevExt like Cirrus + NumVideoModes * +// eVb: 2.10 [END] + sizeof(VIDEO_MODE_INFORMATION)) ) { + + return ERROR_INSUFFICIENT_BUFFER; + + } + + // + // For each mode supported by the card, store the mode characteristics + // in the output buffer. + // + + for (i = 0; i < NumVideoModes; i++) + { + videoModes->Length = sizeof(VIDEO_MODE_INFORMATION); + videoModes->ModeIndex = i; +// eVb: 2.11 [VBE] - Use dynamic VBE mode list instead of hard-coded VGA list + videoModes->VisScreenWidth = VgaModeList[i].hres; + videoModes->ScreenStride = VgaModeList[i].wbytes; + videoModes->VisScreenHeight = VgaModeList[i].vres; + videoModes->NumberOfPlanes = VgaModeList[i].numPlanes; + videoModes->BitsPerPlane = VgaModeList[i].bitsPerPlane; + videoModes->Frequency = VgaModeList[i].Frequency; + videoModes->XMillimeter = 320; // temporary hardcoded constant + videoModes->YMillimeter = 240; // temporary hardcoded constant + videoModes->AttributeFlags = VgaModeList[i].fbType; +// eVb: 2.11 [END] + + if ((VgaModeList[i].bitsPerPlane == 32) || + (VgaModeList[i].bitsPerPlane == 24)) + { + + videoModes->NumberRedBits = 8; + videoModes->NumberGreenBits = 8; + videoModes->NumberBlueBits = 8; + videoModes->RedMask = 0xff0000; + videoModes->GreenMask = 0x00ff00; + videoModes->BlueMask = 0x0000ff; + + } + else if (VgaModeList[i].bitsPerPlane == 16) + { + + videoModes->NumberRedBits = 6; + videoModes->NumberGreenBits = 6; + videoModes->NumberBlueBits = 6; + videoModes->RedMask = 0x1F << 11; + videoModes->GreenMask = 0x3F << 5; + videoModes->BlueMask = 0x1F; + + } +// eVb: 2.12 [VGA] - Add support for 15bpp modes, which Cirrus doesn't support + else if (VgaModeList[i].bitsPerPlane == 15) + { + + videoModes->NumberRedBits = 6; + videoModes->NumberGreenBits = 6; + videoModes->NumberBlueBits = 6; + videoModes->RedMask = 0x3E << 9; + videoModes->GreenMask = 0x1F << 5; + videoModes->BlueMask = 0x1F; + } +// eVb: 2.12 [END] + else + { + + videoModes->NumberRedBits = 6; + videoModes->NumberGreenBits = 6; + videoModes->NumberBlueBits = 6; + videoModes->RedMask = 0; + videoModes->GreenMask = 0; + videoModes->BlueMask = 0; + } + +// eVb: 2.13 [VGA] - All modes are palette managed/driven, unlike Cirrus + videoModes->AttributeFlags |= VIDEO_MODE_PALETTE_DRIVEN | + VIDEO_MODE_MANAGED_PALETTE; +// eVb: 2.13 [END] + videoModes++; + + } + + return NO_ERROR; + +} // end VgaGetAvailableModes() + +VP_STATUS +VgaQueryNumberOfAvailableModes( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_NUM_MODES NumModes, + ULONG NumModesSize, + PULONG OutputSize + ) + +/*++ + +Routine Description: + + This routine returns the number of available modes for this particular + video card. + +Arguments: + + HwDeviceExtension - Pointer to the miniport driver's device extension. + + NumModes - Pointer to the output buffer supplied by the user. This is + where the number of modes is stored. + + NumModesSize - Length of the output buffer supplied by the user. + + OutputSize - Pointer to a buffer in which to return the actual size of + the data in the buffer. + +Return Value: + + ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough + for the data being returned. + + NO_ERROR if the operation completed successfully. + +--*/ + +{ + // + // Find out the size of the data to be put in the the buffer and return + // that in the status information (whether or not the information is + // there). If the buffer passed in is not large enough return an + // appropriate error code. + // + + if (NumModesSize < (*OutputSize = sizeof(VIDEO_NUM_MODES)) ) { + + return ERROR_INSUFFICIENT_BUFFER; + + } + + // + // Store the number of modes into the buffer. + // + +// eVb: 2.14 [VBE] - We store VBE/VGA mode count in this global, not in DevExt like Cirrus + NumModes->NumModes = NumVideoModes; +// eVb: 2.14 [END] + NumModes->ModeInformationLength = sizeof(VIDEO_MODE_INFORMATION); + + return NO_ERROR; + +} // end VgaGetNumberOfAvailableModes() + +VP_STATUS +VgaQueryCurrentMode( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_MODE_INFORMATION ModeInformation, + ULONG ModeInformationSize, + PULONG OutputSize + ) + +/*++ + +Routine Description: + + This routine returns a description of the current video mode. + +Arguments: + + HwDeviceExtension - Pointer to the miniport driver's device extension. + + ModeInformation - Pointer to the output buffer supplied by the user. + This is where the current mode information is stored. + + ModeInformationSize - Length of the output buffer supplied by the user. + + OutputSize - Pointer to a buffer in which to return the actual size of + the data in the buffer. If the buffer was not large enough, this + contains the minimum required buffer size. + +Return Value: + + ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough + for the data being returned. + + NO_ERROR if the operation completed successfully. + +--*/ + +{ + // + // check if a mode has been set + // + + if (HwDeviceExtension->CurrentMode == NULL ) { + + return ERROR_INVALID_FUNCTION; + + } + + // + // Find out the size of the data to be put in the the buffer and return + // that in the status information (whether or not the information is + // there). If the buffer passed in is not large enough return an + // appropriate error code. + // + + if (ModeInformationSize < (*OutputSize = sizeof(VIDEO_MODE_INFORMATION))) { + + return ERROR_INSUFFICIENT_BUFFER; + + } + + // + // Store the characteristics of the current mode into the buffer. + // + + ModeInformation->Length = sizeof(VIDEO_MODE_INFORMATION); + ModeInformation->ModeIndex = HwDeviceExtension->ModeIndex; + ModeInformation->VisScreenWidth = HwDeviceExtension->CurrentMode->hres; + ModeInformation->ScreenStride = HwDeviceExtension->CurrentMode->wbytes; + ModeInformation->VisScreenHeight = HwDeviceExtension->CurrentMode->vres; + ModeInformation->NumberOfPlanes = HwDeviceExtension->CurrentMode->numPlanes; + ModeInformation->BitsPerPlane = HwDeviceExtension->CurrentMode->bitsPerPlane; + ModeInformation->Frequency = HwDeviceExtension->CurrentMode->Frequency; + ModeInformation->XMillimeter = 320; // temporary hardcoded constant + ModeInformation->YMillimeter = 240; // temporary hardcoded constant + + ModeInformation->AttributeFlags = HwDeviceExtension->CurrentMode->fbType; + + if ((ModeInformation->BitsPerPlane == 32) || + (ModeInformation->BitsPerPlane == 24)) + { + + ModeInformation->NumberRedBits = 8; + ModeInformation->NumberGreenBits = 8; + ModeInformation->NumberBlueBits = 8; + ModeInformation->RedMask = 0xff0000; + ModeInformation->GreenMask = 0x00ff00; + ModeInformation->BlueMask = 0x0000ff; + + } + else if (ModeInformation->BitsPerPlane == 16) + { + + ModeInformation->NumberRedBits = 6; + ModeInformation->NumberGreenBits = 6; + ModeInformation->NumberBlueBits = 6; + ModeInformation->RedMask = 0x1F << 11; + ModeInformation->GreenMask = 0x3F << 5; + ModeInformation->BlueMask = 0x1F; + + } +// eVb: 2.12 [VGA] - Add support for 15bpp modes, which Cirrus doesn't support + else if (ModeInformation->BitsPerPlane == 15) + { + + ModeInformation->NumberRedBits = 6; + ModeInformation->NumberGreenBits = 6; + ModeInformation->NumberBlueBits = 6; + ModeInformation->RedMask = 0x3E << 9; + ModeInformation->GreenMask = 0x1F << 5; + ModeInformation->BlueMask = 0x1F; + } +// eVb: 2.12 [END] + else + { + + ModeInformation->NumberRedBits = 6; + ModeInformation->NumberGreenBits = 6; + ModeInformation->NumberBlueBits = 6; + ModeInformation->RedMask = 0; + ModeInformation->GreenMask = 0; + ModeInformation->BlueMask = 0; + } + +// eVb: 2.13 [VGA] - All modes are palette managed/driven, unlike Cirrus + ModeInformation->AttributeFlags |= VIDEO_MODE_PALETTE_DRIVEN | + VIDEO_MODE_MANAGED_PALETTE; +// eVb: 2.13 [END] + + return NO_ERROR; + +} // end VgaQueryCurrentMode() + + +VOID +VgaZeroVideoMemory( + PHW_DEVICE_EXTENSION HwDeviceExtension + ) + +/*++ + +Routine Description: + + This routine zeros the first 256K on the VGA. + +Arguments: + + HwDeviceExtension - Pointer to the miniport driver's device extension. + + +Return Value: + + None. + +--*/ +{ + UCHAR temp; + + // + // Map font buffer at A0000 + // + + VgaInterpretCmdStream(HwDeviceExtension, EnableA000Data); + + // + // Enable all planes. + // + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, + IND_MAP_MASK); + + temp = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + + SEQ_DATA_PORT) | (UCHAR)0x0F; + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT, + temp); + + VideoPortZeroDeviceMemory(HwDeviceExtension->VideoMemoryAddress, 0xFFFF); + + VgaInterpretCmdStream(HwDeviceExtension, DisableA000Color); + +} diff --git a/reactos/drivers/video/miniport/vga_new/vbe.c b/reactos/drivers/video/miniport/vga_new/vbe.c new file mode 100644 index 00000000000..a2c593da460 --- /dev/null +++ b/reactos/drivers/video/miniport/vga_new/vbe.c @@ -0,0 +1,196 @@ +/* + * PROJECT: ReactOS VGA Miniport Driver + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: boot/drivers/video/miniport/vga/vbe.c + * PURPOSE: Main VESA VBE 1.02+ SVGA Miniport Handling Code + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include "vga.h" + +/* GLOBALS ********************************************************************/ + +static const PCHAR Nv11Board = "NV11 (GeForce2) Board"; +static const PCHAR Nv11Chip = "Chip Rev B2"; +static const PCHAR Nv11Vendor = "NVidia Corporation"; +static const PCHAR IntelBrookdale = "Brookdale-G Graphics Controller"; +static const PCHAR BrokenVesaBiosList[] = +{ + "SiS 5597", + "MGA-G100", + "3Dfx Banshee", + "Voodoo3 2000 LC ", + "Voodoo3 3000 LC ", + "Voodoo4 4500 ", + "ArtX I", + "ATI S1-370TL" +}; + +BOOLEAN g_bIntelBrookdaleBIOS; + +/* FUNCTIONS ******************************************************************/ + +BOOLEAN +NTAPI +IsVesaBiosOk(IN PVIDEO_PORT_INT10_INTERFACE Interface, + IN ULONG OemRevision, + IN PCHAR Vendor, + IN PCHAR Product, + IN PCHAR Revision) +{ + ULONG i; + CHAR Version[21]; + + /* If the broken VESA bios found, turn VESA off */ + VideoPortDebugPrint(0, "Vendor: %s Product: %s Revision: %s (%lx)\n", Vendor, Product, Revision, OemRevision); + for (i = 0; i < (sizeof(BrokenVesaBiosList) / sizeof(PCHAR)); i++) + { + if (!strncmp(Product, BrokenVesaBiosList[i], sizeof(BrokenVesaBiosList[i]))) return FALSE; + } + + /* For Brookdale-G (Intel), special hack used */ + g_bIntelBrookdaleBIOS = !strncmp(Product, IntelBrookdale, sizeof(IntelBrookdale)); + + /* For NVIDIA make sure */ + if (!(strncmp(Vendor, Nv11Vendor, sizeof(Nv11Vendor))) && + !(strncmp(Product, Nv11Board, sizeof(Nv11Board))) && + !(strncmp(Revision, Nv11Chip, sizeof(Nv11Chip))) && + (OemRevision == 0x311)) + { + /* Read version */ + if (Interface->Int10ReadMemory(Interface->Context, + 0xC000, + 345, + Version, + sizeof(Version))) return FALSE; + if (!strncmp(Version, "Version 3.11.01.24N16", sizeof(Version))) return FALSE; + } + + /* VESA ok */ + //VideoPortDebugPrint(0, "Vesa ok\n"); + return TRUE; +} + +BOOLEAN +NTAPI +ValidateVbeInfo(IN PHW_DEVICE_EXTENSION VgaExtension, + IN PVBE_INFO VbeInfo) +{ + BOOLEAN VesaBiosOk; + PVOID Context; + CHAR ProductRevision[80]; + CHAR OemString[80]; + CHAR ProductName[80]; + CHAR VendorName[80]; + VP_STATUS Status; + + /* Set default */ + VesaBiosOk = FALSE; + Context = VgaExtension->Int10Interface.Context; + + /* Check magic and version */ + if (strncmp(VbeInfo->Info.Signature, "VESA", 4)) return VesaBiosOk; + if (VbeInfo->Info.Version < 0x102) return VesaBiosOk; + + /* Read strings */ + Status = VgaExtension->Int10Interface.Int10ReadMemory(Context, + HIWORD(VbeInfo->Info.OemStringPtr), + LOWORD(VbeInfo->Info.OemStringPtr), + OemString, + sizeof(OemString)); + if (Status != NO_ERROR) return VesaBiosOk; + Status = VgaExtension->Int10Interface.Int10ReadMemory(Context, + HIWORD(VbeInfo->Info.OemVendorNamePtr), + LOWORD(VbeInfo->Info.OemVendorNamePtr), + VendorName, + sizeof(VendorName)); + if (Status != NO_ERROR) return VesaBiosOk; + Status = VgaExtension->Int10Interface.Int10ReadMemory(Context, + HIWORD(VbeInfo->Info.OemProductNamePtr), + LOWORD(VbeInfo->Info.OemProductNamePtr), + ProductName, + sizeof(ProductName)); + if (Status != NO_ERROR) return VesaBiosOk; + Status = VgaExtension->Int10Interface.Int10ReadMemory(Context, + HIWORD(VbeInfo->Info.OemProductRevPtr), + LOWORD(VbeInfo->Info.OemProductRevPtr), + ProductRevision, + sizeof(ProductRevision)); + if (Status != NO_ERROR) return VesaBiosOk; + + /* Null-terminate strings */ + VendorName[sizeof(OemString) - 1] = ANSI_NULL; + ProductName[sizeof(OemString) - 1] = ANSI_NULL; + ProductRevision[sizeof(OemString) - 1] = ANSI_NULL; + OemString[sizeof(OemString) - 1] = ANSI_NULL; + + /* Check for known bad BIOS */ + VesaBiosOk = IsVesaBiosOk(&VgaExtension->Int10Interface, + VbeInfo->Info.OemSoftwareRevision, + VendorName, + ProductName, + ProductRevision); + VgaExtension->VesaBiosOk = VesaBiosOk; + return VesaBiosOk; +} + +VP_STATUS +NTAPI +VbeSetColorLookup(IN PHW_DEVICE_EXTENSION VgaExtension, + IN PVIDEO_CLUT ClutBuffer) +{ + PVBE_COLOR_REGISTER VesaClut; + INT10_BIOS_ARGUMENTS BiosArguments; + PVOID Context; + ULONG Entries; + ULONG BufferSize = 4 * 1024; + USHORT TrampolineMemorySegment, TrampolineMemoryOffset; + VP_STATUS Status; + USHORT i; + + Entries = ClutBuffer->NumEntries; + + /* Allocate INT10 context/buffer */ + VesaClut = VideoPortAllocatePool(VgaExtension, 1, sizeof(ULONG) * Entries, 0x20616756u); + if (!VesaClut) return ERROR_INVALID_PARAMETER; + if (!VgaExtension->Int10Interface.Size) return ERROR_INVALID_PARAMETER; + Context = VgaExtension->Int10Interface.Context; + Status = VgaExtension->Int10Interface.Int10AllocateBuffer(Context, + &TrampolineMemorySegment, + &TrampolineMemoryOffset, + &BufferSize); + if (Status != NO_ERROR) return ERROR_INVALID_PARAMETER; + + /* VESA has color registers backward! */ + for (i = 0; i < Entries; i++) + { + VesaClut[i].Blue = ClutBuffer->LookupTable[i].RgbArray.Blue; + VesaClut[i].Green = ClutBuffer->LookupTable[i].RgbArray.Green; + VesaClut[i].Red = ClutBuffer->LookupTable[i].RgbArray.Red; + VesaClut[i].Pad = 0; + } + Status = VgaExtension->Int10Interface.Int10WriteMemory(Context, + TrampolineMemorySegment, + TrampolineMemoryOffset, + VesaClut, + Entries * sizeof(ULONG)); + if (Status != NO_ERROR) return ERROR_INVALID_PARAMETER; + + /* Write new palette */ + BiosArguments.Ebx = 0; + BiosArguments.Ecx = Entries; + BiosArguments.Edx = ClutBuffer->FirstEntry; + BiosArguments.Edi = TrampolineMemoryOffset; + BiosArguments.SegEs = TrampolineMemorySegment; + BiosArguments.Eax = VBE_SET_GET_PALETTE_DATA; + Status = VgaExtension->Int10Interface.Int10CallBios(Context, &BiosArguments); + if (Status != NO_ERROR) return ERROR_INVALID_PARAMETER; + VideoPortFreePool(VgaExtension, VesaClut); + VideoPortDebugPrint(Error, "VBE Status: %lx\n", BiosArguments.Eax); + if (BiosArguments.Eax == VBE_SUCCESS) return NO_ERROR; + return ERROR_INVALID_PARAMETER; +} + +/* EOF */ diff --git a/reactos/drivers/video/miniport/vga_new/vbe.h b/reactos/drivers/video/miniport/vga_new/vbe.h new file mode 100644 index 00000000000..8802a5ead16 --- /dev/null +++ b/reactos/drivers/video/miniport/vga_new/vbe.h @@ -0,0 +1,217 @@ +/* + * PROJECT: VGA Miniport Driver + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: boot/drivers/video/miniport/vga/vbe.h + * PURPOSE: VESA VBE Registers and Structures + * PROGRAMMERS: ReactOS Portable Systems Group + */ + + +#define LOWORD(l) ((USHORT)((ULONG_PTR)(l))) +#define HIWORD(l) ((USHORT)(((ULONG_PTR)(l)>>16)&0xFFFF)) + + +/* + * VBE Command Definitions + */ + +#define VBE_GET_CONTROLLER_INFORMATION 0x4F00 +#define VBE_GET_MODE_INFORMATION 0x4F01 +#define VBE_SET_VBE_MODE 0x4F02 +#define VBE_GET_CURRENT_VBE_MODE 0x4F03 +#define VBE_SAVE_RESTORE_STATE 0x4F04 +#define VBE_DISPLAY_WINDOW_CONTROL 0x4F05 +#define VBE_SET_GET_LOGICAL_SCAN_LINE_LENGTH 0x4F06 +#define VBE_SET_GET_DISPLAY_START 0x4F07 +#define VBE_SET_GET_DAC_PALETTE_FORMAT 0x4F08 +#define VBE_SET_GET_PALETTE_DATA 0x4F09 + +/* VBE 2.0+ */ +#define VBE_RETURN_PROTECTED_MODE_INTERFACE 0x4F0A +#define VBE_GET_SET_PIXEL_CLOCK 0x4F0B + +/* Extensions */ +#define VBE_POWER_MANAGEMENT_EXTENSIONS 0x4F10 +#define VBE_FLAT_PANEL_INTERFACE_EXTENSIONS 0x4F11 +#define VBE_AUDIO_INTERFACE_EXTENSIONS 0x4F12 +#define VBE_OEM_EXTENSIONS 0x4F13 +#define VBE_DISPLAY_DATA_CHANNEL 0x4F14 +#define VBE_DDC 0x4F15 + +/* + * VBE DDC Sub-Functions + */ + +#define VBE_DDC_READ_EDID 0x01 +#define VBE_DDC_REPORT_CAPABILITIES 0x10 +#define VBE_DDC_BEGIN_SCL_SDA_CONTROL 0x11 +#define VBE_DDC_END_SCL_SDA_CONTROL 0x12 +#define VBE_DDC_WRITE_SCL_CLOCK_LINE 0x13 +#define VBE_DDC_WRITE_SDA_DATA_LINE 0x14 +#define VBE_DDC_READ_SCL_CLOCK_LINE 0x15 +#define VBE_DDC_READ_SDA_DATA_LINE 0x16 + +/* + * VBE Video Mode Information Definitions + */ +#define VBE_MODEATTR_VALID 0x01 +#define VBE_MODEATTR_COLOR 0x08 +#define VBE_MODEATTR_GRAPHICS 0x10 +#define VBE_MODEATTR_NON_VGA 0x20 +#define VBE_MODEATTR_NO_BANK_SWITCH 0x40 +#define VBE_MODEATTR_LINEAR 0x80 + +#define VBE_MODE_BITS 8 +#define VBE_MODE_RESERVED_1 0x200 +#define VBE_MODE_RESERVED_2 0x400 +#define VBE_MODE_REFRESH_CONTROL 0x800 +#define VBE_MODE_ACCELERATED_1 0x1000 +#define VBE_MODE_ACCELERATED_2 0x2000 +#define VBE_MODE_LINEAR_FRAMEBUFFER 0x4000 +#define VBE_MODE_PRESERVE_DISPLAY 0x8000 +#define VBE_MODE_MASK ((1 << (VBE_MODE_BITS + 1)) - 1) + +#define VBE_MEMORYMODEL_PACKEDPIXEL 0x04 +#define VBE_MEMORYMODEL_DIRECTCOLOR 0x06 + +/* + * VBE Return Codes + */ + +#define VBE_SUCCESS 0x4F +#define VBE_UNSUCCESSFUL 0x14F +#define VBE_NOT_SUPPORTED 0x24F +#define VBE_FUNCTION_INVALID 0x34F + +#define VBE_GETRETURNCODE(x) (x & 0xFFFF) + +#include + +/* + * VBE specification defined structure for general adapter info + * returned by function VBE_GET_CONTROLLER_INFORMATION command. + */ + +typedef struct _VBE_CONTROLLER_INFO +{ + CHAR Signature[4]; + USHORT Version; + ULONG OemStringPtr; + LONG Capabilities; + ULONG VideoModePtr; + USHORT TotalMemory; + USHORT OemSoftwareRevision; + ULONG OemVendorNamePtr; + ULONG OemProductNamePtr; + ULONG OemProductRevPtr; + CHAR Reserved[222]; + CHAR OemData[256]; +} VBE_CONTROLLER_INFO, *PVBE_CONTROLLER_INFO; + +/* + * VBE specification defined structure for specific video mode + * info returned by function VBE_GET_MODE_INFORMATION command. + */ + +typedef struct _VBE_MODE_INFO +{ + /* Mandatory information for all VBE revisions */ + USHORT ModeAttributes; + UCHAR WinAAttributes; + UCHAR WinBAttributes; + USHORT WinGranularity; + USHORT WinSize; + USHORT WinASegment; + USHORT WinBSegment; + ULONG WinFuncPtr; + USHORT BytesPerScanLine; + + /* Mandatory information for VBE 1.2 and above */ + USHORT XResolution; + USHORT YResolution; + UCHAR XCharSize; + UCHAR YCharSize; + UCHAR NumberOfPlanes; + UCHAR BitsPerPixel; + UCHAR NumberOfBanks; + UCHAR MemoryModel; + UCHAR BankSize; + UCHAR NumberOfImagePages; + UCHAR Reserved1; + + /* Direct Color fields (required for Direct/6 and YUV/7 memory models) */ + UCHAR RedMaskSize; + UCHAR RedFieldPosition; + UCHAR GreenMaskSize; + UCHAR GreenFieldPosition; + UCHAR BlueMaskSize; + UCHAR BlueFieldPosition; + UCHAR ReservedMaskSize; + UCHAR ReservedFieldPosition; + UCHAR DirectColorModeInfo; + + /* Mandatory information for VBE 2.0 and above */ + ULONG PhysBasePtr; + ULONG Reserved2; + USHORT Reserved3; + + /* Mandatory information for VBE 3.0 and above */ + USHORT LinBytesPerScanLine; + UCHAR BnkNumberOfImagePages; + UCHAR LinNumberOfImagePages; + UCHAR LinRedMaskSize; + UCHAR LinRedFieldPosition; + UCHAR LinGreenMaskSize; + UCHAR LinGreenFieldPosition; + UCHAR LinBlueMaskSize; + UCHAR LinBlueFieldPosition; + UCHAR LinReservedMaskSize; + UCHAR LinReservedFieldPosition; + ULONG MaxPixelClock; + + CHAR Reserved4[190]; +} VBE_MODE_INFO, *PVBE_MODE_INFO; + +#include + +typedef struct _VBE_INFO +{ + VBE_CONTROLLER_INFO Info; + VBE_MODE_INFO Modes; + USHORT ModeArray[129]; +} VBE_INFO, *PVBE_INFO; + +C_ASSERT(sizeof(VBE_CONTROLLER_INFO) == 0x200); +C_ASSERT(sizeof(VBE_MODE_INFO) == 0x100); + +typedef struct _VBE_COLOR_REGISTER +{ + UCHAR Blue; + UCHAR Green; + UCHAR Red; + UCHAR Pad; +} VBE_COLOR_REGISTER, *PVBE_COLOR_REGISTER; + +VOID +NTAPI +InitializeModeTable(IN PHW_DEVICE_EXTENSION VgaExtension); + +VP_STATUS +NTAPI +VbeSetMode(IN PHW_DEVICE_EXTENSION VgaDeviceExtension, + IN PVIDEOMODE VgaMode, + OUT PULONG PhysPtrChange); + +VP_STATUS +NTAPI +VbeSetColorLookup(IN PHW_DEVICE_EXTENSION VgaExtension, + IN PVIDEO_CLUT ClutBuffer); + +BOOLEAN +NTAPI +ValidateVbeInfo(IN PHW_DEVICE_EXTENSION VgaExtension, + IN PVBE_INFO VbeInfo); + +extern BOOLEAN g_bIntelBrookdaleBIOS; + +/* EOF */ diff --git a/reactos/drivers/video/miniport/vga_new/vbemodes.c b/reactos/drivers/video/miniport/vga_new/vbemodes.c new file mode 100644 index 00000000000..39537c64563 --- /dev/null +++ b/reactos/drivers/video/miniport/vga_new/vbemodes.c @@ -0,0 +1,449 @@ +/* + * PROJECT: ReactOS VGA Miniport Driver + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: boot/drivers/video/miniport/vga/vbemodes.c + * PURPOSE: Mode Initialization and Mode Set for VBE-compatible cards + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include "vga.h" + +/* FUNCTIONS ******************************************************************/ + +ULONG +NTAPI +RaiseToPower2Ulong(IN ULONG Value) +{ + ULONG SquaredResult = Value; + if ((Value - 1) & Value) for (SquaredResult = 1; (SquaredResult < Value) && (SquaredResult); SquaredResult *= 2); + return SquaredResult; +} + +ULONG +NTAPI +RaiseToPower2(IN USHORT Value) +{ + ULONG SquaredResult = Value; + if ((Value - 1) & Value) for (SquaredResult = 1; (SquaredResult < Value) && (SquaredResult); SquaredResult *= 2); + return SquaredResult; +} + +ULONG +NTAPI +VbeGetVideoMemoryBaseAddress(IN PHW_DEVICE_EXTENSION VgaExtension, + IN PVIDEOMODE VgaMode) +{ + ULONG Length = 4 * 1024; + USHORT TrampolineMemorySegment, TrampolineMemoryOffset; + PVOID Context; + INT10_BIOS_ARGUMENTS BiosArguments; + PVBE_MODE_INFO VbeModeInfo; + ULONG BaseAddress; + VP_STATUS Status; + + /* Need linear and INT10 interface */ + if (!(VgaMode->fbType & VIDEO_MODE_BANKED)) return 0; + if (VgaExtension->Int10Interface.Size) return 0; + + /* Allocate scratch area and context */ + VbeModeInfo = VideoPortAllocatePool(VgaExtension, 1, sizeof(VBE_MODE_INFO), ' agV'); + if (!VbeModeInfo) return 0; + Context = VgaExtension->Int10Interface.Context; + Status = VgaExtension->Int10Interface.Int10AllocateBuffer(Context, + &TrampolineMemorySegment, + &TrampolineMemoryOffset, + &Length); + if (Status != NO_ERROR) return 0; + + /* Ask VBE BIOS for mode info */ + BiosArguments.Ecx = HIWORD(VgaMode->Mode); + BiosArguments.Edi = TrampolineMemorySegment; + BiosArguments.SegEs = TrampolineMemoryOffset; + BiosArguments.Eax = VBE_GET_MODE_INFORMATION; + Status = VgaExtension->Int10Interface.Int10CallBios(Context, &BiosArguments); + if (Status != NO_ERROR) return 0; + if (BiosArguments.Eax != VBE_SUCCESS) return 0; + Status = VgaExtension->Int10Interface.Int10ReadMemory(Context, + TrampolineMemorySegment, + TrampolineMemoryOffset, + VbeModeInfo, + sizeof(VBE_MODE_INFO)); + if (Status != NO_ERROR) return 0; + + /* Return phys address and cleanup */ + BaseAddress = VbeModeInfo->PhysBasePtr; + VgaExtension->Int10Interface.Int10FreeBuffer(Context, + TrampolineMemorySegment, + TrampolineMemoryOffset); + VideoPortFreePool(VgaExtension, VbeModeInfo); + return BaseAddress; +} + +VP_STATUS +NTAPI +VbeSetMode(IN PHW_DEVICE_EXTENSION VgaDeviceExtension, + IN PVIDEOMODE VgaMode, + OUT PULONG PhysPtrChange) +{ + VP_STATUS Status; + VIDEO_X86_BIOS_ARGUMENTS BiosArguments; + ULONG ModeIndex; + ULONG BaseAddress; + + VideoPortZeroMemory(&BiosArguments, sizeof(BiosArguments)); + ModeIndex = VgaMode->Mode; + BiosArguments.Eax = ModeIndex & 0x0000FFFF; + BiosArguments.Ebx = ModeIndex >> 16; + VideoPortDebugPrint(0, "Switching to %lx %lx\n", BiosArguments.Eax, BiosArguments.Ebx); + Status = VideoPortInt10(VgaDeviceExtension, &BiosArguments); + if (Status != NO_ERROR) return Status; + + /* Check for VESA mode */ + if (ModeIndex >> 16) + { + /* Mode set fail */ + if (BiosArguments.Eax != VBE_SUCCESS) return ERROR_INVALID_PARAMETER; + + /* Check current mode is desired mode */ + BiosArguments.Eax = VBE_GET_CURRENT_VBE_MODE; + Status = VideoPortInt10(VgaDeviceExtension, &BiosArguments); + if ((Status == NO_ERROR) && + (BiosArguments.Eax == VBE_SUCCESS) && + ((BiosArguments.Ebx ^ (ModeIndex >> 16)) & VBE_MODE_BITS)) + { + return ERROR_INVALID_PARAMETER; + } + + /* Set logical scanline width if different from physical */ + if (VgaMode->LogicalWidth != VgaMode->hres) + { + /* Check setting works after being set */ + BiosArguments.Eax = VBE_SET_GET_LOGICAL_SCAN_LINE_LENGTH; + BiosArguments.Ecx = VgaMode->LogicalWidth; + BiosArguments.Ebx = 0; + Status = VideoPortInt10(VgaDeviceExtension, &BiosArguments); + if ((Status != NO_ERROR) || + (BiosArguments.Eax != VBE_SUCCESS) || + (BiosArguments.Ecx != VgaMode->LogicalWidth)) + { + return ERROR_INVALID_PARAMETER; + } + } + } + + /* Get VRAM address to update changes */ + BaseAddress = VbeGetVideoMemoryBaseAddress(VgaDeviceExtension, VgaMode); + if ((BaseAddress) && (VgaMode->PhysBase != BaseAddress)) + { + *PhysPtrChange = TRUE; + VgaMode->PhysBase = BaseAddress; + } + + return NO_ERROR; +} + +VOID +NTAPI +InitializeModeTable(IN PHW_DEVICE_EXTENSION VgaExtension) +{ + ULONG ModeCount = 0; + ULONG Length = 4 * 1024; + ULONG TotalMemory; + VP_STATUS Status; + INT10_BIOS_ARGUMENTS BiosArguments; + PVBE_INFO VbeInfo; + PVBE_MODE_INFO VbeModeInfo; + PVOID Context; + USHORT TrampolineMemorySegment; + USHORT TrampolineMemoryOffset; + ULONG VbeVersion; + ULONG NewModes = 0; + BOOLEAN FourBppModeFound = FALSE; + USHORT ModeResult; + USHORT Mode; + PUSHORT ThisMode; + BOOLEAN LinearAddressing; + ULONG Size, ScreenSize; + PVIDEOMODE VgaMode; + PVOID BaseAddress; + ULONG ScreenStride = 0; + PHYSICAL_ADDRESS PhysicalAddress; + + /* Enable only default vga modes if no vesa */ + VgaModeList = ModesVGA; + if (VideoPortIsNoVesa()) + { + VgaExtension->Int10Interface.Size = 0; + VgaExtension->Int10Interface.Version = 0; + return; + } + + /* Query INT10 interface */ + VgaExtension->Int10Interface.Version = VIDEO_PORT_INT10_INTERFACE_VERSION_1; + VgaExtension->Int10Interface.Size = sizeof(VIDEO_PORT_INT10_INTERFACE); + if (VideoPortQueryServices(VgaExtension, + VideoPortServicesInt10, + (PINTERFACE)&VgaExtension->Int10Interface)) + { + VgaExtension->Int10Interface.Size = 0; + VgaExtension->Int10Interface.Version = 0; + } + + /* Add ref */ + //VideoPortDebugPrint(0, "have int10 iface\n"); + VgaExtension->Int10Interface.InterfaceReference(VgaExtension->Int10Interface.Context); + Context = VgaExtension->Int10Interface.Context; + + /* Allocate scratch area and context */ + Status = VgaExtension->Int10Interface.Int10AllocateBuffer(Context, + &TrampolineMemorySegment, + &TrampolineMemoryOffset, + &Length); + if (Status != NO_ERROR) return; + VbeInfo = VideoPortAllocatePool(VgaExtension, 1, sizeof(VBE_INFO), ' agV'); + VbeModeInfo = &VbeInfo->Modes; + if (!VbeInfo) return; + + /* Init VBE data and write to card buffer */ + //VideoPortDebugPrint(0, "have int10 data\n"); + VbeInfo->ModeArray[128] = 0xFFFF; + strcpy(VbeInfo->Info.Signature, "VBE2"); + Status = VgaExtension->Int10Interface.Int10WriteMemory(Context, + TrampolineMemorySegment, + TrampolineMemoryOffset, + VbeInfo, + 512); + if (Status != NO_ERROR) return; + + /* Get controller info */ + BiosArguments.Edi = TrampolineMemoryOffset; + BiosArguments.SegEs = TrampolineMemorySegment; + BiosArguments.Eax = VBE_GET_CONTROLLER_INFORMATION; + Status = VgaExtension->Int10Interface.Int10CallBios(Context, &BiosArguments); + if (Status != NO_ERROR) return; + if (BiosArguments.Eax != VBE_SUCCESS) return; + Status = VgaExtension->Int10Interface.Int10ReadMemory(Context, + TrampolineMemorySegment, + TrampolineMemoryOffset, + VbeInfo, + 512); + if (Status != NO_ERROR) return; + + /* Check correct VBE BIOS */ + //VideoPortDebugPrint(0, "have vbe data\n"); + TotalMemory = VbeInfo->Info.TotalMemory << 16; + VbeVersion = VbeInfo->Info.Version; + VideoPortDebugPrint(0, "vbe version %lx memory %lx\n", VbeVersion, TotalMemory); + if (!ValidateVbeInfo(VgaExtension, VbeInfo)) return; + + /* Read modes */ + //VideoPortDebugPrint(0, "read modes from %p\n", VbeInfo->Info.VideoModePtr); + Status = VgaExtension->Int10Interface.Int10ReadMemory(Context, + HIWORD(VbeInfo->Info.VideoModePtr), + LOWORD(VbeInfo->Info.VideoModePtr), + VbeInfo->ModeArray, + 128 * sizeof(USHORT)); + if (Status != NO_ERROR) return; + //VideoPortDebugPrint(0, "Read modes at: %p\n", VbeInfo->ModeArray); + + /* Count modes, check for new 4bpp SVGA modes */ + ThisMode = VbeInfo->ModeArray; + ModeResult = VbeInfo->ModeArray[0]; + while (ModeResult != 0xFFFF) + { + Mode = ModeResult & 0x1FF; + //VideoPortDebugPrint(0, "Mode found: %lx\n", Mode); + if ((Mode == 0x102) || (Mode == 0x6A)) FourBppModeFound = TRUE; + ModeResult = *++ThisMode; + NewModes++; + } + + /* Remove the built-in mode if not supported by card and check max modes */ + if (!FourBppModeFound) --NumVideoModes; + if ((NewModes >= 128) && (NumVideoModes > 8)) goto Cleanup; + + /* Switch to new SVGA mode list, copy VGA modes */ + VgaModeList = VideoPortAllocatePool(VgaExtension, 1, (NewModes + NumVideoModes) * sizeof(VIDEOMODE), ' agV'); + if (!VgaModeList) goto Cleanup; + VideoPortMoveMemory(VgaModeList, ModesVGA, NumVideoModes * sizeof(VIDEOMODE)); + + /* Apply fixup for Intel Brookdale */ + if (g_bIntelBrookdaleBIOS) + { + VideoPortDebugPrint(0, "Intel Brookdale-G Video BIOS Not Support!\n"); + while (TRUE); + } + + /* Scan SVGA modes */ +// VideoPortDebugPrint(0, "Static modes: %d\n", NumVideoModes); + VgaMode = &VgaModeList[NumVideoModes]; + ThisMode = VbeInfo->ModeArray; + //VideoPortDebugPrint(0, "new modes: %d\n", NewModes); + while (NewModes--) + { + /* Get info on mode */ + BiosArguments.Eax = VBE_GET_MODE_INFORMATION; + BiosArguments.Ecx = *ThisMode; + BiosArguments.Edi = TrampolineMemoryOffset; + BiosArguments.SegEs = TrampolineMemorySegment; + Status = VgaExtension->Int10Interface.Int10CallBios(Context, &BiosArguments); + if (Status != NO_ERROR) goto Next; + if (BiosArguments.Eax != VBE_SUCCESS) goto Next; + Status = VgaExtension->Int10Interface.Int10ReadMemory(Context, + TrampolineMemorySegment, + TrampolineMemoryOffset, + VbeModeInfo, + 256); + if (Status != NO_ERROR) goto Next; + + /* Parse graphics modes only if linear framebuffer support */ + //VideoPortDebugPrint(0, "attr: %lx\n", VbeModeInfo->ModeAttributes); + if (!(VbeModeInfo->ModeAttributes & (VBE_MODEATTR_VALID | + VBE_MODEATTR_GRAPHICS))) goto Next; + LinearAddressing = ((VbeVersion >= 0x200) && + (VbeModeInfo->PhysBasePtr) && + (VbeModeInfo->ModeAttributes & VBE_MODEATTR_LINEAR)) ? + TRUE : FALSE; + + /* Check SVGA modes if 8bpp or higher */ + //VideoPortDebugPrint(0, "PhysBase: %lx\n", VbeModeInfo->PhysBasePtr); + if ((VbeModeInfo->XResolution >= 640) && + (VbeModeInfo->YResolution >= 480) && + (VbeModeInfo->NumberOfPlanes >= 1) && + (VbeModeInfo->BitsPerPixel >= 8)) + { + /* Copy VGA mode info */ + VideoPortZeroMemory(VgaMode, sizeof(VIDEOMODE)); + VgaMode->numPlanes = VbeModeInfo->NumberOfPlanes; + VgaMode->hres = VbeModeInfo->XResolution; + VgaMode->vres = VbeModeInfo->YResolution; + VgaMode->Frequency = 1; + VgaMode->Mode = (*ThisMode << 16) | VBE_SET_VBE_MODE; + VgaMode->Granularity = VbeModeInfo->WinGranularity << 10; + //VideoPortDebugPrint(0, "Mode %lx (Granularity %d)\n", VgaMode->Mode, VgaMode->Granularity); + + /* Set flags */ + if (VbeModeInfo->ModeAttributes & VBE_MODEATTR_COLOR) VgaMode->fbType |= VIDEO_MODE_COLOR; + if (VbeModeInfo->ModeAttributes & VBE_MODEATTR_GRAPHICS) VgaMode->fbType |= VIDEO_MODE_GRAPHICS; + if (VbeModeInfo->ModeAttributes & VBE_MODEATTR_NON_VGA) VgaMode->NonVgaMode = TRUE; + + /* If no char data, say 80x25 */ + VgaMode->col = VbeModeInfo->XCharSize ? VbeModeInfo->XResolution / VbeModeInfo->XCharSize : 80; + VgaMode->row = VbeModeInfo->YCharSize ? VbeModeInfo->YResolution / VbeModeInfo->YCharSize : 25; + //VideoPortDebugPrint(0, "%d by %d rows\n", VgaMode->Columns, VgaMode->Rows); + + /* Check RGB555 (15bpp only) */ + VgaMode->bitsPerPlane = VbeModeInfo->BitsPerPixel / VbeModeInfo->NumberOfPlanes; + if ((VgaMode->bitsPerPlane == 16) && (VbeModeInfo->GreenMaskSize == 5)) VgaMode->bitsPerPlane = 15; + //VideoPortDebugPrint(0, "BPP: %d\n", VgaMode->BitsPerPlane); + + /* Do linear or banked frame buffers */ + VgaMode->FrameBufferBase = 0; + if (!LinearAddressing) + { + /* Read the screen stride (scanline size) */ + ScreenStride = RaiseToPower2(VbeModeInfo->BytesPerScanLine); + VgaMode->wbytes = ScreenStride; + //VideoPortDebugPrint(0, "ScanLines: %lx Stride: %lx\n", VbeModeInfo->BytesPerScanLine, VgaMode->Stride); + + /* Size of frame buffer is Height X ScanLine, align to bank/page size */ + ScreenSize = VgaMode->hres * ScreenStride; + //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize); + Size = (ScreenSize + ((64 * 1024) - 1)) & ((64 * 1024) - 1); + //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize); + if (Size > TotalMemory) Size = (Size + ((4 * 1024) - 1)) & ((4 * 1024) - 1); + //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize); + + /* Banked VGA at 0xA0000 (64K) */ + //VideoPortDebugPrint(0, "Final size: %lx\n", Size); + VgaMode->fbType |= VIDEO_MODE_BANKED; + VgaMode->sbytes = Size; + VgaMode->PhysSize = 64 * 1024; + VgaMode->FrameBufferSize = 64 * 1024; + VgaMode->NoBankSwitch = TRUE; + VgaMode->PhysBase = 0xA0000; + VgaMode->LogicalWidth = RaiseToPower2(VgaMode->hres); + } + else + { + /* VBE 3.00+ has specific field, read legacy field if not */ + //VideoPortDebugPrint(0, "LINEAR MODE!!!\n"); + ScreenStride = (VbeVersion >= 0x300) ? VbeModeInfo->LinBytesPerScanLine : 0; + if (!ScreenStride) ScreenStride = VbeModeInfo->BytesPerScanLine; + VgaMode->wbytes = ScreenStride; + //VideoPortDebugPrint(0, "ScanLines: %lx Stride: %lx\n", VbeModeInfo->BytesPerScanLine, VgaMode->Stride); + + /* Size of frame buffer is Height X ScanLine, align to page size */ + ScreenSize = VgaMode->hres * LOWORD(VgaMode->wbytes); + //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize); + Size = RaiseToPower2Ulong(ScreenSize); + //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize); + if (Size > TotalMemory) Size = (Size + ((4 * 1024) - 1)) & ((4 * 1024) - 1); + //VideoPortDebugPrint(0, "Size: %lx\n", ScreenSize); + + /* Linear VGA must read settings from VBE */ + VgaMode->fbType |= VIDEO_MODE_LINEAR; + VgaMode->sbytes = Size; + VgaMode->PhysSize = Size; + VgaMode->FrameBufferSize = Size; + VgaMode->NoBankSwitch = FALSE; + VgaMode->PhysBase = VbeModeInfo->PhysBasePtr; + VgaMode->LogicalWidth = VgaMode->hres; + + /* Make VBE_SET_VBE_MODE command use Linear Framebuffer Select */ + VgaMode->Mode |= (VBE_MODE_LINEAR_FRAMEBUFFER << 16); + } + + /* Override bank switch if not support by card */ + if (VbeModeInfo->ModeAttributes & VBE_MODEATTR_NO_BANK_SWITCH) VgaMode->NoBankSwitch = TRUE; + + /* Next */ + if (ScreenSize <= TotalMemory) + { + VgaMode++; + ModeCount++; + } + } +Next: + /* Next */ + ThisMode++; + } + + /* Check if last mode was color to do test */ + VideoPortDebugPrint(0, "mode scan complete. Total modes: %d\n", ModeCount); + if (--VgaMode->fbType & VIDEO_MODE_COLOR) + { + /* Try map physical buffer and free if worked */ + PhysicalAddress.QuadPart = VgaMode->PhysBase; + BaseAddress = VideoPortGetDeviceBase(VgaExtension, PhysicalAddress, 4 * 1024, FALSE); + if (BaseAddress) + { + VideoPortFreeDeviceBase(VgaExtension, BaseAddress); + } + else + { + /* Not work, so throw out VBE data */ + ModeCount = 0; + } + } + + /* Cleanup sucess path */ + VideoPortFreePool(VgaExtension, VbeInfo); + VgaExtension->Int10Interface.Int10FreeBuffer(Context, + TrampolineMemorySegment, + TrampolineMemoryOffset); + NumVideoModes += ModeCount; + return; + +Cleanup: + /* Cleanup failure path, reset standard VGA and free memory */ + VgaModeList = ModesVGA; + VideoPortFreePool(VgaExtension, VbeInfo); + VgaExtension->Int10Interface.Int10FreeBuffer(Context, + TrampolineMemorySegment, + TrampolineMemoryOffset); +} + +/* EOF */ diff --git a/reactos/drivers/video/miniport/vga_new/vga.c b/reactos/drivers/video/miniport/vga_new/vga.c new file mode 100644 index 00000000000..a97c64bdecd --- /dev/null +++ b/reactos/drivers/video/miniport/vga_new/vga.c @@ -0,0 +1,1556 @@ +/* + * PROJECT: ReactOS VGA Miniport Driver + * LICENSE: Microsoft NT4 DDK Sample Code License + * FILE: boot/drivers/video/miniport/vga/vga.c + * PURPOSE: Main Standard VGA-compatible Minport Handling Code + * PROGRAMMERS: Copyright (c) 1992 Microsoft Corporation + * ReactOS Portable Systems Group + */ + +//--------------------------------------------------------------------------- + +#include "vga.h" + +//--------------------------------------------------------------------------- +// +// Function declarations +// +// Functions that start with 'VGA' are entry points for the OS port driver. +// + +VP_STATUS +VgaFindAdapter( + PVOID HwDeviceExtension, + PVOID HwContext, + PWSTR ArgumentString, + PVIDEO_PORT_CONFIG_INFO ConfigInfo, + PUCHAR Again + ); + +BOOLEAN +VgaInitialize( + PVOID HwDeviceExtension + ); + +BOOLEAN +VgaStartIO( + PVOID HwDeviceExtension, + PVIDEO_REQUEST_PACKET RequestPacket + ); + +// +// Private function prototypes. +// + +VP_STATUS +VgaQueryAvailableModes( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_MODE_INFORMATION ModeInformation, + ULONG ModeInformationSize, + PULONG OutputSize + ); + +VP_STATUS +VgaQueryNumberOfAvailableModes( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_NUM_MODES NumModes, + ULONG NumModesSize, + PULONG OutputSize + ); + +VP_STATUS +VgaQueryCurrentMode( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_MODE_INFORMATION ModeInformation, + ULONG ModeInformationSize, + PULONG OutputSize + ); + +VP_STATUS +VgaSetMode( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_MODE Mode, + ULONG ModeSize, +// eVb: 1.1 [SET MODE] - Add new output parameter for framebuffer update functionality + PULONG PhysPtrChange +// eVb: 1.1 [END] + ); + +BOOLEAN +VgaIsPresent( + PHW_DEVICE_EXTENSION HwDeviceExtension + ); + +VOID +VgaInterpretCmdStream( + PVOID HwDeviceExtension, + PUSHORT pusCmdStream + ); + +VP_STATUS +VgaSetPaletteReg( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_PALETTE_DATA PaletteBuffer, + ULONG PaletteBufferSize + ); + +VP_STATUS +VgaSetColorLookup( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_CLUT ClutBuffer, + ULONG ClutBufferSize + ); + +VP_STATUS +GetDeviceDataCallback( + PVOID HwDeviceExtension, + PVOID Context, + VIDEO_DEVICE_DATA_TYPE DeviceDataType, + PVOID Identifier, + ULONG IdentifierLength, + PVOID ConfigurationData, + ULONG ConfigurationDataLength, + PVOID ComponentInformation, + ULONG ComponentInformationLength + ); + +// eVb: 1.2 [RESOURCE] - Add new function for acquiring VGA resources (I/O, memory) +VP_STATUS +VgaAcquireResources( + PHW_DEVICE_EXTENSION DeviceExtension + ); +// eVb: 1.2 [END] + +#if defined(ALLOC_PRAGMA) +#pragma alloc_text(PAGE,DriverEntry) +#pragma alloc_text(PAGE,VgaFindAdapter) +#pragma alloc_text(PAGE,VgaInitialize) +#pragma alloc_text(PAGE,VgaStartIO) +#pragma alloc_text(PAGE,VgaIsPresent) +#pragma alloc_text(PAGE,VgaSetColorLookup) +#endif + + +//--------------------------------------------------------------------------- +ULONG +// eVb: 1.3 [GCC] - Add NTAPI for GCC support +NTAPI +// eVb: 1.3 [END] +DriverEntry( + PVOID Context1, + PVOID Context2 + ) + +/*++ + +Routine Description: + + Installable driver initialization entry point. + This entry point is called directly by the I/O system. + +Arguments: + + Context1 - First context value passed by the operating system. This is + the value with which the miniport driver calls VideoPortInitialize(). + + Context2 - Second context value passed by the operating system. This is + the value with which the miniport driver calls 3VideoPortInitialize(). + +Return Value: + + Status from VideoPortInitialize() + +--*/ + +{ + + VIDEO_HW_INITIALIZATION_DATA hwInitData; + ULONG status; + ULONG initializationStatus = (ULONG) -1; + + // + // Zero out structure. + // + + VideoPortZeroMemory(&hwInitData, sizeof(VIDEO_HW_INITIALIZATION_DATA)); + + // + // Specify sizes of structure and extension. + // + + hwInitData.HwInitDataSize = sizeof(VIDEO_HW_INITIALIZATION_DATA); + + // + // Set entry points. + // + + hwInitData.HwFindAdapter = VgaFindAdapter; + hwInitData.HwInitialize = VgaInitialize; + hwInitData.HwInterrupt = NULL; + hwInitData.HwStartIO = VgaStartIO; + + // + // Determine the size we require for the device extension. + // + + hwInitData.HwDeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION); + + // + // Always start with parameters for device0 in this case. + // We can leave it like this since we know we will only ever find one + // VGA type adapter in a machine. + // + + // hwInitData.StartingDeviceNumber = 0; + + // + // Once all the relevant information has been stored, call the video + // port driver to do the initialization. + // For this device we will repeat this call three times, for ISA, EISA + // and PCI. + // We will return the minimum of all return values. + // + + // + // We will try the PCI bus first so that our ISA detection does'nt claim + // PCI cards (since it is impossible to differentiate between the two + // by looking at the registers). + // + + // + // NOTE: since this driver only supports one adapter, we will return + // as soon as we find a device, without going on to the following buses. + // Normally one would call for each bus type and return the smallest + // value. + // + +#if !defined(_ALPHA_) + + // + // Before we can enable this on ALPHA we need to find a way to map a + // sparse view of a 4MB region successfully. + // + + hwInitData.AdapterInterfaceType = PCIBus; + + initializationStatus = VideoPortInitialize(Context1, + Context2, + &hwInitData, + NULL); + + if (initializationStatus == NO_ERROR) + { + return initializationStatus; + } + +#endif + + hwInitData.AdapterInterfaceType = MicroChannel; + + initializationStatus = VideoPortInitialize(Context1, + Context2, + &hwInitData, + NULL); + + // + // Return immediately instead of checkin for smallest return code. + // + + if (initializationStatus == NO_ERROR) + { + return initializationStatus; + } + + + hwInitData.AdapterInterfaceType = Internal; + + initializationStatus = VideoPortInitialize(Context1, + Context2, + &hwInitData, + NULL); + + if (initializationStatus == NO_ERROR) + { + return initializationStatus; + } + + + hwInitData.AdapterInterfaceType = Isa; + + initializationStatus = VideoPortInitialize(Context1, + Context2, + &hwInitData, + NULL); + + if (initializationStatus == NO_ERROR) + { + return initializationStatus; + } + + + + hwInitData.AdapterInterfaceType = Eisa; + + status = VideoPortInitialize(Context1, + Context2, + &hwInitData, + NULL); + + if (initializationStatus > status) { + initializationStatus = status; + } + + return initializationStatus; + +} // end DriverEntry() + +//--------------------------------------------------------------------------- +VP_STATUS +VgaFindAdapter( + PVOID HwDeviceExtension, + PVOID HwContext, + PWSTR ArgumentString, + PVIDEO_PORT_CONFIG_INFO ConfigInfo, + PUCHAR Again + ) + +/*++ + +Routine Description: + + This routine is called to determine if the adapter for this driver + is present in the system. + If it is present, the function fills out some information describing + the adapter. + +Arguments: + + HwDeviceExtension - Supplies the miniport driver's adapter storage. This + storage is initialized to zero before this call. + + HwContext - Supplies the context value which was passed to + VideoPortInitialize(). + + ArgumentString - Supplies a NULL terminated ASCII string. This string + originates from the user. + + ConfigInfo - Returns the configuration information structure which is + filled by the miniport driver. This structure is initialized with + any known configuration information (such as SystemIoBusNumber) by + the port driver. Where possible, drivers should have one set of + defaults which do not require any supplied configuration information. + + Again - Indicates if the miniport driver wants the port driver to call + its VIDEO_HW_FIND_ADAPTER function again with a new device extension + and the same config info. This is used by the miniport drivers which + can search for several adapters on a bus. + +Return Value: + + This routine must return: + + NO_ERROR - Indicates a host adapter was found and the + configuration information was successfully determined. + + ERROR_INVALID_PARAMETER - Indicates an adapter was found but there was an + error obtaining the configuration information. If possible an error + should be logged. + + ERROR_DEV_NOT_EXIST - Indicates no host adapter was found for the + supplied configuration information. + +--*/ + +{ + + PHW_DEVICE_EXTENSION hwDeviceExtension = HwDeviceExtension; + + // + // Make sure the size of the structure is at least as large as what we + // are expecting (check version of the config info structure). + // + + if (ConfigInfo->Length < sizeof(VIDEO_PORT_CONFIG_INFO)) { + + return ERROR_INVALID_PARAMETER; + + } +// eVb: 1.4 [CIRRUS] - Remove CIRRUS-specific support + // + // Check internal VGA (MIPS and ARM systems) + // + + if ((ConfigInfo->AdapterInterfaceType == Internal) && + (VideoPortGetDeviceData(HwDeviceExtension, + VpControllerData, + &GetDeviceDataCallback, + VgaAccessRange) != NO_ERROR)) + { + return ERROR_INVALID_PARAMETER; + } +// eVb: 1.4 [END] + // + // No interrupt information is necessary. + // + + // + // Check to see if there is a hardware resource conflict. + // +// eVb: 1.5 [RESOURCE] - Use new function for acquiring VGA resources (I/O, memory) + if (VgaAcquireResources(hwDeviceExtension) != NO_ERROR) return ERROR_INVALID_PARAMETER; +// eVb: 1.5 [END] + // + // Get logical IO port addresses. + // + + if ((hwDeviceExtension->IOAddress = + VideoPortGetDeviceBase(hwDeviceExtension, + VgaAccessRange->RangeStart, + VGA_MAX_IO_PORT - VGA_BASE_IO_PORT + 1, + VgaAccessRange->RangeInIoSpace)) == NULL) + { + VideoDebugPrint((0, "VgaFindAdapter - Fail to get io address\n")); + + return ERROR_INVALID_PARAMETER; + } + + // + // Determine whether a VGA is present. + // + + if (!VgaIsPresent(hwDeviceExtension)) { + + VideoDebugPrint((0, "VgaFindAdapter - VGA Failed\n")); + return ERROR_DEV_NOT_EXIST; + } + + // + // Minimum size of the buffer required to store the hardware state + // information returned by IOCTL_VIDEO_SAVE_HARDWARE_STATE. + // + + ConfigInfo->HardwareStateSize = VGA_TOTAL_STATE_SIZE; + + // + // Pass a pointer to the emulator range we are using. + // +// eVb: 1.6 [VDM] - Disable VDM for now + ConfigInfo->NumEmulatorAccessEntries = 0; + ConfigInfo->EmulatorAccessEntries = NULL; + ConfigInfo->EmulatorAccessEntriesContext = 0; +// eVb: 1.6 [END] + // + // BUGBUG + // + // There is really no reason to have the frame buffer mapped. On an + // x86 we use if for save/restore (supposedly) but even then we + // would only need to map a 64K window, not all 16 Meg! + // + +#ifdef _X86_ + + // + // Map the video memory into the system virtual address space so we can + // clear it out and use it for save and restore. + // + + if ( (hwDeviceExtension->VideoMemoryAddress = + VideoPortGetDeviceBase(hwDeviceExtension, + VgaAccessRange[2].RangeStart, + VgaAccessRange[2].RangeLength, + FALSE)) == NULL) + { + VideoDebugPrint((0, "VgaFindAdapter - Fail to get memory address\n")); + + return ERROR_INVALID_PARAMETER; + } + + VideoPortDebugPrint(0, "vga mapped at %x\n", hwDeviceExtension->VideoMemoryAddress); +#endif +// eVb: 1.7 [VDM] - Disable VDM for now + ConfigInfo->VdmPhysicalVideoMemoryAddress.QuadPart = 0; + ConfigInfo->VdmPhysicalVideoMemoryLength = 0; +// eVb: 1.7 [END] + // + // Indicate we do not wish to be called again for another initialization. + // + + *Again = 0; + + // + // Indicate a successful completion status. + // + + return NO_ERROR; + + +} // VgaFindAdapter() + +//--------------------------------------------------------------------------- +BOOLEAN +VgaInitialize( + PVOID HwDeviceExtension + ) + +/*++ + +Routine Description: + + This routine does one time initialization of the device. + +Arguments: + + HwDeviceExtension - Pointer to the miniport driver's adapter information. + +Return Value: + + None. + +--*/ + +{ + PHW_DEVICE_EXTENSION hwDeviceExtension = HwDeviceExtension; + + // + // set up the default cursor position and type. + // + + hwDeviceExtension->CursorPosition.Column = 0; + hwDeviceExtension->CursorPosition.Row = 0; + hwDeviceExtension->CursorTopScanLine = 0; + hwDeviceExtension->CursorBottomScanLine = 31; + hwDeviceExtension->CursorEnable = TRUE; + +// eVb: 1.8 [VBE] - Initialize VBE modes + InitializeModeTable(hwDeviceExtension); +// eVb: 1.8 [END] + return TRUE; + +} // VgaInitialize() + +//--------------------------------------------------------------------------- +BOOLEAN +VgaStartIO( + PVOID HwDeviceExtension, + PVIDEO_REQUEST_PACKET RequestPacket + ) + +/*++ + +Routine Description: + + This routine is the main execution routine for the miniport driver. It + accepts a Video Request Packet, performs the request, and then returns + with the appropriate status. + +Arguments: + + HwDeviceExtension - Pointer to the miniport driver's adapter information. + + RequestPacket - Pointer to the video request packet. This structure + contains all the parameters passed to the VideoIoControl function. + +Return Value: + + This routine will return error codes from the various support routines + and will also return ERROR_INSUFFICIENT_BUFFER for incorrectly sized + buffers and ERROR_INVALID_FUNCTION for unsupported functions. + +--*/ + +{ + PHW_DEVICE_EXTENSION hwDeviceExtension = HwDeviceExtension; + VP_STATUS status; + VIDEO_MODE videoMode; + PVIDEO_MEMORY_INFORMATION memoryInformation; + ULONG inIoSpace; + ULONG Result; + + // + // Switch on the IoContolCode in the RequestPacket. It indicates which + // function must be performed by the driver. + // +// eVb: 1.9 [IOCTL] - Remove IOCTLs not needed yet + switch (RequestPacket->IoControlCode) + { + case IOCTL_VIDEO_SHARE_VIDEO_MEMORY: + + VideoDebugPrint((2, "VgaStartIO - ShareVideoMemory\n")); + + status = ERROR_INVALID_FUNCTION; + + break; + + case IOCTL_VIDEO_UNSHARE_VIDEO_MEMORY: + + VideoDebugPrint((2, "VgaStartIO - UnshareVideoMemory\n")); + + status = ERROR_INVALID_FUNCTION; + + break; + + + case IOCTL_VIDEO_MAP_VIDEO_MEMORY: + + VideoDebugPrint((2, "VgaStartIO - MapVideoMemory\n")); + + if ( (RequestPacket->OutputBufferLength < + (RequestPacket->StatusBlock->Information = + sizeof(VIDEO_MEMORY_INFORMATION))) || + (RequestPacket->InputBufferLength < sizeof(VIDEO_MEMORY)) ) + { + status = ERROR_INSUFFICIENT_BUFFER; + } + + memoryInformation = RequestPacket->OutputBuffer; + + memoryInformation->VideoRamBase = ((PVIDEO_MEMORY) + (RequestPacket->InputBuffer))->RequestedVirtualAddress; + + // + // We reserved 16 meg for the frame buffer, however, it makes + // no sense to map more memory than there is on the card. So + // only map the amount of memory we have on the card. + // +// eVb: 1.10 [CIRRUS] - On VGA, we have VRAM size since boot, use it + memoryInformation->VideoRamLength = + hwDeviceExtension->PhysicalVideoMemoryLength; +// eVb: 1.10 [END] + // + // If you change to using a dense space frame buffer, make this + // value a 4 for the ALPHA. + // + + inIoSpace = 0; + + status = VideoPortMapMemory(hwDeviceExtension, + hwDeviceExtension->PhysicalVideoMemoryBase, +// eVb: 1.11 [CIRRUS] - On VGA, we have VRAM size since boot, use it + &memoryInformation->VideoRamLength, +// eVb: 1.11 [END] + &inIoSpace, + &(memoryInformation->VideoRamBase)); + + if (status != NO_ERROR) { + VideoDebugPrint((0, "VgaStartIO - IOCTL_VIDEO_MAP_VIDEO_MEMORY failed VideoPortMapMemory (%x)\n", status)); + } + + memoryInformation->FrameBufferBase = + ((PUCHAR) (memoryInformation->VideoRamBase)) + + hwDeviceExtension->PhysicalFrameOffset.LowPart; + + memoryInformation->FrameBufferLength = + hwDeviceExtension->PhysicalFrameLength ? + hwDeviceExtension->PhysicalFrameLength : + memoryInformation->VideoRamLength; + + + VideoDebugPrint((2, "physical VideoMemoryBase %08lx\n", hwDeviceExtension->PhysicalVideoMemoryBase)); + VideoDebugPrint((2, "physical VideoMemoryLength %08lx\n", hwDeviceExtension->PhysicalVideoMemoryLength)); + VideoDebugPrint((2, "VideoMemoryBase %08lx\n", memoryInformation->VideoRamBase)); + VideoDebugPrint((2, "VideoMemoryLength %08lx\n", memoryInformation->VideoRamLength)); + + VideoDebugPrint((2, "physical framebuf offset %08lx\n", hwDeviceExtension->PhysicalFrameOffset.LowPart)); + VideoDebugPrint((2, "framebuf base %08lx\n", memoryInformation->FrameBufferBase)); + VideoDebugPrint((2, "physical framebuf len %08lx\n", hwDeviceExtension->PhysicalFrameLength)); + VideoDebugPrint((2, "framebuf length %08lx\n", memoryInformation->FrameBufferLength)); + + break; + + case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY: + + VideoDebugPrint((2, "VgaStartIO - UnMapVideoMemory\n")); + + status = ERROR_INVALID_FUNCTION; + + break; + + + case IOCTL_VIDEO_QUERY_AVAIL_MODES: + + VideoDebugPrint((2, "VgaStartIO - QueryAvailableModes\n")); + + status = VgaQueryAvailableModes(HwDeviceExtension, + (PVIDEO_MODE_INFORMATION) + RequestPacket->OutputBuffer, + RequestPacket->OutputBufferLength, + &RequestPacket->StatusBlock->Information); + + break; + + + case IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES: + + VideoDebugPrint((2, "VgaStartIO - QueryNumAvailableModes\n")); + + status = VgaQueryNumberOfAvailableModes(HwDeviceExtension, + (PVIDEO_NUM_MODES) + RequestPacket->OutputBuffer, + RequestPacket->OutputBufferLength, + &RequestPacket->StatusBlock->Information); + + break; + + + case IOCTL_VIDEO_QUERY_CURRENT_MODE: + + VideoDebugPrint((2, "VgaStartIO - QueryCurrentMode\n")); + + status = VgaQueryCurrentMode(HwDeviceExtension, + (PVIDEO_MODE_INFORMATION) RequestPacket->OutputBuffer, + RequestPacket->OutputBufferLength, + &RequestPacket->StatusBlock->Information); + + break; + + + case IOCTL_VIDEO_SET_CURRENT_MODE: + + VideoDebugPrint((2, "VgaStartIO - SetCurrentModes\n")); + + status = VgaSetMode(HwDeviceExtension, + (PVIDEO_MODE) RequestPacket->InputBuffer, + RequestPacket->InputBufferLength, +// eVb: 1.12 [SET MODE] - Use new output parameter for framebuffer update functionality + &Result); +// eVb: 1.12 [END] + + break; + + + case IOCTL_VIDEO_RESET_DEVICE: + + VideoDebugPrint((2, "VgaStartIO - Reset Device\n")); + + videoMode.RequestedMode = 0; + + VgaSetMode(HwDeviceExtension, + (PVIDEO_MODE) &videoMode, + sizeof(videoMode), +// eVb: 1.13 [SET MODE] - Use new output parameter for framebuffer update functionality + &Result); +// eVb: 1.13 [END] + + // + // Always return succcess since settings the text mode will fail on + // non-x86. + // + // Also, failiure to set the text mode is not fatal in any way, since + // this operation must be followed by another set mode operation. + // + + status = NO_ERROR; + + break; + + + case IOCTL_VIDEO_LOAD_AND_SET_FONT: + + VideoDebugPrint((2, "VgaStartIO - LoadAndSetFont\n")); + + status = ERROR_INVALID_FUNCTION; + + break; + + + case IOCTL_VIDEO_QUERY_CURSOR_POSITION: + + VideoDebugPrint((2, "VgaStartIO - QueryCursorPosition\n")); + + status = ERROR_INVALID_FUNCTION; + + break; + + + case IOCTL_VIDEO_SET_CURSOR_POSITION: + + VideoDebugPrint((2, "VgaStartIO - SetCursorPosition\n")); + + status = ERROR_INVALID_FUNCTION; + + break; + + + case IOCTL_VIDEO_QUERY_CURSOR_ATTR: + + VideoDebugPrint((2, "VgaStartIO - QueryCursorAttributes\n")); + + status = ERROR_INVALID_FUNCTION; + + break; + + + case IOCTL_VIDEO_SET_CURSOR_ATTR: + + VideoDebugPrint((2, "VgaStartIO - SetCursorAttributes\n")); + + status = ERROR_INVALID_FUNCTION; + + break; + + + case IOCTL_VIDEO_SET_PALETTE_REGISTERS: + + VideoDebugPrint((2, "VgaStartIO - SetPaletteRegs\n")); + + status = VgaSetPaletteReg(HwDeviceExtension, + (PVIDEO_PALETTE_DATA) RequestPacket->InputBuffer, + RequestPacket->InputBufferLength); + + break; + + + case IOCTL_VIDEO_SET_COLOR_REGISTERS: + + VideoDebugPrint((2, "VgaStartIO - SetColorRegs\n")); + + status = VgaSetColorLookup(HwDeviceExtension, + (PVIDEO_CLUT) RequestPacket->InputBuffer, + RequestPacket->InputBufferLength); + + break; + + + case IOCTL_VIDEO_ENABLE_VDM: + + VideoDebugPrint((2, "VgaStartIO - EnableVDM\n")); + + status = ERROR_INVALID_FUNCTION; + + break; + + + case IOCTL_VIDEO_RESTORE_HARDWARE_STATE: + + VideoDebugPrint((2, "VgaStartIO - RestoreHardwareState\n")); + + status = ERROR_INVALID_FUNCTION; + + break; + + + case IOCTL_VIDEO_SAVE_HARDWARE_STATE: + + VideoDebugPrint((2, "VgaStartIO - SaveHardwareState\n")); + + status = ERROR_INVALID_FUNCTION; + + break; + + case IOCTL_VIDEO_GET_BANK_SELECT_CODE: + + VideoDebugPrint((2, "VgaStartIO - GetBankSelectCode\n")); + + status = ERROR_INVALID_FUNCTION; + break; + + case IOCTL_VIDEO_QUERY_PUBLIC_ACCESS_RANGES: + { + VideoDebugPrint((2, "VgaStartIO - Query Public Address Ranges\n")); + + PVIDEO_PUBLIC_ACCESS_RANGES portAccess; + ULONG physicalPortLength; + + if (RequestPacket->OutputBufferLength < + sizeof(VIDEO_PUBLIC_ACCESS_RANGES)) + { + status = ERROR_INSUFFICIENT_BUFFER; + break; + } + + RequestPacket->StatusBlock->Information = + sizeof(VIDEO_PUBLIC_ACCESS_RANGES); + + portAccess = RequestPacket->OutputBuffer; + + // + // The first public access range is the IO ports. + // + + portAccess->VirtualAddress = (PVOID) NULL; + portAccess->InIoSpace = TRUE; + portAccess->MappedInIoSpace = portAccess->InIoSpace; + physicalPortLength = VGA_MAX_IO_PORT - VGA_BASE_IO_PORT + 1; + + status = VideoPortMapMemory(hwDeviceExtension, + VgaAccessRange->RangeStart, + &physicalPortLength, + &(portAccess->MappedInIoSpace), + &(portAccess->VirtualAddress)); +// eVb: 1.17 [GCG] - Fix lvalue error + portAccess->VirtualAddress = (PVOID)((ULONG_PTR)portAccess->VirtualAddress - VGA_BASE_IO_PORT); +// eVb: 1.17 [END] + VideoDebugPrint((2, "VgaStartIO - mapping ports to (%x)\n", portAccess->VirtualAddress)); + } + + break; + + case IOCTL_VIDEO_FREE_PUBLIC_ACCESS_RANGES: + + VideoDebugPrint((2, "VgaStartIO - Free Public Access Ranges\n")); + + status = ERROR_INVALID_FUNCTION; + break; + + // + // if we get here, an invalid IoControlCode was specified. + // + + default: + + VideoDebugPrint((0, "Fell through vga startIO routine - invalid command\n")); + + status = ERROR_INVALID_FUNCTION; + + break; + + } +// eVb: 1.9 [END] + RequestPacket->StatusBlock->Status = status; + + return TRUE; + +} // VgaStartIO() + + +//--------------------------------------------------------------------------- +// +// private routines +// + + +//--------------------------------------------------------------------------- +BOOLEAN +VgaIsPresent( + PHW_DEVICE_EXTENSION HwDeviceExtension + ) + +/*++ + +Routine Description: + + This routine returns TRUE if a VGA is present. Determining whether a VGA + is present is a two-step process. First, this routine walks bits through + the Bit Mask register, to establish that there are readable indexed + registers (EGAs normally don't have readable registers, and other adapters + are unlikely to have indexed registers). This test is done first because + it's a non-destructive EGA rejection test (correctly rejects EGAs, but + doesn't potentially mess up the screen or the accessibility of display + memory). Normally, this would be an adequate test, but some EGAs have + readable registers, so next, we check for the existence of the Chain4 bit + in the Memory Mode register; this bit doesn't exist in EGAs. It's + conceivable that there are EGAs with readable registers and a register bit + where Chain4 is stored, although I don't know of any; if a better test yet + is needed, memory could be written to in Chain4 mode, and then examined + plane by plane in non-Chain4 mode to make sure the Chain4 bit did what it's + supposed to do. However, the current test should be adequate to eliminate + just about all EGAs, and 100% of everything else. + + If this function fails to find a VGA, it attempts to undo any damage it + may have inadvertently done while testing. The underlying assumption for + the damage control is that if there's any non-VGA adapter at the tested + ports, it's an EGA or an enhanced EGA, because: a) I don't know of any + other adapters that use 3C4/5 or 3CE/F, and b), if there are other + adapters, I certainly don't know how to restore their original states. So + all error recovery is oriented toward putting an EGA back in a writable + state, so that error messages are visible. The EGA's state on entry is + assumed to be text mode, so the Memory Mode register is restored to the + default state for text mode. + + If a VGA is found, the VGA is returned to its original state after + testing is finished. + +Arguments: + + None. + +Return Value: + + TRUE if a VGA is present, FALSE if not. + +--*/ + +{ + UCHAR originalGCAddr; + UCHAR originalSCAddr; + UCHAR originalBitMask; + UCHAR originalReadMap; + UCHAR originalMemoryMode; + UCHAR testMask; + BOOLEAN returnStatus; + + // + // Remember the original state of the Graphics Controller Address register. + // + + originalGCAddr = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + + GRAPH_ADDRESS_PORT); + + // + // Write the Read Map register with a known state so we can verify + // that it isn't changed after we fool with the Bit Mask. This ensures + // that we're dealing with indexed registers, since both the Read Map and + // the Bit Mask are addressed at GRAPH_DATA_PORT. + // + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_ADDRESS_PORT, IND_READ_MAP); + + // + // If we can't read back the Graphics Address register setting we just + // performed, it's not readable and this isn't a VGA. + // + + if ((VideoPortReadPortUchar(HwDeviceExtension->IOAddress + + GRAPH_ADDRESS_PORT) & GRAPH_ADDR_MASK) != IND_READ_MAP) { + + return FALSE; + } + + // + // Set the Read Map register to a known state. + // + + originalReadMap = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + + GRAPH_DATA_PORT); + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_DATA_PORT, READ_MAP_TEST_SETTING); + + if (VideoPortReadPortUchar(HwDeviceExtension->IOAddress + + GRAPH_DATA_PORT) != READ_MAP_TEST_SETTING) { + + // + // The Read Map setting we just performed can't be read back; not a + // VGA. Restore the default Read Map state. + // + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_DATA_PORT, READ_MAP_DEFAULT); + + return FALSE; + } + + // + // Remember the original setting of the Bit Mask register. + // + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_ADDRESS_PORT, IND_BIT_MASK); + if ((VideoPortReadPortUchar(HwDeviceExtension->IOAddress + + GRAPH_ADDRESS_PORT) & GRAPH_ADDR_MASK) != IND_BIT_MASK) { + + // + // The Graphics Address register setting we just made can't be read + // back; not a VGA. Restore the default Read Map state. + // + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_ADDRESS_PORT, IND_READ_MAP); + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_DATA_PORT, READ_MAP_DEFAULT); + + return FALSE; + } + + originalBitMask = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + + GRAPH_DATA_PORT); + + // + // Set up the initial test mask we'll write to and read from the Bit Mask. + // + + testMask = 0xBB; + + do { + + // + // Write the test mask to the Bit Mask. + // + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_DATA_PORT, testMask); + + // + // Make sure the Bit Mask remembered the value. + // + + if (VideoPortReadPortUchar(HwDeviceExtension->IOAddress + + GRAPH_DATA_PORT) != testMask) { + + // + // The Bit Mask is not properly writable and readable; not a VGA. + // Restore the Bit Mask and Read Map to their default states. + // + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_DATA_PORT, BIT_MASK_DEFAULT); + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_ADDRESS_PORT, IND_READ_MAP); + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_DATA_PORT, READ_MAP_DEFAULT); + + return FALSE; + } + + // + // Cycle the mask for next time. + // + + testMask >>= 1; + + } while (testMask != 0); + + // + // There's something readable at GRAPH_DATA_PORT; now switch back and + // make sure that the Read Map register hasn't changed, to verify that + // we're dealing with indexed registers. + // + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_ADDRESS_PORT, IND_READ_MAP); + if (VideoPortReadPortUchar(HwDeviceExtension->IOAddress + + GRAPH_DATA_PORT) != READ_MAP_TEST_SETTING) { + + // + // The Read Map is not properly writable and readable; not a VGA. + // Restore the Bit Mask and Read Map to their default states, in case + // this is an EGA, so subsequent writes to the screen aren't garbled. + // + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_DATA_PORT, READ_MAP_DEFAULT); + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_ADDRESS_PORT, IND_BIT_MASK); + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_DATA_PORT, BIT_MASK_DEFAULT); + + return FALSE; + } + + // + // We've pretty surely verified the existence of the Bit Mask register. + // Put the Graphics Controller back to the original state. + // + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_DATA_PORT, originalReadMap); + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_ADDRESS_PORT, IND_BIT_MASK); + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_DATA_PORT, originalBitMask); + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + GRAPH_ADDRESS_PORT, originalGCAddr); + + // + // Now, check for the existence of the Chain4 bit. + // + + // + // Remember the original states of the Sequencer Address and Memory Mode + // registers. + // + + originalSCAddr = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + + SEQ_ADDRESS_PORT); + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + SEQ_ADDRESS_PORT, IND_MEMORY_MODE); + if ((VideoPortReadPortUchar(HwDeviceExtension->IOAddress + + SEQ_ADDRESS_PORT) & SEQ_ADDR_MASK) != IND_MEMORY_MODE) { + + // + // Couldn't read back the Sequencer Address register setting we just + // performed. + // + + return FALSE; + } + originalMemoryMode = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + + SEQ_DATA_PORT); + + // + // Toggle the Chain4 bit and read back the result. This must be done during + // sync reset, since we're changing the chaining state. + // + + // + // Begin sync reset. + // + + VideoPortWritePortUshort((PUSHORT)(HwDeviceExtension->IOAddress + + SEQ_ADDRESS_PORT), + (IND_SYNC_RESET + (START_SYNC_RESET_VALUE << 8))); + + // + // Toggle the Chain4 bit. + // + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + SEQ_ADDRESS_PORT, IND_MEMORY_MODE); + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + SEQ_DATA_PORT, (UCHAR)(originalMemoryMode ^ CHAIN4_MASK)); + + if (VideoPortReadPortUchar(HwDeviceExtension->IOAddress + + SEQ_DATA_PORT) != (UCHAR) (originalMemoryMode ^ CHAIN4_MASK)) { + + // + // Chain4 bit not there; not a VGA. + // Set text mode default for Memory Mode register. + // + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + SEQ_DATA_PORT, MEMORY_MODE_TEXT_DEFAULT); + // + // End sync reset. + // + + VideoPortWritePortUshort((PUSHORT) (HwDeviceExtension->IOAddress + + SEQ_ADDRESS_PORT), + (IND_SYNC_RESET + (END_SYNC_RESET_VALUE << 8))); + + returnStatus = FALSE; + + } else { + + // + // It's a VGA. + // + + // + // Restore the original Memory Mode setting. + // + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + SEQ_DATA_PORT, originalMemoryMode); + + // + // End sync reset. + // + + VideoPortWritePortUshort((PUSHORT)(HwDeviceExtension->IOAddress + + SEQ_ADDRESS_PORT), + (USHORT)(IND_SYNC_RESET + (END_SYNC_RESET_VALUE << 8))); + + // + // Restore the original Sequencer Address setting. + // + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + SEQ_ADDRESS_PORT, originalSCAddr); + + returnStatus = TRUE; + } + + return returnStatus; + +} // VgaIsPresent() + + +//--------------------------------------------------------------------------- +VP_STATUS +VgaSetPaletteReg( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_PALETTE_DATA PaletteBuffer, + ULONG PaletteBufferSize + ) + +/*++ + +Routine Description: + + This routine sets a specified portion of the EGA (not DAC) palette + registers. + +Arguments: + + HwDeviceExtension - Pointer to the miniport driver's device extension. + + PaletteBuffer - Pointer to the structure containing the palette data. + + PaletteBufferSize - Length of the input buffer supplied by the user. + +Return Value: + + NO_ERROR - information returned successfully + + ERROR_INSUFFICIENT_BUFFER - input buffer not large enough for input data. + + ERROR_INVALID_PARAMETER - invalid palette size. + +--*/ + +{ + USHORT i; + + // + // Check if the size of the data in the input buffer is large enough. + // + + if ((PaletteBufferSize) < (sizeof(VIDEO_PALETTE_DATA)) || + (PaletteBufferSize < (sizeof(VIDEO_PALETTE_DATA) + + (sizeof(USHORT) * (PaletteBuffer->NumEntries -1)) ))) { + + return ERROR_INSUFFICIENT_BUFFER; + + } + + // + // Check to see if the parameters are valid. + // + + if ( (PaletteBuffer->FirstEntry > VIDEO_MAX_COLOR_REGISTER ) || + (PaletteBuffer->NumEntries == 0) || + (PaletteBuffer->FirstEntry + PaletteBuffer->NumEntries > + VIDEO_MAX_PALETTE_REGISTER + 1 ) ) { + + return ERROR_INVALID_PARAMETER; + + } + + // + // Reset ATC to index mode + // + + VideoPortReadPortUchar(HwDeviceExtension->IOAddress + + ATT_INITIALIZE_PORT_COLOR); + + // + // Blast out our palette values. + // + + for (i = 0; i < PaletteBuffer->NumEntries; i++) { + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + ATT_ADDRESS_PORT, + (UCHAR)(i+PaletteBuffer->FirstEntry)); + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + ATT_DATA_WRITE_PORT, + (UCHAR)PaletteBuffer->Colors[i]); + } + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + ATT_ADDRESS_PORT, + VIDEO_ENABLE); + + return NO_ERROR; + +} // end VgaSetPaletteReg() + + +//--------------------------------------------------------------------------- +VP_STATUS +VgaSetColorLookup( + PHW_DEVICE_EXTENSION HwDeviceExtension, + PVIDEO_CLUT ClutBuffer, + ULONG ClutBufferSize + ) + +/*++ + +Routine Description: + + This routine sets a specified portion of the DAC color lookup table + settings. + +Arguments: + + HwDeviceExtension - Pointer to the miniport driver's device extension. + + ClutBufferSize - Length of the input buffer supplied by the user. + + ClutBuffer - Pointer to the structure containing the color lookup table. + +Return Value: + + NO_ERROR - information returned successfully + + ERROR_INSUFFICIENT_BUFFER - input buffer not large enough for input data. + + ERROR_INVALID_PARAMETER - invalid clut size. + +--*/ + +{ + PVIDEOMODE CurrentMode = HwDeviceExtension->CurrentMode; + USHORT i; + + // + // Check if the size of the data in the input buffer is large enough. + // + + if ( (ClutBufferSize < sizeof(VIDEO_CLUT) - sizeof(ULONG)) || + (ClutBufferSize < sizeof(VIDEO_CLUT) + + (sizeof(ULONG) * (ClutBuffer->NumEntries - 1)) ) ) { + + return ERROR_INSUFFICIENT_BUFFER; + + } + + // + // Check to see if the parameters are valid. + // + + if ( (ClutBuffer->NumEntries == 0) || + (ClutBuffer->FirstEntry > VIDEO_MAX_COLOR_REGISTER) || + (ClutBuffer->FirstEntry + ClutBuffer->NumEntries > + VIDEO_MAX_COLOR_REGISTER + 1) ) { + + return ERROR_INVALID_PARAMETER; + + } +// eVb: 1.14 [VBE] - Add VBE color support + // + // Check SVGA mode + // + + if (CurrentMode->bitsPerPlane >= 8) return VbeSetColorLookup(HwDeviceExtension, ClutBuffer); +// eVb: 1.14 [END] + // + // Path for VGA mode + // +// eVb: 1.15 [VBE] - Add VBE support for non-VGA-compatible detected modes + if (!CurrentMode->NonVgaMode) + { +// eVb: 1.15 [END] + // + // Set CLUT registers directly on the hardware + // + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + DAC_ADDRESS_WRITE_PORT, (UCHAR) ClutBuffer->FirstEntry); + + for (i = 0; i < ClutBuffer->NumEntries; i++) { + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + DAC_ADDRESS_WRITE_PORT, + (UCHAR)(i + ClutBuffer->FirstEntry)); + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + DAC_DATA_REG_PORT, + ClutBuffer->LookupTable[i].RgbArray.Red); + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + DAC_DATA_REG_PORT, + ClutBuffer->LookupTable[i].RgbArray.Green); + + VideoPortWritePortUchar(HwDeviceExtension->IOAddress + + DAC_DATA_REG_PORT, + ClutBuffer->LookupTable[i].RgbArray.Blue); + } + return NO_ERROR; + } + + return ERROR_INVALID_PARAMETER; + +} // end VgaSetColorLookup() + +VP_STATUS +GetDeviceDataCallback( + PVOID HwDeviceExtension, + PVOID Context, + VIDEO_DEVICE_DATA_TYPE DeviceDataType, + PVOID Identifier, + ULONG IdentifierLength, + PVOID ConfigurationData, + ULONG ConfigurationDataLength, + PVOID ComponentInformation, + ULONG ComponentInformationLength + ) + +/*++ + +Routine Description: + + Callback routine for the VideoPortGetDeviceData function. + +Arguments: + + HwDeviceExtension - Pointer to the miniport drivers device extension. + + Context - Context value passed to the VideoPortGetDeviceData function. + + DeviceDataType - The type of data that was requested in + VideoPortGetDeviceData. + + Identifier - Pointer to a string that contains the name of the device, + as setup by the ROM or ntdetect. + + IdentifierLength - Length of the Identifier string. + + ConfigurationData - Pointer to the configuration data for the device or + BUS. + + ConfigurationDataLength - Length of the data in the configurationData + field. + + ComponentInformation - Undefined. + + ComponentInformationLength - Undefined. + +Return Value: + + Returns NO_ERROR if the function completed properly. + Returns ERROR_DEV_NOT_EXIST if we did not find the device. + Returns ERROR_INVALID_PARAMETER otherwise. + +--*/ + +{ + VideoPortDebugPrint(Error, "Detected internal VGA chip on embedded board, todo\n"); + while (TRUE); + return NO_ERROR; + +} //end GetDeviceDataCallback() + +// eVb: 1.16 [RESOURCE] - Add new function for acquiring VGA resources (I/O, memory) +VP_STATUS +VgaAcquireResources( + PHW_DEVICE_EXTENSION DeviceExtension + ) +{ + VP_STATUS Status = NO_ERROR; + ULONG Ranges, i; + + // + // Try exclusive ranges (vga + ati) + // + + Ranges = NUM_VGA_ACCESS_RANGES; + for (i = 0; i < Ranges; i++) VgaAccessRange[i].RangeShareable = FALSE; + if (VideoPortVerifyAccessRanges(DeviceExtension, Ranges, VgaAccessRange) != NO_ERROR) + { + // + // Not worked, try vga only + // + + Ranges = 3; + if (VideoPortVerifyAccessRanges(DeviceExtension, Ranges, VgaAccessRange) != NO_ERROR) + { + // + // Still not, try shared ranges + // + + for (i = 0; i < Ranges; i++) VgaAccessRange[i].RangeShareable = TRUE; + Status = VideoPortVerifyAccessRanges(DeviceExtension, Ranges, VgaAccessRange); + if (Status == NO_ERROR) + { + // + // It did work + // + + VideoPortVerifyAccessRanges(DeviceExtension, 0, 0); + Status = NO_ERROR; + } + } + } + + if (Status == NO_ERROR) + { + // + // Worked with exclusive, also try shared + // + + for (i = 0; i < Ranges; i++) VgaAccessRange[i].RangeShareable = TRUE; + Status = VideoPortVerifyAccessRanges(DeviceExtension, Ranges, VgaAccessRange); + } + + return Status; +} +// eVb: 1.16 [END] diff --git a/reactos/drivers/video/miniport/vga_new/vga.h b/reactos/drivers/video/miniport/vga_new/vga.h new file mode 100644 index 00000000000..21e411584f8 --- /dev/null +++ b/reactos/drivers/video/miniport/vga_new/vga.h @@ -0,0 +1,446 @@ +/* + * PROJECT: ReactOS VGA Miniport Driver + * LICENSE: Microsoft NT4 DDK Sample Code License + * FILE: boot/drivers/video/miniport/vga/vga.h + * PURPOSE: Main Header File + * PROGRAMMERS: Copyright (c) 1992 Microsoft Corporation + * ReactOS Portable Systems Group + */ + +#include "ntdef.h" +#include "dderror.h" +#include "devioctl.h" +#include "miniport.h" +#include "ntddvdeo.h" +#include "video.h" +#include "cmdcnst.h" + +// +// Base address of VGA memory range. Also used as base address of VGA +// memory when loading a font, which is done with the VGA mapped at A0000. +// + +#define MEM_VGA 0xA0000 +#define MEM_VGA_SIZE 0x20000 + +// +// For memory mapped IO +// + +#define MEMORY_MAPPED_IO_OFFSET (0xB8000 - 0xA0000) + +// +// Port definitions for filling the ACCESS_RANGES structure in the miniport +// information, defines the range of I/O ports the VGA spans. +// There is a break in the IO ports - a few ports are used for the parallel +// port. Those cannot be defined in the ACCESS_RANGE, but are still mapped +// so all VGA ports are in one address range. +// + +#define VGA_BASE_IO_PORT 0x000003B0 +#define VGA_START_BREAK_PORT 0x000003BB +#define VGA_END_BREAK_PORT 0x000003C0 +#define VGA_MAX_IO_PORT 0x000003DF + +// +// VGA register definitions +// +// eVb: 3.1 [VGA] - Use offsets from the VGA Port Address instead of absolute +#define CRTC_ADDRESS_PORT_MONO 0x0004 // CRT Controller Address and +#define CRTC_DATA_PORT_MONO 0x0005 // Data registers in mono mode +#define FEAT_CTRL_WRITE_PORT_MONO 0x000A // Feature Control write port + // in mono mode +#define INPUT_STATUS_1_MONO 0x000A // Input Status 1 register read + // port in mono mode +#define ATT_INITIALIZE_PORT_MONO INPUT_STATUS_1_MONO + // Register to read to reset + // Attribute Controller index/data + +#define ATT_ADDRESS_PORT 0x0010 // Attribute Controller Address and +#define ATT_DATA_WRITE_PORT 0x0010 // Data registers share one port + // for writes, but only Address is + // readable at 0x3C0 +#define ATT_DATA_READ_PORT 0x0011 // Attribute Controller Data reg is + // readable here +#define MISC_OUTPUT_REG_WRITE_PORT 0x0012 // Miscellaneous Output reg write + // port +#define INPUT_STATUS_0_PORT 0x0012 // Input Status 0 register read + // port +#define VIDEO_SUBSYSTEM_ENABLE_PORT 0x0013 // Bit 0 enables/disables the + // entire VGA subsystem +#define SEQ_ADDRESS_PORT 0x0014 // Sequence Controller Address and +#define SEQ_DATA_PORT 0x0015 // Data registers +#define DAC_PIXEL_MASK_PORT 0x0016 // DAC pixel mask reg +#define DAC_ADDRESS_READ_PORT 0x0017 // DAC register read index reg, + // write-only +#define DAC_STATE_PORT 0x0017 // DAC state (read/write), + // read-only +#define DAC_ADDRESS_WRITE_PORT 0x0018 // DAC register write index reg +#define DAC_DATA_REG_PORT 0x0019 // DAC data transfer reg +#define FEAT_CTRL_READ_PORT 0x001A // Feature Control read port +#define MISC_OUTPUT_REG_READ_PORT 0x001C // Miscellaneous Output reg read + // port +#define GRAPH_ADDRESS_PORT 0x001E // Graphics Controller Address +#define GRAPH_DATA_PORT 0x001F // and Data registers + +#define CRTC_ADDRESS_PORT_COLOR 0x0024 // CRT Controller Address and +#define CRTC_DATA_PORT_COLOR 0x0025 // Data registers in color mode +#define FEAT_CTRL_WRITE_PORT_COLOR 0x002A // Feature Control write port +#define INPUT_STATUS_1_COLOR 0x002A // Input Status 1 register read + // port in color mode +// eVb: 3.2 [END] +#define ATT_INITIALIZE_PORT_COLOR INPUT_STATUS_1_COLOR + // Register to read to reset + // Attribute Controller index/data + // toggle in color mode + +// +// Offsets in HardwareStateHeader->PortValue[] of save areas for non-indexed +// VGA registers. +// + +#define CRTC_ADDRESS_MONO_OFFSET 0x04 +#define FEAT_CTRL_WRITE_MONO_OFFSET 0x0A +#define ATT_ADDRESS_OFFSET 0x10 +#define MISC_OUTPUT_REG_WRITE_OFFSET 0x12 +#define VIDEO_SUBSYSTEM_ENABLE_OFFSET 0x13 +#define SEQ_ADDRESS_OFFSET 0x14 +#define DAC_PIXEL_MASK_OFFSET 0x16 +#define DAC_STATE_OFFSET 0x17 +#define DAC_ADDRESS_WRITE_OFFSET 0x18 +#define GRAPH_ADDRESS_OFFSET 0x1E +#define CRTC_ADDRESS_COLOR_OFFSET 0x24 +#define FEAT_CTRL_WRITE_COLOR_OFFSET 0x2A + + // toggle in color mode +// +// VGA indexed register indexes. +// + +// CL-GD542x specific registers: +// +#define IND_CL_EXTS_ENB 0x06 // index in Sequencer to enable exts +#define IND_NORD_SCRATCH_PAD 0x09 // index in Seq of Nordic scratch pad +#define IND_CL_SCRATCH_PAD 0x0A // index in Seq of 542x scratch pad +#define IND_ALP_SCRATCH_PAD 0x15 // index in Seq of Alpine scratch pad +#define IND_CL_REV_REG 0x25 // index in CRTC of ID Register +#define IND_CL_ID_REG 0x27 // index in CRTC of ID Register +// +#define IND_CURSOR_START 0x0A // index in CRTC of the Cursor Start +#define IND_CURSOR_END 0x0B // and End registers +#define IND_CURSOR_HIGH_LOC 0x0E // index in CRTC of the Cursor Location +#define IND_CURSOR_LOW_LOC 0x0F // High and Low Registers +#define IND_VSYNC_END 0x11 // index in CRTC of the Vertical Sync + // End register, which has the bit + // that protects/unprotects CRTC + // index registers 0-7 +#define IND_CR2C 0x2C // Nordic LCD Interface Register +#define IND_CR2D 0x2D // Nordic LCD Display Control +#define IND_SET_RESET_ENABLE 0x01 // index of Set/Reset Enable reg in GC +#define IND_DATA_ROTATE 0x03 // index of Data Rotate reg in GC +#define IND_READ_MAP 0x04 // index of Read Map reg in Graph Ctlr +#define IND_GRAPH_MODE 0x05 // index of Mode reg in Graph Ctlr +#define IND_GRAPH_MISC 0x06 // index of Misc reg in Graph Ctlr +#define IND_BIT_MASK 0x08 // index of Bit Mask reg in Graph Ctlr +#define IND_SYNC_RESET 0x00 // index of Sync Reset reg in Seq +#define IND_MAP_MASK 0x02 // index of Map Mask in Sequencer +#define IND_MEMORY_MODE 0x04 // index of Memory Mode reg in Seq +#define IND_CRTC_PROTECT 0x11 // index of reg containing regs 0-7 in + // CRTC +#define IND_CRTC_COMPAT 0x34 // index of CRTC Compatibility reg + // in CRTC +#define IND_PERF_TUNING 0x16 // index of performance tuning in Seq +#define START_SYNC_RESET_VALUE 0x01 // value for Sync Reset reg to start + // synchronous reset +#define END_SYNC_RESET_VALUE 0x03 // value for Sync Reset reg to end + // synchronous reset + +// +// Value to write to Extensions Control register values extensions. +// + +#define CL64xx_EXTENSION_ENABLE_INDEX 0x0A // GR0A to be exact! +#define CL64xx_EXTENSION_ENABLE_VALUE 0xEC +#define CL64xx_EXTENSION_DISABLE_VALUE 0xCE +#define CL64xx_TRISTATE_CONTROL_REG 0xA1 + +#define CL6340_ENABLE_READBACK_REGISTER 0xE0 +#define CL6340_ENABLE_READBACK_ALLSEL_VALUE 0xF0 +#define CL6340_ENABLE_READBACK_OFF_VALUE 0x00 +#define CL6340_IDENTIFICATION_REGISTER 0xE9 +// +// Values for Attribute Controller Index register to turn video off +// and on, by setting bit 5 to 0 (off) or 1 (on). +// + +#define VIDEO_DISABLE 0 +#define VIDEO_ENABLE 0x20 + +#define INDEX_ENABLE_AUTO_START 0x31 + +// Masks to keep only the significant bits of the Graphics Controller and +// Sequencer Address registers. Masking is necessary because some VGAs, such +// as S3-based ones, don't return unused bits set to 0, and some SVGAs use +// these bits if extensions are enabled. +// + +#define GRAPH_ADDR_MASK 0x0F +#define SEQ_ADDR_MASK 0x07 + +// +// Mask used to toggle Chain4 bit in the Sequencer's Memory Mode register. +// + +#define CHAIN4_MASK 0x08 + +// +// Value written to the Read Map register when identifying the existence of +// a VGA in VgaInitialize. This value must be different from the final test +// value written to the Bit Mask in that routine. +// + +#define READ_MAP_TEST_SETTING 0x03 + +// +// Default text mode setting for various registers, used to restore their +// states if VGA detection fails after they've been modified. +// + +#define MEMORY_MODE_TEXT_DEFAULT 0x02 +#define BIT_MASK_DEFAULT 0xFF +#define READ_MAP_DEFAULT 0x00 + + +// +// Palette-related info. +// + +// +// Highest valid DAC color register index. +// + +#define VIDEO_MAX_COLOR_REGISTER 0xFF + +// +// Highest valid palette register index +// + +#define VIDEO_MAX_PALETTE_REGISTER 0x0F + +// +// Driver Specific Attribute Flags +// + +#define CAPS_NO_HOST_XFER 0x00000002 // Do not use host xfers to + // the blt engine. +#define CAPS_SW_POINTER 0x00000004 // Use software pointer. +#define CAPS_TRUE_COLOR 0x00000008 // Set upper color registers. +#define CAPS_MM_IO 0x00000010 // Use memory mapped IO. +#define CAPS_BLT_SUPPORT 0x00000020 // BLTs are supported +#define CAPS_IS_542x 0x00000040 // This is a 542x +#define CAPS_IS_5436 0x00000080 // This is a 5436 +#define CAPS_CURSOR_VERT_EXP 0x00000100 // Flag set if 8x6 panel, + // but 6x4 resolution + +// +// Structure used to describe each video mode in ModesVGA[]. +// + +typedef struct { + USHORT fbType; // color or monochrome, text or graphics, via + // VIDEO_MODE_COLOR and VIDEO_MODE_GRAPHICS + USHORT numPlanes; // # of video memory planes + USHORT bitsPerPlane; // # of bits of color in each plane + SHORT col; // # of text columns across screen with default font + SHORT row; // # of text rows down screen with default font + USHORT hres; // # of pixels across screen + USHORT vres; // # of scan lines down screen +// eVb: 3.2 [VGA] - Store frequency next to resolution data + ULONG Frequency; // Vertical Frequency +// eVb: 3.2 [END] + USHORT wbytes; // # of bytes from start of one scan line to start of next + ULONG sbytes; // total size of addressable display memory in bytes +// eVb: 3.3 [VBE] - Add VBE mode and bank flag + ULONG NoBankSwitch; + ULONG Mode; +// eVb: 3.3 [VBE] + PUSHORT CmdStream; // pointer to array of register-setting commands to + // set up mode +// eVb: 3.4 [VBE] - Add fields to track linear addresses/sizes and flags + ULONG PhysBase; + ULONG FrameBufferBase; + ULONG FrameBufferSize; + ULONG PhysSize; + ULONG LogicalWidth; + ULONG NonVgaMode; + ULONG Granularity; +// eVb: 3.4 [END] +} VIDEOMODE, *PVIDEOMODE; + +// +// Mode into which to put the VGA before starting a VDM, so it's a plain +// vanilla VGA. (This is the mode's index in ModesVGA[], currently standard +// 80x25 text mode.) +// + +#define DEFAULT_MODE 0 + + +// +// Info used by the Validator functions and save/restore code. +// Structure used to trap register accesses that must be done atomically. +// + +#define VGA_MAX_VALIDATOR_DATA 100 + +#define VGA_VALIDATOR_UCHAR_ACCESS 1 +#define VGA_VALIDATOR_USHORT_ACCESS 2 +#define VGA_VALIDATOR_ULONG_ACCESS 3 + +typedef struct _VGA_VALIDATOR_DATA { + ULONG Port; + UCHAR AccessType; + ULONG Data; +} VGA_VALIDATOR_DATA, *PVGA_VALIDATOR_DATA; + +// +// Number of bytes to save in each plane. +// + +#define VGA_PLANE_SIZE 0x10000 + +// +// Number of each type of indexed register in a standard VGA, used by +// validator and state save/restore functions. +// +// Note: VDMs currently only support basic VGAs only. +// + +#define VGA_NUM_SEQUENCER_PORTS 5 +#define VGA_NUM_CRTC_PORTS 25 +#define VGA_NUM_GRAPH_CONT_PORTS 9 +#define VGA_NUM_ATTRIB_CONT_PORTS 21 +#define VGA_NUM_DAC_ENTRIES 256 + +#define EXT_NUM_GRAPH_CONT_PORTS 0 +#define EXT_NUM_SEQUENCER_PORTS 0 +#define EXT_NUM_CRTC_PORTS 0 +#define EXT_NUM_ATTRIB_CONT_PORTS 0 +#define EXT_NUM_DAC_ENTRIES 0 + +// +// These constants determine the offsets within the +// VIDEO_HARDWARE_STATE_HEADER structure that are used to save and +// restore the VGA's state. +// + +#define VGA_HARDWARE_STATE_SIZE sizeof(VIDEO_HARDWARE_STATE_HEADER) + +#define VGA_BASIC_SEQUENCER_OFFSET (VGA_HARDWARE_STATE_SIZE + 0) +#define VGA_BASIC_CRTC_OFFSET (VGA_BASIC_SEQUENCER_OFFSET + \ + VGA_NUM_SEQUENCER_PORTS) +#define VGA_BASIC_GRAPH_CONT_OFFSET (VGA_BASIC_CRTC_OFFSET + \ + VGA_NUM_CRTC_PORTS) +#define VGA_BASIC_ATTRIB_CONT_OFFSET (VGA_BASIC_GRAPH_CONT_OFFSET + \ + VGA_NUM_GRAPH_CONT_PORTS) +#define VGA_BASIC_DAC_OFFSET (VGA_BASIC_ATTRIB_CONT_OFFSET + \ + VGA_NUM_ATTRIB_CONT_PORTS) +#define VGA_BASIC_LATCHES_OFFSET (VGA_BASIC_DAC_OFFSET + \ + (3 * VGA_NUM_DAC_ENTRIES)) + +#define VGA_EXT_SEQUENCER_OFFSET (VGA_BASIC_LATCHES_OFFSET + 4) +#define VGA_EXT_CRTC_OFFSET (VGA_EXT_SEQUENCER_OFFSET + \ + EXT_NUM_SEQUENCER_PORTS) +#define VGA_EXT_GRAPH_CONT_OFFSET (VGA_EXT_CRTC_OFFSET + \ + EXT_NUM_CRTC_PORTS) +#define VGA_EXT_ATTRIB_CONT_OFFSET (VGA_EXT_GRAPH_CONT_OFFSET +\ + EXT_NUM_GRAPH_CONT_PORTS) +#define VGA_EXT_DAC_OFFSET (VGA_EXT_ATTRIB_CONT_OFFSET + \ + EXT_NUM_ATTRIB_CONT_PORTS) + +#define VGA_VALIDATOR_OFFSET (VGA_EXT_DAC_OFFSET + 4 * EXT_NUM_DAC_ENTRIES) + +#define VGA_VALIDATOR_AREA_SIZE sizeof (ULONG) + (VGA_MAX_VALIDATOR_DATA * \ + sizeof (VGA_VALIDATOR_DATA)) + \ + sizeof (ULONG) + \ + sizeof (ULONG) + \ + sizeof (PVIDEO_ACCESS_RANGE) + +#define VGA_MISC_DATA_AREA_OFFSET VGA_VALIDATOR_OFFSET + VGA_VALIDATOR_AREA_SIZE + +#define VGA_MISC_DATA_AREA_SIZE 0 + +#define VGA_PLANE_0_OFFSET VGA_MISC_DATA_AREA_OFFSET + VGA_MISC_DATA_AREA_SIZE + +#define VGA_PLANE_1_OFFSET VGA_PLANE_0_OFFSET + VGA_PLANE_SIZE +#define VGA_PLANE_2_OFFSET VGA_PLANE_1_OFFSET + VGA_PLANE_SIZE +#define VGA_PLANE_3_OFFSET VGA_PLANE_2_OFFSET + VGA_PLANE_SIZE + +// +// Space needed to store all state data. +// + +#define VGA_TOTAL_STATE_SIZE VGA_PLANE_3_OFFSET + VGA_PLANE_SIZE + + +// +// Device extension for the driver object. This data is only used +// locally, so this structure can be added to as needed. +// + +typedef struct _HW_DEVICE_EXTENSION { + + PHYSICAL_ADDRESS PhysicalVideoMemoryBase; // physical memory address and + PHYSICAL_ADDRESS PhysicalFrameOffset; // physical memory address and + ULONG PhysicalVideoMemoryLength; // length of display memory + ULONG PhysicalFrameLength; // length of display memory for + // the current mode. + + PUCHAR IOAddress; // base I/O address of VGA ports + PUCHAR VideoMemoryAddress; // base virtual memory address of VGA memory + ULONG ModeIndex; // index of current mode in ModesVGA[] + PVIDEOMODE CurrentMode; // pointer to VIDEOMODE structure for + // current mode + + VIDEO_CURSOR_POSITION CursorPosition; // current cursor position + + UCHAR CursorEnable; // whether cursor is enabled or not + UCHAR CursorTopScanLine; // Cursor Start register setting (top scan) + UCHAR CursorBottomScanLine; // Cursor End register setting (bottom scan) +// eVb: 3.5 [VBE] - Add fields for VBE support and XP+ INT10 interface + VIDEO_PORT_INT10_INTERFACE Int10Interface; + BOOLEAN VesaBiosOk; +// eVb: 3.5 [END] +} HW_DEVICE_EXTENSION, *PHW_DEVICE_EXTENSION; + + +// +// Function prototypes. +// + +// +// Entry points for the VGA validator. Used in VgaEmulatorAccessEntries[]. +// + + +// +// Vga init scripts for font loading +// + +extern USHORT EnableA000Data[]; +extern USHORT DisableA000Color[]; + +// +// Mode Information +// + +extern ULONG NumVideoModes; +extern VIDEOMODE ModesVGA[]; +extern PVIDEOMODE VgaModeList; + +// eVb: 3.5 [VGA] - Add ATI/Mach64 Access Range +#define NUM_VGA_ACCESS_RANGES 5 +// eVb: 3.5 [END] +extern VIDEO_ACCESS_RANGE VgaAccessRange[]; + +#include "vbe.h" diff --git a/reactos/drivers/video/miniport/vga_new/vga.rbuild b/reactos/drivers/video/miniport/vga_new/vga.rbuild new file mode 100644 index 00000000000..622440d4423 --- /dev/null +++ b/reactos/drivers/video/miniport/vga_new/vga.rbuild @@ -0,0 +1,18 @@ + + + + . + videoprt + libcntpr + modeset.c + vgadata.c + vga.c + vbemodes.c + vbe.c + vga.rc + vga.h + + -mrtd + -fno-builtin + + diff --git a/reactos/drivers/video/miniport/vga_new/vga.rc b/reactos/drivers/video/miniport/vga_new/vga.rc new file mode 100644 index 00000000000..4aac6fdcae3 --- /dev/null +++ b/reactos/drivers/video/miniport/vga_new/vga.rc @@ -0,0 +1,5 @@ +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "VGA Miniport Device Driver\0" +#define REACTOS_STR_INTERNAL_NAME "vga\0" +#define REACTOS_STR_ORIGINAL_FILENAME "vga.sys\0" +#include diff --git a/reactos/drivers/video/miniport/vga_new/vgadata.c b/reactos/drivers/video/miniport/vga_new/vgadata.c new file mode 100644 index 00000000000..6f9ea0f1c61 --- /dev/null +++ b/reactos/drivers/video/miniport/vga_new/vgadata.c @@ -0,0 +1,490 @@ +/* + * PROJECT: ReactOS VGA Miniport Driver + * LICENSE: Microsoft NT4 DDK Sample Code License + * FILE: boot/drivers/video/miniport/vga/vgadata.c + * PURPOSE: Handles switching to VGA Modes and holds VGA Built-in Modes + * PROGRAMMERS: Copyright (c) 1992 Microsoft Corporation + * ReactOS Portable Systems Group + */ + +#include "vga.h" + +// +// This structure describes to which ports access is required. +// + +VIDEO_ACCESS_RANGE VgaAccessRange[] = { +{ + {{VGA_BASE_IO_PORT, 0x00000000}}, // 64-bit linear base address + // of range + VGA_START_BREAK_PORT - VGA_BASE_IO_PORT + 1, // # of ports + 1, // range is in I/O space + 1, // range should be visible + 0 // range should be shareable +}, +{ + {{VGA_END_BREAK_PORT, 0x00000000}}, + VGA_MAX_IO_PORT - VGA_END_BREAK_PORT + 1, + 1, + 1, + 0 +}, + +// +// This next region also includes Memory mapped IO. In MMIO, the ports are +// repeated every 256 bytes from b8000 to bff00. +// + +{ + {{MEM_VGA, 0x00000000}}, + MEM_VGA_SIZE, + 0, + 1, + 0 +}, +// eVb: 4.1 [VGA] - Add ATI/Mach64 VGA registers +// +// ATI Registers +// + +{ + {{0x1CE, 0x00000000}}, + 2, + 1, + 1, + 0 +}, +{ + {{0x2E8, 0x00000000}}, + 8, + 1, + 1, + 0 +} +// eVb: 4.1 [END] +}; + +// +// 640x480 256-color 60Hz mode (BIOS mode 12) set command string for +// VGA. +// +// eVb: 4.2 [VGA] - Add VGA command streams instead of Cirrus +USHORT VGA_640x480[] = { + OWM, // begin setmode + SEQ_ADDRESS_PORT, + 5, // count + 0x100, // start sync reset + 0x0101,0x0F02,0x0003,0x0604, // program up sequencer + + OB, // misc. register + MISC_OUTPUT_REG_WRITE_PORT, + 0xE3, + + OW, // text/graphics bit + GRAPH_ADDRESS_PORT, + 0x506, + + OW, // end sync reset + SEQ_ADDRESS_PORT, + IND_SYNC_RESET, + + OB, + SEQ_DATA_PORT, + END_SYNC_RESET_VALUE, + + OW, // unprotect crtc 0-7 + CRTC_ADDRESS_PORT_COLOR, + 0x511, + + METAOUT+INDXOUT, // program gdc registers + GRAPH_ADDRESS_PORT, + VGA_NUM_CRTC_PORTS,0, // count, startindex + 0x5F,0x4F,0x50,0x82,0x54,0x80,0x0B,0x3E,0x00,0x40,0x0,0x0,0x0,0x0,0x0,0x0, + 0xEA,0x8C,0xDF,0x28,0x0,0xE7,0x4,0xE3,0xFF, + + IB, // prepare atc for writing + INPUT_STATUS_1_COLOR, + + METAOUT+ATCOUT, // program atc registers + ATT_ADDRESS_PORT, + VGA_NUM_ATTRIB_CONT_PORTS,0, // count, startindex + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x17, 0x38, 0x39, 0x3A, 0x3B, 0x3C, + 0x3D, 0x3E, 0x3F, 0x3F, 0x01, 0x00, + 0x0F, 0x00, 0x00, + + METAOUT+INDXOUT, // program gdc registers + GRAPH_ADDRESS_PORT, + VGA_NUM_GRAPH_CONT_PORTS,0, // count, startindex + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x05, 0x0F, 0xFF, + + OB, + DAC_PIXEL_MASK_PORT, + 0xFF, + + IB, // prepare atc for writing + INPUT_STATUS_1_COLOR, + + OB, // turn video on. + ATT_ADDRESS_PORT, + VIDEO_ENABLE, + + EOD +}; + +// +// 720x400 color text mode (BIOS mode 3) set command string for +// VGA. +// + +USHORT VGA_TEXT_0[] = { + OWM, // begin setmode + SEQ_ADDRESS_PORT, + 5, // count + 0x100, // start sync reset + 0x0101,0x0302,0x0003,0x0204, // program up sequencer + + OB, // misc. register + MISC_OUTPUT_REG_WRITE_PORT, + 0x67, + + OW, // text/graphics bit + GRAPH_ADDRESS_PORT, + 0x0e06, + + OW, // end sync reset + SEQ_ADDRESS_PORT, + IND_SYNC_RESET, + + OB, + SEQ_DATA_PORT, + END_SYNC_RESET_VALUE, + + OW, // unprotect crtc 0-7 + CRTC_ADDRESS_PORT_COLOR, + 0xE11, + + METAOUT+INDXOUT, // program gdc registers + GRAPH_ADDRESS_PORT, + VGA_NUM_CRTC_PORTS,0, // count, startindex + 0x5F,0x4F,0x50,0x82,0x55,0x81,0xBF,0x1F,0x00,0x4F,0xD,0xE,0x0,0x0,0x0,0x0, + 0x9c,0x8E,0x8F,0x28,0x1F,0x96,0xB9,0xA3,0xFF, + + IB, // prepare atc for writing + INPUT_STATUS_1_COLOR, + + METAOUT+ATCOUT, // program atc registers + ATT_ADDRESS_PORT, + VGA_NUM_ATTRIB_CONT_PORTS,0, // count, startindex + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x17, 0x38, 0x39, 0x3A, 0x3B, 0x3C, + 0x3D, 0x3E, 0x3F, 0x3F, 0x04, 0x00, + 0x0F, 0x08, 0x00, + + METAOUT+INDXOUT, // program gdc registers + GRAPH_ADDRESS_PORT, + VGA_NUM_GRAPH_CONT_PORTS,0, // count, startindex + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x0E, 0x00, 0xFF, + + OB, + DAC_PIXEL_MASK_PORT, + 0xFF, + + IB, // prepare atc for writing + INPUT_STATUS_1_COLOR, + + OB, // turn video on. + ATT_ADDRESS_PORT, + VIDEO_ENABLE, + + EOD +}; + +// +// 640x400 color text mode (BIOS mode 3) set command string for +// VGA. +// + +USHORT VGA_TEXT_1[] = { + OWM, // begin setmode + SEQ_ADDRESS_PORT, + 5, // count + 0x100, // start sync reset + 0x0101,0x0302,0x0003,0x0204, // program up sequencer + + OB, // misc. register + MISC_OUTPUT_REG_WRITE_PORT, + 0xA3, + + OW, // text/graphics bit + GRAPH_ADDRESS_PORT, + 0x0e06, + + OW, // end sync reset + SEQ_ADDRESS_PORT, + IND_SYNC_RESET, + + OB, + SEQ_DATA_PORT, + END_SYNC_RESET_VALUE, + + OW, // unprotect crtc 0-7 + CRTC_ADDRESS_PORT_COLOR, + 0x511, + + METAOUT+INDXOUT, // program gdc registers + GRAPH_ADDRESS_PORT, + VGA_NUM_CRTC_PORTS,0, // count, startindex + 0x5F,0x4F,0x50,0x82,0x55,0x81,0xBF,0x1F,0x00,0x4D,0xB,0xC,0x0,0x0,0x0,0x0, + 0x83,0x85,0x5D,0x28,0x1F,0x63,0xBA,0xA3,0xFF, + + IB, // prepare atc for writing + INPUT_STATUS_1_COLOR, + + METAOUT+ATCOUT, // program atc registers + ATT_ADDRESS_PORT, + VGA_NUM_ATTRIB_CONT_PORTS,0, // count, startindex + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, + 0x17, 0x38, 0x39, 0x3A, 0x3B, 0x3C, + 0x3D, 0x3E, 0x3F, 0x3F, 0x04, 0x00, + 0x0F, 0x00, 0x00, + + METAOUT+INDXOUT, // program gdc registers + GRAPH_ADDRESS_PORT, + VGA_NUM_GRAPH_CONT_PORTS,0, // count, startindex + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x0E, 0x00, 0xFF, + + OB, + DAC_PIXEL_MASK_PORT, + 0xFF, + + IB, // prepare atc for writing + INPUT_STATUS_1_COLOR, + + OB, // turn video on. + ATT_ADDRESS_PORT, + VIDEO_ENABLE, + + EOD +}; +// eVb: 4.2 [END] +// +// Video mode table - contains information and commands for initializing each +// mode. These entries must correspond with those in VIDEO_MODE_VGA. The first +// entry is commented; the rest follow the same format, but are not so +// heavily commented. +// +// eVb: 4.3 [VGA] - Add VGA, ModeX and SVGA mode instead of Cirrus Modes +VIDEOMODE ModesVGA[] = +{ + // Color text mode 3, 720x400, 9x16 char cell (VGA). + // + { + VIDEO_MODE_BANKED | VIDEO_MODE_COLOR, // flags that this mode is a color mode, but not graphics + 4, // four planes + 1, // one bit of colour per plane + 80, 25, // 80x25 text resolution + 720, 400, // 720x400 pixels on screen + 1, // only support one frequency, non-interlaced + 160, 0x10000, // 160 bytes per scan line, 64K of CPU-addressable bitmap + FALSE, + 0x3, VGA_TEXT_0, // Mode 3, I/O initialization stream + 0xA0000, // Physical address at 0xA0000 + 0x18000, 0x8000, + 0x20000, // 2 banks of 64K, 128KB total memory + 720, // 720 pixels per scan line + FALSE, + 0 + }, + + // + // Color text mode 3, 640x350, 8x14 char cell (EGA). + // + { + VIDEO_MODE_BANKED | VIDEO_MODE_COLOR, + 4, 1, + 80, 25, + 640, 350, + 1, + 160, 0x10000, + FALSE, + 0x3, VGA_TEXT_1, + 0xA0000, + 0x18000, 0x8000, + 0x20000, + 640, + FALSE, + 0 + }, + + // + // + // Standard VGA Color graphics mode 0x12, 640x480 16 colors. + // + { + VIDEO_MODE_BANKED | VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, + 4, 1, + 80, 30, + 640, 480, + 1, + 80, 0x10000, + FALSE, + 0x12, VGA_640x480, + 0xA0000, + 0, 0x20000, + 0x20000, + 640, + FALSE, + 0 + }, + + { + VIDEO_MODE_BANKED | VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, + 8, 1, + 0, 0, + 320, 200, + 70, + 80, 0x10000, + FALSE, + 0x3, NULL, + 0xA0000, + 0, 0x20000, + 0x20000, + 320, + FALSE, + 0 + }, + + { + VIDEO_MODE_BANKED | VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, + 8, 1, + 0, 0, + 320, 240, + 60, + 80, 0x10000, + FALSE, + 0x3, NULL, + 0xA0000, + 0, 0x20000, + 0x20000, + 320, + FALSE, + 0 + }, + + { + VIDEO_MODE_BANKED | VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, + 8, 1, + 0, 0, + 320, 400, + 70, + 80, 0x10000, + FALSE, + 0x3, NULL, + 0xA0000, + 0, 0x20000, + 0x20000, + 320, + FALSE, + 0 + }, + + { + VIDEO_MODE_BANKED | VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, + 8, 1, + 0, 0, + 320, 480, + 60, + 80, 0x10000, + FALSE, + 0x3, NULL, + 0xA0000, + 0, 0x20000, + 0x20000, + 320, + FALSE, + 0 + }, + + // + // 800x600 16 colors. + // + { + VIDEO_MODE_BANKED | VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS, + 4, 1, + 100, 37, + 800, 600, + 1, + 100, 0x10000, + FALSE, + (0x102 << 16) | VBE_SET_VBE_MODE, NULL, + 0xA0000, + 0, 0x20000, + 0x20000, + 800, + FALSE, + 0 + }, +}; + +ULONG NumVideoModes = sizeof(ModesVGA) / sizeof(VIDEOMODE); +PVIDEOMODE VgaModeList; +// eVb: 4.3 [END] + +// +// +// Data used to set the Graphics and Sequence Controllers to put the +// VGA into a planar state at A0000 for 64K, with plane 2 enabled for +// reads and writes, so that a font can be loaded, and to disable that mode. +// + +// Settings to enable planar mode with plane 2 enabled. +// + +USHORT EnableA000Data[] = { + OWM, + SEQ_ADDRESS_PORT, + 1, + 0x0100, + + OWM, + GRAPH_ADDRESS_PORT, + 3, + 0x0204, // Read Map = plane 2 + 0x0005, // Graphics Mode = read mode 0, write mode 0 + 0x0406, // Graphics Miscellaneous register = A0000 for 64K, not odd/even, + // graphics mode + OWM, + SEQ_ADDRESS_PORT, + 3, + 0x0402, // Map Mask = write to plane 2 only + 0x0404, // Memory Mode = not odd/even, not full memory, graphics mode + 0x0300, // end sync reset + EOD +}; + +// +// Settings to disable the font-loading planar mode. +// + +USHORT DisableA000Color[] = { + OWM, + SEQ_ADDRESS_PORT, + 1, + 0x0100, + + OWM, + GRAPH_ADDRESS_PORT, + 3, + 0x0004, 0x1005, 0x0E06, + + OWM, + SEQ_ADDRESS_PORT, + 3, + 0x0302, 0x0204, 0x0300, // end sync reset + EOD + +}; diff --git a/reactos/drivers/video/miniport/vmx_svga/precomp.h b/reactos/drivers/video/miniport/vmx_svga/precomp.h index 245d90116c2..a8f8a82705c 100644 --- a/reactos/drivers/video/miniport/vmx_svga/precomp.h +++ b/reactos/drivers/video/miniport/vmx_svga/precomp.h @@ -5,8 +5,8 @@ * PURPOSE: VMWARE SVGA-II Driver Header * PROGRAMMERS: ReactOS Portable Systems Group */ - -#include + +#include #include #include #include @@ -20,13 +20,13 @@ typedef struct _HW_DEVICE_EXTENSION LARGE_INTEGER VramSize; PHYSICAL_ADDRESS VramBase; ULONG MemSize; - ULONG IndexPort; - ULONG ValuePort; + PULONG IndexPort; + PULONG ValuePort; PVOID FrameBufferBase; PVOID Fifo; ULONG InterruptPort; ULONG InterruptState; - PKEVENT SyncEvent; + PENG_EVENT SyncEvent; VIDEO_MODE_INFORMATION CurrentMode; ULONG VideoModeCount; ULONG Capabilities; diff --git a/reactos/drivers/video/miniport/vmx_svga/vmx_svga.c b/reactos/drivers/video/miniport/vmx_svga/vmx_svga.c index ca5cab49f67..3c981c59be1 100644 --- a/reactos/drivers/video/miniport/vmx_svga/vmx_svga.c +++ b/reactos/drivers/video/miniport/vmx_svga/vmx_svga.c @@ -9,13 +9,76 @@ /* INCLUDES *******************************************************************/ #include "precomp.h" +#include "debug.h" /* GLOBALS ********************************************************************/ PHW_DEVICE_EXTENSION VmxDeviceExtensionArray[SVGA_MAX_DISPLAYS]; +static PWCHAR AdapterString = L"VMware SVGA II"; /* FUNCTIONS ******************************************************************/ +ULONG +NTAPI +VmxReadUlong(IN PHW_DEVICE_EXTENSION DeviceExtension, + IN ULONG Index) +{ + /* Program the index first, then read the value */ + VideoPortWritePortUlong(DeviceExtension->IndexPort, Index); + return VideoPortReadPortUlong(DeviceExtension->ValuePort); +} + +VOID +NTAPI +VmxWriteUlong(IN PHW_DEVICE_EXTENSION DeviceExtension, + IN ULONG Index, + IN ULONG Value) +{ + /* Program the index first, then write the value */ + VideoPortWritePortUlong(DeviceExtension->IndexPort, Index); + VideoPortWritePortUlong(DeviceExtension->ValuePort, Value); +} + +ULONG +NTAPI +VmxInitModes(IN PHW_DEVICE_EXTENSION DeviceExtension) +{ + /* Not here yet */ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +VP_STATUS +NTAPI +VmxInitDevice(IN PHW_DEVICE_EXTENSION DeviceExtension) +{ + /* Not here yet */ + UNIMPLEMENTED; + while (TRUE); + return NO_ERROR; +} + +BOOLEAN +NTAPI +VmxIsMultiMon(IN PHW_DEVICE_EXTENSION DeviceExtension) +{ + ULONG Capabilities; + + /* Get the caps */ + Capabilities = DeviceExtension->Capabilities; + + /* Check for multi-mon support */ + if ((Capabilities & SVGA_CAP_MULTIMON) && (Capabilities & SVGA_CAP_PITCHLOCK)) + { + /* Query the monitor count */ + if (VmxReadUlong(DeviceExtension, SVGA_REG_NUM_DISPLAYS) > 1) return TRUE; + } + + /* Either no support, or just one screen */ + return FALSE; +} + VP_STATUS NTAPI VmxFindAdapter(IN PVOID HwDeviceExtension, @@ -24,6 +87,82 @@ VmxFindAdapter(IN PVOID HwDeviceExtension, IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo, OUT PUCHAR Again) { + VP_STATUS Status; + PHW_DEVICE_EXTENSION DeviceExtension = HwDeviceExtension; + DPRINT1("VMX searching for adapter\n"); + + /* Zero out the fields */ + VideoPortZeroMemory(DeviceExtension, sizeof(HW_DEVICE_EXTENSION)); + + /* Validate the Config Info */ + if (ConfigInfo->Length < sizeof(VIDEO_PORT_CONFIG_INFO)) + { + /* Incorrect OS version? */ + DPRINT1("Invalid configuration info\n"); + return ERROR_INVALID_PARAMETER; + } + + /* Initialize the device extension and find the adapter */ + Status = VmxInitDevice(DeviceExtension); + DPRINT1("Init status: %lx\n", Status); + if (Status != NO_ERROR) return ERROR_DEV_NOT_EXIST; + + /* Save this adapter extension */ + VmxDeviceExtensionArray[0] = DeviceExtension; + + /* Create the sync event */ + VideoPortCreateEvent(DeviceExtension, + NOTIFICATION_EVENT, + NULL, + &DeviceExtension->SyncEvent); + + /* Check for multi-monitor configuration */ + if (VmxIsMultiMon(DeviceExtension)) + { + /* Let's not go so far */ + UNIMPLEMENTED; + while (TRUE); + } + + /* Zero the frame buffer */ + VideoPortZeroMemory((PVOID)DeviceExtension->FrameBuffer.LowPart, + DeviceExtension->VramSize.LowPart); + + /* Initialize the video modes */ + VmxInitModes(DeviceExtension); + + /* Setup registry keys */ + VideoPortSetRegistryParameters(DeviceExtension, + L"HardwareInformation.ChipType", + AdapterString, + sizeof(AdapterString)); + VideoPortSetRegistryParameters(DeviceExtension, + L"HardwareInformation.DacType", + AdapterString, + sizeof(AdapterString)); + VideoPortSetRegistryParameters(DeviceExtension, + L"HardwareInformation.MemorySize", + &DeviceExtension->VramSize.LowPart, + sizeof(ULONG)); + VideoPortSetRegistryParameters(DeviceExtension, + L"HardwareInformation.AdapterString", + AdapterString, + sizeof(AdapterString)); + VideoPortSetRegistryParameters(DeviceExtension, + L"HardwareInformation.BiosString", + AdapterString, + sizeof(AdapterString)); + + /* No VDM support */ + ConfigInfo->NumEmulatorAccessEntries = 0; + ConfigInfo->EmulatorAccessEntries = 0; + ConfigInfo->EmulatorAccessEntriesContext = 0; + ConfigInfo->HardwareStateSize = 0; + ConfigInfo->VdmPhysicalVideoMemoryAddress.QuadPart = 0; + ConfigInfo->VdmPhysicalVideoMemoryLength = 0; + + /* Write that this is Windows XP or higher */ + VmxWriteUlong(DeviceExtension, SVGA_REG_GUEST_ID, 0x5000 | 0x08); return NO_ERROR; } @@ -31,6 +170,8 @@ BOOLEAN NTAPI VmxInitialize(IN PVOID HwDeviceExtension) { + UNIMPLEMENTED; + while (TRUE); return TRUE; } @@ -39,6 +180,8 @@ NTAPI VmxStartIO(IN PVOID HwDeviceExtension, IN PVIDEO_REQUEST_PACKET RequestPacket) { + UNIMPLEMENTED; + while (TRUE); return TRUE; } @@ -48,6 +191,8 @@ VmxResetHw(IN PVOID DeviceExtension, IN ULONG Columns, IN ULONG Rows) { + UNIMPLEMENTED; + while (TRUE); return FALSE; } @@ -57,6 +202,8 @@ VmxGetPowerState(IN PVOID HwDeviceExtension, IN ULONG HwId, IN PVIDEO_POWER_MANAGEMENT VideoPowerControl) { + UNIMPLEMENTED; + while (TRUE); return NO_ERROR; } @@ -66,14 +213,17 @@ VmxSetPowerState(IN PVOID HwDeviceExtension, IN ULONG HwId, IN PVIDEO_POWER_MANAGEMENT VideoPowerControl) { - - return NO_ERROR; + UNIMPLEMENTED; + while (TRUE); + return NO_ERROR; } BOOLEAN NTAPI VmxInterrupt(IN PVOID HwDeviceExtension) { + UNIMPLEMENTED; + while (TRUE); return TRUE; } @@ -86,6 +236,8 @@ VmxGetVideoChildDescriptor(IN PVOID HwDeviceExtension, OUT PULONG UId, OUT PULONG pUnused) { + UNIMPLEMENTED; + while (TRUE); return NO_ERROR; } @@ -97,6 +249,7 @@ DriverEntry(IN PVOID Context1, VIDEO_HW_INITIALIZATION_DATA InitData; /* Zero initialization structure and array of extensions, one per screen */ + DPRINT1("VMX-SVGAII Loading...\n"); VideoPortZeroMemory(VmxDeviceExtensionArray, sizeof(VmxDeviceExtensionArray)); VideoPortZeroMemory(&InitData, sizeof(InitData)); diff --git a/reactos/drivers/video/miniport/xboxvmp/xboxvmp.h b/reactos/drivers/video/miniport/xboxvmp/xboxvmp.h index 422e25f03f4..3dacdcc21dc 100644 --- a/reactos/drivers/video/miniport/xboxvmp/xboxvmp.h +++ b/reactos/drivers/video/miniport/xboxvmp/xboxvmp.h @@ -20,23 +20,14 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef XBOXVMP_H -#define XBOXVMP_H +#pragma once /* INCLUDES *******************************************************************/ -#ifdef _MSC_VER -#pragma message ("INVESTIGATE ME") -#endif - -#if 0 //#ifdef _MSC_VER -#include "devioctl.h" +#include "ntdef.h" #define PAGE_SIZE 4096 -#else -#include -#endif - #include "dderror.h" +#include "devioctl.h" #include "miniport.h" #include "ntddvdeo.h" #include "video.h" @@ -157,6 +148,4 @@ XboxVmpSetColorRegisters( PVIDEO_CLUT ColorLookUpTable, PSTATUS_BLOCK StatusBlock); -#endif /* XBOXVMP_H */ - /* EOF */ diff --git a/reactos/drivers/video/videoprt/int10.c b/reactos/drivers/video/videoprt/int10.c index 9914052663c..5f5458aa89f 100644 --- a/reactos/drivers/video/videoprt/int10.c +++ b/reactos/drivers/video/videoprt/int10.c @@ -188,7 +188,8 @@ IntInt10CallBios( /* Detach and return status */ IntDetachFromCSRSS(&CallingProcess, &ApcState); - return Status; + if (NT_SUCCESS(Status)) return NO_ERROR; + return ERROR_INVALID_PARAMETER; } #endif @@ -243,8 +244,8 @@ VideoPortInt10( /* Detach from CSRSS */ IntDetachFromCSRSS(&CallingProcess, &ApcState); - - return Status; + if (NT_SUCCESS(Status)) return NO_ERROR; + return ERROR_INVALID_PARAMETER; #else /* Not implemented for anything else than X86*/ DPRINT1("Int10 not available on non-x86!\n"); diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index f976c7eb781..33c6fedc7f8 100644 --- a/reactos/drivers/video/videoprt/videoprt.c +++ b/reactos/drivers/video/videoprt/videoprt.c @@ -322,7 +322,6 @@ IntVideoPortCreateAdapterDeviceObject( } -/* FIXME: we have to detach the device object in IntVideoPortFindAdapter if it fails */ NTSTATUS NTAPI IntVideoPortFindAdapter( IN PDRIVER_OBJECT DriverObject, @@ -341,7 +340,7 @@ IntVideoPortFindAdapter( WCHAR SymlinkBuffer[20]; UNICODE_STRING SymlinkName; BOOL LegacyDetection = FALSE; - ULONG DeviceNumber; + ULONG DeviceNumber, DisplayNumber; DeviceExtension = (PVIDEO_PORT_DEVICE_EXTENSION)DeviceObject->DeviceExtension; DeviceNumber = DeviceExtension->DeviceNumber; @@ -423,6 +422,8 @@ IntVideoPortFindAdapter( { WARN_(VIDEOPRT, "HwFindAdapter call failed with error 0x%X\n", Status); RtlFreeUnicodeString(&DeviceExtension->RegistryPath); + if (DeviceExtension->NextDeviceObject) + IoDetachDevice(DeviceExtension->NextDeviceObject); IoDeleteDevice(DeviceObject); return Status; @@ -444,6 +445,8 @@ IntVideoPortFindAdapter( { WARN_(VIDEOPRT, "HwFindAdapter call failed with error 0x%X\n", Status); RtlFreeUnicodeString(&DeviceExtension->RegistryPath); + if (DeviceExtension->NextDeviceObject) + IoDetachDevice(DeviceExtension->NextDeviceObject); IoDeleteDevice(DeviceObject); return Status; } @@ -458,12 +461,30 @@ IntVideoPortFindAdapter( RtlInitUnicodeString(&DeviceName, DeviceBuffer); /* Create symbolic link "\??\DISPLAYx" */ - swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DeviceNumber + 1); - RtlInitUnicodeString(&SymlinkName, SymlinkBuffer); - IoCreateSymbolicLink(&SymlinkName, &DeviceName); + + /* HACK: We need this to find the first available display to + * use. We can't use the device number because then we could + * end up with \Device\Video0 being non-functional because + * HwFindAdapter returned an error. \Device\Video1 would be + * the correct primary display but it would be set to DISPLAY2 + * so it would never be used and ROS would bugcheck on boot. + * By doing it this way, we ensure that DISPLAY1 is always + * functional. Another idea would be letting the IO manager + * give our video devices names then getting those names + * somehow and creating symbolic links to \Device\VideoX + * and \??\DISPLAYX once we know that HwFindAdapter has succeeded. + */ + DisplayNumber = 0; + do + { + DisplayNumber++; + swprintf(SymlinkBuffer, L"\\??\\DISPLAY%lu", DisplayNumber); + RtlInitUnicodeString(&SymlinkName, SymlinkBuffer); + } + while (IoCreateSymbolicLink(&SymlinkName, &DeviceName) != STATUS_SUCCESS); /* Add entry to DEVICEMAP\VIDEO key in registry. */ - swprintf(DeviceVideoBuffer, L"\\Device\\Video%d", DeviceNumber); + swprintf(DeviceVideoBuffer, L"\\Device\\Video%d", DisplayNumber - 1); RtlWriteRegistryValue( RTL_REGISTRY_DEVICEMAP, L"VIDEO", @@ -489,6 +510,8 @@ IntVideoPortFindAdapter( if (!IntVideoPortSetupInterrupt(DeviceObject, DriverExtension, &ConfigInfo)) { RtlFreeUnicodeString(&DeviceExtension->RegistryPath); + if (DeviceExtension->NextDeviceObject) + IoDetachDevice(DeviceExtension->NextDeviceObject); IoDeleteDevice(DeviceObject); return STATUS_INSUFFICIENT_RESOURCES; } @@ -501,6 +524,8 @@ IntVideoPortFindAdapter( { if (DeviceExtension->InterruptObject != NULL) IoDisconnectInterrupt(DeviceExtension->InterruptObject); + if (DeviceExtension->NextDeviceObject) + IoDetachDevice(DeviceExtension->NextDeviceObject); RtlFreeUnicodeString(&DeviceExtension->RegistryPath); IoDeleteDevice(DeviceObject); WARN_(VIDEOPRT, "STATUS_INSUFFICIENT_RESOURCES\n"); @@ -1417,3 +1442,99 @@ VideoPortAllocateContiguousMemory( return MmAllocateContiguousMemory(NumberOfBytes, HighestAcceptableAddress); } + +/* + * @implemented + */ +BOOLEAN NTAPI +VideoPortIsNoVesa(VOID) +{ + NTSTATUS Status; + HANDLE KeyHandle; + UNICODE_STRING Path = RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\SYSTEM\\CurrentControlSet\\Control"); + UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"SystemStartOptions"); + OBJECT_ATTRIBUTES ObjectAttributes; + PKEY_VALUE_PARTIAL_INFORMATION KeyInfo; + ULONG Length, NewLength; + + /* Initialize object attributes with the path we want */ + InitializeObjectAttributes(&ObjectAttributes, + &Path, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + NULL, + NULL); + + /* Open the key */ + Status = ZwOpenKey(&KeyHandle, + KEY_QUERY_VALUE, + &ObjectAttributes); + + if (!NT_SUCCESS(Status)) + { + VideoPortDebugPrint(Error, "ZwOpenKey failed (0x%x)\n", Status); + return FALSE; + } + + /* Find out how large our buffer should be */ + Status = ZwQueryValueKey(KeyHandle, + &ValueName, + KeyValuePartialInformation, + NULL, + 0, + &Length); + if (Status != STATUS_BUFFER_OVERFLOW && Status != STATUS_BUFFER_TOO_SMALL) + { + VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status); + ZwClose(KeyHandle); + return FALSE; + } + + /* Allocate it */ + KeyInfo = ExAllocatePool(PagedPool, Length); + if (!KeyInfo) + { + VideoPortDebugPrint(Error, "Out of memory\n"); + ZwClose(KeyHandle); + return FALSE; + } + + /* Now for real this time */ + Status = ZwQueryValueKey(KeyHandle, + &ValueName, + KeyValuePartialInformation, + KeyInfo, + Length, + &NewLength); + + ZwClose(KeyHandle); + + if (!NT_SUCCESS(Status)) + { + VideoPortDebugPrint(Error, "ZwQueryValueKey failed (0x%x)\n", Status); + ExFreePool(KeyInfo); + return FALSE; + } + + /* Sanity check */ + if (KeyInfo->Type != REG_SZ) + { + VideoPortDebugPrint(Error, "Invalid type for SystemStartOptions\n"); + ExFreePool(KeyInfo); + return FALSE; + } + + /* Check if NOVESA is present in the start options */ + if (wcsstr((PWCHAR)KeyInfo->Data, L"NOVESA")) + { + VideoPortDebugPrint(Info, "VESA mode disabled\n"); + ExFreePool(KeyInfo); + return TRUE; + } + + ExFreePool(KeyInfo); + + VideoPortDebugPrint(Info, "VESA mode enabled\n"); + + return FALSE; +} + diff --git a/reactos/drivers/video/videoprt/videoprt.h b/reactos/drivers/video/videoprt/videoprt.h index aae0ba10ee4..21ea2c09ee1 100644 --- a/reactos/drivers/video/videoprt/videoprt.h +++ b/reactos/drivers/video/videoprt/videoprt.h @@ -24,6 +24,7 @@ #include #include +#define __BROKEN__ #include #include #include diff --git a/reactos/drivers/video/videoprt/videoprt.spec b/reactos/drivers/video/videoprt/videoprt.spec index 27bc1e80755..4dacc44b6c8 100644 --- a/reactos/drivers/video/videoprt/videoprt.spec +++ b/reactos/drivers/video/videoprt/videoprt.spec @@ -52,6 +52,7 @@ @ fastcall VideoPortInterlockedDecrement(ptr) NTOSKRNL.InterlockedDecrement @ fastcall VideoPortInterlockedExchange(ptr long) NTOSKRNL.InterlockedExchange @ fastcall VideoPortInterlockedIncrement(ptr) NTOSKRNL.InterlockedIncrement +@ stdcall VideoPortIsNoVesa() @ stdcall VideoPortLockBuffer(ptr ptr long long) ;VideoPortIsNoVesa // 2003 and later @ stdcall VideoPortLockPages(ptr ptr ptr ptr long) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp b/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp index 7aefc882ee4..730b6a3adfb 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/interfaces.hpp @@ -320,8 +320,6 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown) STDMETHOD_(NTSTATUS, Init)(THIS_ IN KSPIN_CONNECT *ConnectDetails, - IN PKSDATAFORMAT DataFormat, - IN PDEVICE_OBJECT DeviceObject, IN ULONG FrameSize, IN ULONG Alignment, IN PVOID SilenceBuffer) PURE; @@ -337,17 +335,10 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown) STDMETHOD_(VOID, UpdateMapping)(THIS_ IN ULONG BytesWritten) PURE; - STDMETHOD_(ULONG, NumMappings)(THIS) PURE; - STDMETHOD_(ULONG, NumData)(THIS) PURE; - STDMETHOD_(BOOL, MinimumDataAvailable)(THIS) PURE; - STDMETHOD_(BOOL, CancelBuffers)(THIS) PURE; - STDMETHOD_(VOID, UpdateFormat)(THIS_ - IN PKSDATAFORMAT DataFormat) PURE; - STDMETHOD_(NTSTATUS, GetMappingWithTag)(THIS_ IN PVOID Tag, OUT PPHYSICAL_ADDRESS PhysicalAddress, @@ -358,19 +349,19 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown) STDMETHOD_(NTSTATUS, ReleaseMappingWithTag)(THIS_ IN PVOID Tag) PURE; - STDMETHOD_(BOOL, HasLastMappingFailed)(THIS) PURE; + STDMETHOD_(BOOLEAN, HasLastMappingFailed)(THIS) PURE; STDMETHOD_(ULONG, GetCurrentIrpOffset)(THIS) PURE; - STDMETHOD_(VOID, SetMinimumDataThreshold)(THIS_ - IN ULONG MinimumDataThreshold) PURE; - STDMETHOD_(ULONG, GetMinimumDataThreshold)(THIS) PURE; + + STDMETHOD_(BOOLEAN, GetAcquiredTagRange)(THIS_ + IN PVOID * FirstTag, + IN PVOID * LastTag); + }; #define IMP_IIrpQueue \ STDMETHODIMP_(NTSTATUS) Init(THIS_ \ IN KSPIN_CONNECT *ConnectDetails, \ - IN PKSDATAFORMAT DataFormat, \ - IN PDEVICE_OBJECT DeviceObject, \ IN ULONG FrameSize, \ IN ULONG Alignment, \ IN PVOID SilenceBuffer); \ @@ -386,17 +377,10 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown) STDMETHODIMP_(VOID) UpdateMapping(THIS_ \ IN ULONG BytesWritten); \ \ - STDMETHODIMP_(ULONG) NumMappings(THIS); \ - \ STDMETHODIMP_(ULONG) NumData(THIS); \ \ - STDMETHODIMP_(BOOL) MinimumDataAvailable(THIS); \ - \ STDMETHODIMP_(BOOL) CancelBuffers(THIS); \ \ - STDMETHODIMP_(VOID) UpdateFormat(THIS_ \ - IN PKSDATAFORMAT DataFormat); \ - \ STDMETHODIMP_(NTSTATUS) GetMappingWithTag(THIS_ \ IN PVOID Tag, \ OUT PPHYSICAL_ADDRESS PhysicalAddress, \ @@ -407,11 +391,13 @@ DECLARE_INTERFACE_(IIrpQueue, IUnknown) STDMETHODIMP_(NTSTATUS) ReleaseMappingWithTag( \ IN PVOID Tag); \ \ - STDMETHODIMP_(BOOL) HasLastMappingFailed(THIS); \ + STDMETHODIMP_(BOOLEAN) HasLastMappingFailed(THIS); \ STDMETHODIMP_(ULONG) GetCurrentIrpOffset(THIS); \ - STDMETHODIMP_(VOID) SetMinimumDataThreshold( \ - IN ULONG MinimumDataThreshold); \ - STDMETHODIMP_(ULONG) GetMinimumDataThreshold(VOID) + STDMETHODIMP_(BOOLEAN) GetAcquiredTagRange(THIS_ \ + IN PVOID * FirstTag, \ + IN PVOID * LastTag); + + /***************************************************************************** * IKsWorkSink diff --git a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp index aaa707bb425..50d55fb4901 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/irpstream.cpp @@ -38,10 +38,7 @@ protected: volatile ULONG m_CurrentOffset; LONG m_NumMappings; ULONG m_NumDataAvailable; - BOOL m_StartStream; PKSPIN_CONNECT m_ConnectDetails; - PKSDATAFORMAT_WAVEFORMATEX m_DataFormat; - KSPIN_LOCK m_IrpListLock; LIST_ENTRY m_IrpList; LIST_ENTRY m_FreeIrpList; @@ -51,7 +48,6 @@ protected: ULONG m_OutOfMapping; ULONG m_MaxFrameSize; ULONG m_Alignment; - ULONG m_MinimumDataThreshold; LONG m_Ref; @@ -87,18 +83,14 @@ NTSTATUS NTAPI CIrpQueue::Init( IN KSPIN_CONNECT *ConnectDetails, - IN PKSDATAFORMAT DataFormat, - IN PDEVICE_OBJECT DeviceObject, IN ULONG FrameSize, IN ULONG Alignment, IN PVOID SilenceBuffer) { m_ConnectDetails = ConnectDetails; - m_DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat; m_MaxFrameSize = FrameSize; m_SilenceBuffer = SilenceBuffer; m_Alignment = Alignment; - m_MinimumDataThreshold = ((PKSDATAFORMAT_WAVEFORMATEX)DataFormat)->WaveFormatEx.nAvgBytesPerSec / 3; InitializeListHead(&m_IrpList); InitializeListHead(&m_FreeIrpList); @@ -225,6 +217,9 @@ CIrpQueue::AddMapping( // add irp to cancelable queue KsAddIrpToCancelableQueue(&m_IrpList, &m_IrpListLock, Irp, KsListEntryTail, NULL); + // disable mapping failed status + m_OutOfMapping = FALSE; + // done return Status; } @@ -270,10 +265,6 @@ CIrpQueue::GetMapping( // no irp available, use silence buffer *Buffer = (PUCHAR)m_SilenceBuffer; *BufferSize = m_MaxFrameSize; - // flag for port wave pci driver - m_OutOfMapping = TRUE; - // indicate flag to restart fast buffering - m_StartStream = FALSE; return STATUS_SUCCESS; } @@ -410,15 +401,6 @@ CIrpQueue::UpdateMapping( } } -ULONG -NTAPI -CIrpQueue::NumMappings() -{ - - // returns the amount of mappings available - return m_NumMappings; -} - ULONG NTAPI CIrpQueue::NumData() @@ -427,28 +409,6 @@ CIrpQueue::NumData() return m_NumDataAvailable; } - -BOOL -NTAPI -CIrpQueue::MinimumDataAvailable() -{ - BOOL Result; - - if (m_StartStream) - return TRUE; - - if (m_MinimumDataThreshold < m_NumDataAvailable) - { - m_StartStream = TRUE; - Result = TRUE; - } - else - { - Result = FALSE; - } - return Result; -} - BOOL NTAPI CIrpQueue::CancelBuffers() @@ -464,23 +424,15 @@ CIrpQueue::CancelBuffers() // cancel all irps KsCancelIo(&m_IrpList, &m_IrpListLock); - // reset stream start flag - m_StartStream = FALSE; + // reset number of mappings + m_NumMappings = 0; + // reset number of data available + m_NumDataAvailable = 0; + // done return TRUE; } -VOID -NTAPI -CIrpQueue::UpdateFormat( - PKSDATAFORMAT DataFormat) -{ - m_DataFormat = (PKSDATAFORMAT_WAVEFORMATEX)DataFormat; - m_MinimumDataThreshold = m_DataFormat->WaveFormatEx.nAvgBytesPerSec / 3; - m_StartStream = FALSE; - m_NumDataAvailable = 0; -} - NTSTATUS NTAPI CIrpQueue::GetMappingWithTag( @@ -504,8 +456,7 @@ CIrpQueue::GetMappingWithTag( { // no irp available m_OutOfMapping = TRUE; - m_StartStream = FALSE; - return STATUS_UNSUCCESSFUL; + return STATUS_NOT_FOUND; } //FIXME support more than one stream header @@ -567,16 +518,13 @@ CIrpQueue::ReleaseMappingWithTag( Irp->IoStatus.Information = StreamHeader->FrameExtent; - // free stream header, no tag as wdmaud.drv allocates it atm - ExFreePool(StreamHeader); - // complete the request IoCompleteRequest(Irp, IO_SOUND_INCREMENT); return STATUS_SUCCESS; } -BOOL +BOOLEAN NTAPI CIrpQueue::HasLastMappingFailed() { @@ -591,23 +539,53 @@ CIrpQueue::GetCurrentIrpOffset() return m_CurrentOffset; } -VOID +BOOLEAN NTAPI -CIrpQueue::SetMinimumDataThreshold( - ULONG MinimumDataThreshold) +CIrpQueue::GetAcquiredTagRange( + IN PVOID * FirstTag, + IN PVOID * LastTag) { + KIRQL OldLevel; + BOOLEAN Ret = FALSE; + PIRP Irp; + PLIST_ENTRY CurEntry; - m_MinimumDataThreshold = MinimumDataThreshold; + KeAcquireSpinLock(&m_IrpListLock, &OldLevel); + + if (!IsListEmpty(&m_FreeIrpList)) + { + // get first entry + CurEntry = RemoveHeadList(&m_FreeIrpList); + // get irp from list entry + Irp = (PIRP)CONTAINING_RECORD(CurEntry, IRP, Tail.Overlay.ListEntry); + + // get tag of first acquired buffer + *FirstTag = Irp->Tail.Overlay.DriverContext[3]; + + // put back irp + InsertHeadList(&m_FreeIrpList, &Irp->Tail.Overlay.ListEntry); + + // get last entry + CurEntry = RemoveTailList(&m_FreeIrpList); + // get irp from list entry + Irp = (PIRP)CONTAINING_RECORD(CurEntry, IRP, Tail.Overlay.ListEntry); + + // get tag of first acquired buffer + *LastTag = Irp->Tail.Overlay.DriverContext[3]; + + // put back irp + InsertTailList(&m_FreeIrpList, &Irp->Tail.Overlay.ListEntry); + + // indicate success + Ret = TRUE; + } + + // release lock + KeReleaseSpinLock(&m_IrpListLock, OldLevel); + // done + return Ret; } -ULONG -NTAPI -CIrpQueue::GetMinimumDataThreshold() -{ - return m_MinimumDataThreshold; -} - - NTSTATUS NTAPI NewIrpQueue( diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.cpp b/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.cpp index 07395aedc27..da6e98d9d51 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_dmus.cpp @@ -41,9 +41,6 @@ protected: VOID TransferMidiDataToDMus(); VOID TransferMidiData(); - VOID NTAPI SetStreamState(IN KSSTATE State); - - IPortDMus * m_Port; IPortFilterDMus * m_Filter; KSPIN_DESCRIPTOR * m_KsPinDescriptor; @@ -75,10 +72,6 @@ protected: ULONG m_LastTag; LONG m_Ref; - - friend VOID NTAPI SetStreamWorkerRoutineDMus(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context); - friend VOID NTAPI CloseStreamRoutineDMus(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context); - }; typedef struct @@ -198,92 +191,6 @@ CPortPinDMus::DisconnectOutput( //================================================================================================================================== -VOID -NTAPI -SetStreamWorkerRoutineDMus( - IN PDEVICE_OBJECT DeviceObject, - IN PVOID Context) -{ - CPortPinDMus* This; - KSSTATE State; - NTSTATUS Status; - PSETSTREAM_CONTEXT Ctx = (PSETSTREAM_CONTEXT)Context; - - This = Ctx->Pin; - State = Ctx->State; - - IoFreeWorkItem(Ctx->WorkItem); - FreeItem(Ctx, TAG_PORTCLASS); - - // Has the audio stream resumed? - if (This->m_IrpQueue->NumMappings() && State == KSSTATE_STOP) - return; - - // Set the state - if (This->m_MidiStream) - { - Status = This->m_MidiStream->SetState(State); - } - else - { - Status = This->m_Mxf->SetState(State); - } - - if (NT_SUCCESS(Status)) - { - // Set internal state to requested state - This->m_State = State; - - if (This->m_State == KSSTATE_STOP) - { - // reset start stream - This->m_IrpQueue->CancelBuffers(); //FIX function name - DPRINT("Stopping PreCompleted %u PostCompleted %u\n", This->m_PreCompleted, This->m_PostCompleted); - } - } -} - -VOID -NTAPI -CPortPinDMus::SetStreamState( - IN KSSTATE State) -{ - PIO_WORKITEM WorkItem; - PSETSTREAM_CONTEXT Context; - - PC_ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL); - - // Has the audio stream resumed? - if (m_IrpQueue->NumMappings() && State == KSSTATE_STOP) - return; - - // Has the audio state already been set? - if (m_State == State) - return; - - // allocate set state context - Context = (PSETSTREAM_CONTEXT)AllocateItem(NonPagedPool, sizeof(SETSTREAM_CONTEXT), TAG_PORTCLASS); - - if (!Context) - return; - - // allocate work item - WorkItem = IoAllocateWorkItem(m_DeviceObject); - - if (!WorkItem) - { - ExFreePool(Context); - return; - } - - Context->Pin = this; - Context->WorkItem = WorkItem; - Context->State = State; - - // queue the work item - IoQueueWorkItem(WorkItem, SetStreamWorkerRoutineDMus, DelayedWorkQueue, (PVOID)Context); -} - VOID CPortPinDMus::TransferMidiData() { @@ -297,7 +204,6 @@ CPortPinDMus::TransferMidiData() Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize); if (!NT_SUCCESS(Status)) { - SetStreamState(KSSTATE_STOP); return; } @@ -375,7 +281,6 @@ CPortPinDMus::TransferMidiDataToDMus() if (!Root) { - SetStreamState(KSSTATE_STOP); return; } @@ -482,128 +387,59 @@ CPortPinDMus::Flush( return KsDispatchInvalidDeviceRequest(DeviceObject, Irp); } - -VOID -NTAPI -CloseStreamRoutineDMus( - IN PDEVICE_OBJECT DeviceObject, - IN PVOID Context) -{ - PMINIPORTMIDISTREAM Stream = NULL; - NTSTATUS Status; - ISubdevice *ISubDevice; - PSUBDEVICE_DESCRIPTOR Descriptor; - CPortPinDMus * This; - PCLOSESTREAM_CONTEXT Ctx = (PCLOSESTREAM_CONTEXT)Context; - - This = (CPortPinDMus*)Ctx->Pin; - - if (This->m_MidiStream) - { - if (This->m_State != KSSTATE_STOP) - { - This->m_MidiStream->SetState(KSSTATE_STOP); - } - Stream = This->m_MidiStream; - This->m_MidiStream = NULL; - } - - if (This->m_ServiceGroup) - { - This->m_ServiceGroup->RemoveMember(PSERVICESINK(This)); - } - - Status = This->m_Port->QueryInterface(IID_ISubdevice, (PVOID*)&ISubDevice); - if (NT_SUCCESS(Status)) - { - Status = ISubDevice->GetDescriptor(&Descriptor); - if (NT_SUCCESS(Status)) - { - Descriptor->Factory.Instances[This->m_ConnectDetails->PinId].CurrentPinInstanceCount--; - ISubDevice->Release(); - } - } - - if (This->m_Format) - { - ExFreePool(This->m_Format); - This->m_Format = NULL; - } - - // complete the irp - Ctx->Irp->IoStatus.Information = 0; - Ctx->Irp->IoStatus.Status = STATUS_SUCCESS; - IoCompleteRequest(Ctx->Irp, IO_NO_INCREMENT); - - // free the work item - IoFreeWorkItem(Ctx->WorkItem); - - // free work item ctx - FreeItem(Ctx, TAG_PORTCLASS); - - // destroy DMus pin - This->m_Filter->FreePin(PPORTPINDMUS(This)); - - if (Stream) - { - DPRINT("Closing stream at Irql %u\n", KeGetCurrentIrql()); - Stream->Release(); - } -} - NTSTATUS NTAPI CPortPinDMus::Close( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - PCLOSESTREAM_CONTEXT Ctx; + NTSTATUS Status; + ISubdevice * SubDevice; + PSUBDEVICE_DESCRIPTOR Descriptor; - if (m_MidiStream || m_Mxf) + if (m_ServiceGroup) { - Ctx = (PCLOSESTREAM_CONTEXT)AllocateItem(NonPagedPool, sizeof(CLOSESTREAM_CONTEXT), TAG_PORTCLASS); - if (!Ctx) - { - DPRINT("Failed to allocate stream context\n"); - goto cleanup; - } - - Ctx->WorkItem = IoAllocateWorkItem(DeviceObject); - if (!Ctx->WorkItem) - { - DPRINT("Failed to allocate work item\n"); - goto cleanup; - } - - Ctx->Irp = Irp; - Ctx->Pin = this; - - IoMarkIrpPending(Irp); - Irp->IoStatus.Information = 0; - Irp->IoStatus.Status = STATUS_PENDING; - - // defer work item - IoQueueWorkItem(Ctx->WorkItem, CloseStreamRoutineDMus, DelayedWorkQueue, (PVOID)Ctx); - // Return result - return STATUS_PENDING; + m_ServiceGroup->RemoveMember(PSERVICESINK(this)); } + if (m_MidiStream) + { + if (m_State != KSSTATE_STOP) + { + m_MidiStream->SetState(KSSTATE_STOP); + m_State = KSSTATE_STOP; + } + DPRINT("Closing stream at Irql %u\n", KeGetCurrentIrql()); + m_MidiStream->Release(); + } + + Status = m_Port->QueryInterface(IID_ISubdevice, (PVOID*)&SubDevice); + if (NT_SUCCESS(Status)) + { + Status = SubDevice->GetDescriptor(&Descriptor); + if (NT_SUCCESS(Status)) + { + // release reference count + Descriptor->Factory.Instances[m_ConnectDetails->PinId].CurrentPinInstanceCount--; + } + SubDevice->Release(); + } + + if (m_Format) + { + ExFreePool(m_Format); + m_Format = NULL; + } + + // complete the irp Irp->IoStatus.Information = 0; Irp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(Irp, IO_NO_INCREMENT); + // destroy DMus pin + m_Filter->FreePin(PPORTPINDMUS(this)); + return STATUS_SUCCESS; - -cleanup: - - if (Ctx) - FreeItem(Ctx, TAG_PORTCLASS); - - Irp->IoStatus.Information = 0; - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_UNSUCCESSFUL; - } NTSTATUS @@ -769,7 +605,7 @@ CPortPinDMus::Init( m_ServiceGroup->SupportDelayedService(); } - Status = m_IrpQueue->Init(ConnectDetails, m_Format, DeviceObject, 0, 0, NULL); + Status = m_IrpQueue->Init(ConnectDetails, 0, 0, NULL); if (!NT_SUCCESS(Status)) { DPRINT("IrpQueue_Init failed with %x\n", Status); diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp index 14be43fd9e3..ff02905e386 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavecyclic.cpp @@ -347,7 +347,6 @@ PinWaveCyclicAudioPosition( DPRINT("Play %lu Write %lu\n", Position->PlayOffset, Position->WriteOffset); } - Irp->IoStatus.Information = sizeof(KSAUDIO_POSITION); return STATUS_SUCCESS; } @@ -450,10 +449,14 @@ PinWaveCyclicState( // FIXME // complete with successful state Pin->m_IrpQueue->CancelBuffers(); + Pin->m_Position.PlayOffset = 0; + Pin->m_Position.WriteOffset = 0; } else if (Pin->m_State == KSSTATE_STOP) { Pin->m_IrpQueue->CancelBuffers(); + Pin->m_Position.PlayOffset = 0; + Pin->m_Position.WriteOffset = 0; } // store result Irp->IoStatus.Information = sizeof(KSSTATE); @@ -539,9 +542,6 @@ PinWaveCyclicDataFormat( // free old format FreeItem(Pin->m_Format, TAG_PORTCLASS); - // update irp queue with new format - Pin->m_IrpQueue->UpdateFormat((PKSDATAFORMAT)NewDataFormat); - // store new format Pin->m_Format = NewDataFormat; Irp->IoStatus.Information = NewDataFormat->FormatSize; @@ -693,8 +693,11 @@ CPortPinWaveCyclic::UpdateCommonBuffer( if (m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING) { - // normalize position - m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset; + if (m_Position.WriteOffset) + { + // normalize position + m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset; + } } } } @@ -742,8 +745,11 @@ CPortPinWaveCyclic::UpdateCommonBufferOverlap( if (m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING) { - // normalize position - m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset; + if (m_Position.WriteOffset) + { + // normalize position + m_Position.PlayOffset = m_Position.PlayOffset % m_Position.WriteOffset; + } } } @@ -773,29 +779,32 @@ CPortPinWaveCyclic::RequestService() PC_ASSERT_IRQL(DISPATCH_LEVEL); - Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize); - if (!NT_SUCCESS(Status)) + if (m_State == KSSTATE_RUN) { - return; + Status = m_IrpQueue->GetMapping(&Buffer, &BufferSize); + if (!NT_SUCCESS(Status)) + { + return; + } + + Status = m_Stream->GetPosition(&Position); + DPRINT("Position %u Buffer %p BufferSize %u ActiveIrpOffset %u Capture %u\n", Position, Buffer, m_CommonBufferSize, BufferSize, m_Capture); + + OldOffset = m_Position.PlayOffset; + + if (Position < m_CommonBufferOffset) + { + UpdateCommonBufferOverlap(Position, m_FrameSize); + } + else if (Position >= m_CommonBufferOffset) + { + UpdateCommonBuffer(Position, m_FrameSize); + } + + NewOffset = m_Position.PlayOffset; + + GeneratePositionEvents(OldOffset, NewOffset); } - - Status = m_Stream->GetPosition(&Position); - DPRINT("Position %u Buffer %p BufferSize %u ActiveIrpOffset %u Capture %u\n", Position, Buffer, m_CommonBufferSize, BufferSize, m_Capture); - - OldOffset = m_Position.PlayOffset; - - if (Position < m_CommonBufferOffset) - { - UpdateCommonBufferOverlap(Position, m_FrameSize); - } - else if (Position >= m_CommonBufferOffset) - { - UpdateCommonBuffer(Position, m_FrameSize); - } - - NewOffset = m_Position.PlayOffset; - - GeneratePositionEvents(OldOffset, NewOffset); } NTSTATUS @@ -1232,7 +1241,7 @@ CPortPinWaveCyclic::Init( m_Stream->Silence(SilenceBuffer, m_FrameSize); m_Stream->Silence(m_CommonBuffer, m_CommonBufferSize); - Status = m_IrpQueue->Init(ConnectDetails, DataFormat, DeviceObject, m_FrameSize, 0, SilenceBuffer); + Status = m_IrpQueue->Init(ConnectDetails, m_FrameSize, 0, SilenceBuffer); if (!NT_SUCCESS(Status)) { m_IrpQueue->Release(); diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp index 273bfae6539..935ece83ec7 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavepci.cpp @@ -36,9 +36,6 @@ public: IMP_IPortWavePciStream; CPortPinWavePci(IUnknown *OuterUnknown) {} virtual ~CPortPinWavePci(){} - - VOID NTAPI SetState( IN KSSTATE State); - VOID NTAPI CloseStream(); protected: friend NTSTATUS NTAPI PinWavePciState(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); @@ -77,9 +74,6 @@ protected: NTSTATUS NTAPI HandleKsProperty(IN PIRP Irp); NTSTATUS NTAPI HandleKsStream(IN PIRP Irp); - - - VOID NTAPI SetStreamState( IN KSSTATE State); }; typedef struct @@ -201,6 +195,8 @@ PinWavePciState( NTSTATUS Status = STATUS_UNSUCCESSFUL; CPortPinWavePci *Pin; PSUBDEVICE_DESCRIPTOR Descriptor; + PVOID FirstTag, LastTag; + ULONG MappingsRevoked; PKSSTATE State = (PKSSTATE)Data; // get sub device descriptor @@ -227,6 +223,35 @@ PinWavePciState( { // store new state Pin->m_State = *State; + if (Pin->m_ConnectDetails->Interface.Id == KSINTERFACE_STANDARD_LOOPED_STREAMING && Pin->m_State == KSSTATE_STOP) + { + // FIXME + // complete with successful state + Pin->m_IrpQueue->CancelBuffers(); + while(Pin->m_IrpQueue->GetAcquiredTagRange(&FirstTag, &LastTag)) + { + Status = Pin->m_Stream->RevokeMappings(FirstTag, LastTag, &MappingsRevoked); + DPRINT("RevokeMappings Status %lx MappingsRevoked: %lu\n", Status, MappingsRevoked); + KeStallExecutionProcessor(10); + } + Pin->m_Position.PlayOffset = 0; + Pin->m_Position.WriteOffset = 0; + } + else if (Pin->m_State == KSSTATE_STOP) + { + Pin->m_IrpQueue->CancelBuffers(); + while(Pin->m_IrpQueue->GetAcquiredTagRange(&FirstTag, &LastTag)) + { + Status = Pin->m_Stream->RevokeMappings(FirstTag, LastTag, &MappingsRevoked); + DPRINT("RevokeMappings Status %lx MappingsRevoked: %lu\n", Status, MappingsRevoked); + KeStallExecutionProcessor(10); + } + Pin->m_Position.PlayOffset = 0; + Pin->m_Position.WriteOffset = 0; + } + // store result + Irp->IoStatus.Information = sizeof(KSSTATE); + } // store result Irp->IoStatus.Information = sizeof(KSSTATE); @@ -311,9 +336,6 @@ PinWavePciDataFormat( // free old format FreeItem(Pin->m_Format, TAG_PORTCLASS); - // update irp queue with new format - Pin->m_IrpQueue->UpdateFormat((PKSDATAFORMAT)NewDataFormat); - // store new format Pin->m_Format = NewDataFormat; Irp->IoStatus.Information = NewDataFormat->FormatSize; @@ -373,7 +395,7 @@ CPortPinWavePci::QueryInterface( IN REFIID refiid, OUT PVOID* Output) { - DPRINT("CPortPinWavePci::QueryInterface entered\n"); + //DPRINT("CPortPinWavePci::QueryInterface entered\n"); if (IsEqualGUIDAligned(refiid, IID_IIrpTarget) || IsEqualGUIDAligned(refiid, IID_IUnknown)) @@ -435,137 +457,18 @@ CPortPinWavePci::TerminatePacket() } -VOID -CPortPinWavePci::SetState(KSSTATE State) -{ - ULONG MinimumDataThreshold; - ULONG MaximumDataThreshold; - - // Has the audio stream resumed? - if (m_IrpQueue->NumMappings() && State == KSSTATE_STOP) - return; - - // Set the state - if (NT_SUCCESS(m_Stream->SetState(State))) - { - // Save new internal state - m_State = State; - - if (m_State == KSSTATE_STOP) - { - // reset start stream - m_IrpQueue->CancelBuffers(); //FIX function name - //This->ServiceGroup->lpVtbl->CancelDelayedService(This->ServiceGroup); - // increase stop counter - m_StopCount++; - // get current data threshold - MinimumDataThreshold = m_IrpQueue->GetMinimumDataThreshold(); - // get maximum data threshold - MaximumDataThreshold = ((PKSDATAFORMAT_WAVEFORMATEX)m_Format)->WaveFormatEx.nAvgBytesPerSec; - // increase minimum data threshold by 10 frames - MinimumDataThreshold += m_AllocatorFraming.FrameSize * 10; - - // assure it has not exceeded - MinimumDataThreshold = min(MinimumDataThreshold, MaximumDataThreshold); - // store minimum data threshold - m_IrpQueue->SetMinimumDataThreshold(MinimumDataThreshold); - - DPRINT("Stopping TotalCompleted %u StopCount %u MinimumDataThreshold %u\n", m_TotalPackets, m_StopCount, MinimumDataThreshold); - } - if (m_State == KSSTATE_RUN) - { - // start the notification timer - //m_ServiceGroup->RequestDelayedService(m_ServiceGroup, m_Delay); - } - } - - -} - -VOID -NTAPI -PinWavePciSetStreamWorkerRoutine( - IN PDEVICE_OBJECT DeviceObject, - IN PVOID Context) -{ - CPortPinWavePci * This; - PSETSTREAM_CONTEXT Ctx = (PSETSTREAM_CONTEXT)Context; - KSSTATE State; - - This = Ctx->Pin; - State = Ctx->State; - - IoFreeWorkItem(Ctx->WorkItem); - FreeItem(Ctx, TAG_PORTCLASS); - - This->SetState(State); -} - -VOID -NTAPI -CPortPinWavePci::SetStreamState( - IN KSSTATE State) -{ - PDEVICE_OBJECT DeviceObject; - PIO_WORKITEM WorkItem; - PSETSTREAM_CONTEXT Context; - - PC_ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL); - - // Has the audio stream resumed? - if (m_IrpQueue->NumMappings() && State == KSSTATE_STOP) - return; - - // Has the audio state already been set? - if (m_State == State) - return; - - // Get device object - DeviceObject = GetDeviceObjectFromPortWavePci(m_Port); - - // allocate set state context - Context = (PSETSTREAM_CONTEXT)AllocateItem(NonPagedPool, sizeof(SETSTREAM_CONTEXT), TAG_PORTCLASS); - - if (!Context) - return; - - // allocate work item - WorkItem = IoAllocateWorkItem(DeviceObject); - - if (!WorkItem) - { - ExFreePool(Context); - return; - } - - Context->Pin = this; - Context->WorkItem = WorkItem; - Context->State = State; - - // queue the work item - IoQueueWorkItem(WorkItem, PinWavePciSetStreamWorkerRoutine, DelayedWorkQueue, (PVOID)Context); -} - - VOID NTAPI CPortPinWavePci::RequestService() { PC_ASSERT_IRQL(DISPATCH_LEVEL); - if (m_IrpQueue->HasLastMappingFailed()) + if (m_State == KSSTATE_RUN) { - if (m_IrpQueue->NumMappings() == 0) - { - DPRINT("Stopping stream...\n"); - SetStreamState(KSSTATE_STOP); - return; - } + m_Stream->Service(); + //TODO + //generate events } - - m_Stream->Service(); - //TODO - //generate events } //================================================================================================================================== @@ -597,18 +500,18 @@ CPortPinWavePci::HandleKsProperty( { PKSPROPERTY Property; NTSTATUS Status; - UNICODE_STRING GuidString; + //UNICODE_STRING GuidString; PIO_STACK_LOCATION IoStack; IoStack = IoGetCurrentIrpStackLocation(Irp); - DPRINT("IPortPinWave_HandleKsProperty entered\n"); + //DPRINT("IPortPinWave_HandleKsProperty entered\n"); IoStack = IoGetCurrentIrpStackLocation(Irp); if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY) { - DPRINT("Unhandled function %lx Length %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode, IoStack->Parameters.DeviceIoControl.InputBufferLength); + //DPRINT("Unhandled function %lx Length %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode, IoStack->Parameters.DeviceIoControl.InputBufferLength); Irp->IoStatus.Status = STATUS_SUCCESS; @@ -621,10 +524,11 @@ CPortPinWavePci::HandleKsProperty( if (Status == STATUS_NOT_FOUND) { Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; - +#if 0 RtlStringFromGUID(Property->Set, &GuidString); - DPRINT("Unhandeled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags); + //DPRINT("Unhandeled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags); RtlFreeUnicodeString(&GuidString); +#endif } if (Status != STATUS_PENDING) @@ -636,29 +540,6 @@ CPortPinWavePci::HandleKsProperty( return Status; } -#if 0 - else if (Property->Id == KSPROPERTY_CONNECTION_ALLOCATORFRAMING) - { - PKSALLOCATOR_FRAMING Framing = (PKSALLOCATOR_FRAMING)OutputBuffer; - - PC_ASSERT_IRQL(DISPATCH_LEVEL); - // Validate input buffer - if (OutputBufferLength < sizeof(KSALLOCATOR_FRAMING)) - { - IoStatusBlock->Information = sizeof(KSALLOCATOR_FRAMING); - IoStatusBlock->Status = STATUS_BUFFER_TOO_SMALL; - return STATUS_BUFFER_TOO_SMALL; - } - // copy frame allocator struct - RtlMoveMemory(Framing, &m_AllocatorFraming, sizeof(KSALLOCATOR_FRAMING)); - - IoStatusBlock->Information = sizeof(KSALLOCATOR_FRAMING); - IoStatusBlock->Status = STATUS_SUCCESS; - return STATUS_SUCCESS; - } - } -#endif - NTSTATUS NTAPI CPortPinWavePci::HandleKsStream( @@ -666,10 +547,13 @@ CPortPinWavePci::HandleKsStream( { NTSTATUS Status; ULONG Data = 0; + BOOLEAN bFailed; InterlockedIncrement((PLONG)&m_TotalPackets); DPRINT("IPortPinWaveCyclic_HandleKsStream entered Total %u State %x MinData %u\n", m_TotalPackets, m_State, m_IrpQueue->NumData()); + bFailed = m_IrpQueue->HasLastMappingFailed(); + Status = m_IrpQueue->AddMapping(Irp, &Data); if (NT_SUCCESS(Status)) @@ -679,6 +563,12 @@ CPortPinWavePci::HandleKsStream( else m_Position.WriteOffset += Data; + if (bFailed) + { + // notify stream of new mapping + m_Stream->MappingAvailable(); + } + return STATUS_PENDING; } @@ -741,37 +631,39 @@ CPortPinWavePci::Flush( return KsDispatchInvalidDeviceRequest(DeviceObject, Irp); } -VOID +NTSTATUS NTAPI -CPortPinWavePci::CloseStream() +CPortPinWavePci::Close( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) { - PMINIPORTWAVEPCISTREAM Stream; - ISubdevice *ISubDevice; + ISubdevice *SubDevice; NTSTATUS Status; PSUBDEVICE_DESCRIPTOR Descriptor; + if (m_ServiceGroup) + { + m_ServiceGroup->RemoveMember(PSERVICESINK(this)); + } + if (m_Stream) { if (m_State != KSSTATE_STOP) { m_Stream->SetState(KSSTATE_STOP); } + m_Stream->Release(); } - if (m_ServiceGroup) - { - m_ServiceGroup->RemoveMember(PSERVICESINK(this)); - } - - Status = m_Port->QueryInterface(IID_ISubdevice, (PVOID*)&ISubDevice); + Status = m_Port->QueryInterface(IID_ISubdevice, (PVOID*)&SubDevice); if (NT_SUCCESS(Status)) { - Status = ISubDevice->GetDescriptor(&Descriptor); + Status = SubDevice->GetDescriptor(&Descriptor); if (NT_SUCCESS(Status)) { Descriptor->Factory.Instances[m_ConnectDetails->PinId].CurrentPinInstanceCount--; } - ISubDevice->Release(); + SubDevice->Release(); } if (m_Format) @@ -780,93 +672,11 @@ CPortPinWavePci::CloseStream() m_Format = NULL; } - if (m_Stream) - { - Stream = m_Stream; - m_Stream = 0; - DPRINT("Closing stream at Irql %u\n", KeGetCurrentIrql()); - Stream->Release(); - } -} - -VOID -NTAPI -PinWavePciCloseStreamRoutine( - IN PDEVICE_OBJECT DeviceObject, - IN PVOID Context) -{ - CPortPinWavePci * This; - PCLOSESTREAM_CONTEXT Ctx = (PCLOSESTREAM_CONTEXT)Context; - - This = (CPortPinWavePci*)Ctx->Pin; - - This->CloseStream(); - - // complete the irp - Ctx->Irp->IoStatus.Information = 0; - Ctx->Irp->IoStatus.Status = STATUS_SUCCESS; - IoCompleteRequest(Ctx->Irp, IO_NO_INCREMENT); - - // free the work item - IoFreeWorkItem(Ctx->WorkItem); - - // free work item ctx - FreeItem(Ctx, TAG_PORTCLASS); -} - -NTSTATUS -NTAPI -CPortPinWavePci::Close( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) -{ - PCLOSESTREAM_CONTEXT Ctx; - - if (m_Stream) - { - Ctx = (PCLOSESTREAM_CONTEXT)AllocateItem(NonPagedPool, sizeof(CLOSESTREAM_CONTEXT), TAG_PORTCLASS); - if (!Ctx) - { - DPRINT("Failed to allocate stream context\n"); - goto cleanup; - } - - Ctx->WorkItem = IoAllocateWorkItem(DeviceObject); - if (!Ctx->WorkItem) - { - DPRINT("Failed to allocate work item\n"); - goto cleanup; - } - - Ctx->Irp = Irp; - Ctx->Pin = (PVOID)this; - - IoMarkIrpPending(Irp); - Irp->IoStatus.Information = 0; - Irp->IoStatus.Status = STATUS_PENDING; - - // defer work item - IoQueueWorkItem(Ctx->WorkItem, PinWavePciCloseStreamRoutine, DelayedWorkQueue, (PVOID)Ctx); - // Return result - return STATUS_PENDING; - } - - Irp->IoStatus.Information = 0; Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; - -cleanup: - - if (Ctx) - FreeItem(Ctx, TAG_PORTCLASS); - - Irp->IoStatus.Information = 0; - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_UNSUCCESSFUL; - } NTSTATUS @@ -1053,7 +863,7 @@ CPortPinWavePci::Init( if (!NT_SUCCESS(Status)) return Status; - Status = m_IrpQueue->Init(ConnectDetails, m_Format, DeviceObject, m_AllocatorFraming.FrameSize, m_AllocatorFraming.FileAlignment, NULL); + Status = m_IrpQueue->Init(ConnectDetails, m_AllocatorFraming.FrameSize, m_AllocatorFraming.FileAlignment, NULL); if (!NT_SUCCESS(Status)) { DPRINT("IrpQueue_Init failed with %x\n", Status); diff --git a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.cpp b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.cpp index e325e49fe61..0aa281d0032 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.cpp @@ -100,91 +100,6 @@ CPortPinWaveRT::QueryInterface( return STATUS_UNSUCCESSFUL; } -VOID -NTAPI -SetStreamWorkerRoutine( - IN PDEVICE_OBJECT DeviceObject, - IN PVOID Context) -{ - CPortPinWaveRT * This; - PSETSTREAM_CONTEXT Ctx = (PSETSTREAM_CONTEXT)Context; - KSSTATE State; - - This = Ctx->Pin; - State = Ctx->State; - - IoFreeWorkItem(Ctx->WorkItem); - FreeItem(Ctx, TAG_PORTCLASS); - - // Has the audio stream resumed? - if (This->m_IrpQueue->NumMappings() && State == KSSTATE_STOP) - return; - - // Set the state - if (NT_SUCCESS(This->m_Stream->SetState(State))) - { - // Set internal state to stop - This->m_State = State; - - if (This->m_State == KSSTATE_STOP) - { - // reset start stream - This->m_IrpQueue->CancelBuffers(); //FIX function name - DPRINT("Stopping PreCompleted %u PostCompleted %u\n", This->m_PreCompleted, This->m_PostCompleted); - } - - if (This->m_State == KSSTATE_RUN) - { - // start the notification timer - } - } -} - -VOID -NTAPI -CPortPinWaveRT::SetStreamState( - IN KSSTATE State) -{ - PDEVICE_OBJECT DeviceObject; - PIO_WORKITEM WorkItem; - PSETSTREAM_CONTEXT Context; - - PC_ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL); - - // Has the audio stream resumed? - if (m_IrpQueue->NumMappings() && State == KSSTATE_STOP) - return; - - // Has the audio state already been set? - if (m_State == State) - return; - - // Get device object - DeviceObject = GetDeviceObjectFromPortWaveRT(m_Port); - - // allocate set state context - Context = (PSETSTREAM_CONTEXT)AllocateItem(NonPagedPool, sizeof(SETSTREAM_CONTEXT), TAG_PORTCLASS); - - if (!Context) - return; - - // allocate work item - WorkItem = IoAllocateWorkItem(DeviceObject); - - if (!WorkItem) - { - ExFreePool(Context); - return; - } - - Context->Pin = this; - Context->WorkItem = WorkItem; - Context->State = State; - - // queue the work item - IoQueueWorkItem(WorkItem, SetStreamWorkerRoutine, DelayedWorkQueue, (PVOID)Context); -} - //================================================================================================================================== NTSTATUS @@ -313,7 +228,6 @@ CPortPinWaveRT::HandleKsProperty( if (m_Format) ExFreePoolWithTag(m_Format, TAG_PORTCLASS); - m_IrpQueue->UpdateFormat((PKSDATAFORMAT)NewDataFormat); m_Format = NewDataFormat; Irp->IoStatus.Information = DataFormat->FormatSize; Irp->IoStatus.Status = STATUS_SUCCESS; @@ -673,7 +587,7 @@ CPortPinWaveRT::Init( goto cleanup; } - Status = m_IrpQueue->Init(ConnectDetails, DataFormat, DeviceObject, 0, 0, NULL); + Status = m_IrpQueue->Init(ConnectDetails, 0, 0, NULL); if (!NT_SUCCESS(Status)) { goto cleanup; diff --git a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.cpp b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.cpp index 3122dfb661b..81d6ed9bfbf 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/port_wavepci.cpp @@ -161,8 +161,9 @@ CPortWavePci::QueryInterface( DPRINT("IPortWavePci_fnQueryInterface entered\n"); - if (IsEqualGUIDAligned(refiid, IID_IPortWavePci) || - IsEqualGUIDAligned(refiid, IID_IUnknown)) + if (IsEqualGUIDAligned(refiid, IID_IPortWavePci) || + IsEqualGUIDAligned(refiid, IID_IUnknown) || + IsEqualGUIDAligned(refiid, IID_IPort)) { *Output = PVOID(PPORTWAVEPCI(this)); PUNKNOWN(*Output)->AddRef(); @@ -171,7 +172,7 @@ CPortWavePci::QueryInterface( else if (IsEqualGUIDAligned(refiid, IID_IServiceSink)) { *Output = PVOID(PSERVICESINK(this)); - PUNKNOWN(*Output)->AddRef(); + PUNKNOWN(*Output)->AddRef(); return STATUS_SUCCESS; } else if (IsEqualGUIDAligned(refiid, IID_IPortEvents)) @@ -183,7 +184,7 @@ CPortWavePci::QueryInterface( else if (IsEqualGUIDAligned(refiid, IID_ISubdevice)) { *Output = PVOID(PSUBDEVICE(this)); - PUNKNOWN(*Output)->AddRef(); + PUNKNOWN(*Output)->AddRef(); return STATUS_SUCCESS; } else if (IsEqualGUIDAligned(refiid, IID_IPortClsVersion)) diff --git a/reactos/drivers/wdm/audio/drivers/CMIDriver/cmicontrol/main.h b/reactos/drivers/wdm/audio/drivers/CMIDriver/cmicontrol/main.h index 4230e55ad52..f3c0b980e86 100644 --- a/reactos/drivers/wdm/audio/drivers/CMIDriver/cmicontrol/main.h +++ b/reactos/drivers/wdm/audio/drivers/CMIDriver/cmicontrol/main.h @@ -24,8 +24,8 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef _MAIN_H_ -#define _MAIN_H_ + +#pragma once #include @@ -78,6 +78,4 @@ CMIDATA cmiData; HWAVEOUT hWave; WAVEHDR pwh; int currentChannelCount; -HFONT hURLFont; - -#endif //_MAIN_H_ \ No newline at end of file +HFONT hURLFont; \ No newline at end of file diff --git a/reactos/drivers/wdm/audio/drivers/CMIDriver/installer/main.h b/reactos/drivers/wdm/audio/drivers/CMIDriver/installer/main.h index c8cefe5406a..583a24d0ab5 100644 --- a/reactos/drivers/wdm/audio/drivers/CMIDriver/installer/main.h +++ b/reactos/drivers/wdm/audio/drivers/CMIDriver/installer/main.h @@ -25,8 +25,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef _MAIN_H_ -#define _MAIN_H_ +#pragma once #include #include @@ -75,7 +74,4 @@ const char DisplayName[] = _T("CMI 8738/8768 Audio Driver (remove only)"); const char DisplayIcon[] = _T("\\cmicontrol.exe,0"); const char Uninstaller[] = _T("\\cmicontrol.exe /uninstall"); const char Publisher[] = _T("Dogbert "); -const char URLInfoAbout[] = _T("http://cmediadrivers.googlepages.com/"); - - -#endif //_MAIN_H_ \ No newline at end of file +const char URLInfoAbout[] = _T("http://cmediadrivers.googlepages.com/"); \ No newline at end of file diff --git a/reactos/drivers/wdm/audio/drivers/CMIDriver/property.h b/reactos/drivers/wdm/audio/drivers/CMIDriver/property.h index 7e6593dfed2..4ecb4126276 100644 --- a/reactos/drivers/wdm/audio/drivers/CMIDriver/property.h +++ b/reactos/drivers/wdm/audio/drivers/CMIDriver/property.h @@ -25,8 +25,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef _PROPERTY_H_ -#define _PROPERTY_H_ +#pragma once //GUID for the private property // {2B81CDBB-EE6C-4ECC-8AA5-9A188B023DFF} @@ -84,5 +83,3 @@ typedef struct UInt32 formatMask; UInt32 enableSPDI; } CMIDATA; - -#endif //_PROPERTY_H_ diff --git a/reactos/drivers/wdm/audio/filters/kmixer/kmixer.h b/reactos/drivers/wdm/audio/filters/kmixer/kmixer.h index 70bdc6e1059..18c82c191a4 100644 --- a/reactos/drivers/wdm/audio/filters/kmixer/kmixer.h +++ b/reactos/drivers/wdm/audio/filters/kmixer/kmixer.h @@ -1,5 +1,4 @@ -#ifndef KMIXER_H__ -#define KMIXER_H__ +#pragma once #include #include @@ -35,6 +34,3 @@ KMixAllocateDeviceHeader( NTSTATUS CreatePin( IN PIRP Irp); - - -#endif diff --git a/reactos/drivers/wdm/audio/filters/splitter/precomp.h b/reactos/drivers/wdm/audio/filters/splitter/precomp.h index 7492e214cf7..76ad7f10f4b 100644 --- a/reactos/drivers/wdm/audio/filters/splitter/precomp.h +++ b/reactos/drivers/wdm/audio/filters/splitter/precomp.h @@ -1,5 +1,4 @@ -#ifndef PRECOMP_H__ -#define PRECOMP_H__ +#pragma once #include #include @@ -65,6 +64,3 @@ typedef struct ULONG BytesAvailable; ULONG BytesProcessed; }PIN_CONTEXT, *PPIN_CONTEXT; - - -#endif diff --git a/reactos/drivers/wdm/audio/filters/splitter/splitter.rbuild b/reactos/drivers/wdm/audio/filters/splitter/splitter.rbuild index 635ff0070f7..299df5e68e7 100644 --- a/reactos/drivers/wdm/audio/filters/splitter/splitter.rbuild +++ b/reactos/drivers/wdm/audio/filters/splitter/splitter.rbuild @@ -1,5 +1,5 @@ - + ntoskrnl ks diff --git a/reactos/drivers/wdm/audio/legacy/stream/stream.h b/reactos/drivers/wdm/audio/legacy/stream/stream.h index 742eaf02d52..6208d3a79eb 100644 --- a/reactos/drivers/wdm/audio/legacy/stream/stream.h +++ b/reactos/drivers/wdm/audio/legacy/stream/stream.h @@ -1,5 +1,4 @@ -#ifndef STREAM_H__ -#define STREAM_H__ +#pragma once #include #define YDEBUG @@ -136,5 +135,3 @@ CompleteIrp( IN PIRP Irp, IN NTSTATUS Status, IN ULONG_PTR Information); - -#endif diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/control.c b/reactos/drivers/wdm/audio/legacy/wdmaud/control.c index 9f51bf4f471..631b8619b55 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/control.c +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/control.c @@ -8,17 +8,7 @@ */ #include "wdmaud.h" -const GUID KSPROPSETID_Pin = {0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}}; -const GUID KSPROPSETID_Connection = {0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; const GUID KSPROPSETID_Sysaudio = {0xCBE3FAA0L, 0xCC75, 0x11D0, {0xB4, 0x65, 0x00, 0x00, 0x1A, 0x18, 0x18, 0xE6}}; -const GUID KSPROPSETID_General = {0x1464EDA5L, 0x6A8F, 0x11D1, {0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}}; -const GUID KSINTERFACESETID_Standard = {0x1A8766A0L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; -const GUID KSMEDIUMSETID_Standard = {0x4747B320L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; -const GUID KSDATAFORMAT_TYPE_AUDIO = {0x73647561L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; -const GUID KSDATAFORMAT_SUBTYPE_PCM = {0x00000001L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}}; -const GUID KSDATAFORMAT_SPECIFIER_WAVEFORMATEX = {0x05589f81L, 0xc356, 0x11ce, {0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a}}; -const GUID KSPROPSETID_Topology = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; - NTSTATUS WdmAudControlOpen( @@ -55,15 +45,15 @@ WdmAudControlDeviceType( if (DeviceInfo->DeviceType == MIXER_DEVICE_TYPE) { - Result = DeviceExtension->MixerInfoCount; + Result = WdmAudGetMixerDeviceCount(); } else if (DeviceInfo->DeviceType == WAVE_OUT_DEVICE_TYPE) { - Result = DeviceExtension->WaveOutDeviceCount; + Result = WdmAudGetWaveInDeviceCount(); } else if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE) { - Result = DeviceExtension->WaveInDeviceCount; + Result = WdmAudGetWaveOutDeviceCount(); } /* store result count */ @@ -221,7 +211,6 @@ WdmAudGetDeviceInterface( PWDMAUD_DEVICE_EXTENSION DeviceExtension; NTSTATUS Status; LPWSTR Device; - LPWAVE_INFO WaveInfo; ULONG Size, Length; /* get device extension */ @@ -233,7 +222,7 @@ WdmAudGetDeviceInterface( if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE || DeviceInfo->DeviceType == WAVE_OUT_DEVICE_TYPE) { /* get wave info */ - Status = GetWaveInfoByIndexAndType(DeviceObject, DeviceInfo->DeviceIndex, DeviceInfo->DeviceType, &WaveInfo); + Status = WdmAudGetPnpNameByIndexAndType(DeviceInfo->DeviceIndex, DeviceInfo->DeviceType, &Device); /* check for success */ if (!NT_SUCCESS(Status)) @@ -242,14 +231,6 @@ WdmAudGetDeviceInterface( return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO)); } - Status = GetSysAudioDevicePnpName(DeviceObject, WaveInfo->FilterId, &Device); - /* check for success */ - if (!NT_SUCCESS(Status)) - { - /* invalid device id */ - return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO)); - } - /* calculate length */ Length = (wcslen(Device)+1) * sizeof(WCHAR); @@ -275,13 +256,13 @@ WdmAudGetDeviceInterface( } else if (DeviceInfo->DeviceType == MIXER_DEVICE_TYPE) { - if (DeviceInfo->DeviceIndex >= DeviceExtension->MixerInfoCount) + if (DeviceInfo->DeviceIndex >= WdmAudGetMixerDeviceCount()) { /* invalid device id */ return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, sizeof(WDMAUD_DEVICE_INFO)); } - Status = GetSysAudioDevicePnpName(DeviceObject, DeviceExtension->MixerInfo[DeviceInfo->DeviceIndex].DeviceIndex, &Device); + Status = WdmAudGetMixerPnpNameByIndex(DeviceInfo->DeviceIndex, &Device); /* check for success */ if (!NT_SUCCESS(Status)) { @@ -308,8 +289,6 @@ WdmAudGetDeviceInterface( //FIXME SEH RtlMoveMemory(DeviceInfo->u.Interface.DeviceInterfaceString, Device, Length); } - - ExFreePool(Device); return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); } diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/entry.c b/reactos/drivers/wdm/audio/legacy/wdmaud/entry.c index 46d8775dc83..572a97258c9 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/entry.c +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/entry.c @@ -80,9 +80,7 @@ WdmAudInstallDevice( } Status = WdmAudMixerInitialize(DeviceObject); - DPRINT("WdmAudMixerInitialize Status %x\n", Status); - Status = WdmAudWaveInitialize(DeviceObject); - DPRINT("WdmAudWaveInitialize Status %x\n", Status); + DPRINT("WdmAudMixerInitialize Status %x WaveIn %lu WaveOut %lu Mixer %lu\n", Status, WdmAudGetWaveInDeviceCount(), WdmAudGetWaveOutDeviceCount(), WdmAudGetMixerDeviceCount()); DeviceObject->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE; DeviceObject->Flags &= ~ DO_DEVICE_INITIALIZING; diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h b/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h index 7e2e8bc1f6f..aa5e7b25f28 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/interface.h @@ -1,5 +1,4 @@ -#ifndef INTERFACE_H__ -#define INTERFACE_H__ +#pragma once /// /// WDMAUD Interface Definition @@ -375,4 +374,3 @@ typedef struct 17, \ METHOD_BUFFERED, \ FILE_CREATE_TREE_CONNECTION | FILE_ANY_ACCESS) -#endif diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/mixer.c b/reactos/drivers/wdm/audio/legacy/wdmaud/mixer.c deleted file mode 100644 index 9b70bb729b9..00000000000 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/mixer.c +++ /dev/null @@ -1,2438 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Kernel Streaming - * FILE: drivers/wdm/audio/legacy/wdmaud/mixer.c - * PURPOSE: System Audio graph builder - * PROGRAMMER: Andrew Greenwood - * Johannes Anderwald - */ -#include "wdmaud.h" - -const GUID KSNODETYPE_DAC = {0x507AE360L, 0xC554, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_ADC = {0x4D837FE0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_AGC = {0xE88C9BA0L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_LOUDNESS = {0x41887440L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_MUTE = {0x02B223C0L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_TONE = {0x7607E580L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_VOLUME = {0x3A5ACC00L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_PEAKMETER = {0xa085651e, 0x5f0d, 0x4b36, {0xa8, 0x69, 0xd1, 0x95, 0xd6, 0xab, 0x4b, 0x9e}}; -const GUID KSNODETYPE_MUX = {0x2CEAF780, 0xC556, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_STEREO_WIDE = {0xA9E69800L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_CHORUS = {0x20173F20L, 0xC559, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_REVERB = {0xEF0328E0L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_SUPERMIX = {0xE573ADC0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSNODETYPE_SUM = {0xDA441A60L, 0xC556, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}}; -const GUID KSPROPSETID_Audio = {0x45FFAAA0L, 0x6E1B, 0x11D0, {0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}}; - -#define DESTINATION_LINE 0xFFFF0000 - -LPMIXERLINE_EXT -GetSourceMixerLine( - LPMIXER_INFO MixerInfo, - DWORD dwSource) -{ - PLIST_ENTRY Entry; - LPMIXERLINE_EXT MixerLineSrc; - - /* get first entry */ - Entry = MixerInfo->LineList.Flink; - - while(Entry != &MixerInfo->LineList) - { - MixerLineSrc = (LPMIXERLINE_EXT)CONTAINING_RECORD(Entry, MIXERLINE_EXT, Entry); - DPRINT("dwSource %x dwSource %x\n", MixerLineSrc->Line.dwSource, dwSource); - if (MixerLineSrc->Line.dwSource == dwSource) - return MixerLineSrc; - - Entry = Entry->Flink; - } - - return NULL; -} - -LPMIXERCONTROL_DATA -GetMixerControlDataById( - PLIST_ENTRY ListHead, - DWORD dwControlId) -{ - PLIST_ENTRY Entry; - LPMIXERCONTROL_DATA Control; - - /* get first entry */ - Entry = ListHead->Flink; - - while(Entry != ListHead) - { - Control = (LPMIXERCONTROL_DATA)CONTAINING_RECORD(Entry, MIXERCONTROL_DATA, Entry); - DPRINT("dwSource %x dwSource %x\n", Control->dwControlID, dwControlId); - if (Control->dwControlID == dwControlId) - return Control; - - Entry = Entry->Flink; - } - return NULL; -} - -NTSTATUS -GetMixerControlById( - LPMIXER_INFO MixerInfo, - DWORD dwControlID, - LPMIXERLINE_EXT *MixerLine, - LPMIXERCONTROLW *MixerControl, - PULONG NodeId) -{ - PLIST_ENTRY Entry; - LPMIXERLINE_EXT MixerLineSrc; - ULONG Index; - - /* get first entry */ - Entry = MixerInfo->LineList.Flink; - - while(Entry != &MixerInfo->LineList) - { - MixerLineSrc = (LPMIXERLINE_EXT)CONTAINING_RECORD(Entry, MIXERLINE_EXT, Entry); - - for(Index = 0; Index < MixerLineSrc->Line.cControls; Index++) - { - if (MixerLineSrc->LineControls[Index].dwControlID == dwControlID) - { - if (MixerLine) - *MixerLine = MixerLineSrc; - if (MixerControl) - *MixerControl = &MixerLineSrc->LineControls[Index]; - if (NodeId) - *NodeId = MixerLineSrc->NodeIds[Index]; - return STATUS_SUCCESS; - } - } - Entry = Entry->Flink; - } - - return STATUS_NOT_FOUND; -} - -LPMIXERLINE_EXT -GetSourceMixerLineByComponentType( - LPMIXER_INFO MixerInfo, - DWORD dwComponentType) -{ - PLIST_ENTRY Entry; - LPMIXERLINE_EXT MixerLineSrc; - - /* get first entry */ - Entry = MixerInfo->LineList.Flink; - - while(Entry != &MixerInfo->LineList) - { - MixerLineSrc = (LPMIXERLINE_EXT)CONTAINING_RECORD(Entry, MIXERLINE_EXT, Entry); - if (MixerLineSrc->Line.dwComponentType == dwComponentType) - return MixerLineSrc; - - Entry = Entry->Flink; - } - - return NULL; -} - -LPMIXERLINE_EXT -GetSourceMixerLineByLineId( - LPMIXER_INFO MixerInfo, - DWORD dwLineID) -{ - PLIST_ENTRY Entry; - LPMIXERLINE_EXT MixerLineSrc; - - /* get first entry */ - Entry = MixerInfo->LineList.Flink; - - while(Entry != &MixerInfo->LineList) - { - MixerLineSrc = (LPMIXERLINE_EXT)CONTAINING_RECORD(Entry, MIXERLINE_EXT, Entry); - DPRINT("dwLineID %x dwLineID %x\n", MixerLineSrc->Line.dwLineID, dwLineID); - if (MixerLineSrc->Line.dwLineID == dwLineID) - return MixerLineSrc; - - Entry = Entry->Flink; - } - - return NULL; -} - - - -ULONG -GetPinCount( - IN PFILE_OBJECT FileObject) -{ - KSPROPERTY Pin; - NTSTATUS Status; - ULONG NumPins, BytesReturned; - - Pin.Flags = KSPROPERTY_TYPE_GET; - Pin.Set = KSPROPSETID_Pin; - Pin.Id = KSPROPERTY_PIN_CTYPES; - - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY), (PVOID)&NumPins, sizeof(ULONG), &BytesReturned); - if (!NT_SUCCESS(Status)) - return 0; - - return NumPins; -} - - -ULONG -GetSysAudioDeviceCount( - IN PDEVICE_OBJECT DeviceObject) -{ - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - KSPROPERTY Pin; - ULONG Count, BytesReturned; - NTSTATUS Status; - - /* setup the query request */ - Pin.Set = KSPROPSETID_Sysaudio; - Pin.Id = KSPROPERTY_SYSAUDIO_DEVICE_COUNT; - Pin.Flags = KSPROPERTY_TYPE_GET; - - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* query sysaudio for the device count */ - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY), (PVOID)&Count, sizeof(ULONG), &BytesReturned); - if (!NT_SUCCESS(Status)) - return 0; - - return Count; -} - -NTSTATUS -GetSysAudioDevicePnpName( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceIndex, - OUT LPWSTR * Device) -{ - ULONG BytesReturned; - KSP_PIN Pin; - NTSTATUS Status; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - - /* first check if the device index is within bounds */ - if (DeviceIndex >= GetSysAudioDeviceCount(DeviceObject)) - return STATUS_INVALID_PARAMETER; - - /* setup the query request */ - Pin.Property.Set = KSPROPSETID_Sysaudio; - Pin.Property.Id = KSPROPERTY_SYSAUDIO_DEVICE_INTERFACE_NAME; - Pin.Property.Flags = KSPROPERTY_TYPE_GET; - Pin.PinId = DeviceIndex; - - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* query sysaudio for the device path */ - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY) + sizeof(ULONG), NULL, 0, &BytesReturned); - - /* check if the request failed */ - if (Status != STATUS_BUFFER_TOO_SMALL || BytesReturned == 0) - return STATUS_UNSUCCESSFUL; - - /* allocate buffer for the device */ - *Device = ExAllocatePool(NonPagedPool, BytesReturned); - if (!Device) - return STATUS_INSUFFICIENT_RESOURCES; - - /* query sysaudio again for the device path */ - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY) + sizeof(ULONG), (PVOID)*Device, BytesReturned, &BytesReturned); - - if (!NT_SUCCESS(Status)) - { - /* failed */ - ExFreePool(*Device); - return Status; - } - - return Status; -} - -ULONG -GetDeviceIndexFromPnpName( - IN PDEVICE_OBJECT DeviceObject, - LPWSTR Device) -{ - ULONG Count, Index; - LPWSTR DeviceName; - NTSTATUS Status; - - /* get device count */ - Count = GetSysAudioDeviceCount(DeviceObject); - - if (!Count) - return MAXULONG; - - for(Index = 0; Index < Count; Index++) - { - /* get device name */ - Status = GetSysAudioDevicePnpName(DeviceObject, Index, &DeviceName); - if (NT_SUCCESS(Status)) - { - if (!wcsicmp(Device, DeviceName)) - { - /* found device index */ - ExFreePool(DeviceName); - return Index; - } - ExFreePool(DeviceName); - } - } - - return MAXULONG; -} - - -NTSTATUS -OpenDevice( - IN LPWSTR Device, - OUT PHANDLE DeviceHandle, - OUT PFILE_OBJECT * FileObject) -{ - NTSTATUS Status; - HANDLE hDevice; - - /* now open the device */ - Status = WdmAudOpenSysAudioDevice(Device, &hDevice); - - if (!NT_SUCCESS(Status)) - { - return Status; - } - - *DeviceHandle = hDevice; - - if (FileObject) - { - Status = ObReferenceObjectByHandle(hDevice, FILE_READ_DATA | FILE_WRITE_DATA, IoFileObjectType, KernelMode, (PVOID*)FileObject, NULL); - - if (!NT_SUCCESS(Status)) - { - ZwClose(hDevice); - } - } - - return Status; - -} - - -NTSTATUS -OpenSysAudioDeviceByIndex( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceIndex, - IN PHANDLE DeviceHandle, - IN PFILE_OBJECT * FileObject) -{ - LPWSTR Device = NULL; - NTSTATUS Status; - - Status = GetSysAudioDevicePnpName(DeviceObject, DeviceIndex, &Device); - if (!NT_SUCCESS(Status)) - return Status; - - Status = OpenDevice(Device, DeviceHandle, FileObject); - - /* free device buffer */ - ExFreePool(Device); - - return Status; -} - -NTSTATUS -GetFilterNodeProperty( - IN PFILE_OBJECT FileObject, - IN ULONG PropertyId, - PKSMULTIPLE_ITEM * Item) -{ - NTSTATUS Status; - ULONG BytesReturned; - PKSMULTIPLE_ITEM MultipleItem; - KSPROPERTY Property; - - /* setup query request */ - Property.Id = PropertyId; - Property.Flags = KSPROPERTY_TYPE_GET; - Property.Set = KSPROPSETID_Topology; - - /* query for required size */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), NULL, 0, &BytesReturned); - - /* check for success */ - if (Status != STATUS_MORE_ENTRIES) - return Status; - - /* allocate buffer */ - MultipleItem = (PKSMULTIPLE_ITEM)ExAllocatePool(NonPagedPool, BytesReturned); - if (!MultipleItem) - return STATUS_INSUFFICIENT_RESOURCES; - - /* query for required size */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)MultipleItem, BytesReturned, &BytesReturned); - - if (!NT_SUCCESS(Status)) - { - /* failed */ - ExFreePool(MultipleItem); - return Status; - } - - *Item = MultipleItem; - return Status; -} - -ULONG -CountNodeType( - PKSMULTIPLE_ITEM MultipleItem, - LPGUID NodeType) -{ - ULONG Count; - ULONG Index; - LPGUID Guid; - - Count = 0; - Guid = (LPGUID)(MultipleItem+1); - - /* iterate through node type array */ - for(Index = 0; Index < MultipleItem->Count; Index++) - { - if (IsEqualGUIDAligned(NodeType, Guid)) - { - /* found matching guid */ - Count++; - } - Guid++; - } - return Count; -} - -ULONG -GetNodeTypeIndex( - PKSMULTIPLE_ITEM MultipleItem, - LPGUID NodeType) -{ - ULONG Index; - LPGUID Guid; - - Guid = (LPGUID)(MultipleItem+1); - - /* iterate through node type array */ - for(Index = 0; Index < MultipleItem->Count; Index++) - { - if (IsEqualGUIDAligned(NodeType, Guid)) - { - /* found matching guid */ - return Index; - } - Guid++; - } - return MAXULONG; -} - -ULONG -GetControlTypeFromTopologyNode( - IN LPGUID NodeType) -{ - if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_AGC)) - { - // automatic gain control - return MIXERCONTROL_CONTROLTYPE_ONOFF; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_LOUDNESS)) - { - // loudness control - return MIXERCONTROL_CONTROLTYPE_LOUDNESS; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUTE )) - { - // mute control - return MIXERCONTROL_CONTROLTYPE_MUTE; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_TONE)) - { - // tpne control - //FIXME - // MIXERCONTROL_CONTROLTYPE_ONOFF if KSPROPERTY_AUDIO_BASS_BOOST is supported - // MIXERCONTROL_CONTROLTYPE_BASS if KSPROPERTY_AUDIO_BASS is supported - // MIXERCONTROL_CONTROLTYPE_TREBLE if KSPROPERTY_AUDIO_TREBLE is supported - UNIMPLEMENTED; - return MIXERCONTROL_CONTROLTYPE_ONOFF; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_VOLUME)) - { - // volume control - return MIXERCONTROL_CONTROLTYPE_VOLUME; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_PEAKMETER)) - { - // peakmeter control - return MIXERCONTROL_CONTROLTYPE_PEAKMETER; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUX)) - { - // mux control - return MIXERCONTROL_CONTROLTYPE_MUX; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_MUX)) - { - // mux control - return MIXERCONTROL_CONTROLTYPE_MUX; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_STEREO_WIDE)) - { - // stero wide control - return MIXERCONTROL_CONTROLTYPE_FADER; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_CHORUS)) - { - // chorus control - return MIXERCONTROL_CONTROLTYPE_FADER; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_REVERB)) - { - // reverb control - return MIXERCONTROL_CONTROLTYPE_FADER; - } - else if (IsEqualGUIDAligned(NodeType, (LPGUID)&KSNODETYPE_SUPERMIX)) - { - // supermix control - // MIXERCONTROL_CONTROLTYPE_MUTE if KSPROPERTY_AUDIO_MUTE is supported - UNIMPLEMENTED; - return MIXERCONTROL_CONTROLTYPE_VOLUME; - } - UNIMPLEMENTED - return 0; -} - -NTSTATUS -GetPhysicalConnection( - IN PFILE_OBJECT FileObject, - IN ULONG PinId, - OUT PKSPIN_PHYSICALCONNECTION *OutConnection) -{ - KSP_PIN Pin; - NTSTATUS Status; - ULONG BytesReturned; - PKSPIN_PHYSICALCONNECTION Connection; - - /* setup the request */ - Pin.Property.Flags = KSPROPERTY_TYPE_GET; - Pin.Property.Id = KSPROPERTY_PIN_PHYSICALCONNECTION; - Pin.Property.Set = KSPROPSETID_Pin; - Pin.PinId = PinId; - - /* query the pin for the physical connection */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), NULL, 0, &BytesReturned); - - if (Status == STATUS_NOT_FOUND) - { - /* pin does not have a physical connection */ - return Status; - } - - Connection = ExAllocatePool(NonPagedPool, BytesReturned); - if (!Connection) - { - /* not enough memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* query the pin for the physical connection */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)Connection, BytesReturned, &BytesReturned); - if (!NT_SUCCESS(Status)) - { - /* failed to query the physical connection */ - ExFreePool(Connection); - return Status; - } - - /* store connection */ - *OutConnection = Connection; - return Status; -} - -NTSTATUS -GetNodeIndexes( - IN PKSMULTIPLE_ITEM MultipleItem, - IN ULONG NodeIndex, - IN ULONG bNode, - IN ULONG bFrom, - OUT PULONG NodeReferenceCount, - OUT PULONG *NodeReference) -{ - ULONG Index, Count = 0; - PKSTOPOLOGY_CONNECTION Connection; - PULONG Refs; - - /* KSMULTIPLE_ITEM is followed by several KSTOPOLOGY_CONNECTION */ - Connection = (PKSTOPOLOGY_CONNECTION)(MultipleItem + 1); - - /* first count all referenced nodes */ - for(Index = 0; Index < MultipleItem->Count; Index++) - { - //DbgPrint("FromPin %u FromNode %u ToPin %u ToNode %u\n", Connection->FromNodePin, Connection->FromNode, Connection->ToNodePin, Connection->ToNode); - if (bNode) - { - if (bFrom) - { - if (Connection->FromNode == NodeIndex) - { - /* node id has a connection */ - Count++; - } - } - else - { - if (Connection->ToNode == NodeIndex) - { - /* node id has a connection */ - Count++; - } - } - } - else - { - if (bFrom) - { - if (Connection->FromNodePin == NodeIndex && Connection->FromNode == KSFILTER_NODE) - { - /* node id has a connection */ - Count++; - } - } - else - { - if (Connection->ToNodePin == NodeIndex && Connection->ToNode == KSFILTER_NODE) - { - /* node id has a connection */ - Count++; - } - } - } - - - /* move to next connection */ - Connection++; - } - - ASSERT(Count != 0); - - /* now allocate node index array */ - Refs = ExAllocatePool(NonPagedPool, sizeof(ULONG) * Count); - if (!Refs) - { - /* not enough memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* clear node index array */ - RtlZeroMemory(Refs, Count * sizeof(ULONG)); - - Count = 0; - Connection = (PKSTOPOLOGY_CONNECTION)(MultipleItem + 1); - for(Index = 0; Index < MultipleItem->Count; Index++) - { - if (bNode) - { - if (bFrom) - { - if (Connection->FromNode == NodeIndex) - { - /* node id has a connection */ - Refs[Count] = Index; - Count++; - } - } - else - { - if (Connection->ToNode == NodeIndex) - { - /* node id has a connection */ - Refs[Count] = Index; - Count++; - } - } - } - else - { - if (bFrom) - { - if (Connection->FromNodePin == NodeIndex && Connection->FromNode == KSFILTER_NODE) - { - /* node id has a connection */ - Refs[Count] = Index; - Count++; - } - } - else - { - if (Connection->ToNodePin == NodeIndex && Connection->ToNode == KSFILTER_NODE) - { - /* node id has a connection */ - Refs[Count] = Index; - Count++; - } - } - } - - /* move to next connection */ - Connection++; - } - - /* store result */ - *NodeReference = Refs; - *NodeReferenceCount = Count; - - return STATUS_SUCCESS; -} - - -NTSTATUS -GetTargetPinsByNodeConnectionIndex( - IN PKSMULTIPLE_ITEM NodeConnections, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG bUpDirection, - IN ULONG NodeConnectionIndex, - OUT PULONG Pins) -{ - PKSTOPOLOGY_CONNECTION Connection; - ULONG PinId, NodeConnectionCount, Index; - PULONG NodeConnection; - NTSTATUS Status; - - - /* sanity check */ - ASSERT(NodeConnectionIndex < NodeConnections->Count); - - Connection = (PKSTOPOLOGY_CONNECTION)(NodeConnections + 1); - - DPRINT("FromNode %u FromNodePin %u -> ToNode %u ToNodePin %u\n", Connection[NodeConnectionIndex].FromNode, Connection[NodeConnectionIndex].FromNodePin, Connection[NodeConnectionIndex].ToNode, Connection[NodeConnectionIndex].ToNodePin ); - - if ((Connection[NodeConnectionIndex].ToNode == KSFILTER_NODE && bUpDirection == FALSE) || - (Connection[NodeConnectionIndex].FromNode == KSFILTER_NODE && bUpDirection == TRUE)) - { - /* iteration stops here */ - if (bUpDirection) - PinId = Connection[NodeConnectionIndex].FromNodePin; - else - PinId = Connection[NodeConnectionIndex].ToNodePin; - - DPRINT("GetTargetPinsByNodeIndex FOUND Target Pin %u Parsed %u\n", PinId, Pins[PinId]); - - /* mark pin index as a target pin */ - Pins[PinId] = TRUE; - return STATUS_SUCCESS; - } - - /* get all node indexes referenced by that node */ - if (bUpDirection) - { - Status = GetNodeIndexes(NodeConnections, Connection[NodeConnectionIndex].FromNode, TRUE, FALSE, &NodeConnectionCount, &NodeConnection); - } - else - { - Status = GetNodeIndexes(NodeConnections, Connection[NodeConnectionIndex].ToNode, TRUE, TRUE, &NodeConnectionCount, &NodeConnection); - } - - if (NT_SUCCESS(Status)) - { - for(Index = 0; Index < NodeConnectionCount; Index++) - { - /* iterate recursively into the nodes */ - Status = GetTargetPinsByNodeConnectionIndex(NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Pins); - ASSERT(Status == STATUS_SUCCESS); - } - /* free node connection indexes */ - ExFreePool(NodeConnection); - } - - return Status; -} - - - -NTSTATUS -GetTargetPins( - PKSMULTIPLE_ITEM NodeTypes, - PKSMULTIPLE_ITEM NodeConnections, - IN ULONG NodeIndex, - IN ULONG bUpDirection, - PULONG Pins, - ULONG PinCount) -{ - ULONG NodeConnectionCount, Index; - NTSTATUS Status; - PULONG NodeConnection; - - /* sanity check */ - ASSERT(NodeIndex != (ULONG)-1); - - /* get all node indexes referenced by that pin */ - if (bUpDirection) - Status = GetNodeIndexes(NodeConnections, NodeIndex, TRUE, FALSE, &NodeConnectionCount, &NodeConnection); - else - Status = GetNodeIndexes(NodeConnections, NodeIndex, TRUE, TRUE, &NodeConnectionCount, &NodeConnection); - - DPRINT("NodeIndex %u Status %x Count %u\n", NodeIndex, Status, NodeConnectionCount); - - if (NT_SUCCESS(Status)) - { - for(Index = 0; Index < NodeConnectionCount; Index++) - { - Status = GetTargetPinsByNodeConnectionIndex(NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Pins); - ASSERT(Status == STATUS_SUCCESS); - } - ExFreePool(NodeConnection); - } - - return Status; -} - -PULONG -AllocatePinArray( - ULONG PinCount) -{ - PULONG Pins = ExAllocatePool(NonPagedPool, PinCount * sizeof(ULONG)); - if (!Pins) - return NULL; - - RtlZeroMemory(Pins, sizeof(ULONG) * PinCount); - - return Pins; -} - -PKSTOPOLOGY_CONNECTION -GetConnectionByIndex( - IN PKSMULTIPLE_ITEM MultipleItem, - IN ULONG Index) -{ - PKSTOPOLOGY_CONNECTION Descriptor; - - ASSERT(Index < MultipleItem->Count); - - Descriptor = (PKSTOPOLOGY_CONNECTION)(MultipleItem + 1); - return &Descriptor[Index]; -} - -LPGUID -GetNodeType( - IN PKSMULTIPLE_ITEM MultipleItem, - IN ULONG Index) -{ - LPGUID NodeType; - - ASSERT(Index < MultipleItem->Count); - - NodeType = (LPGUID)(MultipleItem + 1); - return &NodeType[Index]; -} - -NTSTATUS -GetControlsFromPinByConnectionIndex( - IN PKSMULTIPLE_ITEM NodeConnections, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG bUpDirection, - IN ULONG NodeConnectionIndex, - OUT PULONG Nodes) -{ - PKSTOPOLOGY_CONNECTION CurConnection; - LPGUID NodeType; - ULONG NodeIndex; - NTSTATUS Status; - ULONG NodeConnectionCount, Index; - PULONG NodeConnection; - - - /* get current connection */ - CurConnection = GetConnectionByIndex(NodeConnections, NodeConnectionIndex); - - if (bUpDirection) - NodeIndex = CurConnection->FromNode; - else - NodeIndex = CurConnection->ToNode; - - /* get target node type of current connection */ - NodeType = GetNodeType(NodeTypes, NodeIndex); - - if (IsEqualGUIDAligned(NodeType, &KSNODETYPE_SUM) || IsEqualGUIDAligned(NodeType, &KSNODETYPE_MUX)) - { - if (bUpDirection) - { - /* add the sum / mux node to destination line */ - Nodes[NodeIndex] = TRUE; - } - - return STATUS_SUCCESS; - } - - /* now add the node */ - Nodes[NodeIndex] = TRUE; - - - /* get all node indexes referenced by that node */ - if (bUpDirection) - { - Status = GetNodeIndexes(NodeConnections, NodeIndex, TRUE, FALSE, &NodeConnectionCount, &NodeConnection); - } - else - { - Status = GetNodeIndexes(NodeConnections, NodeIndex, TRUE, TRUE, &NodeConnectionCount, &NodeConnection); - } - - if (NT_SUCCESS(Status)) - { - for(Index = 0; Index < NodeConnectionCount; Index++) - { - /* iterate recursively into the nodes */ - Status = GetControlsFromPinByConnectionIndex(NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Nodes); - ASSERT(Status == STATUS_SUCCESS); - } - /* free node connection indexes */ - ExFreePool(NodeConnection); - } - - return Status; -} - -NTSTATUS -GetControlsFromPin( - IN PKSMULTIPLE_ITEM NodeConnections, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG PinId, - IN ULONG bUpDirection, - OUT PULONG Nodes) -{ - ULONG NodeConnectionCount, Index; - NTSTATUS Status; - PULONG NodeConnection; - - /* sanity check */ - ASSERT(PinId != (ULONG)-1); - - /* get all node indexes referenced by that pin */ - if (bUpDirection) - Status = GetNodeIndexes(NodeConnections, PinId, FALSE, FALSE, &NodeConnectionCount, &NodeConnection); - else - Status = GetNodeIndexes(NodeConnections, PinId, FALSE, TRUE, &NodeConnectionCount, &NodeConnection); - - for(Index = 0; Index < NodeConnectionCount; Index++) - { - /* get all associated controls */ - Status = GetControlsFromPinByConnectionIndex(NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Nodes); - } - - ExFreePool(NodeConnection); - - return Status; -} - -NTSTATUS -AddMixerControl( - IN LPMIXER_INFO MixerInfo, - IN PFILE_OBJECT FileObject, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG NodeIndex, - IN LPMIXERLINE_EXT MixerLine, - OUT LPMIXERCONTROLW MixerControl) -{ - LPGUID NodeType; - KSP_NODE Node; - ULONG BytesReturned; - NTSTATUS Status; - LPWSTR Name; - - /* initialize mixer control */ - MixerControl->cbStruct = sizeof(MIXERCONTROLW); - MixerControl->dwControlID = MixerInfo->ControlId; - - /* get node type */ - NodeType = GetNodeType(NodeTypes, NodeIndex); - /* store control type */ - MixerControl->dwControlType = GetControlTypeFromTopologyNode(NodeType); - - MixerControl->fdwControl = MIXERCONTROL_CONTROLF_UNIFORM; //FIXME - MixerControl->cMultipleItems = 0; //FIXME - - if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE) - { - MixerControl->Bounds.dwMinimum = 0; - MixerControl->Bounds.dwMaximum = 1; - } - else if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME) - { - MixerControl->Bounds.dwMinimum = 0; - MixerControl->Bounds.dwMaximum = 0xFFFF; - MixerControl->Metrics.cSteps = 0xC0; //FIXME - } - - /* setup request to retrieve name */ - Node.NodeId = NodeIndex; - Node.Property.Id = KSPROPERTY_TOPOLOGY_NAME; - Node.Property.Flags = KSPROPERTY_TYPE_GET; - Node.Property.Set = KSPROPSETID_Topology; - Node.Reserved = 0; - - /* get node name size */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), NULL, 0, &BytesReturned); - - if (Status == STATUS_BUFFER_TOO_SMALL) - { - ASSERT(BytesReturned != 0); - Name = ExAllocatePool(NonPagedPool, BytesReturned); - if (!Name) - { - /* not enough memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* get node name */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Node, sizeof(KSP_NODE), (LPVOID)Name, BytesReturned, &BytesReturned); - if (NT_SUCCESS(Status)) - { - RtlMoveMemory(MixerControl->szShortName, Name, (min(MIXER_SHORT_NAME_CHARS, wcslen(Name)+1)) * sizeof(WCHAR)); - MixerControl->szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0'; - - RtlMoveMemory(MixerControl->szName, Name, (min(MIXER_LONG_NAME_CHARS, wcslen(Name)+1)) * sizeof(WCHAR)); - MixerControl->szName[MIXER_LONG_NAME_CHARS-1] = L'\0'; - } - - /* free name buffer */ - ExFreePool(Name); - } - - MixerInfo->ControlId++; -#if 0 - if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUX) - { - KSNODEPROPERTY Property; - ULONG PinId = 2; - - /* setup the request */ - RtlZeroMemory(&Property, sizeof(KSNODEPROPERTY)); - - Property.NodeId = NodeIndex; - Property.Property.Id = KSPROPERTY_AUDIO_MUX_SOURCE; - Property.Property.Flags = KSPROPERTY_TYPE_SET; - Property.Property.Set = KSPROPSETID_Audio; - - /* get node volume level info */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSNODEPROPERTY), (PVOID)&PinId, sizeof(ULONG), &BytesReturned); - - DPRINT1("Status %x NodeIndex %u PinId %u\n", Status, NodeIndex, PinId); - //DbgBreakPoint(); - }else -#endif - if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME) - { - KSNODEPROPERTY_AUDIO_CHANNEL Property; - ULONG Length; - PKSPROPERTY_DESCRIPTION Desc; - PKSPROPERTY_MEMBERSHEADER Members; - PKSPROPERTY_STEPPING_LONG Range; - - Length = sizeof(KSPROPERTY_DESCRIPTION) + sizeof(KSPROPERTY_MEMBERSHEADER) + sizeof(KSPROPERTY_STEPPING_LONG); - Desc = ExAllocatePool(NonPagedPool, Length); - ASSERT(Desc); - RtlZeroMemory(Desc, Length); - - /* setup the request */ - RtlZeroMemory(&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL)); - - Property.NodeProperty.NodeId = NodeIndex; - Property.NodeProperty.Property.Id = KSPROPERTY_AUDIO_VOLUMELEVEL; - Property.NodeProperty.Property.Flags = KSPROPERTY_TYPE_BASICSUPPORT; - Property.NodeProperty.Property.Set = KSPROPSETID_Audio; - - /* get node volume level info */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL), Desc, Length, &BytesReturned); - - if (NT_SUCCESS(Status)) - { - LPMIXERVOLUME_DATA VolumeData; - ULONG Steps, MaxRange, Index; - LONG Value; - - Members = (PKSPROPERTY_MEMBERSHEADER)(Desc + 1); - Range = (PKSPROPERTY_STEPPING_LONG)(Members + 1); //98304 - - DPRINT("NodeIndex %u Range Min %d Max %d Steps %x UMin %x UMax %x\n", NodeIndex, Range->Bounds.SignedMinimum, Range->Bounds.SignedMaximum, Range->SteppingDelta, Range->Bounds.UnsignedMinimum, Range->Bounds.UnsignedMaximum); - - MaxRange = Range->Bounds.UnsignedMaximum - Range->Bounds.UnsignedMinimum; - - if (MaxRange) - { - ASSERT(MaxRange); - VolumeData = ExAllocatePool(NonPagedPool, sizeof(MIXERVOLUME_DATA)); - if (!VolumeData) - return STATUS_INSUFFICIENT_RESOURCES; - - Steps = MaxRange / Range->SteppingDelta + 1; - - /* store mixer control info there */ - VolumeData->Header.dwControlID = MixerControl->dwControlID; - VolumeData->SignedMaximum = Range->Bounds.SignedMaximum; - VolumeData->SignedMinimum = Range->Bounds.SignedMinimum; - VolumeData->SteppingDelta = Range->SteppingDelta; - VolumeData->ValuesCount = Steps; - VolumeData->InputSteppingDelta = 0x10000 / Steps; - - VolumeData->Values = ExAllocatePool(NonPagedPool, sizeof(LONG) * Steps); - if (!VolumeData->Values) - { - ExFreePool(Desc); - ExFreePool(VolumeData); - - return STATUS_INSUFFICIENT_RESOURCES; - } - - Value = Range->Bounds.SignedMinimum; - for(Index = 0; Index < Steps; Index++) - { - VolumeData->Values[Index] = Value; - Value += Range->SteppingDelta; - } - InsertTailList(&MixerLine->LineControlsExtraData, &VolumeData->Header.Entry); - } - } - ExFreePool(Desc); - } - - - DPRINT("Status %x Name %S\n", Status, MixerControl->szName); - return STATUS_SUCCESS; -} - -NTSTATUS -AddMixerSourceLine( - IN OUT LPMIXER_INFO MixerInfo, - IN PFILE_OBJECT FileObject, - IN PKSMULTIPLE_ITEM NodeConnections, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG DeviceIndex, - IN ULONG PinId, - IN ULONG bBridgePin, - IN ULONG bTargetPin) -{ - LPMIXERLINE_EXT SrcLine, DstLine; - NTSTATUS Status; - KSP_PIN Pin; - LPWSTR PinName; - GUID NodeType; - ULONG BytesReturned, ControlCount, Index; - PULONG Nodes; - - if (!bTargetPin) - { - /* allocate src mixer line */ - SrcLine = (LPMIXERLINE_EXT)ExAllocatePool(NonPagedPool, sizeof(MIXERLINE_EXT)); - - if (!SrcLine) - return STATUS_INSUFFICIENT_RESOURCES; - - /* zero struct */ - RtlZeroMemory(SrcLine, sizeof(MIXERLINE_EXT)); - - } - else - { - ASSERT(!IsListEmpty(&MixerInfo->LineList)); - SrcLine = GetSourceMixerLineByLineId(MixerInfo, DESTINATION_LINE); - } - - /* get destination line */ - DstLine = GetSourceMixerLineByLineId(MixerInfo, DESTINATION_LINE); - ASSERT(DstLine); - - - if (!bTargetPin) - { - /* initialize mixer src line */ - SrcLine->DeviceIndex = DeviceIndex; - SrcLine->PinId = PinId; - SrcLine->Line.cbStruct = sizeof(MIXERLINEW); - - /* initialize mixer destination line */ - SrcLine->Line.cbStruct = sizeof(MIXERLINEW); - SrcLine->Line.dwDestination = 0; - SrcLine->Line.dwSource = DstLine->Line.cConnections; - SrcLine->Line.dwLineID = (DstLine->Line.cConnections * 0x10000); - SrcLine->Line.fdwLine = MIXERLINE_LINEF_ACTIVE | MIXERLINE_LINEF_SOURCE; - SrcLine->Line.dwUser = 0; - SrcLine->Line.cChannels = DstLine->Line.cChannels; - SrcLine->Line.cConnections = 0; - SrcLine->Line.Target.dwType = 1; - SrcLine->Line.Target.dwDeviceID = DstLine->Line.Target.dwDeviceID; - SrcLine->Line.Target.wMid = MixerInfo->MixCaps.wMid; - SrcLine->Line.Target.wPid = MixerInfo->MixCaps.wPid; - SrcLine->Line.Target.vDriverVersion = MixerInfo->MixCaps.vDriverVersion; - InitializeListHead(&SrcLine->LineControlsExtraData); - wcscpy(SrcLine->Line.Target.szPname, MixerInfo->MixCaps.szPname); - - } - - /* allocate a node arrary */ - Nodes = ExAllocatePool(NonPagedPool, sizeof(ULONG) * NodeTypes->Count); - - if (!Nodes) - { - /* not enough memory */ - if (!bTargetPin) - { - ExFreePool(SrcLine); - } - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* clear nodes array */ - RtlZeroMemory(Nodes, sizeof(ULONG) * NodeTypes->Count); - - Status = GetControlsFromPin(NodeConnections, NodeTypes, PinId, bTargetPin, Nodes); - if (!NT_SUCCESS(Status)) - { - /* something went wrong */ - if (!bTargetPin) - { - ExFreePool(SrcLine); - } - ExFreePool(Nodes); - return Status; - } - - /* now count all nodes controlled by that pin */ - ControlCount = 0; - for(Index = 0; Index < NodeTypes->Count; Index++) - { - if (Nodes[Index]) - ControlCount++; - } - - /* now allocate the line controls */ - if (ControlCount) - { - SrcLine->LineControls = ExAllocatePool(NonPagedPool, sizeof(MIXERCONTROLW) * ControlCount); - - if (!SrcLine->LineControls) - { - /* no memory available */ - if (!bTargetPin) - { - ExFreePool(SrcLine); - } - ExFreePool(Nodes); - return STATUS_INSUFFICIENT_RESOURCES; - } - - SrcLine->NodeIds = ExAllocatePool(NonPagedPool, sizeof(ULONG) * ControlCount); - if (!SrcLine->NodeIds) - { - /* no memory available */ - ExFreePool(SrcLine->LineControls); - if (!bTargetPin) - { - ExFreePool(SrcLine); - } - ExFreePool(Nodes); - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* zero line controls */ - RtlZeroMemory(SrcLine->LineControls, sizeof(MIXERCONTROLW) * ControlCount); - RtlZeroMemory(SrcLine->NodeIds, sizeof(ULONG) * ControlCount); - - ControlCount = 0; - for(Index = 0; Index < NodeTypes->Count; Index++) - { - if (Nodes[Index]) - { - /* store the node index for retrieving / setting details */ - SrcLine->NodeIds[ControlCount] = Index; - - Status = AddMixerControl(MixerInfo, FileObject, NodeTypes, Index, SrcLine, &SrcLine->LineControls[ControlCount]); - if (NT_SUCCESS(Status)) - { - /* increment control count on success */ - ControlCount++; - } - } - } - /* store control count */ - SrcLine->Line.cControls = ControlCount; - } - - /* release nodes array */ - ExFreePool(Nodes); - - /* get pin category */ - Pin.PinId = PinId; - Pin.Reserved = 0; - Pin.Property.Flags = KSPROPERTY_TYPE_GET; - Pin.Property.Set = KSPROPSETID_Pin; - Pin.Property.Id = KSPROPERTY_PIN_CATEGORY; - - /* try get pin category */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (LPVOID)&NodeType, sizeof(GUID), &BytesReturned); - if (NT_SUCCESS(Status)) - { - //FIXME - //map component type - } - - /* retrieve pin name */ - Pin.PinId = PinId; - Pin.Reserved = 0; - Pin.Property.Flags = KSPROPERTY_TYPE_GET; - Pin.Property.Set = KSPROPSETID_Pin; - Pin.Property.Id = KSPROPERTY_PIN_NAME; - - /* try get pin name size */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), NULL, 0, &BytesReturned); - - if (Status != STATUS_MORE_ENTRIES) - { - SrcLine->Line.szShortName[0] = L'\0'; - SrcLine->Line.szName[0] = L'\0'; - } - else - { - PinName = (LPWSTR)ExAllocatePool(NonPagedPool, BytesReturned); - if (PinName) - { - /* try get pin name */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (LPVOID)PinName, BytesReturned, &BytesReturned); - - if (NT_SUCCESS(Status)) - { - RtlMoveMemory(SrcLine->Line.szShortName, PinName, (min(MIXER_SHORT_NAME_CHARS, wcslen(PinName)+1)) * sizeof(WCHAR)); - SrcLine->Line.szShortName[MIXER_SHORT_NAME_CHARS-1] = L'\0'; - - RtlMoveMemory(SrcLine->Line.szName, PinName, (min(MIXER_LONG_NAME_CHARS, wcslen(PinName)+1)) * sizeof(WCHAR)); - SrcLine->Line.szName[MIXER_LONG_NAME_CHARS-1] = L'\0'; - } - ExFreePool(PinName); - } - } - - /* insert src line */ - if (!bTargetPin) - { - InsertTailList(&MixerInfo->LineList, &SrcLine->Entry); - DstLine->Line.cConnections++; - } - - return STATUS_SUCCESS; -} - - -NTSTATUS -AddMixerSourceLines( - IN OUT LPMIXER_INFO MixerInfo, - IN PFILE_OBJECT FileObject, - IN PKSMULTIPLE_ITEM NodeConnections, - IN PKSMULTIPLE_ITEM NodeTypes, - IN ULONG DeviceIndex, - IN ULONG PinsCount, - IN ULONG BridgePinIndex, - IN ULONG TargetPinIndex, - IN PULONG Pins) -{ - ULONG Index; - NTSTATUS Status = STATUS_SUCCESS; - - for(Index = PinsCount; Index > 0; Index--) - { - if (Pins[Index-1]) - { - AddMixerSourceLine(MixerInfo, FileObject, NodeConnections, NodeTypes, DeviceIndex, Index-1, (Index -1 == BridgePinIndex), (Index -1 == TargetPinIndex)); - } - } - return Status; -} - - - -NTSTATUS -HandlePhysicalConnection( - IN OUT LPMIXER_INFO MixerInfo, - IN PDEVICE_OBJECT DeviceObject, - IN ULONG bInput, - IN PKSPIN_PHYSICALCONNECTION OutConnection) -{ - PULONG PinsRef = NULL, PinConnectionIndex = NULL, PinsSrcRef; - ULONG PinsRefCount, Index, PinConnectionIndexCount, DeviceIndex; - NTSTATUS Status; - HANDLE hDevice = NULL; - PFILE_OBJECT FileObject = NULL; - PKSMULTIPLE_ITEM NodeTypes = NULL; - PKSMULTIPLE_ITEM NodeConnections = NULL; - PULONG MixerControls; - ULONG MixerControlsCount; - - - /* open the connected filter */ - Status = OpenDevice(OutConnection->SymbolicLinkName, &hDevice, &FileObject); - if (!NT_SUCCESS(Status)) - { - DPRINT1("OpenDevice failed with %x\n", Status); - return Status; - } - - /* get device index */ - DeviceIndex = GetDeviceIndexFromPnpName(DeviceObject, OutConnection->SymbolicLinkName); - - /* get connected filter pin count */ - PinsRefCount = GetPinCount(FileObject); - ASSERT(PinsRefCount); - - PinsRef = AllocatePinArray(PinsRefCount); - if (!PinsRef) - { - /* no memory */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - /* get topology node types */ - Status = GetFilterNodeProperty(FileObject, KSPROPERTY_TOPOLOGY_NODES, &NodeTypes); - if (!NT_SUCCESS(Status)) - { - DPRINT1("GetFilterNodeProperty failed with %x\n", Status); - goto cleanup; - } - - /* get topology connections */ - Status = GetFilterNodeProperty(FileObject, KSPROPERTY_TOPOLOGY_CONNECTIONS, &NodeConnections); - if (!NT_SUCCESS(Status)) - { - DPRINT1("GetFilterNodeProperty failed with %x\n", Status); - goto cleanup; - } - /* gets connection index of the bridge pin which connects to a node */ - DPRINT("Pin %u\n", OutConnection->Pin); - Status = GetNodeIndexes(NodeConnections, OutConnection->Pin, FALSE, !bInput, &PinConnectionIndexCount, &PinConnectionIndex); - if (!NT_SUCCESS(Status)) - { - DPRINT1("GetNodeIndexes failed with %x\n", Status); - goto cleanup; - } - - /* there should be no split in the bride pin */ - ASSERT(PinConnectionIndexCount == 1); - - /* find all target pins of this connection */ - Status = GetTargetPinsByNodeConnectionIndex(NodeConnections, NodeTypes, FALSE, PinConnectionIndex[0], PinsRef); - if (!NT_SUCCESS(Status)) - { - DPRINT1("GetTargetPinsByNodeConnectionIndex failed with %x\n", Status); - goto cleanup; - } - - for(Index = 0; Index < PinsRefCount; Index++) - { - if (PinsRef[Index]) - { - - /* found a target pin, now get all references */ - Status = GetNodeIndexes(NodeConnections, Index, FALSE, FALSE, &MixerControlsCount, &MixerControls); - if (!NT_SUCCESS(Status)) - break; - - /* sanity check */ - ASSERT(MixerControlsCount == 1); - - - PinsSrcRef = AllocatePinArray(PinsRefCount); - if (!PinsSrcRef) - { - /* no memory */ - ExFreePool(MixerControls); - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - /* now get all connected source pins */ - Status = GetTargetPinsByNodeConnectionIndex(NodeConnections, NodeTypes, TRUE, MixerControls[0], PinsSrcRef); - if (!NT_SUCCESS(Status)) - { - /* no memory */ - ExFreePool(MixerControls); - ExFreePool(PinsSrcRef); - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - /* add pins from target line */ - if (!bInput) - { - // dont add bridge pin for input mixers - PinsSrcRef[Index] = TRUE; - PinsSrcRef[OutConnection->Pin] = TRUE; - } - PinsSrcRef[OutConnection->Pin] = TRUE; - - Status = AddMixerSourceLines(MixerInfo, FileObject, NodeConnections, NodeTypes, DeviceIndex, PinsRefCount, OutConnection->Pin, Index, PinsSrcRef); - - ExFreePool(MixerControls); - ExFreePool(PinsSrcRef); - } - } - -cleanup: - - if (PinsRef) - ExFreePool(PinsRef); - - if (NodeConnections) - ExFreePool(NodeConnections); - - if (NodeTypes) - ExFreePool(NodeTypes); - - if (FileObject) - ObDereferenceObject(FileObject); - - if (hDevice) - ZwClose(hDevice); - - if (PinConnectionIndex) - ExFreePool(PinConnectionIndex); - - - return Status; -} - - - -NTSTATUS -InitializeMixer( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceIndex, - IN OUT LPMIXER_INFO MixerInfo, - IN HANDLE hDevice, - IN PFILE_OBJECT FileObject, - IN ULONG PinCount, - IN PKSMULTIPLE_ITEM NodeTypes, - IN PKSMULTIPLE_ITEM NodeConnections, - IN ULONG NodeIndex, - IN ULONG bInput) -{ - WCHAR Buffer[100]; - LPWSTR Device; - NTSTATUS Status; - PULONG Pins; - ULONG Index; - PKSPIN_PHYSICALCONNECTION OutConnection; - LPMIXERLINE_EXT DestinationLine; - - DestinationLine = ExAllocatePool(NonPagedPool, sizeof(MIXERLINE_EXT)); - if (!DestinationLine) - return STATUS_INSUFFICIENT_RESOURCES; - - /* intialize mixer caps */ - MixerInfo->MixCaps.wMid = MM_MICROSOFT; //FIXME - MixerInfo->MixCaps.wPid = MM_PID_UNMAPPED; //FIXME - MixerInfo->MixCaps.vDriverVersion = 1; //FIXME - MixerInfo->MixCaps.fdwSupport = 0; - MixerInfo->MixCaps.cDestinations = 1; - MixerInfo->DeviceIndex = DeviceIndex; - - /* get target pnp name */ - Status = GetSysAudioDevicePnpName(DeviceObject, DeviceIndex, &Device); - if (NT_SUCCESS(Status)) - { - /* find product name */ - Status = FindProductName(Device, sizeof(Buffer) / sizeof(WCHAR), Buffer); - if (NT_SUCCESS(Status)) - { - if (bInput) - wcscat(Buffer, L" Input"); - else - wcscat(Buffer, L" output"); - RtlMoveMemory(MixerInfo->MixCaps.szPname, Buffer, min(MAXPNAMELEN, wcslen(Buffer)+1) * sizeof(WCHAR)); - MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] = L'\0'; - } - ExFreePool(Device); - } - - /* initialize mixer destination line */ - RtlZeroMemory(DestinationLine, sizeof(MIXERLINE_EXT)); - DestinationLine->Line.cbStruct = sizeof(MIXERLINEW); - DestinationLine->Line.dwSource = MAXULONG; - DestinationLine->Line.dwLineID = DESTINATION_LINE; - DestinationLine->Line.fdwLine = MIXERLINE_LINEF_ACTIVE; - DestinationLine->Line.dwUser = 0; - DestinationLine->Line.dwComponentType = (bInput == 0 ? MIXERLINE_COMPONENTTYPE_DST_SPEAKERS : MIXERLINE_COMPONENTTYPE_DST_WAVEIN); - DestinationLine->Line.cChannels = 2; //FIXME - wcscpy(DestinationLine->Line.szShortName, L"Summe"); //FIXME - wcscpy(DestinationLine->Line.szName, L"Summe"); //FIXME - DestinationLine->Line.Target.dwType = (bInput == 0 ? MIXERLINE_TARGETTYPE_WAVEOUT : MIXERLINE_TARGETTYPE_WAVEIN); - DestinationLine->Line.Target.dwDeviceID = !bInput; - DestinationLine->Line.Target.wMid = MixerInfo->MixCaps.wMid; - DestinationLine->Line.Target.wPid = MixerInfo->MixCaps.wPid; - DestinationLine->Line.Target.vDriverVersion = MixerInfo->MixCaps.vDriverVersion; - wcscpy(DestinationLine->Line.Target.szPname, MixerInfo->MixCaps.szPname); - - /* initialize source line list */ - InitializeListHead(&MixerInfo->LineList); - InitializeListHead(&DestinationLine->LineControlsExtraData); - - /* insert destination line */ - InsertHeadList(&MixerInfo->LineList, &DestinationLine->Entry); - - Pins = AllocatePinArray(PinCount); - if (!Pins) - return STATUS_INSUFFICIENT_RESOURCES; - - if (bInput) - { - Status = GetTargetPins(NodeTypes, NodeConnections, NodeIndex, TRUE, Pins, PinCount); - } - else - { - Status = GetTargetPins(NodeTypes, NodeConnections, NodeIndex, FALSE, Pins, PinCount); - } - - for(Index = 0; Index < PinCount; Index++) - { - if (Pins[Index]) - { - Status = GetPhysicalConnection(FileObject, Index, &OutConnection); - if (NT_SUCCESS(Status)) - { - Status = HandlePhysicalConnection(MixerInfo, DeviceObject, bInput, OutConnection); - ExFreePool(OutConnection); - } - } - } - ExFreePool(Pins); - - return STATUS_SUCCESS; -} - -NTSTATUS -WdmAudMixerInitialize( - IN PDEVICE_OBJECT DeviceObject) -{ - ULONG DeviceCount, Index, Count, NodeIndex, PinCount; - NTSTATUS Status; - HANDLE hDevice; - PFILE_OBJECT FileObject; - PKSMULTIPLE_ITEM NodeTypes, NodeConnections; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - - /* get number of devices */ - DeviceCount = GetSysAudioDeviceCount(DeviceObject); - - if (!DeviceCount) - { - /* no audio devices available atm */ - DeviceExtension->MixerInfoCount = 0; - DeviceExtension->MixerInfo = NULL; - return STATUS_SUCCESS; - } - - /* each virtual audio device can at most have an input + output mixer */ - DeviceExtension->MixerInfo = ExAllocatePool(NonPagedPool, sizeof(MIXER_INFO) * DeviceCount * 2); - if (!DeviceExtension->MixerInfo) - { - /* not enough memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* clear mixer info */ - RtlZeroMemory(DeviceExtension->MixerInfo, sizeof(MIXER_INFO) * DeviceCount * 2); - - Index = 0; - Count = 0; - do - { - /* open the virtual audio device */ - Status = OpenSysAudioDeviceByIndex(DeviceObject, Index, &hDevice, &FileObject); - - if (NT_SUCCESS(Status)) - { - /* retrieve all available node types */ - Status = GetFilterNodeProperty(FileObject, KSPROPERTY_TOPOLOGY_NODES, &NodeTypes); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(FileObject); - ZwClose(hDevice); - break; - } - - Status = GetFilterNodeProperty(FileObject, KSPROPERTY_TOPOLOGY_CONNECTIONS, &NodeConnections); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(FileObject); - ZwClose(hDevice); - ExFreePool(NodeTypes); - break; - } - - /* get num of pins */ - PinCount = GetPinCount(FileObject); - /* get the first available dac node index */ - NodeIndex = GetNodeTypeIndex(NodeTypes, (LPGUID)&KSNODETYPE_DAC); - if (NodeIndex != (ULONG)-1) - { - Status = InitializeMixer(DeviceObject, Index, &DeviceExtension->MixerInfo[Count], hDevice, FileObject, PinCount, NodeTypes, NodeConnections, NodeIndex, FALSE); - if (NT_SUCCESS(Status)) - { - /* increment mixer offset */ - Count++; - } - } - - /* get the first available adc node index */ - NodeIndex = GetNodeTypeIndex(NodeTypes, (LPGUID)&KSNODETYPE_ADC); - if (NodeIndex != (ULONG)-1) - { - Status = InitializeMixer(DeviceObject, Index, &DeviceExtension->MixerInfo[Count], hDevice, FileObject, PinCount, NodeTypes, NodeConnections, NodeIndex, TRUE); - if (NT_SUCCESS(Status)) - { - /* increment mixer offset */ - Count++; - } - } - - /* free node connections array */ - ExFreePool(NodeTypes); - ExFreePool(NodeConnections); - - /* close virtual audio device */ - ObDereferenceObject(FileObject); - ZwClose(hDevice); - - } - /* increment virtual audio device index */ - Index++; - }while(Index < DeviceCount); - - /* store mixer count */ - DeviceExtension->MixerInfoCount = Count; - - return Status; -} - - - -NTSTATUS -WdmAudMixerCapabilities( - IN PDEVICE_OBJECT DeviceObject, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo, - IN PWDMAUD_DEVICE_EXTENSION DeviceExtension) -{ - if ((ULONG)DeviceInfo->DeviceIndex >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return STATUS_INVALID_PARAMETER; - } - - /* copy cached mixer caps */ - RtlMoveMemory(&DeviceInfo->u.MixCaps, &DeviceExtension->MixerInfo[(ULONG)DeviceInfo->DeviceIndex].MixCaps, sizeof(MIXERCAPSW)); - - return STATUS_SUCCESS; -} - - -NTSTATUS -WdmAudControlOpenMixer( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo) -{ - ULONG Index; - PWDMAUD_HANDLE Handels; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - NTSTATUS Status; - PKEVENT EventObject = NULL; - - DPRINT("WdmAudControlOpenMixer\n"); - - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - if (DeviceInfo->DeviceIndex >= DeviceExtension->MixerInfoCount) - { - /* mixer index doesnt exist */ - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); - } - - if (DeviceInfo->u.hNotifyEvent) - { - Status = ObReferenceObjectByHandle(DeviceInfo->u.hNotifyEvent, EVENT_MODIFY_STATE, ExEventObjectType, UserMode, (LPVOID*)&EventObject, NULL); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("Invalid notify event passed %p from client %p\n", DeviceInfo->u.hNotifyEvent, ClientInfo); - DbgBreakPoint(); - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); - } - } - - - for(Index = 0; Index < ClientInfo->NumPins; Index++) - { - if (ClientInfo->hPins[Index].Handle == (HANDLE)DeviceInfo->DeviceIndex && ClientInfo->hPins[Index].Type == MIXER_DEVICE_TYPE) - { - /* re-use pseudo handle */ - DeviceInfo->hDevice = (HANDLE)DeviceInfo->DeviceIndex; - ClientInfo->hPins[Index].NotifyEvent = EventObject; - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); - } - } - - Handels = ExAllocatePool(NonPagedPool, sizeof(WDMAUD_HANDLE) * (ClientInfo->NumPins+1)); - - if (Handels) - { - if (ClientInfo->NumPins) - { - RtlMoveMemory(Handels, ClientInfo->hPins, sizeof(WDMAUD_HANDLE) * ClientInfo->NumPins); - ExFreePool(ClientInfo->hPins); - } - - ClientInfo->hPins = Handels; - ClientInfo->hPins[ClientInfo->NumPins].Handle = (HANDLE)DeviceInfo->DeviceIndex; - ClientInfo->hPins[ClientInfo->NumPins].Type = MIXER_DEVICE_TYPE; - ClientInfo->hPins[ClientInfo->NumPins].NotifyEvent = EventObject; - ClientInfo->NumPins++; - } - else - { - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); - } - DeviceInfo->hDevice = (HANDLE)DeviceInfo->DeviceIndex; - - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); -} - -NTSTATUS -NTAPI -WdmAudGetLineInfo( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo) -{ - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - LPMIXERLINE_EXT MixerLineSrc; - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; - - if (DeviceInfo->Flags == MIXER_GETLINEINFOF_DESTINATION) - { - if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - if (DeviceInfo->u.MixLine.dwDestination != 0) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DESTINATION_LINE); - ASSERT(MixerLineSrc); - - /* copy cached data */ - RtlCopyMemory(&DeviceInfo->u.MixLine, &MixerLineSrc->Line, sizeof(MIXERLINEW)); - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); - } - else if (DeviceInfo->Flags == MIXER_GETLINEINFOF_SOURCE) - { - if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DESTINATION_LINE); - ASSERT(MixerLineSrc); - - if (DeviceInfo->u.MixLine.dwSource >= MixerLineSrc->Line.cConnections) - { - DPRINT1("dwSource %u > Destinations %u\n", DeviceInfo->u.MixLine.dwSource, MixerLineSrc->Line.cConnections); - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - MixerLineSrc = GetSourceMixerLine(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixLine.dwSource); - if (MixerLineSrc) - { - DPRINT("Line %u Name %S\n", MixerLineSrc->Line.dwSource, MixerLineSrc->Line.szName); - RtlCopyMemory(&DeviceInfo->u.MixLine, &MixerLineSrc->Line, sizeof(MIXERLINEW)); - } - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); - } - else if (DeviceInfo->Flags == MIXER_GETLINEINFOF_LINEID) - { - if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixLine.dwLineID); - if (!MixerLineSrc) - { - DPRINT1("Failed to find Line with id %u\n", DeviceInfo->u.MixLine.dwLineID); - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - /* copy cached data */ - RtlCopyMemory(&DeviceInfo->u.MixLine, &MixerLineSrc->Line, sizeof(MIXERLINEW)); - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); - } - else if (DeviceInfo->Flags == MIXER_GETLINEINFOF_COMPONENTTYPE) - { - if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - MixerLineSrc = GetSourceMixerLineByComponentType(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixLine.dwComponentType); - if (!MixerLineSrc) - { - DPRINT1("Failed to find component type %x\n", DeviceInfo->u.MixLine.dwComponentType); - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); - } - - ASSERT(MixerLineSrc); - - /* copy cached data */ - RtlCopyMemory(&DeviceInfo->u.MixLine, &MixerLineSrc->Line, sizeof(MIXERLINEW)); - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); - } - - DPRINT("Flags %x\n", DeviceInfo->Flags); - UNIMPLEMENTED; - - //DbgBreakPoint(); - return SetIrpIoStatus(Irp, STATUS_NOT_IMPLEMENTED, 0); - -} - -NTSTATUS -NTAPI -WdmAudGetLineControls( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo) -{ - LPMIXERLINE_EXT MixerLineSrc; - LPMIXERCONTROLW MixerControl; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - ULONG Index; - NTSTATUS Status; - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; - - if (DeviceInfo->Flags == MIXER_GETLINECONTROLSF_ALL) - { - if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixControls.dwLineID); - ASSERT(MixerLineSrc); - if (MixerLineSrc) - { - RtlMoveMemory(DeviceInfo->u.MixControls.pamxctrl, MixerLineSrc->LineControls, min(MixerLineSrc->Line.cControls, DeviceInfo->u.MixControls.cControls) * sizeof(MIXERCONTROLW)); - } - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); - } - else if (DeviceInfo->Flags == MIXER_GETLINECONTROLSF_ONEBYTYPE) - { - if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - MixerLineSrc = GetSourceMixerLineByLineId(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixControls.dwLineID); - ASSERT(MixerLineSrc); - - Index = 0; - for(Index = 0; Index < MixerLineSrc->Line.cControls; Index++) - { - DPRINT("dwControlType %x\n", MixerLineSrc->LineControls[Index].dwControlType); - if (DeviceInfo->u.MixControls.dwControlType == MixerLineSrc->LineControls[Index].dwControlType) - { - RtlMoveMemory(DeviceInfo->u.MixControls.pamxctrl, &MixerLineSrc->LineControls[Index], sizeof(MIXERCONTROLW)); - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); - } - } - DPRINT("DeviceInfo->u.MixControls.dwControlType %x not found in Line %x cControls %u \n", DeviceInfo->u.MixControls.dwControlType, DeviceInfo->u.MixControls.dwLineID, MixerLineSrc->Line.cControls); - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); - } - else if (DeviceInfo->Flags == MIXER_GETLINECONTROLSF_ONEBYID) - { - if ((ULONG_PTR)DeviceInfo->hDevice >= DeviceExtension->MixerInfoCount) - { - /* invalid parameter */ - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - DPRINT("MixerId %u ControlId %u\n",(ULONG_PTR)DeviceInfo->hDevice, DeviceInfo->u.MixControls.dwControlID); - Status = GetMixerControlById(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixControls.dwControlID, NULL, &MixerControl, NULL); - if (NT_SUCCESS(Status)) - { - RtlMoveMemory(DeviceInfo->u.MixControls.pamxctrl, MixerControl, sizeof(MIXERCONTROLW)); - } - return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO)); - } - - UNIMPLEMENTED; - //DbgBreakPoint(); - return SetIrpIoStatus(Irp, STATUS_NOT_IMPLEMENTED, 0); - -} - -NTSTATUS -SetGetControlDetails( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceId, - IN ULONG NodeId, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN ULONG bSet, - IN ULONG PropertyId, - IN ULONG Channel, - IN PLONG InputValue) -{ - KSNODEPROPERTY_AUDIO_CHANNEL Property; - NTSTATUS Status; - HANDLE hDevice; - PFILE_OBJECT FileObject; - LONG Value; - ULONG BytesReturned; - - if (bSet) - Value = *InputValue; - - /* open virtual audio device */ - Status = OpenSysAudioDeviceByIndex(DeviceObject, DeviceId, &hDevice, &FileObject); - - if (!NT_SUCCESS(Status)) - { - /* failed */ - return Status; - } - - /* setup the request */ - RtlZeroMemory(&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL)); - - Property.NodeProperty.NodeId = NodeId; - Property.NodeProperty.Property.Id = PropertyId; - Property.NodeProperty.Property.Flags = KSPROPERTY_TYPE_TOPOLOGY; - Property.NodeProperty.Property.Set = KSPROPSETID_Audio; - Property.Channel = Channel; - - if (bSet) - Property.NodeProperty.Property.Flags |= KSPROPERTY_TYPE_SET; - else - Property.NodeProperty.Property.Flags |= KSPROPERTY_TYPE_GET; - - /* send the request */ - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSNODEPROPERTY_AUDIO_CHANNEL), (PVOID)&Value, sizeof(LONG), &BytesReturned); - - ObDereferenceObject(FileObject); - ZwClose(hDevice); - - if (!bSet) - { - *InputValue = Value; - } - - DPRINT("Status %x bSet %u NodeId %u Value %d PropertyId %u\n", Status, bSet, NodeId, Value, PropertyId); - return Status; -} - -NTSTATUS -NotifyWdmAudClients( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG NotificationType, - IN HANDLE hMixer, - IN ULONG Value) -{ - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - PLIST_ENTRY Entry; - PWDMAUD_CLIENT CurClient; - PMIXER_EVENT Event; - KIRQL OldIrql; - ULONG Index; - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* acquire client context lock */ - KeAcquireSpinLock(&DeviceExtension->Lock, &OldIrql); - - /* point to first entry */ - Entry = DeviceExtension->WdmAudClientList.Flink; - - /* iterate through all clients */ - while(Entry != &DeviceExtension->WdmAudClientList) - { - /* get client context */ - CurClient = (PWDMAUD_CLIENT)CONTAINING_RECORD(Entry, WDMAUD_CLIENT, Entry); - - /* now iterate through all pins and try to find an matching handle */ - for(Index = 0; Index < CurClient->NumPins; Index++) - { - if (CurClient->hPins[Index].Handle == hMixer && CurClient->hPins[Index].Type == MIXER_DEVICE_TYPE && CurClient->hPins[Index].NotifyEvent) - { - /* allocate event entry */ - Event = (PMIXER_EVENT)ExAllocatePool(NonPagedPool, sizeof(MIXER_EVENT)); - if (!Event) - { - /* no memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* initialize event entry */ - Event->hMixer = hMixer; - Event->NotificationType = NotificationType; - Event->Value = Value; - - /* insert event entry */ - InsertTailList(&CurClient->MixerEventList, &Event->Entry); - - DPRINT("Notifying %p hMixer %p Value %x NotificationType %u\n", CurClient->hPins[Index].NotifyEvent, hMixer, Value, NotificationType); - - /* now signal the event */ - KeSetEvent(CurClient->hPins[Index].NotifyEvent, 0, FALSE); - - - - /* search next client */ - break; - } - } - - /* move to next client */ - Entry = Entry->Flink; - } - - /* release client context lock */ - KeReleaseSpinLock(&DeviceExtension->Lock, OldIrql); - - /* done */ - return STATUS_SUCCESS; -} - -NTSTATUS -SetGetMuteControlDetails( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceId, - IN ULONG NodeId, - IN ULONG dwLineID, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN ULONG bSet) -{ - LPMIXERCONTROLDETAILS_BOOLEAN Input; - LONG Value; - NTSTATUS Status; - - if (DeviceInfo->u.MixDetails.cbDetails != sizeof(MIXERCONTROLDETAILS_BOOLEAN)) - return STATUS_INVALID_PARAMETER; - - /* get input */ - Input = (LPMIXERCONTROLDETAILS_BOOLEAN)DeviceInfo->u.MixDetails.paDetails; - - /* FIXME SEH */ - if (bSet) - Value = Input->fValue; - - /* set control details */ - Status = SetGetControlDetails(DeviceObject, DeviceId, NodeId, DeviceInfo, bSet, KSPROPERTY_AUDIO_MUTE, 0, &Value); - - if (!NT_SUCCESS(Status)) - return Status; - - /* FIXME SEH */ - if (!bSet) - { - Input->fValue = Value; - return Status; - } - else - { - /* notify clients of a line change */ - NotifyWdmAudClients(DeviceObject, MM_MIXM_LINE_CHANGE, DeviceInfo->hDevice, dwLineID); - } - - - return Status; -} - -ULONG -GetVolumeControlIndex( - LPMIXERVOLUME_DATA VolumeData, - LONG Value) -{ - ULONG Index; - - for(Index = 0; Index < VolumeData->ValuesCount; Index++) - { - if (VolumeData->Values[Index] > Value) - { - return VolumeData->InputSteppingDelta * Index; - } - } - return VolumeData->InputSteppingDelta * (VolumeData->ValuesCount-1); -} - - -NTSTATUS -SetGetVolumeControlDetails( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceId, - IN ULONG NodeId, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN ULONG bSet, - LPMIXERCONTROLW MixerControl, - LPMIXERLINE_EXT MixerLine) -{ - LPMIXERCONTROLDETAILS_UNSIGNED Input; - LONG Value, Index, Channel = 0; - ULONG dwValue; - NTSTATUS Status; - LPMIXERVOLUME_DATA VolumeData; - - if (DeviceInfo->u.MixDetails.cbDetails != sizeof(MIXERCONTROLDETAILS_SIGNED)) - return STATUS_INVALID_PARAMETER; - - VolumeData = (LPMIXERVOLUME_DATA)GetMixerControlDataById(&MixerLine->LineControlsExtraData, MixerControl->dwControlID); - if (!VolumeData) - return STATUS_INSUFFICIENT_RESOURCES; - - - /* get input */ - Input = (LPMIXERCONTROLDETAILS_UNSIGNED)DeviceInfo->u.MixDetails.paDetails; - - if (bSet) - { - /* FIXME SEH */ - Value = Input->dwValue; - Index = Value / VolumeData->InputSteppingDelta; - - if (Index >= VolumeData->ValuesCount) - { - DPRINT1("Index %u out of bounds %u \n", Index, VolumeData->ValuesCount); - DbgBreakPoint(); - return STATUS_INVALID_PARAMETER; - } - - Value = VolumeData->Values[Index]; - } - - /* set control details */ - if (bSet) - { - Status = SetGetControlDetails(DeviceObject, DeviceId, NodeId, DeviceInfo, bSet, KSPROPERTY_AUDIO_VOLUMELEVEL, 0, &Value); - Status = SetGetControlDetails(DeviceObject, DeviceId, NodeId, DeviceInfo, bSet, KSPROPERTY_AUDIO_VOLUMELEVEL, 1, &Value); - } - else - { - Status = SetGetControlDetails(DeviceObject, DeviceId, NodeId, DeviceInfo, bSet, KSPROPERTY_AUDIO_VOLUMELEVEL, Channel, &Value); - } - - if (!bSet) - { - dwValue = GetVolumeControlIndex(VolumeData, (LONG)Value); - /* FIXME SEH */ - Input->dwValue = dwValue; - } - else - { - /* notify clients of a line change */ - NotifyWdmAudClients(DeviceObject, MM_MIXM_CONTROL_CHANGE, DeviceInfo->hDevice, MixerControl->dwControlID); - } - return Status; - } - -NTSTATUS -NTAPI -WdmAudGetMixerEvent( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo) -{ - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - PMIXER_EVENT Event = NULL; - PLIST_ENTRY Entry; - KIRQL OldIrql; - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* acquire client context lock */ - KeAcquireSpinLock(&DeviceExtension->Lock, &OldIrql); - - /* point to first entry */ - Entry = ClientInfo->MixerEventList.Flink; - - while(Entry != &ClientInfo->MixerEventList) - { - /* get mixer event */ - Event = (PMIXER_EVENT)CONTAINING_RECORD(Entry, MIXER_EVENT, Entry); - - if (Event->hMixer == DeviceInfo->hDevice) - { - /* found an event for that particular device */ - RemoveEntryList(&Event->Entry); - break; - } - - /* no match found */ - Event = NULL; - - /* move to next entry */ - Entry = Entry->Flink; - } - - /* release client context lock */ - KeReleaseSpinLock(&DeviceExtension->Lock, OldIrql); - - if (!Event) - { - /* no events available */ - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); -} - - /* store event result */ - DeviceInfo->u.MixerEvent.hMixer = Event->hMixer; - DeviceInfo->u.MixerEvent.NotificationType = Event->NotificationType; - DeviceInfo->u.MixerEvent.Value = Event->Value; - - /* free event info */ - ExFreePool(Event); - - /* done */ - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); -} - -NTSTATUS -NTAPI -WdmAudSetControlDetails( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo) -{ - LPMIXERLINE_EXT MixerLine; - LPMIXERCONTROLW MixerControl; - ULONG NodeId; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - NTSTATUS Status; - - DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; - - DPRINT("cbStruct %u Expected %u dwControlID %u cChannels %u cMultipleItems %u cbDetails %u paDetails %p Flags %x\n", - DeviceInfo->u.MixDetails.cbStruct, sizeof(MIXERCONTROLDETAILS), DeviceInfo->u.MixDetails.dwControlID, DeviceInfo->u.MixDetails.cChannels, DeviceInfo->u.MixDetails.cMultipleItems, DeviceInfo->u.MixDetails.cbDetails, DeviceInfo->u.MixDetails.paDetails, DeviceInfo->Flags); - - if (DeviceInfo->Flags & MIXER_GETCONTROLDETAILSF_LISTTEXT) - { - UNIMPLEMENTED; - return SetIrpIoStatus(Irp, STATUS_NOT_IMPLEMENTED, 0); - } - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* get mixer control */ - Status = GetMixerControlById(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixDetails.dwControlID, &MixerLine, &MixerControl, &NodeId); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("MixerControl %x not found\n", DeviceInfo->u.MixDetails.dwControlID); - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - Status = STATUS_NOT_IMPLEMENTED; - DPRINT("dwLineId %x dwControlID %x dwControlType %x\n", MixerLine->Line.dwLineID, MixerControl->dwControlID, MixerControl->dwControlType); - if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE) - { - /* send the request */ - Status = SetGetMuteControlDetails(DeviceObject, MixerLine->DeviceIndex, NodeId, MixerLine->Line.dwLineID, DeviceInfo, TRUE); - } - else if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME) - { - Status = SetGetVolumeControlDetails(DeviceObject, MixerLine->DeviceIndex, NodeId, DeviceInfo, TRUE, MixerControl, MixerLine); - } - return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO)); - -} - -NTSTATUS -NTAPI -WdmAudGetControlDetails( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo) -{ - LPMIXERLINE_EXT MixerLine; - LPMIXERCONTROLW MixerControl; - ULONG NodeId; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - NTSTATUS Status; - - DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; - - DPRINT("cbStruct %u Expected %u dwControlID %u cChannels %u cMultipleItems %u cbDetails %u paDetails %p Flags %x\n", - DeviceInfo->u.MixDetails.cbStruct, sizeof(MIXERCONTROLDETAILS), DeviceInfo->u.MixDetails.dwControlID, DeviceInfo->u.MixDetails.cChannels, DeviceInfo->u.MixDetails.cMultipleItems, DeviceInfo->u.MixDetails.cbDetails, DeviceInfo->u.MixDetails.paDetails, DeviceInfo->Flags); - - if (DeviceInfo->Flags & MIXER_GETCONTROLDETAILSF_LISTTEXT) - { - UNIMPLEMENTED; - return SetIrpIoStatus(Irp, STATUS_NOT_IMPLEMENTED, 0); - } - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* get mixer control */ - Status = GetMixerControlById(&DeviceExtension->MixerInfo[(ULONG_PTR)DeviceInfo->hDevice], DeviceInfo->u.MixDetails.dwControlID, &MixerLine, &MixerControl, &NodeId); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("MixerControl %x not found\n", DeviceInfo->u.MixDetails.dwControlID); - return SetIrpIoStatus(Irp, STATUS_INVALID_PARAMETER, 0); - } - - Status = STATUS_NOT_IMPLEMENTED; - DPRINT("dwLineId %x dwControlID %x dwControlType %x\n", MixerLine->Line.dwLineID, MixerControl->dwControlID, MixerControl->dwControlType); - if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_MUTE) - { - /* send the request */ - Status = SetGetMuteControlDetails(DeviceObject, MixerLine->DeviceIndex, NodeId, MixerLine->Line.dwLineID, DeviceInfo, FALSE); - } - else if (MixerControl->dwControlType == MIXERCONTROL_CONTROLTYPE_VOLUME) - { - Status = SetGetVolumeControlDetails(DeviceObject, MixerLine->DeviceIndex, NodeId, DeviceInfo, FALSE, MixerControl, MixerLine); - } - - return SetIrpIoStatus(Irp, Status, sizeof(WDMAUD_DEVICE_INFO)); - -} - diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c b/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c new file mode 100644 index 00000000000..cf58846decb --- /dev/null +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c @@ -0,0 +1,665 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Kernel Streaming + * FILE: drivers/wdm/audio/legacy/wdmaud/mmixer.c + * PURPOSE: WDM Legacy Mixer + * PROGRAMMER: Johannes Anderwald + */ + +#include "wdmaud.h" + + +PVOID Alloc(ULONG NumBytes); +MIXER_STATUS Close(HANDLE hDevice); +VOID Free(PVOID Block); +VOID Copy(PVOID Src, PVOID Dst, ULONG NumBytes); +MIXER_STATUS Open(IN LPWSTR DevicePath, OUT PHANDLE hDevice); +MIXER_STATUS Control(IN HANDLE hMixer, IN ULONG dwIoControlCode, IN PVOID lpInBuffer, IN ULONG nInBufferSize, OUT PVOID lpOutBuffer, ULONG nOutBufferSize, PULONG lpBytesReturned); +MIXER_STATUS Enum(IN PVOID EnumContext, IN ULONG DeviceIndex, OUT LPWSTR * DeviceName, OUT PHANDLE OutHandle, OUT PHANDLE OutKey); +MIXER_STATUS OpenKey(IN HANDLE hKey, IN LPWSTR SubKey, IN ULONG DesiredAccess, OUT PHANDLE OutKey); +MIXER_STATUS CloseKey(IN HANDLE hKey); +MIXER_STATUS QueryKeyValue(IN HANDLE hKey, IN LPWSTR KeyName, OUT PVOID * ResultBuffer, OUT PULONG ResultLength, OUT PULONG KeyType); +PVOID AllocEventData(IN ULONG ExtraSize); +VOID FreeEventData(IN PVOID EventData); + +MIXER_CONTEXT MixerContext = +{ + sizeof(MIXER_CONTEXT), + NULL, + Alloc, + Control, + Free, + Open, + Close, + Copy, + OpenKey, + QueryKeyValue, + CloseKey, + AllocEventData, + FreeEventData +}; + +GUID CategoryGuid = {STATIC_KSCATEGORY_AUDIO}; + +MIXER_STATUS +QueryKeyValue( + IN HANDLE hKey, + IN LPWSTR lpKeyName, + OUT PVOID * ResultBuffer, + OUT PULONG ResultLength, + OUT PULONG KeyType) +{ + NTSTATUS Status; + UNICODE_STRING KeyName; + ULONG Length; + PKEY_VALUE_PARTIAL_INFORMATION PartialInformation; + + /* initialize key name */ + RtlInitUnicodeString(&KeyName, lpKeyName); + + /* now query MatchingDeviceId key */ + Status = ZwQueryValueKey(hKey, &KeyName, KeyValuePartialInformation, NULL, 0, &Length); + + /* check for success */ + if (Status != STATUS_BUFFER_TOO_SMALL) + return MM_STATUS_UNSUCCESSFUL; + + /* allocate a buffer for key data */ + PartialInformation = ExAllocatePool(NonPagedPool, Length); + + if (!PartialInformation) + return MM_STATUS_NO_MEMORY; + + + /* now query MatchingDeviceId key */ + Status = ZwQueryValueKey(hKey, &KeyName, KeyValuePartialInformation, PartialInformation, Length, &Length); + + /* check for success */ + if (!NT_SUCCESS(Status)) + { + ExFreePool(PartialInformation); + return MM_STATUS_UNSUCCESSFUL; + } + + if (KeyType) + { + /* return key type */ + *KeyType = PartialInformation->Type; + } + + if (ResultLength) + { + /* return data length */ + *ResultLength = PartialInformation->DataLength; + } + + *ResultBuffer = ExAllocatePool(NonPagedPool, PartialInformation->DataLength); + if (!*ResultBuffer) + { + /* not enough memory */ + ExFreePool(PartialInformation); + return MM_STATUS_NO_MEMORY; + } + + /* copy key value */ + RtlMoveMemory(*ResultBuffer, PartialInformation->Data, PartialInformation->DataLength); + + /* free key info */ + ExFreePool(PartialInformation); + + return MM_STATUS_SUCCESS; +} + +MIXER_STATUS +OpenKey( + IN HANDLE hKey, + IN LPWSTR lpSubKeyName, + IN ULONG DesiredAccess, + OUT PHANDLE OutKey) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING SubKeyName; + NTSTATUS Status; + + /* initialize sub key name */ + RtlInitUnicodeString(&SubKeyName, lpSubKeyName); + + /* initialize key attributes */ + InitializeObjectAttributes(&ObjectAttributes, &SubKeyName, OBJ_CASE_INSENSITIVE | OBJ_OPENIF, hKey, NULL); + + /* open the key */ + Status = ZwOpenKey(OutKey, DesiredAccess, &ObjectAttributes); + + if (NT_SUCCESS(Status)) + return MM_STATUS_SUCCESS; + else + return MM_STATUS_UNSUCCESSFUL; +} + +MIXER_STATUS +CloseKey( + IN HANDLE hKey) +{ + if (ZwClose(hKey) == STATUS_SUCCESS) + return MM_STATUS_SUCCESS; + else + return MM_STATUS_UNSUCCESSFUL; +} + + +PVOID Alloc(ULONG NumBytes) +{ + PVOID Mem = ExAllocatePool(NonPagedPool, NumBytes); + if (!Mem) + return Mem; + + RtlZeroMemory(Mem, NumBytes); + return Mem; +} + +MIXER_STATUS +Close(HANDLE hDevice) +{ + if (ZwClose(hDevice) == STATUS_SUCCESS) + return MM_STATUS_SUCCESS; + else + return MM_STATUS_UNSUCCESSFUL; +} + +VOID +Free(PVOID Block) +{ + ExFreePool(Block); +} + +VOID +Copy(PVOID Src, PVOID Dst, ULONG NumBytes) +{ + RtlMoveMemory(Src, Dst, NumBytes); +} + +MIXER_STATUS +Open( + IN LPWSTR DevicePath, + OUT PHANDLE hDevice) +{ + if (WdmAudOpenSysAudioDevice(DevicePath, hDevice) == STATUS_SUCCESS) + return MM_STATUS_SUCCESS; + else + return MM_STATUS_UNSUCCESSFUL; +} + +MIXER_STATUS +Control( + IN HANDLE hMixer, + IN ULONG dwIoControlCode, + IN PVOID lpInBuffer, + IN ULONG nInBufferSize, + OUT PVOID lpOutBuffer, + ULONG nOutBufferSize, + PULONG lpBytesReturned) +{ + NTSTATUS Status; + PFILE_OBJECT FileObject; + + /* get file object */ + Status = ObReferenceObjectByHandle(hMixer, GENERIC_READ | GENERIC_WRITE, IoFileObjectType, KernelMode, (PVOID*)&FileObject, NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT("failed to reference %p with %lx\n", hMixer, Status); + return MM_STATUS_UNSUCCESSFUL; + } + + /* perform request */ + Status = KsSynchronousIoControlDevice(FileObject, KernelMode, dwIoControlCode, lpInBuffer, nInBufferSize, lpOutBuffer, nOutBufferSize, lpBytesReturned); + + /* release object reference */ + ObDereferenceObject(FileObject); + + if (Status == STATUS_MORE_ENTRIES || Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL) + { + /* more data is available */ + return MM_STATUS_MORE_ENTRIES; + } + else if (Status == STATUS_SUCCESS) + { + /* operation succeeded */ + return MM_STATUS_SUCCESS; + } + else + { + DPRINT("Failed with %lx\n", Status); + return MM_STATUS_UNSUCCESSFUL; + } +} + +MIXER_STATUS +Enum( + IN PVOID EnumContext, + IN ULONG DeviceIndex, + OUT LPWSTR * DeviceName, + OUT PHANDLE OutHandle, + OUT PHANDLE OutKey) +{ + PDEVICE_OBJECT DeviceObject; + ULONG DeviceCount; + NTSTATUS Status; + UNICODE_STRING KeyName; + + /* get enumeration context */ + DeviceObject = (PDEVICE_OBJECT)EnumContext; + + /* get device count */ + DeviceCount = GetSysAudioDeviceCount(DeviceObject); + + if (DeviceIndex >= DeviceCount) + { + /* no more devices */ + return MM_STATUS_NO_MORE_DEVICES; + } + + /* get device name */ + Status = GetSysAudioDevicePnpName(DeviceObject, DeviceIndex, DeviceName); + + if (!NT_SUCCESS(Status)) + { + /* failed to retrieve device name */ + return MM_STATUS_UNSUCCESSFUL; + } + + /* intialize key name */ + RtlInitUnicodeString(&KeyName, *DeviceName); + + /* open device interface key */ + Status = IoOpenDeviceInterfaceRegistryKey(&KeyName, GENERIC_READ | GENERIC_WRITE, OutKey); +#if 0 + if (!NT_SUCCESS(Status)) + { + /* failed to open key */ + DPRINT("IoOpenDeviceInterfaceRegistryKey failed with %lx\n", Status); + ExFreePool(*DeviceName); + return MM_STATUS_UNSUCCESSFUL; + } +#endif + + /* open device handle */ + Status = OpenDevice(*DeviceName, OutHandle, NULL); + if (!NT_SUCCESS(Status)) + { + /* failed to open device */ + return MM_STATUS_UNSUCCESSFUL; + } + + return MM_STATUS_SUCCESS; +} + +PVOID +AllocEventData( + IN ULONG ExtraSize) +{ + PKSEVENTDATA Data = (PKSEVENTDATA)ExAllocatePool(NonPagedPool, sizeof(KSEVENTDATA) + ExtraSize); + if (!Data) + return NULL; + + Data->EventObject.Event = ExAllocatePool(NonPagedPool, sizeof(KEVENT)); + if (!Data->EventHandle.Event) + { + ExFreePool(Data); + return NULL; + } + + KeInitializeEvent(Data->EventObject.Event, NotificationEvent, FALSE); + + Data->NotificationType = KSEVENTF_EVENT_HANDLE; + return Data; +} + +VOID +FreeEventData(IN PVOID EventData) +{ + PKSEVENTDATA Data = (PKSEVENTDATA)EventData; + + ExFreePool(Data->EventHandle.Event); + ExFreePool(Data); +} + +NTSTATUS +WdmAudMixerInitialize( + IN PDEVICE_OBJECT DeviceObject) +{ + MIXER_STATUS Status; + + /* initialize the mixer library */ + Status = MMixerInitialize(&MixerContext, Enum, (PVOID)DeviceObject); + + if (Status != MM_STATUS_SUCCESS) + { + /* failed to initialize mmixer library */ + DPRINT("MMixerInitialize failed with %lx\n", Status); + } + + return Status; +} + +NTSTATUS +WdmAudMixerCapabilities( + IN PDEVICE_OBJECT DeviceObject, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo, + IN PWDMAUD_DEVICE_EXTENSION DeviceExtension) +{ + if (MMixerGetCapabilities(&MixerContext, DeviceInfo->DeviceIndex, &DeviceInfo->u.MixCaps) == MM_STATUS_SUCCESS) + return STATUS_SUCCESS; + + return STATUS_INVALID_PARAMETER; +} + +NTSTATUS +WdmAudControlOpenMixer( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo) +{ + HANDLE hMixer; + PWDMAUD_HANDLE Handles; + PWDMAUD_DEVICE_EXTENSION DeviceExtension; + NTSTATUS Status; + PKEVENT EventObject = NULL; + + DPRINT("WdmAudControlOpenMixer\n"); + + DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + + if (DeviceInfo->u.hNotifyEvent) + { + Status = ObReferenceObjectByHandle(DeviceInfo->u.hNotifyEvent, EVENT_MODIFY_STATE, ExEventObjectType, UserMode, (LPVOID*)&EventObject, NULL); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("Invalid notify event passed %p from client %p\n", DeviceInfo->u.hNotifyEvent, ClientInfo); + DbgBreakPoint(); + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); + } + } + + if (MMixerOpen(&MixerContext, DeviceInfo->DeviceIndex, EventObject, NULL /* FIXME */, &hMixer) != MM_STATUS_SUCCESS) + { + ObDereferenceObject(EventObject); + DPRINT1("Failed to open mixer\n"); + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); + } + + + Handles = ExAllocatePool(NonPagedPool, sizeof(WDMAUD_HANDLE) * (ClientInfo->NumPins+1)); + + if (Handles) + { + if (ClientInfo->NumPins) + { + RtlMoveMemory(Handles, ClientInfo->hPins, sizeof(WDMAUD_HANDLE) * ClientInfo->NumPins); + ExFreePool(ClientInfo->hPins); + } + + ClientInfo->hPins = Handles; + ClientInfo->hPins[ClientInfo->NumPins].Handle = hMixer; + ClientInfo->hPins[ClientInfo->NumPins].Type = MIXER_DEVICE_TYPE; + ClientInfo->hPins[ClientInfo->NumPins].NotifyEvent = EventObject; + ClientInfo->NumPins++; + } + else + { + ObDereferenceObject(EventObject); + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); + } + + DeviceInfo->hDevice = hMixer; + + return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); +} + +NTSTATUS +NTAPI +WdmAudGetControlDetails( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo) +{ + MIXER_STATUS Status; + + /* clear hmixer type flag */ + DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; + + /* query mmixer library */ + Status = MMixerGetControlDetails(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixDetails); + + if (Status == MM_STATUS_SUCCESS) + return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); + else + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); +} + +NTSTATUS +NTAPI +WdmAudGetLineInfo( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo) +{ + MIXER_STATUS Status; + + /* clear hmixer type flag */ + DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; + + /* query mixer library */ + Status = MMixerGetLineInfo(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixLine); + + if (Status == MM_STATUS_SUCCESS) + return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); + else + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); +} + +NTSTATUS +NTAPI +WdmAudGetLineControls( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo) +{ + MIXER_STATUS Status; + + /* clear hmixer type flag */ + DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; + + /* query mixer library */ + Status = MMixerGetLineControls(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixControls); + + if (Status == MM_STATUS_SUCCESS) + return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); + else + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); + + +} + +NTSTATUS +NTAPI +WdmAudSetControlDetails( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo) +{ + MIXER_STATUS Status; + + /* clear hmixer type flag */ + DeviceInfo->Flags &= ~MIXER_OBJECTF_HMIXER; + + /* query mixer library */ + Status = MMixerSetControlDetails(&MixerContext, DeviceInfo->hDevice, DeviceInfo->Flags, &DeviceInfo->u.MixDetails); + + if (Status == MM_STATUS_SUCCESS) + return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); + else + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); +} + +NTSTATUS +NTAPI +WdmAudGetMixerEvent( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo) +{ + UNIMPLEMENTED + return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, sizeof(WDMAUD_DEVICE_INFO)); +} + +ULONG +WdmAudGetMixerDeviceCount() +{ + return MMixerGetCount(&MixerContext); +} + +ULONG +WdmAudGetWaveInDeviceCount() +{ + return MMixerGetWaveInCount(&MixerContext); +} + +ULONG +WdmAudGetWaveOutDeviceCount() +{ + return MMixerGetWaveOutCount(&MixerContext); +} + +NTSTATUS +WdmAudGetMixerPnpNameByIndex( + IN ULONG DeviceIndex, + OUT LPWSTR * Device) +{ + UNIMPLEMENTED + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS +WdmAudGetPnpNameByIndexAndType( + IN ULONG DeviceIndex, + IN SOUND_DEVICE_TYPE DeviceType, + OUT LPWSTR *DevicePath) +{ + if (MMixerGetWaveDevicePath(&MixerContext, DeviceType == WAVE_IN_DEVICE_TYPE, DeviceIndex, DevicePath) == MM_STATUS_SUCCESS) + return STATUS_SUCCESS; + else + return STATUS_UNSUCCESSFUL; +} + +NTSTATUS +WdmAudWaveCapabilities( + IN PDEVICE_OBJECT DeviceObject, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo, + IN PWDMAUD_DEVICE_EXTENSION DeviceExtension) +{ + MIXER_STATUS Status; + + if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE) + { + /* get capabilities */ + Status = MMixerWaveInCapabilities(&MixerContext, DeviceInfo->DeviceIndex, &DeviceInfo->u.WaveInCaps); + } + else if (DeviceInfo->DeviceType == WAVE_OUT_DEVICE_TYPE) + { + /* get capabilities */ + Status = MMixerWaveOutCapabilities(&MixerContext, DeviceInfo->DeviceIndex, &DeviceInfo->u.WaveOutCaps); + } + else + { + ASSERT(0); + return STATUS_UNSUCCESSFUL; + } + + if (Status == MM_STATUS_SUCCESS) + return STATUS_SUCCESS; + else + return STATUS_UNSUCCESSFUL; +} + + +MIXER_STATUS +CreatePinCallback( + IN PVOID Ctx, + IN ULONG VirtualDeviceId, + IN ULONG PinId, + IN HANDLE hFilter, + IN PKSPIN_CONNECT PinConnect, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE PinHandle) +{ + ULONG BytesReturned; + SYSAUDIO_INSTANCE_INFO InstanceInfo; + NTSTATUS Status; + ULONG FreeIndex; + PPIN_CREATE_CONTEXT Context = (PPIN_CREATE_CONTEXT)Ctx; + + /* setup property request */ + InstanceInfo.Property.Set = KSPROPSETID_Sysaudio; + InstanceInfo.Property.Id = KSPROPERTY_SYSAUDIO_INSTANCE_INFO; + InstanceInfo.Property.Flags = KSPROPERTY_TYPE_SET; + InstanceInfo.Flags = 0; + InstanceInfo.DeviceNumber = VirtualDeviceId; + + /* attach to virtual device */ + Status = KsSynchronousIoControlDevice(Context->DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&InstanceInfo, sizeof(SYSAUDIO_INSTANCE_INFO), NULL, 0, &BytesReturned); + + if (!NT_SUCCESS(Status)) + return MM_STATUS_UNSUCCESSFUL; + + /* close existing pin */ + FreeIndex = ClosePin(Context->ClientInfo, VirtualDeviceId, PinId, Context->DeviceType); + + /* now create the pin */ + Status = KsCreatePin(Context->DeviceExtension->hSysAudio, PinConnect, DesiredAccess, PinHandle); + + /* check for success */ + if (!NT_SUCCESS(Status)) + return MM_STATUS_UNSUCCESSFUL; + + /* store the handle */ + Status = InsertPinHandle(Context->ClientInfo, VirtualDeviceId, PinId, Context->DeviceType, *PinHandle, FreeIndex); + if (!NT_SUCCESS(Status)) + { + /* failed to insert handle */ + ZwClose(*PinHandle); + return MM_STATUS_UNSUCCESSFUL; + } + + return MM_STATUS_SUCCESS; +} + +NTSTATUS +WdmAudControlOpenWave( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PWDMAUD_DEVICE_INFO DeviceInfo, + IN PWDMAUD_CLIENT ClientInfo) +{ + MIXER_STATUS Status; + PIN_CREATE_CONTEXT Context; + + Context.ClientInfo = ClientInfo; + Context.DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + Context.DeviceType = DeviceInfo->DeviceType; + + Status = MMixerOpenWave(&MixerContext, DeviceInfo->DeviceIndex, DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE, &DeviceInfo->u.WaveFormatEx, CreatePinCallback, &Context, &DeviceInfo->hDevice); + + if (Status == MM_STATUS_SUCCESS) + return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); + else + return SetIrpIoStatus(Irp, STATUS_NOT_SUPPORTED, sizeof(WDMAUD_DEVICE_INFO)); +} diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/sup.c b/reactos/drivers/wdm/audio/legacy/wdmaud/sup.c index dd61c34f1f4..5820abc2500 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/sup.c +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/sup.c @@ -2,12 +2,37 @@ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Kernel Streaming * FILE: drivers/wdm/audio/legacy/wdmaud/sup.c - * PURPOSE: System Audio graph builder + * PURPOSE: Misc support routines * PROGRAMMER: Andrew Greenwood * Johannes Anderwald */ #include "wdmaud.h" +ULONG +GetSysAudioDeviceCount( + IN PDEVICE_OBJECT DeviceObject) +{ + PWDMAUD_DEVICE_EXTENSION DeviceExtension; + KSPROPERTY Pin; + ULONG Count, BytesReturned; + NTSTATUS Status; + + /* setup the query request */ + Pin.Set = KSPROPSETID_Sysaudio; + Pin.Id = KSPROPERTY_SYSAUDIO_DEVICE_COUNT; + Pin.Flags = KSPROPERTY_TYPE_GET; + + DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + + /* query sysaudio for the device count */ + Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY), (PVOID)&Count, sizeof(ULONG), &BytesReturned); + if (!NT_SUCCESS(Status)) + return 0; + + return Count; +} + + NTSTATUS SetIrpIoStatus( IN PIRP Irp, @@ -21,7 +46,7 @@ SetIrpIoStatus( } -NTSTATUS +ULONG ClosePin( IN PWDMAUD_CLIENT ClientInfo, IN ULONG FilterId, @@ -298,3 +323,83 @@ FindProductName( return Status; } +NTSTATUS +GetSysAudioDevicePnpName( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG DeviceIndex, + OUT LPWSTR * Device) +{ + ULONG BytesReturned; + KSP_PIN Pin; + NTSTATUS Status; + PWDMAUD_DEVICE_EXTENSION DeviceExtension; + + /* first check if the device index is within bounds */ + if (DeviceIndex >= GetSysAudioDeviceCount(DeviceObject)) + return STATUS_INVALID_PARAMETER; + + /* setup the query request */ + Pin.Property.Set = KSPROPSETID_Sysaudio; + Pin.Property.Id = KSPROPERTY_SYSAUDIO_DEVICE_INTERFACE_NAME; + Pin.Property.Flags = KSPROPERTY_TYPE_GET; + Pin.PinId = DeviceIndex; + + DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + + /* query sysaudio for the device path */ + Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY) + sizeof(ULONG), NULL, 0, &BytesReturned); + + /* check if the request failed */ + if (Status != STATUS_BUFFER_TOO_SMALL || BytesReturned == 0) + return STATUS_UNSUCCESSFUL; + + /* allocate buffer for the device */ + *Device = ExAllocatePool(NonPagedPool, BytesReturned); + if (!Device) + return STATUS_INSUFFICIENT_RESOURCES; + + /* query sysaudio again for the device path */ + Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY) + sizeof(ULONG), (PVOID)*Device, BytesReturned, &BytesReturned); + + if (!NT_SUCCESS(Status)) + { + /* failed */ + ExFreePool(*Device); + return Status; + } + + return Status; +} + +NTSTATUS +OpenDevice( + IN LPWSTR Device, + OUT PHANDLE DeviceHandle, + OUT PFILE_OBJECT * FileObject) +{ + NTSTATUS Status; + HANDLE hDevice; + + /* now open the device */ + Status = WdmAudOpenSysAudioDevice(Device, &hDevice); + + if (!NT_SUCCESS(Status)) + { + return Status; + } + + *DeviceHandle = hDevice; + + if (FileObject) + { + Status = ObReferenceObjectByHandle(hDevice, FILE_READ_DATA | FILE_WRITE_DATA, IoFileObjectType, KernelMode, (PVOID*)FileObject, NULL); + + if (!NT_SUCCESS(Status)) + { + ZwClose(hDevice); + } + } + + return Status; + +} diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/wave.c b/reactos/drivers/wdm/audio/legacy/wdmaud/wave.c deleted file mode 100644 index be57468d2ad..00000000000 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/wave.c +++ /dev/null @@ -1,756 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Kernel Streaming - * FILE: drivers/wdm/audio/legacy/wdmaud/wave.c - * PURPOSE: Wave Out enumeration - * PROGRAMMER: Andrew Greenwood - * Johannes Anderwald - */ -#include "wdmaud.h" - - -typedef struct -{ - ULONG SampleRate; - ULONG Bit8Mono; - ULONG Bit8Stereo; - ULONG Bit16Mono; - ULONG Bit16Stereo; -}AUDIO_RANGE; - -#define AUDIO_TEST_RANGE (5) - -static AUDIO_RANGE TestRange[AUDIO_TEST_RANGE] = -{ - { - 11025, - WAVE_FORMAT_1M08, - WAVE_FORMAT_1S08, - WAVE_FORMAT_1M16, - WAVE_FORMAT_1S16 - }, - { - 22050, - WAVE_FORMAT_2M08, - WAVE_FORMAT_2S08, - WAVE_FORMAT_2M16, - WAVE_FORMAT_2S16 - }, - { - 44100, - WAVE_FORMAT_4M08, - WAVE_FORMAT_4S08, - WAVE_FORMAT_4M16, - WAVE_FORMAT_4S16 - }, - { - 48000, - WAVE_FORMAT_48M08, - WAVE_FORMAT_48S08, - WAVE_FORMAT_48M16, - WAVE_FORMAT_48S16 - }, - { - 96000, - WAVE_FORMAT_96M08, - WAVE_FORMAT_96S08, - WAVE_FORMAT_96M16, - WAVE_FORMAT_96S16 - } -}; - -LPWAVE_INFO -AllocateWaveInfo() -{ - /* allocate wav info */ - LPWAVE_INFO WaveOutInfo = ExAllocatePool(NonPagedPool, sizeof(WAVE_INFO)); - if (!WaveOutInfo) - return NULL; - - /* zero wave info struct */ - RtlZeroMemory(WaveOutInfo, sizeof(WAVE_INFO)); - - return WaveOutInfo; -} - -PKSPIN_CONNECT -AllocatePinConnect( - ULONG DataFormatSize) -{ - PKSPIN_CONNECT Connect = ExAllocatePool(NonPagedPool, sizeof(KSPIN_CONNECT) + DataFormatSize); - if (!Connect) - return NULL; - - /* zero pin connect struct */ - RtlZeroMemory(Connect, sizeof(KSPIN_CONNECT) + DataFormatSize); - - return Connect; -} - -NTSTATUS -GetWaveInfoByIndexAndType( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceIndex, - IN SOUND_DEVICE_TYPE DeviceType, - OUT LPWAVE_INFO *OutWaveInfo) -{ - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - ULONG Index = 0; - PLIST_ENTRY Entry, ListHead; - LPWAVE_INFO WaveInfo; - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - if (DeviceType == WAVE_IN_DEVICE_TYPE) - ListHead = &DeviceExtension->WaveInList; - else - ListHead = &DeviceExtension->WaveOutList; - - /* get first entry */ - Entry = ListHead->Flink; - - while(Entry != ListHead) - { - WaveInfo = (LPWAVE_INFO)CONTAINING_RECORD(Entry, WAVE_INFO, Entry); - - if (Index == DeviceIndex) - { - *OutWaveInfo = WaveInfo; - return STATUS_SUCCESS; - } - Index++; - Entry = Entry->Flink; - } - - return STATUS_NOT_FOUND; -} - - -VOID -InitializePinConnect( - IN OUT PKSPIN_CONNECT PinConnect, - IN ULONG PinId) -{ - PinConnect->Interface.Set = KSINTERFACESETID_Standard; - PinConnect->Interface.Id = KSINTERFACE_STANDARD_STREAMING; - PinConnect->Interface.Flags = 0; - PinConnect->Medium.Set = KSMEDIUMSETID_Standard; - PinConnect->Medium.Id = KSMEDIUM_TYPE_ANYINSTANCE; - PinConnect->Medium.Flags = 0; - PinConnect->PinToHandle = NULL; - PinConnect->PinId = PinId; - PinConnect->Priority.PriorityClass = KSPRIORITY_NORMAL; - PinConnect->Priority.PrioritySubClass = 1; -} - -VOID -InitializeDataFormat( - IN PKSDATAFORMAT_WAVEFORMATEX DataFormat, - LPWAVEFORMATEX WaveFormatEx) -{ - - DataFormat->WaveFormatEx.wFormatTag = WaveFormatEx->wFormatTag; - DataFormat->WaveFormatEx.nChannels = WaveFormatEx->nChannels; - DataFormat->WaveFormatEx.nSamplesPerSec = WaveFormatEx->nSamplesPerSec; - DataFormat->WaveFormatEx.nBlockAlign = WaveFormatEx->nBlockAlign; - DataFormat->WaveFormatEx.nAvgBytesPerSec = WaveFormatEx->nAvgBytesPerSec; - DataFormat->WaveFormatEx.wBitsPerSample = WaveFormatEx->wBitsPerSample; - DataFormat->WaveFormatEx.cbSize = 0; - DataFormat->DataFormat.FormatSize = sizeof(KSDATAFORMAT) + sizeof(WAVEFORMATEX); - DataFormat->DataFormat.Flags = 0; - DataFormat->DataFormat.Reserved = 0; - DataFormat->DataFormat.MajorFormat = KSDATAFORMAT_TYPE_AUDIO; - - DataFormat->DataFormat.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; - DataFormat->DataFormat.Specifier = KSDATAFORMAT_SPECIFIER_WAVEFORMATEX; - DataFormat->DataFormat.SampleSize = 4; -} - - -NTSTATUS -AttachToVirtualAudioDevice( - IN PWDMAUD_DEVICE_EXTENSION DeviceExtension, - IN ULONG VirtualDeviceId) -{ - ULONG BytesReturned; - SYSAUDIO_INSTANCE_INFO InstanceInfo; - - /* setup property request */ - InstanceInfo.Property.Set = KSPROPSETID_Sysaudio; - InstanceInfo.Property.Id = KSPROPERTY_SYSAUDIO_INSTANCE_INFO; - InstanceInfo.Property.Flags = KSPROPERTY_TYPE_SET; - InstanceInfo.Flags = 0; - InstanceInfo.DeviceNumber = VirtualDeviceId; - - /* attach to virtual device */ - return KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&InstanceInfo, sizeof(SYSAUDIO_INSTANCE_INFO), NULL, 0, &BytesReturned); - -} - -NTSTATUS -GetAudioPinDataRanges( - IN PWDMAUD_DEVICE_EXTENSION DeviceExtension, - IN ULONG FilterId, - IN ULONG PinId, - IN OUT PKSMULTIPLE_ITEM * OutMultipleItem) -{ - KSP_PIN PinProperty; - ULONG BytesReturned = 0; - NTSTATUS Status; - PKSMULTIPLE_ITEM MultipleItem; - - /* retrieve size of data ranges buffer */ - PinProperty.Reserved = FilterId; - PinProperty.PinId = PinId; - PinProperty.Property.Set = KSPROPSETID_Pin; - PinProperty.Property.Id = KSPROPERTY_PIN_DATARANGES; - PinProperty.Property.Flags = KSPROPERTY_TYPE_GET; - - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinProperty, sizeof(KSP_PIN), (PVOID)NULL, 0, &BytesReturned); - if (Status != STATUS_MORE_ENTRIES) - { - return Status; - } - - MultipleItem = ExAllocatePool(NonPagedPool, BytesReturned); - if (!MultipleItem) - { - /* not enough memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinProperty, sizeof(KSP_PIN), (PVOID)MultipleItem, BytesReturned, &BytesReturned); - if (!NT_SUCCESS(Status)) - { - /* failed */ - ExFreePool(MultipleItem); - return Status; - } - - /* save result */ - *OutMultipleItem = MultipleItem; - return Status; -} - -NTSTATUS -FindAudioDataRange( - PKSMULTIPLE_ITEM MultipleItem, - PKSDATARANGE_AUDIO * OutDataRangeAudio) -{ - ULONG Index; - PKSDATARANGE_AUDIO DataRangeAudio; - PKSDATARANGE DataRange; - - DataRange = (PKSDATARANGE) (MultipleItem + 1); - for(Index = 0; Index < MultipleItem->Count; Index++) - { - if (DataRange->FormatSize == sizeof(KSDATARANGE_AUDIO)) - { - DataRangeAudio = (PKSDATARANGE_AUDIO)DataRange; - if (IsEqualGUIDAligned(&DataRangeAudio->DataRange.MajorFormat, &KSDATAFORMAT_TYPE_AUDIO) && - IsEqualGUIDAligned(&DataRangeAudio->DataRange.SubFormat, &KSDATAFORMAT_SUBTYPE_PCM) && - IsEqualGUIDAligned(&DataRangeAudio->DataRange.Specifier, &KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)) - { - DPRINT("Min Sample %u Max Sample %u Min Bits %u Max Bits %u Max Channel %u\n", DataRangeAudio->MinimumSampleFrequency, DataRangeAudio->MaximumSampleFrequency, - DataRangeAudio->MinimumBitsPerSample, DataRangeAudio->MaximumBitsPerSample, DataRangeAudio->MaximumChannels); - *OutDataRangeAudio = DataRangeAudio; - return STATUS_SUCCESS; - } - } - } - return STATUS_UNSUCCESSFUL; -} - -NTSTATUS -NTAPI -OpenWavePin( - IN PWDMAUD_DEVICE_EXTENSION DeviceExtension, - IN ULONG FilterId, - IN ULONG PinId, - IN LPWAVEFORMATEX WaveFormatEx, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE PinHandle) -{ - PKSPIN_CONNECT PinConnect; - PKSDATAFORMAT_WAVEFORMATEX DataFormat; - NTSTATUS Status; - - /* allocate pin connect */ - PinConnect = AllocatePinConnect(sizeof(KSDATAFORMAT_WAVEFORMATEX)); - if (!PinConnect) - { - /* no memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* initialize pin connect struct */ - InitializePinConnect(PinConnect, PinId); - - /* get offset to dataformat */ - DataFormat = (PKSDATAFORMAT_WAVEFORMATEX) (PinConnect + 1); - /* initialize with requested wave format */ - InitializeDataFormat(DataFormat, WaveFormatEx); - - /* first attach to the virtual device */ - Status = AttachToVirtualAudioDevice(DeviceExtension, FilterId); - - if (!NT_SUCCESS(Status)) - { - /* failed */ - ExFreePool(PinConnect); - return Status; - } - - /* now create the pin */ - Status = KsCreatePin(DeviceExtension->hSysAudio, PinConnect, DesiredAccess, PinHandle); - - /* free create info */ - ExFreePool(PinConnect); - - return Status; -} - -ULONG -GetPinInstanceCount( - PWDMAUD_DEVICE_EXTENSION DeviceExtension, - ULONG FilterId, - ULONG PinId) -{ - KSP_PIN PinRequest; - KSPIN_CINSTANCES PinInstances; - ULONG BytesReturned; - NTSTATUS Status; - - /* query the instance count */ - PinRequest.Reserved = FilterId; - PinRequest.PinId = PinId; - PinRequest.Property.Set = KSPROPSETID_Pin; - PinRequest.Property.Flags = KSPROPERTY_TYPE_GET; - PinRequest.Property.Id = KSPROPERTY_PIN_CINSTANCES; - - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinRequest, sizeof(KSP_PIN), (PVOID)&PinInstances, sizeof(KSPIN_CINSTANCES), &BytesReturned); - ASSERT(Status == STATUS_SUCCESS); - return PinInstances.CurrentCount; -} - - -NTSTATUS -CheckSampleFormat( - PWDMAUD_DEVICE_EXTENSION DeviceExtension, - LPWAVE_INFO WaveInfo, - ULONG SampleRate, - ULONG NumChannels, - ULONG BitsPerSample) -{ - NTSTATUS Status = STATUS_SUCCESS; -#if 0 - - WAVEFORMATEX WaveFormat; - HANDLE PinHandle; - - /* clear wave format */ - RtlZeroMemory(&WaveFormat, sizeof(WAVEFORMATEX)); - - WaveFormat.wFormatTag = WAVE_FORMAT_PCM; - WaveFormat.nChannels = NumChannels; - WaveFormat.nSamplesPerSec = SampleRate; - WaveFormat.nAvgBytesPerSec = SampleRate * NumChannels * (BitsPerSample/8); - WaveFormat.nBlockAlign = (NumChannels * BitsPerSample) / 8; - WaveFormat.wBitsPerSample = BitsPerSample; - WaveFormat.cbSize = sizeof(WAVEFORMATEX); - - Status = OpenWavePin(DeviceExtension, WaveInfo->FilterId, WaveInfo->PinId, &WaveFormat, GENERIC_READ | GENERIC_WRITE, &PinHandle); - - if (NT_SUCCESS(Status)) - { - /* success */ - ZwClose(PinHandle); - - while(GetPinInstanceCount(DeviceExtension, WaveInfo->FilterId, WaveInfo->PinId)) - KeStallExecutionProcessor(5); - } - - DPRINT("SampleRate %u BitsPerSample %u NumChannels %u Status %x bInput %u\n", SampleRate, BitsPerSample, NumChannels, Status, WaveInfo->bInput); -#endif - - - return Status; -} - - -NTSTATUS -CheckFormat( - PWDMAUD_DEVICE_EXTENSION DeviceExtension, - PKSDATARANGE_AUDIO DataRangeAudio, - LPWAVE_INFO WaveInfo) -{ - ULONG Index, SampleFrequency; - ULONG Result = 0; - NTSTATUS Status; - - for(Index = 0; Index < AUDIO_TEST_RANGE; Index++) - { - SampleFrequency = TestRange[Index].SampleRate; - - if (DataRangeAudio->MinimumSampleFrequency <= SampleFrequency && DataRangeAudio->MaximumSampleFrequency >= SampleFrequency) - { - /* the audio adapter supports the sample frequency */ - if (DataRangeAudio->MinimumBitsPerSample <= 8 && DataRangeAudio->MaximumBitsPerSample >= 8) - { - /* check if pin supports the sample rate in 8-Bit Mono */ - Status = CheckSampleFormat(DeviceExtension, WaveInfo, SampleFrequency, 1, 8); - if (NT_SUCCESS(Status)) - { - Result |= TestRange[Index].Bit8Mono; - } - - if (DataRangeAudio->MaximumChannels > 1) - { - /* check if pin supports the sample rate in 8-Bit Stereo */ - Status = CheckSampleFormat(DeviceExtension, WaveInfo, SampleFrequency, 2, 8); - if (NT_SUCCESS(Status)) - { - Result |= TestRange[Index].Bit8Stereo; - } - } - } - - if (DataRangeAudio->MinimumBitsPerSample <= 16 && DataRangeAudio->MaximumBitsPerSample >= 16) - { - /* check if pin supports the sample rate in 16-Bit Mono */ - Status = CheckSampleFormat(DeviceExtension, WaveInfo, SampleFrequency, 1, 16); - if (NT_SUCCESS(Status)) - { - Result |= TestRange[Index].Bit16Mono; - } - - if (DataRangeAudio->MaximumChannels > 1) - { - /* check if pin supports the sample rate in 16-Bit Stereo */ - Status = CheckSampleFormat(DeviceExtension, WaveInfo, SampleFrequency, 2, 16); - if (NT_SUCCESS(Status)) - { - Result |= TestRange[Index].Bit16Stereo; - } - } - } - } - } - - - if (WaveInfo->bInput) - WaveInfo->u.InCaps.dwFormats = Result; - else - WaveInfo->u.OutCaps.dwFormats = Result; - - DPRINT("Format %x bInput %u\n", Result, WaveInfo->bInput); - - - return STATUS_SUCCESS; -} - -NTSTATUS -InitializeWaveInfo( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG FilterId, - IN ULONG PinId, - IN ULONG bInput) -{ - KSP_PIN PinProperty; - KSCOMPONENTID ComponentId; - NTSTATUS Status; - ULONG BytesReturned; - WCHAR DeviceName[MAX_PATH]; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - PKSMULTIPLE_ITEM MultipleItem; - PKSDATARANGE_AUDIO DataRangeAudio; - LPWAVE_INFO WaveInfo = AllocateWaveInfo(); - - - if (!WaveInfo) - return STATUS_INSUFFICIENT_RESOURCES; - - /* initialize wave info */ - WaveInfo->bInput = bInput; - WaveInfo->FilterId = FilterId; - WaveInfo->PinId = PinId; - - /* setup request to return component id */ - PinProperty.PinId = FilterId; - PinProperty.Property.Set = KSPROPSETID_Sysaudio; - PinProperty.Property.Id = KSPROPERTY_SYSAUDIO_COMPONENT_ID; - PinProperty.Property.Flags = KSPROPERTY_TYPE_GET; - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* query sysaudio for component id */ - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinProperty, sizeof(KSP_PIN), (PVOID)&ComponentId, sizeof(KSCOMPONENTID), &BytesReturned); - if (NT_SUCCESS(Status)) - { - if (bInput) - { - WaveInfo->u.InCaps.wMid = ComponentId.Manufacturer.Data1 - 0xd5a47fa7; - WaveInfo->u.InCaps.vDriverVersion = MAKELONG(ComponentId.Version, ComponentId.Revision); - } - else - { - WaveInfo->u.OutCaps.wMid = ComponentId.Manufacturer.Data1 - 0xd5a47fa7; - WaveInfo->u.OutCaps.vDriverVersion = MAKELONG(ComponentId.Version, ComponentId.Revision); - } - } - else - { - /* set up something useful */ - if (bInput) - { - WaveInfo->u.InCaps.wMid = MM_MICROSOFT; - WaveInfo->u.InCaps.wPid = MM_PID_UNMAPPED; - WaveInfo->u.InCaps.vDriverVersion = 1; - } - else - { - WaveInfo->u.OutCaps.wMid = MM_MICROSOFT; - WaveInfo->u.OutCaps.wPid = MM_PID_UNMAPPED; - WaveInfo->u.OutCaps.vDriverVersion = 1; - } - } - - /* retrieve pnp base name */ - PinProperty.PinId = FilterId; - PinProperty.Property.Set = KSPROPSETID_Sysaudio; - PinProperty.Property.Id = KSPROPERTY_SYSAUDIO_DEVICE_INTERFACE_NAME; - PinProperty.Property.Flags = KSPROPERTY_TYPE_GET; - - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&PinProperty, sizeof(KSP_PIN), (PVOID)DeviceName, sizeof(DeviceName), &BytesReturned); - if (NT_SUCCESS(Status)) - { - /* find product name */ - if (bInput) - Status = FindProductName(DeviceName, MAXPNAMELEN, WaveInfo->u.OutCaps.szPname); - else - Status = FindProductName(DeviceName, MAXPNAMELEN, WaveInfo->u.InCaps.szPname); - - /* check for success */ - if (!NT_SUCCESS(Status)) - { - if (bInput) - WaveInfo->u.OutCaps.szPname[0] = L'\0'; - else - WaveInfo->u.InCaps.szPname[0] = L'\0'; - } - } - - Status = GetAudioPinDataRanges(DeviceExtension, FilterId, PinId, &MultipleItem); - if (NT_SUCCESS(Status)) - { - /* find a audio data range */ - Status = FindAudioDataRange(MultipleItem, &DataRangeAudio); - - if (NT_SUCCESS(Status)) - { - if (bInput) - { - WaveInfo->u.InCaps.wChannels = DataRangeAudio->MaximumChannels; - } - else - { - WaveInfo->u.OutCaps.wChannels = DataRangeAudio->MaximumChannels; - } - CheckFormat(DeviceExtension, DataRangeAudio, WaveInfo); - } - ExFreePool(MultipleItem); - } - - if (bInput) - { - InsertTailList(&DeviceExtension->WaveInList, &WaveInfo->Entry); - DeviceExtension->WaveInDeviceCount++; - } - else - { - InsertTailList(&DeviceExtension->WaveOutList, &WaveInfo->Entry); - DeviceExtension->WaveOutDeviceCount++; - } - - - return STATUS_SUCCESS; -} - - -NTSTATUS -NTAPI -WdmAudWaveInitialize( - IN PDEVICE_OBJECT DeviceObject) -{ - KSP_PIN Pin; - ULONG Count, BytesReturned, Index, SubIndex, Result, NumPins; - NTSTATUS Status; - KSPIN_COMMUNICATION Communication; - KSPIN_DATAFLOW DataFlow; - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - - Pin.Property.Set = KSPROPSETID_Sysaudio; - Pin.Property.Id = KSPROPERTY_SYSAUDIO_DEVICE_COUNT; - Pin.Property.Flags = KSPROPERTY_TYPE_GET; - - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* set wave count to zero */ - DeviceExtension->WaveInDeviceCount = 0; - DeviceExtension->WaveOutDeviceCount = 0; - - /* intialize list head */ - InitializeListHead(&DeviceExtension->WaveInList); - InitializeListHead(&DeviceExtension->WaveOutList); - - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSPROPERTY), (PVOID)&Count, sizeof(ULONG), &BytesReturned); - if (!NT_SUCCESS(Status)) - return STATUS_UNSUCCESSFUL; - - Result = 0; - for(Index = 0; Index < Count; Index++) - { - /* query number of pins */ - Pin.Reserved = Index; // see sysaudio - Pin.Property.Flags = KSPROPERTY_TYPE_GET; - Pin.Property.Set = KSPROPSETID_Pin; - Pin.Property.Id = KSPROPERTY_PIN_CTYPES; - Pin.PinId = 0; - - Status = KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)&NumPins, sizeof(ULONG), &BytesReturned); - if (NT_SUCCESS(Status)) - { - /* enumerate now all pins */ - for(SubIndex = 0; SubIndex < NumPins; SubIndex++) - { - Pin.PinId = SubIndex; - Pin.Property.Id = KSPROPERTY_PIN_COMMUNICATION; - Communication = KSPIN_COMMUNICATION_NONE; - - /* get pin communication type */ - KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)&Communication, sizeof(KSPIN_COMMUNICATION), &BytesReturned); - - Pin.Property.Id = KSPROPERTY_PIN_DATAFLOW; - DataFlow = 0; - - /* get pin dataflow type */ - KsSynchronousIoControlDevice(DeviceExtension->FileObject, KernelMode, IOCTL_KS_PROPERTY, (PVOID)&Pin, sizeof(KSP_PIN), (PVOID)&DataFlow, sizeof(KSPIN_DATAFLOW), &BytesReturned); - - if (Communication == KSPIN_COMMUNICATION_SINK && DataFlow == KSPIN_DATAFLOW_IN) - { - /* found a wave out device */ - InitializeWaveInfo(DeviceObject, Index, SubIndex, FALSE); - } - else if (Communication == KSPIN_COMMUNICATION_SINK && DataFlow == KSPIN_DATAFLOW_OUT) - { - /* found a wave in device */ - InitializeWaveInfo(DeviceObject, Index, SubIndex, TRUE); - } - } - } - } - - return STATUS_SUCCESS; -} - -NTSTATUS -WdmAudControlOpenWave( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo) -{ - PWDMAUD_DEVICE_EXTENSION DeviceExtension; - LPWAVE_INFO WaveInfo; - NTSTATUS Status; - ACCESS_MASK DesiredAccess = 0; - HANDLE PinHandle; - ULONG FreeIndex; - - if (DeviceInfo->u.WaveFormatEx.wFormatTag != WAVE_FORMAT_PCM) - { - DPRINT("FIXME: Only WAVE_FORMAT_PCM is supported RequestFormat %x\n", DeviceInfo->u.WaveFormatEx.wFormatTag); - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); - } - - /* get device extension */ - DeviceExtension = (PWDMAUD_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - - /* find destination wave */ - Status = GetWaveInfoByIndexAndType(DeviceObject, DeviceInfo->DeviceIndex, DeviceInfo->DeviceType, &WaveInfo); - if (!NT_SUCCESS(Status)) - { - /* failed to find wave info */ - DbgBreakPoint(); - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); - } - - /* close pin handle which uses same virtual audio device id and pin id */ - FreeIndex = ClosePin(ClientInfo, WaveInfo->FilterId, WaveInfo->PinId, DeviceInfo->DeviceType); - - /* get desired access */ - if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE) - { - DesiredAccess |= GENERIC_READ; - } - else if (DeviceInfo->DeviceType == WAVE_OUT_DEVICE_TYPE) - { - DesiredAccess |= GENERIC_WRITE; - } - - /* now try open the pin */ - Status = OpenWavePin(DeviceExtension, WaveInfo->FilterId, WaveInfo->PinId, &DeviceInfo->u.WaveFormatEx, DesiredAccess, &PinHandle); - - if (!NT_SUCCESS(Status)) - { - /* failed to open the pin */ - return SetIrpIoStatus(Irp, STATUS_NOT_SUPPORTED, 0); - } - - /* store the handle */ - Status = InsertPinHandle(ClientInfo, WaveInfo->FilterId, WaveInfo->PinId, DeviceInfo->DeviceType, PinHandle, FreeIndex); - if (!NT_SUCCESS(Status)) - { - /* failed to insert handle */ - ZwClose(PinHandle); - return SetIrpIoStatus(Irp, STATUS_UNSUCCESSFUL, 0); - } - - /* store pin handle */ - DeviceInfo->hDevice = PinHandle; - return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO)); -} - -NTSTATUS -WdmAudWaveCapabilities( - IN PDEVICE_OBJECT DeviceObject, - IN PWDMAUD_DEVICE_INFO DeviceInfo, - IN PWDMAUD_CLIENT ClientInfo, - IN PWDMAUD_DEVICE_EXTENSION DeviceExtension) -{ - LPWAVE_INFO WaveInfo; - NTSTATUS Status; - - /* find destination wave */ - Status = GetWaveInfoByIndexAndType(DeviceObject, DeviceInfo->DeviceIndex, DeviceInfo->DeviceType, &WaveInfo); - if (!NT_SUCCESS(Status)) - { - /* failed to find wave info */ - DbgBreakPoint(); - return STATUS_UNSUCCESSFUL; - } - - if (DeviceInfo->DeviceType == WAVE_IN_DEVICE_TYPE) - { - RtlMoveMemory(&DeviceInfo->u.WaveInCaps, &WaveInfo->u.InCaps, sizeof(WAVEINCAPSW)); - } - else - { - RtlMoveMemory(&DeviceInfo->u.WaveOutCaps, &WaveInfo->u.OutCaps, sizeof(WAVEOUTCAPSW)); - } - - return STATUS_SUCCESS; -} - diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.h b/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.h index c8e53320e1e..459b6c775b8 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.h +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.h @@ -1,5 +1,4 @@ -#ifndef WDMAUD_H__ -#define WDMAUD_H__ +#pragma once #include #include @@ -13,18 +12,10 @@ #include #include #include +#include "mmixer.h" #include "interface.h" -typedef struct -{ - LIST_ENTRY Entry; - HANDLE hMixer; - ULONG NotificationType; - ULONG Value; -}MIXER_EVENT, *PMIXER_EVENT; - - typedef struct { HANDLE Handle; @@ -44,60 +35,6 @@ typedef struct LIST_ENTRY MixerEventList; }WDMAUD_CLIENT, *PWDMAUD_CLIENT; -typedef struct -{ - LIST_ENTRY Entry; - ULONG dwControlID; -}MIXERCONTROL_DATA, *LPMIXERCONTROL_DATA; - -typedef struct -{ - MIXERCONTROL_DATA Header; - LONG SignedMinimum; - LONG SignedMaximum; - LONG SteppingDelta; - ULONG InputSteppingDelta; - ULONG ValuesCount; - PLONG Values; -}MIXERVOLUME_DATA, *LPMIXERVOLUME_DATA; - - - -typedef struct -{ - LIST_ENTRY Entry; - ULONG PinId; - ULONG DeviceIndex; - MIXERLINEW Line; - LPMIXERCONTROLW LineControls; - PULONG NodeIds; - LIST_ENTRY LineControlsExtraData; -}MIXERLINE_EXT, *LPMIXERLINE_EXT; - - -typedef struct -{ - MIXERCAPSW MixCaps; - ULONG DeviceIndex; - LIST_ENTRY LineList; - ULONG ControlId; -}MIXER_INFO, *LPMIXER_INFO; - - -typedef struct -{ - LIST_ENTRY Entry; - ULONG FilterId; - ULONG PinId; - ULONG bInput; - union - { - WAVEOUTCAPSW OutCaps; - WAVEINCAPSW InCaps; - }u; -}WAVE_INFO, *LPWAVE_INFO; - - typedef struct { LIST_ENTRY Entry; @@ -117,18 +54,17 @@ typedef struct HANDLE hSysAudio; PFILE_OBJECT FileObject; - ULONG MixerInfoCount; - LPMIXER_INFO MixerInfo; - - ULONG WaveInDeviceCount; - LIST_ENTRY WaveInList; - - ULONG WaveOutDeviceCount; - LIST_ENTRY WaveOutList; - LIST_ENTRY WdmAudClientList; }WDMAUD_DEVICE_EXTENSION, *PWDMAUD_DEVICE_EXTENSION; +typedef struct +{ + PWDMAUD_CLIENT ClientInfo; + PWDMAUD_DEVICE_EXTENSION DeviceExtension; + SOUND_DEVICE_TYPE DeviceType; +}PIN_CREATE_CONTEXT, *PPIN_CREATE_CONTEXT; + + NTSTATUS NTAPI OpenWavePin( @@ -279,7 +215,7 @@ NTAPI WdmAudWaveInitialize( IN PDEVICE_OBJECT DeviceObject); -NTSTATUS +ULONG ClosePin( IN PWDMAUD_CLIENT ClientInfo, IN ULONG FilterId, @@ -295,18 +231,48 @@ InsertPinHandle( IN HANDLE PinHandle, IN ULONG FreeIndex); - -NTSTATUS -GetWaveInfoByIndexAndType( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DeviceIndex, - IN SOUND_DEVICE_TYPE DeviceType, - OUT LPWAVE_INFO *OutWaveInfo); - NTSTATUS GetSysAudioDevicePnpName( IN PDEVICE_OBJECT DeviceObject, IN ULONG DeviceIndex, OUT LPWSTR * Device); -#endif +NTSTATUS +OpenSysAudioDeviceByIndex( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG DeviceIndex, + IN PHANDLE DeviceHandle, + IN PFILE_OBJECT * FileObject); + +NTSTATUS +OpenDevice( + IN LPWSTR Device, + OUT PHANDLE DeviceHandle, + OUT PFILE_OBJECT * FileObject); + +ULONG +WdmAudGetMixerDeviceCount(); + +ULONG +WdmAudGetWaveInDeviceCount(); + +ULONG +WdmAudGetWaveOutDeviceCount(); + +NTSTATUS +WdmAudGetMixerPnpNameByIndex( + IN ULONG DeviceIndex, + OUT LPWSTR * Device); + +NTSTATUS +WdmAudGetPnpNameByIndexAndType( + IN ULONG DeviceIndex, + IN SOUND_DEVICE_TYPE DeviceType, + OUT LPWSTR *Device); + + +/* sup.c */ + +ULONG +GetSysAudioDeviceCount( + IN PDEVICE_OBJECT DeviceObject); diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.rbuild b/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.rbuild index 1b3acd12e84..6c6595ca37b 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.rbuild +++ b/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.rbuild @@ -2,17 +2,20 @@ . - + . include/reactos/libs/sound + + mmixer ntoskrnl + rtl + libcntpr ks pseh hal control.c deviface.c entry.c - mixer.c - wave.c + mmixer.c sup.c wdmaud.rc diff --git a/reactos/drivers/wdm/audio/sysaudio/sysaudio.h b/reactos/drivers/wdm/audio/sysaudio/sysaudio.h index 15ca8caf554..01537b0a298 100644 --- a/reactos/drivers/wdm/audio/sysaudio/sysaudio.h +++ b/reactos/drivers/wdm/audio/sysaudio/sysaudio.h @@ -1,5 +1,4 @@ -#ifndef SYSAUDIO_H__ -#define SYSAUDIO_H__ +#pragma once #include #include @@ -133,6 +132,3 @@ ComputeCompatibleFormat( IN ULONG PinId, IN PKSDATAFORMAT_WAVEFORMATEX ClientFormat, OUT PKSDATAFORMAT_WAVEFORMATEX MixerFormat); - - -#endif diff --git a/reactos/drivers/wmi/wmilib.c b/reactos/drivers/wmi/wmilib.c index 1490374da25..0fd0fa6bc32 100644 --- a/reactos/drivers/wmi/wmilib.c +++ b/reactos/drivers/wmi/wmilib.c @@ -11,6 +11,7 @@ #include #include +#include #define NDEBUG #include diff --git a/reactos/hal/hal.pspec b/reactos/hal/hal.pspec index 786372d9e3d..74193047c28 100644 --- a/reactos/hal/hal.pspec +++ b/reactos/hal/hal.pspec @@ -46,7 +46,7 @@ @ stdcall HalGetEnvironmentVariable(str long str) @ fastcall -arch=arm HalGetInterruptSource() @ stdcall HalGetInterruptVector(long long long long ptr ptr) -@ stdcall HalHandleNMI(ptr) +@ stdcall -arch=i386 HalHandleNMI(ptr) @ stdcall HalInitSystem(long ptr) @ stdcall HalInitializeProcessor(long ptr) @ stdcall HalMakeBeep(long) diff --git a/reactos/hal/hal.rbuild b/reactos/hal/hal.rbuild index a7cf4bb0274..b846b042bf5 100644 --- a/reactos/hal/hal.rbuild +++ b/reactos/hal/hal.rbuild @@ -1,9 +1,12 @@ - - - + + + + + + diff --git a/reactos/hal/halarm/directory.rbuild b/reactos/hal/halarm/directory.rbuild index 1e0c730ba32..62b91a39624 100644 --- a/reactos/hal/halarm/directory.rbuild +++ b/reactos/hal/halarm/directory.rbuild @@ -1,10 +1,11 @@ - - - - - - + + + + + + + diff --git a/reactos/hal/halarm/generic/beep.c b/reactos/hal/halarm/generic/beep.c new file mode 100644 index 00000000000..bd274129e9f --- /dev/null +++ b/reactos/hal/halarm/generic/beep.c @@ -0,0 +1,26 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/beep.c + * PURPOSE: Speaker support (beeping) + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS *****************************************************************/ + +/* + * @implemented + */ +BOOLEAN +NTAPI +HalMakeBeep(IN ULONG Frequency) +{ + UNIMPLEMENTED; + return FALSE; +} diff --git a/reactos/hal/halarm/generic/bus.c b/reactos/hal/halarm/generic/bus.c new file mode 100644 index 00000000000..aeae3cbacb1 --- /dev/null +++ b/reactos/hal/halarm/generic/bus.c @@ -0,0 +1,151 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/bus.c + * PURPOSE: Bus Support Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + +/* PRIVATE FUNCTIONS **********************************************************/ + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +HalAdjustResourceList(IN PIO_RESOURCE_REQUIREMENTS_LIST *ResourceList) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_SUCCESS; +} + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +HalAssignSlotResources(IN PUNICODE_STRING RegistryPath, + IN PUNICODE_STRING DriverClassName, + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceObject, + IN INTERFACE_TYPE BusType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN OUT PCM_RESOURCE_LIST *AllocatedResources) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_SUCCESS; +} + +/* + * @unimplemented + */ +ULONG +NTAPI +HalGetBusData(IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Length) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* + * @unimplemented + */ +ULONG +NTAPI +HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* + * @unimplemented + */ +ULONG +NTAPI +HalGetInterruptVector(IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN ULONG BusInterruptLevel, + IN ULONG BusInterruptVector, + OUT PKIRQL Irql, + OUT PKAFFINITY Affinity) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* + * @unimplemented + */ +ULONG +NTAPI +HalSetBusData(IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Length) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* + * @unimplemented + */ +ULONG +NTAPI +HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* + * @unimplemented + */ +BOOLEAN +NTAPI +HalTranslateBusAddress(IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN PHYSICAL_ADDRESS BusAddress, + IN OUT PULONG AddressSpace, + OUT PPHYSICAL_ADDRESS TranslatedAddress) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/cache.S b/reactos/hal/halarm/generic/cache.S new file mode 100644 index 00000000000..c4325a53768 --- /dev/null +++ b/reactos/hal/halarm/generic/cache.S @@ -0,0 +1,57 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: GPL - See COPYING in the top level directory + * FILE: hal/halarm/generic/cache.s + * PURPOSE: Implements cache clean, invalidate routines for ARM machines + * PROGRAMMERS: Copyright (C) 2005 ARM Ltd. + */ + + .title "ARM HAL Cache Routines" + .include "ntoskrnl/include/internal/arm/kxarm.h" + .include "ntoskrnl/include/internal/arm/ksarm.h" + + NESTED_ENTRY v7_flush_dcache_all + PROLOG_END v7_flush_dcache_all + + mrc p15, 1, r0, c0, c0, 1 // read clidr + ands r3, r0, #0x7000000 // extract loc from clidr + mov r3, r3, lsr #23 // left align loc bit field + beq finished // if loc is 0, then no need to clean + mov r10, #0 // start clean at cache level 0 +loop1: + add r2, r10, r10, lsr #1 // work out 3x current cache level + mov r1, r0, lsr r2 // extract cache type bits from clidr + and r1, r1, #7 // mask of the bits for current cache only + cmp r1, #2 // see what cache we have at this level + blt skip // skip if no cache, or just i-cache + mcr p15, 2, r10, c0, c0, 0 // select current cache level in cssr + isb // isb to sych the new cssr&csidr + mrc p15, 1, r1, c0, c0, 0 // read the new csidr + and r2, r1, #7 // extract the length of the cache lines + add r2, r2, #4 // add 4 (line length offset) + ldr r4, =0x3ff + ands r4, r4, r1, lsr #3 // find maximum number on the way size + clz r5, r4 // find bit position of way size increment + ldr r7, =0x7fff + ands r7, r7, r1, lsr #13 // extract max number of the index size +loop2: + mov r9, r4 // create working copy of max way size +loop3: + orr r11, r10, r9, lsl r5 // factor way and cache number into r11 + orr r11, r11, r7, lsl r2 // factor index number into r11 + mcr p15, 0, r11, c7, c14, 2 // clean & invalidate by set/way + subs r9, r9, #1 // decrement the way + bge loop3 + subs r7, r7, #1 // decrement the index + bge loop2 +skip: + add r10, r10, #2 // increment cache number + cmp r3, r10 + bgt loop1 +finished: + mov r10, #0 // swith back to cache level 0 + mcr p15, 2, r10, c0, c0, 0 // select current cache level in cssr + isb + mov pc, lr + + ENTRY_END v7_flush_dcache_all diff --git a/reactos/hal/halarm/generic/display.c b/reactos/hal/halarm/generic/display.c new file mode 100644 index 00000000000..f21ca6dccfd --- /dev/null +++ b/reactos/hal/halarm/generic/display.c @@ -0,0 +1,64 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/display.c + * PURPOSE: Screen Display Routines, now useless since NT 5.1+ + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +#include +#define NDEBUG +#include +#include + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @implemented + */ +VOID +NTAPI +HalAcquireDisplayOwnership(IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters) +{ + /* Stub since Windows XP implemented Inbv */ + return; +} + +/* + * @implemented + */ +VOID +NTAPI +HalDisplayString(IN PCH String) +{ + /* Call the Inbv driver */ + InbvDisplayString(String); +} + +/* + * @implemented + */ +VOID +NTAPI +HalQueryDisplayParameters(OUT PULONG DispSizeX, + OUT PULONG DispSizeY, + OUT PULONG CursorPosX, + OUT PULONG CursorPosY) +{ + /* Stub since Windows XP implemented Inbv */ + return; +} + +/* + * @implemented + */ +VOID +NTAPI +HalSetDisplayParameters(IN ULONG CursorPosX, + IN ULONG CursorPosY) +{ + /* Stub since Windows XP implemented Inbv */ + return; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/dma.c b/reactos/hal/halarm/generic/dma.c new file mode 100644 index 00000000000..3070f25e7fb --- /dev/null +++ b/reactos/hal/halarm/generic/dma.c @@ -0,0 +1,188 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/dma.c + * PURPOSE: DMA Support + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS ******************************************************************/ + +/* + * @unimplemented + */ +PADAPTER_OBJECT +NTAPI +HalGetAdapter(IN PDEVICE_DESCRIPTION DeviceDescription, + OUT PULONG NumberOfMapRegisters) +{ + UNIMPLEMENTED; + while (TRUE); + return NULL; +} + +/* + * @unimplemented + */ +VOID +NTAPI +HalPutDmaAdapter(IN PADAPTER_OBJECT AdapterObject) +{ + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @unimplemented + */ +PVOID +NTAPI +HalAllocateCommonBuffer(IN PADAPTER_OBJECT AdapterObject, + IN ULONG Length, + IN PPHYSICAL_ADDRESS LogicalAddress, + IN BOOLEAN CacheEnabled) +{ + UNIMPLEMENTED; + while (TRUE); + return NULL; +} + +/* + * @unimplemented + */ +VOID +NTAPI +HalFreeCommonBuffer(IN PADAPTER_OBJECT AdapterObject, + IN ULONG Length, + IN PHYSICAL_ADDRESS LogicalAddress, + IN PVOID VirtualAddress, + IN BOOLEAN CacheEnabled) +{ + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @unimplemented + */ +ULONG +NTAPI +HalReadDmaCounter(IN PADAPTER_OBJECT AdapterObject) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* + * @unimplemented + */ +NTSTATUS +NTAPI +HalAllocateAdapterChannel(IN PADAPTER_OBJECT AdapterObject, + IN PWAIT_CONTEXT_BLOCK WaitContextBlock, + IN ULONG NumberOfMapRegisters, + IN PDRIVER_CONTROL ExecutionRoutine) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_SUCCESS; +} + +/* + * @unimplemented + */ +VOID +NTAPI +IoFreeAdapterChannel(IN PADAPTER_OBJECT AdapterObject) +{ + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @unimplemented + */ +VOID +NTAPI +IoFreeMapRegisters(IN PADAPTER_OBJECT AdapterObject, + IN PVOID MapRegisterBase, + IN ULONG NumberOfMapRegisters) +{ + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @unimplemented + */ +BOOLEAN +NTAPI +IoFlushAdapterBuffers(IN PADAPTER_OBJECT AdapterObject, + IN PMDL Mdl, + IN PVOID MapRegisterBase, + IN PVOID CurrentVa, + IN ULONG Length, + IN BOOLEAN WriteToDevice) +{ + UNIMPLEMENTED; + while (TRUE); + return FALSE; +} + +/* + * @unimplemented + */ +PHYSICAL_ADDRESS +NTAPI +IoMapTransfer(IN PADAPTER_OBJECT AdapterObject, + IN PMDL Mdl, + IN PVOID MapRegisterBase, + IN PVOID CurrentVa, + IN OUT PULONG Length, + IN BOOLEAN WriteToDevice) +{ + PHYSICAL_ADDRESS Address; + + UNIMPLEMENTED; + while (TRUE); + + Address.QuadPart = 0; + return Address; +} + +/* + * @unimplemented + */ +BOOLEAN +NTAPI +HalFlushCommonBuffer(IN PADAPTER_OBJECT AdapterObject, + IN ULONG Length, + IN PHYSICAL_ADDRESS LogicalAddress, + IN PVOID VirtualAddress) +{ + UNIMPLEMENTED; + while (TRUE); + return FALSE; +} + +/* + * @unimplemented + */ +PVOID +NTAPI +HalAllocateCrashDumpRegisters(IN PADAPTER_OBJECT AdapterObject, + IN OUT PULONG NumberOfMapRegisters) +{ + UNIMPLEMENTED; + while (TRUE); + return NULL; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/drive.c b/reactos/hal/halarm/generic/drive.c new file mode 100644 index 00000000000..b1140bc3ce8 --- /dev/null +++ b/reactos/hal/halarm/generic/drive.c @@ -0,0 +1,75 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/drive.c + * PURPOSE: HAL Stubs for Disk I/O Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS *****************************************************************/ + +VOID +NTAPI +HalpAssignDriveLetters(IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, + IN PSTRING NtDeviceName, + OUT PUCHAR NtSystemPath, + OUT PSTRING NtSystemPathString) +{ + /* Call the kernel */ + IoAssignDriveLetters(LoaderBlock, + NtDeviceName, + NtSystemPath, + NtSystemPathString); +} + +NTSTATUS +NTAPI +HalpReadPartitionTable(IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN BOOLEAN ReturnRecognizedPartitions, + IN OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer) +{ + /* Call the kernel */ + return IoReadPartitionTable(DeviceObject, + SectorSize, + ReturnRecognizedPartitions, + PartitionBuffer); +} + +NTSTATUS +NTAPI +HalpWritePartitionTable(IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG SectorsPerTrack, + IN ULONG NumberOfHeads, + IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer) +{ + /* Call the kernel */ + return IoWritePartitionTable(DeviceObject, + SectorSize, + SectorsPerTrack, + NumberOfHeads, + PartitionBuffer); +} + +NTSTATUS +NTAPI +HalpSetPartitionInformation(IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG PartitionNumber, + IN ULONG PartitionType) +{ + /* Call the kernel */ + return IoSetPartitionInformation(DeviceObject, + SectorSize, + PartitionNumber, + PartitionType); +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/fmutex.c b/reactos/hal/halarm/generic/fmutex.c new file mode 100644 index 00000000000..1187288d7da --- /dev/null +++ b/reactos/hal/halarm/generic/fmutex.c @@ -0,0 +1,46 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/fmutex.c + * PURPOSE: Fast Mutex Support + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#undef ExAcquireFastMutex +#undef ExReleaseFastMutex +#undef ExTryToAcquireFastMutex + +/* FUNCTIONS ******************************************************************/ + +VOID +FASTCALL +ExAcquireFastMutex(IN PFAST_MUTEX FastMutex) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +FASTCALL +ExReleaseFastMutex(IN PFAST_MUTEX FastMutex) +{ + UNIMPLEMENTED; + while (TRUE); +} + +BOOLEAN +FASTCALL +ExTryToAcquireFastMutex(IN PFAST_MUTEX FastMutex) +{ + UNIMPLEMENTED; + while (TRUE); + return TRUE; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/generic.rbuild b/reactos/hal/halarm/generic/generic.rbuild deleted file mode 100644 index 5f4ec64f7dc..00000000000 --- a/reactos/hal/halarm/generic/generic.rbuild +++ /dev/null @@ -1,9 +0,0 @@ - - - - ../include - include - - hal.c - ../include/hal.h - diff --git a/reactos/hal/halarm/generic/hal.c b/reactos/hal/halarm/generic/hal.c deleted file mode 100644 index 6724abd2823..00000000000 --- a/reactos/hal/halarm/generic/hal.c +++ /dev/null @@ -1,1540 +0,0 @@ -/* - * PROJECT: ReactOS HAL - * LICENSE: BSD - See COPYING.ARM in the top level directory - * FILE: hal/halarm/generic/hal.c - * PURPOSE: Hardware Abstraction Layer - * PROGRAMMERS: ReactOS Portable Systems Group - */ - -/* INCLUDES *******************************************************************/ - -#include -#define NDEBUG -#include -#include - -#undef ExAcquireFastMutex -#undef ExReleaseFastMutex -#undef ExTryToAcquireFastMutex -#undef KeAcquireSpinLock -#undef KeLowerIrql -#undef KeRaiseIrql -#undef KeReleaseSpinLock - -#define READ_REGISTER_ULONG(r) (*((volatile ULONG * const)(r))) -#define WRITE_REGISTER_ULONG(r, v) (*((volatile ULONG *)(r)) = (v)) - -VOID -FASTCALL -KeUpdateSystemTime( - IN PKTRAP_FRAME TrapFrame, - IN ULONG Increment, - IN KIRQL OldIrql -); - -/* DATA **********************************************************************/ - -ULONG HalpCurrentTimeIncrement, HalpNextTimeIncrement, HalpNextIntervalCount; -PUCHAR KdComPortInUse; - -ULONG HalpIrqlTable[HIGH_LEVEL + 1] = -{ - 0xFFFFFFFF, // IRQL 0 PASSIVE_LEVEL - 0xFFFFFFFD, // IRQL 1 APC_LEVEL - 0xFFFFFFF9, // IRQL 2 DISPATCH_LEVEL - 0xFFFFFFD9, // IRQL 3 - 0xFFFFFF99, // IRQL 4 - 0xFFFFFF19, // IRQL 5 - 0xFFFFFE19, // IRQL 6 - 0xFFFFFC19, // IRQL 7 - 0xFFFFF819, // IRQL 8 - 0xFFFFF019, // IRQL 9 - 0xFFFFE019, // IRQL 10 - 0xFFFFC019, // IRQL 11 - 0xFFFF8019, // IRQL 12 - 0xFFFF0019, // IRQL 13 - 0xFFFE0019, // IRQL 14 - 0xFFFC0019, // IRQL 15 - 0xFFF80019, // IRQL 16 - 0xFFF00019, // IRQL 17 - 0xFFE00019, // IRQL 18 - 0xFFC00019, // IRQL 19 - 0xFF800019, // IRQL 20 - 0xFF000019, // IRQL 21 - 0xFE000019, // IRQL 22 - 0xFC000019, // IRQL 23 - 0xF0000019, // IRQL 24 - 0x80000019, // IRQL 25 - 0x19, // IRQL 26 - 0x18, // IRQL 27 PROFILE_LEVEL - 0x10, // IRQL 28 CLOCK2_LEVEL - 0x00, // IRQL 29 IPI_LEVEL - 0x00, // IRQL 30 POWER_LEVEL - 0x00, // IRQL 31 HIGH_LEVEL -}; - -UCHAR HalpMaskTable[HIGH_LEVEL + 1] = -{ - PROFILE_LEVEL, // INT 0 WATCHDOG - APC_LEVEL, // INT 1 SOFTWARE INTERRUPT - DISPATCH_LEVEL,// INT 2 COMM RX - IPI_LEVEL, // INT 3 COMM TX - CLOCK2_LEVEL, // INT 4 TIMER 0 - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12, - 13, - 14, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 23, - 24, - 25, - 26, - 26, - 26 -}; - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS -NTAPI -DriverEntry( - PDRIVER_OBJECT DriverObject, - PUNICODE_STRING RegistryPath) -{ - UNIMPLEMENTED; - - return STATUS_SUCCESS; -} - -/* -* @unimplemented -*/ -VOID -NTAPI -HalStopProfileInterrupt(IN KPROFILE_SOURCE ProfileSource) -{ - UNIMPLEMENTED; - return; -} - -/* -* @unimplemented -*/ -VOID -NTAPI -HalStartProfileInterrupt(IN KPROFILE_SOURCE ProfileSource) -{ - UNIMPLEMENTED; - return; -} - -/* -* @unimplemented -*/ -ULONG_PTR -NTAPI -HalSetProfileInterval(IN ULONG_PTR Interval) -{ - UNIMPLEMENTED; - return Interval; -} - -VOID -FASTCALL -ExAcquireFastMutex( - PFAST_MUTEX FastMutex) -{ - UNIMPLEMENTED; -} - - -VOID -FASTCALL -ExReleaseFastMutex( - PFAST_MUTEX FastMutex) -{ - UNIMPLEMENTED; -} - - -BOOLEAN FASTCALL -ExTryToAcquireFastMutex( - PFAST_MUTEX FastMutex) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -NTSTATUS -NTAPI -HalAdjustResourceList( - PCM_RESOURCE_LIST Resources) -{ - UNIMPLEMENTED; - - return STATUS_SUCCESS; -} - - -/* - * @implemented - */ -BOOLEAN -NTAPI -HalAllProcessorsStarted(VOID) -{ - /* Do nothing */ - return TRUE; -} - - -NTSTATUS -NTAPI -HalAllocateAdapterChannel( - PADAPTER_OBJECT AdapterObject, - PWAIT_CONTEXT_BLOCK WaitContextBlock, - ULONG NumberOfMapRegisters, - PDRIVER_CONTROL ExecutionRoutine) -{ - UNIMPLEMENTED; - - return STATUS_SUCCESS; -} - - -PVOID -NTAPI -HalAllocateCommonBuffer( - PADAPTER_OBJECT AdapterObject, - ULONG Length, - PPHYSICAL_ADDRESS LogicalAddress, - BOOLEAN CacheEnabled) -{ - UNIMPLEMENTED; - - return NULL; -} - - -PVOID -NTAPI -HalAllocateCrashDumpRegisters( - PADAPTER_OBJECT AdapterObject, - PULONG NumberOfMapRegisters) -{ - UNIMPLEMENTED; - return NULL; -} - - -NTSTATUS -NTAPI -HalAssignSlotResources( - PUNICODE_STRING RegistryPath, - PUNICODE_STRING DriverClassName, - PDRIVER_OBJECT DriverObject, - PDEVICE_OBJECT DeviceObject, - INTERFACE_TYPE BusType, - ULONG BusNumber, - ULONG SlotNumber, - PCM_RESOURCE_LIST *AllocatedResources) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -BOOLEAN -NTAPI -HalBeginSystemInterrupt(IN KIRQL Irql, - IN UCHAR Vector, - OUT PKIRQL OldIrql) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -VOID -NTAPI -HalCalibratePerformanceCounter( - volatile LONG *Count, - ULONGLONG NewCount) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -HalDisableSystemInterrupt(ULONG Vector, - KIRQL Irql) -{ - UNIMPLEMENTED; -} - -VOID -NTAPI -HalAcquireDisplayOwnership(IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters) -{ - // - // Stub since Windows XP implemented Inbv - // - return; -} - -VOID -NTAPI -HalDisplayString(IN PCH String) -{ - // - // Call the Inbv driver - // - InbvDisplayString(String); -} - -VOID -NTAPI -HalQueryDisplayParameters(OUT PULONG DispSizeX, - OUT PULONG DispSizeY, - OUT PULONG CursorPosX, - OUT PULONG CursorPosY) -{ - // - // Stub since Windows XP implemented Inbv - // - return; -} - -VOID -NTAPI -HalSetDisplayParameters(IN ULONG CursorPosX, - IN ULONG CursorPosY) -{ - // - // Stub since Windows XP implemented Inbv - // - return; -} - -BOOLEAN -NTAPI -HalEnableSystemInterrupt(IN UCHAR Vector, - IN KIRQL Irql, - IN KINTERRUPT_MODE InterruptMode) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -VOID -NTAPI -HalEndSystemInterrupt(IN KIRQL OldIrql, - IN PKTRAP_FRAME TrapFrame) -{ - UNIMPLEMENTED; -} - - -BOOLEAN -NTAPI -HalFlushCommonBuffer( - ULONG Unknown1, - ULONG Unknown2, - ULONG Unknown3, - ULONG Unknown4, - ULONG Unknown5) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -VOID -NTAPI -HalFreeCommonBuffer( - PADAPTER_OBJECT AdapterObject, - ULONG Length, - PHYSICAL_ADDRESS LogicalAddress, - PVOID VirtualAddress, - BOOLEAN CacheEnabled) -{ - UNIMPLEMENTED; -} - - -PADAPTER_OBJECT -NTAPI -HalGetAdapter( - PDEVICE_DESCRIPTION DeviceDescription, - PULONG NumberOfMapRegisters) -{ - UNIMPLEMENTED; - - return (PADAPTER_OBJECT)NULL; -} - - -ULONG -NTAPI -HalGetBusData( - BUS_DATA_TYPE BusDataType, - ULONG BusNumber, - ULONG SlotNumber, - PVOID Buffer, - ULONG Length) -{ - UNIMPLEMENTED; - - return 0; -} - - -ULONG -NTAPI -HalGetBusDataByOffset( - BUS_DATA_TYPE BusDataType, - ULONG BusNumber, - ULONG SlotNumber, - PVOID Buffer, - ULONG Offset, - ULONG Length) -{ - UNIMPLEMENTED; - - return 0; -} - - -ARC_STATUS -NTAPI -HalGetEnvironmentVariable( - PCH Name, - USHORT ValueLength, - PCH Value) -{ - UNIMPLEMENTED; - - return ENOENT; -} - - -ULONG -NTAPI -HalGetInterruptVector( - INTERFACE_TYPE InterfaceType, - ULONG BusNumber, - ULONG BusInterruptLevel, - ULONG BusInterruptVector, - PKIRQL Irql, - PKAFFINITY Affinity) -{ - UNIMPLEMENTED; - - return 0; -} - - -VOID -NTAPI -HalHandleNMI( - PVOID NmiData) -{ - UNIMPLEMENTED; -} - -VOID -NTAPI -HalpGetParameters(IN PLOADER_PARAMETER_BLOCK LoaderBlock) -{ - PCHAR CommandLine; - - /* Make sure we have a loader block and command line */ - if ((LoaderBlock) && (LoaderBlock->LoadOptions)) - { - /* Read the command line */ - CommandLine = LoaderBlock->LoadOptions; - - /* Check for initial breakpoint */ - if (strstr(CommandLine, "BREAK")) DbgBreakPoint(); - } -} - -ULONG -HalGetInterruptSource(VOID) -{ - ULONG InterruptStatus; - - // - // Get the interrupt status, and return the highest bit set - // - InterruptStatus = READ_REGISTER_ULONG(VIC_INT_STATUS); - return 31 - _clz(InterruptStatus); -} - -VOID -HalpClockInterrupt(VOID) -{ - // - // Clear the interrupt - // - ASSERT(KeGetCurrentIrql() == CLOCK2_LEVEL); - WRITE_REGISTER_ULONG(TIMER0_INT_CLEAR, 1); - - // - // FIXME: Update HAL Perf counters - // - - // - // FIXME: Check if someone changed the clockrate - // - - // - // Call the kernel - // - KeUpdateSystemTime(KeGetCurrentThread()->TrapFrame, - CLOCK2_LEVEL, - HalpCurrentTimeIncrement); - - // - // We're done - // -} - -VOID -HalpStallInterrupt(VOID) -{ - // - // Clear the interrupt - // - WRITE_REGISTER_ULONG(TIMER0_INT_CLEAR, 1); -} - -VOID -HalpInitializeInterrupts(VOID) -{ - PKPCR Pcr = (PKPCR)KeGetPcr(); - ULONG ClockInterval; - SP804_CONTROL_REGISTER ControlRegister; - - // - // Fill out the IRQL mappings - // - RtlCopyMemory(Pcr->IrqlTable, HalpIrqlTable, sizeof(Pcr->IrqlTable)); - RtlCopyMemory(Pcr->IrqlMask, HalpMaskTable, sizeof(Pcr->IrqlMask)); - - // - // Setup the clock and profile interrupt - // - Pcr->InterruptRoutine[CLOCK2_LEVEL] = HalpStallInterrupt; - - // - // Configure the interval to 10ms - // (INTERVAL (10ms) * TIMCLKfreq (1MHz)) - // --------------------------------------- == 10^4 - // (TIMCLKENXdiv (1) * PRESCALEdiv (1)) - // - ClockInterval = 0x2710; - - // - // Configure the timer - // - ControlRegister.AsUlong = 0; - ControlRegister.Wide = TRUE; - ControlRegister.Periodic = TRUE; - ControlRegister.Interrupt = TRUE; - ControlRegister.Enabled = TRUE; - - // - // Enable the timer - // - WRITE_REGISTER_ULONG(TIMER0_LOAD, ClockInterval); - WRITE_REGISTER_ULONG(TIMER0_CONTROL, ControlRegister.AsUlong); -} - -/* - * @implemented - */ -BOOLEAN -NTAPI -HalInitSystem(IN ULONG BootPhase, - IN PLOADER_PARAMETER_BLOCK LoaderBlock) -{ - PKPRCB Prcb = KeGetCurrentPrcb(); - - // - // Check the boot phase - // - if (!BootPhase) - { - // - // Get command-line parameters - // - HalpGetParameters(LoaderBlock); - -#if DBG - // - // Checked HAL requires checked kernel - // - if (!(Prcb->BuildType & PRCB_BUILD_DEBUG)) - { - // - // No match, bugcheck - // - KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 1, 0); - } -#else - // - // Release build requires release HAL - // - if (Prcb->BuildType & PRCB_BUILD_DEBUG) - { - // - // No match, bugcheck - // - KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0); - } -#endif - -#ifdef CONFIG_SMP - // - // SMP HAL requires SMP kernel - // - if (Prcb->BuildType & PRCB_BUILD_UNIPROCESSOR) - { - // - // No match, bugcheck - // - KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0); - } -#endif - - // - // Validate the PRCB - // - if (Prcb->MajorVersion != PRCB_MAJOR_VERSION) - { - // - // Validation failed, bugcheck - // - KeBugCheckEx(MISMATCHED_HAL, 1, Prcb->MajorVersion, 1, 0); - } - - // - // Setup time increments to 10ms and 1ms - // - HalpCurrentTimeIncrement = 100000; - HalpNextTimeIncrement = 100000; - HalpNextIntervalCount = 0; - KeSetTimeIncrement(100000, 10000); - - // - // Initialize interrupts - // - HalpInitializeInterrupts(); - } - else if (BootPhase == 1) - { - // - // Switch to real clock interrupt - // - PCR->InterruptRoutine[CLOCK2_LEVEL] = HalpClockInterrupt; - } - - // - // All done, return - // - return TRUE; -} - - -VOID -NTAPI -HalInitializeProcessor(IN ULONG ProcessorNumber, - IN PLOADER_PARAMETER_BLOCK LoaderBlock) -{ - // - // Nothing to do - // - return; -} - - -BOOLEAN -NTAPI -HalMakeBeep( - ULONG Frequency) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -VOID -NTAPI -HalProcessorIdle(VOID) -{ - UNIMPLEMENTED; -} - - -#define RTC_DATA (PVOID)0xE00E8000 - -BOOLEAN -NTAPI -HalQueryRealTimeClock(IN PTIME_FIELDS Time) -{ - LARGE_INTEGER LargeTime; - ULONG Seconds; - - // - // Query the RTC value - // - Seconds = READ_REGISTER_ULONG(RTC_DATA); - - // - // Convert to time - // - RtlSecondsSince1970ToTime(Seconds, &LargeTime); - - // - // Convert to time-fields - // - RtlTimeToTimeFields(&LargeTime, Time); - return TRUE; -} - -ULONG -NTAPI -HalReadDmaCounter( - PADAPTER_OBJECT AdapterObject) -{ - UNIMPLEMENTED; - - return 0; -} - - -VOID -NTAPI -HalReportResourceUsage(VOID) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -HalRequestIpi( - ULONG Unknown) -{ - UNIMPLEMENTED; -} - - -VOID -FASTCALL -HalRequestSoftwareInterrupt(IN KIRQL Request) -{ - // - // Force a software interrupt - // - WRITE_REGISTER_ULONG(VIC_SOFT_INT, 1 << Request); -} - -VOID -FASTCALL -HalClearSoftwareInterrupt(IN KIRQL Request) -{ - // - // Clear a software interrupt - // - WRITE_REGISTER_ULONG(VIC_SOFT_INT_CLEAR, 1 << Request); -} - -VOID -NTAPI -HalReturnToFirmware( - FIRMWARE_REENTRY Action) -{ - UNIMPLEMENTED; -} - - -ULONG -NTAPI -HalSetBusData( - BUS_DATA_TYPE BusDataType, - ULONG BusNumber, - ULONG SlotNumber, - PVOID Buffer, - ULONG Length) -{ - UNIMPLEMENTED; - - return 0; -} - - -ULONG -NTAPI -HalSetBusDataByOffset( - BUS_DATA_TYPE BusDataType, - ULONG BusNumber, - ULONG SlotNumber, - PVOID Buffer, - ULONG Offset, - ULONG Length) -{ - UNIMPLEMENTED; - - return 0; -} - - -ARC_STATUS -NTAPI -HalSetEnvironmentVariable( - PCH Name, - PCH Value) -{ - UNIMPLEMENTED; - - return ESUCCESS; -} - - -BOOLEAN -NTAPI -HalSetRealTimeClock( - PTIME_FIELDS Time) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -ULONG -NTAPI -HalSetTimeIncrement( - ULONG Increment) -{ - UNIMPLEMENTED; - - return Increment; -} - - -BOOLEAN -NTAPI -HalStartNextProcessor(IN PLOADER_PARAMETER_BLOCK LoaderBlock, - IN PKPROCESSOR_STATE ProcessorState) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -UCHAR -FASTCALL -HalSystemVectorDispatchEntry(IN ULONG Vector, - OUT PKINTERRUPT_ROUTINE **FlatDispatch, - OUT PKINTERRUPT_ROUTINE *NoConnection) -{ - UNIMPLEMENTED; - - return 0; -} - - -BOOLEAN -NTAPI -HalTranslateBusAddress( - INTERFACE_TYPE InterfaceType, - ULONG BusNumber, - PHYSICAL_ADDRESS BusAddress, - PULONG AddressSpace, - PPHYSICAL_ADDRESS TranslatedAddress) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -VOID -NTAPI -HalpAssignDriveLetters(IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, - IN PSTRING NtDeviceName, - OUT PUCHAR NtSystemPath, - OUT PSTRING NtSystemPathString) -{ - /* Call the kernel */ - IoAssignDriveLetters(LoaderBlock, - NtDeviceName, - NtSystemPath, - NtSystemPathString); -} - -NTSTATUS -NTAPI -HalpReadPartitionTable(IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN BOOLEAN ReturnRecognizedPartitions, - IN OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer) -{ - /* Call the kernel */ - return IoReadPartitionTable(DeviceObject, - SectorSize, - ReturnRecognizedPartitions, - PartitionBuffer); -} - -NTSTATUS -NTAPI -HalpWritePartitionTable(IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG SectorsPerTrack, - IN ULONG NumberOfHeads, - IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer) -{ - /* Call the kernel */ - return IoWritePartitionTable(DeviceObject, - SectorSize, - SectorsPerTrack, - NumberOfHeads, - PartitionBuffer); -} - -NTSTATUS -NTAPI -HalpSetPartitionInformation(IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG PartitionNumber, - IN ULONG PartitionType) -{ - /* Call the kernel */ - return IoSetPartitionInformation(DeviceObject, - SectorSize, - PartitionNumber, - PartitionType); -} - - -BOOLEAN -NTAPI -IoFlushAdapterBuffers( - PADAPTER_OBJECT AdapterObject, - PMDL Mdl, - PVOID MapRegisterBase, - PVOID CurrentVa, - ULONG Length, - BOOLEAN WriteToDevice) -{ - UNIMPLEMENTED; - - return TRUE; -} - - -VOID -NTAPI -IoFreeAdapterChannel( - PADAPTER_OBJECT AdapterObject) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -IoFreeMapRegisters( - PADAPTER_OBJECT AdapterObject, - PVOID MapRegisterBase, - ULONG NumberOfMapRegisters) -{ - UNIMPLEMENTED; -} - - -PHYSICAL_ADDRESS -NTAPI -IoMapTransfer( - PADAPTER_OBJECT AdapterObject, - PMDL Mdl, - PVOID MapRegisterBase, - PVOID CurrentVa, - PULONG Length, - BOOLEAN WriteToDevice) -{ - PHYSICAL_ADDRESS Address; - - UNIMPLEMENTED; - - Address.QuadPart = 0; - - return Address; -} - -VOID -NTAPI -KeFlushWriteBuffer(VOID) -{ - UNIMPLEMENTED; -} - -LARGE_INTEGER -NTAPI -KeQueryPerformanceCounter( - PLARGE_INTEGER PerformanceFreq) -{ - LARGE_INTEGER Value; - - UNIMPLEMENTED; - - Value.QuadPart = 0; - - return Value; -} - -VOID -NTAPI -KeStallExecutionProcessor(IN ULONG Microseconds) -{ - SP804_CONTROL_REGISTER ControlRegister; - - // - // Enable the timer - // - WRITE_REGISTER_ULONG(TIMER1_LOAD, Microseconds); - - // - // Configure the timer - // - ControlRegister.AsUlong = 0; - ControlRegister.OneShot = TRUE; - ControlRegister.Wide = TRUE; - ControlRegister.Periodic = TRUE; - ControlRegister.Enabled = TRUE; - WRITE_REGISTER_ULONG(TIMER1_CONTROL, ControlRegister.AsUlong); - - // - // Now we will loop until the timer reached 0 - // - while (READ_REGISTER_ULONG(TIMER1_VALUE)); -} - -VOID -FASTCALL -KfLowerIrql(IN KIRQL NewIrql) -{ - ULONG InterruptMask; - ARM_STATUS_REGISTER Flags; - PKPCR Pcr = (PKPCR)KeGetPcr(); - - // - // Validate the new IRQL - // - Flags = KeArmStatusRegisterGet(); - _disable(); - ASSERT(NewIrql <= Pcr->CurrentIrql); - - // - // IRQLs are internally 8 bits - // - NewIrql &= 0xFF; - - // - // Setup the interrupt mask for this IRQL - // - InterruptMask = KeGetPcr()->IrqlTable[NewIrql]; -// DPRINT1("[LOWER] IRQL: %d InterruptMask: %lx\n", NewIrql, InterruptMask); - - // - // Clear interrupts associated to the old IRQL - // - WRITE_REGISTER_ULONG(VIC_INT_CLEAR, 0xFFFFFFFF); - - // - // Set the new interrupt mask - // PL190 VIC support only for now - // - WRITE_REGISTER_ULONG(VIC_INT_ENABLE, InterruptMask); - - // - // Save the new IRQL - // - Pcr->CurrentIrql = NewIrql; - if (!Flags.IrqDisable) _enable(); -} - -KIRQL -FASTCALL -KfRaiseIrql(IN KIRQL NewIrql) -{ - KIRQL OldIrql; - ULONG InterruptMask; - ARM_STATUS_REGISTER Flags; - PKPCR Pcr = (PKPCR)KeGetPcr(); - - // - // Save the current IRQL - // - Flags = KeArmStatusRegisterGet(); - _disable(); - OldIrql = Pcr->CurrentIrql; - - // - // IRQLs are internally 8 bits - // - NewIrql &= 0xFF; - - // - // Setup the interrupt mask for this IRQL - // - InterruptMask = KeGetPcr()->IrqlTable[NewIrql]; - // DPRINT1("[RAISE] IRQL: %d InterruptMask: %lx\n", NewIrql, InterruptMask); - ASSERT(NewIrql >= OldIrql); - - // - // Clear interrupts associated to the old IRQL - // - WRITE_REGISTER_ULONG(VIC_INT_CLEAR, 0xFFFFFFFF); - - // - // Set the new interrupt mask - // PL190 VIC support only for now - // - WRITE_REGISTER_ULONG(VIC_INT_ENABLE, InterruptMask); - - // - // Save the new IRQL - // - Pcr->CurrentIrql = NewIrql; - if (!Flags.IrqDisable) _enable(); - return OldIrql; -} - -VOID -NTAPI -READ_PORT_BUFFER_UCHAR( - PUCHAR Port, - PUCHAR Buffer, - ULONG Count) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -READ_PORT_BUFFER_ULONG( - PULONG Port, - PULONG Buffer, - ULONG Count) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -READ_PORT_BUFFER_USHORT( - PUSHORT Port, - PUSHORT Buffer, - ULONG Count) -{ - UNIMPLEMENTED; -} - - -UCHAR -NTAPI -READ_PORT_UCHAR( - PUCHAR Port) -{ - UNIMPLEMENTED; - - return 0; -} - - -ULONG -NTAPI -READ_PORT_ULONG( - PULONG Port) -{ - UNIMPLEMENTED; - - return 0; -} - - -USHORT -NTAPI -READ_PORT_USHORT( - PUSHORT Port) -{ - UNIMPLEMENTED; - - return 0; -} - - -VOID -NTAPI -WRITE_PORT_BUFFER_UCHAR( - PUCHAR Port, - PUCHAR Buffer, - ULONG Count) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -WRITE_PORT_BUFFER_USHORT( - PUSHORT Port, - PUSHORT Buffer, - ULONG Count) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -WRITE_PORT_BUFFER_ULONG( - PULONG Port, - PULONG Buffer, - ULONG Count) -{ - UNIMPLEMENTED; -} - - -VOID -NTAPI -WRITE_PORT_UCHAR( - PUCHAR Port, - UCHAR Value) -{ - UNIMPLEMENTED; -} - -VOID -NTAPI -WRITE_PORT_ULONG( - PULONG Port, - ULONG Value) -{ - UNIMPLEMENTED; -} - -VOID -NTAPI -WRITE_PORT_USHORT( - PUSHORT Port, - USHORT Value) -{ - UNIMPLEMENTED; -} - -KIRQL -KeRaiseIrqlToDpcLevel(VOID) -{ - // - // Call the generic routine - // - return KfRaiseIrql(DISPATCH_LEVEL); -} - -KIRQL -KeRaiseIrqlToSynchLevel(VOID) -{ - // - // Call the generic routine - // - return KfRaiseIrql(DISPATCH_LEVEL); -} - -BOOLEAN HalpProcessorIdentified; -BOOLEAN HalpTestCleanSupported; - -VOID -HalpIdentifyProcessor(VOID) -{ - ARM_ID_CODE_REGISTER IdRegister; - - // - // Don't do it again - // - HalpProcessorIdentified = TRUE; - - // - // Read the ID Code - // - IdRegister = KeArmIdCodeRegisterGet(); - - // - // Architecture "6" CPUs support test-and-clean (926EJ-S and 1026EJ-S) - // - HalpTestCleanSupported = (IdRegister.Architecture == 6); -} - -VOID -HalSweepDcache(VOID) -{ - // - // We get called very early on, before HalInitSystem or any of the Hal* - // processor routines, so we need to figure out what CPU we're on. - // - if (!HalpProcessorIdentified) HalpIdentifyProcessor(); - - // - // Check if we can do it the ARMv5TE-J way - // - if (HalpTestCleanSupported) - { - // - // Test, clean, flush D-Cache - // - __asm__ __volatile__ ("1: mrc p15, 0, pc, c7, c14, 3; bne 1b"); - } - else - { - // - // We need to do it it by set/way - // - UNIMPLEMENTED; - } -} - -VOID -HalSweepIcache(VOID) -{ - // - // All ARM cores support the same Icache flush command, no need for HAL work - // - KeArmFlushIcache(); -} - -/* - * @implemented - */ -#undef KeGetCurrentIrql -KIRQL -NTAPI -KeGetCurrentIrql(VOID) -{ - /* Return IRQL */ - return PCR->CurrentIrql; -} - -/* - * @implemented - */ -VOID -NTAPI -KeLowerIrql(KIRQL NewIrql) -{ - /* Call the fastcall function */ - KfLowerIrql(NewIrql); -} - -/* - * @implemented - */ -VOID -NTAPI -KeRaiseIrql(KIRQL NewIrql, - PKIRQL OldIrql) -{ - /* Call the fastcall function */ - *OldIrql = KfRaiseIrql(NewIrql); -} - -/* - * @implemented - */ -VOID -NTAPI -KeAcquireSpinLock(PKSPIN_LOCK SpinLock, - PKIRQL OldIrql) -{ - /* Call the fastcall function */ - *OldIrql = KfAcquireSpinLock(SpinLock); -} - -/* - * @implemented - */ -KIRQL -FASTCALL -KeAcquireSpinLockRaiseToSynch(PKSPIN_LOCK SpinLock) -{ - /* Simply raise to dispatch */ - return KfRaiseIrql(DISPATCH_LEVEL); -} - -/* - * @implemented - */ -VOID -NTAPI -KeReleaseSpinLock(PKSPIN_LOCK SpinLock, - KIRQL NewIrql) -{ - /* Call the fastcall function */ - KfReleaseSpinLock(SpinLock, NewIrql); -} - -/* - * @implemented - */ -KIRQL -FASTCALL -KfAcquireSpinLock(PKSPIN_LOCK SpinLock) -{ - /* Simply raise to dispatch */ - return KfRaiseIrql(DISPATCH_LEVEL); -} - -/* - * @implemented - */ -VOID -FASTCALL -KfReleaseSpinLock(PKSPIN_LOCK SpinLock, - KIRQL OldIrql) -{ - /* Simply lower IRQL back */ - KfLowerIrql(OldIrql); -} - -/* - * @implemented - */ -KIRQL -FASTCALL -KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber) -{ - /* Simply raise to dispatch */ - return KfRaiseIrql(DISPATCH_LEVEL); -} - -/* - * @implemented - */ -KIRQL -FASTCALL -KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber) -{ - /* Simply raise to dispatch */ - return KfRaiseIrql(DISPATCH_LEVEL); -} - -/* - * @implemented - */ -VOID -FASTCALL -KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock, - IN PKLOCK_QUEUE_HANDLE LockHandle) -{ - /* Simply raise to dispatch */ - LockHandle->OldIrql = KfRaiseIrql(DISPATCH_LEVEL); -} - -/* - * @implemented - */ -VOID -FASTCALL -KeAcquireInStackQueuedSpinLockRaiseToSynch(IN PKSPIN_LOCK SpinLock, - IN PKLOCK_QUEUE_HANDLE LockHandle) -{ - /* Simply raise to synch */ - LockHandle->OldIrql = KfRaiseIrql(DISPATCH_LEVEL); -} - -/* - * @implemented - */ -VOID -FASTCALL -KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, - IN KIRQL OldIrql) -{ - /* Simply lower IRQL back */ - KfLowerIrql(OldIrql); -} - -/* - * @implemented - */ -VOID -FASTCALL -KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle) -{ - /* Simply lower IRQL back */ - KfLowerIrql(LockHandle->OldIrql); -} - -/* - * @implemented - */ -BOOLEAN -FASTCALL -KeTryToAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, - IN PKIRQL OldIrql) -{ - /* Simply raise to dispatch */ - *OldIrql = KfRaiseIrql(DISPATCH_LEVEL); - - /* Always return true on UP Machines */ - return TRUE; -} - -/* - * @implemented - */ -LOGICAL -FASTCALL -KeTryToAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, - OUT PKIRQL OldIrql) -{ - /* Simply raise to dispatch */ - *OldIrql = KfRaiseIrql(DISPATCH_LEVEL); - - /* Always return true on UP Machines */ - return TRUE; -} - -/* EOF */ diff --git a/reactos/hal/halarm/generic/halinit.c b/reactos/hal/halarm/generic/halinit.c new file mode 100644 index 00000000000..6f63dc9f938 --- /dev/null +++ b/reactos/hal/halarm/generic/halinit.c @@ -0,0 +1,182 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/halinit.c + * PURPOSE: HAL Entrypoint and Initialization + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +NTAPI +HalpGetParameters(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + PCHAR CommandLine; + + /* Make sure we have a loader block and command line */ + if ((LoaderBlock) && (LoaderBlock->LoadOptions)) + { + /* Read the command line */ + CommandLine = LoaderBlock->LoadOptions; + + /* Check for initial breakpoint */ + if (strstr(CommandLine, "BREAK")) DbgBreakPoint(); + } +} + +/* FUNCTIONS ******************************************************************/ + +/* + * @implemented + */ +BOOLEAN +NTAPI +HalInitSystem(IN ULONG BootPhase, + IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + PKPRCB Prcb = KeGetCurrentPrcb(); + + /* Check the boot phase */ + if (!BootPhase) + { + /* Get command-line parameters */ + HalpGetParameters(LoaderBlock); + + /* Checked HAL requires checked kernel */ +#if DBG + if (!(Prcb->BuildType & PRCB_BUILD_DEBUG)) + { + /* No match, bugcheck */ + KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 1, 0); + } +#else + /* Release build requires release HAL */ + if (Prcb->BuildType & PRCB_BUILD_DEBUG) + { + /* No match, bugcheck */ + KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0); + } +#endif + +#ifdef CONFIG_SMP + /* SMP HAL requires SMP kernel */ + if (Prcb->BuildType & PRCB_BUILD_UNIPROCESSOR) + { + /* No match, bugcheck */ + KeBugCheckEx(MISMATCHED_HAL, 2, Prcb->BuildType, 0, 0); + } +#endif + + /* Validate the PRCB */ + if (Prcb->MajorVersion != PRCB_MAJOR_VERSION) + { + /* Validation failed, bugcheck */ + KeBugCheckEx(MISMATCHED_HAL, 1, Prcb->MajorVersion, 1, 0); + } + + /* Initialize interrupts */ + HalpInitializeInterrupts(); + + /* Force initial PIC state */ + KfRaiseIrql(KeGetCurrentIrql()); + + /* Fill out the dispatch tables */ + //HalQuerySystemInformation = NULL; // FIXME: TODO; + //HalSetSystemInformation = NULL; // FIXME: TODO; + //HalInitPnpDriver = NULL; // FIXME: TODO + //HalGetDmaAdapter = NULL; // FIXME: TODO; + //HalGetInterruptTranslator = NULL; // FIXME: TODO + //HalResetDisplay = NULL; // FIXME: TODO; + //HalHaltSystem = NULL; // FIXME: TODO; + + /* Setup I/O space */ + //HalpDefaultIoSpace.Next = HalpAddressUsageList; + //HalpAddressUsageList = &HalpDefaultIoSpace; + + /* Setup busy waiting */ + //HalpCalibrateStallExecution(); + + /* Initialize the clock */ + HalpInitializeClock(); + + /* Setup time increments to 10ms and 1ms */ + HalpCurrentTimeIncrement = 100000; + HalpNextTimeIncrement = 100000; + HalpNextIntervalCount = 0; + KeSetTimeIncrement(100000, 10000); + + /* + * We could be rebooting with a pending profile interrupt, + * so clear it here before interrupts are enabled + */ + HalStopProfileInterrupt(ProfileTime); + + /* Do some HAL-specific initialization */ + HalpInitPhase0(LoaderBlock); + } + else if (BootPhase == 1) + { + /* Enable timer interrupt */ + HalpEnableInterruptHandler(IDT_DEVICE, + 0, + PRIMARY_VECTOR_BASE, + CLOCK2_LEVEL, + HalpClockInterrupt, + Latched); +#if 0 + /* Enable IRQ 8 */ + HalpEnableInterruptHandler(IDT_DEVICE, + 0, + PRIMARY_VECTOR_BASE + 8, + PROFILE_LEVEL, + HalpProfileInterrupt, + Latched); +#endif + /* Initialize DMA. NT does this in Phase 0 */ + //HalpInitDma(); + + /* Do some HAL-specific initialization */ + HalpInitPhase1(); + } + + /* All done, return */ + return TRUE; +} + +#include +ULONG +DbgPrintEarly(const char *fmt, ...) +{ + va_list args; + unsigned int i; + char Buffer[1024]; + PCHAR String = Buffer; + + va_start(args, fmt); + i = vsprintf(Buffer, fmt, args); + va_end(args); + + /* Output the message */ + while (*String != 0) + { + if (*String == '\n') + { + KdPortPutByteEx(NULL, '\r'); + } + KdPortPutByteEx(NULL, *String); + String++; + } + + return STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/misc.c b/reactos/hal/halarm/generic/misc.c new file mode 100644 index 00000000000..86fbe766206 --- /dev/null +++ b/reactos/hal/halarm/generic/misc.c @@ -0,0 +1,47 @@ +/* + * PROJECT: ReactOS Hardware Abstraction Layer (HAL) + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/misc.c + * PURPOSE: Misc functions to move + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS *******************************************************************/ + +/* FUNCTIONS ******************************************************************/ + +/* + * @implemented + */ +UCHAR +FASTCALL +HalSystemVectorDispatchEntry(IN ULONG Vector, + OUT PKINTERRUPT_ROUTINE **FlatDispatch, + OUT PKINTERRUPT_ROUTINE *NoConnection) +{ + /* Not implemented */ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +/* + * @implemented + */ +VOID +NTAPI +KeFlushWriteBuffer(VOID) +{ + /* Not implemented */ + UNIMPLEMENTED; + while (TRUE); + return; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/pic.c b/reactos/hal/halarm/generic/pic.c new file mode 100644 index 00000000000..5be8c3f3e9b --- /dev/null +++ b/reactos/hal/halarm/generic/pic.c @@ -0,0 +1,342 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/pic.c + * PURPOSE: HAL PIC Management and Control Code + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#undef KeGetCurrentIrql + +/* GLOBALS ********************************************************************/ + +ULONG HalpIrqlTable[HIGH_LEVEL + 1] = +{ + 0xFFFFFFFF, // IRQL 0 PASSIVE_LEVEL + 0xFFFFFFFD, // IRQL 1 APC_LEVEL + 0xFFFFFFF9, // IRQL 2 DISPATCH_LEVEL + 0xFFFFFFD9, // IRQL 3 + 0xFFFFFF99, // IRQL 4 + 0xFFFFFF19, // IRQL 5 + 0xFFFFFE19, // IRQL 6 + 0xFFFFFC19, // IRQL 7 + 0xFFFFF819, // IRQL 8 + 0xFFFFF019, // IRQL 9 + 0xFFFFE019, // IRQL 10 + 0xFFFFC019, // IRQL 11 + 0xFFFF8019, // IRQL 12 + 0xFFFF0019, // IRQL 13 + 0xFFFE0019, // IRQL 14 + 0xFFFC0019, // IRQL 15 + 0xFFF80019, // IRQL 16 + 0xFFF00019, // IRQL 17 + 0xFFE00019, // IRQL 18 + 0xFFC00019, // IRQL 19 + 0xFF800019, // IRQL 20 + 0xFF000019, // IRQL 21 + 0xFE000019, // IRQL 22 + 0xFC000019, // IRQL 23 + 0xF0000019, // IRQL 24 + 0x80000019, // IRQL 25 + 0x19, // IRQL 26 + 0x18, // IRQL 27 PROFILE_LEVEL + 0x10, // IRQL 28 CLOCK2_LEVEL + 0x00, // IRQL 29 IPI_LEVEL + 0x00, // IRQL 30 POWER_LEVEL + 0x00, // IRQL 31 HIGH_LEVEL +}; + +UCHAR HalpMaskTable[HIGH_LEVEL + 1] = +{ + PROFILE_LEVEL, // INT 0 WATCHDOG + APC_LEVEL, // INT 1 SOFTWARE INTERRUPT + DISPATCH_LEVEL,// INT 2 COMM RX + IPI_LEVEL, // INT 3 COMM TX + CLOCK2_LEVEL, // INT 4 TIMER 0 + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 26, + 26 +}; + +/* FUNCTIONS ******************************************************************/ + +VOID +HalpInitializeInterrupts(VOID) +{ + PKIPCR Pcr = (PKIPCR)KeGetPcr(); + + /* Fill out the IRQL mappings */ + RtlCopyMemory(Pcr->IrqlTable, HalpIrqlTable, sizeof(Pcr->IrqlTable)); + RtlCopyMemory(Pcr->IrqlMask, HalpMaskTable, sizeof(Pcr->IrqlMask)); +} + +/* IRQL MANAGEMENT ************************************************************/ + +/* + * @implemented + */ +ULONG +HalGetInterruptSource(VOID) +{ + ULONG InterruptStatus; + + /* Get the interrupt status, and return the highest bit set */ + InterruptStatus = READ_REGISTER_ULONG(VIC_INT_STATUS); + return 31 - _clz(InterruptStatus); +} + +/* + * @implemented + */ +KIRQL +NTAPI +KeGetCurrentIrql(VOID) +{ + /* Return the IRQL */ + return KeGetPcr()->Irql; +} + +/* + * @implemented + */ +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID) +{ + PKPCR Pcr = KeGetPcr(); + KIRQL CurrentIrql; + + /* Save and update IRQL */ + CurrentIrql = Pcr->Irql; + Pcr->Irql = DISPATCH_LEVEL; + +#ifdef IRQL_DEBUG + /* Validate correct raise */ + if (CurrentIrql > DISPATCH_LEVEL) KeBugCheck(IRQL_NOT_GREATER_OR_EQUAL); +#endif + + /* Return the previous value */ + return CurrentIrql; +} + +/* + * @implemented + */ +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID) +{ + PKPCR Pcr = KeGetPcr(); + KIRQL CurrentIrql; + + /* Save and update IRQL */ + CurrentIrql = Pcr->Irql; + Pcr->Irql = SYNCH_LEVEL; + +#ifdef IRQL_DEBUG + /* Validate correct raise */ + if (CurrentIrql > SYNCH_LEVEL) + { + /* Crash system */ + KeBugCheckEx(IRQL_NOT_GREATER_OR_EQUAL, + CurrentIrql, + SYNCH_LEVEL, + 0, + 1); + } +#endif + + /* Return the previous value */ + return CurrentIrql; +} + +/* + * @implemented + */ +KIRQL +FASTCALL +KfRaiseIrql(IN KIRQL NewIrql) +{ + ARM_STATUS_REGISTER Flags; + PKIPCR Pcr = (PKIPCR)KeGetPcr(); + KIRQL CurrentIrql; + ULONG InterruptMask; + + /* Disable interrupts */ + Flags = KeArmStatusRegisterGet(); + _disable(); + + /* Read current IRQL */ + CurrentIrql = Pcr->Irql; + +#ifdef IRQL_DEBUG + /* Validate correct raise */ + if (CurrentIrql > NewIrql) + { + /* Crash system */ + Pcr->Irql = PASSIVE_LEVEL; + KeBugCheck(IRQL_NOT_GREATER_OR_EQUAL); + } +#endif + /* Clear interrupts associated to the old IRQL */ + WRITE_REGISTER_ULONG(VIC_INT_CLEAR, 0xFFFFFFFF); + + /* Set the new interrupt mask */ + InterruptMask = Pcr->IrqlTable[NewIrql]; + WRITE_REGISTER_ULONG(VIC_INT_ENABLE, InterruptMask); + + /* Set new IRQL */ + Pcr->Irql = NewIrql; + + /* Restore interrupt state */ + if (!Flags.IrqDisable) _enable(); + + /* Return old IRQL */ + return CurrentIrql; +} + +/* + * @implemented + */ +VOID +FASTCALL +KfLowerIrql(IN KIRQL NewIrql) +{ + ARM_STATUS_REGISTER Flags; + PKIPCR Pcr = (PKIPCR)KeGetPcr(); + ULONG InterruptMask; + + /* Disableinterrupts */ + Flags = KeArmStatusRegisterGet(); + _disable(); + +#ifdef IRQL_DEBUG + /* Validate correct lower */ + if (OldIrql > Pcr->Irql) + { + /* Crash system */ + Pcr->Irql = HIGH_LEVEL; + KeBugCheck(IRQL_NOT_LESS_OR_EQUAL); + } +#endif + + /* Clear interrupts associated to the old IRQL */ + WRITE_REGISTER_ULONG(VIC_INT_CLEAR, 0xFFFFFFFF); + + /* Set the new interrupt mask */ + InterruptMask = Pcr->IrqlTable[NewIrql]; + WRITE_REGISTER_ULONG(VIC_INT_ENABLE, InterruptMask); + + /* Save the new IRQL and restore interrupt state */ + Pcr->Irql = NewIrql; + if (!Flags.IrqDisable) _enable(); +} + +/* SOFTWARE INTERRUPTS ********************************************************/ + +/* + * @implemented + */ +VOID +FASTCALL +HalRequestSoftwareInterrupt(IN KIRQL Irql) +{ + /* Force a software interrupt */ + WRITE_REGISTER_ULONG(VIC_SOFT_INT, 1 << Irql); +} + +/* + * @implemented + */ +VOID +FASTCALL +HalClearSoftwareInterrupt(IN KIRQL Irql) +{ + /* Clear software interrupt */ + WRITE_REGISTER_ULONG(VIC_SOFT_INT_CLEAR, 1 << Irql); +} + +/* SYSTEM INTERRUPTS **********************************************************/ + +/* + * @implemented + */ +BOOLEAN +NTAPI +HalEnableSystemInterrupt(IN UCHAR Vector, + IN KIRQL Irql, + IN KINTERRUPT_MODE InterruptMode) +{ + UNIMPLEMENTED; + while (TRUE); + return FALSE; +} + +/* + * @implemented + */ +VOID +NTAPI +HalDisableSystemInterrupt(IN UCHAR Vector, + IN KIRQL Irql) +{ + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @implemented + */ +BOOLEAN +NTAPI +HalBeginSystemInterrupt(IN KIRQL Irql, + IN UCHAR Vector, + OUT PKIRQL OldIrql) +{ + UNIMPLEMENTED; + while (TRUE); + return FALSE; +} + +/* + * @implemented + */ +VOID +NTAPI +HalEndSystemInterrupt(IN KIRQL OldIrql, + IN PKTRAP_FRAME TrapFrame) +{ + UNIMPLEMENTED; + while (TRUE); +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/portio.c b/reactos/hal/halarm/generic/portio.c new file mode 100644 index 00000000000..91786b4bb2a --- /dev/null +++ b/reactos/hal/halarm/generic/portio.c @@ -0,0 +1,129 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/portio.c + * PURPOSE: I/O Functions for access to ports + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#undef READ_PORT_UCHAR +#undef READ_PORT_USHORT +#undef READ_PORT_ULONG +#undef WRITE_PORT_UCHAR +#undef WRITE_PORT_USHORT +#undef WRITE_PORT_ULONG + +/* FUNCTIONS ******************************************************************/ + +VOID +NTAPI +READ_PORT_BUFFER_UCHAR(IN PUCHAR Port, + OUT PUCHAR Buffer, + IN ULONG Count) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +READ_PORT_BUFFER_USHORT(IN PUSHORT Port, + OUT PUSHORT Buffer, + IN ULONG Count) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +READ_PORT_BUFFER_ULONG(IN PULONG Port, + OUT PULONG Buffer, + IN ULONG Count) +{ + UNIMPLEMENTED; + while (TRUE); +} + +UCHAR +NTAPI +READ_PORT_UCHAR(IN PUCHAR Port) +{ + return READ_REGISTER_UCHAR(Port); +} + +USHORT +NTAPI +READ_PORT_USHORT(IN PUSHORT Port) +{ + return READ_REGISTER_USHORT(Port); +} + +ULONG +NTAPI +READ_PORT_ULONG(IN PULONG Port) +{ + return READ_REGISTER_ULONG(Port); +} + +VOID +NTAPI +WRITE_PORT_BUFFER_UCHAR(IN PUCHAR Port, + IN PUCHAR Buffer, + IN ULONG Count) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +WRITE_PORT_BUFFER_USHORT(IN PUSHORT Port, + IN PUSHORT Buffer, + IN ULONG Count) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +WRITE_PORT_BUFFER_ULONG(IN PULONG Port, + IN PULONG Buffer, + IN ULONG Count) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +WRITE_PORT_UCHAR(IN PUCHAR Port, + IN UCHAR Value) +{ + WRITE_REGISTER_UCHAR(Port, Value); +} + +VOID +NTAPI +WRITE_PORT_USHORT(IN PUSHORT Port, + IN USHORT Value) +{ + WRITE_REGISTER_USHORT(Port, Value); +} + +VOID +NTAPI +WRITE_PORT_ULONG(IN PULONG Port, + IN ULONG Value) +{ + WRITE_REGISTER_ULONG(Port, Value); +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/processor.c b/reactos/hal/halarm/generic/processor.c new file mode 100644 index 00000000000..b52ef5cfff4 --- /dev/null +++ b/reactos/hal/halarm/generic/processor.c @@ -0,0 +1,141 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/processor.c + * PURPOSE: HAL Processor Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + +LONG HalpActiveProcessors; +KAFFINITY HalpDefaultInterruptAffinity; +BOOLEAN HalpProcessorIdentified; +BOOLEAN HalpTestCleanSupported; + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +HalpIdentifyProcessor(VOID) +{ + ARM_ID_CODE_REGISTER IdRegister; + + /* Don't do it again */ + HalpProcessorIdentified = TRUE; + + // fixfix: Use Pcr->ProcessorId + + /* Read the ID Code */ + IdRegister = KeArmIdCodeRegisterGet(); + + /* Architecture "6" CPUs support test-and-clean (926EJ-S and 1026EJ-S) */ + HalpTestCleanSupported = (IdRegister.Architecture == 6); +} + +/* FUNCTIONS ******************************************************************/ + +/* + * @implemented + */ +VOID +NTAPI +HalInitializeProcessor(IN ULONG ProcessorNumber, + IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + /* Do nothing */ + return; +} + +/* + * @implemented + */ +BOOLEAN +NTAPI +HalAllProcessorsStarted(VOID) +{ + /* Do nothing */ + return TRUE; +} + +/* + * @implemented + */ +BOOLEAN +NTAPI +HalStartNextProcessor(IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PKPROCESSOR_STATE ProcessorState) +{ + /* Ready to start */ + return FALSE; +} + +/* + * @implemented + */ +VOID +NTAPI +HalProcessorIdle(VOID) +{ + /* Enable interrupts and halt the processor */ + _enable(); + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @implemented + */ +VOID +NTAPI +HalRequestIpi(KAFFINITY TargetProcessors) +{ + /* Not implemented on UP */ + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @implemented + */ +VOID +HalSweepDcache(VOID) +{ + /* + * We get called very early on, before HalInitSystem or any of the Hal* + * processor routines, so we need to figure out what CPU we're on. + */ + if (!HalpProcessorIdentified) HalpIdentifyProcessor(); + + /* + * Check if we can do it the ARMv5TE-J way + */ + if (HalpTestCleanSupported) + { + /* Test, clean, flush D-Cache */ + __asm__ __volatile__ ("1: mrc p15, 0, pc, c7, c14, 3; bne 1b"); + } + else + { + /* We need to do it it by set/way. For now always call ARMv7 function */ + //extern VOID v7_flush_dcache_all(VOID); + //v7_flush_dcache_all(); + } +} + +/* + * @implemented + */ +VOID +HalSweepIcache(VOID) +{ + /* All ARM cores support the same Icache flush command */ + KeArmFlushIcache(); +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/profil.c b/reactos/hal/halarm/generic/profil.c new file mode 100644 index 00000000000..44f9e6fd287 --- /dev/null +++ b/reactos/hal/halarm/generic/profil.c @@ -0,0 +1,50 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/profil.c + * PURPOSE: System Profiling + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS ******************************************************************/ + +/* + * @unimplemented + */ +VOID +NTAPI +HalStopProfileInterrupt(IN KPROFILE_SOURCE ProfileSource) +{ + UNIMPLEMENTED; + return; +} + +/* + * @unimplemented + */ +VOID +NTAPI +HalStartProfileInterrupt(IN KPROFILE_SOURCE ProfileSource) +{ + UNIMPLEMENTED; + return; +} + +/* + * @unimplemented + */ +ULONG_PTR +NTAPI +HalSetProfileInterval(IN ULONG_PTR Interval) +{ + UNIMPLEMENTED; + return Interval; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/reboot.c b/reactos/hal/halarm/generic/reboot.c new file mode 100644 index 00000000000..51de4862bc8 --- /dev/null +++ b/reactos/hal/halarm/generic/reboot.c @@ -0,0 +1,43 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/reboot.c + * PURPOSE: Reboot Function + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +/* PUBLIC FUNCTIONS **********************************************************/ + +/* + * @implemented + */ +VOID +NTAPI +HalReturnToFirmware(IN FIRMWARE_REENTRY Action) +{ + /* Check what kind of action this is */ + switch (Action) + { + /* All recognized actions */ + case HalHaltRoutine: + case HalRebootRoutine: + + /* Acquire the display */ + InbvAcquireDisplayOwnership(); + + /* Anything else */ + default: + + /* Print message and break */ + DbgPrint("HalReturnToFirmware called!\n"); + DbgBreakPoint(); + } +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/rtc.c b/reactos/hal/halarm/generic/rtc.c new file mode 100644 index 00000000000..e2fe11e9a4a --- /dev/null +++ b/reactos/hal/halarm/generic/rtc.c @@ -0,0 +1,79 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/rtc.c + * PURPOSE: Real Time Clock and Environment Variable Support + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS ******************************************************************/ + +#define RTC_DATA (PVOID)0x101E8000 + +/* + * @implemented + */ +BOOLEAN +NTAPI +HalQueryRealTimeClock(IN PTIME_FIELDS Time) +{ + LARGE_INTEGER LargeTime; + ULONG Seconds; + + /* Query the RTC value */ + Seconds = READ_REGISTER_ULONG(RTC_DATA); + + /* Convert to time */ + RtlSecondsSince1970ToTime(Seconds, &LargeTime); + + /* Convert to time-fields */ + RtlTimeToTimeFields(&LargeTime, Time); + return TRUE; +} + +/* + * @unimplemented + */ +BOOLEAN +NTAPI +HalSetRealTimeClock(IN PTIME_FIELDS Time) +{ + UNIMPLEMENTED; + while (TRUE); + return TRUE; +} + +/* + * @unimplemented + */ +ARC_STATUS +NTAPI +HalSetEnvironmentVariable(IN PCH Name, + IN PCH Value) +{ + UNIMPLEMENTED; + while (TRUE); + return ESUCCESS; +} + +/* + * @unimplemented + */ +ARC_STATUS +NTAPI +HalGetEnvironmentVariable(IN PCH Name, + IN USHORT ValueLength, + IN PCH Value) +{ + UNIMPLEMENTED; + while (TRUE); + return ENOENT; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/spinlock.c b/reactos/hal/halarm/generic/spinlock.c new file mode 100644 index 00000000000..ff53749329e --- /dev/null +++ b/reactos/hal/halarm/generic/spinlock.c @@ -0,0 +1,202 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/spinlock.c + * PURPOSE: SpinLock Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +#undef KeAcquireSpinLock +#undef KeReleaseSpinLock +#undef KeRaiseIrql +#undef KeLowerIrql + +/* FUNCTIONS *****************************************************************/ + +/* + * @implemented + */ +VOID +NTAPI +KeRaiseIrql(KIRQL NewIrql, + PKIRQL OldIrql) +{ + /* Call the fastcall function */ + *OldIrql = KfRaiseIrql(NewIrql); +} + +/* + * @implemented + */ +VOID +NTAPI +KeLowerIrql(KIRQL NewIrql) +{ + /* Call the fastcall function */ + KfLowerIrql(NewIrql); +} + +/* + * @implemented + */ +VOID +NTAPI +KeAcquireSpinLock(PKSPIN_LOCK SpinLock, + PKIRQL OldIrql) +{ + /* Call the fastcall function */ + *OldIrql = KfAcquireSpinLock(SpinLock); +} + +/* + * @implemented + */ +KIRQL +FASTCALL +KeAcquireSpinLockRaiseToSynch(PKSPIN_LOCK SpinLock) +{ + /* Simply raise to dispatch */ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +VOID +NTAPI +KeReleaseSpinLock(PKSPIN_LOCK SpinLock, + KIRQL NewIrql) +{ + /* Call the fastcall function */ + KfReleaseSpinLock(SpinLock, NewIrql); +} + +/* + * @implemented + */ +KIRQL +FASTCALL +KfAcquireSpinLock(PKSPIN_LOCK SpinLock) +{ + /* Simply raise to dispatch */ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +VOID +FASTCALL +KfReleaseSpinLock(PKSPIN_LOCK SpinLock, + KIRQL OldIrql) +{ + /* Simply lower IRQL back */ + KeLowerIrql(OldIrql); +} + +/* + * @implemented + */ +KIRQL +FASTCALL +KeAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber) +{ + /* Simply raise to dispatch */ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +KIRQL +FASTCALL +KeAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber) +{ + /* Simply raise to dispatch */ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +VOID +FASTCALL +KeAcquireInStackQueuedSpinLock(IN PKSPIN_LOCK SpinLock, + IN PKLOCK_QUEUE_HANDLE LockHandle) +{ + /* Simply raise to dispatch */ + LockHandle->OldIrql = KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +VOID +FASTCALL +KeAcquireInStackQueuedSpinLockRaiseToSynch(IN PKSPIN_LOCK SpinLock, + IN PKLOCK_QUEUE_HANDLE LockHandle) +{ + /* Simply raise to dispatch */ + LockHandle->OldIrql = KfRaiseIrql(DISPATCH_LEVEL); +} + +/* + * @implemented + */ +VOID +FASTCALL +KeReleaseQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, + IN KIRQL OldIrql) +{ + /* Simply lower IRQL back */ + KfLowerIrql(OldIrql); +} + +/* + * @implemented + */ +VOID +FASTCALL +KeReleaseInStackQueuedSpinLock(IN PKLOCK_QUEUE_HANDLE LockHandle) +{ + /* Simply lower IRQL back */ + KfLowerIrql(LockHandle->OldIrql); +} + +/* + * @implemented + */ +BOOLEAN +FASTCALL +KeTryToAcquireQueuedSpinLockRaiseToSynch(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, + IN PKIRQL OldIrql) +{ + /* Simply raise to synch */ + KeRaiseIrql(SYNCH_LEVEL, OldIrql); + + /* Always return true on UP Machines */ + return TRUE; +} + +/* + * @implemented + */ +LOGICAL +FASTCALL +KeTryToAcquireQueuedSpinLock(IN KSPIN_LOCK_QUEUE_NUMBER LockNumber, + OUT PKIRQL OldIrql) +{ + /* Simply raise to dispatch */ + KeRaiseIrql(DISPATCH_LEVEL, OldIrql); + + /* Always return true on UP Machines */ + return TRUE; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/sysinfo.c b/reactos/hal/halarm/generic/sysinfo.c new file mode 100644 index 00000000000..f48ae962bf5 --- /dev/null +++ b/reactos/hal/halarm/generic/sysinfo.c @@ -0,0 +1,40 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/spinlock.c + * PURPOSE: HAL Information Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* FUNCTIONS ******************************************************************/ + +NTSTATUS +NTAPI +HaliQuerySystemInformation(IN HAL_QUERY_INFORMATION_CLASS InformationClass, + IN ULONG BufferSize, + IN OUT PVOID Buffer, + OUT PULONG ReturnedLength) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_NOT_IMPLEMENTED; +} + +NTSTATUS +NTAPI +HaliSetSystemInformation(IN HAL_SET_INFORMATION_CLASS InformationClass, + IN ULONG BufferSize, + IN OUT PVOID Buffer) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_NOT_IMPLEMENTED; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/timer.c b/reactos/hal/halarm/generic/timer.c new file mode 100644 index 00000000000..9ed2a2a4d01 --- /dev/null +++ b/reactos/hal/halarm/generic/timer.c @@ -0,0 +1,149 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/timer.c + * PURPOSE: Timer Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +VOID +FASTCALL +KeUpdateSystemTime( + IN PKTRAP_FRAME TrapFrame, + IN ULONG Increment, + IN KIRQL OldIrql +); + +/* GLOBALS ********************************************************************/ + +ULONG HalpCurrentTimeIncrement, HalpNextTimeIncrement, HalpNextIntervalCount; + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +HalpClockInterrupt(VOID) +{ + /* Clear the interrupt */ + ASSERT(KeGetCurrentIrql() == CLOCK2_LEVEL); + WRITE_REGISTER_ULONG(TIMER0_INT_CLEAR, 1); + + /* FIXME: Update HAL Perf counters */ + + /* FIXME: Check if someone changed the clockrate */ + + /* Call the kernel */ + KeUpdateSystemTime(KeGetCurrentThread()->TrapFrame, + HalpCurrentTimeIncrement, + CLOCK2_LEVEL); +} + +VOID +HalpStallInterrupt(VOID) +{ + /* Clear the interrupt */ + WRITE_REGISTER_ULONG(TIMER0_INT_CLEAR, 1); +} + +VOID +HalpInitializeClock(VOID) +{ + PKIPCR Pcr = (PKIPCR)KeGetPcr(); + ULONG ClockInterval; + SP804_CONTROL_REGISTER ControlRegister; + + /* Setup the clock and profile interrupt */ + Pcr->InterruptRoutine[CLOCK2_LEVEL] = HalpStallInterrupt; + + /* + * Configure the interval to 10ms + * (INTERVAL (10ms) * TIMCLKfreq (1MHz)) + * --------------------------------------- == 10^4 + * (TIMCLKENXdiv (1) * PRESCALEdiv (1)) + */ + ClockInterval = 0x2710; + + /* Configure the timer */ + ControlRegister.AsUlong = 0; + ControlRegister.Wide = TRUE; + ControlRegister.Periodic = TRUE; + ControlRegister.Interrupt = TRUE; + ControlRegister.Enabled = TRUE; + + /* Enable the timer */ + WRITE_REGISTER_ULONG(TIMER0_LOAD, ClockInterval); + WRITE_REGISTER_ULONG(TIMER0_CONTROL, ControlRegister.AsUlong); +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @implemented + */ +VOID +NTAPI +HalCalibratePerformanceCounter(IN volatile PLONG Count, + IN ULONGLONG NewCount) +{ + UNIMPLEMENTED; + while (TRUE); +} + +/* + * @implemented + */ +ULONG +NTAPI +HalSetTimeIncrement(IN ULONG Increment) +{ + UNIMPLEMENTED; + while (TRUE); + return Increment; +} + +/* + * @implemented + */ +VOID +NTAPI +KeStallExecutionProcessor(IN ULONG Microseconds) +{ + SP804_CONTROL_REGISTER ControlRegister; + + /* Enable the timer */ + WRITE_REGISTER_ULONG(TIMER1_LOAD, Microseconds); + + /* Configure the timer */ + ControlRegister.AsUlong = 0; + ControlRegister.OneShot = TRUE; + ControlRegister.Wide = TRUE; + ControlRegister.Periodic = TRUE; + ControlRegister.Enabled = TRUE; + WRITE_REGISTER_ULONG(TIMER1_CONTROL, ControlRegister.AsUlong); + + /* Now we will loop until the timer reached 0 */ + while (READ_REGISTER_ULONG(TIMER1_VALUE)); +} + +/* + * @implemented + */ +LARGE_INTEGER +NTAPI +KeQueryPerformanceCounter(IN PLARGE_INTEGER PerformanceFreq) +{ + LARGE_INTEGER Value; + + UNIMPLEMENTED; + while (TRUE); + + Value.QuadPart = 0; + return Value; +} + +/* EOF */ diff --git a/reactos/hal/halarm/generic/usage.c b/reactos/hal/halarm/generic/usage.c new file mode 100644 index 00000000000..248f383dedb --- /dev/null +++ b/reactos/hal/halarm/generic/usage.c @@ -0,0 +1,76 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/generic/usage.c + * PURPOSE: Resource Usage Management Routines + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + +PUCHAR KdComPortInUse; + +IDTUsageFlags HalpIDTUsageFlags[256]; +IDTUsage HalpIDTUsage[256]; + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +NTAPI +HalpReportResourceUsage(IN PUNICODE_STRING HalName, + IN INTERFACE_TYPE InterfaceType) +{ + DbgPrint("%wZ has been initialized\n", HalName); +} + +VOID +NTAPI +HalpRegisterVector(IN UCHAR Flags, + IN ULONG BusVector, + IN ULONG SystemVector, + IN KIRQL Irql) +{ + /* Save the vector flags */ + HalpIDTUsageFlags[SystemVector].Flags = Flags; + + /* Save the vector data */ + HalpIDTUsage[SystemVector].Irql = Irql; + HalpIDTUsage[SystemVector].BusReleativeVector = BusVector; +} + +VOID +NTAPI +HalpEnableInterruptHandler(IN UCHAR Flags, + IN ULONG BusVector, + IN ULONG SystemVector, + IN KIRQL Irql, + IN PVOID Handler, + IN KINTERRUPT_MODE Mode) +{ + /* Register the routine */ + ((PKIPCR)KeGetPcr())->InterruptRoutine[Irql] = Handler; +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @unimplemented + */ +VOID +NTAPI +HalReportResourceUsage(VOID) +{ + UNICODE_STRING HalString; + + /* Build HAL usage */ + RtlInitUnicodeString(&HalString, L"ARM Versatile HAL"); + HalpReportResourceUsage(&HalString, Internal); +} + +/* EOF */ diff --git a/reactos/hal/halarm/hal.rbuild b/reactos/hal/halarm/hal.rbuild new file mode 100644 index 00000000000..2a6086a5894 --- /dev/null +++ b/reactos/hal/halarm/hal.rbuild @@ -0,0 +1,18 @@ + + + + + + + include + include + + hal_generic + ntoskrnl + + + halinit_up.c + halup.rc + + + diff --git a/reactos/hal/halarm/hal_generic.rbuild b/reactos/hal/halarm/hal_generic.rbuild new file mode 100644 index 00000000000..b8619077e38 --- /dev/null +++ b/reactos/hal/halarm/hal_generic.rbuild @@ -0,0 +1,33 @@ + + + + + include + include + + + beep.c + bus.c + cache.S + dma.c + drive.c + display.c + fmutex.c + halinit.c + misc.c + pic.c + portio.c + processor.c + profil.c + reboot.c + rtc.c + spinlock.c + sysinfo.c + timer.c + usage.c + + + hal.h + + + diff --git a/reactos/hal/halarm/include/hal.h b/reactos/hal/halarm/include/hal.h index f2c8c2ea808..e6ae706ce01 100644 --- a/reactos/hal/halarm/include/hal.h +++ b/reactos/hal/halarm/include/hal.h @@ -9,6 +9,7 @@ /* INCLUDES ******************************************************************/ /* C Headers */ +#define DbgPrint DbgPrintEarly #include /* WDK HAL Compilation hack */ @@ -22,6 +23,7 @@ /* IFS/DDK/NDK Headers */ #include +#include #include #include #include @@ -29,6 +31,7 @@ #include #include #include +#include #include #include #include diff --git a/reactos/hal/halarm/include/halp.h b/reactos/hal/halarm/include/halp.h index 98507b45aad..8a14dd36226 100644 --- a/reactos/hal/halarm/include/halp.h +++ b/reactos/hal/halarm/include/halp.h @@ -1,5 +1,4 @@ -#ifndef __INTERNAL_HAL_HAL_H -#define __INTERNAL_HAL_HAL_H +#pragma once // // ARM Headers @@ -14,4 +13,47 @@ #include #include -#endif /* __INTERNAL_HAL_HAL_H */ +#define PRIMARY_VECTOR_BASE 0x00 + +/* Usage flags */ +#define IDT_REGISTERED 0x01 +#define IDT_LATCHED 0x02 +#define IDT_INTERNAL 0x11 +#define IDT_DEVICE 0x21 + +typedef struct _IDTUsageFlags +{ + UCHAR Flags; +} IDTUsageFlags; + +typedef struct +{ + KIRQL Irql; + UCHAR BusReleativeVector; +} IDTUsage; + +VOID +NTAPI +HalpRegisterVector(IN UCHAR Flags, + IN ULONG BusVector, + IN ULONG SystemVector, + IN KIRQL Irql); + +VOID +NTAPI +HalpEnableInterruptHandler(IN UCHAR Flags, + IN ULONG BusVector, + IN ULONG SystemVector, + IN KIRQL Irql, + IN PVOID Handler, + IN KINTERRUPT_MODE Mode); + +VOID HalpInitPhase0 (PLOADER_PARAMETER_BLOCK LoaderBlock); +VOID HalpInitPhase1(VOID); + +VOID HalpInitializeInterrupts(VOID); +VOID HalpInitializeClock(VOID); +VOID HalpClockInterrupt(VOID); +VOID HalpProfileInterrupt(VOID); + +extern ULONG HalpCurrentTimeIncrement, HalpNextTimeIncrement, HalpNextIntervalCount; diff --git a/reactos/hal/halarm/up/halinit_up.c b/reactos/hal/halarm/up/halinit_up.c deleted file mode 100644 index cbb18bc665e..00000000000 --- a/reactos/hal/halarm/up/halinit_up.c +++ /dev/null @@ -1,32 +0,0 @@ -/* $Id: halinit_up.c 24964 2006-11-29 08:28:20Z ion $ - * - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/hal/x86/halinit.c - * PURPOSE: Initalize the x86 hal - * PROGRAMMER: David Welch (welch@cwcom.net) - * UPDATE HISTORY: - * 11/06/98: Created - */ - -/* INCLUDES *****************************************************************/ - -#include -#define NDEBUG -#include - -/* FUNCTIONS ***************************************************************/ - -VOID -HalpInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock) -{ - -} - -VOID -HalpInitPhase1(VOID) -{ - -} - -/* EOF */ diff --git a/reactos/hal/halarm/versa/halinit_up.c b/reactos/hal/halarm/versa/halinit_up.c new file mode 100644 index 00000000000..0b9693914a9 --- /dev/null +++ b/reactos/hal/halarm/versa/halinit_up.c @@ -0,0 +1,31 @@ +/* + * PROJECT: ReactOS HAL + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: hal/halarm/versa/halinit_up.c + * PURPOSE: Versatile Board-Specific HAL Initialization + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +HalpInitPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + +} + +VOID +HalpInitPhase1(VOID) +{ + +} + +/* EOF */ diff --git a/reactos/hal/halarm/up/halup.rbuild b/reactos/hal/halarm/versa/halup.rbuild similarity index 59% rename from reactos/hal/halarm/up/halup.rbuild rename to reactos/hal/halarm/versa/halup.rbuild index b44390569d0..ac59afe19ec 100644 --- a/reactos/hal/halarm/up/halup.rbuild +++ b/reactos/hal/halarm/versa/halup.rbuild @@ -1,13 +1,16 @@ - + - ../include + include include - halarm_generic + hal_generic ntoskrnl - halinit_up.c - halup.rc + kdcom + + halinit_up.c + halup.rc + diff --git a/reactos/hal/halarm/up/halup.rc b/reactos/hal/halarm/versa/halup.rc similarity index 100% rename from reactos/hal/halarm/up/halup.rc rename to reactos/hal/halarm/versa/halup.rc diff --git a/reactos/hal/halppc/generic/fmutex.c b/reactos/hal/halppc/generic/fmutex.c index 8ec41f4ce11..134ca7a464a 100644 --- a/reactos/hal/halppc/generic/fmutex.c +++ b/reactos/hal/halppc/generic/fmutex.c @@ -39,7 +39,7 @@ ExAcquireFastMutex(PFAST_MUTEX FastMutex) { /* Someone is still holding it, use slow path */ FastMutex->Contention++; - KeWaitForSingleObject(&FastMutex->Gate, + KeWaitForSingleObject(&FastMutex->Event, WrExecutive, KernelMode, FALSE, @@ -65,7 +65,7 @@ ExReleaseFastMutex(PFAST_MUTEX FastMutex) if (InterlockedIncrement(&FastMutex->Count) <= 0) { /* Someone was waiting for it, signal the waiter */ - KeSetEventBoostPriority(&FastMutex->Gate, IO_NO_INCREMENT); + KeSetEventBoostPriority(&FastMutex->Event, IO_NO_INCREMENT); } /* Lower IRQL back */ diff --git a/reactos/hal/halppc/include/apic.h b/reactos/hal/halppc/include/apic.h index 92497b82251..ee0089bf6fc 100644 --- a/reactos/hal/halppc/include/apic.h +++ b/reactos/hal/halppc/include/apic.h @@ -2,8 +2,7 @@ * */ -#ifndef __INTERNAL_HAL_APIC_H -#define __INTERNAL_HAL_APIC_H +#pragma once #define APIC_DEFAULT_BASE 0xFEE00000 /* Default Local APIC Base Register Address */ @@ -206,9 +205,4 @@ static __inline ULONG ThisCPU(VOID) return (APICRead(APIC_ID) & APIC_ID_MASK) >> 24; } - -#endif - - /* EOF */ - diff --git a/reactos/hal/halppc/include/bus.h b/reactos/hal/halppc/include/bus.h index 2c82d3ed61d..e13c5ac6879 100644 --- a/reactos/hal/halppc/include/bus.h +++ b/reactos/hal/halppc/include/bus.h @@ -1,5 +1,4 @@ -#ifndef __INTERNAL_HAL_BUS_H -#define __INTERNAL_HAL_BUS_H +#pragma once // // Helper Macros @@ -289,8 +288,4 @@ extern BOOLEAN HalpPCIConfigInitialized; extern BUS_HANDLER HalpFakePciBusHandler; extern ULONG HalpMinPciBus, HalpMaxPciBus; -#endif /* __INTERNAL_HAL_BUS_H */ - /* EOF */ - - diff --git a/reactos/hal/halppc/include/haldma.h b/reactos/hal/halppc/include/haldma.h index 1770770e135..2da2c1f523a 100644 --- a/reactos/hal/halppc/include/haldma.h +++ b/reactos/hal/halppc/include/haldma.h @@ -1,5 +1,4 @@ -#ifndef HALDMA_H -#define HALDMA_H +#pragma once /* * DMA Page Register Structure @@ -379,5 +378,3 @@ HalpGetDmaAdapter( ULONG NTAPI HalpDmaGetDmaAlignment( PADAPTER_OBJECT AdapterObject); - -#endif /* HALDMA_H */ diff --git a/reactos/hal/halppc/include/halirq.h b/reactos/hal/halppc/include/halirq.h index 5421415db38..c3cc625dca4 100644 --- a/reactos/hal/halppc/include/halirq.h +++ b/reactos/hal/halppc/include/halirq.h @@ -2,8 +2,7 @@ * $Id: halirq.h 23669 2006-08-23 16:58:43Z ion $ */ -#ifndef __INCLUDE_HAL_HALIRQ -#define __INCLUDE_HAL_HALIRQ +#pragma once #ifdef CONFIG_SMP @@ -31,5 +30,3 @@ #define IRQ2VECTOR(irq) ((irq) + IRQ_BASE) #endif - -#endif /* __INCLUDE_HAL_HALIRQ */ diff --git a/reactos/hal/halppc/include/halp.h b/reactos/hal/halppc/include/halp.h index e88eec6f214..0b21d7053bf 100644 --- a/reactos/hal/halppc/include/halp.h +++ b/reactos/hal/halppc/include/halp.h @@ -2,8 +2,7 @@ * */ -#ifndef __INTERNAL_HAL_HAL_H -#define __INTERNAL_HAL_HAL_H +#pragma once /* Temporary hack */ #define KPCR_BASE 0xFF000000 @@ -125,5 +124,3 @@ typedef struct tagHALP_HOOKS extern HALP_HOOKS HalpHooks; extern KSPIN_LOCK HalpSystemHardwareLock; - -#endif /* __INTERNAL_HAL_HAL_H */ diff --git a/reactos/hal/halppc/include/ioapic.h b/reactos/hal/halppc/include/ioapic.h index bcdd7fe8ec1..7f4ab434df5 100644 --- a/reactos/hal/halppc/include/ioapic.h +++ b/reactos/hal/halppc/include/ioapic.h @@ -2,8 +2,7 @@ * */ -#ifndef __INTERNAL_HAL_IOAPIC_H -#define __INTERNAL_HAL_IOAPIC_H +#pragma once /* I/O APIC Register Address Map */ #define IOAPIC_IOREGSEL 0x0000 /* I/O Register Select (index) (R/W) */ @@ -95,9 +94,4 @@ VOID HaliReconfigurePciInterrupts(VOID); /* For debugging */ VOID IOAPICDump(VOID); -#endif - - - /* EOF */ - diff --git a/reactos/hal/halppc/include/mps.h b/reactos/hal/halppc/include/mps.h index 83f9cfbe501..ba766958280 100644 --- a/reactos/hal/halppc/include/mps.h +++ b/reactos/hal/halppc/include/mps.h @@ -1,5 +1,4 @@ -#ifndef __INCLUDE_HAL_MPS -#define __INCLUDE_HAL_MPS +#pragma once /* * FIXME: This does not work if we have more than 24 IRQs (ie. more than one @@ -198,7 +197,4 @@ typedef struct _MP_CONFIGURATION_INTLOCAL VOID HalpInitMPS(VOID); - -#endif /* __INCLUDE_HAL_MPS */ - /* EOF */ diff --git a/reactos/hal/halx86/directory.rbuild b/reactos/hal/halx86/directory.rbuild index e10afdc1dc9..81a989facea 100644 --- a/reactos/hal/halx86/directory.rbuild +++ b/reactos/hal/halx86/directory.rbuild @@ -1,5 +1,5 @@ - + diff --git a/reactos/hal/halx86/generic/bios.c b/reactos/hal/halx86/generic/bios.c index 206ca2d3e3d..5bffb2d9389 100644 --- a/reactos/hal/halx86/generic/bios.c +++ b/reactos/hal/halx86/generic/bios.c @@ -12,6 +12,9 @@ #include #define NDEBUG #include +#include + +void HalpTrap0D(); /* GLOBALS ********************************************************************/ @@ -47,24 +50,9 @@ ULONG_PTR HalpSavedEsp; /* Where the real mode code ends */ extern PVOID HalpRealModeEnd; -/* REAL MODE CODE AND STACK START HERE ****************************************/ +/* Context saved for return from v86 mode */ +jmp_buf HalpSavedContext; -VOID -DECLSPEC_NORETURN -HalpRealModeStart(VOID) -{ - /* Do the video BIOS interrupt */ - HalpCallBiosInterrupt(VIDEO_SERVICES, (SET_VIDEO_MODE << 8) | (GRAPHICS_MODE_12)); - - /* Issue the BOP */ - KiIssueBop(); - - /* We want the stack to be inside this function so we can map real mode */ - HalpRealModeStack(sizeof(ULONG), PAGE_SIZE / 2); - UNREACHABLE; -} - -/* REAL MODE CODE AND STACK END HERE ******************************************/ /* V86 OPCODE HANDLERS ********************************************************/ @@ -208,6 +196,7 @@ HalpDispatchV86Opcode(IN PKTRAP_FRAME TrapFrame) /* V86 TRAP HANDLERS **********************************************************/ +#ifndef _MINIHAL_ VOID FASTCALL DECLSPEC_NORETURN @@ -230,60 +219,45 @@ HalpTrap0DHandler(IN PKTRAP_FRAME TrapFrame) while (TRUE); } -KiTrap(HalpTrap0D, 0); - VOID DECLSPEC_NORETURN -HalpTrap06(VOID) +HalpTrap06() { - PKTRAP_FRAME TrapFrame; - /* Restore ES/DS to known good values first */ Ke386SetEs(KGDT_R3_DATA | RPL_MASK); Ke386SetDs(KGDT_R3_DATA | RPL_MASK); - - /* Read trap frame address */ - TrapFrame = (PKTRAP_FRAME)HalpSavedEsp; - - /* Restore segments from the trap frame */ - Ke386SetGs(TrapFrame->SegGs); - Ke386SetFs(TrapFrame->SegFs); - Ke386SetEs(TrapFrame->SegEs); - Ke386SetDs(TrapFrame->SegDs); - - /* Restore EFlags */ - __writeeflags(TrapFrame->EFlags); - - /* Exit the V86 mode trap frame */ - KiCallReturn(TrapFrame); + Ke386SetFs(KGDT_R0_PCR); + + /* Restore the stack */ + KeGetPcr()->TSS->Esp0 = HalpSavedEsp0; + + /* Return back to where we left */ + longjmp(HalpSavedContext, 1); + UNREACHABLE; } /* V8086 ENTER ****************************************************************/ VOID -FASTCALL -DECLSPEC_NORETURN -HalpBiosCallHandler(IN PKTRAP_FRAME TrapFrame) +NTAPI +HalpBiosCall() { /* Must be volatile so it doesn't get optimized away! */ volatile KTRAP_FRAME V86TrapFrame; ULONG_PTR StackOffset, CodeOffset; - /* Fill out the quick-n-dirty trap frame */ - TrapFrame->EFlags = __readeflags(); - TrapFrame->SegGs = Ke386GetGs(); - TrapFrame->SegFs = Ke386GetFs(); - TrapFrame->SegEs = Ke386GetEs(); - TrapFrame->SegDs = Ke386GetDs(); - - /* Our stack (the frame) */ - HalpSavedEsp = (ULONG_PTR)TrapFrame; + /* Save the context, check for return */ + if (_setjmp(HalpSavedContext)) + { + /* Returned from v86 */ + return; + } /* Kill alignment faults */ __writecr0(__readcr0() & ~CR0_AM); /* Set new stack address */ - KeGetPcr()->TSS->Esp0 = HalpSavedEsp - sizeof(FX_SAVE_AREA); + KeGetPcr()->TSS->Esp0 = (ULONG)&V86TrapFrame - 0x20 - sizeof(FX_SAVE_AREA); /* Compute segmented IP and SP offsets */ StackOffset = (ULONG_PTR)&HalpRealModeEnd - 4 - (ULONG_PTR)HalpRealModeStart; @@ -301,10 +275,9 @@ HalpBiosCallHandler(IN PKTRAP_FRAME TrapFrame) V86TrapFrame.Eip = CodeOffset; /* Exit to V86 mode */ - KiDirectTrapReturn((PKTRAP_FRAME)&V86TrapFrame); + HalpExitToV86((PKTRAP_FRAME)&V86TrapFrame); } - -KiTrampoline(HalpBiosCall, KI_PUSH_FAKE_ERROR_CODE | KI_NONVOLATILES_ONLY); +#endif /* FUNCTIONS ******************************************************************/ @@ -459,6 +432,7 @@ HalpRestoreIopm(VOID) while (i--) HalpSavedIoMap[HalpSavedIoMapData[i][0]] = HalpSavedIoMapData[i][1]; } +#ifndef _MINIHAL_ VOID NTAPI HalpMapRealModeMemory(VOID) @@ -546,6 +520,7 @@ HalpSwitchToRealModeTrapHandlers(VOID) // KeRegisterInterruptHandler(6, HalpTrap06); } +#endif VOID NTAPI @@ -655,6 +630,7 @@ HalpUnmapRealModeMemory(VOID) HalpFlushTLB(); } +#ifndef _MINIHAL_ BOOLEAN NTAPI HalpBiosDisplayReset(VOID) @@ -724,5 +700,6 @@ HalpBiosDisplayReset(VOID) __writeeflags(Flags); return TRUE; } +#endif /* EOF */ diff --git a/reactos/hal/halx86/generic/bus/halbus.c b/reactos/hal/halx86/generic/bus/halbus.c index 8421b774b63..d8e478f450f 100644 --- a/reactos/hal/halx86/generic/bus/halbus.c +++ b/reactos/hal/halx86/generic/bus/halbus.c @@ -27,8 +27,10 @@ HalpRegisterKdSupportFunctions(VOID) KdReleasePciDeviceforDebugging = HalpReleasePciDeviceForDebugging; /* Register memory functions */ +#ifndef _MINIHAL_ KdMapPhysicalMemory64 = HalpMapPhysicalMemory64; KdUnmapVirtualAddress = HalpUnmapVirtualAddress; +#endif /* Register ACPI stub */ KdCheckPowerButton = HalpCheckPowerButton; diff --git a/reactos/hal/halx86/generic/bus/pcibus.c b/reactos/hal/halx86/generic/bus/pcibus.c index a09f8bb5bdf..50f1add18d8 100644 --- a/reactos/hal/halx86/generic/bus/pcibus.c +++ b/reactos/hal/halx86/generic/bus/pcibus.c @@ -614,7 +614,7 @@ HalpAssignPCISlotResources(IN PBUS_HANDLER BusHandler, { if (0 != PciConfig.u.type0.BaseAddresses[Address]) { - if (/*PCI_BASE_ADDRESS_SPACE_MEMORY*/ 0 == + if (PCI_ADDRESS_MEMORY_SPACE == (PciConfig.u.type0.BaseAddresses[Address] & 0x1)) { Descriptor->Type = CmResourceTypeMemory; @@ -702,6 +702,7 @@ PPCI_REGISTRY_INFO_INTERNAL NTAPI HalpQueryPciRegistryInfo(VOID) { +#ifndef _MINIHAL_ WCHAR NameBuffer[8]; OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING KeyName, ConfigName, IdentName; @@ -924,6 +925,9 @@ HalpQueryPciRegistryInfo(VOID) /* Return it */ return PciRegistryInfo; +#else + return NULL; +#endif } VOID diff --git a/reactos/hal/halx86/generic/bus/pcidata.c b/reactos/hal/halx86/generic/bus/pcidata.c index 947128b76a6..83ccecef7d6 100644 --- a/reactos/hal/halx86/generic/bus/pcidata.c +++ b/reactos/hal/halx86/generic/bus/pcidata.c @@ -14,6 +14,7 @@ /* GLOBALS *******************************************************************/ +#ifndef _MINIHAL_ CHAR ClassTable[3922] = { 0x43, 0x20, 0x30, 0x30, 0x20, 0x20, 0x55, 0x6E, 0x63, 0x6C, 0x61, 0x73, 0x73, 0x69, 0x66, 0x69, @@ -40415,3 +40416,4 @@ CHAR VendorTable[642355] = 0x20, 0x49, 0x6C, 0x6C, 0x65, 0x67, 0x61, 0x6C, 0x20, 0x56, 0x65, 0x6E, 0x64, 0x6F, 0x72, 0x20, 0x49, 0x44, 0x00, }; +#endif diff --git a/reactos/hal/halx86/generic/display.c b/reactos/hal/halx86/generic/display.c index 449ddc2986d..dc5f821240e 100644 --- a/reactos/hal/halx86/generic/display.c +++ b/reactos/hal/halx86/generic/display.c @@ -31,8 +31,10 @@ VOID NTAPI HalDisplayString(IN PCH String) { +#ifndef _MINIHAL_ /* Call the Inbv driver */ InbvDisplayString(String); +#endif } /* diff --git a/reactos/hal/halx86/generic/dma.c b/reactos/hal/halx86/generic/dma.c index 0b7b7f34827..bdfae48bfc0 100644 --- a/reactos/hal/halx86/generic/dma.c +++ b/reactos/hal/halx86/generic/dma.c @@ -75,11 +75,15 @@ #define NDEBUG #include +#ifndef _MINIHAL_ static KEVENT HalpDmaLock; static LIST_ENTRY HalpDmaAdapterList; static PADAPTER_OBJECT HalpEisaAdapter[8]; +#endif static BOOLEAN HalpEisaDma; +#ifndef _MINIHAL_ static PADAPTER_OBJECT HalpMasterAdapter; +#endif static const ULONG_PTR HalpEisaPortPage[8] = { FIELD_OFFSET(DMA_PAGE, Channel0), @@ -92,6 +96,7 @@ static const ULONG_PTR HalpEisaPortPage[8] = { FIELD_OFFSET(DMA_PAGE, Channel7) }; +#ifndef _MINIHAL_ static DMA_OPERATIONS HalpDmaOperations = { sizeof(DMA_OPERATIONS), (PPUT_DMA_ADAPTER)HalPutDmaAdapter, @@ -111,6 +116,7 @@ static DMA_OPERATIONS HalpDmaOperations = { NULL /*(PBUILD_SCATTER_GATHER_LIST)HalBuildScatterGatherList*/, NULL /*(PBUILD_MDL_FROM_SCATTER_GATHER_LIST)HalBuildMdlFromScatterGatherList*/ }; +#endif #define MAX_MAP_REGISTERS 64 @@ -118,6 +124,7 @@ static DMA_OPERATIONS HalpDmaOperations = { /* FUNCTIONS *****************************************************************/ +#ifndef _MINIHAL_ VOID HalpInitDma(VOID) { @@ -154,6 +161,7 @@ HalpInitDma(VOID) */ HalGetDmaAdapter = HalpGetDmaAdapter; } +#endif /** * @name HalpGetAdapterMaximumPhysicalAddress @@ -185,6 +193,7 @@ HalpGetAdapterMaximumPhysicalAddress(IN PADAPTER_OBJECT AdapterObject) return HighestAddress; } +#ifndef _MINIHAL_ /** * @name HalpGrowMapBuffers * @@ -428,6 +437,7 @@ HalpDmaAllocateChildAdapter(IN ULONG NumberOfMapRegisters, return AdapterObject; } +#endif /** * @name HalpDmaInitializeEisaAdapter @@ -564,6 +574,7 @@ HalpDmaInitializeEisaAdapter(IN PADAPTER_OBJECT AdapterObject, return TRUE; } +#ifndef _MINIHAL_ /** * @name HalGetAdapter * @@ -896,6 +907,7 @@ HalFreeCommonBuffer(IN PADAPTER_OBJECT AdapterObject, Length, CacheEnabled ? MmCached : MmNonCached); } +#endif /** * @name HalpDmaGetDmaAlignment @@ -984,6 +996,7 @@ HalReadDmaCounter(IN PADAPTER_OBJECT AdapterObject) return Count; } +#ifndef _MINIHAL_ /** * @name HalpGrowMapBufferWorker * @@ -1893,6 +1906,7 @@ IoMapTransfer(IN PADAPTER_OBJECT AdapterObject, */ return PhysicalAddress; } +#endif /** * @name HalFlushCommonBuffer diff --git a/reactos/hal/halx86/generic/halinit.c b/reactos/hal/halx86/generic/halinit.c index 1fb157fa0b7..498bf5cc5bb 100644 --- a/reactos/hal/halx86/generic/halinit.c +++ b/reactos/hal/halx86/generic/halinit.c @@ -91,8 +91,10 @@ HalInitSystem(IN ULONG BootPhase, KeBugCheckEx(MISMATCHED_HAL, 1, Prcb->MajorVersion, 1, 0); } +#ifndef _MINIHAL_ /* Initialize the PICs */ HalpInitializePICs(TRUE); +#endif /* Force initial PIC state */ KfRaiseIrql(KeGetCurrentIrql()); @@ -107,9 +109,17 @@ HalInitSystem(IN ULONG BootPhase, HalQuerySystemInformation = HaliQuerySystemInformation; HalSetSystemInformation = HaliSetSystemInformation; HalInitPnpDriver = NULL; // FIXME: TODO +#ifndef _MINIHAL_ HalGetDmaAdapter = HalpGetDmaAdapter; +#else + HalGetDmaAdapter = NULL; +#endif HalGetInterruptTranslator = NULL; // FIXME: TODO +#ifndef _MINIHAL_ HalResetDisplay = HalpBiosDisplayReset; +#else + HalResetDisplay = NULL; +#endif HalHaltSystem = HaliHaltSystem; /* Register IRQ 2 */ @@ -125,8 +135,10 @@ HalInitSystem(IN ULONG BootPhase, /* Setup busy waiting */ HalpCalibrateStallExecution(); +#ifndef _MINIHAL_ /* Initialize the clock */ HalpInitializeClock(); +#endif /* * We could be rebooting with a pending profile interrupt, @@ -142,6 +154,7 @@ HalInitSystem(IN ULONG BootPhase, /* Initialize bus handlers */ HalpInitBusHandler(); +#ifndef _MINIHAL_ /* Enable IRQ 0 */ HalpEnableInterruptHandler(IDT_DEVICE, 0, @@ -160,6 +173,7 @@ HalInitSystem(IN ULONG BootPhase, /* Initialize DMA. NT does this in Phase 0 */ HalpInitDma(); +#endif /* Do some HAL-specific initialization */ HalpInitPhase1(); diff --git a/reactos/hal/halx86/generic/misc.c b/reactos/hal/halx86/generic/misc.c index 4f103ee806b..60684bfc27b 100644 --- a/reactos/hal/halx86/generic/misc.c +++ b/reactos/hal/halx86/generic/misc.c @@ -28,6 +28,7 @@ HalpCheckPowerButton(VOID) return; } +#ifndef _MINIHAL_ PVOID NTAPI HalpMapPhysicalMemory64(IN PHYSICAL_ADDRESS PhysicalAddress, @@ -51,6 +52,7 @@ HalpUnmapVirtualAddress(IN PVOID VirtualAddress, // MmUnmapIoSpace(VirtualAddress, NumberPages << PAGE_SHIFT); } +#endif VOID NTAPI @@ -143,6 +145,7 @@ VOID NTAPI HalHandleNMI(IN PVOID NmiInfo) { +#ifndef _MINIHAL_ SYSTEM_CONTROL_PORT_B_REGISTER SystemControl; // @@ -223,6 +226,7 @@ HalHandleNMI(IN PVOID NmiInfo) // Halt the system // InbvDisplayString("\n*** The system has halted ***\n"); +#endif // // Enter the debugger if possible diff --git a/reactos/hal/halx86/generic/pic.c b/reactos/hal/halx86/generic/pic.c index 17adf0a8765..a710d862567 100644 --- a/reactos/hal/halx86/generic/pic.c +++ b/reactos/hal/halx86/generic/pic.c @@ -14,6 +14,7 @@ /* GLOBALS ********************************************************************/ +#ifndef _MINIHAL_ /* * This table basically keeps track of level vs edge triggered interrupts. * Windows has 250+ entries, but it seems stupid to replicate that since the PIC @@ -1335,4 +1336,28 @@ HalpDispatchInterrupt2(VOID) } } -KiTrap(HalpApcInterrupt, KI_SOFTWARE_TRAP); +#else + +KIRQL +NTAPI +KeGetCurrentIrql(VOID) +{ + return PASSIVE_LEVEL; +} + +VOID +FASTCALL +KfLowerIrql( + IN KIRQL OldIrql) +{ +} + +KIRQL +FASTCALL +KfRaiseIrql( + IN KIRQL NewIrql) +{ + return NewIrql; +} + +#endif diff --git a/reactos/hal/halx86/generic/reboot.c b/reactos/hal/halx86/generic/reboot.c index e6a5cffee24..c7eda5e96c1 100644 --- a/reactos/hal/halx86/generic/reboot.c +++ b/reactos/hal/halx86/generic/reboot.c @@ -98,8 +98,10 @@ HalReturnToFirmware(IN FIRMWARE_REENTRY Action) case HalHaltRoutine: case HalRebootRoutine: +#ifndef _MINIHAL_ /* Acquire the display */ InbvAcquireDisplayOwnership(); +#endif /* Call the internal reboot function */ HalpReboot(); diff --git a/reactos/hal/halx86/generic/sysinfo.c b/reactos/hal/halx86/generic/sysinfo.c index db12f00f432..d3a72c56a2f 100644 --- a/reactos/hal/halx86/generic/sysinfo.c +++ b/reactos/hal/halx86/generic/sysinfo.c @@ -49,6 +49,12 @@ HaliQuerySystemInformation(IN HAL_QUERY_INFORMATION_CLASS InformationClass, REPORT_THIS_CASE(HalPartitionIpiInterface); REPORT_THIS_CASE(HalPlatformInformation); REPORT_THIS_CASE(HalQueryProfileSourceList); + REPORT_THIS_CASE(HalInitLogInformation); + REPORT_THIS_CASE(HalFrequencyInformation); + REPORT_THIS_CASE(HalProcessorBrandString); + REPORT_THIS_CASE(HalHypervisorInformation); + REPORT_THIS_CASE(HalPlatformTimerInformation); + REPORT_THIS_CASE(HalAcpiAuditInformation); } #undef REPORT_THIS_CASE diff --git a/reactos/hal/halx86/generic/timer.c b/reactos/hal/halx86/generic/timer.c index 2ed8c5bfc65..524b6cecb34 100644 --- a/reactos/hal/halx86/generic/timer.c +++ b/reactos/hal/halx86/generic/timer.c @@ -110,6 +110,7 @@ HalpInitializeClock(VOID) } #ifdef _M_IX86 +#ifndef _MINIHAL_ VOID FASTCALL HalpClockInterruptHandler(IN PKTRAP_FRAME TrapFrame) @@ -161,9 +162,8 @@ HalpProfileInterruptHandler(IN PKTRAP_FRAME TrapFrame) /* Spurious, just end the interrupt */ KiEoiHelper(TrapFrame); } +#endif -KiTrap(HalpClockInterrupt, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(HalpProfileInterrupt, KI_PUSH_FAKE_ERROR_CODE); #endif /* PUBLIC FUNCTIONS ***********************************************************/ diff --git a/reactos/hal/halx86/generic/trap.S b/reactos/hal/halx86/generic/trap.S new file mode 100644 index 00000000000..2ad319bfb6e --- /dev/null +++ b/reactos/hal/halx86/generic/trap.S @@ -0,0 +1,45 @@ +/* + * FILE: ntoskrnl/ke/i386/trap.S + * COPYRIGHT: See COPYING in the top level directory + * PURPOSE: System Traps, Entrypoints and Exitpoints + * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org) + * NOTE: See asmmacro.S for the shared entry/exit code. + */ + +/* INCLUDES ******************************************************************/ + +#include +#include +#include + +.code32 +.text + +TRAP_ENTRY HalpTrap0D, 0 +TRAP_ENTRY HalpApcInterrupt, KI_SOFTWARE_TRAP +TRAP_ENTRY HalpClockInterrupt, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY HalpProfileInterrupt, KI_PUSH_FAKE_ERROR_CODE + +PUBLIC @HalpExitToV86@4 +@HalpExitToV86@4: + /* Point esp to the iret frame and return */ + lea esp, [ecx + KTRAP_FRAME_EIP] + iret + +/* Here starts the real mode code */ +.code16 +PUBLIC _HalpRealModeStart +_HalpRealModeStart: + /* INT 0x10: AH = 0 (Set video Mode), AL = 0x12 (Mode 12) */ + mov eax, HEX(12) + int HEX(10) + + /* BOP */ + .byte HEX(C4), HEX(C4) + +/* The real mode stack */ +.align 4 +.space 2048 +_HalpRealModeEnd: +PUBLIC _HalpRealModeEnd + diff --git a/reactos/hal/halx86/generic/usage.c b/reactos/hal/halx86/generic/usage.c index 3493113920e..d35a3e3a964 100644 --- a/reactos/hal/halx86/generic/usage.c +++ b/reactos/hal/halx86/generic/usage.c @@ -63,6 +63,7 @@ HalpRegisterVector(IN UCHAR Flags, HalpIDTUsage[SystemVector].BusReleativeVector = BusVector; } +#ifndef _MINIHAL_ VOID NTAPI HalpEnableInterruptHandler(IN UCHAR Flags, @@ -87,6 +88,7 @@ HalpEnableInterruptHandler(IN UCHAR Flags, /* Enable the interrupt */ HalEnableSystemInterrupt(SystemVector, Irql, Mode); } +#endif /* * @unimplemented diff --git a/reactos/hal/halx86/hal.rbuild b/reactos/hal/halx86/hal.rbuild index e4f7ea6f8da..2c672c2f5f4 100644 --- a/reactos/hal/halx86/hal.rbuild +++ b/reactos/hal/halx86/hal.rbuild @@ -6,10 +6,12 @@ include include + hal_generic hal_generic_up ntoskrnl + libcntpr halinit_up.c halup.rc diff --git a/reactos/hal/halx86/hal_generic.rbuild b/reactos/hal/halx86/hal_generic.rbuild index 9d920198d1e..98cb36b95a5 100644 --- a/reactos/hal/halx86/hal_generic.rbuild +++ b/reactos/hal/halx86/hal_generic.rbuild @@ -1,9 +1,10 @@ - + include include + @@ -28,6 +29,7 @@ halinit.c misc.c pic.c + trap.S usage.c portio.c @@ -55,4 +57,42 @@ hal.h + + include + include + + + + + + + bushndlr.c + isabus.c + halbus.c + pcibus.c + pcidata.c + sysbus.c + + beep.c + bios.c + cmos.c + dma.c + display.c + drive.c + misc.c + pic.c + portio.c + processor.c + profil.c + reboot.c + spinlock.c + sysinfo.c + systimer.S + timer.c + usage.c + + + halinit_up.c + + diff --git a/reactos/hal/halx86/hal_generic_mp.rbuild b/reactos/hal/halx86/hal_generic_mp.rbuild index 1a3593c3295..5063a045c1a 100644 --- a/reactos/hal/halx86/hal_generic_mp.rbuild +++ b/reactos/hal/halx86/hal_generic_mp.rbuild @@ -1,9 +1,10 @@ - + include include + diff --git a/reactos/hal/halx86/hal_generic_up.rbuild b/reactos/hal/halx86/hal_generic_up.rbuild index b9c40a2b4b0..6338b1dd720 100644 --- a/reactos/hal/halx86/hal_generic_up.rbuild +++ b/reactos/hal/halx86/hal_generic_up.rbuild @@ -1,9 +1,10 @@ - + include include + spinlock.c diff --git a/reactos/hal/halx86/halmps.rbuild b/reactos/hal/halx86/halmps.rbuild index 0d13b7cd8cb..abdd17beadf 100644 --- a/reactos/hal/halx86/halmps.rbuild +++ b/reactos/hal/halx86/halmps.rbuild @@ -7,10 +7,12 @@ include include + hal_generic hal_generic_mp ntoskrnl + libcntpr mpsirql.c diff --git a/reactos/hal/halx86/halxbox.rbuild b/reactos/hal/halx86/halxbox.rbuild index 7996e653931..cee7f614e90 100644 --- a/reactos/hal/halx86/halxbox.rbuild +++ b/reactos/hal/halx86/halxbox.rbuild @@ -5,11 +5,13 @@ include include + hal_generic hal_generic_up ntoskrnl + libcntpr halinit_xbox.c part_xbox.c diff --git a/reactos/hal/halx86/include/apic.h b/reactos/hal/halx86/include/apic.h index 1625e9d0ece..315af0a6b3e 100644 --- a/reactos/hal/halx86/include/apic.h +++ b/reactos/hal/halx86/include/apic.h @@ -2,8 +2,7 @@ * */ -#ifndef __INTERNAL_HAL_APIC_H -#define __INTERNAL_HAL_APIC_H +#pragma once #ifdef _M_AMD64 #define APIC_DEFAULT_BASE 0xfffffffffee00000ULL; @@ -251,6 +250,4 @@ static __inline VOID APICSendEOI(VOID) APICWrite(APIC_EOI, 0); } -#endif /* __INTERNAL_HAL_APIC_H */ - /* EOF */ diff --git a/reactos/hal/halx86/include/bus.h b/reactos/hal/halx86/include/bus.h index 295bc5d3a6e..3e07190f470 100644 --- a/reactos/hal/halx86/include/bus.h +++ b/reactos/hal/halx86/include/bus.h @@ -1,5 +1,6 @@ -#ifndef __INTERNAL_HAL_BUS_H -#define __INTERNAL_HAL_BUS_H +#pragma once + +#define PCI_ADDRESS_MEMORY_SPACE 0x00000000 // // Helper Macros @@ -363,8 +364,4 @@ extern BOOLEAN HalpPCIConfigInitialized; extern BUS_HANDLER HalpFakePciBusHandler; extern ULONG HalpMinPciBus, HalpMaxPciBus; -#endif /* __INTERNAL_HAL_BUS_H */ - /* EOF */ - - diff --git a/reactos/hal/halx86/include/hal.h b/reactos/hal/halx86/include/hal.h index 2efb0a59372..284d2c5d893 100644 --- a/reactos/hal/halx86/include/hal.h +++ b/reactos/hal/halx86/include/hal.h @@ -14,11 +14,13 @@ /* WDK HAL Compilation hack */ #include #include -#undef _NTHAL_ -#undef DECLSPEC_IMPORT -#define DECLSPEC_IMPORT +#ifndef _MINIHAL_ #undef NTSYSAPI #define NTSYSAPI __declspec(dllimport) +#else +#undef NTSYSAPI +#define NTSYSAPI +#endif /* IFS/DDK/NDK Headers */ #include diff --git a/reactos/hal/halx86/include/haldma.h b/reactos/hal/halx86/include/haldma.h index 1770770e135..2da2c1f523a 100644 --- a/reactos/hal/halx86/include/haldma.h +++ b/reactos/hal/halx86/include/haldma.h @@ -1,5 +1,4 @@ -#ifndef HALDMA_H -#define HALDMA_H +#pragma once /* * DMA Page Register Structure @@ -379,5 +378,3 @@ HalpGetDmaAdapter( ULONG NTAPI HalpDmaGetDmaAlignment( PADAPTER_OBJECT AdapterObject); - -#endif /* HALDMA_H */ diff --git a/reactos/hal/halx86/include/halirq.h b/reactos/hal/halx86/include/halirq.h index baec1f854ed..63dec6e62e8 100644 --- a/reactos/hal/halx86/include/halirq.h +++ b/reactos/hal/halx86/include/halirq.h @@ -2,8 +2,7 @@ * $Id$ */ -#ifndef __INCLUDE_HAL_HALIRQ -#define __INCLUDE_HAL_HALIRQ +#pragma once #ifdef CONFIG_SMP @@ -31,5 +30,3 @@ #define IRQ2VECTOR(irq) ((irq) + IRQ_BASE) #endif - -#endif /* __INCLUDE_HAL_HALIRQ */ diff --git a/reactos/hal/halx86/include/halp.h b/reactos/hal/halx86/include/halp.h index 726c8bbeb76..2d487c987ab 100644 --- a/reactos/hal/halx86/include/halp.h +++ b/reactos/hal/halx86/include/halp.h @@ -2,8 +2,7 @@ * */ -#ifndef __INTERNAL_HAL_HAL_H -#define __INTERNAL_HAL_HAL_H +#pragma once typedef struct _HAL_BIOS_FRAME { @@ -74,44 +73,6 @@ DECLSPEC_NORETURN // #define GRAPHICS_MODE_12 0x12 /* 80x30 8x16 640x480 16/256K */ -// -// Generates a 16-bit (real-mode or Virtual 8086) BIOS interrupt with a given AX */ -// -VOID -FORCEINLINE -HalpCallBiosInterrupt(IN ULONG Interrupt, - IN ULONG Ax) -{ - __asm__ __volatile__ - ( - ".byte 0x66\n" - "movl $%c[v], %%eax\n" - "int $%c[i]\n" - : - : [v] "i"(Ax), - [i] "i"(Interrupt) - ); -} - -// -// Constructs a stack of the given size and alignment in the real-mode .text region */ -// -VOID -FORCEINLINE -HalpRealModeStack(IN ULONG Alignment, - IN ULONG Size) -{ - __asm__ __volatile__ - ( - ".align %c[v]\n" - ".space %c[i]\n" - ".globl _HalpRealModeEnd\n_HalpRealModeEnd:\n" - : - : [v] "i"(Alignment), - [i] "i"(Size) - ); -} - // // Commonly stated as being 1.19318MHz // @@ -675,6 +636,18 @@ HalpBiosDisplayReset( VOID ); +VOID +FASTCALL +HalpExitToV86( + PKTRAP_FRAME TrapFrame +); + +VOID +DECLSPEC_NORETURN +HalpRealModeStart( + VOID +); + // // Processor Halt Routine // @@ -732,5 +705,3 @@ extern KSPIN_LOCK HalpSystemHardwareLock; extern PADDRESS_USAGE HalpAddressUsageList; extern LARGE_INTEGER HalpPerfCounter; - -#endif /* __INTERNAL_HAL_HAL_H */ diff --git a/reactos/hal/halx86/include/ioapic.h b/reactos/hal/halx86/include/ioapic.h index c038c2a5b1f..28225c54f72 100644 --- a/reactos/hal/halx86/include/ioapic.h +++ b/reactos/hal/halx86/include/ioapic.h @@ -2,8 +2,7 @@ * */ -#ifndef __INTERNAL_HAL_IOAPIC_H -#define __INTERNAL_HAL_IOAPIC_H +#pragma once /* I/O APIC Register Address Map */ #define IOAPIC_IOREGSEL 0x0000 /* I/O Register Select (index) (R/W) */ @@ -95,9 +94,4 @@ VOID HaliReconfigurePciInterrupts(VOID); /* For debugging */ VOID IOAPICDump(VOID); -#endif - - - /* EOF */ - diff --git a/reactos/hal/halx86/include/mps.h b/reactos/hal/halx86/include/mps.h index 83f9cfbe501..ba766958280 100644 --- a/reactos/hal/halx86/include/mps.h +++ b/reactos/hal/halx86/include/mps.h @@ -1,5 +1,4 @@ -#ifndef __INCLUDE_HAL_MPS -#define __INCLUDE_HAL_MPS +#pragma once /* * FIXME: This does not work if we have more than 24 IRQs (ie. more than one @@ -198,7 +197,4 @@ typedef struct _MP_CONFIGURATION_INTLOCAL VOID HalpInitMPS(VOID); - -#endif /* __INCLUDE_HAL_MPS */ - /* EOF */ diff --git a/reactos/hal/halx86/mp/apic.c b/reactos/hal/halx86/mp/apic.c index 2257c185646..4c6cff70228 100644 --- a/reactos/hal/halx86/mp/apic.c +++ b/reactos/hal/halx86/mp/apic.c @@ -1074,4 +1074,25 @@ HaliStartApplicationProcessor(ULONG Cpu, ULONG Stack) #endif +VOID +FASTCALL +DECLSPEC_NORETURN +HalpApcInterruptHandler(IN PKTRAP_FRAME TrapFrame) +{ + /* Set up a fake INT Stack */ + TrapFrame->EFlags = __readeflags(); + TrapFrame->SegCs = KGDT_R0_CODE; + TrapFrame->Eip = TrapFrame->Eax; + + /* Build the trap frame */ + KiEnterInterruptTrap(TrapFrame); + + /* unimplemented */ + UNIMPLEMENTED; + + /* Exit the interrupt */ + KiEoiHelper(TrapFrame); + +} + /* EOF */ diff --git a/reactos/include/crt/_mingw.h b/reactos/include/crt/_mingw.h index 684fb988f4d..d5b9d37979d 100644 --- a/reactos/include/crt/_mingw.h +++ b/reactos/include/crt/_mingw.h @@ -135,6 +135,14 @@ /* TODO: Mark (almost) all CRT functions as __MINGW_NOTHROW. This will allow GCC to optimize away some EH unwind code, at least in DW2 case. */ +#ifndef __MINGW_EXTENSION +#if defined(__GNUC__) || defined(__GNUG__) +#define __MINGW_EXTENSION __extension__ +#else +#define __MINGW_EXTENSION +#endif +#endif + #ifndef __MSVCRT_VERSION__ /* High byte is the major version, low byte is the minor. */ # define __MSVCRT_VERSION__ 0x0700 diff --git a/reactos/include/crt/crtdefs.h b/reactos/include/crt/crtdefs.h index c941eae87a2..8ff8d0d3764 100644 --- a/reactos/include/crt/crtdefs.h +++ b/reactos/include/crt/crtdefs.h @@ -245,7 +245,7 @@ extern "C" { #if defined(__GNUC__) && defined(__STRICT_ANSI__) typedef unsigned int size_t __attribute__ ((mode (DI))); #else - typedef unsigned __int64 size_t; + __MINGW_EXTENSION typedef unsigned __int64 size_t; #endif #else typedef unsigned int size_t; @@ -261,7 +261,7 @@ extern "C" { #if defined(__GNUC__) && defined(__STRICT_ANSI__) typedef int intptr_t __attribute__ ((mode (DI))); #else - typedef __int64 intptr_t; + __MINGW_EXTENSION typedef __int64 intptr_t; #endif #else typedef int intptr_t; @@ -278,7 +278,7 @@ extern "C" { #if defined(__GNUC__) && defined(__STRICT_ANSI__) typedef unsigned int uintptr_t __attribute__ ((mode (DI))); #else - typedef unsigned __int64 uintptr_t; + __MINGW_EXTENSION typedef unsigned __int64 uintptr_t; #endif #else typedef unsigned int uintptr_t; @@ -294,7 +294,7 @@ extern "C" { #if defined(__GNUC__) && defined(__STRICT_ANSI__) typedef int ptrdiff_t __attribute__ ((mode (DI))); #else - typedef __int64 ptrdiff_t; + __MINGW_EXTENSION typedef __int64 ptrdiff_t; #endif #else typedef int ptrdiff_t; @@ -329,7 +329,7 @@ extern "C" { #ifndef _TIME64_T_DEFINED #define _TIME64_T_DEFINED #if _INTEGRAL_MAX_BITS >= 64 - typedef __int64 __time64_t; + __MINGW_EXTENSION typedef __int64 __time64_t; #endif #endif diff --git a/reactos/include/crt/excpt.h b/reactos/include/crt/excpt.h index 8a7badba888..d0d3ef077de 100644 --- a/reactos/include/crt/excpt.h +++ b/reactos/include/crt/excpt.h @@ -34,7 +34,7 @@ typedef enum _EXCEPTION_DISPOSITION struct _CONTEXT; struct _DISPATCHER_CONTEXT; - _CRTIMP EXCEPTION_DISPOSITION __cdecl __C_specific_handler (struct _EXCEPTION_RECORD *_ExceptionRecord,unsigned __int64 _MemoryStackFp,unsigned __int64 _BackingStoreFp,struct _CONTEXT *_ContextRecord,struct _DISPATCHER_CONTEXT *_DispatcherContext,unsigned __int64 _GlobalPointer); + __MINGW_EXTENSION _CRTIMP EXCEPTION_DISPOSITION __cdecl __C_specific_handler (struct _EXCEPTION_RECORD *_ExceptionRecord,unsigned __int64 _MemoryStackFp,unsigned __int64 _BackingStoreFp,struct _CONTEXT *_ContextRecord,struct _DISPATCHER_CONTEXT *_DispatcherContext,unsigned __int64 _GlobalPointer); #elif defined(__x86_64) struct _EXCEPTION_RECORD; diff --git a/reactos/include/crt/fpieee.h b/reactos/include/crt/fpieee.h index 74afa77d258..3fd5d539c38 100644 --- a/reactos/include/crt/fpieee.h +++ b/reactos/include/crt/fpieee.h @@ -49,7 +49,7 @@ extern "C" { typedef int _I32; typedef unsigned short _U16; typedef unsigned int _U32; - typedef __int64 _Q64; + __MINGW_EXTENSION typedef __int64 _Q64; typedef struct #if defined(__ia64__) diff --git a/reactos/include/crt/io.h b/reactos/include/crt/io.h index 2eaae8f4581..4a3f37dafbb 100644 --- a/reactos/include/crt/io.h +++ b/reactos/include/crt/io.h @@ -51,7 +51,7 @@ _CRTIMP char* __cdecl _getcwd (char*, int); time_t time_create; time_t time_access; time_t time_write; - __int64 size; + __MINGW_EXTENSION __int64 size; char name[260]; }; @@ -60,7 +60,7 @@ _CRTIMP char* __cdecl _getcwd (char*, int); __time32_t time_create; __time32_t time_access; __time32_t time_write; - __int64 size; + __MINGW_EXTENSION __int64 size; char name[260]; }; @@ -78,7 +78,7 @@ _CRTIMP char* __cdecl _getcwd (char*, int); __time64_t time_create; __time64_t time_access; __time64_t time_write; - __int64 size; + __MINGW_EXTENSION __int64 size; char name[260]; }; #endif /* _INTEGRAL_MAX_BITS >= 64 */ @@ -113,7 +113,7 @@ _CRTIMP char* __cdecl _getcwd (char*, int); time_t time_create; time_t time_access; time_t time_write; - __int64 size; + __MINGW_EXTENSION __int64 size; wchar_t name[260]; }; @@ -122,7 +122,7 @@ _CRTIMP char* __cdecl _getcwd (char*, int); __time32_t time_create; __time32_t time_access; __time32_t time_write; - __int64 size; + __MINGW_EXTENSION __int64 size; wchar_t name[260]; }; @@ -140,7 +140,7 @@ _CRTIMP char* __cdecl _getcwd (char*, int); __time64_t time_create; __time64_t time_access; __time64_t time_write; - __int64 size; + __MINGW_EXTENSION __int64 size; wchar_t name[260]; }; #endif @@ -200,15 +200,15 @@ _CRTIMP char* __cdecl _getcwd (char*, int); _CRTIMP int __cdecl _write(int _FileHandle,const void *_Buf,unsigned int _MaxCharCount); #if _INTEGRAL_MAX_BITS >= 64 - _CRTIMP __int64 __cdecl _filelengthi64(int _FileHandle); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _filelengthi64(int _FileHandle); _CRTIMP intptr_t __cdecl _findfirst32i64(const char *_Filename,struct _finddata32i64_t *_FindData); _CRTIMP intptr_t __cdecl _findfirst64i32(const char *_Filename,struct _finddata64i32_t *_FindData); _CRTIMP intptr_t __cdecl _findfirst64(const char *_Filename,struct __finddata64_t *_FindData); _CRTIMP int __cdecl _findnext32i64(intptr_t _FindHandle,struct _finddata32i64_t *_FindData); _CRTIMP int __cdecl _findnext64i32(intptr_t _FindHandle,struct _finddata64i32_t *_FindData); _CRTIMP int __cdecl _findnext64(intptr_t _FindHandle,struct __finddata64_t *_FindData); - _CRTIMP __int64 __cdecl _lseeki64(int _FileHandle,__int64 _Offset,int _Origin); - _CRTIMP __int64 __cdecl _telli64(int _FileHandle); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _lseeki64(int _FileHandle,__int64 _Offset,int _Origin); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _telli64(int _FileHandle); #ifdef __cplusplus #include #endif diff --git a/reactos/include/crt/math.h b/reactos/include/crt/math.h index a5761848f57..b75bb910e90 100644 --- a/reactos/include/crt/math.h +++ b/reactos/include/crt/math.h @@ -598,23 +598,23 @@ __CRT_INLINE int isinf (double d) { return retval; } - __CRT_INLINE long long __cdecl llrint (double x) + __MINGW_EXTENSION __CRT_INLINE long long __cdecl llrint (double x) { - long long retval; + __MINGW_EXTENSION long long retval; __fistpll(x, retval); return retval; } - __CRT_INLINE long long __cdecl llrintf (float x) + __MINGW_EXTENSION __CRT_INLINE long long __cdecl llrintf (float x) { - long long retval; + __MINGW_EXTENSION long long retval; __fistpll(x, retval); return retval; } - __CRT_INLINE long long __cdecl llrintl (long double x) + __MINGW_EXTENSION __CRT_INLINE long long __cdecl llrintl (long double x) { - long long retval; + __MINGW_EXTENSION long long retval; __fistpll(x, retval); return retval; } @@ -630,9 +630,9 @@ __CRT_INLINE int isinf (double d) { extern long __cdecl lroundf (float); extern long __cdecl lroundl (long double); - extern long long __cdecl llround (double); - extern long long __cdecl llroundf (float); - extern long long __cdecl llroundl (long double); + __MINGW_EXTENSION extern long long __cdecl llround (double); + __MINGW_EXTENSION extern long long __cdecl llroundf (float); + __MINGW_EXTENSION extern long long __cdecl llroundl (long double); /* 7.12.9.8 */ /* round towards zero, regardless of fpu control word settings */ diff --git a/reactos/include/crt/rtcapi.h b/reactos/include/crt/rtcapi.h index 9b3c48a3768..3816f2d25c8 100644 --- a/reactos/include/crt/rtcapi.h +++ b/reactos/include/crt/rtcapi.h @@ -70,10 +70,10 @@ extern "C" { char __fastcall _RTC_Check_2_to_1(short _Src); char __fastcall _RTC_Check_4_to_1(int _Src); - char __fastcall _RTC_Check_8_to_1(__int64 _Src); + __MINGW_EXTENSION char __fastcall _RTC_Check_8_to_1(__int64 _Src); short __fastcall _RTC_Check_4_to_2(int _Src); - short __fastcall _RTC_Check_8_to_2(__int64 _Src); - int __fastcall _RTC_Check_8_to_4(__int64 _Src); + __MINGW_EXTENSION short __fastcall _RTC_Check_8_to_2(__int64 _Src); + __MINGW_EXTENSION int __fastcall _RTC_Check_8_to_4(__int64 _Src); #if (defined(_X86_) && !defined(__x86_64)) void __cdecl _RTC_CheckEsp(); diff --git a/reactos/include/crt/setjmp.h b/reactos/include/crt/setjmp.h index 3c27ff4a36b..66246a44519 100644 --- a/reactos/include/crt/setjmp.h +++ b/reactos/include/crt/setjmp.h @@ -40,8 +40,8 @@ extern "C" { #elif defined(__ia64__) typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 { - __int64 LowPart; - __int64 HighPart; + __MINGW_EXTENSION __int64 LowPart; + __MINGW_EXTENSION __int64 HighPart; } SETJMP_FLOAT128; #define _JBLEN 33 @@ -78,49 +78,49 @@ extern "C" { SETJMP_FLOAT128 FltS17; SETJMP_FLOAT128 FltS18; SETJMP_FLOAT128 FltS19; - __int64 FPSR; - __int64 StIIP; - __int64 BrS0; - __int64 BrS1; - __int64 BrS2; - __int64 BrS3; - __int64 BrS4; - __int64 IntS0; - __int64 IntS1; - __int64 IntS2; - __int64 IntS3; - __int64 RsBSP; - __int64 RsPFS; - __int64 ApUNAT; - __int64 ApLC; - __int64 IntSp; - __int64 IntNats; - __int64 Preds; + __MINGW_EXTENSION __int64 FPSR; + __MINGW_EXTENSION __int64 StIIP; + __MINGW_EXTENSION __int64 BrS0; + __MINGW_EXTENSION __int64 BrS1; + __MINGW_EXTENSION __int64 BrS2; + __MINGW_EXTENSION __int64 BrS3; + __MINGW_EXTENSION __int64 BrS4; + __MINGW_EXTENSION __int64 IntS0; + __MINGW_EXTENSION __int64 IntS1; + __MINGW_EXTENSION __int64 IntS2; + __MINGW_EXTENSION __int64 IntS3; + __MINGW_EXTENSION __int64 RsBSP; + __MINGW_EXTENSION __int64 RsPFS; + __MINGW_EXTENSION __int64 ApUNAT; + __MINGW_EXTENSION __int64 ApLC; + __MINGW_EXTENSION __int64 IntSp; + __MINGW_EXTENSION __int64 IntNats; + __MINGW_EXTENSION __int64 Preds; } _JUMP_BUFFER; #elif defined(__x86_64) typedef _CRT_ALIGN(16) struct _SETJMP_FLOAT128 { - unsigned __int64 Part[2]; + __MINGW_EXTENSION unsigned __int64 Part[2]; } SETJMP_FLOAT128; #define _JBLEN 16 typedef SETJMP_FLOAT128 _JBTYPE; typedef struct _JUMP_BUFFER { - unsigned __int64 Frame; - unsigned __int64 Rbx; - unsigned __int64 Rsp; - unsigned __int64 Rbp; - unsigned __int64 Rsi; - unsigned __int64 Rdi; - unsigned __int64 R12; - unsigned __int64 R13; - unsigned __int64 R14; - unsigned __int64 R15; - unsigned __int64 Rip; - unsigned __int64 Spare; + __MINGW_EXTENSION unsigned __int64 Frame; + __MINGW_EXTENSION unsigned __int64 Rbx; + __MINGW_EXTENSION unsigned __int64 Rsp; + __MINGW_EXTENSION unsigned __int64 Rbp; + __MINGW_EXTENSION unsigned __int64 Rsi; + __MINGW_EXTENSION unsigned __int64 Rdi; + __MINGW_EXTENSION unsigned __int64 R12; + __MINGW_EXTENSION unsigned __int64 R13; + __MINGW_EXTENSION unsigned __int64 R14; + __MINGW_EXTENSION unsigned __int64 R15; + __MINGW_EXTENSION unsigned __int64 Rip; + __MINGW_EXTENSION unsigned __int64 Spare; SETJMP_FLOAT128 Xmm6; SETJMP_FLOAT128 Xmm7; SETJMP_FLOAT128 Xmm8; diff --git a/reactos/include/crt/stddef.h b/reactos/include/crt/stddef.h index 8aa692e540a..9482677272d 100644 --- a/reactos/include/crt/stddef.h +++ b/reactos/include/crt/stddef.h @@ -148,7 +148,7 @@ _TYPE_wchar_t; #endif #ifndef _PTRDIFF_T_DEFINED #define _PTRDIFF_T_DEFINED -typedef __PTRDIFF_TYPE__ ptrdiff_t; +__MINGW_EXTENSION typedef __PTRDIFF_TYPE__ ptrdiff_t; #endif #endif /* _GCC_PTRDIFF_T */ #endif /* ___int_ptrdiff_t_h */ @@ -215,7 +215,7 @@ typedef __PTRDIFF_TYPE__ ptrdiff_t; #endif #endif #if !(defined (__GNUG__) && defined (size_t)) -typedef __SIZE_TYPE__ size_t; +__MINGW_EXTENSION typedef __SIZE_TYPE__ size_t; #ifdef __BEOS__ typedef long ssize_t; #endif /* __BEOS__ */ diff --git a/reactos/include/crt/stdint.h b/reactos/include/crt/stdint.h index 30f58bd6071..4c99ed04414 100644 --- a/reactos/include/crt/stdint.h +++ b/reactos/include/crt/stdint.h @@ -38,8 +38,8 @@ typedef short int16_t; typedef unsigned short uint16_t; typedef int int32_t; typedef unsigned uint32_t; -typedef long long int64_t; -typedef unsigned long long uint64_t; +__MINGW_EXTENSION typedef long long int64_t; +__MINGW_EXTENSION typedef unsigned long long uint64_t; /* 7.18.1.2 Minimum-width integer types */ typedef signed char int_least8_t; @@ -48,8 +48,8 @@ typedef short int_least16_t; typedef unsigned short uint_least16_t; typedef int int_least32_t; typedef unsigned uint_least32_t; -typedef long long int_least64_t; -typedef unsigned long long uint_least64_t; +__MINGW_EXTENSION typedef long long int_least64_t; +__MINGW_EXTENSION typedef unsigned long long uint_least64_t; /* 7.18.1.3 Fastest minimum-width integer types * Not actually guaranteed to be fastest for all purposes @@ -61,12 +61,12 @@ typedef short int_fast16_t; typedef unsigned short uint_fast16_t; typedef int int_fast32_t; typedef unsigned int uint_fast32_t; -typedef long long int_fast64_t; -typedef unsigned long long uint_fast64_t; +__MINGW_EXTENSION typedef long long int_fast64_t; +__MINGW_EXTENSION typedef unsigned long long uint_fast64_t; /* 7.18.1.5 Greatest-width integer types */ -typedef long long intmax_t; -typedef unsigned long long uintmax_t; +__MINGW_EXTENSION typedef long long intmax_t; +__MINGW_EXTENSION typedef unsigned long long uintmax_t; /* 7.18.2 Limits of specified-width integer types */ #if !defined ( __cplusplus) || defined (__STDC_LIMIT_MACROS) diff --git a/reactos/include/crt/stdio.h b/reactos/include/crt/stdio.h index 8c4e5be2962..c73c5b207f6 100644 --- a/reactos/include/crt/stdio.h +++ b/reactos/include/crt/stdio.h @@ -87,9 +87,9 @@ extern "C" { #ifndef _OFF64_T_DEFINED #define _OFF64_T_DEFINED - typedef long long _off64_t; + __MINGW_EXTENSION typedef long long _off64_t; #if !defined(NO_OLDNAMES) || defined(_POSIX) - typedef long long off64_t; + __MINGW_EXTENSION typedef long long off64_t; #endif #endif @@ -106,10 +106,10 @@ extern "C" { #undef _FPOSOFF #if (!defined(NO_OLDNAMES) || defined(__GNUC__)) && _INTEGRAL_MAX_BITS >= 64 - typedef __int64 fpos_t; + __MINGW_EXTENSION typedef __int64 fpos_t; #define _FPOSOFF(fp) ((long)(fp)) #else - typedef long long fpos_t; + __MINGW_EXTENSION typedef long long fpos_t; #define _FPOSOFF(fp) ((long)(fp)) #endif @@ -179,8 +179,8 @@ extern "C" { _CRTIMP int __cdecl fsetpos(FILE *_File,const fpos_t *_Pos); _CRTIMP int __cdecl fseek(FILE *_File,long _Offset,int _Origin); _CRTIMP long __cdecl ftell(FILE *_File); - _CRTIMP int __cdecl _fseeki64(FILE *_File,__int64 _Offset,int _Origin); - _CRTIMP __int64 __cdecl _ftelli64(FILE *_File); + __MINGW_EXTENSION _CRTIMP int __cdecl _fseeki64(FILE *_File,__int64 _Offset,int _Origin); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _ftelli64(FILE *_File); _CRTIMP size_t __cdecl fwrite(const void *_Str,size_t _Size,size_t _Count,FILE *_File); _CRTIMP int __cdecl getc(FILE *_File); _CRTIMP int __cdecl getchar(void); @@ -381,8 +381,8 @@ extern "C" { _CRTIMP size_t __cdecl _fread_nolock(void *_DstBuf,size_t _ElementSize,size_t _Count,FILE *_File); _CRTIMP int __cdecl _fseek_nolock(FILE *_File,long _Offset,int _Origin); _CRTIMP long __cdecl _ftell_nolock(FILE *_File); - _CRTIMP int __cdecl _fseeki64_nolock(FILE *_File,__int64 _Offset,int _Origin); - _CRTIMP __int64 __cdecl _ftelli64_nolock(FILE *_File); + __MINGW_EXTENSION _CRTIMP int __cdecl _fseeki64_nolock(FILE *_File,__int64 _Offset,int _Origin); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _ftelli64_nolock(FILE *_File); _CRTIMP size_t __cdecl _fwrite_nolock(const void *_DstBuf,size_t _Size,size_t _Count,FILE *_File); _CRTIMP int __cdecl _ungetc_nolock(int _Ch,FILE *_File); diff --git a/reactos/include/crt/stdlib.h b/reactos/include/crt/stdlib.h index 09dd4a5e378..baa0d8d419a 100644 --- a/reactos/include/crt/stdlib.h +++ b/reactos/include/crt/stdlib.h @@ -328,7 +328,7 @@ extern "C" { #endif #if _INTEGRAL_MAX_BITS >= 64 - __int64 __cdecl _abs64(__int64); + __MINGW_EXTENSION __int64 __cdecl _abs64(__int64); #endif int __cdecl atexit(void (__cdecl *)(void)); #ifndef _CRT_ATOF_DEFINED @@ -348,20 +348,20 @@ extern "C" { unsigned short __cdecl _byteswap_ushort(unsigned short _Short); /*unsigned long __cdecl _byteswap_ulong (unsigned long _Long); */ #if _INTEGRAL_MAX_BITS >= 64 - unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 _Int64); + __MINGW_EXTENSION unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 _Int64); #endif div_t __cdecl div(int _Numerator,int _Denominator); char *__cdecl getenv(const char *_VarName); _CRTIMP char *__cdecl _itoa(int _Value,char *_Dest,int _Radix); #if _INTEGRAL_MAX_BITS >= 64 - _CRTIMP char *__cdecl _i64toa(__int64 _Val,char *_DstBuf,int _Radix); - _CRTIMP char *__cdecl _ui64toa(unsigned __int64 _Val,char *_DstBuf,int _Radix); - _CRTIMP __int64 __cdecl _atoi64(const char *_String); - _CRTIMP __int64 __cdecl _atoi64_l(const char *_String,_locale_t _Locale); - _CRTIMP __int64 __cdecl _strtoi64(const char *_String,char **_EndPtr,int _Radix); - _CRTIMP __int64 __cdecl _strtoi64_l(const char *_String,char **_EndPtr,int _Radix,_locale_t _Locale); - _CRTIMP unsigned __int64 __cdecl _strtoui64(const char *_String,char **_EndPtr,int _Radix); - _CRTIMP unsigned __int64 __cdecl _strtoui64_l(const char *_String,char **_EndPtr,int _Radix,_locale_t _Locale); + __MINGW_EXTENSION _CRTIMP char *__cdecl _i64toa(__int64 _Val,char *_DstBuf,int _Radix); + __MINGW_EXTENSION _CRTIMP char *__cdecl _ui64toa(unsigned __int64 _Val,char *_DstBuf,int _Radix); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _atoi64(const char *_String); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _atoi64_l(const char *_String,_locale_t _Locale); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _strtoi64(const char *_String,char **_EndPtr,int _Radix); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _strtoi64_l(const char *_String,char **_EndPtr,int _Radix,_locale_t _Locale); + __MINGW_EXTENSION _CRTIMP unsigned __int64 __cdecl _strtoui64(const char *_String,char **_EndPtr,int _Radix); + __MINGW_EXTENSION _CRTIMP unsigned __int64 __cdecl _strtoui64_l(const char *_String,char **_EndPtr,int _Radix,_locale_t _Locale); #endif ldiv_t __cdecl ldiv(long _Numerator,long _Denominator); _CRTIMP char *__cdecl _ltoa(long _Value,char *_Dest,int _Radix); @@ -445,14 +445,14 @@ extern "C" { _CRTIMP long __cdecl _wtol_l(const wchar_t *_Str,_locale_t _Locale); #if _INTEGRAL_MAX_BITS >= 64 - _CRTIMP wchar_t *__cdecl _i64tow(__int64 _Val,wchar_t *_DstBuf,int _Radix); - _CRTIMP wchar_t *__cdecl _ui64tow(unsigned __int64 _Val,wchar_t *_DstBuf,int _Radix); - _CRTIMP __int64 __cdecl _wtoi64(const wchar_t *_Str); - _CRTIMP __int64 __cdecl _wtoi64_l(const wchar_t *_Str,_locale_t _Locale); - _CRTIMP __int64 __cdecl _wcstoi64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix); - _CRTIMP __int64 __cdecl _wcstoi64_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale); - _CRTIMP unsigned __int64 __cdecl _wcstoui64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix); - _CRTIMP unsigned __int64 __cdecl _wcstoui64_l(const wchar_t *_Str ,wchar_t **_EndPtr,int _Radix,_locale_t _Locale); + __MINGW_EXTENSION _CRTIMP wchar_t *__cdecl _i64tow(__int64 _Val,wchar_t *_DstBuf,int _Radix); + __MINGW_EXTENSION _CRTIMP wchar_t *__cdecl _ui64tow(unsigned __int64 _Val,wchar_t *_DstBuf,int _Radix); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wtoi64(const wchar_t *_Str); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wtoi64_l(const wchar_t *_Str,_locale_t _Locale); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wcstoi64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wcstoi64_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale); + __MINGW_EXTENSION _CRTIMP unsigned __int64 __cdecl _wcstoui64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix); + __MINGW_EXTENSION _CRTIMP unsigned __int64 __cdecl _wcstoui64_l(const wchar_t *_Str ,wchar_t **_EndPtr,int _Radix,_locale_t _Locale); #endif #endif @@ -480,11 +480,11 @@ extern "C" { _CRTIMP int __cdecl _putenv(const char *_EnvString); unsigned int __cdecl _rotl(unsigned int _Val,int _Shift); #if _INTEGRAL_MAX_BITS >= 64 - unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val,int _Shift); + __MINGW_EXTENSION unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val,int _Shift); #endif unsigned int __cdecl _rotr(unsigned int _Val,int _Shift); #if _INTEGRAL_MAX_BITS >= 64 - unsigned __int64 __cdecl _rotr64(unsigned __int64 _Val,int _Shift); + __MINGW_EXTENSION unsigned __int64 __cdecl _rotr64(unsigned __int64 _Val,int _Shift); #endif _CRTIMP void __cdecl _searchenv(const char *_Filename,const char *_EnvVar,char *_ResultPath); _CRTIMP void __cdecl _splitpath(const char *_FullPath,char *_Drive,char *_Dir,char *_Filename,char *_Ext); @@ -541,32 +541,32 @@ extern "C" { #if !defined __NO_ISOCEXT /* externs in static libmingwex.a */ - typedef struct { long long quot, rem; } lldiv_t; + __MINGW_EXTENSION typedef struct { long long quot, rem; } lldiv_t; - lldiv_t __cdecl lldiv(long long, long long); + __MINGW_EXTENSION lldiv_t __cdecl lldiv(long long, long long); - __CRT_INLINE long long __cdecl llabs(long long _j) { return (_j >= 0 ? _j : -_j); } + __MINGW_EXTENSION __CRT_INLINE long long __cdecl llabs(long long _j) { return (_j >= 0 ? _j : -_j); } - long long __cdecl strtoll(const char* __restrict__, char** __restrict, int); - unsigned long long __cdecl strtoull(const char* __restrict__, char** __restrict__, int); + __MINGW_EXTENSION long long __cdecl strtoll(const char* __restrict__, char** __restrict, int); + __MINGW_EXTENSION unsigned long long __cdecl strtoull(const char* __restrict__, char** __restrict__, int); /* these are stubs for MS _i64 versions */ - long long __cdecl atoll (const char *); + __MINGW_EXTENSION long long __cdecl atoll (const char *); #ifndef __STRICT_ANSI__ - long long __cdecl wtoll (const wchar_t *); - char *__cdecl lltoa (long long, char *, int); - char *__cdecl ulltoa (unsigned long long , char *, int); - wchar_t *__cdecl lltow (long long, wchar_t *, int); - wchar_t *__cdecl ulltow (unsigned long long, wchar_t *, int); + __MINGW_EXTENSION long long __cdecl wtoll (const wchar_t *); + __MINGW_EXTENSION char *__cdecl lltoa (long long, char *, int); + __MINGW_EXTENSION char *__cdecl ulltoa (unsigned long long , char *, int); + __MINGW_EXTENSION wchar_t *__cdecl lltow (long long, wchar_t *, int); + __MINGW_EXTENSION wchar_t *__cdecl ulltow (unsigned long long, wchar_t *, int); /* __CRT_INLINE using non-ansi functions */ - __CRT_INLINE long long __cdecl atoll (const char * _c) { return _atoi64 (_c); } - __CRT_INLINE char *__cdecl lltoa (long long _n, char * _c, int _i) { return _i64toa (_n, _c, _i); } - __CRT_INLINE char *__cdecl ulltoa (unsigned long long _n, char * _c, int _i) { return _ui64toa (_n, _c, _i); } - __CRT_INLINE long long __cdecl wtoll (const wchar_t * _w) { return _wtoi64 (_w); } - __CRT_INLINE wchar_t *__cdecl lltow (long long _n, wchar_t * _w, int _i) { return _i64tow (_n, _w, _i); } - __CRT_INLINE wchar_t *__cdecl ulltow (unsigned long long _n, wchar_t * _w, int _i) { return _ui64tow (_n, _w, _i); } + __MINGW_EXTENSION __CRT_INLINE long long __cdecl atoll (const char * _c) { return _atoi64 (_c); } + __MINGW_EXTENSION __CRT_INLINE char *__cdecl lltoa (long long _n, char * _c, int _i) { return _i64toa (_n, _c, _i); } + __MINGW_EXTENSION __CRT_INLINE char *__cdecl ulltoa (unsigned long long _n, char * _c, int _i) { return _ui64toa (_n, _c, _i); } + __MINGW_EXTENSION __CRT_INLINE long long __cdecl wtoll (const wchar_t * _w) { return _wtoi64 (_w); } + __MINGW_EXTENSION __CRT_INLINE wchar_t *__cdecl lltow (long long _n, wchar_t * _w, int _i) { return _i64tow (_n, _w, _i); } + __MINGW_EXTENSION __CRT_INLINE wchar_t *__cdecl ulltow (unsigned long long _n, wchar_t * _w, int _i) { return _ui64tow (_n, _w, _i); } #endif /* (__STRICT_ANSI__) */ #endif /* !__NO_ISOCEXT */ diff --git a/reactos/include/crt/tchar.h b/reactos/include/crt/tchar.h index 123f6d8d9dd..d7c31478341 100644 --- a/reactos/include/crt/tchar.h +++ b/reactos/include/crt/tchar.h @@ -108,10 +108,11 @@ extern "C" { typedef wint_t _TINT; #endif +#ifndef NO_OLDNAMES #ifndef _TCHAR_DEFINED #define _TCHAR_DEFINED -#ifndef NO_OLDNAMES - typedef wchar_t TCHAR; + typedef wchar_t TCHAR,*PTCHAR; + typedef wchar_t TBYTE,*PTBYTE; #endif #endif @@ -771,11 +772,12 @@ extern "C" { #define __TCHAR_DEFINED #endif +#ifndef NO_OLDNAMES #ifndef _TCHAR_DEFINED -#ifndef NO_OLDNAMES - typedef char TCHAR; -#endif #define _TCHAR_DEFINED + typedef char TCHAR,*PTCHAR; + typedef unsigned char TBYTE,*PTBYTE; +#endif #endif #ifdef _MB_MAP_DIRECT diff --git a/reactos/include/crt/time.h b/reactos/include/crt/time.h index 7e51c959144..49f23d82e97 100644 --- a/reactos/include/crt/time.h +++ b/reactos/include/crt/time.h @@ -29,7 +29,7 @@ extern "C" { #if defined(__GNUC__) && defined(__STRICT_ANSI__) typedef int _time64_t __attribute__ ((mode (DI))); #else - typedef __int64 __time64_t; + __MINGW_EXTENSION typedef __int64 __time64_t; #endif #endif #endif @@ -55,7 +55,7 @@ extern "C" { #if defined(__GNUC__) && defined(__STRICT_ANSI__) typedef unsigned int size_t __attribute__ ((mode (DI))); #else - typedef unsigned __int64 size_t; + __MINGW_EXTENSION typedef unsigned __int64 size_t; #endif #else typedef unsigned int size_t; diff --git a/reactos/include/crt/vadefs.h b/reactos/include/crt/vadefs.h index 280d0ffab7b..23a99200948 100644 --- a/reactos/include/crt/vadefs.h +++ b/reactos/include/crt/vadefs.h @@ -29,7 +29,7 @@ extern "C" { #if defined(__GNUC__) && defined(__STRICT_ANSI__) typedef unsigned int uintptr_t __attribute__ ((mode (DI))); #else - typedef unsigned __int64 uintptr_t; + __MINGW_EXTENSION typedef unsigned __int64 uintptr_t; #endif #else typedef unsigned long uintptr_t; diff --git a/reactos/include/crt/wchar.h b/reactos/include/crt/wchar.h index 5e4896fbf7a..dbcf4ef4f44 100644 --- a/reactos/include/crt/wchar.h +++ b/reactos/include/crt/wchar.h @@ -93,7 +93,7 @@ extern "C" { time_t time_create; time_t time_access; time_t time_write; - __int64 size; + __MINGW_EXTENSION __int64 size; wchar_t name[260]; }; @@ -102,7 +102,7 @@ extern "C" { __time32_t time_create; __time32_t time_access; __time32_t time_write; - __int64 size; + __MINGW_EXTENSION __int64 size; wchar_t name[260]; }; @@ -120,7 +120,7 @@ extern "C" { __time64_t time_create; __time64_t time_access; __time64_t time_write; - __int64 size; + __MINGW_EXTENSION __int64 size; wchar_t name[260]; }; #endif @@ -352,9 +352,9 @@ _CRTIMP int __cdecl iswblank(wint_t _C); #ifndef _OFF64_T_DEFINED #define _OFF64_T_DEFINED - typedef long long _off64_t; + __MINGW_EXTENSION typedef long long _off64_t; #ifndef NO_OLDNAMES - typedef long long off64_t; + __MINGW_EXTENSION typedef long long off64_t; #endif #endif @@ -415,7 +415,7 @@ _CRTIMP int __cdecl iswblank(wint_t _C); short st_uid; short st_gid; _dev_t st_rdev; - __int64 st_size; + __MINGW_EXTENSION __int64 st_size; __time32_t st_atime; __time32_t st_mtime; __time32_t st_ctime; @@ -443,7 +443,7 @@ _CRTIMP int __cdecl iswblank(wint_t _C); short st_uid; short st_gid; _dev_t st_rdev; - __int64 st_size; + __MINGW_EXTENSION __int64 st_size; __time64_t st_atime; __time64_t st_mtime; __time64_t st_ctime; @@ -645,14 +645,14 @@ _CRTIMP int __cdecl iswblank(wint_t _C); _CRTIMP long __cdecl _wtol_l(const wchar_t *_Str,_locale_t _Locale); #if _INTEGRAL_MAX_BITS >= 64 - _CRTIMP wchar_t *__cdecl _i64tow(__int64 _Val,wchar_t *_DstBuf,int _Radix); - _CRTIMP wchar_t *__cdecl _ui64tow(unsigned __int64 _Val,wchar_t *_DstBuf,int _Radix); - _CRTIMP __int64 __cdecl _wtoi64(const wchar_t *_Str); - _CRTIMP __int64 __cdecl _wtoi64_l(const wchar_t *_Str,_locale_t _Locale); - _CRTIMP __int64 __cdecl _wcstoi64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix); - _CRTIMP __int64 __cdecl _wcstoi64_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale); - _CRTIMP unsigned __int64 __cdecl _wcstoui64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix); - _CRTIMP unsigned __int64 __cdecl _wcstoui64_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale); + __MINGW_EXTENSION _CRTIMP wchar_t *__cdecl _i64tow(__int64 _Val,wchar_t *_DstBuf,int _Radix); + __MINGW_EXTENSION _CRTIMP wchar_t *__cdecl _ui64tow(unsigned __int64 _Val,wchar_t *_DstBuf,int _Radix); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wtoi64(const wchar_t *_Str); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wtoi64_l(const wchar_t *_Str,_locale_t _Locale); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wcstoi64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix); + __MINGW_EXTENSION _CRTIMP __int64 __cdecl _wcstoi64_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale); + __MINGW_EXTENSION _CRTIMP unsigned __int64 __cdecl _wcstoui64(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix); + __MINGW_EXTENSION _CRTIMP unsigned __int64 __cdecl _wcstoui64_l(const wchar_t *_Str,wchar_t **_EndPtr,int _Radix,_locale_t _Locale); #endif #endif @@ -792,8 +792,8 @@ __CRT_INLINE errno_t _wctime_s(wchar_t *_Buffer, size_t _SizeInWords,const time_ int wmemcmp(const wchar_t *s1, const wchar_t *s2,size_t n); wchar_t *__cdecl wmemcpy(wchar_t *s1,const wchar_t *s2,size_t n); wchar_t *__cdecl wmemmove(wchar_t *s1, const wchar_t *s2, size_t n); - long long __cdecl wcstoll(const wchar_t *nptr,wchar_t **endptr, int base); - unsigned long long __cdecl wcstoull(const wchar_t *nptr,wchar_t **endptr, int base); + __MINGW_EXTENSION long long __cdecl wcstoll(const wchar_t *nptr,wchar_t **endptr, int base); + __MINGW_EXTENSION unsigned long long __cdecl wcstoull(const wchar_t *nptr,wchar_t **endptr, int base); #endif /* __NO_ISOCEXT */ void *__cdecl memmove(void *_Dst,const void *_Src,size_t _MaxCount); diff --git a/reactos/include/crt/yvals.h b/reactos/include/crt/yvals.h index 9f994129243..10b812dac62 100644 --- a/reactos/include/crt/yvals.h +++ b/reactos/include/crt/yvals.h @@ -1,11 +1,13 @@ /** * This file has no copyright assigned and is placed in the Public Domain. * This file is part of the w64 mingw-runtime package. - * No warranty is given; refer to the file DISCLAIMER within this package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. */ #ifndef _YVALS #define _YVALS +#include <_mingw.h> +/* TODO, don't include crtdef.h. */ #include #pragma pack(push,_CRT_PACKING) @@ -168,10 +170,10 @@ typedef bool _Bool; _STD_END #endif -#define _LONGLONG __int64 -#define _ULONGLONG unsigned __int64 -#define _LLONG_MAX 0x7fffffffffffffff -#define _ULLONG_MAX 0xffffffffffffffff +#define _LONGLONG /* __MINGW_EXTENSION */ __int64 +#define _ULONGLONG /* __MINGW_EXTENSION */ unsigned __int64 +#define _LLONG_MAX 0x7fffffffffffffffLL +#define _ULLONG_MAX 0xffffffffffffffffULL #define _C2 1 @@ -179,8 +181,8 @@ _STD_END #define _MAX_INT_DIG 32 #define _MAX_SIG_DIG 36 -typedef _LONGLONG _Longlong; -typedef _ULONGLONG _ULonglong; +__MINGW_EXTENSION typedef _LONGLONG _Longlong; +__MINGW_EXTENSION typedef _ULONGLONG _ULonglong; #define _Filet _iobuf diff --git a/reactos/include/ddk/acpiioct.h b/reactos/include/ddk/acpiioct.h new file mode 100644 index 00000000000..a51cc3dd4b4 --- /dev/null +++ b/reactos/include/ddk/acpiioct.h @@ -0,0 +1,190 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#define ACPI_EVAL_INPUT_BUFFER_SIGNATURE 'BieA' +#define ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_SIGNATURE 'IieA' +#define ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING_SIGNATURE 'SieA' +#define ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE 'CieA' +#define ACPI_EVAL_OUTPUT_BUFFER_SIGNATURE 'BoeA' +#if (NTDDI_VERSION >= NTDDI_VISTA) +#define ACPI_EVAL_INPUT_BUFFER_SIGNATURE_EX 'AieA' +#define ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_SIGNATURE_EX 'DieA' +#define ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING_SIGNATURE_EX 'EieA' +#define ACPI_EVAL_INPUT_BUFFER_COMPLEX_SIGNATURE_EX 'FieA' +#define ACPI_ENUM_CHILDREN_OUTPUT_BUFFER_SIGNATURE 'GieA' +#define ACPI_ENUM_CHILDREN_INPUT_BUFFER_SIGNATURE 'HieA' +#endif + +#define ACPI_METHOD_ARGUMENT_INTEGER 0x0 +#define ACPI_METHOD_ARGUMENT_STRING 0x1 +#define ACPI_METHOD_ARGUMENT_BUFFER 0x2 +#define ACPI_METHOD_ARGUMENT_PACKAGE 0x3 +#define ACPI_METHOD_ARGUMENT_PACKAGE_EX 0x4 + +#define ACPI_ACQUIRE_GLOBAL_LOCK_SIGNATURE 'LgaA' +#define ACPI_RELEASE_GLOBAL_LOCK_SIGNATURE 'LgrA' + +#define ACPI_OBJECT_HAS_CHILDREN 0x1 + +#define ENUM_CHILDREN_IMMEDIATE_ONLY 0x1 +#define ENUM_CHILDREN_MULTILEVEL 0x2 +#define ENUM_CHILDREN_NAME_IS_FILTER 0x4 + +typedef struct _ACPI_EVAL_INPUT_BUFFER { + ULONG Signature; + union { + UCHAR MethodName[4]; + ULONG MethodNameAsUlong; + } DUMMYUNIONNAME; +} ACPI_EVAL_INPUT_BUFFER, *PACPI_EVAL_INPUT_BUFFER; + +typedef struct _ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER { + ULONG Signature; + union { + UCHAR MethodName[4]; + ULONG MethodNameAsUlong; + } DUMMYUNIONNAME; + ULONG IntegerArgument; +} ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER, *PACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER; + +typedef struct _ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING { + ULONG Signature; + union { + UCHAR MethodName[4]; + ULONG MethodNameAsUlong; + } DUMMYUNIONNAME; + ULONG StringLength; + UCHAR String[ANYSIZE_ARRAY]; +} ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING, *PACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING; + +typedef struct _ACPI_METHOD_ARGUMENT { + USHORT Type; + USHORT DataLength; + union { + ULONG Argument; + UCHAR Data[ANYSIZE_ARRAY]; + } DUMMYUNIONNAME; +} ACPI_METHOD_ARGUMENT; +typedef ACPI_METHOD_ARGUMENT UNALIGNED *PACPI_METHOD_ARGUMENT; + +typedef struct _ACPI_EVAL_INPUT_BUFFER_COMPLEX { + ULONG Signature; + union { + UCHAR MethodName[4]; + ULONG MethodNameAsUlong; + } DUMMYUNIONNAME; + ULONG Size; + ULONG ArgumentCount; + ACPI_METHOD_ARGUMENT Argument[ANYSIZE_ARRAY]; +} ACPI_EVAL_INPUT_BUFFER_COMPLEX, *PACPI_EVAL_INPUT_BUFFER_COMPLEX; + +typedef struct _ACPI_EVAL_OUTPUT_BUFFER { + ULONG Signature; + ULONG Length; + ULONG Count; + ACPI_METHOD_ARGUMENT Argument[ANYSIZE_ARRAY]; +} ACPI_EVAL_OUTPUT_BUFFER; +typedef ACPI_EVAL_OUTPUT_BUFFER UNALIGNED *PACPI_EVAL_OUTPUT_BUFFER; + +typedef struct _ACPI_MANIPULATE_GLOBAL_LOCK_BUFFER { + ULONG Signature; + PVOID LockObject; +} ACPI_MANIPULATE_GLOBAL_LOCK_BUFFER, *PACPI_MANIPULATE_GLOBAL_LOCK_BUFFER; + +typedef struct _ACPI_EVAL_INPUT_BUFFER_EX { + ULONG Signature; + CHAR MethodName[256]; +} ACPI_EVAL_INPUT_BUFFER_EX, *PACPI_EVAL_INPUT_BUFFER_EX; + +typedef struct _ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_EX { + ULONG Signature; + CHAR MethodName[256]; + ULONG64 IntegerArgument; +} ACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_EX, *PACPI_EVAL_INPUT_BUFFER_SIMPLE_INTEGER_EX; + +typedef struct _ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING_EX { + ULONG Signature; + CHAR MethodName[256]; + ULONG StringLength; + UCHAR String[ANYSIZE_ARRAY]; +} ACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING_EX, *PACPI_EVAL_INPUT_BUFFER_SIMPLE_STRING_EX; + +typedef struct _ACPI_EVAL_INPUT_BUFFER_COMPLEX_EX { + ULONG Signature; + CHAR MethodName[256]; + ULONG Size; + ULONG ArgumentCount; + ACPI_METHOD_ARGUMENT Argument[ANYSIZE_ARRAY]; +} ACPI_EVAL_INPUT_BUFFER_COMPLEX_EX, *PACPI_EVAL_INPUT_BUFFER_COMPLEX_EX; + +typedef struct _ACPI_ENUM_CHILDREN_INPUT_BUFFER { + ULONG Signature; + ULONG Flags; + ULONG NameLength; + CHAR Name[ANYSIZE_ARRAY]; +} ACPI_ENUM_CHILDREN_INPUT_BUFFER, *PACPI_ENUM_CHILDREN_INPUT_BUFFER; + +typedef struct _ACPI_ENUM_CHILD { + ULONG Flags; + ULONG NameLength; + CHAR Name[ANYSIZE_ARRAY]; +} ACPI_ENUM_CHILD; +typedef ACPI_ENUM_CHILD UNALIGNED *PACPI_ENUM_CHILD; + +typedef struct _ACPI_ENUM_CHILDREN_OUTPUT_BUFFER { + ULONG Signature; + ULONG NumberOfChildren; + ACPI_ENUM_CHILD Children[ANYSIZE_ARRAY]; +} ACPI_ENUM_CHILDREN_OUTPUT_BUFFER; +typedef ACPI_ENUM_CHILDREN_OUTPUT_BUFFER UNALIGNED *PACPI_ENUM_CHILDREN_OUTPUT_BUFFER; + +#define ACPI_METHOD_ARGUMENT_LENGTH( DataLength ) \ + (FIELD_OFFSET(ACPI_METHOD_ARGUMENT, Data) + max(sizeof(ULONG), DataLength)) + +#define ACPI_METHOD_ARGUMENT_LENGTH_FROM_ARGUMENT( Argument ) \ + (ACPI_METHOD_ARGUMENT_LENGTH(((PACPI_METHOD_ARGUMENT)Argument)->DataLength)) + +#define ACPI_METHOD_NEXT_ARGUMENT( Argument ) \ + (PACPI_METHOD_ARGUMENT) ( (PUCHAR) Argument + \ + ACPI_METHOD_ARGUMENT_LENGTH_FROM_ARGUMENT( Argument ) ) + + +#define ACPI_METHOD_SET_ARGUMENT_INTEGER( MethodArgument, IntData ) \ + { MethodArgument->Type = ACPI_METHOD_ARGUMENT_INTEGER; \ + MethodArgument->DataLength = sizeof(ULONG); \ + MethodArgument->Argument = IntData; } + +#define ACPI_METHOD_SET_ARGUMENT_STRING( Argument, StrData ) \ + { Argument->Type = ACPI_METHOD_ARGUMENT_STRING; \ + Argument->DataLength = strlen((PUCHAR)StrData) + sizeof(UCHAR); \ + RtlCopyMemory(&Argument->Data[0],(PUCHAR)StrData,Argument->DataLength); } + +#define ACPI_METHOD_SET_ARGUMENT_BUFFER( Argument, BuffData, BuffLength ) \ + { Argument->Type = ACPI_METHOD_ARGUMENT_BUFFER; \ + Argument->DataLength = BuffLength; \ + RtlCopyMemory(&Argument->Data[0],(PUCHAR)BuffData,Argument->DataLength); } + +#define ACPI_ENUM_CHILD_LENGTH_FROM_CHILD( Child ) \ + ( (2* sizeof (ULONG)) + Child->NameLength ) + +#define ACPI_ENUM_CHILD_NEXT( Child ) \ + (PACPI_ENUM_CHILD) ( (PUCHAR) Child + \ + ACPI_ENUM_CHILD_LENGTH_FROM_CHILD( Child ) ) + +#define IOCTL_ACPI_ASYNC_EVAL_METHOD CTL_CODE(FILE_DEVICE_ACPI, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_ACPI_EVAL_METHOD CTL_CODE(FILE_DEVICE_ACPI, 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_ACPI_ACQUIRE_GLOBAL_LOCK CTL_CODE(FILE_DEVICE_ACPI, 4, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_ACPI_RELEASE_GLOBAL_LOCK CTL_CODE(FILE_DEVICE_ACPI, 5, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#if (NTDDI_VERSION >= NTDDI_VISTA) +#define IOCTL_ACPI_EVAL_METHOD_EX CTL_CODE(FILE_DEVICE_ACPI, 6, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_ACPI_ASYNC_EVAL_METHOD_EX CTL_CODE(FILE_DEVICE_ACPI, 7, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_ACPI_ENUM_CHILDREN CTL_CODE(FILE_DEVICE_ACPI, 8, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#endif + +#ifdef __cplusplus +} +#endif diff --git a/reactos/include/ddk/bdasup.h b/reactos/include/ddk/bdasup.h index 0342ceaf696..0bdd590d337 100644 --- a/reactos/include/ddk/bdasup.h +++ b/reactos/include/ddk/bdasup.h @@ -2,6 +2,15 @@ extern "C" { #endif +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + #define STDMETHODCALLTYPE __stdcall typedef GUID *PGUID; @@ -26,6 +35,18 @@ typedef struct _BDA_FILTER_TEMPLATE const BDA_PIN_PAIRING *pPinPairs; } BDA_FILTER_TEMPLATE, *PBDA_FILTER_TEMPLATE; + +typedef struct _KSM_PIN +{ + KSMETHOD Method; + __GNU_EXTENSION union + { + ULONG PinId; + ULONG PinType; + }; + ULONG Reserved; +} KSM_PIN, * PKSM_PIN; + /* Functions */ STDMETHODIMP_(NTSTATUS) BdaCheckChanges(IN PIRP Irp); diff --git a/reactos/include/ddk/csq.h b/reactos/include/ddk/csq.h index e01e8336f6b..99056f610a8 100644 --- a/reactos/include/ddk/csq.h +++ b/reactos/include/ddk/csq.h @@ -1,7 +1,17 @@ /* * Cancel-Safe Queue Library - * Copyright (c) 2004, Vizzini (vizzini@plasmic.com) - * Licensed under the GNU GPL for the ReactOS project + * Created in 2004 by Vizzini (vizzini@plasmic.com) + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * * * This header defines the interface to the ReactOS Cancel-Safe Queue library. * This interface is based on and is similar to the Microsoft Cancel-Safe diff --git a/reactos/include/ddk/d3dhal.h b/reactos/include/ddk/d3dhal.h index 7cbe1e99dc5..d4ecc2ca4e9 100644 --- a/reactos/include/ddk/d3dhal.h +++ b/reactos/include/ddk/d3dhal.h @@ -22,6 +22,15 @@ #ifndef _D3DHAL_H_ #define _D3DHAL_H_ +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + #ifdef __cplusplus extern "C" { #endif @@ -787,7 +796,7 @@ typedef struct _DD_GETD3DQUERYCOUNTDATA typedef struct _DD_GETD3DQUERYDATA { DD_GETDRIVERINFO2DATA gdi2; - union + __GNU_EXTENSION union { DWORD dwQueryIndex; D3DQUERYTYPE QueryType; diff --git a/reactos/include/ddk/d3dnthal.h b/reactos/include/ddk/d3dnthal.h index b7bb06e9e1e..b396e6f23a3 100644 --- a/reactos/include/ddk/d3dnthal.h +++ b/reactos/include/ddk/d3dnthal.h @@ -9,6 +9,15 @@ #include #include +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + #ifdef __cplusplus extern "C" { #endif @@ -22,17 +31,17 @@ DEFINE_GUID(GUID_DDStereoMode, 0xF828169C, 0xA8E8, 0x11D2, 0xA typedef struct _D3DNTHAL_CONTEXTCREATEDATA { - union + __GNU_EXTENSION union { PDD_DIRECTDRAW_GLOBAL lpDDGbl; PDD_DIRECTDRAW_LOCAL lpDDLcl; }; - union + __GNU_EXTENSION union { PDD_SURFACE_LOCAL lpDDS; PDD_SURFACE_LOCAL lpDDSLcl; }; - union + __GNU_EXTENSION union { PDD_SURFACE_LOCAL lpDDSZ; PDD_SURFACE_LOCAL lpDDSZLcl; @@ -223,7 +232,7 @@ typedef struct _D3DNTHAL_DRAWPRIMITIVES2DATA PDD_SURFACE_LOCAL lpDDCommands; DWORD dwCommandOffset; DWORD dwCommandLength; - union + __GNU_EXTENSION union { PDD_SURFACE_LOCAL lpDDVertex; LPVOID lpVertices; @@ -233,7 +242,7 @@ typedef struct _D3DNTHAL_DRAWPRIMITIVES2DATA DWORD dwReqVertexBufSize; DWORD dwReqCommandBufSize; LPDWORD lpdwRStates; - union + __GNU_EXTENSION union { DWORD dwVertexSize; HRESULT ddrval; diff --git a/reactos/include/ddk/ddkmapi.h b/reactos/include/ddk/ddkmapi.h index 88d52ecf6c0..fdd23a9dc35 100644 --- a/reactos/include/ddk/ddkmapi.h +++ b/reactos/include/ddk/ddkmapi.h @@ -21,6 +21,14 @@ #ifndef __DDKMAPI_INCLUDED__ #define __DDKMAPI_INCLUDED__ +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif #if defined(_DXAPI_) #define DXAPI @@ -219,17 +227,17 @@ typedef struct _DDLOCKOUT DWORD dwFormatFlags; DWORD dwFormatFourCC; DWORD dwFormatBitCount; - union + __GNU_EXTENSION union { DWORD dwRBitMask; DWORD dwYBitMask; }; - union + __GNU_EXTENSION union { DWORD dwGBitMask; DWORD dwUBitMask; }; - union + __GNU_EXTENSION union { DWORD dwBBitMask; DWORD dwVBitMask; diff --git a/reactos/include/ddk/ddrawi.h b/reactos/include/ddk/ddrawi.h index a133f71d479..6b658ff5120 100644 --- a/reactos/include/ddk/ddrawi.h +++ b/reactos/include/ddk/ddrawi.h @@ -22,6 +22,15 @@ #ifndef __DDRAWI_INCLUDED__ #define __DDRAWI_INCLUDED__ +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + #ifdef __cplusplus extern "C" { #endif @@ -203,13 +212,13 @@ typedef struct _DDHALMODEINFO { typedef struct _VIDMEM { DWORD dwFlags; FLATPTR fpStart; - union { + __GNU_EXTENSION union { FLATPTR fpEnd; DWORD dwWidth; }; DDSCAPS ddsCaps; DDSCAPS ddsCapsAlt; - union { + __GNU_EXTENSION union { LPVMEMHEAP lpHeap; DWORD dwHeight; }; @@ -1404,21 +1413,21 @@ typedef struct _DDRAWI_DDRAWSURFACE_INT { typedef struct _DDRAWI_DDRAWSURFACE_GBL { DWORD dwRefCnt; DWORD dwGlobalFlags; - union { + __GNU_EXTENSION union { LPACCESSRECTLIST lpRectList; DWORD dwBlockSizeY; LONG lSlicePitch; }; - union { + __GNU_EXTENSION union { LPVMEMHEAP lpVidMemHeap; DWORD dwBlockSizeX; }; - union { + __GNU_EXTENSION union { LPDDRAWI_DIRECTDRAW_GBL lpDD; LPVOID lpDDHandle; }; FLATPTR fpVidMem; - union { + __GNU_EXTENSION union { LONG lPitch; DWORD dwLinearSize; }; @@ -1454,7 +1463,7 @@ typedef struct _DDRAWI_DDRAWSURFACE_GBL { typedef struct _DDRAWI_DDRAWSURFACE_GBL_MORE { DWORD dwSize; - union { + __GNU_EXTENSION union { DWORD dwPhysicalPageTable; FLATPTR fpPhysicalVidMem; }; @@ -1551,15 +1560,15 @@ typedef struct _DDRAWI_DDRAWSURFACE_LCL { DWORD dwProcessId; DWORD dwFlags; DDSCAPS ddsCaps; - union + __GNU_EXTENSION union { - LPDDRAWI_DDRAWPALETTE_INT lpDDPalette; + LPDDRAWI_DDRAWPALETTE_INT lpDDPalette; LPDDRAWI_DDRAWPALETTE_INT lp16DDPalette; - }; - union + }; + __GNU_EXTENSION union { - LPDDRAWI_DDRAWCLIPPER_LCL lpDDClipper; - LPDDRAWI_DDRAWCLIPPER_INT lp16DDClipper; + LPDDRAWI_DDRAWCLIPPER_LCL lpDDClipper; + LPDDRAWI_DDRAWCLIPPER_INT lp16DDClipper; }; DWORD dwModeCreatedIn; DWORD dwBackBufferCount; @@ -1628,7 +1637,7 @@ typedef struct _DDRAWI_DDRAWPALETTE_GBL { LPDDRAWI_DIRECTDRAW_LCL lpDD_lcl; DWORD dwProcessId; LPPALETTEENTRY lpColorTable; - union { + __GNU_EXTENSION union { ULONG_PTR dwReserved1; HPALETTE hHELGDIPalette; }; @@ -1762,7 +1771,7 @@ typedef struct _DDMCBUFFERINFO typedef struct _DDHAL_GETDRIVERSTATEDATA { DWORD dwFlags; - union + __GNU_EXTENSION union { ULONG_PTR dwhContext; }; diff --git a/reactos/include/ddk/ddrawint.h b/reactos/include/ddk/ddrawint.h index b1af17b6a0d..b78c209bc9d 100644 --- a/reactos/include/ddk/ddrawint.h +++ b/reactos/include/ddk/ddrawint.h @@ -5,6 +5,14 @@ #ifndef __DD_INCLUDED__ #define __DD_INCLUDED__ +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif DEFINE_GUID( GUID_MiscellaneousCallbacks, 0xEFD60CC0, 0x49e7, 0x11d0, 0x88, 0x9d, 0x0, 0xaa, 0x0, 0xbb, 0xb7, 0x6a); DEFINE_GUID( GUID_Miscellaneous2Callbacks, 0x406B2F00, 0x3E5A, 0x11D1, 0xB6, 0x40, 0x00, 0xAA, 0x00, 0xA1, 0xF9, 0x6A); @@ -81,14 +89,14 @@ typedef struct _VIDEOMEMORY { DWORD dwFlags; FLATPTR fpStart; - union + __GNU_EXTENSION union { FLATPTR fpEnd; DWORD dwWidth; }; DDSCAPS ddsCaps; DDSCAPS ddsCapsAlt; - union + __GNU_EXTENSION union { struct _VMEMHEAP *lpHeap; DWORD dwHeight; @@ -128,13 +136,13 @@ typedef struct _DD_DIRECTDRAW_LOCAL typedef struct _DD_SURFACE_GLOBAL { - union + __GNU_EXTENSION union { DWORD dwBlockSizeY; LONG lSlicePitch; }; - union + __GNU_EXTENSION union { PVIDEOMEMORY lpVidMemHeap; DWORD dwBlockSizeX; @@ -142,7 +150,7 @@ typedef struct _DD_SURFACE_GLOBAL }; FLATPTR fpVidMem; - union + __GNU_EXTENSION union { LONG lPitch; DWORD dwLinearSize; @@ -174,12 +182,12 @@ typedef struct _DD_SURFACE_LOCAL DWORD dwFlags; DDSCAPS ddsCaps; ULONG_PTR dwReserved1; - union + __GNU_EXTENSION union { DDCOLORKEY ddckCKSrcOverlay; DDCOLORKEY ddckCKSrcBlt; }; - union + __GNU_EXTENSION union { DDCOLORKEY ddckCKDestOverlay; DDCOLORKEY ddckCKDestBlt; @@ -591,7 +599,7 @@ typedef DWORD (WINAPI *PDD_CREATESURFACEEX)(PDD_CREATESURFACEEXDATA); typedef struct _DD_GETDRIVERSTATEDATA { DWORD dwFlags; - union + __GNU_EXTENSION union { PDD_DIRECTDRAW_GLOBAL lpDD; DWORD_PTR dwhContext; diff --git a/reactos/include/ddk/dmemmgr.h b/reactos/include/ddk/dmemmgr.h index ee9b0a9a561..3d11f0b559c 100644 --- a/reactos/include/ddk/dmemmgr.h +++ b/reactos/include/ddk/dmemmgr.h @@ -12,6 +12,15 @@ #ifndef __DMEMMGR_INCLUDED__ #define __DMEMMGR_INCLUDED__ +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + #ifdef __cplusplus extern "C" { #endif @@ -70,7 +79,7 @@ typedef struct _VMEMR typedef struct _SURFACEALIGNMENT { - union + __GNU_EXTENSION union { struct { diff --git a/reactos/include/ddk/hubbusif.h b/reactos/include/ddk/hubbusif.h new file mode 100644 index 00000000000..e03f19edbb8 --- /dev/null +++ b/reactos/include/ddk/hubbusif.h @@ -0,0 +1,782 @@ +#pragma once + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +typedef PVOID PUSB_DEVICE_HANDLE; + +typedef struct _ROOTHUB_PDO_EXTENSION { + ULONG Signature; +} ROOTHUB_PDO_EXTENSION, *PROOTHUB_PDO_EXTENSION; + +#define USBD_DEVHACK_SLOW_ENUMERATION 0x00000001 +#define USBD_DEVHACK_DISABLE_SN 0x00000002 +#define USBD_DEVHACK_SET_DIAG_ID 0x00000004 + +#ifndef USB_BUSIFFN +#define USB_BUSIFFN __stdcall +#endif + +#define CD_ERR_V1 0x00000001 + +#define ID_ERR_V1 0x00000001 + +#define USBD_KEEP_DEVICE_DATA 0x00000001 +#define USBD_MARK_DEVICE_BUSY 0x00000002 + +#define USB_IDLE_NOT_READY 0 +#define USB_IDLE_READY 1 + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_CREATE_USB_DEVICE ( + IN PVOID BusContext, + OUT PUSB_DEVICE_HANDLE *NewDeviceHandle, + IN PUSB_DEVICE_HANDLE HubDeviceHandle, + IN USHORT PortStatus, + IN USHORT PortNumber); + +typedef USB_BUSIFFN_CREATE_USB_DEVICE *PUSB_BUSIFFN_CREATE_USB_DEVICE; + +typedef enum _USBPORT_CREATEDEV_ERROR { + CreateDevErrNotSet = 0, + CreateDevBadHubDevHandle, + CreateDevFailedAllocDevHandle, + CreateDevFailedOpenEndpoint, + CreateDevFailedAllocDsBuff, + CreateDevFailedGetDs, + CreateDevTtNotFound, + CreateDevBadDevHandlePtr +} USBPORT_CREATEDEV_ERROR; + +typedef struct _USB_CD_ERROR_INFORMATION { + ULONG Version; + USBPORT_CREATEDEV_ERROR PathError; + ULONG UlongArg1; + ULONG UlongArg2; + NTSTATUS NtStatus; + UCHAR XtraInfo[64]; +} USB_CD_ERROR_INFORMATION, *PUSB_CD_ERROR_INFORMATION; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_CREATE_USB_DEVICE_EX ( + IN PVOID BusContext, + OUT PUSB_DEVICE_HANDLE *NewDeviceHandle, + IN PUSB_DEVICE_HANDLE HsHubDeviceHandle, + IN USHORT PortStatus, + IN USHORT PortNumber, + OUT PUSB_CD_ERROR_INFORMATION CdErrorInfo, + IN USHORT TtPortNumber); + +typedef USB_BUSIFFN_CREATE_USB_DEVICE_EX *PUSB_BUSIFFN_CREATE_USB_DEVICE_EX; + +typedef struct _USB_PORT_PATH { + ULONG PortPathDepth; + ULONG PortPath[6]; +} USB_PORT_PATH, *PUSB_PORT_PATH; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_CREATE_USB_DEVICE_V7 ( + IN PVOID BusContext, + OUT PUSB_DEVICE_HANDLE *NewDeviceHandle, + IN PUSB_DEVICE_HANDLE HsHubDeviceHandle, + IN USHORT PortStatus, + IN PUSB_PORT_PATH PortPath, + OUT PUSB_CD_ERROR_INFORMATION CdErrorInfo, + IN USHORT TtPortNumber, + IN PDEVICE_OBJECT PdoDeviceObject, + IN PUNICODE_STRING PhysicalDeviceObjectName); + +typedef USB_BUSIFFN_CREATE_USB_DEVICE_V7 *PUSB_BUSIFFN_CREATE_USB_DEVICE_V7; + +typedef enum _USBPORT_INITDEV_ERROR { + InitDevErrNotSet = 0, + InitDevFailedSetAddress, + InitDevFailedPokeEndpoint, + InitDevBadDeviceDescriptor +} USBPORT_INITDEV_ERROR; + +typedef struct _USB_ID_ERROR_INFORMATION { + ULONG Version; + USBPORT_INITDEV_ERROR PathError; + ULONG Arg1; + ULONG UsbAddress; + NTSTATUS NtStatus; + USBD_STATUS UsbdStatus; + UCHAR XtraInfo[64]; +} USB_ID_ERROR_INFORMATION, *PUSB_ID_ERROR_INFORMATION; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_INITIALIZE_USB_DEVICE ( + IN PVOID BusContext, + IN OUT PUSB_DEVICE_HANDLE DeviceHandle); + +typedef USB_BUSIFFN_INITIALIZE_USB_DEVICE *PUSB_BUSIFFN_INITIALIZE_USB_DEVICE; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_INITIALIZE_USB_DEVICE_EX ( + IN PVOID BusContext, + IN OUT PUSB_DEVICE_HANDLE DeviceHandle, + OUT PUSB_ID_ERROR_INFORMATION IdErrInfo); + +typedef USB_BUSIFFN_INITIALIZE_USB_DEVICE_EX *PUSB_BUSIFFN_INITIALIZE_USB_DEVICE_EX; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_REMOVE_USB_DEVICE ( + IN PVOID BusContext, + IN OUT PUSB_DEVICE_HANDLE DeviceHandle, + IN ULONG Flags); + +typedef USB_BUSIFFN_REMOVE_USB_DEVICE *PUSB_BUSIFFN_REMOVE_USB_DEVICE; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_GET_USB_DESCRIPTORS ( + IN PVOID BusContext, + IN OUT PUSB_DEVICE_HANDLE DeviceHandle, + OUT PUCHAR DeviceDescriptorBuffer, + IN OUT PULONG DeviceDescriptorBufferLength, + OUT PUCHAR ConfigDescriptorBuffer, + IN OUT PULONG ConfigDescriptorBufferLength); + +typedef USB_BUSIFFN_GET_USB_DESCRIPTORS *PUSB_BUSIFFN_GET_USB_DESCRIPTORS; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_RESTORE_DEVICE ( + IN PVOID BusContext, + IN OUT PUSB_DEVICE_HANDLE OldDeviceHandle, + IN OUT PUSB_DEVICE_HANDLE NewDeviceHandle); + +typedef USB_BUSIFFN_RESTORE_DEVICE *PUSB_BUSIFFN_RESTORE_DEVICE; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_GET_POTRTHACK_FLAGS ( + IN PVOID BusContext, + IN OUT PULONG Flags); + +typedef USB_BUSIFFN_GET_POTRTHACK_FLAGS *PUSB_BUSIFFN_GET_POTRTHACK_FLAGS; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_GET_DEVICE_INFORMATION ( + IN PVOID BusContext, + IN PUSB_DEVICE_HANDLE DeviceHandle, + OUT PVOID DeviceInformationBuffer, + IN ULONG DeviceInformationBufferLength, + IN OUT PULONG LengthOfDataCopied); + +typedef USB_BUSIFFN_GET_DEVICE_INFORMATION *PUSB_BUSIFFN_GET_DEVICE_INFORMATION; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_GET_CONTROLLER_INFORMATION ( + IN PVOID BusContext, + IN OUT PVOID ControllerInformationBuffer, + IN ULONG ControllerInformationBufferLength, + IN OUT PULONG LengthOfDataCopied); + +typedef USB_BUSIFFN_GET_CONTROLLER_INFORMATION *PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ( + IN PVOID BusContext, + IN BOOLEAN Enable); + +typedef USB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND *PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_GET_EXTENDED_HUB_INFO ( + IN PVOID BusContext, + IN PDEVICE_OBJECT HubPhysicalDeviceObject, + IN PVOID HubInformationBuffer, + IN ULONG HubInformationBufferLength, + OUT PULONG LengthOfDataCopied); + +typedef USB_BUSIFFN_GET_EXTENDED_HUB_INFO *PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_GET_ROOTHUB_SYM_NAME ( + IN PVOID BusContext, + IN PVOID HubSymNameBuffer, + IN ULONG HubSymNameBufferLength, + OUT PULONG HubSymNameActualLength); + +typedef USB_BUSIFFN_GET_ROOTHUB_SYM_NAME *PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME; + +typedef +PVOID +USB_BUSIFFN +USB_BUSIFFN_GET_DEVICE_BUSCONTEXT ( + IN PVOID HubBusContext, + IN PVOID DeviceHandle); + +typedef USB_BUSIFFN_GET_DEVICE_BUSCONTEXT *PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_INITIALIZE_20HUB ( + IN PVOID BusContext, + IN PUSB_DEVICE_HANDLE HubDeviceHandle, + IN ULONG TtCount); + +typedef USB_BUSIFFN_INITIALIZE_20HUB *PUSB_BUSIFFN_INITIALIZE_20HUB; + +typedef +BOOLEAN +USB_BUSIFFN +USB_BUSIFFN_IS_ROOT ( + IN PVOID BusContext, + IN PVOID DeviceObject); + +typedef USB_BUSIFFN_IS_ROOT *PUSB_BUSIFFN_IS_ROOT; + +typedef +VOID +USB_BUSIFFN +USB_BUSIFFN_ACQUIRE_SEMAPHORE ( + IN PVOID BusContext); + +typedef USB_BUSIFFN_ACQUIRE_SEMAPHORE *PUSB_BUSIFFN_ACQUIRE_SEMAPHORE; + +typedef +VOID +USB_BUSIFFN +USB_BUSIFFN_RELEASE_SEMAPHORE ( + IN PVOID BusContext); + +typedef USB_BUSIFFN_RELEASE_SEMAPHORE *PUSB_BUSIFFN_RELEASE_SEMAPHORE; + +typedef +VOID +__stdcall +RH_INIT_CALLBACK ( + IN PVOID CallBackContext); + +typedef RH_INIT_CALLBACK *PRH_INIT_CALLBACK; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_ROOTHUB_INIT_NOTIFY ( + IN PVOID BusContext, + IN PVOID CallbackContext, + IN PRH_INIT_CALLBACK CallbackRoutine); + +typedef USB_BUSIFFN_ROOTHUB_INIT_NOTIFY *PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY; + +typedef +VOID +USB_BUSIFFN +USB_BUSIFFN_FLUSH_TRANSFERS ( + IN PVOID BusContext, + IN PVOID DeviceHandle); + +typedef USB_BUSIFFN_FLUSH_TRANSFERS *PUSB_BUSIFFN_FLUSH_TRANSFERS; + +typedef +ULONG +USB_BUSIFFN +USB_BUSIFFN_CALC_PIPE_BANDWIDTH ( + IN PVOID BusContext, + IN PUSBD_PIPE_INFORMATION PipeInfo, + IN USB_DEVICE_SPEED DeviceSpeed); + +typedef USB_BUSIFFN_CALC_PIPE_BANDWIDTH *PUSB_BUSIFFN_CALC_PIPE_BANDWIDTH; + +typedef +VOID +USB_BUSIFFN +USB_BUSIFFN_SET_BUS_WAKE_MODE ( + IN PVOID BusContext, + IN ULONG Mode); + +typedef USB_BUSIFFN_SET_BUS_WAKE_MODE *PUSB_BUSIFFN_SET_BUS_WAKE_MODE; + +typedef +VOID +USB_BUSIFFN +USB_BUSIFFN_SET_DEVICE_FLAG ( + IN PVOID BusContext, + IN GUID *DeviceFlagGuid, + IN PVOID ValueData, + IN ULONG ValueLength); + +typedef USB_BUSIFFN_SET_DEVICE_FLAG *PUSB_BUSIFFN_SET_DEVICE_FLAG; + +typedef +VOID +USB_BUSIFFN +USB_BUSIFFN_SET_DEVHANDLE_DATA ( + IN PVOID BusContext, + IN PVOID DeviceHandle, + IN PDEVICE_OBJECT UsbDevicePdo); + +typedef USB_BUSIFFN_SET_DEVHANDLE_DATA *PUSB_BUSIFFN_SET_DEVHANDLE_DATA; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_TEST_POINT ( + IN PVOID BusContext, + IN PVOID DeviceHandle, + IN ULONG Opcode, + IN PVOID TestData); + +typedef USB_BUSIFFN_TEST_POINT *PUSB_BUSIFFN_TEST_POINT; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO ( + IN PVOID BusContext, + IN PUSB_DEVICE_HANDLE DeviceHandle, + OUT PVOID DeviceInformationBuffer, + IN ULONG DeviceInformationBufferLength, + IN OUT PULONG LengthOfDataCopied); + +typedef USB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO *PUSB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_WAIT_ASYNC_POWERUP ( + IN PVOID BusContext); + +typedef USB_BUSIFFN_WAIT_ASYNC_POWERUP *PUSB_BUSIFFN_WAIT_ASYNC_POWERUP; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_GET_DEVICE_ADDRESS ( + IN PVOID BusContext, + IN PUSB_DEVICE_HANDLE DeviceHandle, + OUT PUSHORT DeviceAddress); + +typedef USB_BUSIFFN_GET_DEVICE_ADDRESS *PUSB_BUSIFFN_GET_DEVICE_ADDRESS; + +typedef +VOID +USB_BUSIFFN +USB_BUSIFFN_DEREF_DEVICE_HANDLE ( + IN PVOID BusContext, + IN PUSB_DEVICE_HANDLE DeviceHandle, + IN PVOID Object, + IN ULONG Tag); + +typedef USB_BUSIFFN_DEREF_DEVICE_HANDLE *PUSB_BUSIFFN_DEREF_DEVICE_HANDLE; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_REF_DEVICE_HANDLE ( + IN PVOID BusContext, + IN PUSB_DEVICE_HANDLE DeviceHandle, + IN PVOID Object, + IN ULONG Tag); + +typedef USB_BUSIFFN_REF_DEVICE_HANDLE *PUSB_BUSIFFN_REF_DEVICE_HANDLE; + +typedef +ULONG +USB_BUSIFFN +USB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE ( + IN PVOID BusContext, + IN PUSB_DEVICE_HANDLE DeviceHandle, + IN ULONG NewIdleReadyState); + +typedef USB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE *PUSB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT ( + IN PVOID BusContext, + IN USHORT PortNumber, + OUT LPGUID ContainerId); + +typedef USB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT *PUSB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT; + +typedef +VOID +USB_BUSIFFN +USB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT ( + IN PVOID BusContext, + IN USHORT PortNumber, + IN LPGUID ContainerId); + +typedef USB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT *PUSB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT; + +typedef +NTSTATUS +USB_BUSIFFN +USB_BUSIFFN_ABORT_ALL_DEVICE_PIPES ( + IN PVOID BusContext, + IN PUSB_DEVICE_HANDLE DeviceHandle); + +typedef USB_BUSIFFN_ABORT_ALL_DEVICE_PIPES *PUSB_BUSIFFN_ABORT_ALL_DEVICE_PIPES; + +#define ERRATA_FLAG_RESET_TT_ON_CANCEL 1 +#define ERRATA_FLAG_NO_CLEAR_TT_BUFFER_ON_CANCEL 2 + +#define USB_BUSIF_HUB_VERSION_0 0x0000 +#define USB_BUSIF_HUB_VERSION_1 0x0001 +#define USB_BUSIF_HUB_VERSION_2 0x0002 +#define USB_BUSIF_HUB_VERSION_3 0x0003 +#define USB_BUSIF_HUB_VERSION_4 0x0004 +#define USB_BUSIF_HUB_VERSION_5 0x0005 +#define USB_BUSIF_HUB_VERSION_6 0x0006 +#define USB_BUSIF_HUB_VERSION_7 0x0007 + +#define USB_BUSIF_HUB_MIDUMP_VERSION_0 0x0000 + +#define USB_BUSIF_HUB_SS_VERSION_0 0x0000 + +typedef +VOID +USB_BUSIFFN +USB_BUSIFFN_SET_DEVICE_ERRATA_FLAG ( + IN PVOID BusContext, + IN PUSB_DEVICE_HANDLE DeviceHandle, + IN ULONG DeviceErrataFlag); + +typedef USB_BUSIFFN_SET_DEVICE_ERRATA_FLAG *PUSB_BUSIFFN_SET_DEVICE_ERRATA_FLAG; + +DEFINE_GUID(USB_BUS_INTERFACE_HUB_GUID, +0xb2bb8c0a, 0x5ab4, 0x11d3, 0xa8, 0xcd, 0x0, 0xc0, 0x4f, 0x68, 0x74, 0x7a); + +typedef struct _USB_BUS_INTERFACE_HUB_V0 { + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; +} USB_BUS_INTERFACE_HUB_V0, *PUSB_BUS_INTERFACE_HUB_V0; + +typedef struct _USB_BUS_INTERFACE_HUB_V1 { + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice; + PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice; + PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors; + PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice; + PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice; + PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags; + PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation; +} USB_BUS_INTERFACE_HUB_V1, *PUSB_BUS_INTERFACE_HUB_V1; + +typedef struct _USB_BUS_INTERFACE_HUB_V2 { + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice; + PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice; + PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors; + PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice; + PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice; + PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags; + PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation; + PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation; + PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend; + PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation; + PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName; + PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext; + PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub; +} USB_BUS_INTERFACE_HUB_V2, *PUSB_BUS_INTERFACE_HUB_V2; + +typedef struct _USB_BUS_INTERFACE_HUB_V3 { + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice; + PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice; + PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors; + PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice; + PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice; + PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags; + PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation; + PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation; + PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend; + PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation; + PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName; + PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext; + PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub; + PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification; +} USB_BUS_INTERFACE_HUB_V3, *PUSB_BUS_INTERFACE_HUB_V3; + +typedef struct _USB_BUS_INTERFACE_HUB_V4 { + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice; + PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice; + PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors; + PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice; + PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice; + PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags; + PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation; + PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation; + PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend; + PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation; + PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName; + PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext; + PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub; + PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification; + PUSB_BUSIFFN_FLUSH_TRANSFERS FlushTransfers; +} USB_BUS_INTERFACE_HUB_V4, *PUSB_BUS_INTERFACE_HUB_V4; + +typedef struct _USB_BUS_INTERFACE_HUB_V5 { + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PUSB_BUSIFFN_CREATE_USB_DEVICE CreateUsbDevice; + PUSB_BUSIFFN_INITIALIZE_USB_DEVICE InitializeUsbDevice; + PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors; + PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice; + PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice; + PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags; + PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation; + PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation; + PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend; + PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation; + PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName; + PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext; + PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub; + PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification; + PUSB_BUSIFFN_FLUSH_TRANSFERS FlushTransfers; + PUSB_BUSIFFN_SET_DEVHANDLE_DATA SetDeviceHandleData; +} USB_BUS_INTERFACE_HUB_V5, *PUSB_BUS_INTERFACE_HUB_V5; + +typedef struct _USB_BUS_INTERFACE_HUB_V6 { + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PUSB_BUSIFFN_CREATE_USB_DEVICE_EX CreateUsbDevice; + PUSB_BUSIFFN_INITIALIZE_USB_DEVICE_EX InitializeUsbDevice; + PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors; + PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice; + PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice; + PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags; + PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation; + PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation; + PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend; + PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation; + PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName; + PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext; + PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub; + PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification; + PUSB_BUSIFFN_FLUSH_TRANSFERS FlushTransfers; + PUSB_BUSIFFN_SET_DEVHANDLE_DATA SetDeviceHandleData; + PUSB_BUSIFFN_IS_ROOT HubIsRoot; + PUSB_BUSIFFN_ACQUIRE_SEMAPHORE AcquireBusSemaphore; + PUSB_BUSIFFN_RELEASE_SEMAPHORE ReleaseBusSemaphore; + PUSB_BUSIFFN_CALC_PIPE_BANDWIDTH CaculatePipeBandwidth; + PUSB_BUSIFFN_SET_BUS_WAKE_MODE SetBusSystemWakeMode; + PUSB_BUSIFFN_SET_DEVICE_FLAG SetDeviceFlag; + PUSB_BUSIFFN_TEST_POINT HubTestPoint; + PUSB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO GetDevicePerformanceInfo; + PUSB_BUSIFFN_WAIT_ASYNC_POWERUP WaitAsyncPowerUp; + PUSB_BUSIFFN_GET_DEVICE_ADDRESS GetDeviceAddress; + PUSB_BUSIFFN_REF_DEVICE_HANDLE RefDeviceHandle; + PUSB_BUSIFFN_DEREF_DEVICE_HANDLE DerefDeviceHandle; + PUSB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE SetDeviceHandleIdleReadyState; +} USB_BUS_INTERFACE_HUB_V6, *PUSB_BUS_INTERFACE_HUB_V6; + +typedef struct _USB_BUS_INTERFACE_HUB_V7 { + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PUSB_BUSIFFN_CREATE_USB_DEVICE_EX CreateUsbDevice; + PUSB_BUSIFFN_INITIALIZE_USB_DEVICE_EX InitializeUsbDevice; + PUSB_BUSIFFN_GET_USB_DESCRIPTORS GetUsbDescriptors; + PUSB_BUSIFFN_REMOVE_USB_DEVICE RemoveUsbDevice; + PUSB_BUSIFFN_RESTORE_DEVICE RestoreUsbDevice; + PUSB_BUSIFFN_GET_POTRTHACK_FLAGS GetPortHackFlags; + PUSB_BUSIFFN_GET_DEVICE_INFORMATION QueryDeviceInformation; + PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION GetControllerInformation; + PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ControllerSelectiveSuspend; + PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO GetExtendedHubInformation; + PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME GetRootHubSymbolicName; + PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT GetDeviceBusContext; + PUSB_BUSIFFN_INITIALIZE_20HUB Initialize20Hub; + PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY RootHubInitNotification; + PUSB_BUSIFFN_FLUSH_TRANSFERS FlushTransfers; + PUSB_BUSIFFN_SET_DEVHANDLE_DATA SetDeviceHandleData; + PUSB_BUSIFFN_IS_ROOT HubIsRoot; + PUSB_BUSIFFN_ACQUIRE_SEMAPHORE AcquireBusSemaphore; + PUSB_BUSIFFN_RELEASE_SEMAPHORE ReleaseBusSemaphore; + PUSB_BUSIFFN_CALC_PIPE_BANDWIDTH CaculatePipeBandwidth; + PUSB_BUSIFFN_SET_BUS_WAKE_MODE SetBusSystemWakeMode; + PUSB_BUSIFFN_SET_DEVICE_FLAG SetDeviceFlag; + PUSB_BUSIFFN_TEST_POINT HubTestPoint; + PUSB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO GetDevicePerformanceInfo; + PUSB_BUSIFFN_WAIT_ASYNC_POWERUP WaitAsyncPowerUp; + PUSB_BUSIFFN_GET_DEVICE_ADDRESS GetDeviceAddress; + PUSB_BUSIFFN_REF_DEVICE_HANDLE RefDeviceHandle; + PUSB_BUSIFFN_DEREF_DEVICE_HANDLE DerefDeviceHandle; + PUSB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE SetDeviceHandleIdleReadyState; + PUSB_BUSIFFN_CREATE_USB_DEVICE_V7 CreateUsbDeviceV7; + PUSB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT GetContainerIdForPort; + PUSB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT SetContainerIdForPort; + PUSB_BUSIFFN_ABORT_ALL_DEVICE_PIPES AbortAllDevicePipes; + PUSB_BUSIFFN_SET_DEVICE_ERRATA_FLAG SetDeviceErrataFlag; +} USB_BUS_INTERFACE_HUB_V7, *PUSB_BUS_INTERFACE_HUB_V7; + +DEFINE_GUID(USB_BUS_INTERFACE_HUB_MINIDUMP_GUID, +0xc5485f21, 0x4e81, 0x4a23, 0xa8, 0xf9, 0xd8, 0x51, 0x8a, 0xf4, 0x5c, 0x38); + +typedef VOID +(USB_BUSIFFN *PUSB_BUSIFFN_SET_MINIDUMP_FLAGS) ( + IN PVOID); + +typedef struct _USB_BUS_INTERFACE_HUB_MINIDUMP { + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PUSB_BUSIFFN_SET_MINIDUMP_FLAGS SetUsbPortMiniDumpFlags; +} USB_BUS_INTERFACE_HUB_MINIDUMP, *PUSB_BUS_INTERFACE_HUB_MINIDUMP; + +DEFINE_GUID(USB_BUS_INTERFACE_HUB_SS_GUID, +0xbfc3f363, 0x8ba1, 0x4c7b, 0x97, 0xba, 0x9b, 0x12, 0xb1, 0xca, 0x13, 0x2f); + +typedef NTSTATUS +(USB_BUSIFFN *PUSB_BUSIFFN_SUSPEND_HUB) ( + PDEVICE_OBJECT Pdo); + +typedef NTSTATUS +(USB_BUSIFFN *PUSB_BUSIFFN_RESUME_HUB) ( + PDEVICE_OBJECT Pdo); + +typedef struct _USB_BUS_INTERFACE_HUB_SELECTIVE_SUSPEND { + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PUSB_BUSIFFN_SUSPEND_HUB SuspendHub; + PUSB_BUSIFFN_RESUME_HUB ResumeHub; +} USB_BUS_INTERFACE_HUB_SELECTIVE_SUSPEND, *PUSB_BUS_INTERFACE_HUB_SELECTIVE_SUSPEND; + +#include + +typedef struct _USB_PIPE_INFORMATION_0 { + USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; + UCHAR ED_Pad[1]; + ULONG ScheduleOffset; +} USB_PIPE_INFORMATION_0, *PUSB_PIPE_INFORMATION_0; + +typedef struct _USB_LEVEL_INFORMATION { + ULONG InformationLevel; + ULONG ActualLength; +} USB_LEVEL_INFORMATION, *PUSB_LEVEL_INFORMATION; + +typedef struct _USB_DEVICE_INFORMATION_0 { + ULONG InformationLevel; + ULONG ActualLength; + ULONG PortNumber; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; + UCHAR DD_pad[2]; + UCHAR CurrentConfigurationValue; + UCHAR ReservedMBZ; + USHORT DeviceAddress; + ULONG HubAddress; + USB_DEVICE_SPEED DeviceSpeed; + USB_DEVICE_TYPE DeviceType; + ULONG NumberOfOpenPipes; + USB_PIPE_INFORMATION_0 PipeList[1]; +} USB_DEVICE_INFORMATION_0, *PUSB_DEVICE_INFORMATION_0; + +typedef struct _USB_CONTROLLER_INFORMATION_0 { + ULONG InformationLevel; + ULONG ActualLength; + BOOLEAN SelectiveSuspendEnabled; + BOOLEAN IsHighSpeedController; +} USB_CONTROLLER_INFORMATION_0, *PUSB_CONTROLLER_INFORMATION_0; + +typedef struct _USB_CONTROLLER_INFORMATION_1 { + ULONG InformationLevel; + ULONG ActualLength; + BOOLEAN SelectiveSuspendEnabled; + BOOLEAN IsHighSpeedController; + ULONG HcBusNumber; + ULONG HcBusDevice; + ULONG HcBusFunction; +} USB_CONTROLLER_INFORMATION_1, *PUSB_CONTROLLER_INFORMATION_1; + +typedef struct _USB_EXTPORT_INFORMATION_0 { + ULONG PhysicalPortNumber; + ULONG PortLabelNumber; + USHORT VidOverride; + USHORT PidOverride; + ULONG PortAttributes; +} USB_EXTPORT_INFORMATION_0, *PUSB_EXTPORT_INFORMATION; + +typedef struct _USB_EXTHUB_INFORMATION_0 { + ULONG InformationLevel; + ULONG NumberOfPorts; + USB_EXTPORT_INFORMATION_0 Port[255]; +} USB_EXTHUB_INFORMATION_0, *PUSB_EXTHUB_INFORMATION_0; + +typedef struct _USB_DEVICE_PERFORMANCE_INFO_0 { + ULONG InformationLevel; + ULONG ActualLength; + ULONG BulkBytes; + ULONG BulkUrbCount; + ULONG ControlDataBytes; + ULONG ControlUrbCount; + ULONG IsoBytes; + ULONG IsoUrbCount; + ULONG InterruptBytes; + ULONG InterruptUrbCount; + ULONG AllocedInterrupt[6]; + ULONG AllocedIso; + ULONG Total32secBandwidth; + ULONG TotalTtBandwidth; + ULONG TotalIsoLatency; + ULONG DroppedIsoPackets; + ULONG TransferErrors; +} USB_DEVICE_PERFORMANCE_INFO_0, *PUSB_DEVICE_PERFORMANCE_INFO_0; + +#include + +#endif diff --git a/reactos/include/ddk/ide.h b/reactos/include/ddk/ide.h index 83da58a5948..5744a3fc0eb 100644 --- a/reactos/include/ddk/ide.h +++ b/reactos/include/ddk/ide.h @@ -23,6 +23,15 @@ #ifndef __IDE_H #define __IDE_H +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + #ifdef __cplusplus extern "C" { #endif @@ -104,7 +113,7 @@ typedef struct _EXTENDED_IDENTIFY_DATA { USHORT UnformattedBytesPerTrack; /* 08 */ USHORT UnformattedBytesPerSector; /* 10 */ USHORT NumSectorsPerTrack; /* 12 */ - union + __GNU_EXTENSION union { USHORT VendorUnique1[3]; /* 14 */ struct diff --git a/reactos/include/ddk/ioaccess.h b/reactos/include/ddk/ioaccess.h index f9776bfdc36..0f1877f6c19 100755 --- a/reactos/include/ddk/ioaccess.h +++ b/reactos/include/ddk/ioaccess.h @@ -41,6 +41,8 @@ extern "C" { #define WRITE_PORT_USHORT(p, v) __outword (H2I(p), (v)) #define WRITE_PORT_ULONG(p, v) __outdword (H2I(p), (v)) +#define MEMORY_BARRIER() + #elif defined(_PPC_) || defined(_MIPS_) || defined(_ARM_) #define READ_REGISTER_UCHAR(r) (*(volatile UCHAR * const)(r)) diff --git a/reactos/include/ddk/miniport.h b/reactos/include/ddk/miniport.h index b147c25a62b..59fcc52a16e 100644 --- a/reactos/include/ddk/miniport.h +++ b/reactos/include/ddk/miniport.h @@ -63,6 +63,193 @@ typedef VOID IN ULONG ReadBank, IN ULONG WriteBank, IN PVOID Context); + +#ifndef __BROKEN__ + +typedef enum _INTERFACE_TYPE { + InterfaceTypeUndefined = -1, + Internal, + Isa, + Eisa, + MicroChannel, + TurboChannel, + PCIBus, + VMEBus, + NuBus, + PCMCIABus, + CBus, + MPIBus, + MPSABus, + ProcessorInternal, + InternalPowerBus, + PNPISABus, + PNPBus, + Vmcs, + MaximumInterfaceType +}INTERFACE_TYPE, *PINTERFACE_TYPE; + +typedef enum _KINTERRUPT_MODE { + LevelSensitive, + Latched +} KINTERRUPT_MODE; + +typedef VOID (*PINTERFACE_REFERENCE)(PVOID Context); +typedef VOID (*PINTERFACE_DEREFERENCE)(PVOID Context); + +typedef enum _BUS_DATA_TYPE { + ConfigurationSpaceUndefined = -1, + Cmos, + EisaConfiguration, + Pos, + CbusConfiguration, + PCIConfiguration, + VMEConfiguration, + NuBusConfiguration, + PCMCIAConfiguration, + MPIConfiguration, + MPSAConfiguration, + PNPISAConfiguration, + SgiInternalConfiguration, + MaximumBusDataType +} BUS_DATA_TYPE, *PBUS_DATA_TYPE; + +typedef enum _DMA_WIDTH { + Width8Bits, + Width16Bits, + Width32Bits, + MaximumDmaWidth +}DMA_WIDTH, *PDMA_WIDTH; + +typedef enum _DMA_SPEED { + Compatible, + TypeA, + TypeB, + TypeC, + TypeF, + MaximumDmaSpeed +}DMA_SPEED, *PDMA_SPEED; + +typedef struct _INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; +} INTERFACE, *PINTERFACE; + +typedef enum _IRQ_DEVICE_POLICY { + IrqPolicyMachineDefault = 0, + IrqPolicyAllCloseProcessors, + IrqPolicyOneCloseProcessor, + IrqPolicyAllProcessorsInMachine, + IrqPolicySpecifiedProcessors, + IrqPolicySpreadMessagesAcrossAllProcessors +} IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY; + +typedef enum _IRQ_PRIORITY { + IrqPriorityUndefined = 0, + IrqPriorityLow, + IrqPriorityNormal, + IrqPriorityHigh +} IRQ_PRIORITY, *PIRQ_PRIORITY; + +typedef struct _IO_RESOURCE_DESCRIPTOR { + UCHAR Option; + UCHAR Type; // use CM_RESOURCE_TYPE + UCHAR ShareDisposition; // use CM_SHARE_DISPOSITION + UCHAR Spare1; + USHORT Flags; // use CM resource flag defines + USHORT Spare2; // align + + union { + struct { + ULONG Length; + ULONG Alignment; + PHYSICAL_ADDRESS MinimumAddress; + PHYSICAL_ADDRESS MaximumAddress; + } Port; + + struct { + ULONG Length; + ULONG Alignment; + PHYSICAL_ADDRESS MinimumAddress; + PHYSICAL_ADDRESS MaximumAddress; + } Memory; + + struct { + ULONG MinimumVector; + ULONG MaximumVector; + IRQ_DEVICE_POLICY AffinityPolicy; + IRQ_PRIORITY PriorityPolicy; + KAFFINITY TargetedProcessors; + } Interrupt; + + struct { + ULONG MinimumChannel; + ULONG MaximumChannel; + } Dma; + + struct { + ULONG Length; + ULONG Alignment; + PHYSICAL_ADDRESS MinimumAddress; + PHYSICAL_ADDRESS MaximumAddress; + } Generic; + + struct { + ULONG Data[3]; + } DevicePrivate; + + // + // Bus Number information. + // + + struct { + ULONG Length; + ULONG MinBusNumber; + ULONG MaxBusNumber; + ULONG Reserved; + } BusNumber; + + struct { + ULONG Priority; // use LCPRI_Xxx values in cfg.h + ULONG Reserved1; + ULONG Reserved2; + } ConfigData; + + // + // The following structures provide descriptions + // for memory resource requirement greater than MAXULONG + // + + struct { + ULONG Length40; + ULONG Alignment40; + PHYSICAL_ADDRESS MinimumAddress; + PHYSICAL_ADDRESS MaximumAddress; + } Memory40; + + struct { + ULONG Length48; + ULONG Alignment48; + PHYSICAL_ADDRESS MinimumAddress; + PHYSICAL_ADDRESS MaximumAddress; + } Memory48; + + struct { + ULONG Length64; + ULONG Alignment64; + PHYSICAL_ADDRESS MinimumAddress; + PHYSICAL_ADDRESS MaximumAddress; + } Memory64; + + + } u; + +} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR; + +#include +#endif #ifdef __cplusplus } diff --git a/reactos/include/ddk/minitape.h b/reactos/include/ddk/minitape.h index f1d2b224087..d8f7532f32e 100644 --- a/reactos/include/ddk/minitape.h +++ b/reactos/include/ddk/minitape.h @@ -22,6 +22,15 @@ #ifndef __MINITAPE_H #define __MINITAPE_H +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + #ifdef __cplusplus extern "C" { #endif @@ -77,9 +86,9 @@ typedef struct _INQUIRYDATA { UCHAR DeviceTypeQualifier : 3; UCHAR DeviceTypeModifier : 7; UCHAR RemovableMedia : 1; - union { + __GNU_EXTENSION union { UCHAR Versions; - struct { + __GNU_EXTENSION struct { UCHAR ANSIVersion : 3; UCHAR ECMAVersion : 3; UCHAR ISOVersion : 2; diff --git a/reactos/include/ddk/ndis.h b/reactos/include/ddk/ndis.h index 023b1035a59..b08fb683b8c 100644 --- a/reactos/include/ddk/ndis.h +++ b/reactos/include/ddk/ndis.h @@ -32,6 +32,15 @@ #ifndef __NDIS_H #define __NDIS_H +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + #include "ntddk.h" #include "ntddndis.h" #include "netpnp.h" @@ -238,8 +247,8 @@ typedef union _NDIS_RW_LOCK_REFCOUNT { } NDIS_RW_LOCK_REFCOUNT; typedef struct _NDIS_RW_LOCK { - union { - struct { + __GNU_EXTENSION union { + __GNU_EXTENSION struct { KSPIN_LOCK SpinLock; PVOID Context; }; @@ -380,16 +389,16 @@ typedef struct _NDIS_PACKET_PRIVATE { typedef struct _NDIS_PACKET { NDIS_PACKET_PRIVATE Private; - union { - struct { + __GNU_EXTENSION union { + __GNU_EXTENSION struct { UCHAR MiniportReserved[2 * sizeof(PVOID)]; UCHAR WrapperReserved[2 * sizeof(PVOID)]; }; - struct { + __GNU_EXTENSION struct { UCHAR MiniportReservedEx[3 * sizeof(PVOID)]; UCHAR WrapperReservedEx[sizeof(PVOID)]; }; - struct { + __GNU_EXTENSION struct { UCHAR MacReserved[4 * sizeof(PVOID)]; }; }; @@ -474,7 +483,7 @@ typedef struct _NDIS_REQUEST { } DATA; #if (defined(NDIS50) || defined(NDIS51)) UCHAR NdisReserved[9 * sizeof(PVOID)]; - union { + __GNU_EXTENSION union { UCHAR CallMgrReserved[2 * sizeof(PVOID)]; UCHAR ProtocolReserved[2 * sizeof(PVOID)]; }; diff --git a/reactos/include/ddk/ntdddisk.h b/reactos/include/ddk/ntdddisk.h index 716609b7f98..c475f2cfff9 100644 --- a/reactos/include/ddk/ntdddisk.h +++ b/reactos/include/ddk/ntdddisk.h @@ -23,6 +23,15 @@ #ifndef __NTDDDISK_H #define __NTDDDISK_H +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + #include "ntddstor.h" #ifdef __cplusplus @@ -326,6 +335,12 @@ typedef struct _PARTITION_INFORMATION_GPT { WCHAR Name [36]; } PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT; +typedef enum _PARTITION_STYLE { + PARTITION_STYLE_MBR, + PARTITION_STYLE_GPT, + PARTITION_STYLE_RAW +} PARTITION_STYLE; + typedef struct _DISK_PARTITION_INFO { ULONG SizeOfPartitionInfo; PARTITION_STYLE PartitionStyle; @@ -394,7 +409,7 @@ typedef struct _DRIVE_LAYOUT_INFORMATION_GPT { typedef struct _DRIVE_LAYOUT_INFORMATION_EX { ULONG PartitionStyle; ULONG PartitionCount; - union { + __GNU_EXTENSION union { DRIVE_LAYOUT_INFORMATION_MBR Mbr; DRIVE_LAYOUT_INFORMATION_GPT Gpt; }; diff --git a/reactos/include/ddk/ntddk.h b/reactos/include/ddk/ntddk.h index ab3ec379939..0475b3acc85 100644 --- a/reactos/include/ddk/ntddk.h +++ b/reactos/include/ddk/ntddk.h @@ -27,19 +27,38 @@ #ifndef _NTDDK_ #define _NTDDK_ -// -// Dependencies -// +#if !defined(_NTHAL_) && !defined(_NTIFS_) +#define _NTDDK_INCLUDED_ +#define _DDK_DRIVER_ +#endif + +/* Dependencies */ + #define NT_INCLUDED +#define _CTYPE_DISABLE_MACROS + #include #include #include #include +/* FIXME +#include +#include +*/ + #include // FIXME #include // FIXME +#ifdef __cplusplus +extern "C" { +#endif + +struct _LOADER_PARAMETER_BLOCK; +struct _CREATE_DISK; +struct _DRIVE_LAYOUT_INFORMATION_EX; +struct _SET_PARTITION_INFORMATION_EX; // // GUID and UUID @@ -49,9 +68,2876 @@ #endif typedef GUID UUID; +typedef struct _BUS_HANDLER *PBUS_HANDLER; -/* Windows Device Driver Kit */ -#include "winddk.h" +#define EXCEPTION_READ_FAULT 0 +#define EXCEPTION_WRITE_FAULT 1 +#define EXCEPTION_EXECUTE_FAULT 8 + +#if (NTDDI_VERSION >= NTDDI_VISTA) +extern NTSYSAPI volatile CCHAR KeNumberProcessors; +#elif (NTDDI_VERSION >= NTDDI_WINXP) +extern NTSYSAPI CCHAR KeNumberProcessors; +#else +extern PCCHAR KeNumberProcessors; +#endif + +#define MAX_WOW64_SHARED_ENTRIES 16 + +#define NX_SUPPORT_POLICY_ALWAYSOFF 0 +#define NX_SUPPORT_POLICY_ALWAYSON 1 +#define NX_SUPPORT_POLICY_OPTIN 2 +#define NX_SUPPORT_POLICY_OPTOUT 3 + +/* +** IRP function codes +*/ + +#define IRP_MN_QUERY_DIRECTORY 0x01 +#define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02 + +#define IRP_MN_USER_FS_REQUEST 0x00 +#define IRP_MN_MOUNT_VOLUME 0x01 +#define IRP_MN_VERIFY_VOLUME 0x02 +#define IRP_MN_LOAD_FILE_SYSTEM 0x03 +#define IRP_MN_TRACK_LINK 0x04 +#define IRP_MN_KERNEL_CALL 0x04 + +#define IRP_MN_LOCK 0x01 +#define IRP_MN_UNLOCK_SINGLE 0x02 +#define IRP_MN_UNLOCK_ALL 0x03 +#define IRP_MN_UNLOCK_ALL_BY_KEY 0x04 + +#define IRP_MN_FLUSH_AND_PURGE 0x01 + +#define IRP_MN_NORMAL 0x00 +#define IRP_MN_DPC 0x01 +#define IRP_MN_MDL 0x02 +#define IRP_MN_COMPLETE 0x04 +#define IRP_MN_COMPRESSED 0x08 + +#define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC) +#define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL) +#define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC) + +#define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18 + +typedef struct _IO_COUNTERS { + ULONGLONG ReadOperationCount; + ULONGLONG WriteOperationCount; + ULONGLONG OtherOperationCount; + ULONGLONG ReadTransferCount; + ULONGLONG WriteTransferCount; + ULONGLONG OtherTransferCount; +} IO_COUNTERS, *PIO_COUNTERS; + +typedef struct _VM_COUNTERS { + SIZE_T PeakVirtualSize; + SIZE_T VirtualSize; + ULONG PageFaultCount; + SIZE_T PeakWorkingSetSize; + SIZE_T WorkingSetSize; + SIZE_T QuotaPeakPagedPoolUsage; + SIZE_T QuotaPagedPoolUsage; + SIZE_T QuotaPeakNonPagedPoolUsage; + SIZE_T QuotaNonPagedPoolUsage; + SIZE_T PagefileUsage; + SIZE_T PeakPagefileUsage; +} VM_COUNTERS, *PVM_COUNTERS; + +typedef struct _VM_COUNTERS_EX +{ + SIZE_T PeakVirtualSize; + SIZE_T VirtualSize; + ULONG PageFaultCount; + SIZE_T PeakWorkingSetSize; + SIZE_T WorkingSetSize; + SIZE_T QuotaPeakPagedPoolUsage; + SIZE_T QuotaPagedPoolUsage; + SIZE_T QuotaPeakNonPagedPoolUsage; + SIZE_T QuotaNonPagedPoolUsage; + SIZE_T PagefileUsage; + SIZE_T PeakPagefileUsage; + SIZE_T PrivateUsage; +} VM_COUNTERS_EX, *PVM_COUNTERS_EX; + +typedef struct _POOLED_USAGE_AND_LIMITS +{ + SIZE_T PeakPagedPoolUsage; + SIZE_T PagedPoolUsage; + SIZE_T PagedPoolLimit; + SIZE_T PeakNonPagedPoolUsage; + SIZE_T NonPagedPoolUsage; + SIZE_T NonPagedPoolLimit; + SIZE_T PeakPagefileUsage; + SIZE_T PagefileUsage; + SIZE_T PagefileLimit; +} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS; + +/* DEVICE_OBJECT.Flags */ + +#define DO_VERIFY_VOLUME 0x00000002 +#define DO_BUFFERED_IO 0x00000004 +#define DO_EXCLUSIVE 0x00000008 +#define DO_DIRECT_IO 0x00000010 +#define DO_MAP_IO_BUFFER 0x00000020 +#define DO_DEVICE_HAS_NAME 0x00000040 +#define DO_DEVICE_INITIALIZING 0x00000080 +#define DO_SYSTEM_BOOT_PARTITION 0x00000100 +#define DO_LONG_TERM_REQUESTS 0x00000200 +#define DO_NEVER_LAST_DEVICE 0x00000400 +#define DO_SHUTDOWN_REGISTERED 0x00000800 +#define DO_BUS_ENUMERATED_DEVICE 0x00001000 +#define DO_POWER_PAGABLE 0x00002000 +#define DO_POWER_INRUSH 0x00004000 +#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000 +#define DO_SUPPORTS_TRANSACTIONS 0x00040000 +#define DO_FORCE_NEITHER_IO 0x00080000 +#define DO_VOLUME_DEVICE_OBJECT 0x00100000 +#define DO_SYSTEM_SYSTEM_PARTITION 0x00200000 +#define DO_SYSTEM_CRITICAL_PARTITION 0x00400000 +#define DO_DISALLOW_EXECUTE 0x00800000 + +#define DRVO_REINIT_REGISTERED 0x00000008 +#define DRVO_INITIALIZED 0x00000010 +#define DRVO_BOOTREINIT_REGISTERED 0x00000020 +#define DRVO_LEGACY_RESOURCES 0x00000040 + +typedef enum _ARBITER_REQUEST_SOURCE { + ArbiterRequestUndefined = -1, + ArbiterRequestLegacyReported, + ArbiterRequestHalReported, + ArbiterRequestLegacyAssigned, + ArbiterRequestPnpDetected, + ArbiterRequestPnpEnumerated +} ARBITER_REQUEST_SOURCE; + +typedef enum _ARBITER_RESULT { + ArbiterResultUndefined = -1, + ArbiterResultSuccess, + ArbiterResultExternalConflict, + ArbiterResultNullRequest +} ARBITER_RESULT; + +typedef enum _ARBITER_ACTION { + ArbiterActionTestAllocation, + ArbiterActionRetestAllocation, + ArbiterActionCommitAllocation, + ArbiterActionRollbackAllocation, + ArbiterActionQueryAllocatedResources, + ArbiterActionWriteReservedResources, + ArbiterActionQueryConflict, + ArbiterActionQueryArbitrate, + ArbiterActionAddReserved, + ArbiterActionBootAllocation +} ARBITER_ACTION, *PARBITER_ACTION; + +typedef struct _ARBITER_CONFLICT_INFO { + PDEVICE_OBJECT OwningObject; + ULONGLONG Start; + ULONGLONG End; +} ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO; + +typedef struct _ARBITER_PARAMETERS { + union { + struct { + IN OUT PLIST_ENTRY ArbitrationList; + IN ULONG AllocateFromCount; + IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom; + } TestAllocation; + struct { + IN OUT PLIST_ENTRY ArbitrationList; + IN ULONG AllocateFromCount; + IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom; + } RetestAllocation; + struct { + IN OUT PLIST_ENTRY ArbitrationList; + } BootAllocation; + struct { + OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources; + } QueryAllocatedResources; + struct { + IN PDEVICE_OBJECT PhysicalDeviceObject; + IN PIO_RESOURCE_DESCRIPTOR ConflictingResource; + OUT PULONG ConflictCount; + OUT PARBITER_CONFLICT_INFO *Conflicts; + } QueryConflict; + struct { + IN PLIST_ENTRY ArbitrationList; + } QueryArbitrate; + struct { + IN PDEVICE_OBJECT ReserveDevice; + } AddReserved; + } Parameters; +} ARBITER_PARAMETERS, *PARBITER_PARAMETERS; + +#define ARBITER_FLAG_BOOT_CONFIG 0x00000001 + +typedef struct _ARBITER_LIST_ENTRY { + LIST_ENTRY ListEntry; + ULONG AlternativeCount; + PIO_RESOURCE_DESCRIPTOR Alternatives; + PDEVICE_OBJECT PhysicalDeviceObject; + ARBITER_REQUEST_SOURCE RequestSource; + ULONG Flags; + LONG_PTR WorkSpace; + INTERFACE_TYPE InterfaceType; + ULONG SlotNumber; + ULONG BusNumber; + PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment; + PIO_RESOURCE_DESCRIPTOR SelectedAlternative; + ARBITER_RESULT Result; +} ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY; + +typedef NTSTATUS +(NTAPI *PARBITER_HANDLER)( + IN OUT PVOID Context, + IN ARBITER_ACTION Action, + IN OUT PARBITER_PARAMETERS Parameters); + +#define ARBITER_PARTIAL 0x00000001 + +typedef struct _ARBITER_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PARBITER_HANDLER ArbiterHandler; + ULONG Flags; +} ARBITER_INTERFACE, *PARBITER_INTERFACE; + +typedef enum _HAL_QUERY_INFORMATION_CLASS { + HalInstalledBusInformation, + HalProfileSourceInformation, + HalInformationClassUnused1, + HalPowerInformation, + HalProcessorSpeedInformation, + HalCallbackInformation, + HalMapRegisterInformation, + HalMcaLogInformation, + HalFrameBufferCachingInformation, + HalDisplayBiosInformation, + HalProcessorFeatureInformation, + HalNumaTopologyInterface, + HalErrorInformation, + HalCmcLogInformation, + HalCpeLogInformation, + HalQueryMcaInterface, + HalQueryAMLIIllegalIOPortAddresses, + HalQueryMaxHotPlugMemoryAddress, + HalPartitionIpiInterface, + HalPlatformInformation, + HalQueryProfileSourceList, + HalInitLogInformation, + HalFrequencyInformation, + HalProcessorBrandString, + HalHypervisorInformation, + HalPlatformTimerInformation, + HalAcpiAuditInformation +} HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS; + +typedef enum _HAL_SET_INFORMATION_CLASS { + HalProfileSourceInterval, + HalProfileSourceInterruptHandler, + HalMcaRegisterDriver, + HalKernelErrorHandler, + HalCmcRegisterDriver, + HalCpeRegisterDriver, + HalMcaLog, + HalCmcLog, + HalCpeLog, + HalGenerateCmcInterrupt, + HalProfileSourceTimerHandler, + HalEnlightenment, + HalProfileDpgoSourceInterruptHandler +} HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS; + +typedef struct _HAL_PROFILE_SOURCE_INTERVAL { + KPROFILE_SOURCE Source; + ULONG_PTR Interval; +} HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL; + +typedef struct _HAL_PROFILE_SOURCE_INFORMATION { + KPROFILE_SOURCE Source; + BOOLEAN Supported; + ULONG Interval; +} HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION; + +typedef struct _MAP_REGISTER_ENTRY { + PVOID MapRegister; + BOOLEAN WriteToDevice; +} MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY; + +typedef struct _DEBUG_DEVICE_ADDRESS { + UCHAR Type; + BOOLEAN Valid; + UCHAR Reserved[2]; + PUCHAR TranslatedAddress; + ULONG Length; +} DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS; + +typedef struct _DEBUG_MEMORY_REQUIREMENTS { + PHYSICAL_ADDRESS Start; + PHYSICAL_ADDRESS MaxEnd; + PVOID VirtualAddress; + ULONG Length; + BOOLEAN Cached; + BOOLEAN Aligned; +} DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS; + +typedef struct _DEBUG_DEVICE_DESCRIPTOR { + ULONG Bus; + ULONG Slot; + USHORT Segment; + USHORT VendorID; + USHORT DeviceID; + UCHAR BaseClass; + UCHAR SubClass; + UCHAR ProgIf; + BOOLEAN Initialized; + BOOLEAN Configured; + DEBUG_DEVICE_ADDRESS BaseAddress[6]; + DEBUG_MEMORY_REQUIREMENTS Memory; +} DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR; + +typedef struct _PM_DISPATCH_TABLE { + ULONG Signature; + ULONG Version; + PVOID Function[1]; +} PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE; + +typedef enum _RESOURCE_TRANSLATION_DIRECTION { + TranslateChildToParent, + TranslateParentToChild +} RESOURCE_TRANSLATION_DIRECTION; + +typedef NTSTATUS +(NTAPI *PTRANSLATE_RESOURCE_HANDLER)( + IN OUT PVOID Context, + IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, + IN RESOURCE_TRANSLATION_DIRECTION Direction, + IN ULONG AlternativesCount OPTIONAL, + IN IO_RESOURCE_DESCRIPTOR Alternatives[], + IN PDEVICE_OBJECT PhysicalDeviceObject, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target); + +typedef NTSTATUS +(NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)( + IN PVOID Context OPTIONAL, + IN PIO_RESOURCE_DESCRIPTOR Source, + IN PDEVICE_OBJECT PhysicalDeviceObject, + OUT PULONG TargetCount, + OUT PIO_RESOURCE_DESCRIPTOR *Target); + +typedef struct _TRANSLATOR_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PTRANSLATE_RESOURCE_HANDLER TranslateResources; + PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements; +} TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE; + +typedef VOID +(FASTCALL *pHalExamineMBR)( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG MBRTypeIdentifier, + OUT PVOID *Buffer); + +typedef NTSTATUS +(FASTCALL *pHalIoReadPartitionTable)( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN BOOLEAN ReturnRecognizedPartitions, + OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); + +typedef NTSTATUS +(FASTCALL *pHalIoSetPartitionInformation)( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG PartitionNumber, + IN ULONG PartitionType); + +typedef NTSTATUS +(FASTCALL *pHalIoWritePartitionTable)( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG SectorsPerTrack, + IN ULONG NumberOfHeads, + IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); + +typedef PBUS_HANDLER +(FASTCALL *pHalHandlerForBus)( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber); + +typedef VOID +(FASTCALL *pHalReferenceBusHandler)( + IN PBUS_HANDLER BusHandler); + +typedef NTSTATUS +(NTAPI *pHalQuerySystemInformation)( + IN HAL_QUERY_INFORMATION_CLASS InformationClass, + IN ULONG BufferSize, + IN OUT PVOID Buffer, + OUT PULONG ReturnedLength); + +typedef NTSTATUS +(NTAPI *pHalSetSystemInformation)( + IN HAL_SET_INFORMATION_CLASS InformationClass, + IN ULONG BufferSize, + IN PVOID Buffer); + +typedef NTSTATUS +(NTAPI *pHalQueryBusSlots)( + IN PBUS_HANDLER BusHandler, + IN ULONG BufferSize, + OUT PULONG SlotNumbers, + OUT PULONG ReturnedLength); + +typedef NTSTATUS +(NTAPI *pHalInitPnpDriver)( + VOID); + +typedef NTSTATUS +(NTAPI *pHalInitPowerManagement)( + IN PPM_DISPATCH_TABLE PmDriverDispatchTable, + OUT PPM_DISPATCH_TABLE *PmHalDispatchTable); + +typedef struct _DMA_ADAPTER* +(NTAPI *pHalGetDmaAdapter)( + IN PVOID Context, + IN struct _DEVICE_DESCRIPTION *DeviceDescriptor, + OUT PULONG NumberOfMapRegisters); + +typedef NTSTATUS +(NTAPI *pHalGetInterruptTranslator)( + IN INTERFACE_TYPE ParentInterfaceType, + IN ULONG ParentBusNumber, + IN INTERFACE_TYPE BridgeInterfaceType, + IN USHORT Size, + IN USHORT Version, + OUT PTRANSLATOR_INTERFACE Translator, + OUT PULONG BridgeBusNumber); + +typedef NTSTATUS +(NTAPI *pHalStartMirroring)( + VOID); + +typedef NTSTATUS +(NTAPI *pHalEndMirroring)( + IN ULONG PassNumber); + +typedef NTSTATUS +(NTAPI *pHalMirrorPhysicalMemory)( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN LARGE_INTEGER NumberOfBytes); + +typedef NTSTATUS +(NTAPI *pHalMirrorVerify)( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN LARGE_INTEGER NumberOfBytes); + +typedef VOID +(NTAPI *pHalEndOfBoot)( + VOID); + +typedef +BOOLEAN +(NTAPI *pHalTranslateBusAddress)( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN PHYSICAL_ADDRESS BusAddress, + IN OUT PULONG AddressSpace, + OUT PPHYSICAL_ADDRESS TranslatedAddress); + +typedef +NTSTATUS +(NTAPI *pHalAssignSlotResources)( + IN PUNICODE_STRING RegistryPath, + IN PUNICODE_STRING DriverClassName OPTIONAL, + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceObject, + IN INTERFACE_TYPE BusType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN OUT PCM_RESOURCE_LIST *AllocatedResources); + +typedef +VOID +(NTAPI *pHalHaltSystem)( + VOID); + +typedef +BOOLEAN +(NTAPI *pHalResetDisplay)( + VOID); + +typedef +UCHAR +(NTAPI *pHalVectorToIDTEntry)( + ULONG Vector); + +typedef +BOOLEAN +(NTAPI *pHalFindBusAddressTranslation)( + IN PHYSICAL_ADDRESS BusAddress, + IN OUT PULONG AddressSpace, + OUT PPHYSICAL_ADDRESS TranslatedAddress, + IN OUT PULONG_PTR Context, + IN BOOLEAN NextBus); + +typedef +NTSTATUS +(NTAPI *pKdSetupPciDeviceForDebugging)( + IN PVOID LoaderBlock OPTIONAL, + IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); + +typedef +NTSTATUS +(NTAPI *pKdReleasePciDeviceForDebugging)( + IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); + +typedef +PVOID +(NTAPI *pKdGetAcpiTablePhase0)( + IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, + IN ULONG Signature); + +typedef +PVOID +(NTAPI *pHalGetAcpiTable)( + IN ULONG Signature, + IN PCSTR OemId OPTIONAL, + IN PCSTR OemTableId OPTIONAL); + +typedef +VOID +(NTAPI *pKdCheckPowerButton)( + VOID); + +#if (NTDDI_VERSION >= NTDDI_VISTA) +typedef +PVOID +(NTAPI *pKdMapPhysicalMemory64)( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG NumberPages, + IN BOOLEAN FlushCurrentTLB); + +typedef +VOID +(NTAPI *pKdUnmapVirtualAddress)( + IN PVOID VirtualAddress, + IN ULONG NumberPages, + IN BOOLEAN FlushCurrentTLB); +#else +typedef +PVOID +(NTAPI *pKdMapPhysicalMemory64)( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG NumberPages); + +typedef +VOID +(NTAPI *pKdUnmapVirtualAddress)( + IN PVOID VirtualAddress, + IN ULONG NumberPages); +#endif + + +typedef +ULONG +(NTAPI *pKdGetPciDataByOffset)( + IN ULONG BusNumber, + IN ULONG SlotNumber, + OUT PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +typedef +ULONG +(NTAPI *pKdSetPciDataByOffset)( + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +typedef BOOLEAN +(NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)( + IN ULONG Columns, + IN ULONG Rows); + +typedef +VOID +(NTAPI *PCI_ERROR_HANDLER_CALLBACK)( + VOID); + +typedef +VOID +(NTAPI *pHalSetPciErrorHandlerCallback)( + IN PCI_ERROR_HANDLER_CALLBACK Callback); + +#if 1 /* Not present in WDK 7600 */ +typedef VOID +(FASTCALL *pHalIoAssignDriveLetters)( + IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, + IN PSTRING NtDeviceName, + OUT PUCHAR NtSystemPath, + OUT PSTRING NtSystemPathString); +#endif + +typedef struct { + ULONG Version; + pHalQuerySystemInformation HalQuerySystemInformation; + pHalSetSystemInformation HalSetSystemInformation; + pHalQueryBusSlots HalQueryBusSlots; + ULONG Spare1; + pHalExamineMBR HalExamineMBR; +#if 1 /* Not present in WDK 7600 */ + pHalIoAssignDriveLetters HalIoAssignDriveLetters; +#endif + pHalIoReadPartitionTable HalIoReadPartitionTable; + pHalIoSetPartitionInformation HalIoSetPartitionInformation; + pHalIoWritePartitionTable HalIoWritePartitionTable; + pHalHandlerForBus HalReferenceHandlerForBus; + pHalReferenceBusHandler HalReferenceBusHandler; + pHalReferenceBusHandler HalDereferenceBusHandler; + pHalInitPnpDriver HalInitPnpDriver; + pHalInitPowerManagement HalInitPowerManagement; + pHalGetDmaAdapter HalGetDmaAdapter; + pHalGetInterruptTranslator HalGetInterruptTranslator; + pHalStartMirroring HalStartMirroring; + pHalEndMirroring HalEndMirroring; + pHalMirrorPhysicalMemory HalMirrorPhysicalMemory; + pHalEndOfBoot HalEndOfBoot; + pHalMirrorVerify HalMirrorVerify; + pHalGetAcpiTable HalGetCachedAcpiTable; + pHalSetPciErrorHandlerCallback HalSetPciErrorHandlerCallback; +#if defined(_IA64_) + pHalGetErrorCapList HalGetErrorCapList; + pHalInjectError HalInjectError; +#endif +} HAL_DISPATCH, *PHAL_DISPATCH; + +/* GCC/MSVC and WDK compatible declaration */ +extern NTKERNELAPI HAL_DISPATCH HalDispatchTable; + +#if defined(_NTOSKRNL_) || defined(_BLDR_) +#define HALDISPATCH (&HalDispatchTable) +#else +/* This is a WDK compatibility definition */ +#define HalDispatchTable (&HalDispatchTable) +#define HALDISPATCH HalDispatchTable +#endif + +#define HAL_DISPATCH_VERSION 3 /* FIXME: when to use 4? */ +#define HalDispatchTableVersion HALDISPATCH->Version +#define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation +#define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation +#define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots +#define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus +#define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler +#define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler +#define HalInitPnpDriver HALDISPATCH->HalInitPnpDriver +#define HalInitPowerManagement HALDISPATCH->HalInitPowerManagement +#define HalGetDmaAdapter HALDISPATCH->HalGetDmaAdapter +#define HalGetInterruptTranslator HALDISPATCH->HalGetInterruptTranslator +#define HalStartMirroring HALDISPATCH->HalStartMirroring +#define HalEndMirroring HALDISPATCH->HalEndMirroring +#define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory +#define HalEndOfBoot HALDISPATCH->HalEndOfBoot +#define HalMirrorVerify HALDISPATCH->HalMirrorVerify + +typedef struct _FILE_ALIGNMENT_INFORMATION { + ULONG AlignmentRequirement; +} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; + +typedef struct _FILE_NAME_INFORMATION { + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; + + +typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION { + ULONG FileAttributes; + ULONG ReparseTag; +} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION; + +typedef struct _FILE_DISPOSITION_INFORMATION { + BOOLEAN DeleteFile; +} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; + +typedef struct _FILE_END_OF_FILE_INFORMATION { + LARGE_INTEGER EndOfFile; +} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; + +typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION { + LARGE_INTEGER ValidDataLength; +} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION; + +typedef union _FILE_SEGMENT_ELEMENT { + PVOID64 Buffer; + ULONGLONG Alignment; +}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT; + +#define SE_UNSOLICITED_INPUT_PRIVILEGE 6 + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +ULONGLONG +NTAPI +VerSetConditionMask( + IN ULONGLONG ConditionMask, + IN ULONG TypeMask, + IN UCHAR Condition); +#endif + +#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \ + ((ConditionMask) = VerSetConditionMask((ConditionMask), \ + (TypeBitMask), (ComparisonType))) + +/* RtlVerifyVersionInfo() TypeMask */ + +#define VER_MINORVERSION 0x0000001 +#define VER_MAJORVERSION 0x0000002 +#define VER_BUILDNUMBER 0x0000004 +#define VER_PLATFORMID 0x0000008 +#define VER_SERVICEPACKMINOR 0x0000010 +#define VER_SERVICEPACKMAJOR 0x0000020 +#define VER_SUITENAME 0x0000040 +#define VER_PRODUCT_TYPE 0x0000080 + +/* RtlVerifyVersionInfo() ComparisonType */ + +#define VER_EQUAL 1 +#define VER_GREATER 2 +#define VER_GREATER_EQUAL 3 +#define VER_LESS 4 +#define VER_LESS_EQUAL 5 +#define VER_AND 6 +#define VER_OR 7 + +#define VER_CONDITION_MASK 7 +#define VER_NUM_BITS_PER_CONDITION_MASK 3 + +typedef struct _IMAGE_INFO { + _ANONYMOUS_UNION union { + ULONG Properties; + _ANONYMOUS_STRUCT struct { + ULONG ImageAddressingMode:8; + ULONG SystemModeImage:1; + ULONG ImageMappedToAllPids:1; + ULONG ExtendedInfoPresent:1; + ULONG Reserved:22; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + PVOID ImageBase; + ULONG ImageSelector; + SIZE_T ImageSize; + ULONG ImageSectionNumber; +} IMAGE_INFO, *PIMAGE_INFO; + +#define IMAGE_ADDRESSING_MODE_32BIT 3 + +typedef enum _BUS_DATA_TYPE { + ConfigurationSpaceUndefined = -1, + Cmos, + EisaConfiguration, + Pos, + CbusConfiguration, + PCIConfiguration, + VMEConfiguration, + NuBusConfiguration, + PCMCIAConfiguration, + MPIConfiguration, + MPSAConfiguration, + PNPISAConfiguration, + SgiInternalConfiguration, + MaximumBusDataType +} BUS_DATA_TYPE, *PBUS_DATA_TYPE; + +typedef struct _NT_TIB { + struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; + PVOID StackBase; + PVOID StackLimit; + PVOID SubSystemTib; + _ANONYMOUS_UNION union { + PVOID FiberData; + ULONG Version; + } DUMMYUNIONNAME; + PVOID ArbitraryUserPointer; + struct _NT_TIB *Self; +} NT_TIB, *PNT_TIB; + +typedef struct _NT_TIB32 { + ULONG ExceptionList; + ULONG StackBase; + ULONG StackLimit; + ULONG SubSystemTib; + __GNU_EXTENSION union { + ULONG FiberData; + ULONG Version; + }; + ULONG ArbitraryUserPointer; + ULONG Self; +} NT_TIB32,*PNT_TIB32; + +typedef struct _NT_TIB64 { + ULONG64 ExceptionList; + ULONG64 StackBase; + ULONG64 StackLimit; + ULONG64 SubSystemTib; + __GNU_EXTENSION union { + ULONG64 FiberData; + ULONG Version; + }; + ULONG64 ArbitraryUserPointer; + ULONG64 Self; +} NT_TIB64,*PNT_TIB64; + +typedef enum _PROCESSINFOCLASS { + ProcessBasicInformation, + ProcessQuotaLimits, + ProcessIoCounters, + ProcessVmCounters, + ProcessTimes, + ProcessBasePriority, + ProcessRaisePriority, + ProcessDebugPort, + ProcessExceptionPort, + ProcessAccessToken, + ProcessLdtInformation, + ProcessLdtSize, + ProcessDefaultHardErrorMode, + ProcessIoPortHandlers, + ProcessPooledUsageAndLimits, + ProcessWorkingSetWatch, + ProcessUserModeIOPL, + ProcessEnableAlignmentFaultFixup, + ProcessPriorityClass, + ProcessWx86Information, + ProcessHandleCount, + ProcessAffinityMask, + ProcessPriorityBoost, + ProcessDeviceMap, + ProcessSessionInformation, + ProcessForegroundInformation, + ProcessWow64Information, + ProcessImageFileName, + ProcessLUIDDeviceMapsEnabled, + ProcessBreakOnTermination, + ProcessDebugObjectHandle, + ProcessDebugFlags, + ProcessHandleTracing, + ProcessIoPriority, + ProcessExecuteFlags, + ProcessTlsInformation, + ProcessCookie, + ProcessImageInformation, + ProcessCycleTime, + ProcessPagePriority, + ProcessInstrumentationCallback, + ProcessThreadStackAllocation, + ProcessWorkingSetWatchEx, + ProcessImageFileNameWin32, + ProcessImageFileMapping, + ProcessAffinityUpdateMode, + ProcessMemoryAllocationMode, + ProcessGroupInformation, + ProcessTokenVirtualizationEnabled, + ProcessConsoleHostProcess, + ProcessWindowInformation, + MaxProcessInfoClass +} PROCESSINFOCLASS; + +typedef enum _THREADINFOCLASS { + ThreadBasicInformation, + ThreadTimes, + ThreadPriority, + ThreadBasePriority, + ThreadAffinityMask, + ThreadImpersonationToken, + ThreadDescriptorTableEntry, + ThreadEnableAlignmentFaultFixup, + ThreadEventPair_Reusable, + ThreadQuerySetWin32StartAddress, + ThreadZeroTlsCell, + ThreadPerformanceCount, + ThreadAmILastThread, + ThreadIdealProcessor, + ThreadPriorityBoost, + ThreadSetTlsArrayAddress, + ThreadIsIoPending, + ThreadHideFromDebugger, + ThreadBreakOnTermination, + ThreadSwitchLegacyState, + ThreadIsTerminated, + ThreadLastSystemCall, + ThreadIoPriority, + ThreadCycleTime, + ThreadPagePriority, + ThreadActualBasePriority, + ThreadTebInformation, + ThreadCSwitchMon, + ThreadCSwitchPmu, + ThreadWow64Context, + ThreadGroupInformation, + ThreadUmsInformation, + ThreadCounterProfiling, + ThreadIdealProcessorEx, + MaxThreadInfoClass +} THREADINFOCLASS; + +typedef struct _PROCESS_BASIC_INFORMATION { + NTSTATUS ExitStatus; + struct _PEB *PebBaseAddress; + ULONG_PTR AffinityMask; + KPRIORITY BasePriority; + ULONG_PTR UniqueProcessId; + ULONG_PTR InheritedFromUniqueProcessId; +} PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION; + +typedef struct _PROCESS_WS_WATCH_INFORMATION { + PVOID FaultingPc; + PVOID FaultingVa; +} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION; + +typedef struct _PROCESS_DEVICEMAP_INFORMATION { + __GNU_EXTENSION union { + struct { + HANDLE DirectoryHandle; + } Set; + struct { + ULONG DriveMap; + UCHAR DriveType[32]; + } Query; + }; +} PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION; + +typedef struct _KERNEL_USER_TIMES { + LARGE_INTEGER CreateTime; + LARGE_INTEGER ExitTime; + LARGE_INTEGER KernelTime; + LARGE_INTEGER UserTime; +} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES; + +typedef struct _PROCESS_ACCESS_TOKEN { + HANDLE Token; + HANDLE Thread; +} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN; + +typedef struct _PROCESS_SESSION_INFORMATION { + ULONG SessionId; +} PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION; + +typedef enum _IO_QUERY_DEVICE_DATA_FORMAT { + IoQueryDeviceIdentifier = 0, + IoQueryDeviceConfigurationData, + IoQueryDeviceComponentInformation, + IoQueryDeviceMaxData +} IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT; + +typedef struct _DISK_SIGNATURE { + ULONG PartitionStyle; + _ANONYMOUS_UNION union { + struct { + ULONG Signature; + ULONG CheckSum; + } Mbr; + struct { + GUID DiskId; + } Gpt; + } DUMMYUNIONNAME; +} DISK_SIGNATURE, *PDISK_SIGNATURE; + +typedef ULONG_PTR +(NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)( + IN PVOID Context); + +typedef struct _DRIVER_VERIFIER_THUNK_PAIRS { + PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine; + PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine; +} DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS; + +#define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001 +#define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002 +#define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004 +#define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008 +#define DRIVER_VERIFIER_IO_CHECKING 0x0010 + +typedef VOID +(NTAPI *PTIMER_APC_ROUTINE)( + IN PVOID TimerContext, + IN ULONG TimerLowValue, + IN LONG TimerHighValue); + +typedef struct _KUSER_SHARED_DATA +{ + ULONG TickCountLowDeprecated; + ULONG TickCountMultiplier; + volatile KSYSTEM_TIME InterruptTime; + volatile KSYSTEM_TIME SystemTime; + volatile KSYSTEM_TIME TimeZoneBias; + USHORT ImageNumberLow; + USHORT ImageNumberHigh; + WCHAR NtSystemRoot[260]; + ULONG MaxStackTraceDepth; + ULONG CryptoExponent; + ULONG TimeZoneId; + ULONG LargePageMinimum; + ULONG Reserved2[7]; + NT_PRODUCT_TYPE NtProductType; + BOOLEAN ProductTypeIsValid; + ULONG NtMajorVersion; + ULONG NtMinorVersion; + BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX]; + ULONG Reserved1; + ULONG Reserved3; + volatile ULONG TimeSlip; + ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture; + ULONG AltArchitecturePad[1]; + LARGE_INTEGER SystemExpirationDate; + ULONG SuiteMask; + BOOLEAN KdDebuggerEnabled; +#if (NTDDI_VERSION >= NTDDI_WINXPSP2) + UCHAR NXSupportPolicy; +#endif + volatile ULONG ActiveConsoleId; + volatile ULONG DismountCount; + ULONG ComPlusPackage; + ULONG LastSystemRITEventTickCount; + ULONG NumberOfPhysicalPages; + BOOLEAN SafeBootMode; +#if (NTDDI_VERSION >= NTDDI_WIN7) + union { + UCHAR TscQpcData; + struct { + UCHAR TscQpcEnabled:1; + UCHAR TscQpcSpareFlag:1; + UCHAR TscQpcShift:6; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + UCHAR TscQpcPad[2]; +#endif +#if (NTDDI_VERSION >= NTDDI_VISTA) + union { + ULONG SharedDataFlags; + struct { + ULONG DbgErrorPortPresent:1; + ULONG DbgElevationEnabled:1; + ULONG DbgVirtEnabled:1; + ULONG DbgInstallerDetectEnabled:1; + ULONG DbgSystemDllRelocated:1; + ULONG DbgDynProcessorEnabled:1; + ULONG DbgSEHValidationEnabled:1; + ULONG SpareBits:25; + } DUMMYSTRUCTNAME2; + } DUMMYUNIONNAME2; +#else + ULONG TraceLogging; +#endif + ULONG DataFlagsPad[1]; + ULONGLONG TestRetInstruction; + ULONG SystemCall; + ULONG SystemCallReturn; + ULONGLONG SystemCallPad[3]; + _ANONYMOUS_UNION union { + volatile KSYSTEM_TIME TickCount; + volatile ULONG64 TickCountQuad; + _ANONYMOUS_STRUCT struct { + ULONG ReservedTickCountOverlay[3]; + ULONG TickCountPad[1]; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME3; + ULONG Cookie; + ULONG CookiePad[1]; +#if (NTDDI_VERSION >= NTDDI_WS03) + LONGLONG ConsoleSessionForegroundProcessId; + ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES]; +#endif +#if (NTDDI_VERSION >= NTDDI_VISTA) +#if (NTDDI_VERSION >= NTDDI_WIN7) + USHORT UserModeGlobalLogger[16]; +#else + USHORT UserModeGlobalLogger[8]; + ULONG HeapTracingPid[2]; + ULONG CritSecTracingPid[2]; +#endif + ULONG ImageFileExecutionOptions; +#if (NTDDI_VERSION >= NTDDI_VISTASP1) + ULONG LangGenerationCount; +#else + /* 4 bytes padding */ +#endif + ULONGLONG Reserved5; + volatile ULONG64 InterruptTimeBias; +#endif +#if (NTDDI_VERSION >= NTDDI_WIN7) + volatile ULONG64 TscQpcBias; + volatile ULONG ActiveProcessorCount; + volatile USHORT ActiveGroupCount; + USHORT Reserved4; + volatile ULONG AitSamplingValue; + volatile ULONG AppCompatFlag; + ULONGLONG SystemDllNativeRelocation; + ULONG SystemDllWowRelocation; + ULONG XStatePad[1]; + XSTATE_CONFIGURATION XState; +#endif +} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA; + +extern NTKERNELAPI PVOID MmHighestUserAddress; +extern NTKERNELAPI PVOID MmSystemRangeStart; +extern NTKERNELAPI ULONG MmUserProbeAddress; + + +#ifdef _X86_ + +#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress +#define MM_SYSTEM_RANGE_START MmSystemRangeStart +#if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_) +#define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_ +extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_; +#else +#define MM_USER_PROBE_ADDRESS MmUserProbeAddress +#endif +#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 +#define MM_KSEG0_BASE MM_SYSTEM_RANGE_START +#define MM_SYSTEM_SPACE_END 0xFFFFFFFF +#if !defined (_X86PAE_) +#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000 +#else +#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000 +#endif + +#define KeGetPcr() PCR + +#define KERNEL_STACK_SIZE 12288 +#define KERNEL_LARGE_STACK_SIZE 61440 +#define KERNEL_LARGE_STACK_COMMIT 12288 + +#define SIZE_OF_80387_REGISTERS 80 + +#define PCR_MINOR_VERSION 1 +#define PCR_MAJOR_VERSION 1 + +#if !defined(RC_INVOKED) + +#define CONTEXT_i386 0x10000 +#define CONTEXT_i486 0x10000 +#define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L) +#define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L) +#define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L) +#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L) +#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L) +#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L) + +#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS) + +#endif /* !defined(RC_INVOKED) */ + +typedef struct _KPCR { + union { + NT_TIB NtTib; + struct { + struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; + PVOID Used_StackBase; + PVOID Spare2; + PVOID TssCopy; + ULONG ContextSwitches; + KAFFINITY SetMemberCopy; + PVOID Used_Self; + }; + }; + struct _KPCR *SelfPcr; + struct _KPRCB *Prcb; + KIRQL Irql; + ULONG IRR; + ULONG IrrActive; + ULONG IDR; + PVOID KdVersionBlock; + struct _KIDTENTRY *IDT; + struct _KGDTENTRY *GDT; + struct _KTSS *TSS; + USHORT MajorVersion; + USHORT MinorVersion; + KAFFINITY SetMember; + ULONG StallScaleFactor; + UCHAR SpareUnused; + UCHAR Number; + UCHAR Spare0; + UCHAR SecondLevelCacheAssociativity; + ULONG VdmAlert; + ULONG KernelReserved[14]; + ULONG SecondLevelCacheSize; + ULONG HalReserved[16]; +} KPCR, *PKPCR; + +FORCEINLINE +ULONG +KeGetCurrentProcessorNumber(VOID) +{ + return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number)); +} + +typedef struct _FLOATING_SAVE_AREA { + ULONG ControlWord; + ULONG StatusWord; + ULONG TagWord; + ULONG ErrorOffset; + ULONG ErrorSelector; + ULONG DataOffset; + ULONG DataSelector; + UCHAR RegisterArea[SIZE_OF_80387_REGISTERS]; + ULONG Cr0NpxState; +} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; + +#include "pshpack4.h" +typedef struct _CONTEXT { + ULONG ContextFlags; + ULONG Dr0; + ULONG Dr1; + ULONG Dr2; + ULONG Dr3; + ULONG Dr6; + ULONG Dr7; + FLOATING_SAVE_AREA FloatSave; + ULONG SegGs; + ULONG SegFs; + ULONG SegEs; + ULONG SegDs; + ULONG Edi; + ULONG Esi; + ULONG Ebx; + ULONG Edx; + ULONG Ecx; + ULONG Eax; + ULONG Ebp; + ULONG Eip; + ULONG SegCs; + ULONG EFlags; + ULONG Esp; + ULONG SegSs; + UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; +} CONTEXT; +#include "poppack.h" + +#endif /* _X86_ */ + +#ifdef _AMD64_ + +#define PTI_SHIFT 12L +#define PDI_SHIFT 21L +#define PPI_SHIFT 30L +#define PXI_SHIFT 39L +#define PTE_PER_PAGE 512 +#define PDE_PER_PAGE 512 +#define PPE_PER_PAGE 512 +#define PXE_PER_PAGE 512 +#define PTI_MASK_AMD64 (PTE_PER_PAGE - 1) +#define PDI_MASK_AMD64 (PDE_PER_PAGE - 1) +#define PPI_MASK (PPE_PER_PAGE - 1) +#define PXI_MASK (PXE_PER_PAGE - 1) + +#define PXE_BASE 0xFFFFF6FB7DBED000ULL +#define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL +#define PPE_BASE 0xFFFFF6FB7DA00000ULL +#define PDE_BASE 0xFFFFF6FB40000000ULL +#define PTE_BASE 0xFFFFF68000000000ULL +#define PXE_TOP 0xFFFFF6FB7DBEDFFFULL +#define PPE_TOP 0xFFFFF6FB7DBFFFFFULL +#define PDE_TOP 0xFFFFF6FB7FFFFFFFULL +#define PTE_TOP 0xFFFFF6FFFFFFFFFFULL + +#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress +#define MM_SYSTEM_RANGE_START MmSystemRangeStart +#define MM_USER_PROBE_ADDRESS MmUserProbeAddress +#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 +#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL +#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL + +typedef struct DECLSPEC_ALIGN(16) _CONTEXT { + ULONG64 P1Home; + ULONG64 P2Home; + ULONG64 P3Home; + ULONG64 P4Home; + ULONG64 P5Home; + ULONG64 P6Home; + + /* Control flags */ + ULONG ContextFlags; + ULONG MxCsr; + + /* Segment */ + USHORT SegCs; + USHORT SegDs; + USHORT SegEs; + USHORT SegFs; + USHORT SegGs; + USHORT SegSs; + ULONG EFlags; + + /* Debug */ + ULONG64 Dr0; + ULONG64 Dr1; + ULONG64 Dr2; + ULONG64 Dr3; + ULONG64 Dr6; + ULONG64 Dr7; + + /* Integer */ + ULONG64 Rax; + ULONG64 Rcx; + ULONG64 Rdx; + ULONG64 Rbx; + ULONG64 Rsp; + ULONG64 Rbp; + ULONG64 Rsi; + ULONG64 Rdi; + ULONG64 R8; + ULONG64 R9; + ULONG64 R10; + ULONG64 R11; + ULONG64 R12; + ULONG64 R13; + ULONG64 R14; + ULONG64 R15; + + /* Counter */ + ULONG64 Rip; + + /* Floating point */ + union { + XMM_SAVE_AREA32 FltSave; + struct { + M128A Header[2]; + M128A Legacy[8]; + M128A Xmm0; + M128A Xmm1; + M128A Xmm2; + M128A Xmm3; + M128A Xmm4; + M128A Xmm5; + M128A Xmm6; + M128A Xmm7; + M128A Xmm8; + M128A Xmm9; + M128A Xmm10; + M128A Xmm11; + M128A Xmm12; + M128A Xmm13; + M128A Xmm14; + M128A Xmm15; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + + /* Vector */ + M128A VectorRegister[26]; + ULONG64 VectorControl; + + /* Debug control */ + ULONG64 DebugControl; + ULONG64 LastBranchToRip; + ULONG64 LastBranchFromRip; + ULONG64 LastExceptionToRip; + ULONG64 LastExceptionFromRip; +} CONTEXT; + +typedef struct _KPCR +{ + _ANONYMOUS_UNION union + { + NT_TIB NtTib; + _ANONYMOUS_STRUCT struct + { + union _KGDTENTRY64 *GdtBase; + struct _KTSS64 *TssBase; + ULONG64 UserRsp; + struct _KPCR *Self; + struct _KPRCB *CurrentPrcb; + PKSPIN_LOCK_QUEUE LockArray; + PVOID Used_Self; + }; + }; + union _KIDTENTRY64 *IdtBase; + ULONG64 Unused[2]; + KIRQL Irql; + UCHAR SecondLevelCacheAssociativity; + UCHAR ObsoleteNumber; + UCHAR Fill0; + ULONG Unused0[3]; + USHORT MajorVersion; + USHORT MinorVersion; + ULONG StallScaleFactor; + PVOID Unused1[3]; + ULONG KernelReserved[15]; + ULONG SecondLevelCacheSize; + ULONG HalReserved[16]; + ULONG Unused2; + PVOID KdVersionBlock; + PVOID Unused3; + ULONG PcrAlign1[24]; +} KPCR, *PKPCR; + +FORCEINLINE +PKPCR +KeGetPcr(VOID) +{ + return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self)); +} + +FORCEINLINE +ULONG +KeGetCurrentProcessorNumber(VOID) +{ + return (ULONG)__readgsword(0x184); +} + +#if !defined(RC_INVOKED) + +#define CONTEXT_AMD64 0x100000 + +#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) +#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) +#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) +#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) +#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) + +#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) +#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) + +#define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L) + +#define CONTEXT_EXCEPTION_ACTIVE 0x8000000 +#define CONTEXT_SERVICE_ACTIVE 0x10000000 +#define CONTEXT_EXCEPTION_REQUEST 0x40000000 +#define CONTEXT_EXCEPTION_REPORTING 0x80000000 + +#endif /* RC_INVOKED */ + +#endif /* _AMD64_ */ + +typedef enum _INTERLOCKED_RESULT { + ResultNegative = RESULT_NEGATIVE, + ResultZero = RESULT_ZERO, + ResultPositive = RESULT_POSITIVE +} INTERLOCKED_RESULT; + +typedef struct _OSVERSIONINFOA { + ULONG dwOSVersionInfoSize; + ULONG dwMajorVersion; + ULONG dwMinorVersion; + ULONG dwBuildNumber; + ULONG dwPlatformId; + CHAR szCSDVersion[128]; +} OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA; + +typedef struct _OSVERSIONINFOW { + ULONG dwOSVersionInfoSize; + ULONG dwMajorVersion; + ULONG dwMinorVersion; + ULONG dwBuildNumber; + ULONG dwPlatformId; + WCHAR szCSDVersion[128]; +} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW; + +typedef struct _OSVERSIONINFOEXA { + ULONG dwOSVersionInfoSize; + ULONG dwMajorVersion; + ULONG dwMinorVersion; + ULONG dwBuildNumber; + ULONG dwPlatformId; + CHAR szCSDVersion[128]; + USHORT wServicePackMajor; + USHORT wServicePackMinor; + USHORT wSuiteMask; + UCHAR wProductType; + UCHAR wReserved; +} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA; + +typedef struct _OSVERSIONINFOEXW { + ULONG dwOSVersionInfoSize; + ULONG dwMajorVersion; + ULONG dwMinorVersion; + ULONG dwBuildNumber; + ULONG dwPlatformId; + WCHAR szCSDVersion[128]; + USHORT wServicePackMajor; + USHORT wServicePackMinor; + USHORT wSuiteMask; + UCHAR wProductType; + UCHAR wReserved; +} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW; + +#ifdef UNICODE +typedef OSVERSIONINFOEXW OSVERSIONINFOEX; +typedef POSVERSIONINFOEXW POSVERSIONINFOEX; +typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX; +typedef OSVERSIONINFOW OSVERSIONINFO; +typedef POSVERSIONINFOW POSVERSIONINFO; +typedef LPOSVERSIONINFOW LPOSVERSIONINFO; +#else +typedef OSVERSIONINFOEXA OSVERSIONINFOEX; +typedef POSVERSIONINFOEXA POSVERSIONINFOEX; +typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX; +typedef OSVERSIONINFOA OSVERSIONINFO; +typedef POSVERSIONINFOA POSVERSIONINFO; +typedef LPOSVERSIONINFOA LPOSVERSIONINFO; +#endif /* UNICODE */ + +/* Executive Types */ + +#define PROTECTED_POOL 0x80000000 + +typedef struct _ZONE_SEGMENT_HEADER { + SINGLE_LIST_ENTRY SegmentList; + PVOID Reserved; +} ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER; + +typedef struct _ZONE_HEADER { + SINGLE_LIST_ENTRY FreeList; + SINGLE_LIST_ENTRY SegmentList; + ULONG BlockSize; + ULONG TotalSegmentSize; +} ZONE_HEADER, *PZONE_HEADER; + +/* Executive Functions */ + +static __inline PVOID +ExAllocateFromZone( + IN PZONE_HEADER Zone) +{ + if (Zone->FreeList.Next) + Zone->FreeList.Next = Zone->FreeList.Next->Next; + return (PVOID) Zone->FreeList.Next; +} + +static __inline PVOID +ExFreeToZone( + IN PZONE_HEADER Zone, + IN PVOID Block) +{ + ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next; + Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block); + return ((PSINGLE_LIST_ENTRY) Block)->Next; +} + +/* + * PVOID + * ExInterlockedAllocateFromZone( + * IN PZONE_HEADER Zone, + * IN PKSPIN_LOCK Lock) + */ +#define ExInterlockedAllocateFromZone(Zone, Lock) \ + ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock)) + +/* PVOID + * ExInterlockedFreeToZone( + * IN PZONE_HEADER Zone, + * IN PVOID Block, + * IN PKSPIN_LOCK Lock); + */ +#define ExInterlockedFreeToZone(Zone, Block, Lock) \ + ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock) + +/* + * BOOLEAN + * ExIsFullZone( + * IN PZONE_HEADER Zone) + */ +#define ExIsFullZone(Zone) \ + ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL) + +/* BOOLEAN + * ExIsObjectInFirstZoneSegment( + * IN PZONE_HEADER Zone, + * IN PVOID Object); + */ +#define ExIsObjectInFirstZoneSegment(Zone,Object) \ + ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \ + ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \ + (Zone)->TotalSegmentSize)) ) + +#define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite +#define ExAcquireResourceShared ExAcquireResourceSharedLite +#define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite +#define ExDeleteResource ExDeleteResourceLite +#define ExInitializeResource ExInitializeResourceLite +#define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite +#define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite +#define ExIsResourceAcquired ExIsResourceAcquiredSharedLite +#define ExReleaseResourceForThread ExReleaseResourceForThreadLite + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +NTSTATUS +NTAPI +ExExtendZone( + IN OUT PZONE_HEADER Zone, + IN OUT PVOID Segment, + IN ULONG SegmentSize); + +NTKERNELAPI +NTSTATUS +NTAPI +ExInitializeZone( + OUT PZONE_HEADER Zone, + IN ULONG BlockSize, + IN OUT PVOID InitialSegment, + IN ULONG InitialSegmentSize); + +NTKERNELAPI +NTSTATUS +NTAPI +ExInterlockedExtendZone( + IN OUT PZONE_HEADER Zone, + IN OUT PVOID Segment, + IN ULONG SegmentSize, + IN OUT PKSPIN_LOCK Lock); + +NTKERNELAPI +NTSTATUS +NTAPI +ExUuidCreate( + OUT UUID *Uuid); + +NTKERNELAPI +DECLSPEC_NORETURN +VOID +NTAPI +ExRaiseAccessViolation( + VOID); + +NTKERNELAPI +DECLSPEC_NORETURN +VOID +NTAPI +ExRaiseDatatypeMisalignment( + VOID); + +#endif + +#ifdef _X86_ + +NTKERNELAPI +INTERLOCKED_RESULT +FASTCALL +Exfi386InterlockedIncrementLong( + IN OUT LONG volatile *Addend); + +NTKERNELAPI +INTERLOCKED_RESULT +FASTCALL +Exfi386InterlockedDecrementLong( + IN PLONG Addend); + +NTKERNELAPI +ULONG +FASTCALL +Exfi386InterlockedExchangeUlong( + IN PULONG Target, + IN ULONG Value); + +#endif /* _X86_ */ + +#ifndef _ARC_DDK_ +#define _ARC_DDK_ +typedef enum _CONFIGURATION_TYPE { + ArcSystem, + CentralProcessor, + FloatingPointProcessor, + PrimaryIcache, + PrimaryDcache, + SecondaryIcache, + SecondaryDcache, + SecondaryCache, + EisaAdapter, + TcAdapter, + ScsiAdapter, + DtiAdapter, + MultiFunctionAdapter, + DiskController, + TapeController, + CdromController, + WormController, + SerialController, + NetworkController, + DisplayController, + ParallelController, + PointerController, + KeyboardController, + AudioController, + OtherController, + DiskPeripheral, + FloppyDiskPeripheral, + TapePeripheral, + ModemPeripheral, + MonitorPeripheral, + PrinterPeripheral, + PointerPeripheral, + KeyboardPeripheral, + TerminalPeripheral, + OtherPeripheral, + LinePeripheral, + NetworkPeripheral, + SystemMemory, + DockingInformation, + RealModeIrqRoutingTable, + RealModePCIEnumeration, + MaximumType +} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE; +#endif /* !_ARC_DDK_ */ + +typedef struct _CONTROLLER_OBJECT { + CSHORT Type; + CSHORT Size; + PVOID ControllerExtension; + KDEVICE_QUEUE DeviceWaitQueue; + ULONG Spare1; + LARGE_INTEGER Spare2; +} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT; + +typedef struct _CONFIGURATION_INFORMATION { + ULONG DiskCount; + ULONG FloppyCount; + ULONG CdRomCount; + ULONG TapeCount; + ULONG ScsiPortCount; + ULONG SerialCount; + ULONG ParallelCount; + BOOLEAN AtDiskPrimaryAddressClaimed; + BOOLEAN AtDiskSecondaryAddressClaimed; + ULONG Version; + ULONG MediumChangerCount; +} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION; + +typedef +NTSTATUS +(NTAPI *PIO_QUERY_DEVICE_ROUTINE)( + IN PVOID Context, + IN PUNICODE_STRING PathName, + IN INTERFACE_TYPE BusType, + IN ULONG BusNumber, + IN PKEY_VALUE_FULL_INFORMATION *BusInformation, + IN CONFIGURATION_TYPE ControllerType, + IN ULONG ControllerNumber, + IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, + IN CONFIGURATION_TYPE PeripheralType, + IN ULONG PeripheralNumber, + IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation); + +typedef +VOID +(NTAPI DRIVER_REINITIALIZE)( + IN struct _DRIVER_OBJECT *DriverObject, + IN PVOID Context, + IN ULONG Count); + +typedef DRIVER_REINITIALIZE *PDRIVER_REINITIALIZE; + +/** Filesystem runtime library routines **/ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsTotalDeviceFailure( + IN NTSTATUS Status); +#endif + +/* Hardware Abstraction Layer Types */ + +typedef VOID +(NTAPI *PciPin2Line)( + IN struct _BUS_HANDLER *BusHandler, + IN struct _BUS_HANDLER *RootHandler, + IN PCI_SLOT_NUMBER SlotNumber, + IN PPCI_COMMON_CONFIG PciData); + +typedef VOID +(NTAPI *PciLine2Pin)( + IN struct _BUS_HANDLER *BusHandler, + IN struct _BUS_HANDLER *RootHandler, + IN PCI_SLOT_NUMBER SlotNumber, + IN PPCI_COMMON_CONFIG PciNewData, + IN PPCI_COMMON_CONFIG PciOldData); + +typedef VOID +(NTAPI *PciReadWriteConfig)( + IN struct _BUS_HANDLER *BusHandler, + IN PCI_SLOT_NUMBER Slot, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +#define PCI_DATA_TAG ' ICP' +#define PCI_DATA_VERSION 1 + +typedef struct _PCIBUSDATA { + ULONG Tag; + ULONG Version; + PciReadWriteConfig ReadConfig; + PciReadWriteConfig WriteConfig; + PciPin2Line Pin2Line; + PciLine2Pin Line2Pin; + PCI_SLOT_NUMBER ParentSlot; + PVOID Reserved[4]; +} PCIBUSDATA, *PPCIBUSDATA; + +/* Hardware Abstraction Layer Functions */ + +#if !defined(NO_LEGACY_DRIVERS) + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTHALAPI +NTSTATUS +NTAPI +HalAssignSlotResources( + IN PUNICODE_STRING RegistryPath, + IN PUNICODE_STRING DriverClassName, + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceObject, + IN INTERFACE_TYPE BusType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN OUT PCM_RESOURCE_LIST *AllocatedResources); + +NTHALAPI +ULONG +NTAPI +HalGetInterruptVector( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN ULONG BusInterruptLevel, + IN ULONG BusInterruptVector, + OUT PKIRQL Irql, + OUT PKAFFINITY Affinity); + +NTHALAPI +ULONG +NTAPI +HalSetBusData( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Length); + +#endif + +#endif /* !defined(NO_LEGACY_DRIVERS) */ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTHALAPI +PADAPTER_OBJECT +NTAPI +HalGetAdapter( + IN PDEVICE_DESCRIPTION DeviceDescription, + IN OUT PULONG NumberOfMapRegisters); + +NTHALAPI +BOOLEAN +NTAPI +HalMakeBeep( + IN ULONG Frequency); + +VOID +NTAPI +HalPutDmaAdapter( + IN PADAPTER_OBJECT DmaAdapter); + +NTHALAPI +VOID +NTAPI +HalAcquireDisplayOwnership( + IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters); + +NTHALAPI +ULONG +NTAPI +HalGetBusData( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + OUT PVOID Buffer, + IN ULONG Length); + +NTHALAPI +ULONG +NTAPI +HalGetBusDataByOffset( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + OUT PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +NTHALAPI +ULONG +NTAPI +HalSetBusDataByOffset( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +NTHALAPI +BOOLEAN +NTAPI +HalTranslateBusAddress( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN PHYSICAL_ADDRESS BusAddress, + IN OUT PULONG AddressSpace, + OUT PPHYSICAL_ADDRESS TranslatedAddress); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +VOID +FASTCALL +HalExamineMBR( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG MBRTypeIdentifier, + OUT PVOID *Buffer); +#endif + +#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) +// nothing here +#else + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +//DECLSPEC_DEPRECATED_DDK +NTHALAPI +VOID +NTAPI +IoFreeAdapterChannel( + IN PADAPTER_OBJECT AdapterObject); + +//DECLSPEC_DEPRECATED_DDK +NTHALAPI +BOOLEAN +NTAPI +IoFlushAdapterBuffers( + IN PADAPTER_OBJECT AdapterObject, + IN PMDL Mdl, + IN PVOID MapRegisterBase, + IN PVOID CurrentVa, + IN ULONG Length, + IN BOOLEAN WriteToDevice); + +//DECLSPEC_DEPRECATED_DDK +NTHALAPI +VOID +NTAPI +IoFreeMapRegisters( + IN PADAPTER_OBJECT AdapterObject, + IN PVOID MapRegisterBase, + IN ULONG NumberOfMapRegisters); + +//DECLSPEC_DEPRECATED_DDK +NTHALAPI +PVOID +NTAPI +HalAllocateCommonBuffer( + IN PADAPTER_OBJECT AdapterObject, + IN ULONG Length, + OUT PPHYSICAL_ADDRESS LogicalAddress, + IN BOOLEAN CacheEnabled); + +//DECLSPEC_DEPRECATED_DDK +NTHALAPI +VOID +NTAPI +HalFreeCommonBuffer( + IN PADAPTER_OBJECT AdapterObject, + IN ULONG Length, + IN PHYSICAL_ADDRESS LogicalAddress, + IN PVOID VirtualAddress, + IN BOOLEAN CacheEnabled); + +//DECLSPEC_DEPRECATED_DDK +NTHALAPI +ULONG +NTAPI +HalReadDmaCounter( + IN PADAPTER_OBJECT AdapterObject); + +NTHALAPI +NTSTATUS +NTAPI +HalAllocateAdapterChannel( + IN PADAPTER_OBJECT AdapterObject, + IN PWAIT_CONTEXT_BLOCK Wcb, + IN ULONG NumberOfMapRegisters, + IN PDRIVER_CONTROL ExecutionRoutine); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#endif /* defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) */ + +/* I/O Manager Functions */ + +/* + * VOID IoAssignArcName( + * IN PUNICODE_STRING ArcName, + * IN PUNICODE_STRING DeviceName); + */ +#define IoAssignArcName(_ArcName, _DeviceName) ( \ + IoCreateSymbolicLink((_ArcName), (_DeviceName))) + +/* + * VOID + * IoDeassignArcName( + * IN PUNICODE_STRING ArcName) + */ +#define IoDeassignArcName IoDeleteSymbolicLink + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +#if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)) +NTKERNELAPI +NTSTATUS +NTAPI +IoAllocateAdapterChannel( + IN PADAPTER_OBJECT AdapterObject, + IN PDEVICE_OBJECT DeviceObject, + IN ULONG NumberOfMapRegisters, + IN PDRIVER_CONTROL ExecutionRoutine, + IN PVOID Context); +#endif + +//DECLSPEC_DEPRECATED_DDK +NTHALAPI +PHYSICAL_ADDRESS +NTAPI +IoMapTransfer( + IN PADAPTER_OBJECT AdapterObject, + IN PMDL Mdl, + IN PVOID MapRegisterBase, + IN PVOID CurrentVa, + IN OUT PULONG Length, + IN BOOLEAN WriteToDevice); + +NTKERNELAPI +VOID +NTAPI +IoAllocateController( + IN PCONTROLLER_OBJECT ControllerObject, + IN PDEVICE_OBJECT DeviceObject, + IN PDRIVER_CONTROL ExecutionRoutine, + IN PVOID Context OPTIONAL); + +NTKERNELAPI +PCONTROLLER_OBJECT +NTAPI +IoCreateController( + IN ULONG Size); + +NTKERNELAPI +VOID +NTAPI +IoDeleteController( + IN PCONTROLLER_OBJECT ControllerObject); + +NTKERNELAPI +VOID +NTAPI +IoFreeController( + IN PCONTROLLER_OBJECT ControllerObject); + +NTKERNELAPI +PCONFIGURATION_INFORMATION +NTAPI +IoGetConfigurationInformation( + VOID); + +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoGetDeviceToVerify( + IN PETHREAD Thread); + +NTKERNELAPI +VOID +NTAPI +IoCancelFileOpen( + IN PDEVICE_OBJECT DeviceObject, + IN PFILE_OBJECT FileObject); + +NTKERNELAPI +PGENERIC_MAPPING +NTAPI +IoGetFileObjectGenericMapping( + VOID); + +NTKERNELAPI +PIRP +NTAPI +IoMakeAssociatedIrp( + IN PIRP Irp, + IN CCHAR StackSize); + +NTKERNELAPI +NTSTATUS +NTAPI +IoQueryDeviceDescription( + IN PINTERFACE_TYPE BusType OPTIONAL, + IN PULONG BusNumber OPTIONAL, + IN PCONFIGURATION_TYPE ControllerType OPTIONAL, + IN PULONG ControllerNumber OPTIONAL, + IN PCONFIGURATION_TYPE PeripheralType OPTIONAL, + IN PULONG PeripheralNumber OPTIONAL, + IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine, + IN OUT PVOID Context OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +IoRaiseHardError( + IN PIRP Irp, + IN PVPB Vpb OPTIONAL, + IN PDEVICE_OBJECT RealDeviceObject); + +NTKERNELAPI +BOOLEAN +NTAPI +IoRaiseInformationalHardError( + IN NTSTATUS ErrorStatus, + IN PUNICODE_STRING String OPTIONAL, + IN PKTHREAD Thread OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +IoRegisterBootDriverReinitialization( + IN PDRIVER_OBJECT DriverObject, + IN PDRIVER_REINITIALIZE DriverReinitializationRoutine, + IN PVOID Context OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +IoRegisterDriverReinitialization( + IN PDRIVER_OBJECT DriverObject, + IN PDRIVER_REINITIALIZE DriverReinitializationRoutine, + IN PVOID Context OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +IoAttachDeviceByPointer( + IN PDEVICE_OBJECT SourceDevice, + IN PDEVICE_OBJECT TargetDevice); + +NTKERNELAPI +NTSTATUS +NTAPI +IoReportDetectedDevice( + IN PDRIVER_OBJECT DriverObject, + IN INTERFACE_TYPE LegacyBusType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PCM_RESOURCE_LIST ResourceList OPTIONAL, + IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL, + IN BOOLEAN ResourceAssigned, + IN OUT PDEVICE_OBJECT *DeviceObject); + +NTKERNELAPI +NTSTATUS +NTAPI +IoReportResourceForDetection( + IN PDRIVER_OBJECT DriverObject, + IN PCM_RESOURCE_LIST DriverList OPTIONAL, + IN ULONG DriverListSize OPTIONAL, + IN PDEVICE_OBJECT DeviceObject OPTIONAL, + IN PCM_RESOURCE_LIST DeviceList OPTIONAL, + IN ULONG DeviceListSize OPTIONAL, + OUT PBOOLEAN ConflictDetected); + +NTKERNELAPI +NTSTATUS +NTAPI +IoReportResourceUsage( + IN PUNICODE_STRING DriverClassName OPTIONAL, + IN PDRIVER_OBJECT DriverObject, + IN PCM_RESOURCE_LIST DriverList OPTIONAL, + IN ULONG DriverListSize OPTIONAL, + IN PDEVICE_OBJECT DeviceObject, + IN PCM_RESOURCE_LIST DeviceList OPTIONAL, + IN ULONG DeviceListSize OPTIONAL, + IN BOOLEAN OverrideConflict, + OUT PBOOLEAN ConflictDetected); + +NTKERNELAPI +VOID +NTAPI +IoSetHardErrorOrVerifyDevice( + IN PIRP Irp, + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +NTSTATUS +NTAPI +IoAssignResources( + IN PUNICODE_STRING RegistryPath, + IN PUNICODE_STRING DriverClassName OPTIONAL, + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceObject OPTIONAL, + IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL, + IN OUT PCM_RESOURCE_LIST *AllocatedResources); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTKERNELAPI +NTSTATUS +NTAPI +IoCreateDisk( + IN PDEVICE_OBJECT DeviceObject, + IN struct _CREATE_DISK* Disk OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +IoReadDiskSignature( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG BytesPerSector, + OUT PDISK_SIGNATURE Signature); + +NTKERNELAPI +NTSTATUS +FASTCALL +IoReadPartitionTable( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN BOOLEAN ReturnRecognizedPartitions, + OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); + +NTKERNELAPI +NTSTATUS +NTAPI +IoReadPartitionTableEx( + IN PDEVICE_OBJECT DeviceObject, + IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer); + +NTKERNELAPI +NTSTATUS +FASTCALL +IoSetPartitionInformation( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG PartitionNumber, + IN ULONG PartitionType); + +NTKERNELAPI +NTSTATUS +NTAPI +IoSetPartitionInformationEx( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG PartitionNumber, + IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo); + +NTKERNELAPI +NTSTATUS +NTAPI +IoSetSystemPartition( + IN PUNICODE_STRING VolumeNameString); + +NTKERNELAPI +BOOLEAN +NTAPI +IoSetThreadHardErrorMode( + IN BOOLEAN EnableHardErrors); + +NTKERNELAPI +NTSTATUS +NTAPI +IoVerifyPartitionTable( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN FixErrors); + +NTKERNELAPI +NTSTATUS +NTAPI +IoVolumeDeviceToDosName( + IN PVOID VolumeDeviceObject, + OUT PUNICODE_STRING DosName); + +NTKERNELAPI +NTSTATUS +FASTCALL +IoWritePartitionTable( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG SectorsPerTrack, + IN ULONG NumberOfHeads, + IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWritePartitionTableEx( + IN PDEVICE_OBJECT DeviceObject, + IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +/** Kernel debugger routines **/ + +NTSYSAPI +ULONG +NTAPI +DbgPrompt( + IN PCCH Prompt, + OUT PCH Response, + IN ULONG MaximumResponseLength); + +/* Kernel Functions */ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +DECLSPEC_NORETURN +VOID +NTAPI +KeBugCheck( + IN ULONG BugCheckCode); + +NTKERNELAPI +LONG +NTAPI +KePulseEvent( + IN OUT PRKEVENT Event, + IN KPRIORITY Increment, + IN BOOLEAN Wait); + +NTKERNELAPI +LONG +NTAPI +KeSetBasePriorityThread( + IN OUT PRKTHREAD Thread, + IN LONG Increment); + +#endif + +/* Memory Manager Types */ + +typedef struct _PHYSICAL_MEMORY_RANGE { + PHYSICAL_ADDRESS BaseAddress; + LARGE_INTEGER NumberOfBytes; +} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE; + +/* Memory Manager Functions */ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +PPHYSICAL_MEMORY_RANGE +NTAPI +MmGetPhysicalMemoryRanges( + VOID); + +NTKERNELAPI +PHYSICAL_ADDRESS +NTAPI +MmGetPhysicalAddress( + IN PVOID BaseAddress); + +NTKERNELAPI +BOOLEAN +NTAPI +MmIsNonPagedSystemAddressValid( + IN PVOID VirtualAddress); + +NTKERNELAPI +PVOID +NTAPI +MmAllocateNonCachedMemory( + IN SIZE_T NumberOfBytes); + +NTKERNELAPI +VOID +NTAPI +MmFreeNonCachedMemory( + IN PVOID BaseAddress, + IN SIZE_T NumberOfBytes); + +NTKERNELAPI +PVOID +NTAPI +MmGetVirtualForPhysical( + IN PHYSICAL_ADDRESS PhysicalAddress); + +NTKERNELAPI +NTSTATUS +NTAPI +MmMapUserAddressesToPage( + IN PVOID BaseAddress, + IN SIZE_T NumberOfBytes, + IN PVOID PageAddress); + +NTKERNELAPI +PVOID +NTAPI +MmMapVideoDisplay( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN SIZE_T NumberOfBytes, + IN MEMORY_CACHING_TYPE CacheType); + +NTKERNELAPI +NTSTATUS +NTAPI +MmMapViewInSessionSpace( + IN PVOID Section, + OUT PVOID *MappedBase, + IN OUT PSIZE_T ViewSize); + +NTKERNELAPI +NTSTATUS +NTAPI +MmMapViewInSystemSpace( + IN PVOID Section, + OUT PVOID *MappedBase, + IN OUT PSIZE_T ViewSize); + +NTKERNELAPI +BOOLEAN +NTAPI +MmIsAddressValid( + IN PVOID VirtualAddress); + +NTKERNELAPI +BOOLEAN +NTAPI +MmIsThisAnNtAsSystem( + VOID); + +NTKERNELAPI +VOID +NTAPI +MmLockPagableSectionByHandle( + IN PVOID ImageSectionHandle); + +NTKERNELAPI +NTSTATUS +NTAPI +MmUnmapViewInSessionSpace( + IN PVOID MappedBase); + +NTKERNELAPI +NTSTATUS +NTAPI +MmUnmapViewInSystemSpace( + IN PVOID MappedBase); + +NTKERNELAPI +VOID +NTAPI +MmUnsecureVirtualMemory( + IN HANDLE SecureHandle); + +NTKERNELAPI +NTSTATUS +NTAPI +MmRemovePhysicalMemory( + IN PPHYSICAL_ADDRESS StartAddress, + IN OUT PLARGE_INTEGER NumberOfBytes); + +NTKERNELAPI +HANDLE +NTAPI +MmSecureVirtualMemory( + IN PVOID Address, + IN SIZE_T Size, + IN ULONG ProbeMode); + +NTKERNELAPI +VOID +NTAPI +MmUnmapVideoDisplay( + IN PVOID BaseAddress, + IN SIZE_T NumberOfBytes); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +/* NtXxx Functions */ + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenProcess( + OUT PHANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PCLIENT_ID ClientId OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryInformationProcess( + IN HANDLE ProcessHandle, + IN PROCESSINFOCLASS ProcessInformationClass, + OUT PVOID ProcessInformation OPTIONAL, + IN ULONG ProcessInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +/** Process manager types **/ + +typedef VOID +(NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)( + IN HANDLE ParentId, + IN HANDLE ProcessId, + IN BOOLEAN Create); + +typedef VOID +(NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)( + IN HANDLE ProcessId, + IN HANDLE ThreadId, + IN BOOLEAN Create); + +typedef VOID +(NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)( + IN PUNICODE_STRING FullImageName, + IN HANDLE ProcessId, + IN PIMAGE_INFO ImageInfo); + +/** Process manager routines **/ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +NTSTATUS +NTAPI +PsSetLoadImageNotifyRoutine( + IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); + +NTKERNELAPI +NTSTATUS +NTAPI +PsSetCreateThreadNotifyRoutine( + IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); + +NTKERNELAPI +NTSTATUS +NTAPI +PsSetCreateProcessNotifyRoutine( + IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, + IN BOOLEAN Remove); + +NTKERNELAPI +HANDLE +NTAPI +PsGetCurrentProcessId( + VOID); + +NTKERNELAPI +HANDLE +NTAPI +PsGetCurrentThreadId( + VOID); + +NTKERNELAPI +BOOLEAN +NTAPI +PsGetVersion( + OUT PULONG MajorVersion OPTIONAL, + OUT PULONG MinorVersion OPTIONAL, + OUT PULONG BuildNumber OPTIONAL, + OUT PUNICODE_STRING CSDVersion OPTIONAL); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTKERNELAPI +HANDLE +NTAPI +PsGetProcessId( + IN PEPROCESS Process); + +NTKERNELAPI +NTSTATUS +NTAPI +PsRemoveCreateThreadNotifyRoutine( + IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); + +NTKERNELAPI +NTSTATUS +NTAPI +PsRemoveLoadImageNotifyRoutine( + IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +extern NTKERNELAPI PEPROCESS PsInitialSystemProcess; + +/* RTL Types */ + +typedef struct _RTL_SPLAY_LINKS { + struct _RTL_SPLAY_LINKS *Parent; + struct _RTL_SPLAY_LINKS *LeftChild; + struct _RTL_SPLAY_LINKS *RightChild; +} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS; + +/* RTL Functions */ + +#if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_) + +#define RtlGetCallersAddress(CallersAddress, CallersCaller) \ + *CallersAddress = (PVOID)_ReturnAddress(); \ + *CallersCaller = NULL; +#else + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +VOID +NTAPI +RtlGetCallersAddress( + OUT PVOID *CallersAddress, + OUT PVOID *CallersCaller); +#endif + +#endif + +#if !defined(MIDL_PASS) + +FORCEINLINE +LUID +NTAPI_INLINE +RtlConvertLongToLuid( + IN LONG Val) +{ + LUID Luid; + LARGE_INTEGER Temp; + + Temp.QuadPart = Val; + Luid.LowPart = Temp.u.LowPart; + Luid.HighPart = Temp.u.HighPart; + return Luid; +} + +FORCEINLINE +LUID +NTAPI_INLINE +RtlConvertUlongToLuid( + IN ULONG Val) +{ + LUID Luid; + + Luid.LowPart = Val; + Luid.HighPart = 0; + return Luid; +} + +#endif + +#if defined(_AMD64_) || defined(_IA64_) +//DECLSPEC_DEPRECATED_DDK_WINXP +__inline +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerDivide( + IN LARGE_INTEGER Dividend, + IN LARGE_INTEGER Divisor, + OUT PLARGE_INTEGER Remainder OPTIONAL) +{ + LARGE_INTEGER ret; + ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart; + if (Remainder) + Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart; + return ret; +} + +#else + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +LARGE_INTEGER +NTAPI +RtlLargeIntegerDivide( + IN LARGE_INTEGER Dividend, + IN LARGE_INTEGER Divisor, + OUT PLARGE_INTEGER Remainder OPTIONAL); +#endif + +#endif /* defined(_AMD64_) || defined(_IA64_) */ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTSYSAPI +BOOLEAN +NTAPI +RtlPrefixUnicodeString( + IN PCUNICODE_STRING String1, + IN PCUNICODE_STRING String2, + IN BOOLEAN CaseInSensitive); + +NTSYSAPI +VOID +NTAPI +RtlUpperString( + IN OUT PSTRING DestinationString, + IN const PSTRING SourceString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlUpcaseUnicodeString( + IN OUT PUNICODE_STRING DestinationString, + IN PCUNICODE_STRING SourceString, + IN BOOLEAN AllocateDestinationString); + +NTSYSAPI +VOID +NTAPI +RtlMapGenericMask( + IN OUT PACCESS_MASK AccessMask, + IN PGENERIC_MAPPING GenericMapping); + +NTSYSAPI +NTSTATUS +NTAPI +RtlVolumeDeviceToDosName( + IN PVOID VolumeDeviceObject, + OUT PUNICODE_STRING DosName); + +NTSYSAPI +NTSTATUS +NTAPI +RtlGetVersion( + IN OUT PRTL_OSVERSIONINFOW lpVersionInformation); + +NTSYSAPI +NTSTATUS +NTAPI +RtlVerifyVersionInfo( + IN PRTL_OSVERSIONINFOEXW VersionInfo, + IN ULONG TypeMask, + IN ULONGLONG ConditionMask); + +NTSYSAPI +LONG +NTAPI +RtlCompareString( + IN const PSTRING String1, + IN const PSTRING String2, + BOOLEAN CaseInSensitive); + +NTSYSAPI +VOID +NTAPI +RtlCopyString( + OUT PSTRING DestinationString, + IN const PSTRING SourceString OPTIONAL); + +NTSYSAPI +BOOLEAN +NTAPI +RtlEqualString( + IN const PSTRING String1, + IN const PSTRING String2, + IN BOOLEAN CaseInSensitive); + +NTSYSAPI +NTSTATUS +NTAPI +RtlCharToInteger( + IN PCSZ String, + IN ULONG Base OPTIONAL, + OUT PULONG Value); + +NTSYSAPI +CHAR +NTAPI +RtlUpperChar( + IN CHAR Character); + +NTSYSAPI +ULONG +NTAPI +RtlWalkFrameChain( + OUT PVOID *Callers, + IN ULONG Count, + IN ULONG Flags); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +/* Security reference monitor routines */ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +BOOLEAN +NTAPI +SeSinglePrivilegeCheck( + IN LUID PrivilegeValue, + IN KPROCESSOR_MODE PreviousMode); +#endif + +/* ZwXxx Functions */ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTSTATUS +NTAPI +ZwCancelTimer( + IN HANDLE TimerHandle, + OUT PBOOLEAN CurrentState OPTIONAL); + +NTSTATUS +NTAPI +ZwCreateTimer( + OUT PHANDLE TimerHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN TIMER_TYPE TimerType); + +NTSTATUS +NTAPI +ZwOpenTimer( + OUT PHANDLE TimerHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetInformationThread( + IN HANDLE ThreadHandle, + IN THREADINFOCLASS ThreadInformationClass, + IN PVOID ThreadInformation, + IN ULONG ThreadInformationLength); + +NTSTATUS +NTAPI +ZwSetTimer( + IN HANDLE TimerHandle, + IN PLARGE_INTEGER DueTime, + IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL, + IN PVOID TimerContext OPTIONAL, + IN BOOLEAN ResumeTimer, + IN LONG Period OPTIONAL, + OUT PBOOLEAN PreviousState OPTIONAL); + +#endif + + +#ifdef __cplusplus +} +#endif #endif /* _NTDDK_ */ diff --git a/reactos/include/ddk/ntddvdeo.h b/reactos/include/ddk/ntddvdeo.h index c4522343e34..f2fdc5bcae7 100644 --- a/reactos/include/ddk/ntddvdeo.h +++ b/reactos/include/ddk/ntddvdeo.h @@ -35,6 +35,41 @@ extern "C" { DEFINE_GUID(GUID_DEVINTERFACE_DISPLAY_ADAPTER, \ 0x5b45201d, 0xf2f2, 0x4f3b, 0x85, 0xbb, 0x30, 0xff, 0x1f, 0x95, 0x35, 0x99); +#define IOCTL_VIDEO_ENABLE_VDM \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x00, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_DISABLE_VDM \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x01, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_REGISTER_VDM \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x02, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_SET_OUTPUT_DEVICE_POWER_STATE \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x03, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_GET_OUTPUT_DEVICE_POWER_STATE \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x04, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_MONITOR_DEVICE \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x05, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_ENUM_MONITOR_PDO \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x06, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_INIT_WIN32K_CALLBACKS \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x07, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_HANDLE_VIDEOPARAMETERS \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x08, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_IS_VGA_DEVICE \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x09, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_USE_DEVICE_IN_SESSION \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x0a, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_VIDEO_PREPARE_FOR_EARECOVERY \ + CTL_CODE(FILE_DEVICE_VIDEO, 0x0b, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_VIDEO_DISABLE_CURSOR \ CTL_CODE (FILE_DEVICE_VIDEO, 0x109, METHOD_BUFFERED, FILE_ANY_ACCESS) @@ -60,9 +95,6 @@ DEFINE_GUID(GUID_DEVINTERFACE_DISPLAY_ADAPTER, \ #define IOCTL_VIDEO_GET_POWER_MANAGEMENT \ CTL_CODE(FILE_DEVICE_VIDEO, 0x11c, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define IOCTL_VIDEO_HANDLE_VIDEOPARAMETERS \ - CTL_CODE(FILE_DEVICE_VIDEO, 0x08, METHOD_BUFFERED, FILE_ANY_ACCESS) - #define IOCTL_VIDEO_LOAD_AND_SET_FONT \ CTL_CODE(FILE_DEVICE_VIDEO, 0x105, METHOD_BUFFERED, FILE_ANY_ACCESS) diff --git a/reactos/include/ddk/ntifs.h b/reactos/include/ddk/ntifs.h index ae1e5025ecf..5f032726d38 100644 --- a/reactos/include/ddk/ntifs.h +++ b/reactos/include/ddk/ntifs.h @@ -20,94 +20,304 @@ * */ -#ifndef _NTIFS_ -#define _NTIFS_ -#define _GNU_NTIFS_ - -#define NTKERNELAPI DECLSPEC_IMPORT - -#include +#pragma once #define _NTIFS_INCLUDED_ +#define _GNU_NTIFS_ + +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + #ifdef __cplusplus extern "C" { #endif -#pragma pack(push,4) - -#ifndef VER_PRODUCTBUILD -#define VER_PRODUCTBUILD 10000 +#if !defined(_NTHALDLL_) && !defined(_BLDR_) +#define NTHALAPI DECLSPEC_IMPORT +#else +#define NTHALAPI #endif -#define EX_PUSH_LOCK ULONG_PTR -#define PEX_PUSH_LOCK PULONG_PTR +/* For ReactOS */ +#if !defined(_NTOSKRNL_) && !defined(_BLDR_) +#define NTKERNELAPI DECLSPEC_IMPORT +#else +#define NTKERNELAPI +#endif + +/* Dependencies */ +#include +#include +#include +#include +#include +#include +/* FIXME : #include */ - #ifndef FlagOn #define FlagOn(_F,_SF) ((_F) & (_SF)) #endif - + #ifndef BooleanFlagOn #define BooleanFlagOn(F,SF) ((BOOLEAN)(((F) & (SF)) != 0)) #endif - + #ifndef SetFlag #define SetFlag(_F,_SF) ((_F) |= (_SF)) #endif - + #ifndef ClearFlag #define ClearFlag(_F,_SF) ((_F) &= ~(_SF)) #endif - -#include "csq.h" -#ifdef _NTOSKRNL_ -extern PUCHAR FsRtlLegalAnsiCharacterArray; +#define PsGetCurrentProcess IoGetCurrentProcess + +#if (NTDDI_VERSION >= NTDDI_VISTA) +extern NTSYSAPI volatile CCHAR KeNumberProcessors; +#elif (NTDDI_VERSION >= NTDDI_WINXP) +extern NTSYSAPI CCHAR KeNumberProcessors; #else -extern DECLSPEC_IMPORT PUCHAR FsRtlLegalAnsiCharacterArray; +extern PCCHAR KeNumberProcessors; #endif -extern PACL SePublicDefaultDacl; -extern PACL SeSystemDefaultDacl; - -extern KSPIN_LOCK IoStatisticsLock; -extern ULONG IoReadOperationCount; -extern ULONG IoWriteOperationCount; -extern ULONG IoOtherOperationCount; -extern LARGE_INTEGER IoReadTransferCount; -extern LARGE_INTEGER IoWriteTransferCount; -extern LARGE_INTEGER IoOtherTransferCount; +typedef UNICODE_STRING LSA_UNICODE_STRING, *PLSA_UNICODE_STRING; typedef STRING LSA_STRING, *PLSA_STRING; -typedef ULONG LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE; +typedef OBJECT_ATTRIBUTES LSA_OBJECT_ATTRIBUTES, *PLSA_OBJECT_ATTRIBUTES; -typedef enum _SECURITY_LOGON_TYPE -{ - UndefinedLogonType = 0, - Interactive = 2, - Network, - Batch, - Service, - Proxy, - Unlock, - NetworkCleartext, - NewCredentials, -#if (_WIN32_WINNT >= 0x0501) - RemoteInteractive, - CachedInteractive, +#ifndef SID_IDENTIFIER_AUTHORITY_DEFINED +#define SID_IDENTIFIER_AUTHORITY_DEFINED +typedef struct _SID_IDENTIFIER_AUTHORITY { + UCHAR Value[6]; +} SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY; #endif -#if (_WIN32_WINNT >= 0x0502) - CachedRemoteInteractive, - CachedUnlock + +#ifndef SID_DEFINED +#define SID_DEFINED +typedef struct _SID { + UCHAR Revision; + UCHAR SubAuthorityCount; + SID_IDENTIFIER_AUTHORITY IdentifierAuthority; + ULONG SubAuthority[ANYSIZE_ARRAY]; +} SID, *PISID; #endif -} SECURITY_LOGON_TYPE, *PSECURITY_LOGON_TYPE; -#define ANSI_DOS_STAR ('<') -#define ANSI_DOS_QM ('>') -#define ANSI_DOS_DOT ('"') +#define SID_REVISION 1 +#define SID_MAX_SUB_AUTHORITIES 15 +#define SID_RECOMMENDED_SUB_AUTHORITIES 1 -#define DOS_STAR (L'<') -#define DOS_QM (L'>') -#define DOS_DOT (L'"') +typedef enum _SID_NAME_USE { + SidTypeUser = 1, + SidTypeGroup, + SidTypeDomain, + SidTypeAlias, + SidTypeWellKnownGroup, + SidTypeDeletedAccount, + SidTypeInvalid, + SidTypeUnknown, + SidTypeComputer, + SidTypeLabel +} SID_NAME_USE, *PSID_NAME_USE; + +typedef struct _SID_AND_ATTRIBUTES { + PSID Sid; + ULONG Attributes; +} SID_AND_ATTRIBUTES, *PSID_AND_ATTRIBUTES; +typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY]; +typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY; + +#define SID_HASH_SIZE 32 +typedef ULONG_PTR SID_HASH_ENTRY, *PSID_HASH_ENTRY; + +typedef struct _SID_AND_ATTRIBUTES_HASH { + ULONG SidCount; + PSID_AND_ATTRIBUTES SidAttr; + SID_HASH_ENTRY Hash[SID_HASH_SIZE]; +} SID_AND_ATTRIBUTES_HASH, *PSID_AND_ATTRIBUTES_HASH; + +/* Universal well-known SIDs */ + +#define SECURITY_NULL_SID_AUTHORITY {0,0,0,0,0,0} +#define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1} +#define SECURITY_LOCAL_SID_AUTHORITY {0,0,0,0,0,2} +#define SECURITY_CREATOR_SID_AUTHORITY {0,0,0,0,0,3} +#define SECURITY_NON_UNIQUE_AUTHORITY {0,0,0,0,0,4} +#define SECURITY_RESOURCE_MANAGER_AUTHORITY {0,0,0,0,0,9} + +#define SECURITY_NULL_RID (0x00000000L) +#define SECURITY_WORLD_RID (0x00000000L) +#define SECURITY_LOCAL_RID (0x00000000L) +#define SECURITY_LOCAL_LOGON_RID (0x00000001L) + +#define SECURITY_CREATOR_OWNER_RID (0x00000000L) +#define SECURITY_CREATOR_GROUP_RID (0x00000001L) +#define SECURITY_CREATOR_OWNER_SERVER_RID (0x00000002L) +#define SECURITY_CREATOR_GROUP_SERVER_RID (0x00000003L) +#define SECURITY_CREATOR_OWNER_RIGHTS_RID (0x00000004L) + +/* NT well-known SIDs */ + +#define SECURITY_NT_AUTHORITY {0,0,0,0,0,5} + +#define SECURITY_DIALUP_RID (0x00000001L) +#define SECURITY_NETWORK_RID (0x00000002L) +#define SECURITY_BATCH_RID (0x00000003L) +#define SECURITY_INTERACTIVE_RID (0x00000004L) +#define SECURITY_LOGON_IDS_RID (0x00000005L) +#define SECURITY_LOGON_IDS_RID_COUNT (3L) +#define SECURITY_SERVICE_RID (0x00000006L) +#define SECURITY_ANONYMOUS_LOGON_RID (0x00000007L) +#define SECURITY_PROXY_RID (0x00000008L) +#define SECURITY_ENTERPRISE_CONTROLLERS_RID (0x00000009L) +#define SECURITY_SERVER_LOGON_RID SECURITY_ENTERPRISE_CONTROLLERS_RID +#define SECURITY_PRINCIPAL_SELF_RID (0x0000000AL) +#define SECURITY_AUTHENTICATED_USER_RID (0x0000000BL) +#define SECURITY_RESTRICTED_CODE_RID (0x0000000CL) +#define SECURITY_TERMINAL_SERVER_RID (0x0000000DL) +#define SECURITY_REMOTE_LOGON_RID (0x0000000EL) +#define SECURITY_THIS_ORGANIZATION_RID (0x0000000FL) +#define SECURITY_IUSER_RID (0x00000011L) +#define SECURITY_LOCAL_SYSTEM_RID (0x00000012L) +#define SECURITY_LOCAL_SERVICE_RID (0x00000013L) +#define SECURITY_NETWORK_SERVICE_RID (0x00000014L) +#define SECURITY_NT_NON_UNIQUE (0x00000015L) +#define SECURITY_NT_NON_UNIQUE_SUB_AUTH_COUNT (3L) +#define SECURITY_ENTERPRISE_READONLY_CONTROLLERS_RID (0x00000016L) + +#define SECURITY_BUILTIN_DOMAIN_RID (0x00000020L) +#define SECURITY_WRITE_RESTRICTED_CODE_RID (0x00000021L) + + +#define SECURITY_PACKAGE_BASE_RID (0x00000040L) +#define SECURITY_PACKAGE_RID_COUNT (2L) +#define SECURITY_PACKAGE_NTLM_RID (0x0000000AL) +#define SECURITY_PACKAGE_SCHANNEL_RID (0x0000000EL) +#define SECURITY_PACKAGE_DIGEST_RID (0x00000015L) + +#define SECURITY_CRED_TYPE_BASE_RID (0x00000041L) +#define SECURITY_CRED_TYPE_RID_COUNT (2L) +#define SECURITY_CRED_TYPE_THIS_ORG_CERT_RID (0x00000001L) + +#define SECURITY_MIN_BASE_RID (0x00000050L) +#define SECURITY_SERVICE_ID_BASE_RID (0x00000050L) +#define SECURITY_SERVICE_ID_RID_COUNT (6L) +#define SECURITY_RESERVED_ID_BASE_RID (0x00000051L) +#define SECURITY_APPPOOL_ID_BASE_RID (0x00000052L) +#define SECURITY_APPPOOL_ID_RID_COUNT (6L) +#define SECURITY_VIRTUALSERVER_ID_BASE_RID (0x00000053L) +#define SECURITY_VIRTUALSERVER_ID_RID_COUNT (6L) +#define SECURITY_USERMODEDRIVERHOST_ID_BASE_RID (0x00000054L) +#define SECURITY_USERMODEDRIVERHOST_ID_RID_COUNT (6L) +#define SECURITY_CLOUD_INFRASTRUCTURE_SERVICES_ID_BASE_RID (0x00000055L) +#define SECURITY_CLOUD_INFRASTRUCTURE_SERVICES_ID_RID_COUNT (6L) +#define SECURITY_WMIHOST_ID_BASE_RID (0x00000056L) +#define SECURITY_WMIHOST_ID_RID_COUNT (6L) +#define SECURITY_TASK_ID_BASE_RID (0x00000057L) +#define SECURITY_NFS_ID_BASE_RID (0x00000058L) +#define SECURITY_COM_ID_BASE_RID (0x00000059L) +#define SECURITY_VIRTUALACCOUNT_ID_RID_COUNT (6L) + +#define SECURITY_MAX_BASE_RID (0x0000006FL) + +#define SECURITY_MAX_ALWAYS_FILTERED (0x000003E7L) +#define SECURITY_MIN_NEVER_FILTERED (0x000003E8L) + +#define SECURITY_OTHER_ORGANIZATION_RID (0x000003E8L) + +#define SECURITY_WINDOWSMOBILE_ID_BASE_RID (0x00000070L) + +/* Well-known domain relative sub-authority values (RIDs) */ + +#define DOMAIN_GROUP_RID_ENTERPRISE_READONLY_DOMAIN_CONTROLLERS (0x000001F2L) + +#define FOREST_USER_RID_MAX (0x000001F3L) + +/* Well-known users */ + +#define DOMAIN_USER_RID_ADMIN (0x000001F4L) +#define DOMAIN_USER_RID_GUEST (0x000001F5L) +#define DOMAIN_USER_RID_KRBTGT (0x000001F6L) + +#define DOMAIN_USER_RID_MAX (0x000003E7L) + +/* Well-known groups */ + +#define DOMAIN_GROUP_RID_ADMINS (0x00000200L) +#define DOMAIN_GROUP_RID_USERS (0x00000201L) +#define DOMAIN_GROUP_RID_GUESTS (0x00000202L) +#define DOMAIN_GROUP_RID_COMPUTERS (0x00000203L) +#define DOMAIN_GROUP_RID_CONTROLLERS (0x00000204L) +#define DOMAIN_GROUP_RID_CERT_ADMINS (0x00000205L) +#define DOMAIN_GROUP_RID_SCHEMA_ADMINS (0x00000206L) +#define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS (0x00000207L) +#define DOMAIN_GROUP_RID_POLICY_ADMINS (0x00000208L) +#define DOMAIN_GROUP_RID_READONLY_CONTROLLERS (0x00000209L) + +/* Well-known aliases */ + +#define DOMAIN_ALIAS_RID_ADMINS (0x00000220L) +#define DOMAIN_ALIAS_RID_USERS (0x00000221L) +#define DOMAIN_ALIAS_RID_GUESTS (0x00000222L) +#define DOMAIN_ALIAS_RID_POWER_USERS (0x00000223L) + +#define DOMAIN_ALIAS_RID_ACCOUNT_OPS (0x00000224L) +#define DOMAIN_ALIAS_RID_SYSTEM_OPS (0x00000225L) +#define DOMAIN_ALIAS_RID_PRINT_OPS (0x00000226L) +#define DOMAIN_ALIAS_RID_BACKUP_OPS (0x00000227L) + +#define DOMAIN_ALIAS_RID_REPLICATOR (0x00000228L) +#define DOMAIN_ALIAS_RID_RAS_SERVERS (0x00000229L) +#define DOMAIN_ALIAS_RID_PREW2KCOMPACCESS (0x0000022AL) +#define DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS (0x0000022BL) +#define DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS (0x0000022CL) +#define DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS (0x0000022DL) + +#define DOMAIN_ALIAS_RID_MONITORING_USERS (0x0000022EL) +#define DOMAIN_ALIAS_RID_LOGGING_USERS (0x0000022FL) +#define DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS (0x00000230L) +#define DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS (0x00000231L) +#define DOMAIN_ALIAS_RID_DCOM_USERS (0x00000232L) +#define DOMAIN_ALIAS_RID_IUSERS (0x00000238L) +#define DOMAIN_ALIAS_RID_CRYPTO_OPERATORS (0x00000239L) +#define DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP (0x0000023BL) +#define DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP (0x0000023CL) +#define DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP (0x0000023DL) +#define DOMAIN_ALIAS_RID_CERTSVC_DCOM_ACCESS_GROUP (0x0000023EL) + +#define SECURITY_MANDATORY_LABEL_AUTHORITY {0,0,0,0,0,16} +#define SECURITY_MANDATORY_UNTRUSTED_RID (0x00000000L) +#define SECURITY_MANDATORY_LOW_RID (0x00001000L) +#define SECURITY_MANDATORY_MEDIUM_RID (0x00002000L) +#define SECURITY_MANDATORY_HIGH_RID (0x00003000L) +#define SECURITY_MANDATORY_SYSTEM_RID (0x00004000L) +#define SECURITY_MANDATORY_PROTECTED_PROCESS_RID (0x00005000L) + +/* SECURITY_MANDATORY_MAXIMUM_USER_RID is the highest RID that + can be set by a usermode caller.*/ + +#define SECURITY_MANDATORY_MAXIMUM_USER_RID SECURITY_MANDATORY_SYSTEM_RID + +#define MANDATORY_LEVEL_TO_MANDATORY_RID(IL) (IL * 0x1000) + +/* Allocate the System Luid. The first 1000 LUIDs are reserved. + Use #999 here (0x3e7 = 999) */ + +#define SYSTEM_LUID { 0x3e7, 0x0 } +#define ANONYMOUS_LOGON_LUID { 0x3e6, 0x0 } +#define LOCALSERVICE_LUID { 0x3e5, 0x0 } +#define NETWORKSERVICE_LUID { 0x3e4, 0x0 } +#define IUSER_LUID { 0x3e3, 0x0 } + +typedef struct _ACE_HEADER { + UCHAR AceType; + UCHAR AceFlags; + USHORT AceSize; +} ACE_HEADER, *PACE_HEADER; /* also in winnt.h */ #define ACCESS_MIN_MS_ACE_TYPE (0x0) @@ -134,7 +344,2061 @@ typedef enum _SECURITY_LOGON_TYPE #define SYSTEM_ALARM_CALLBACK_ACE_TYPE (0xE) #define SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE (0xF) #define SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE (0x10) -#define ACCESS_MAX_MS_V5_ACE_TYPE (0x10) +#define ACCESS_MAX_MS_V5_ACE_TYPE (0x11) +#define SYSTEM_MANDATORY_LABEL_ACE_TYPE (0x11) + +/* The following are the inherit flags that go into the AceFlags field + of an Ace header. */ + +#define OBJECT_INHERIT_ACE (0x1) +#define CONTAINER_INHERIT_ACE (0x2) +#define NO_PROPAGATE_INHERIT_ACE (0x4) +#define INHERIT_ONLY_ACE (0x8) +#define INHERITED_ACE (0x10) +#define VALID_INHERIT_FLAGS (0x1F) + +#define SUCCESSFUL_ACCESS_ACE_FLAG (0x40) +#define FAILED_ACCESS_ACE_FLAG (0x80) + +typedef struct _ACCESS_ALLOWED_ACE { + ACE_HEADER Header; + ACCESS_MASK Mask; + ULONG SidStart; +} ACCESS_ALLOWED_ACE, *PACCESS_ALLOWED_ACE; + +typedef struct _ACCESS_DENIED_ACE { + ACE_HEADER Header; + ACCESS_MASK Mask; + ULONG SidStart; +} ACCESS_DENIED_ACE, *PACCESS_DENIED_ACE; + +typedef struct _SYSTEM_AUDIT_ACE { + ACE_HEADER Header; + ACCESS_MASK Mask; + ULONG SidStart; +} SYSTEM_AUDIT_ACE, *PSYSTEM_AUDIT_ACE; + +typedef struct _SYSTEM_ALARM_ACE { + ACE_HEADER Header; + ACCESS_MASK Mask; + ULONG SidStart; +} SYSTEM_ALARM_ACE, *PSYSTEM_ALARM_ACE; + +typedef struct _SYSTEM_MANDATORY_LABEL_ACE { + ACE_HEADER Header; + ACCESS_MASK Mask; + ULONG SidStart; +} SYSTEM_MANDATORY_LABEL_ACE, *PSYSTEM_MANDATORY_LABEL_ACE; + +#define SYSTEM_MANDATORY_LABEL_NO_WRITE_UP 0x1 +#define SYSTEM_MANDATORY_LABEL_NO_READ_UP 0x2 +#define SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP 0x4 +#define SYSTEM_MANDATORY_LABEL_VALID_MASK (SYSTEM_MANDATORY_LABEL_NO_WRITE_UP | \ + SYSTEM_MANDATORY_LABEL_NO_READ_UP | \ + SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP) + +#define SECURITY_DESCRIPTOR_MIN_LENGTH (sizeof(SECURITY_DESCRIPTOR)) + +typedef USHORT SECURITY_DESCRIPTOR_CONTROL,*PSECURITY_DESCRIPTOR_CONTROL; + +#define SE_OWNER_DEFAULTED 0x0001 +#define SE_GROUP_DEFAULTED 0x0002 +#define SE_DACL_PRESENT 0x0004 +#define SE_DACL_DEFAULTED 0x0008 +#define SE_SACL_PRESENT 0x0010 +#define SE_SACL_DEFAULTED 0x0020 +#define SE_DACL_UNTRUSTED 0x0040 +#define SE_SERVER_SECURITY 0x0080 +#define SE_DACL_AUTO_INHERIT_REQ 0x0100 +#define SE_SACL_AUTO_INHERIT_REQ 0x0200 +#define SE_DACL_AUTO_INHERITED 0x0400 +#define SE_SACL_AUTO_INHERITED 0x0800 +#define SE_DACL_PROTECTED 0x1000 +#define SE_SACL_PROTECTED 0x2000 +#define SE_RM_CONTROL_VALID 0x4000 +#define SE_SELF_RELATIVE 0x8000 + +typedef struct _SECURITY_DESCRIPTOR_RELATIVE { + UCHAR Revision; + UCHAR Sbz1; + SECURITY_DESCRIPTOR_CONTROL Control; + ULONG Owner; + ULONG Group; + ULONG Sacl; + ULONG Dacl; +} SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE; + +typedef struct _SECURITY_DESCRIPTOR { + UCHAR Revision; + UCHAR Sbz1; + SECURITY_DESCRIPTOR_CONTROL Control; + PSID Owner; + PSID Group; + PACL Sacl; + PACL Dacl; +} SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR; + +typedef struct _OBJECT_TYPE_LIST { + USHORT Level; + USHORT Sbz; + GUID *ObjectType; +} OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST; + +#define ACCESS_OBJECT_GUID 0 +#define ACCESS_PROPERTY_SET_GUID 1 +#define ACCESS_PROPERTY_GUID 2 +#define ACCESS_MAX_LEVEL 4 + +typedef enum _AUDIT_EVENT_TYPE { + AuditEventObjectAccess, + AuditEventDirectoryServiceAccess +} AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE; + +#define AUDIT_ALLOW_NO_PRIVILEGE 0x1 + +#define ACCESS_DS_SOURCE_A "DS" +#define ACCESS_DS_SOURCE_W L"DS" +#define ACCESS_DS_OBJECT_TYPE_NAME_A "Directory Service Object" +#define ACCESS_DS_OBJECT_TYPE_NAME_W L"Directory Service Object" + +#define ACCESS_REASON_TYPE_MASK 0xffff0000 +#define ACCESS_REASON_DATA_MASK 0x0000ffff + +typedef enum _ACCESS_REASON_TYPE { + AccessReasonNone = 0x00000000, + AccessReasonAllowedAce = 0x00010000, + AccessReasonDeniedAce = 0x00020000, + AccessReasonAllowedParentAce = 0x00030000, + AccessReasonDeniedParentAce = 0x00040000, + AccessReasonMissingPrivilege = 0x00100000, + AccessReasonFromPrivilege = 0x00200000, + AccessReasonIntegrityLevel = 0x00300000, + AccessReasonOwnership = 0x00400000, + AccessReasonNullDacl = 0x00500000, + AccessReasonEmptyDacl = 0x00600000, + AccessReasonNoSD = 0x00700000, + AccessReasonNoGrant = 0x00800000 +} ACCESS_REASON_TYPE; + +typedef ULONG ACCESS_REASON; + +typedef struct _ACCESS_REASONS { + ACCESS_REASON Data[32]; +} ACCESS_REASONS, *PACCESS_REASONS; + +#define SE_SECURITY_DESCRIPTOR_FLAG_NO_OWNER_ACE 0x00000001 +#define SE_SECURITY_DESCRIPTOR_FLAG_NO_LABEL_ACE 0x00000002 +#define SE_SECURITY_DESCRIPTOR_VALID_FLAGS 0x00000003 + +typedef struct _SE_SECURITY_DESCRIPTOR { + ULONG Size; + ULONG Flags; + PSECURITY_DESCRIPTOR SecurityDescriptor; +} SE_SECURITY_DESCRIPTOR, *PSE_SECURITY_DESCRIPTOR; + +typedef struct _SE_ACCESS_REQUEST { + ULONG Size; + PSE_SECURITY_DESCRIPTOR SeSecurityDescriptor; + ACCESS_MASK DesiredAccess; + ACCESS_MASK PreviouslyGrantedAccess; + PSID PrincipalSelfSid; + PGENERIC_MAPPING GenericMapping; + ULONG ObjectTypeListCount; + POBJECT_TYPE_LIST ObjectTypeList; +} SE_ACCESS_REQUEST, *PSE_ACCESS_REQUEST; + +typedef struct _SE_ACCESS_REPLY { + ULONG Size; + ULONG ResultListCount; + PACCESS_MASK GrantedAccess; + PNTSTATUS AccessStatus; + PACCESS_REASONS AccessReason; + PPRIVILEGE_SET* Privileges; +} SE_ACCESS_REPLY, *PSE_ACCESS_REPLY; + +typedef enum _SE_AUDIT_OPERATION { + AuditPrivilegeObject, + AuditPrivilegeService, + AuditAccessCheck, + AuditOpenObject, + AuditOpenObjectWithTransaction, + AuditCloseObject, + AuditDeleteObject, + AuditOpenObjectForDelete, + AuditOpenObjectForDeleteWithTransaction, + AuditCloseNonObject, + AuditOpenNonObject, + AuditObjectReference, + AuditHandleCreation, +} SE_AUDIT_OPERATION, *PSE_AUDIT_OPERATION; + +typedef struct _SE_AUDIT_INFO { + ULONG Size; + AUDIT_EVENT_TYPE AuditType; + SE_AUDIT_OPERATION AuditOperation; + ULONG AuditFlags; + UNICODE_STRING SubsystemName; + UNICODE_STRING ObjectTypeName; + UNICODE_STRING ObjectName; + PVOID HandleId; + GUID* TransactionId; + LUID* OperationId; + BOOLEAN ObjectCreation; + BOOLEAN GenerateOnClose; +} SE_AUDIT_INFO, *PSE_AUDIT_INFO; + +#define TOKEN_ASSIGN_PRIMARY (0x0001) +#define TOKEN_DUPLICATE (0x0002) +#define TOKEN_IMPERSONATE (0x0004) +#define TOKEN_QUERY (0x0008) +#define TOKEN_QUERY_SOURCE (0x0010) +#define TOKEN_ADJUST_PRIVILEGES (0x0020) +#define TOKEN_ADJUST_GROUPS (0x0040) +#define TOKEN_ADJUST_DEFAULT (0x0080) +#define TOKEN_ADJUST_SESSIONID (0x0100) + +#define TOKEN_ALL_ACCESS_P (STANDARD_RIGHTS_REQUIRED |\ + TOKEN_ASSIGN_PRIMARY |\ + TOKEN_DUPLICATE |\ + TOKEN_IMPERSONATE |\ + TOKEN_QUERY |\ + TOKEN_QUERY_SOURCE |\ + TOKEN_ADJUST_PRIVILEGES |\ + TOKEN_ADJUST_GROUPS |\ + TOKEN_ADJUST_DEFAULT ) + +#if ((defined(_WIN32_WINNT) && (_WIN32_WINNT > 0x0400)) || (!defined(_WIN32_WINNT))) +#define TOKEN_ALL_ACCESS (TOKEN_ALL_ACCESS_P |\ + TOKEN_ADJUST_SESSIONID ) +#else +#define TOKEN_ALL_ACCESS (TOKEN_ALL_ACCESS_P) +#endif + +#define TOKEN_READ (STANDARD_RIGHTS_READ |\ + TOKEN_QUERY) + +#define TOKEN_WRITE (STANDARD_RIGHTS_WRITE |\ + TOKEN_ADJUST_PRIVILEGES |\ + TOKEN_ADJUST_GROUPS |\ + TOKEN_ADJUST_DEFAULT) + +#define TOKEN_EXECUTE (STANDARD_RIGHTS_EXECUTE) + +typedef enum _TOKEN_TYPE { + TokenPrimary = 1, + TokenImpersonation +} TOKEN_TYPE,*PTOKEN_TYPE; + +typedef enum _TOKEN_INFORMATION_CLASS { + TokenUser = 1, + TokenGroups, + TokenPrivileges, + TokenOwner, + TokenPrimaryGroup, + TokenDefaultDacl, + TokenSource, + TokenType, + TokenImpersonationLevel, + TokenStatistics, + TokenRestrictedSids, + TokenSessionId, + TokenGroupsAndPrivileges, + TokenSessionReference, + TokenSandBoxInert, + TokenAuditPolicy, + TokenOrigin, + TokenElevationType, + TokenLinkedToken, + TokenElevation, + TokenHasRestrictions, + TokenAccessInformation, + TokenVirtualizationAllowed, + TokenVirtualizationEnabled, + TokenIntegrityLevel, + TokenUIAccess, + TokenMandatoryPolicy, + TokenLogonSid, + MaxTokenInfoClass +} TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS; + +typedef struct _TOKEN_USER { + SID_AND_ATTRIBUTES User; +} TOKEN_USER, *PTOKEN_USER; + +typedef struct _TOKEN_GROUPS { + ULONG GroupCount; + SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]; +} TOKEN_GROUPS,*PTOKEN_GROUPS,*LPTOKEN_GROUPS; + +typedef struct _TOKEN_PRIVILEGES { + ULONG PrivilegeCount; + LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; +} TOKEN_PRIVILEGES,*PTOKEN_PRIVILEGES,*LPTOKEN_PRIVILEGES; + +typedef struct _TOKEN_OWNER { + PSID Owner; +} TOKEN_OWNER,*PTOKEN_OWNER; + +typedef struct _TOKEN_PRIMARY_GROUP { + PSID PrimaryGroup; +} TOKEN_PRIMARY_GROUP,*PTOKEN_PRIMARY_GROUP; + +typedef struct _TOKEN_DEFAULT_DACL { + PACL DefaultDacl; +} TOKEN_DEFAULT_DACL,*PTOKEN_DEFAULT_DACL; + +typedef struct _TOKEN_GROUPS_AND_PRIVILEGES { + ULONG SidCount; + ULONG SidLength; + PSID_AND_ATTRIBUTES Sids; + ULONG RestrictedSidCount; + ULONG RestrictedSidLength; + PSID_AND_ATTRIBUTES RestrictedSids; + ULONG PrivilegeCount; + ULONG PrivilegeLength; + PLUID_AND_ATTRIBUTES Privileges; + LUID AuthenticationId; +} TOKEN_GROUPS_AND_PRIVILEGES, *PTOKEN_GROUPS_AND_PRIVILEGES; + +typedef struct _TOKEN_LINKED_TOKEN { + HANDLE LinkedToken; +} TOKEN_LINKED_TOKEN, *PTOKEN_LINKED_TOKEN; + +typedef struct _TOKEN_ELEVATION { + ULONG TokenIsElevated; +} TOKEN_ELEVATION, *PTOKEN_ELEVATION; + +typedef struct _TOKEN_MANDATORY_LABEL { + SID_AND_ATTRIBUTES Label; +} TOKEN_MANDATORY_LABEL, *PTOKEN_MANDATORY_LABEL; + +#define TOKEN_MANDATORY_POLICY_OFF 0x0 +#define TOKEN_MANDATORY_POLICY_NO_WRITE_UP 0x1 +#define TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN 0x2 + +#define TOKEN_MANDATORY_POLICY_VALID_MASK (TOKEN_MANDATORY_POLICY_NO_WRITE_UP | \ + TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN) + +typedef struct _TOKEN_MANDATORY_POLICY { + ULONG Policy; +} TOKEN_MANDATORY_POLICY, *PTOKEN_MANDATORY_POLICY; + +typedef struct _TOKEN_ACCESS_INFORMATION { + PSID_AND_ATTRIBUTES_HASH SidHash; + PSID_AND_ATTRIBUTES_HASH RestrictedSidHash; + PTOKEN_PRIVILEGES Privileges; + LUID AuthenticationId; + TOKEN_TYPE TokenType; + SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; + TOKEN_MANDATORY_POLICY MandatoryPolicy; + ULONG Flags; +} TOKEN_ACCESS_INFORMATION, *PTOKEN_ACCESS_INFORMATION; + +#define POLICY_AUDIT_SUBCATEGORY_COUNT (53) + +typedef struct _TOKEN_AUDIT_POLICY { + UCHAR PerUserPolicy[((POLICY_AUDIT_SUBCATEGORY_COUNT) >> 1) + 1]; +} TOKEN_AUDIT_POLICY, *PTOKEN_AUDIT_POLICY; + +#define TOKEN_SOURCE_LENGTH 8 + +typedef struct _TOKEN_SOURCE { + CHAR SourceName[TOKEN_SOURCE_LENGTH]; + LUID SourceIdentifier; +} TOKEN_SOURCE,*PTOKEN_SOURCE; + +typedef struct _TOKEN_STATISTICS { + LUID TokenId; + LUID AuthenticationId; + LARGE_INTEGER ExpirationTime; + TOKEN_TYPE TokenType; + SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; + ULONG DynamicCharged; + ULONG DynamicAvailable; + ULONG GroupCount; + ULONG PrivilegeCount; + LUID ModifiedId; +} TOKEN_STATISTICS, *PTOKEN_STATISTICS; + +typedef struct _TOKEN_CONTROL { + LUID TokenId; + LUID AuthenticationId; + LUID ModifiedId; + TOKEN_SOURCE TokenSource; +} TOKEN_CONTROL,*PTOKEN_CONTROL; + +typedef struct _TOKEN_ORIGIN { + LUID OriginatingLogonSession; +} TOKEN_ORIGIN, *PTOKEN_ORIGIN; + +typedef enum _MANDATORY_LEVEL { + MandatoryLevelUntrusted = 0, + MandatoryLevelLow, + MandatoryLevelMedium, + MandatoryLevelHigh, + MandatoryLevelSystem, + MandatoryLevelSecureProcess, + MandatoryLevelCount +} MANDATORY_LEVEL, *PMANDATORY_LEVEL; + +typedef enum _OBJECT_INFORMATION_CLASS { + ObjectBasicInformation = 0, + ObjectNameInformation = 1, /* FIXME, not in WDK */ + ObjectTypeInformation = 2, + ObjectTypesInformation = 3, /* FIXME, not in WDK */ + ObjectHandleFlagInformation = 4, /* FIXME, not in WDK */ + ObjectSessionInformation = 5, /* FIXME, not in WDK */ + MaxObjectInfoClass /* FIXME, not in WDK */ +} OBJECT_INFORMATION_CLASS; + +#if (NTDDI_VERSION >= NTDDI_NT4) + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryObject( + IN HANDLE Handle OPTIONAL, + IN OBJECT_INFORMATION_CLASS ObjectInformationClass, + OUT PVOID ObjectInformation OPTIONAL, + IN ULONG ObjectInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenThreadToken( + IN HANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN OpenAsSelf, + OUT PHANDLE TokenHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenProcessToken( + IN HANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE TokenHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryInformationToken( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + OUT PVOID TokenInformation OPTIONAL, + IN ULONG TokenInformationLength, + OUT PULONG ReturnLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtAdjustPrivilegesToken( + IN HANDLE TokenHandle, + IN BOOLEAN DisableAllPrivileges, + IN PTOKEN_PRIVILEGES NewState OPTIONAL, + IN ULONG BufferLength, + OUT PTOKEN_PRIVILEGES PreviousState, + OUT PULONG ReturnLength OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCreateFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG CreateDisposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer, + IN ULONG EaLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtDeviceIoControlFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtFsControlFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG FsControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtLockFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER ByteOffset, + IN PLARGE_INTEGER Length, + IN ULONG Key, + IN BOOLEAN FailImmediately, + IN BOOLEAN ExclusiveLock); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG ShareAccess, + IN ULONG OpenOptions); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryDirectoryFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN BOOLEAN ReturnSingleEntry, + IN PUNICODE_STRING FileName OPTIONAL, + IN BOOLEAN RestartScan); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryQuotaInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID SidList, + IN ULONG SidListLength, + IN PSID StartSid OPTIONAL, + IN BOOLEAN RestartScan); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryVolumeInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FsInformation, + IN ULONG Length, + IN FS_INFORMATION_CLASS FsInformationClass); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtReadFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetQuotaInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetVolumeInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FsInformation, + IN ULONG Length, + IN FS_INFORMATION_CLASS FsInformationClass); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtWriteFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtUnlockFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER ByteOffset, + IN PLARGE_INTEGER Length, + IN ULONG Key); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetSecurityObject( + IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQuerySecurityObject( + IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG Length, + OUT PULONG LengthNeeded); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtClose( + IN HANDLE Handle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtAllocateVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG_PTR ZeroBits, + IN OUT PSIZE_T RegionSize, + IN ULONG AllocationType, + IN ULONG Protect); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtFreeVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PSIZE_T RegionSize, + IN ULONG FreeType); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenThreadTokenEx( + IN HANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN OpenAsSelf, + IN ULONG HandleAttributes, + OUT PHANDLE TokenHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenProcessTokenEx( + IN HANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + IN ULONG HandleAttributes, + OUT PHANDLE TokenHandle); + +NTSYSAPI +NTSTATUS +NTAPI +NtOpenJobObjectToken( + IN HANDLE JobHandle, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE TokenHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtDuplicateToken( + IN HANDLE ExistingTokenHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN BOOLEAN EffectiveOnly, + IN TOKEN_TYPE TokenType, + OUT PHANDLE NewTokenHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtFilterToken( + IN HANDLE ExistingTokenHandle, + IN ULONG Flags, + IN PTOKEN_GROUPS SidsToDisable OPTIONAL, + IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL, + IN PTOKEN_GROUPS RestrictedSids OPTIONAL, + OUT PHANDLE NewTokenHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtImpersonateAnonymousToken( + IN HANDLE ThreadHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetInformationToken( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + IN PVOID TokenInformation, + IN ULONG TokenInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtAdjustGroupsToken( + IN HANDLE TokenHandle, + IN BOOLEAN ResetToDefault, + IN PTOKEN_GROUPS NewState OPTIONAL, + IN ULONG BufferLength OPTIONAL, + OUT PTOKEN_GROUPS PreviousState, + OUT PULONG ReturnLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPrivilegeCheck( + IN HANDLE ClientToken, + IN OUT PPRIVILEGE_SET RequiredPrivileges, + OUT PBOOLEAN Result); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtAccessCheckAndAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId OPTIONAL, + IN PUNICODE_STRING ObjectTypeName, + IN PUNICODE_STRING ObjectName, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ACCESS_MASK DesiredAccess, + IN PGENERIC_MAPPING GenericMapping, + IN BOOLEAN ObjectCreation, + OUT PACCESS_MASK GrantedAccess, + OUT PNTSTATUS AccessStatus, + OUT PBOOLEAN GenerateOnClose); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtAccessCheckByTypeAndAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId, + IN PUNICODE_STRING ObjectTypeName, + IN PUNICODE_STRING ObjectName, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSID PrincipalSelfSid OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN AUDIT_EVENT_TYPE AuditType, + IN ULONG Flags, + IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL, + IN ULONG ObjectTypeLength, + IN PGENERIC_MAPPING GenericMapping, + IN BOOLEAN ObjectCreation, + OUT PACCESS_MASK GrantedAccess, + OUT PNTSTATUS AccessStatus, + OUT PBOOLEAN GenerateOnClose); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtAccessCheckByTypeResultListAndAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId OPTIONAL, + IN PUNICODE_STRING ObjectTypeName, + IN PUNICODE_STRING ObjectName, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSID PrincipalSelfSid OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN AUDIT_EVENT_TYPE AuditType, + IN ULONG Flags, + IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL, + IN ULONG ObjectTypeLength, + IN PGENERIC_MAPPING GenericMapping, + IN BOOLEAN ObjectCreation, + OUT PACCESS_MASK GrantedAccess, + OUT PNTSTATUS AccessStatus, + OUT PBOOLEAN GenerateOnClose); + +NTSTATUS +NTAPI +NtAccessCheckByTypeResultListAndAuditAlarmByHandle( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId OPTIONAL, + IN HANDLE ClientToken, + IN PUNICODE_STRING ObjectTypeName, + IN PUNICODE_STRING ObjectName, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSID PrincipalSelfSid OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN AUDIT_EVENT_TYPE AuditType, + IN ULONG Flags, + IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL, + IN ULONG ObjectTypeLength, + IN PGENERIC_MAPPING GenericMapping, + IN BOOLEAN ObjectCreation, + OUT PACCESS_MASK GrantedAccess, + OUT PNTSTATUS AccessStatus, + OUT PBOOLEAN GenerateOnClose); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenObjectAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId OPTIONAL, + IN PUNICODE_STRING ObjectTypeName, + IN PUNICODE_STRING ObjectName, + IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, + IN HANDLE ClientToken, + IN ACCESS_MASK DesiredAccess, + IN ACCESS_MASK GrantedAccess, + IN PPRIVILEGE_SET Privileges OPTIONAL, + IN BOOLEAN ObjectCreation, + IN BOOLEAN AccessGranted, + OUT PBOOLEAN GenerateOnClose); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPrivilegeObjectAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId OPTIONAL, + IN HANDLE ClientToken, + IN ACCESS_MASK DesiredAccess, + IN PPRIVILEGE_SET Privileges, + IN BOOLEAN AccessGranted); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCloseObjectAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId OPTIONAL, + IN BOOLEAN GenerateOnClose); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtDeleteObjectAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PVOID HandleId OPTIONAL, + IN BOOLEAN GenerateOnClose); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPrivilegedServiceAuditAlarm( + IN PUNICODE_STRING SubsystemName, + IN PUNICODE_STRING ServiceName, + IN HANDLE ClientToken, + IN PPRIVILEGE_SET Privileges, + IN BOOLEAN AccessGranted); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetInformationThread( + IN HANDLE ThreadHandle, + IN THREADINFOCLASS ThreadInformationClass, + IN PVOID ThreadInformation, + IN ULONG ThreadInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCreateSection( + OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PLARGE_INTEGER MaximumSize OPTIONAL, + IN ULONG SectionPageProtection, + IN ULONG AllocationAttributes, + IN HANDLE FileHandle OPTIONAL); + +#endif + +typedef NTSTATUS +(NTAPI * PRTL_HEAP_COMMIT_ROUTINE) ( + IN PVOID Base, + IN OUT PVOID *CommitAddress, + IN OUT PSIZE_T CommitSize); + +typedef struct _RTL_HEAP_PARAMETERS { + ULONG Length; + SIZE_T SegmentReserve; + SIZE_T SegmentCommit; + SIZE_T DeCommitFreeBlockThreshold; + SIZE_T DeCommitTotalFreeThreshold; + SIZE_T MaximumAllocationSize; + SIZE_T VirtualMemoryThreshold; + SIZE_T InitialCommit; + SIZE_T InitialReserve; + PRTL_HEAP_COMMIT_ROUTINE CommitRoutine; + SIZE_T Reserved[2]; +} RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS; + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTSYSAPI +PVOID +NTAPI +RtlAllocateHeap( + IN HANDLE HeapHandle, + IN ULONG Flags OPTIONAL, + IN SIZE_T Size); + +NTSYSAPI +BOOLEAN +NTAPI +RtlFreeHeap( + IN PVOID HeapHandle, + IN ULONG Flags OPTIONAL, + IN PVOID BaseAddress); + +NTSYSAPI +VOID +NTAPI +RtlCaptureContext( + OUT PCONTEXT ContextRecord); + +NTSYSAPI +ULONG +NTAPI +RtlRandom( + IN OUT PULONG Seed); + +NTSYSAPI +BOOLEAN +NTAPI +RtlCreateUnicodeString( + OUT PUNICODE_STRING DestinationString, + IN PCWSTR SourceString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlAppendStringToString( + IN OUT PSTRING Destination, + IN const STRING *Source); + +NTSYSAPI +NTSTATUS +NTAPI +RtlOemStringToUnicodeString( + IN OUT PUNICODE_STRING DestinationString, + IN PCOEM_STRING SourceString, + IN BOOLEAN AllocateDestinationString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlUnicodeStringToOemString( + IN OUT POEM_STRING DestinationString, + IN PCUNICODE_STRING SourceString, + IN BOOLEAN AllocateDestinationString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlUpcaseUnicodeStringToOemString( + IN OUT POEM_STRING DestinationString, + IN PCUNICODE_STRING SourceString, + IN BOOLEAN AllocateDestinationString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlOemStringToCountedUnicodeString( + IN OUT PUNICODE_STRING DestinationString, + IN PCOEM_STRING SourceString, + IN BOOLEAN AllocateDestinationString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlUnicodeStringToCountedOemString( + IN OUT POEM_STRING DestinationString, + IN PCUNICODE_STRING SourceString, + IN BOOLEAN AllocateDestinationString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlUpcaseUnicodeStringToCountedOemString( + IN OUT POEM_STRING DestinationString, + IN PCUNICODE_STRING SourceString, + IN BOOLEAN AllocateDestinationString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlDowncaseUnicodeString( + IN OUT PUNICODE_STRING UniDest, + IN PCUNICODE_STRING UniSource, + IN BOOLEAN AllocateDestinationString); + +NTSYSAPI +VOID +NTAPI +RtlFreeOemString ( + IN OUT POEM_STRING OemString); + +NTSYSAPI +ULONG +NTAPI +RtlxUnicodeStringToOemSize( + IN PCUNICODE_STRING UnicodeString); + +NTSYSAPI +ULONG +NTAPI +RtlxOemStringToUnicodeSize( + IN PCOEM_STRING OemString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlMultiByteToUnicodeN( + OUT PWCH UnicodeString, + IN ULONG MaxBytesInUnicodeString, + OUT PULONG BytesInUnicodeString OPTIONAL, + IN const CHAR *MultiByteString, + IN ULONG BytesInMultiByteString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlMultiByteToUnicodeSize( + OUT PULONG BytesInUnicodeString, + IN const CHAR *MultiByteString, + IN ULONG BytesInMultiByteString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlUnicodeToMultiByteSize( + OUT PULONG BytesInMultiByteString, + IN PCWCH UnicodeString, + IN ULONG BytesInUnicodeString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlUnicodeToMultiByteN( + OUT PCHAR MultiByteString, + IN ULONG MaxBytesInMultiByteString, + OUT PULONG BytesInMultiByteString OPTIONAL, + IN PWCH UnicodeString, + IN ULONG BytesInUnicodeString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlUpcaseUnicodeToMultiByteN( + OUT PCHAR MultiByteString, + IN ULONG MaxBytesInMultiByteString, + OUT PULONG BytesInMultiByteString OPTIONAL, + IN PCWCH UnicodeString, + IN ULONG BytesInUnicodeString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlOemToUnicodeN( + OUT PWSTR UnicodeString, + IN ULONG MaxBytesInUnicodeString, + OUT PULONG BytesInUnicodeString OPTIONAL, + IN PCCH OemString, + IN ULONG BytesInOemString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlUnicodeToOemN( + OUT PCHAR OemString, + IN ULONG MaxBytesInOemString, + OUT PULONG BytesInOemString OPTIONAL, + IN PCWCH UnicodeString, + IN ULONG BytesInUnicodeString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlUpcaseUnicodeToOemN( + OUT PCHAR OemString, + IN ULONG MaxBytesInOemString, + OUT PULONG BytesInOemString OPTIONAL, + IN PCWCH UnicodeString, + IN ULONG BytesInUnicodeString); + +typedef struct _GENERATE_NAME_CONTEXT { + USHORT Checksum; + BOOLEAN CheckSumInserted; + UCHAR NameLength; + WCHAR NameBuffer[8]; + ULONG ExtensionLength; + WCHAR ExtensionBuffer[4]; + ULONG LastIndexValue; +} GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT; + +#if (NTDDI_VERSION >= NTDDI_VISTASP1) +NTSYSAPI +NTSTATUS +NTAPI +RtlGenerate8dot3Name( + IN PCUNICODE_STRING Name, + IN BOOLEAN AllowExtendedCharacters, + IN OUT PGENERATE_NAME_CONTEXT Context, + IN OUT PUNICODE_STRING Name8dot3); +#else +NTSYSAPI +VOID +NTAPI +RtlGenerate8dot3Name( + IN PCUNICODE_STRING Name, + IN BOOLEAN AllowExtendedCharacters, + IN OUT PGENERATE_NAME_CONTEXT Context, + IN OUT PUNICODE_STRING Name8dot3); +#endif + +NTSYSAPI +BOOLEAN +NTAPI +RtlIsNameLegalDOS8Dot3( + IN PCUNICODE_STRING Name, + IN OUT POEM_STRING OemName OPTIONAL, + IN OUT PBOOLEAN NameContainsSpaces OPTIONAL); + +NTSYSAPI +BOOLEAN +NTAPI +RtlIsValidOemCharacter( + IN OUT PWCHAR Char); + +typedef struct _PREFIX_TABLE_ENTRY { + CSHORT NodeTypeCode; + CSHORT NameLength; + struct _PREFIX_TABLE_ENTRY *NextPrefixTree; + RTL_SPLAY_LINKS Links; + PSTRING Prefix; +} PREFIX_TABLE_ENTRY, *PPREFIX_TABLE_ENTRY; + +typedef struct _PREFIX_TABLE { + CSHORT NodeTypeCode; + CSHORT NameLength; + PPREFIX_TABLE_ENTRY NextPrefixTree; +} PREFIX_TABLE, *PPREFIX_TABLE; + +NTSYSAPI +VOID +NTAPI +PfxInitialize( + OUT PPREFIX_TABLE PrefixTable); + +NTSYSAPI +BOOLEAN +NTAPI +PfxInsertPrefix( + IN PPREFIX_TABLE PrefixTable, + IN PSTRING Prefix, + OUT PPREFIX_TABLE_ENTRY PrefixTableEntry); + +NTSYSAPI +VOID +NTAPI +PfxRemovePrefix( + IN PPREFIX_TABLE PrefixTable, + IN PPREFIX_TABLE_ENTRY PrefixTableEntry); + +NTSYSAPI +PPREFIX_TABLE_ENTRY +NTAPI +PfxFindPrefix( + IN PPREFIX_TABLE PrefixTable, + IN PSTRING FullName); + +typedef struct _UNICODE_PREFIX_TABLE_ENTRY { + CSHORT NodeTypeCode; + CSHORT NameLength; + struct _UNICODE_PREFIX_TABLE_ENTRY *NextPrefixTree; + struct _UNICODE_PREFIX_TABLE_ENTRY *CaseMatch; + RTL_SPLAY_LINKS Links; + PUNICODE_STRING Prefix; +} UNICODE_PREFIX_TABLE_ENTRY, *PUNICODE_PREFIX_TABLE_ENTRY; + +typedef struct _UNICODE_PREFIX_TABLE { + CSHORT NodeTypeCode; + CSHORT NameLength; + PUNICODE_PREFIX_TABLE_ENTRY NextPrefixTree; + PUNICODE_PREFIX_TABLE_ENTRY LastNextEntry; +} UNICODE_PREFIX_TABLE, *PUNICODE_PREFIX_TABLE; + +NTSYSAPI +VOID +NTAPI +RtlInitializeUnicodePrefix( + OUT PUNICODE_PREFIX_TABLE PrefixTable); + +NTSYSAPI +BOOLEAN +NTAPI +RtlInsertUnicodePrefix( + IN PUNICODE_PREFIX_TABLE PrefixTable, + IN PUNICODE_STRING Prefix, + OUT PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry); + +NTSYSAPI +VOID +NTAPI +RtlRemoveUnicodePrefix( + IN PUNICODE_PREFIX_TABLE PrefixTable, + IN PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry); + +NTSYSAPI +PUNICODE_PREFIX_TABLE_ENTRY +NTAPI +RtlFindUnicodePrefix( + IN PUNICODE_PREFIX_TABLE PrefixTable, + IN PUNICODE_STRING FullName, + IN ULONG CaseInsensitiveIndex); + +NTSYSAPI +PUNICODE_PREFIX_TABLE_ENTRY +NTAPI +RtlNextUnicodePrefix( + IN PUNICODE_PREFIX_TABLE PrefixTable, + IN BOOLEAN Restart); + +NTSYSAPI +SIZE_T +NTAPI +RtlCompareMemoryUlong( + IN PVOID Source, + IN SIZE_T Length, + IN ULONG Pattern); + +NTSYSAPI +BOOLEAN +NTAPI +RtlTimeToSecondsSince1980( + IN PLARGE_INTEGER Time, + OUT PULONG ElapsedSeconds); + +NTSYSAPI +VOID +NTAPI +RtlSecondsSince1980ToTime( + IN ULONG ElapsedSeconds, + OUT PLARGE_INTEGER Time); + +NTSYSAPI +BOOLEAN +NTAPI +RtlTimeToSecondsSince1970( + IN PLARGE_INTEGER Time, + OUT PULONG ElapsedSeconds); + +NTSYSAPI +VOID +NTAPI +RtlSecondsSince1970ToTime( + IN ULONG ElapsedSeconds, + OUT PLARGE_INTEGER Time); + +NTSYSAPI +BOOLEAN +NTAPI +RtlValidSid( + IN PSID Sid); + +NTSYSAPI +BOOLEAN +NTAPI +RtlEqualSid( + IN PSID Sid1, + IN PSID Sid2); + +NTSYSAPI +BOOLEAN +NTAPI +RtlEqualPrefixSid( + IN PSID Sid1, + IN PSID Sid2); + +NTSYSAPI +ULONG +NTAPI +RtlLengthRequiredSid( + IN ULONG SubAuthorityCount); + +NTSYSAPI +PVOID +NTAPI +RtlFreeSid( + IN PSID Sid); + +NTSYSAPI +NTSTATUS +NTAPI +RtlAllocateAndInitializeSid( + IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, + IN UCHAR SubAuthorityCount, + IN ULONG SubAuthority0, + IN ULONG SubAuthority1, + IN ULONG SubAuthority2, + IN ULONG SubAuthority3, + IN ULONG SubAuthority4, + IN ULONG SubAuthority5, + IN ULONG SubAuthority6, + IN ULONG SubAuthority7, + OUT PSID *Sid); + +NTSYSAPI +NTSTATUS +NTAPI +RtlInitializeSid( + OUT PSID Sid, + IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, + IN UCHAR SubAuthorityCount); + +NTSYSAPI +PULONG +NTAPI +RtlSubAuthoritySid( + IN PSID Sid, + IN ULONG SubAuthority); + +NTSYSAPI +ULONG +NTAPI +RtlLengthSid( + IN PSID Sid); + +NTSYSAPI +NTSTATUS +NTAPI +RtlCopySid( + IN ULONG Length, + IN PSID Destination, + IN PSID Source); + +NTSYSAPI +NTSTATUS +NTAPI +RtlConvertSidToUnicodeString( + IN OUT PUNICODE_STRING UnicodeString, + IN PSID Sid, + IN BOOLEAN AllocateDestinationString); + +NTSYSAPI +VOID +NTAPI +RtlCopyLuid( + OUT PLUID DestinationLuid, + IN PLUID SourceLuid); + +NTSYSAPI +NTSTATUS +NTAPI +RtlCreateAcl( + OUT PACL Acl, + IN ULONG AclLength, + IN ULONG AclRevision); + +NTSYSAPI +NTSTATUS +NTAPI +RtlAddAce( + IN OUT PACL Acl, + IN ULONG AceRevision, + IN ULONG StartingAceIndex, + IN PVOID AceList, + IN ULONG AceListLength); + +NTSYSAPI +NTSTATUS +NTAPI +RtlDeleteAce( + IN OUT PACL Acl, + IN ULONG AceIndex); + +NTSYSAPI +NTSTATUS +NTAPI +RtlGetAce( + IN PACL Acl, + IN ULONG AceIndex, + OUT PVOID *Ace); + +NTSYSAPI +NTSTATUS +NTAPI +RtlAddAccessAllowedAce( + IN OUT PACL Acl, + IN ULONG AceRevision, + IN ACCESS_MASK AccessMask, + IN PSID Sid); + +NTSYSAPI +NTSTATUS +NTAPI +RtlAddAccessAllowedAceEx( + IN OUT PACL Acl, + IN ULONG AceRevision, + IN ULONG AceFlags, + IN ACCESS_MASK AccessMask, + IN PSID Sid); + +NTSYSAPI +NTSTATUS +NTAPI +RtlCreateSecurityDescriptorRelative( + OUT PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor, + IN ULONG Revision); + +NTSYSAPI +NTSTATUS +NTAPI +RtlGetDaclSecurityDescriptor( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + OUT PBOOLEAN DaclPresent, + OUT PACL *Dacl, + OUT PBOOLEAN DaclDefaulted); + +NTSYSAPI +NTSTATUS +NTAPI +RtlSetOwnerSecurityDescriptor( + IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSID Owner OPTIONAL, + IN BOOLEAN OwnerDefaulted); + +NTSYSAPI +NTSTATUS +NTAPI +RtlGetOwnerSecurityDescriptor( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + OUT PSID *Owner, + OUT PBOOLEAN OwnerDefaulted); + +NTSYSAPI +ULONG +NTAPI +RtlNtStatusToDosError( + IN NTSTATUS Status); + +NTSYSAPI +NTSTATUS +NTAPI +RtlCustomCPToUnicodeN( + IN PCPTABLEINFO CustomCP, + OUT PWCH UnicodeString, + IN ULONG MaxBytesInUnicodeString, + OUT PULONG BytesInUnicodeString OPTIONAL, + IN PCH CustomCPString, + IN ULONG BytesInCustomCPString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlUnicodeToCustomCPN( + IN PCPTABLEINFO CustomCP, + OUT PCH CustomCPString, + IN ULONG MaxBytesInCustomCPString, + OUT PULONG BytesInCustomCPString OPTIONAL, + IN PWCH UnicodeString, + IN ULONG BytesInUnicodeString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlUpcaseUnicodeToCustomCPN( + IN PCPTABLEINFO CustomCP, + OUT PCH CustomCPString, + IN ULONG MaxBytesInCustomCPString, + OUT PULONG BytesInCustomCPString OPTIONAL, + IN PWCH UnicodeString, + IN ULONG BytesInUnicodeString); + +NTSYSAPI +VOID +NTAPI +RtlInitCodePageTable( + IN PUSHORT TableBase, + IN OUT PCPTABLEINFO CodePageTable); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTSYSAPI +PVOID +NTAPI +RtlCreateHeap( + IN ULONG Flags, + IN PVOID HeapBase OPTIONAL, + IN SIZE_T ReserveSize OPTIONAL, + IN SIZE_T CommitSize OPTIONAL, + IN PVOID Lock OPTIONAL, + IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL); + +NTSYSAPI +PVOID +NTAPI +RtlDestroyHeap( + IN PVOID HeapHandle); + +NTSYSAPI +USHORT +NTAPI +RtlCaptureStackBackTrace( + IN ULONG FramesToSkip, + IN ULONG FramesToCapture, + OUT PVOID *BackTrace, + OUT PULONG BackTraceHash OPTIONAL); + +NTSYSAPI +ULONG +NTAPI +RtlRandomEx( + IN OUT PULONG Seed); + +NTSYSAPI +NTSTATUS +NTAPI +RtlInitUnicodeStringEx( + OUT PUNICODE_STRING DestinationString, + IN PCWSTR SourceString OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +RtlValidateUnicodeString( + IN ULONG Flags, + IN PCUNICODE_STRING String); + +NTSYSAPI +NTSTATUS +NTAPI +RtlDuplicateUnicodeString( + IN ULONG Flags, + IN PCUNICODE_STRING SourceString, + OUT PUNICODE_STRING DestinationString); + +NTSYSAPI +NTSTATUS +NTAPI +RtlGetCompressionWorkSpaceSize( + IN USHORT CompressionFormatAndEngine, + OUT PULONG CompressBufferWorkSpaceSize, + OUT PULONG CompressFragmentWorkSpaceSize); + +NTSYSAPI +NTSTATUS +NTAPI +RtlCompressBuffer( + IN USHORT CompressionFormatAndEngine, + IN PUCHAR UncompressedBuffer, + IN ULONG UncompressedBufferSize, + OUT PUCHAR CompressedBuffer, + IN ULONG CompressedBufferSize, + IN ULONG UncompressedChunkSize, + OUT PULONG FinalCompressedSize, + IN PVOID WorkSpace); + +NTSYSAPI +NTSTATUS +NTAPI +RtlDecompressBuffer( + IN USHORT CompressionFormat, + OUT PUCHAR UncompressedBuffer, + IN ULONG UncompressedBufferSize, + IN PUCHAR CompressedBuffer, + IN ULONG CompressedBufferSize, + OUT PULONG FinalUncompressedSize); + +NTSYSAPI +NTSTATUS +NTAPI +RtlDecompressFragment( + IN USHORT CompressionFormat, + OUT PUCHAR UncompressedFragment, + IN ULONG UncompressedFragmentSize, + IN PUCHAR CompressedBuffer, + IN ULONG CompressedBufferSize, + IN ULONG FragmentOffset, + OUT PULONG FinalUncompressedSize, + IN PVOID WorkSpace); + +NTSYSAPI +NTSTATUS +NTAPI +RtlDescribeChunk( + IN USHORT CompressionFormat, + IN OUT PUCHAR *CompressedBuffer, + IN PUCHAR EndOfCompressedBufferPlus1, + OUT PUCHAR *ChunkBuffer, + OUT PULONG ChunkSize); + +NTSYSAPI +NTSTATUS +NTAPI +RtlReserveChunk( + IN USHORT CompressionFormat, + IN OUT PUCHAR *CompressedBuffer, + IN PUCHAR EndOfCompressedBufferPlus1, + OUT PUCHAR *ChunkBuffer, + IN ULONG ChunkSize); + +typedef struct _COMPRESSED_DATA_INFO { + USHORT CompressionFormatAndEngine; + UCHAR CompressionUnitShift; + UCHAR ChunkShift; + UCHAR ClusterShift; + UCHAR Reserved; + USHORT NumberOfChunks; + ULONG CompressedChunkSizes[ANYSIZE_ARRAY]; +} COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO; + +NTSYSAPI +NTSTATUS +NTAPI +RtlDecompressChunks( + OUT PUCHAR UncompressedBuffer, + IN ULONG UncompressedBufferSize, + IN PUCHAR CompressedBuffer, + IN ULONG CompressedBufferSize, + IN PUCHAR CompressedTail, + IN ULONG CompressedTailSize, + IN PCOMPRESSED_DATA_INFO CompressedDataInfo); + +NTSYSAPI +NTSTATUS +NTAPI +RtlCompressChunks( + IN PUCHAR UncompressedBuffer, + IN ULONG UncompressedBufferSize, + OUT PUCHAR CompressedBuffer, + IN ULONG CompressedBufferSize, + IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo, + IN ULONG CompressedDataInfoLength, + IN PVOID WorkSpace); + +NTSYSAPI +PSID_IDENTIFIER_AUTHORITY +NTAPI +RtlIdentifierAuthoritySid( + IN PSID Sid); + +NTSYSAPI +PUCHAR +NTAPI +RtlSubAuthorityCountSid( + IN PSID Sid); + +NTSYSAPI +ULONG +NTAPI +RtlNtStatusToDosErrorNoTeb( + IN NTSTATUS Status); + +NTSYSAPI +NTSTATUS +NTAPI +RtlCreateSystemVolumeInformationFolder( + IN PCUNICODE_STRING VolumeRootPath); + +#endif + +#if defined(_M_AMD64) + +FORCEINLINE +VOID +RtlFillMemoryUlong ( + OUT PVOID Destination, + IN SIZE_T Length, + IN ULONG Pattern) +{ + PULONG Address = (PULONG)Destination; + if ((Length /= 4) != 0) { + if (((ULONG64)Address & 4) != 0) { + *Address = Pattern; + if ((Length -= 1) == 0) { + return; + } + Address += 1; + } + __stosq((PULONG64)(Address), Pattern | ((ULONG64)Pattern << 32), Length / 2); + if ((Length & 1) != 0) Address[Length - 1] = Pattern; + } + return; +} + +#define RtlFillMemoryUlonglong(Destination, Length, Pattern) \ + __stosq((PULONG64)(Destination), Pattern, (Length) / 8) + +#else + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTSYSAPI +VOID +NTAPI +RtlFillMemoryUlong( + OUT PVOID Destination, + IN SIZE_T Length, + IN ULONG Pattern); + +NTSYSAPI +VOID +NTAPI +RtlFillMemoryUlonglong( + OUT PVOID Destination, + IN SIZE_T Length, + IN ULONGLONG Pattern); + +#endif + +#endif // defined(_M_AMD64) + +#if (NTDDI_VERSION >= NTDDI_WS03) + +NTSYSAPI +NTSTATUS +NTAPI +RtlInitAnsiStringEx( + OUT PANSI_STRING DestinationString, + IN PCSZ SourceString OPTIONAL); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WS03SP1) + +NTSYSAPI +NTSTATUS +NTAPI +RtlGetSaclSecurityDescriptor( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + OUT PBOOLEAN SaclPresent, + OUT PACL *Sacl, + OUT PBOOLEAN SaclDefaulted); + +NTSYSAPI +NTSTATUS +NTAPI +RtlSetGroupSecurityDescriptor( + IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSID Group OPTIONAL, + IN BOOLEAN GroupDefaulted OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +RtlGetGroupSecurityDescriptor( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + OUT PSID *Group, + OUT PBOOLEAN GroupDefaulted); + +NTSYSAPI +NTSTATUS +NTAPI +RtlAbsoluteToSelfRelativeSD( + IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor, + OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor OPTIONAL, + IN OUT PULONG BufferLength); + +NTSYSAPI +NTSTATUS +NTAPI +RtlSelfRelativeToAbsoluteSD( + IN PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor, + OUT PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor OPTIONAL, + IN OUT PULONG AbsoluteSecurityDescriptorSize, + OUT PACL Dacl OPTIONAL, + IN OUT PULONG DaclSize, + OUT PACL Sacl OPTIONAL, + IN OUT PULONG SaclSize, + OUT PSID Owner OPTIONAL, + IN OUT PULONG OwnerSize, + OUT PSID PrimaryGroup OPTIONAL, + IN OUT PULONG PrimaryGroupSize); + +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTSYSAPI +NTSTATUS +NTAPI +RtlNormalizeString( + IN ULONG NormForm, + IN PCWSTR SourceString, + IN LONG SourceStringLength, + OUT PWSTR DestinationString, + IN OUT PLONG DestinationStringLength); + +NTSYSAPI +NTSTATUS +NTAPI +RtlIsNormalizedString( + IN ULONG NormForm, + IN PCWSTR SourceString, + IN LONG SourceStringLength, + OUT PBOOLEAN Normalized); + +NTSYSAPI +NTSTATUS +NTAPI +RtlIdnToAscii( + IN ULONG Flags, + IN PCWSTR SourceString, + IN LONG SourceStringLength, + OUT PWSTR DestinationString, + IN OUT PLONG DestinationStringLength); + +NTSYSAPI +NTSTATUS +NTAPI +RtlIdnToUnicode( + IN ULONG Flags, + IN PCWSTR SourceString, + IN LONG SourceStringLength, + OUT PWSTR DestinationString, + IN OUT PLONG DestinationStringLength); + +NTSYSAPI +NTSTATUS +NTAPI +RtlIdnToNameprepUnicode( + IN ULONG Flags, + IN PCWSTR SourceString, + IN LONG SourceStringLength, + OUT PWSTR DestinationString, + IN OUT PLONG DestinationStringLength); + +NTSYSAPI +NTSTATUS +NTAPI +RtlCreateServiceSid( + IN PUNICODE_STRING ServiceName, + OUT PSID ServiceSid, + IN OUT PULONG ServiceSidLength); + +NTSYSAPI +LONG +NTAPI +RtlCompareAltitudes( + IN PCUNICODE_STRING Altitude1, + IN PCUNICODE_STRING Altitude2); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +NTSYSAPI +NTSTATUS +NTAPI +RtlUnicodeToUTF8N( + OUT PCHAR UTF8StringDestination, + IN ULONG UTF8StringMaxByteCount, + OUT PULONG UTF8StringActualByteCount, + IN PCWCH UnicodeStringSource, + IN ULONG UnicodeStringByteCount); + +NTSYSAPI +NTSTATUS +NTAPI +RtlUTF8ToUnicodeN( + OUT PWSTR UnicodeStringDestination, + IN ULONG UnicodeStringMaxByteCount, + OUT PULONG UnicodeStringActualByteCount, + IN PCCH UTF8StringSource, + IN ULONG UTF8StringByteCount); + +NTSYSAPI +NTSTATUS +NTAPI +RtlReplaceSidInSd( + IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSID OldSid, + IN PSID NewSid, + OUT ULONG *NumChanges); + +NTSYSAPI +NTSTATUS +NTAPI +RtlCreateVirtualAccountSid( + IN PCUNICODE_STRING Name, + IN ULONG BaseSubAuthority, + OUT PSID Sid, + IN OUT PULONG SidLength); + +#endif + +#define HEAP_NO_SERIALIZE 0x00000001 +#define HEAP_GROWABLE 0x00000002 +#define HEAP_GENERATE_EXCEPTIONS 0x00000004 +#define HEAP_ZERO_MEMORY 0x00000008 +#define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010 +#define HEAP_TAIL_CHECKING_ENABLED 0x00000020 +#define HEAP_FREE_CHECKING_ENABLED 0x00000040 +#define HEAP_DISABLE_COALESCE_ON_FREE 0x00000080 + +#define HEAP_CREATE_ALIGN_16 0x00010000 +#define HEAP_CREATE_ENABLE_TRACING 0x00020000 +#define HEAP_CREATE_ENABLE_EXECUTE 0x00040000 + +#define HEAP_SETTABLE_USER_VALUE 0x00000100 +#define HEAP_SETTABLE_USER_FLAG1 0x00000200 +#define HEAP_SETTABLE_USER_FLAG2 0x00000400 +#define HEAP_SETTABLE_USER_FLAG3 0x00000800 +#define HEAP_SETTABLE_USER_FLAGS 0x00000E00 + +#define HEAP_CLASS_0 0x00000000 +#define HEAP_CLASS_1 0x00001000 +#define HEAP_CLASS_2 0x00002000 +#define HEAP_CLASS_3 0x00003000 +#define HEAP_CLASS_4 0x00004000 +#define HEAP_CLASS_5 0x00005000 +#define HEAP_CLASS_6 0x00006000 +#define HEAP_CLASS_7 0x00007000 +#define HEAP_CLASS_8 0x00008000 +#define HEAP_CLASS_MASK 0x0000F000 + +#define HEAP_MAXIMUM_TAG 0x0FFF +#define HEAP_GLOBAL_TAG 0x0800 +#define HEAP_PSEUDO_TAG_FLAG 0x8000 +#define HEAP_TAG_SHIFT 18 +#define HEAP_TAG_MASK (HEAP_MAXIMUM_TAG << HEAP_TAG_SHIFT) + +#define HEAP_CREATE_VALID_MASK (HEAP_NO_SERIALIZE | \ + HEAP_GROWABLE | \ + HEAP_GENERATE_EXCEPTIONS | \ + HEAP_ZERO_MEMORY | \ + HEAP_REALLOC_IN_PLACE_ONLY | \ + HEAP_TAIL_CHECKING_ENABLED | \ + HEAP_FREE_CHECKING_ENABLED | \ + HEAP_DISABLE_COALESCE_ON_FREE | \ + HEAP_CLASS_MASK | \ + HEAP_CREATE_ALIGN_16 | \ + HEAP_CREATE_ENABLE_TRACING | \ + HEAP_CREATE_ENABLE_EXECUTE) + +FORCEINLINE +ULONG +HEAP_MAKE_TAG_FLAGS( + IN ULONG TagBase, + IN ULONG Tag) +{ + //__assume_bound(TagBase); // FIXME + return ((ULONG)((TagBase) + ((Tag) << HEAP_TAG_SHIFT))); +} + +#define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE 1 +#define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING 2 + +#define RtlUnicodeStringToOemSize(STRING) (NLS_MB_OEM_CODE_PAGE_TAG ? \ + RtlxUnicodeStringToOemSize(STRING) : \ + ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \ +) + +#define RtlOemStringToUnicodeSize(STRING) ( \ + NLS_MB_OEM_CODE_PAGE_TAG ? \ + RtlxOemStringToUnicodeSize(STRING) : \ + ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \ +) + +#define RtlOemStringToCountedUnicodeSize(STRING) ( \ + (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \ +) + +typedef PVOID +(NTAPI *PRTL_ALLOCATE_STRING_ROUTINE)( + IN SIZE_T NumberOfBytes); + +#if _WIN32_WINNT >= 0x0600 + +typedef PVOID +(NTAPI *PRTL_REALLOCATE_STRING_ROUTINE)( + IN SIZE_T NumberOfBytes, + IN PVOID Buffer); + +#endif + +typedef VOID +(NTAPI *PRTL_FREE_STRING_ROUTINE)( + IN PVOID Buffer); + +extern const PRTL_ALLOCATE_STRING_ROUTINE RtlAllocateStringRoutine; +extern const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine; + +#if _WIN32_WINNT >= 0x0600 +extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine; +#endif #define COMPRESSION_FORMAT_NONE (0x0000) #define COMPRESSION_FORMAT_DEFAULT (0x0001) @@ -143,31 +2407,506 @@ typedef enum _SECURITY_LOGON_TYPE #define COMPRESSION_ENGINE_MAXIMUM (0x0100) #define COMPRESSION_ENGINE_HIBER (0x0200) -#define FILE_ACTION_ADDED 0x00000001 -#define FILE_ACTION_REMOVED 0x00000002 -#define FILE_ACTION_MODIFIED 0x00000003 -#define FILE_ACTION_RENAMED_OLD_NAME 0x00000004 -#define FILE_ACTION_RENAMED_NEW_NAME 0x00000005 -#define FILE_ACTION_ADDED_STREAM 0x00000006 -#define FILE_ACTION_REMOVED_STREAM 0x00000007 -#define FILE_ACTION_MODIFIED_STREAM 0x00000008 -#define FILE_ACTION_REMOVED_BY_DELETE 0x00000009 -#define FILE_ACTION_ID_NOT_TUNNELLED 0x0000000A -#define FILE_ACTION_TUNNELLED_ID_COLLISION 0x0000000B -/* end winnt.h */ +#define RtlOffsetToPointer(B,O) ((PCHAR)( ((PCHAR)(B)) + ((ULONG_PTR)(O)) )) +#define RtlPointerToOffset(B,P) ((ULONG)( ((PCHAR)(P)) - ((PCHAR)(B)) )) -#define FILE_EA_TYPE_BINARY 0xfffe -#define FILE_EA_TYPE_ASCII 0xfffd -#define FILE_EA_TYPE_BITMAP 0xfffb -#define FILE_EA_TYPE_METAFILE 0xfffa -#define FILE_EA_TYPE_ICON 0xfff9 -#define FILE_EA_TYPE_EA 0xffee -#define FILE_EA_TYPE_MVMT 0xffdf -#define FILE_EA_TYPE_MVST 0xffde -#define FILE_EA_TYPE_ASN1 0xffdd -#define FILE_EA_TYPE_FAMILY_IDS 0xff01 +#define MAX_UNICODE_STACK_BUFFER_LENGTH 256 -#define FILE_NEED_EA 0x00000080 +#define RTL_SYSTEM_VOLUME_INFORMATION_FOLDER L"System Volume Information" + +#define DEVICE_TYPE ULONG + +#define FILE_DEVICE_BEEP 0x00000001 +#define FILE_DEVICE_CD_ROM 0x00000002 +#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 +#define FILE_DEVICE_CONTROLLER 0x00000004 +#define FILE_DEVICE_DATALINK 0x00000005 +#define FILE_DEVICE_DFS 0x00000006 +#define FILE_DEVICE_DISK 0x00000007 +#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 +#define FILE_DEVICE_FILE_SYSTEM 0x00000009 +#define FILE_DEVICE_INPORT_PORT 0x0000000a +#define FILE_DEVICE_KEYBOARD 0x0000000b +#define FILE_DEVICE_MAILSLOT 0x0000000c +#define FILE_DEVICE_MIDI_IN 0x0000000d +#define FILE_DEVICE_MIDI_OUT 0x0000000e +#define FILE_DEVICE_MOUSE 0x0000000f +#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 +#define FILE_DEVICE_NAMED_PIPE 0x00000011 +#define FILE_DEVICE_NETWORK 0x00000012 +#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 +#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 +#define FILE_DEVICE_NULL 0x00000015 +#define FILE_DEVICE_PARALLEL_PORT 0x00000016 +#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 +#define FILE_DEVICE_PRINTER 0x00000018 +#define FILE_DEVICE_SCANNER 0x00000019 +#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a +#define FILE_DEVICE_SERIAL_PORT 0x0000001b +#define FILE_DEVICE_SCREEN 0x0000001c +#define FILE_DEVICE_SOUND 0x0000001d +#define FILE_DEVICE_STREAMS 0x0000001e +#define FILE_DEVICE_TAPE 0x0000001f +#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 +#define FILE_DEVICE_TRANSPORT 0x00000021 +#define FILE_DEVICE_UNKNOWN 0x00000022 +#define FILE_DEVICE_VIDEO 0x00000023 +#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 +#define FILE_DEVICE_WAVE_IN 0x00000025 +#define FILE_DEVICE_WAVE_OUT 0x00000026 +#define FILE_DEVICE_8042_PORT 0x00000027 +#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 +#define FILE_DEVICE_BATTERY 0x00000029 +#define FILE_DEVICE_BUS_EXTENDER 0x0000002a +#define FILE_DEVICE_MODEM 0x0000002b +#define FILE_DEVICE_VDM 0x0000002c +#define FILE_DEVICE_MASS_STORAGE 0x0000002d +#define FILE_DEVICE_SMB 0x0000002e +#define FILE_DEVICE_KS 0x0000002f +#define FILE_DEVICE_CHANGER 0x00000030 +#define FILE_DEVICE_SMARTCARD 0x00000031 +#define FILE_DEVICE_ACPI 0x00000032 +#define FILE_DEVICE_DVD 0x00000033 +#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 +#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 +#define FILE_DEVICE_DFS_VOLUME 0x00000036 +#define FILE_DEVICE_SERENUM 0x00000037 +#define FILE_DEVICE_TERMSRV 0x00000038 +#define FILE_DEVICE_KSEC 0x00000039 +#define FILE_DEVICE_FIPS 0x0000003A +#define FILE_DEVICE_INFINIBAND 0x0000003B +#define FILE_DEVICE_VMBUS 0x0000003E +#define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F +#define FILE_DEVICE_WPD 0x00000040 +#define FILE_DEVICE_BLUETOOTH 0x00000041 +#define FILE_DEVICE_MT_COMPOSITE 0x00000042 +#define FILE_DEVICE_MT_TRANSPORT 0x00000043 +#define FILE_DEVICE_BIOMETRIC 0x00000044 +#define FILE_DEVICE_PMI 0x00000045 + +#define CTL_CODE(DeviceType, Function, Method, Access) \ + (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) + +#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16) + +#define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3)) + +#define METHOD_BUFFERED 0 +#define METHOD_IN_DIRECT 1 +#define METHOD_OUT_DIRECT 2 +#define METHOD_NEITHER 3 +#define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT +#define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT + +#define FILE_ANY_ACCESS 0x00000000 +#define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS +#define FILE_READ_ACCESS 0x00000001 +#define FILE_WRITE_ACCESS 0x00000002 + +typedef ULONG LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE; + +typedef enum _SECURITY_LOGON_TYPE { + UndefinedLogonType = 0, + Interactive = 2, + Network, + Batch, + Service, + Proxy, + Unlock, + NetworkCleartext, + NewCredentials, +#if (_WIN32_WINNT >= 0x0501) + RemoteInteractive, + CachedInteractive, +#endif +#if (_WIN32_WINNT >= 0x0502) + CachedRemoteInteractive, + CachedUnlock +#endif +} SECURITY_LOGON_TYPE, *PSECURITY_LOGON_TYPE; + +#ifndef _NTLSA_AUDIT_ +#define _NTLSA_AUDIT_ + +#ifndef GUID_DEFINED +#include +#endif + +#endif /* _NTLSA_AUDIT_ */ + +NTSTATUS +NTAPI +LsaRegisterLogonProcess( + IN PLSA_STRING LogonProcessName, + OUT PHANDLE LsaHandle, + OUT PLSA_OPERATIONAL_MODE SecurityMode); + +NTSTATUS +NTAPI +LsaLogonUser( + IN HANDLE LsaHandle, + IN PLSA_STRING OriginName, + IN SECURITY_LOGON_TYPE LogonType, + IN ULONG AuthenticationPackage, + IN PVOID AuthenticationInformation, + IN ULONG AuthenticationInformationLength, + IN PTOKEN_GROUPS LocalGroups OPTIONAL, + IN PTOKEN_SOURCE SourceContext, + OUT PVOID *ProfileBuffer, + OUT PULONG ProfileBufferLength, + OUT PLUID LogonId, + OUT PHANDLE Token, + OUT PQUOTA_LIMITS Quotas, + OUT PNTSTATUS SubStatus); + +NTSTATUS +NTAPI +LsaFreeReturnBuffer( + IN PVOID Buffer); + +#ifndef _NTLSA_IFS_ +#define _NTLSA_IFS_ +#endif + +#define MSV1_0_PACKAGE_NAME "MICROSOFT_AUTHENTICATION_PACKAGE_V1_0" +#define MSV1_0_PACKAGE_NAMEW L"MICROSOFT_AUTHENTICATION_PACKAGE_V1_0" +#define MSV1_0_PACKAGE_NAMEW_LENGTH sizeof(MSV1_0_PACKAGE_NAMEW) - sizeof(WCHAR) + +#define MSV1_0_SUBAUTHENTICATION_KEY "SYSTEM\\CurrentControlSet\\Control\\Lsa\\MSV1_0" +#define MSV1_0_SUBAUTHENTICATION_VALUE "Auth" + +#define MSV1_0_CHALLENGE_LENGTH 8 +#define MSV1_0_USER_SESSION_KEY_LENGTH 16 +#define MSV1_0_LANMAN_SESSION_KEY_LENGTH 8 + +#define MSV1_0_CLEARTEXT_PASSWORD_ALLOWED 0x02 +#define MSV1_0_UPDATE_LOGON_STATISTICS 0x04 +#define MSV1_0_RETURN_USER_PARAMETERS 0x08 +#define MSV1_0_DONT_TRY_GUEST_ACCOUNT 0x10 +#define MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT 0x20 +#define MSV1_0_RETURN_PASSWORD_EXPIRY 0x40 +#define MSV1_0_USE_CLIENT_CHALLENGE 0x80 +#define MSV1_0_TRY_GUEST_ACCOUNT_ONLY 0x100 +#define MSV1_0_RETURN_PROFILE_PATH 0x200 +#define MSV1_0_TRY_SPECIFIED_DOMAIN_ONLY 0x400 +#define MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT 0x800 + +#define MSV1_0_DISABLE_PERSONAL_FALLBACK 0x00001000 +#define MSV1_0_ALLOW_FORCE_GUEST 0x00002000 + +#if (_WIN32_WINNT >= 0x0502) +#define MSV1_0_CLEARTEXT_PASSWORD_SUPPLIED 0x00004000 +#define MSV1_0_USE_DOMAIN_FOR_ROUTING_ONLY 0x00008000 +#endif + +#define MSV1_0_SUBAUTHENTICATION_DLL_EX 0x00100000 +#define MSV1_0_ALLOW_MSVCHAPV2 0x00010000 + +#if (_WIN32_WINNT >= 0x0600) +#define MSV1_0_S4U2SELF 0x00020000 +#define MSV1_0_CHECK_LOGONHOURS_FOR_S4U 0x00040000 +#endif + +#define MSV1_0_SUBAUTHENTICATION_DLL 0xFF000000 +#define MSV1_0_SUBAUTHENTICATION_DLL_SHIFT 24 +#define MSV1_0_MNS_LOGON 0x01000000 + +#define MSV1_0_SUBAUTHENTICATION_DLL_RAS 2 +#define MSV1_0_SUBAUTHENTICATION_DLL_IIS 132 + +#define LOGON_GUEST 0x01 +#define LOGON_NOENCRYPTION 0x02 +#define LOGON_CACHED_ACCOUNT 0x04 +#define LOGON_USED_LM_PASSWORD 0x08 +#define LOGON_EXTRA_SIDS 0x20 +#define LOGON_SUBAUTH_SESSION_KEY 0x40 +#define LOGON_SERVER_TRUST_ACCOUNT 0x80 +#define LOGON_NTLMV2_ENABLED 0x100 +#define LOGON_RESOURCE_GROUPS 0x200 +#define LOGON_PROFILE_PATH_RETURNED 0x400 +#define LOGON_NT_V2 0x800 +#define LOGON_LM_V2 0x1000 +#define LOGON_NTLM_V2 0x2000 + +#if (_WIN32_WINNT >= 0x0600) + +#define LOGON_OPTIMIZED 0x4000 +#define LOGON_WINLOGON 0x8000 +#define LOGON_PKINIT 0x10000 +#define LOGON_NO_OPTIMIZED 0x20000 + +#endif + +#define MSV1_0_SUBAUTHENTICATION_FLAGS 0xFF000000 + +#define LOGON_GRACE_LOGON 0x01000000 + +#define MSV1_0_OWF_PASSWORD_LENGTH 16 +#define MSV1_0_CRED_LM_PRESENT 0x1 +#define MSV1_0_CRED_NT_PRESENT 0x2 +#define MSV1_0_CRED_VERSION 0 + +#define MSV1_0_NTLM3_RESPONSE_LENGTH 16 +#define MSV1_0_NTLM3_OWF_LENGTH 16 + +#if (_WIN32_WINNT == 0x0500) +#define MSV1_0_MAX_NTLM3_LIFE 1800 +#else +#define MSV1_0_MAX_NTLM3_LIFE 129600 +#endif +#define MSV1_0_MAX_AVL_SIZE 64000 + +#if (_WIN32_WINNT >= 0x0501) + +#define MSV1_0_AV_FLAG_FORCE_GUEST 0x00000001 + +#if (_WIN32_WINNT >= 0x0600) +#define MSV1_0_AV_FLAG_MIC_HANDSHAKE_MESSAGES 0x00000002 +#endif + +#endif + +#define MSV1_0_NTLM3_INPUT_LENGTH (sizeof(MSV1_0_NTLM3_RESPONSE) - MSV1_0_NTLM3_RESPONSE_LENGTH) + +#if(_WIN32_WINNT >= 0x0502) +#define MSV1_0_NTLM3_MIN_NT_RESPONSE_LENGTH RTL_SIZEOF_THROUGH_FIELD(MSV1_0_NTLM3_RESPONSE, AvPairsOff) +#endif + +#define USE_PRIMARY_PASSWORD 0x01 +#define RETURN_PRIMARY_USERNAME 0x02 +#define RETURN_PRIMARY_LOGON_DOMAINNAME 0x04 +#define RETURN_NON_NT_USER_SESSION_KEY 0x08 +#define GENERATE_CLIENT_CHALLENGE 0x10 +#define GCR_NTLM3_PARMS 0x20 +#define GCR_TARGET_INFO 0x40 +#define RETURN_RESERVED_PARAMETER 0x80 +#define GCR_ALLOW_NTLM 0x100 +#define GCR_USE_OEM_SET 0x200 +#define GCR_MACHINE_CREDENTIAL 0x400 +#define GCR_USE_OWF_PASSWORD 0x800 +#define GCR_ALLOW_LM 0x1000 +#define GCR_ALLOW_NO_TARGET 0x2000 + +typedef enum _MSV1_0_LOGON_SUBMIT_TYPE { + MsV1_0InteractiveLogon = 2, + MsV1_0Lm20Logon, + MsV1_0NetworkLogon, + MsV1_0SubAuthLogon, + MsV1_0WorkstationUnlockLogon = 7, + MsV1_0S4ULogon = 12, + MsV1_0VirtualLogon = 82 +} MSV1_0_LOGON_SUBMIT_TYPE, *PMSV1_0_LOGON_SUBMIT_TYPE; + +typedef enum _MSV1_0_PROFILE_BUFFER_TYPE { + MsV1_0InteractiveProfile = 2, + MsV1_0Lm20LogonProfile, + MsV1_0SmartCardProfile +} MSV1_0_PROFILE_BUFFER_TYPE, *PMSV1_0_PROFILE_BUFFER_TYPE; + +typedef struct _MSV1_0_INTERACTIVE_LOGON { + MSV1_0_LOGON_SUBMIT_TYPE MessageType; + UNICODE_STRING LogonDomainName; + UNICODE_STRING UserName; + UNICODE_STRING Password; +} MSV1_0_INTERACTIVE_LOGON, *PMSV1_0_INTERACTIVE_LOGON; + +typedef struct _MSV1_0_INTERACTIVE_PROFILE { + MSV1_0_PROFILE_BUFFER_TYPE MessageType; + USHORT LogonCount; + USHORT BadPasswordCount; + LARGE_INTEGER LogonTime; + LARGE_INTEGER LogoffTime; + LARGE_INTEGER KickOffTime; + LARGE_INTEGER PasswordLastSet; + LARGE_INTEGER PasswordCanChange; + LARGE_INTEGER PasswordMustChange; + UNICODE_STRING LogonScript; + UNICODE_STRING HomeDirectory; + UNICODE_STRING FullName; + UNICODE_STRING ProfilePath; + UNICODE_STRING HomeDirectoryDrive; + UNICODE_STRING LogonServer; + ULONG UserFlags; +} MSV1_0_INTERACTIVE_PROFILE, *PMSV1_0_INTERACTIVE_PROFILE; + +typedef struct _MSV1_0_LM20_LOGON { + MSV1_0_LOGON_SUBMIT_TYPE MessageType; + UNICODE_STRING LogonDomainName; + UNICODE_STRING UserName; + UNICODE_STRING Workstation; + UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH]; + STRING CaseSensitiveChallengeResponse; + STRING CaseInsensitiveChallengeResponse; + ULONG ParameterControl; +} MSV1_0_LM20_LOGON, * PMSV1_0_LM20_LOGON; + +typedef struct _MSV1_0_SUBAUTH_LOGON { + MSV1_0_LOGON_SUBMIT_TYPE MessageType; + UNICODE_STRING LogonDomainName; + UNICODE_STRING UserName; + UNICODE_STRING Workstation; + UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH]; + STRING AuthenticationInfo1; + STRING AuthenticationInfo2; + ULONG ParameterControl; + ULONG SubAuthPackageId; +} MSV1_0_SUBAUTH_LOGON, * PMSV1_0_SUBAUTH_LOGON; + +#if (_WIN32_WINNT >= 0x0600) + +#define MSV1_0_S4U_LOGON_FLAG_CHECK_LOGONHOURS 0x2 + +typedef struct _MSV1_0_S4U_LOGON { + MSV1_0_LOGON_SUBMIT_TYPE MessageType; + ULONG Flags; + UNICODE_STRING UserPrincipalName; + UNICODE_STRING DomainName; +} MSV1_0_S4U_LOGON, *PMSV1_0_S4U_LOGON; + +#endif + +typedef struct _MSV1_0_LM20_LOGON_PROFILE { + MSV1_0_PROFILE_BUFFER_TYPE MessageType; + LARGE_INTEGER KickOffTime; + LARGE_INTEGER LogoffTime; + ULONG UserFlags; + UCHAR UserSessionKey[MSV1_0_USER_SESSION_KEY_LENGTH]; + UNICODE_STRING LogonDomainName; + UCHAR LanmanSessionKey[MSV1_0_LANMAN_SESSION_KEY_LENGTH]; + UNICODE_STRING LogonServer; + UNICODE_STRING UserParameters; +} MSV1_0_LM20_LOGON_PROFILE, * PMSV1_0_LM20_LOGON_PROFILE; + +typedef struct _MSV1_0_SUPPLEMENTAL_CREDENTIAL { + ULONG Version; + ULONG Flags; + UCHAR LmPassword[MSV1_0_OWF_PASSWORD_LENGTH]; + UCHAR NtPassword[MSV1_0_OWF_PASSWORD_LENGTH]; +} MSV1_0_SUPPLEMENTAL_CREDENTIAL, *PMSV1_0_SUPPLEMENTAL_CREDENTIAL; + +typedef struct _MSV1_0_NTLM3_RESPONSE { + UCHAR Response[MSV1_0_NTLM3_RESPONSE_LENGTH]; + UCHAR RespType; + UCHAR HiRespType; + USHORT Flags; + ULONG MsgWord; + ULONGLONG TimeStamp; + UCHAR ChallengeFromClient[MSV1_0_CHALLENGE_LENGTH]; + ULONG AvPairsOff; + UCHAR Buffer[1]; +} MSV1_0_NTLM3_RESPONSE, *PMSV1_0_NTLM3_RESPONSE; + +typedef enum _MSV1_0_AVID { + MsvAvEOL, + MsvAvNbComputerName, + MsvAvNbDomainName, + MsvAvDnsComputerName, + MsvAvDnsDomainName, +#if (_WIN32_WINNT >= 0x0501) + MsvAvDnsTreeName, + MsvAvFlags, +#if (_WIN32_WINNT >= 0x0600) + MsvAvTimestamp, + MsvAvRestrictions, + MsvAvTargetName, + MsvAvChannelBindings, +#endif +#endif +} MSV1_0_AVID; + +typedef struct _MSV1_0_AV_PAIR { + USHORT AvId; + USHORT AvLen; +} MSV1_0_AV_PAIR, *PMSV1_0_AV_PAIR; + +typedef enum _MSV1_0_PROTOCOL_MESSAGE_TYPE { + MsV1_0Lm20ChallengeRequest = 0, + MsV1_0Lm20GetChallengeResponse, + MsV1_0EnumerateUsers, + MsV1_0GetUserInfo, + MsV1_0ReLogonUsers, + MsV1_0ChangePassword, + MsV1_0ChangeCachedPassword, + MsV1_0GenericPassthrough, + MsV1_0CacheLogon, + MsV1_0SubAuth, + MsV1_0DeriveCredential, + MsV1_0CacheLookup, +#if (_WIN32_WINNT >= 0x0501) + MsV1_0SetProcessOption, +#endif +#if (_WIN32_WINNT >= 0x0600) + MsV1_0ConfigLocalAliases, + MsV1_0ClearCachedCredentials, +#endif +} MSV1_0_PROTOCOL_MESSAGE_TYPE, *PMSV1_0_PROTOCOL_MESSAGE_TYPE; + +typedef struct _MSV1_0_LM20_CHALLENGE_REQUEST { + MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; +} MSV1_0_LM20_CHALLENGE_REQUEST, *PMSV1_0_LM20_CHALLENGE_REQUEST; + +typedef struct _MSV1_0_LM20_CHALLENGE_RESPONSE { + MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; + UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH]; +} MSV1_0_LM20_CHALLENGE_RESPONSE, *PMSV1_0_LM20_CHALLENGE_RESPONSE; + +typedef struct _MSV1_0_GETCHALLENRESP_REQUEST_V1 { + MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; + ULONG ParameterControl; + LUID LogonId; + UNICODE_STRING Password; + UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH]; +} MSV1_0_GETCHALLENRESP_REQUEST_V1, *PMSV1_0_GETCHALLENRESP_REQUEST_V1; + +typedef struct _MSV1_0_GETCHALLENRESP_REQUEST { + MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; + ULONG ParameterControl; + LUID LogonId; + UNICODE_STRING Password; + UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH]; + UNICODE_STRING UserName; + UNICODE_STRING LogonDomainName; + UNICODE_STRING ServerName; +} MSV1_0_GETCHALLENRESP_REQUEST, *PMSV1_0_GETCHALLENRESP_REQUEST; + +typedef struct _MSV1_0_GETCHALLENRESP_RESPONSE { + MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; + STRING CaseSensitiveChallengeResponse; + STRING CaseInsensitiveChallengeResponse; + UNICODE_STRING UserName; + UNICODE_STRING LogonDomainName; + UCHAR UserSessionKey[MSV1_0_USER_SESSION_KEY_LENGTH]; + UCHAR LanmanSessionKey[MSV1_0_LANMAN_SESSION_KEY_LENGTH]; +} MSV1_0_GETCHALLENRESP_RESPONSE, *PMSV1_0_GETCHALLENRESP_RESPONSE; + +typedef struct _MSV1_0_ENUMUSERS_REQUEST { + MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; +} MSV1_0_ENUMUSERS_REQUEST, *PMSV1_0_ENUMUSERS_REQUEST; + +typedef struct _MSV1_0_ENUMUSERS_RESPONSE { + MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; + ULONG NumberOfLoggedOnUsers; + PLUID LogonIds; + PULONG EnumHandles; +} MSV1_0_ENUMUSERS_RESPONSE, *PMSV1_0_ENUMUSERS_RESPONSE; + +typedef struct _MSV1_0_GETUSERINFO_REQUEST { + MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; + LUID LogonId; +} MSV1_0_GETUSERINFO_REQUEST, *PMSV1_0_GETUSERINFO_REQUEST; + +typedef struct _MSV1_0_GETUSERINFO_RESPONSE { + MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType; + PSID UserSid; + UNICODE_STRING UserName; + UNICODE_STRING LogonDomainName; + UNICODE_STRING LogonServer; + SECURITY_LOGON_TYPE LogonType; +} MSV1_0_GETUSERINFO_RESPONSE, *PMSV1_0_GETUSERINFO_RESPONSE; + +#define FILE_OPLOCK_BROKEN_TO_LEVEL_2 0x00000007 +#define FILE_OPLOCK_BROKEN_TO_NONE 0x00000008 +#define FILE_OPBATCH_BREAK_UNDERWAY 0x00000009 /* also in winnt.h */ #define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001 @@ -184,34 +2923,30 @@ typedef enum _SECURITY_LOGON_TYPE #define FILE_NOTIFY_CHANGE_STREAM_SIZE 0x00000400 #define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800 #define FILE_NOTIFY_VALID_MASK 0x00000fff -/* end winnt.h */ -#define FILE_OPLOCK_BROKEN_TO_LEVEL_2 0x00000007 -#define FILE_OPLOCK_BROKEN_TO_NONE 0x00000008 +#define FILE_ACTION_ADDED 0x00000001 +#define FILE_ACTION_REMOVED 0x00000002 +#define FILE_ACTION_MODIFIED 0x00000003 +#define FILE_ACTION_RENAMED_OLD_NAME 0x00000004 +#define FILE_ACTION_RENAMED_NEW_NAME 0x00000005 +#define FILE_ACTION_ADDED_STREAM 0x00000006 +#define FILE_ACTION_REMOVED_STREAM 0x00000007 +#define FILE_ACTION_MODIFIED_STREAM 0x00000008 +#define FILE_ACTION_REMOVED_BY_DELETE 0x00000009 +#define FILE_ACTION_ID_NOT_TUNNELLED 0x0000000A +#define FILE_ACTION_TUNNELLED_ID_COLLISION 0x0000000B +/* end winnt.h */ -#define FILE_OPBATCH_BREAK_UNDERWAY 0x00000009 - -#define FILE_CASE_SENSITIVE_SEARCH 0x00000001 -#define FILE_CASE_PRESERVED_NAMES 0x00000002 -#define FILE_UNICODE_ON_DISK 0x00000004 -#define FILE_PERSISTENT_ACLS 0x00000008 -#define FILE_FILE_COMPRESSION 0x00000010 -#define FILE_VOLUME_QUOTAS 0x00000020 -#define FILE_SUPPORTS_SPARSE_FILES 0x00000040 -#define FILE_SUPPORTS_REPARSE_POINTS 0x00000080 -#define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100 -#define FS_LFN_APIS 0x00004000 -#define FILE_VOLUME_IS_COMPRESSED 0x00008000 -#define FILE_SUPPORTS_OBJECT_IDS 0x00010000 -#define FILE_SUPPORTS_ENCRYPTION 0x00020000 -#define FILE_NAMED_STREAMS 0x00040000 -#define FILE_READ_ONLY_VOLUME 0x00080000 -#define FILE_SEQUENTIAL_WRITE_ONCE 0x00100000 -#define FILE_SUPPORTS_TRANSACTIONS 0x00200000 - #define FILE_PIPE_BYTE_STREAM_TYPE 0x00000000 #define FILE_PIPE_MESSAGE_TYPE 0x00000001 +#define FILE_PIPE_ACCEPT_REMOTE_CLIENTS 0x00000000 +#define FILE_PIPE_REJECT_REMOTE_CLIENTS 0x00000002 + +#define FILE_PIPE_ACCEPT_REMOTE_CLIENTS 0x00000000 +#define FILE_PIPE_REJECT_REMOTE_CLIENTS 0x00000002 +#define FILE_PIPE_TYPE_VALID_MASK 0x00000003 + #define FILE_PIPE_BYTE_STREAM_MODE 0x00000000 #define FILE_PIPE_MESSAGE_MODE 0x00000001 @@ -230,42 +2965,3542 @@ typedef enum _SECURITY_LOGON_TYPE #define FILE_PIPE_CLIENT_END 0x00000000 #define FILE_PIPE_SERVER_END 0x00000001 -#define FILE_PIPE_READ_DATA 0x00000000 -#define FILE_PIPE_WRITE_SPACE 0x00000001 +#define FILE_CASE_SENSITIVE_SEARCH 0x00000001 +#define FILE_CASE_PRESERVED_NAMES 0x00000002 +#define FILE_UNICODE_ON_DISK 0x00000004 +#define FILE_PERSISTENT_ACLS 0x00000008 +#define FILE_FILE_COMPRESSION 0x00000010 +#define FILE_VOLUME_QUOTAS 0x00000020 +#define FILE_SUPPORTS_SPARSE_FILES 0x00000040 +#define FILE_SUPPORTS_REPARSE_POINTS 0x00000080 +#define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100 +#define FILE_VOLUME_IS_COMPRESSED 0x00008000 +#define FILE_SUPPORTS_OBJECT_IDS 0x00010000 +#define FILE_SUPPORTS_ENCRYPTION 0x00020000 +#define FILE_NAMED_STREAMS 0x00040000 +#define FILE_READ_ONLY_VOLUME 0x00080000 +#define FILE_SEQUENTIAL_WRITE_ONCE 0x00100000 +#define FILE_SUPPORTS_TRANSACTIONS 0x00200000 +#define FILE_SUPPORTS_HARD_LINKS 0x00400000 +#define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000 +#define FILE_SUPPORTS_OPEN_BY_FILE_ID 0x01000000 +#define FILE_SUPPORTS_USN_JOURNAL 0x02000000 -#define FILE_STORAGE_TYPE_SPECIFIED 0x00000041 /* FILE_DIRECTORY_FILE | FILE_NON_DIRECTORY_FILE */ -#define FILE_STORAGE_TYPE_DEFAULT (StorageTypeDefault << FILE_STORAGE_TYPE_SHIFT) -#define FILE_STORAGE_TYPE_DIRECTORY (StorageTypeDirectory << FILE_STORAGE_TYPE_SHIFT) -#define FILE_STORAGE_TYPE_FILE (StorageTypeFile << FILE_STORAGE_TYPE_SHIFT) -#define FILE_STORAGE_TYPE_DOCFILE (StorageTypeDocfile << FILE_STORAGE_TYPE_SHIFT) -#define FILE_STORAGE_TYPE_JUNCTION_POINT (StorageTypeJunctionPoint << FILE_STORAGE_TYPE_SHIFT) -#define FILE_STORAGE_TYPE_CATALOG (StorageTypeCatalog << FILE_STORAGE_TYPE_SHIFT) -#define FILE_STORAGE_TYPE_STRUCTURED_STORAGE (StorageTypeStructuredStorage << FILE_STORAGE_TYPE_SHIFT) -#define FILE_STORAGE_TYPE_EMBEDDING (StorageTypeEmbedding << FILE_STORAGE_TYPE_SHIFT) -#define FILE_STORAGE_TYPE_STREAM (StorageTypeStream << FILE_STORAGE_TYPE_SHIFT) -#define FILE_MINIMUM_STORAGE_TYPE FILE_STORAGE_TYPE_DEFAULT -#define FILE_MAXIMUM_STORAGE_TYPE FILE_STORAGE_TYPE_STREAM -#define FILE_STORAGE_TYPE_MASK 0x000f0000 -#define FILE_STORAGE_TYPE_SHIFT 16 +#define FILE_NEED_EA 0x00000080 + +#define FILE_EA_TYPE_BINARY 0xfffe +#define FILE_EA_TYPE_ASCII 0xfffd +#define FILE_EA_TYPE_BITMAP 0xfffb +#define FILE_EA_TYPE_METAFILE 0xfffa +#define FILE_EA_TYPE_ICON 0xfff9 +#define FILE_EA_TYPE_EA 0xffee +#define FILE_EA_TYPE_MVMT 0xffdf +#define FILE_EA_TYPE_MVST 0xffde +#define FILE_EA_TYPE_ASN1 0xffdd +#define FILE_EA_TYPE_FAMILY_IDS 0xff01 + +typedef struct _FILE_NOTIFY_INFORMATION { + ULONG NextEntryOffset; + ULONG Action; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION; + +typedef struct _FILE_DIRECTORY_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION; + +typedef struct _FILE_FULL_DIR_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + ULONG EaSize; + WCHAR FileName[1]; +} FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION; + +typedef struct _FILE_ID_FULL_DIR_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + ULONG EaSize; + LARGE_INTEGER FileId; + WCHAR FileName[1]; +} FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION; + +typedef struct _FILE_BOTH_DIR_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + ULONG EaSize; + CCHAR ShortNameLength; + WCHAR ShortName[12]; + WCHAR FileName[1]; +} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION; + +typedef struct _FILE_ID_BOTH_DIR_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + ULONG EaSize; + CCHAR ShortNameLength; + WCHAR ShortName[12]; + LARGE_INTEGER FileId; + WCHAR FileName[1]; +} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION; + +typedef struct _FILE_NAMES_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION; + +typedef struct _FILE_ID_GLOBAL_TX_DIR_INFORMATION { + ULONG NextEntryOffset; + ULONG FileIndex; + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER EndOfFile; + LARGE_INTEGER AllocationSize; + ULONG FileAttributes; + ULONG FileNameLength; + LARGE_INTEGER FileId; + GUID LockingTransactionId; + ULONG TxInfoFlags; + WCHAR FileName[1]; +} FILE_ID_GLOBAL_TX_DIR_INFORMATION, *PFILE_ID_GLOBAL_TX_DIR_INFORMATION; + +#define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_WRITELOCKED 0x00000001 +#define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_TO_TX 0x00000002 +#define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_OUTSIDE_TX 0x00000004 + +typedef struct _FILE_OBJECTID_INFORMATION { + LONGLONG FileReference; + UCHAR ObjectId[16]; + _ANONYMOUS_UNION union { + __GNU_EXTENSION struct { + UCHAR BirthVolumeId[16]; + UCHAR BirthObjectId[16]; + UCHAR DomainId[16]; + }; + UCHAR ExtendedInfo[48]; + } DUMMYUNIONNAME; +} FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION; + +#define ANSI_DOS_STAR ('<') +#define ANSI_DOS_QM ('>') +#define ANSI_DOS_DOT ('"') + +#define DOS_STAR (L'<') +#define DOS_QM (L'>') +#define DOS_DOT (L'"') + +typedef struct _FILE_INTERNAL_INFORMATION { + LARGE_INTEGER IndexNumber; +} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION; + +typedef struct _FILE_EA_INFORMATION { + ULONG EaSize; +} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION; + +typedef struct _FILE_ACCESS_INFORMATION { + ACCESS_MASK AccessFlags; +} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION; + +typedef struct _FILE_MODE_INFORMATION { + ULONG Mode; +} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION; + +typedef struct _FILE_ALL_INFORMATION { + FILE_BASIC_INFORMATION BasicInformation; + FILE_STANDARD_INFORMATION StandardInformation; + FILE_INTERNAL_INFORMATION InternalInformation; + FILE_EA_INFORMATION EaInformation; + FILE_ACCESS_INFORMATION AccessInformation; + FILE_POSITION_INFORMATION PositionInformation; + FILE_MODE_INFORMATION ModeInformation; + FILE_ALIGNMENT_INFORMATION AlignmentInformation; + FILE_NAME_INFORMATION NameInformation; +} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION; + +typedef struct _FILE_ALLOCATION_INFORMATION { + LARGE_INTEGER AllocationSize; +} FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION; + +typedef struct _FILE_COMPRESSION_INFORMATION { + LARGE_INTEGER CompressedFileSize; + USHORT CompressionFormat; + UCHAR CompressionUnitShift; + UCHAR ChunkShift; + UCHAR ClusterShift; + UCHAR Reserved[3]; +} FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION; + +typedef struct _FILE_LINK_INFORMATION { + BOOLEAN ReplaceIfExists; + HANDLE RootDirectory; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION; + +typedef struct _FILE_MOVE_CLUSTER_INFORMATION { + ULONG ClusterCount; + HANDLE RootDirectory; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_MOVE_CLUSTER_INFORMATION, *PFILE_MOVE_CLUSTER_INFORMATION; + +typedef struct _FILE_RENAME_INFORMATION { + BOOLEAN ReplaceIfExists; + HANDLE RootDirectory; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION; + +typedef struct _FILE_STREAM_INFORMATION { + ULONG NextEntryOffset; + ULONG StreamNameLength; + LARGE_INTEGER StreamSize; + LARGE_INTEGER StreamAllocationSize; + WCHAR StreamName[1]; +} FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION; + +typedef struct _FILE_TRACKING_INFORMATION { + HANDLE DestinationFile; + ULONG ObjectInformationLength; + CHAR ObjectInformation[1]; +} FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION; + +typedef struct _FILE_COMPLETION_INFORMATION { + HANDLE Port; + PVOID Key; +} FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION; + +typedef struct _FILE_PIPE_INFORMATION { + ULONG ReadMode; + ULONG CompletionMode; +} FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION; + +typedef struct _FILE_PIPE_LOCAL_INFORMATION { + ULONG NamedPipeType; + ULONG NamedPipeConfiguration; + ULONG MaximumInstances; + ULONG CurrentInstances; + ULONG InboundQuota; + ULONG ReadDataAvailable; + ULONG OutboundQuota; + ULONG WriteQuotaAvailable; + ULONG NamedPipeState; + ULONG NamedPipeEnd; +} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION; + +typedef struct _FILE_PIPE_REMOTE_INFORMATION { + LARGE_INTEGER CollectDataTime; + ULONG MaximumCollectionCount; +} FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION; + +typedef struct _FILE_MAILSLOT_QUERY_INFORMATION { + ULONG MaximumMessageSize; + ULONG MailslotQuota; + ULONG NextMessageSize; + ULONG MessagesAvailable; + LARGE_INTEGER ReadTimeout; +} FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION; + +typedef struct _FILE_MAILSLOT_SET_INFORMATION { + PLARGE_INTEGER ReadTimeout; +} FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION; + +typedef struct _FILE_REPARSE_POINT_INFORMATION { + LONGLONG FileReference; + ULONG Tag; +} FILE_REPARSE_POINT_INFORMATION, *PFILE_REPARSE_POINT_INFORMATION; + +typedef struct _FILE_LINK_ENTRY_INFORMATION { + ULONG NextEntryOffset; + LONGLONG ParentFileId; + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_LINK_ENTRY_INFORMATION, *PFILE_LINK_ENTRY_INFORMATION; + +typedef struct _FILE_LINKS_INFORMATION { + ULONG BytesNeeded; + ULONG EntriesReturned; + FILE_LINK_ENTRY_INFORMATION Entry; +} FILE_LINKS_INFORMATION, *PFILE_LINKS_INFORMATION; + +typedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION { + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION; + +typedef struct _FILE_STANDARD_LINK_INFORMATION { + ULONG NumberOfAccessibleLinks; + ULONG TotalNumberOfLinks; + BOOLEAN DeletePending; + BOOLEAN Directory; +} FILE_STANDARD_LINK_INFORMATION, *PFILE_STANDARD_LINK_INFORMATION; + +typedef struct _FILE_GET_EA_INFORMATION { + ULONG NextEntryOffset; + UCHAR EaNameLength; + CHAR EaName[1]; +} FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION; + +#define REMOTE_PROTOCOL_FLAG_LOOPBACK 0x00000001 +#define REMOTE_PROTOCOL_FLAG_OFFLINE 0x00000002 + +typedef struct _FILE_REMOTE_PROTOCOL_INFORMATION { + USHORT StructureVersion; + USHORT StructureSize; + ULONG Protocol; + USHORT ProtocolMajorVersion; + USHORT ProtocolMinorVersion; + USHORT ProtocolRevision; + USHORT Reserved; + ULONG Flags; + struct { + ULONG Reserved[8]; + } GenericReserved; + struct { + ULONG Reserved[16]; + } ProtocolSpecificReserved; +} FILE_REMOTE_PROTOCOL_INFORMATION, *PFILE_REMOTE_PROTOCOL_INFORMATION; + +typedef struct _FILE_GET_QUOTA_INFORMATION { + ULONG NextEntryOffset; + ULONG SidLength; + SID Sid; +} FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION; + +typedef struct _FILE_QUOTA_INFORMATION { + ULONG NextEntryOffset; + ULONG SidLength; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER QuotaUsed; + LARGE_INTEGER QuotaThreshold; + LARGE_INTEGER QuotaLimit; + SID Sid; +} FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION; + +typedef struct _FILE_FS_ATTRIBUTE_INFORMATION { + ULONG FileSystemAttributes; + ULONG MaximumComponentNameLength; + ULONG FileSystemNameLength; + WCHAR FileSystemName[1]; +} FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION; + +typedef struct _FILE_FS_DRIVER_PATH_INFORMATION { + BOOLEAN DriverInPath; + ULONG DriverNameLength; + WCHAR DriverName[1]; +} FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION; + +typedef struct _FILE_FS_VOLUME_FLAGS_INFORMATION { + ULONG Flags; +} FILE_FS_VOLUME_FLAGS_INFORMATION, *PFILE_FS_VOLUME_FLAGS_INFORMATION; #define FILE_VC_QUOTA_NONE 0x00000000 #define FILE_VC_QUOTA_TRACK 0x00000001 #define FILE_VC_QUOTA_ENFORCE 0x00000002 #define FILE_VC_QUOTA_MASK 0x00000003 - -#define FILE_VC_QUOTAS_LOG_VIOLATIONS 0x00000004 #define FILE_VC_CONTENT_INDEX_DISABLED 0x00000008 - #define FILE_VC_LOG_QUOTA_THRESHOLD 0x00000010 #define FILE_VC_LOG_QUOTA_LIMIT 0x00000020 #define FILE_VC_LOG_VOLUME_THRESHOLD 0x00000040 #define FILE_VC_LOG_VOLUME_LIMIT 0x00000080 - #define FILE_VC_QUOTAS_INCOMPLETE 0x00000100 #define FILE_VC_QUOTAS_REBUILDING 0x00000200 - #define FILE_VC_VALID_MASK 0x000003ff +typedef struct _FILE_FS_CONTROL_INFORMATION { + LARGE_INTEGER FreeSpaceStartFiltering; + LARGE_INTEGER FreeSpaceThreshold; + LARGE_INTEGER FreeSpaceStopFiltering; + LARGE_INTEGER DefaultQuotaThreshold; + LARGE_INTEGER DefaultQuotaLimit; + ULONG FileSystemControlFlags; +} FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION; + +#ifndef _FILESYSTEMFSCTL_ +#define _FILESYSTEMFSCTL_ + +#define FSCTL_REQUEST_OPLOCK_LEVEL_1 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_REQUEST_OPLOCK_LEVEL_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_REQUEST_BATCH_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 3, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 4, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_OPLOCK_BREAK_NOTIFY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 5, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 7, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_IS_VOLUME_MOUNTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_IS_PATHNAME_VALID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_MARK_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_QUERY_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 14, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_GET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_SET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA) +#define FSCTL_SET_BOOTLOADER_ACCESSED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define FSCTL_OPLOCK_BREAK_ACK_NO_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 20, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_INVALIDATE_VOLUMES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_QUERY_FAT_BPB CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_REQUEST_FILTER_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#if (_WIN32_WINNT >= 0x0400) + +#define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_GET_NTFS_FILE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_GET_VOLUME_BITMAP CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_GET_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_MOVE_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_IS_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 30, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_ALLOW_EXTENDED_DASD_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 32, METHOD_NEITHER, FILE_ANY_ACCESS) + +#endif + +#if (_WIN32_WINNT >= 0x0500) + +#define FSCTL_FIND_FILES_BY_SID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 35, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_SET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 38, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 39, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_DELETE_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 40, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_ENUM_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 44, METHOD_NEITHER, FILE_READ_DATA) +#define FSCTL_SECURITY_ID_CHECK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 45, METHOD_NEITHER, FILE_READ_DATA) +#define FSCTL_READ_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 46, METHOD_NEITHER, FILE_READ_DATA) +#define FSCTL_SET_OBJECT_ID_EXTENDED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 47, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_CREATE_OR_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 48, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_SET_SPARSE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_SET_ZERO_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 50, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_QUERY_ALLOCATED_RANGES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51, METHOD_NEITHER, FILE_READ_DATA) +#define FSCTL_ENABLE_UPGRADE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 52, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_SET_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 53, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_ENCRYPTION_FSCTL_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 54, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_WRITE_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 55, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_READ_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 56, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_CREATE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 57, METHOD_NEITHER, FILE_READ_DATA) +#define FSCTL_READ_FILE_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 58, METHOD_NEITHER, FILE_READ_DATA) +#define FSCTL_WRITE_USN_CLOSE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 59, METHOD_NEITHER, FILE_READ_DATA) +#define FSCTL_EXTEND_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 60, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_QUERY_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 61, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_DELETE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 62, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_MARK_HANDLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_SIS_COPYFILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 64, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_SIS_LINK_FILES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 65, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA) +#define FSCTL_RECALL_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 69, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_READ_FROM_PLEX CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_OUT_DIRECT, FILE_READ_DATA) +#define FSCTL_FILE_PREFETCH CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) + +#endif + +#if (_WIN32_WINNT >= 0x0600) + +#define FSCTL_MAKE_MEDIA_COMPATIBLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 76, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_SET_DEFECT_MANAGEMENT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 77, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_QUERY_SPARING_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 78, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_QUERY_ON_DISK_VOLUME_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 79, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_SET_VOLUME_COMPRESSION_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 80, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) +#define FSCTL_TXFS_MODIFY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 81, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_TXFS_QUERY_RM_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 82, METHOD_BUFFERED, FILE_READ_DATA) +#define FSCTL_TXFS_ROLLFORWARD_REDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 84, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_TXFS_ROLLFORWARD_UNDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 85, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_TXFS_START_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 86, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_TXFS_SHUTDOWN_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 87, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_TXFS_READ_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 88, METHOD_BUFFERED, FILE_READ_DATA) +#define FSCTL_TXFS_WRITE_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 89, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_TXFS_CREATE_SECONDARY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 90, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_TXFS_GET_METADATA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 91, METHOD_BUFFERED, FILE_READ_DATA) +#define FSCTL_TXFS_GET_TRANSACTED_VERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 92, METHOD_BUFFERED, FILE_READ_DATA) +#define FSCTL_TXFS_SAVEPOINT_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 94, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_TXFS_CREATE_MINIVERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 95, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_TXFS_TRANSACTION_ACTIVE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 99, METHOD_BUFFERED, FILE_READ_DATA) +#define FSCTL_SET_ZERO_ON_DEALLOCATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 101, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) +#define FSCTL_SET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 102, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_GET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 103, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_WAIT_FOR_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 104, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_INITIATE_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 106, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_CSC_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER, FILE_ANY_ACCESS) +#define FSCTL_SHRINK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 108, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) +#define FSCTL_SET_SHORT_NAME_BEHAVIOR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 109, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_DFSR_SET_GHOST_HANDLE_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 110, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES \ + CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_READ_DATA) +#define FSCTL_TXFS_LIST_TRANSACTIONS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 121, METHOD_BUFFERED, FILE_READ_DATA) +#define FSCTL_QUERY_PAGEFILE_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 122, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_RESET_VOLUME_ALLOCATION_HINTS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 123, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_TXFS_READ_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 126, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#endif + +#if (_WIN32_WINNT >= 0x0601) + +#define FSCTL_QUERY_DEPENDENT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 124, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_SD_GLOBAL_CHANGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 125, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_LOOKUP_STREAM_FROM_CLUSTER CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 127, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_TXFS_WRITE_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 128, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_FILE_TYPE_NOTIFICATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 129, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_GET_BOOT_AREA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 140, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_GET_RETRIEVAL_POINTER_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_SET_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 142, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_QUERY_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 143, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define FSCTL_REQUEST_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 144, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define FSCTL_CSV_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 145, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_IS_CSV_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 146, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define FSCTL_QUERY_FILE_SYSTEM_RECOGNITION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 147, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_CSV_GET_VOLUME_PATH_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 148, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_CSV_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 149, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_CSV_GET_VOLUME_PATH_NAMES_FOR_VOLUME_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 150, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_IS_FILE_ON_CSV_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 151, METHOD_BUFFERED, FILE_ANY_ACCESS) + +typedef struct _CSV_NAMESPACE_INFO { + ULONG Version; + ULONG DeviceNumber; + LARGE_INTEGER StartingOffset; + ULONG SectorSize; +} CSV_NAMESPACE_INFO, *PCSV_NAMESPACE_INFO; + +#define CSV_NAMESPACE_INFO_V1 (sizeof(CSV_NAMESPACE_INFO)) +#define CSV_INVALID_DEVICE_NUMBER 0xFFFFFFFF + +#endif + +#define FSCTL_MARK_AS_SYSTEM_HIVE FSCTL_SET_BOOTLOADER_ACCESSED + +typedef struct _PATHNAME_BUFFER { + ULONG PathNameLength; + WCHAR Name[1]; +} PATHNAME_BUFFER, *PPATHNAME_BUFFER; + +typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER { + UCHAR First0x24BytesOfBootSector[0x24]; +} FSCTL_QUERY_FAT_BPB_BUFFER, *PFSCTL_QUERY_FAT_BPB_BUFFER; + +#if (_WIN32_WINNT >= 0x0400) + +typedef struct _NTFS_VOLUME_DATA_BUFFER { + LARGE_INTEGER VolumeSerialNumber; + LARGE_INTEGER NumberSectors; + LARGE_INTEGER TotalClusters; + LARGE_INTEGER FreeClusters; + LARGE_INTEGER TotalReserved; + ULONG BytesPerSector; + ULONG BytesPerCluster; + ULONG BytesPerFileRecordSegment; + ULONG ClustersPerFileRecordSegment; + LARGE_INTEGER MftValidDataLength; + LARGE_INTEGER MftStartLcn; + LARGE_INTEGER Mft2StartLcn; + LARGE_INTEGER MftZoneStart; + LARGE_INTEGER MftZoneEnd; +} NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER; + +typedef struct _NTFS_EXTENDED_VOLUME_DATA { + ULONG ByteCount; + USHORT MajorVersion; + USHORT MinorVersion; +} NTFS_EXTENDED_VOLUME_DATA, *PNTFS_EXTENDED_VOLUME_DATA; + +typedef struct _STARTING_LCN_INPUT_BUFFER { + LARGE_INTEGER StartingLcn; +} STARTING_LCN_INPUT_BUFFER, *PSTARTING_LCN_INPUT_BUFFER; + +typedef struct _VOLUME_BITMAP_BUFFER { + LARGE_INTEGER StartingLcn; + LARGE_INTEGER BitmapSize; + UCHAR Buffer[1]; +} VOLUME_BITMAP_BUFFER, *PVOLUME_BITMAP_BUFFER; + +typedef struct _STARTING_VCN_INPUT_BUFFER { + LARGE_INTEGER StartingVcn; +} STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER; + +typedef struct _RETRIEVAL_POINTERS_BUFFER { + ULONG ExtentCount; + LARGE_INTEGER StartingVcn; + struct { + LARGE_INTEGER NextVcn; + LARGE_INTEGER Lcn; + } Extents[1]; +} RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER; + +typedef struct _NTFS_FILE_RECORD_INPUT_BUFFER { + LARGE_INTEGER FileReferenceNumber; +} NTFS_FILE_RECORD_INPUT_BUFFER, *PNTFS_FILE_RECORD_INPUT_BUFFER; + +typedef struct _NTFS_FILE_RECORD_OUTPUT_BUFFER { + LARGE_INTEGER FileReferenceNumber; + ULONG FileRecordLength; + UCHAR FileRecordBuffer[1]; +} NTFS_FILE_RECORD_OUTPUT_BUFFER, *PNTFS_FILE_RECORD_OUTPUT_BUFFER; + +typedef struct _MOVE_FILE_DATA { + HANDLE FileHandle; + LARGE_INTEGER StartingVcn; + LARGE_INTEGER StartingLcn; + ULONG ClusterCount; +} MOVE_FILE_DATA, *PMOVE_FILE_DATA; + +typedef struct _MOVE_FILE_RECORD_DATA { + HANDLE FileHandle; + LARGE_INTEGER SourceFileRecord; + LARGE_INTEGER TargetFileRecord; +} MOVE_FILE_RECORD_DATA, *PMOVE_FILE_RECORD_DATA; + +#if defined(_WIN64) +typedef struct _MOVE_FILE_DATA32 { + UINT32 FileHandle; + LARGE_INTEGER StartingVcn; + LARGE_INTEGER StartingLcn; + ULONG ClusterCount; +} MOVE_FILE_DATA32, *PMOVE_FILE_DATA32; +#endif + +#endif /* (_WIN32_WINNT >= 0x0400) */ + +#if (_WIN32_WINNT >= 0x0500) + +typedef struct _FIND_BY_SID_DATA { + ULONG Restart; + SID Sid; +} FIND_BY_SID_DATA, *PFIND_BY_SID_DATA; + +typedef struct _FIND_BY_SID_OUTPUT { + ULONG NextEntryOffset; + ULONG FileIndex; + ULONG FileNameLength; + WCHAR FileName[1]; +} FIND_BY_SID_OUTPUT, *PFIND_BY_SID_OUTPUT; + +typedef struct _MFT_ENUM_DATA { + ULONGLONG StartFileReferenceNumber; + USN LowUsn; + USN HighUsn; +} MFT_ENUM_DATA, *PMFT_ENUM_DATA; + +typedef struct _CREATE_USN_JOURNAL_DATA { + ULONGLONG MaximumSize; + ULONGLONG AllocationDelta; +} CREATE_USN_JOURNAL_DATA, *PCREATE_USN_JOURNAL_DATA; + +typedef struct _READ_USN_JOURNAL_DATA { + USN StartUsn; + ULONG ReasonMask; + ULONG ReturnOnlyOnClose; + ULONGLONG Timeout; + ULONGLONG BytesToWaitFor; + ULONGLONG UsnJournalID; +} READ_USN_JOURNAL_DATA, *PREAD_USN_JOURNAL_DATA; + +typedef struct _USN_RECORD { + ULONG RecordLength; + USHORT MajorVersion; + USHORT MinorVersion; + ULONGLONG FileReferenceNumber; + ULONGLONG ParentFileReferenceNumber; + USN Usn; + LARGE_INTEGER TimeStamp; + ULONG Reason; + ULONG SourceInfo; + ULONG SecurityId; + ULONG FileAttributes; + USHORT FileNameLength; + USHORT FileNameOffset; + WCHAR FileName[1]; +} USN_RECORD, *PUSN_RECORD; + +#define USN_PAGE_SIZE (0x1000) + +#define USN_REASON_DATA_OVERWRITE (0x00000001) +#define USN_REASON_DATA_EXTEND (0x00000002) +#define USN_REASON_DATA_TRUNCATION (0x00000004) +#define USN_REASON_NAMED_DATA_OVERWRITE (0x00000010) +#define USN_REASON_NAMED_DATA_EXTEND (0x00000020) +#define USN_REASON_NAMED_DATA_TRUNCATION (0x00000040) +#define USN_REASON_FILE_CREATE (0x00000100) +#define USN_REASON_FILE_DELETE (0x00000200) +#define USN_REASON_EA_CHANGE (0x00000400) +#define USN_REASON_SECURITY_CHANGE (0x00000800) +#define USN_REASON_RENAME_OLD_NAME (0x00001000) +#define USN_REASON_RENAME_NEW_NAME (0x00002000) +#define USN_REASON_INDEXABLE_CHANGE (0x00004000) +#define USN_REASON_BASIC_INFO_CHANGE (0x00008000) +#define USN_REASON_HARD_LINK_CHANGE (0x00010000) +#define USN_REASON_COMPRESSION_CHANGE (0x00020000) +#define USN_REASON_ENCRYPTION_CHANGE (0x00040000) +#define USN_REASON_OBJECT_ID_CHANGE (0x00080000) +#define USN_REASON_REPARSE_POINT_CHANGE (0x00100000) +#define USN_REASON_STREAM_CHANGE (0x00200000) +#define USN_REASON_TRANSACTED_CHANGE (0x00400000) +#define USN_REASON_CLOSE (0x80000000) + +typedef struct _USN_JOURNAL_DATA { + ULONGLONG UsnJournalID; + USN FirstUsn; + USN NextUsn; + USN LowestValidUsn; + USN MaxUsn; + ULONGLONG MaximumSize; + ULONGLONG AllocationDelta; +} USN_JOURNAL_DATA, *PUSN_JOURNAL_DATA; + +typedef struct _DELETE_USN_JOURNAL_DATA { + ULONGLONG UsnJournalID; + ULONG DeleteFlags; +} DELETE_USN_JOURNAL_DATA, *PDELETE_USN_JOURNAL_DATA; + +#define USN_DELETE_FLAG_DELETE (0x00000001) +#define USN_DELETE_FLAG_NOTIFY (0x00000002) +#define USN_DELETE_VALID_FLAGS (0x00000003) + +typedef struct _MARK_HANDLE_INFO { + ULONG UsnSourceInfo; + HANDLE VolumeHandle; + ULONG HandleInfo; +} MARK_HANDLE_INFO, *PMARK_HANDLE_INFO; + +#if defined(_WIN64) +typedef struct _MARK_HANDLE_INFO32 { + ULONG UsnSourceInfo; + UINT32 VolumeHandle; + ULONG HandleInfo; +} MARK_HANDLE_INFO32, *PMARK_HANDLE_INFO32; +#endif + +#define USN_SOURCE_DATA_MANAGEMENT (0x00000001) +#define USN_SOURCE_AUXILIARY_DATA (0x00000002) +#define USN_SOURCE_REPLICATION_MANAGEMENT (0x00000004) + +#define MARK_HANDLE_PROTECT_CLUSTERS (0x00000001) +#define MARK_HANDLE_TXF_SYSTEM_LOG (0x00000004) +#define MARK_HANDLE_NOT_TXF_SYSTEM_LOG (0x00000008) + +typedef struct _BULK_SECURITY_TEST_DATA { + ACCESS_MASK DesiredAccess; + ULONG SecurityIds[1]; +} BULK_SECURITY_TEST_DATA, *PBULK_SECURITY_TEST_DATA; + +#define VOLUME_IS_DIRTY (0x00000001) +#define VOLUME_UPGRADE_SCHEDULED (0x00000002) +#define VOLUME_SESSION_OPEN (0x00000004) + +typedef struct _FILE_PREFETCH { + ULONG Type; + ULONG Count; + ULONGLONG Prefetch[1]; +} FILE_PREFETCH, *PFILE_PREFETCH; + +typedef struct _FILE_PREFETCH_EX { + ULONG Type; + ULONG Count; + PVOID Context; + ULONGLONG Prefetch[1]; +} FILE_PREFETCH_EX, *PFILE_PREFETCH_EX; + +#define FILE_PREFETCH_TYPE_FOR_CREATE 0x1 +#define FILE_PREFETCH_TYPE_FOR_DIRENUM 0x2 +#define FILE_PREFETCH_TYPE_FOR_CREATE_EX 0x3 +#define FILE_PREFETCH_TYPE_FOR_DIRENUM_EX 0x4 + +#define FILE_PREFETCH_TYPE_MAX 0x4 + +typedef struct _FILE_OBJECTID_BUFFER { + UCHAR ObjectId[16]; + union { + struct { + UCHAR BirthVolumeId[16]; + UCHAR BirthObjectId[16]; + UCHAR DomainId[16]; + } DUMMYSTRUCTNAME; + UCHAR ExtendedInfo[48]; + } DUMMYUNIONNAME; +} FILE_OBJECTID_BUFFER, *PFILE_OBJECTID_BUFFER; + +typedef struct _FILE_SET_SPARSE_BUFFER { + BOOLEAN SetSparse; +} FILE_SET_SPARSE_BUFFER, *PFILE_SET_SPARSE_BUFFER; + +typedef struct _FILE_ZERO_DATA_INFORMATION { + LARGE_INTEGER FileOffset; + LARGE_INTEGER BeyondFinalZero; +} FILE_ZERO_DATA_INFORMATION, *PFILE_ZERO_DATA_INFORMATION; + +typedef struct _FILE_ALLOCATED_RANGE_BUFFER { + LARGE_INTEGER FileOffset; + LARGE_INTEGER Length; +} FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER; + +typedef struct _ENCRYPTION_BUFFER { + ULONG EncryptionOperation; + UCHAR Private[1]; +} ENCRYPTION_BUFFER, *PENCRYPTION_BUFFER; + +#define FILE_SET_ENCRYPTION 0x00000001 +#define FILE_CLEAR_ENCRYPTION 0x00000002 +#define STREAM_SET_ENCRYPTION 0x00000003 +#define STREAM_CLEAR_ENCRYPTION 0x00000004 + +#define MAXIMUM_ENCRYPTION_VALUE 0x00000004 + +typedef struct _DECRYPTION_STATUS_BUFFER { + BOOLEAN NoEncryptedStreams; +} DECRYPTION_STATUS_BUFFER, *PDECRYPTION_STATUS_BUFFER; + +#define ENCRYPTION_FORMAT_DEFAULT (0x01) + +#define COMPRESSION_FORMAT_SPARSE (0x4000) + +typedef struct _REQUEST_RAW_ENCRYPTED_DATA { + LONGLONG FileOffset; + ULONG Length; +} REQUEST_RAW_ENCRYPTED_DATA, *PREQUEST_RAW_ENCRYPTED_DATA; + +typedef struct _ENCRYPTED_DATA_INFO { + ULONGLONG StartingFileOffset; + ULONG OutputBufferOffset; + ULONG BytesWithinFileSize; + ULONG BytesWithinValidDataLength; + USHORT CompressionFormat; + UCHAR DataUnitShift; + UCHAR ChunkShift; + UCHAR ClusterShift; + UCHAR EncryptionFormat; + USHORT NumberOfDataBlocks; + ULONG DataBlockSize[ANYSIZE_ARRAY]; +} ENCRYPTED_DATA_INFO, *PENCRYPTED_DATA_INFO; + +typedef struct _PLEX_READ_DATA_REQUEST { + LARGE_INTEGER ByteOffset; + ULONG ByteLength; + ULONG PlexNumber; +} PLEX_READ_DATA_REQUEST, *PPLEX_READ_DATA_REQUEST; + +typedef struct _SI_COPYFILE { + ULONG SourceFileNameLength; + ULONG DestinationFileNameLength; + ULONG Flags; + WCHAR FileNameBuffer[1]; +} SI_COPYFILE, *PSI_COPYFILE; + +#define COPYFILE_SIS_LINK 0x0001 +#define COPYFILE_SIS_REPLACE 0x0002 +#define COPYFILE_SIS_FLAGS 0x0003 + +#endif /* (_WIN32_WINNT >= 0x0500) */ + +#if (_WIN32_WINNT >= 0x0600) + +typedef struct _FILE_MAKE_COMPATIBLE_BUFFER { + BOOLEAN CloseDisc; +} FILE_MAKE_COMPATIBLE_BUFFER, *PFILE_MAKE_COMPATIBLE_BUFFER; + +typedef struct _FILE_SET_DEFECT_MGMT_BUFFER { + BOOLEAN Disable; +} FILE_SET_DEFECT_MGMT_BUFFER, *PFILE_SET_DEFECT_MGMT_BUFFER; + +typedef struct _FILE_QUERY_SPARING_BUFFER { + ULONG SparingUnitBytes; + BOOLEAN SoftwareSparing; + ULONG TotalSpareBlocks; + ULONG FreeSpareBlocks; +} FILE_QUERY_SPARING_BUFFER, *PFILE_QUERY_SPARING_BUFFER; + +typedef struct _FILE_QUERY_ON_DISK_VOL_INFO_BUFFER { + LARGE_INTEGER DirectoryCount; + LARGE_INTEGER FileCount; + USHORT FsFormatMajVersion; + USHORT FsFormatMinVersion; + WCHAR FsFormatName[12]; + LARGE_INTEGER FormatTime; + LARGE_INTEGER LastUpdateTime; + WCHAR CopyrightInfo[34]; + WCHAR AbstractInfo[34]; + WCHAR FormattingImplementationInfo[34]; + WCHAR LastModifyingImplementationInfo[34]; +} FILE_QUERY_ON_DISK_VOL_INFO_BUFFER, *PFILE_QUERY_ON_DISK_VOL_INFO_BUFFER; + +#define SET_REPAIR_ENABLED (0x00000001) +#define SET_REPAIR_VOLUME_BITMAP_SCAN (0x00000002) +#define SET_REPAIR_DELETE_CROSSLINK (0x00000004) +#define SET_REPAIR_WARN_ABOUT_DATA_LOSS (0x00000008) +#define SET_REPAIR_DISABLED_AND_BUGCHECK_ON_CORRUPT (0x00000010) +#define SET_REPAIR_VALID_MASK (0x0000001F) + +typedef enum _SHRINK_VOLUME_REQUEST_TYPES { + ShrinkPrepare = 1, + ShrinkCommit, + ShrinkAbort +} SHRINK_VOLUME_REQUEST_TYPES, *PSHRINK_VOLUME_REQUEST_TYPES; + +typedef struct _SHRINK_VOLUME_INFORMATION { + SHRINK_VOLUME_REQUEST_TYPES ShrinkRequestType; + ULONGLONG Flags; + LONGLONG NewNumberOfSectors; +} SHRINK_VOLUME_INFORMATION, *PSHRINK_VOLUME_INFORMATION; + +#define TXFS_RM_FLAG_LOGGING_MODE 0x00000001 +#define TXFS_RM_FLAG_RENAME_RM 0x00000002 +#define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000004 +#define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000008 +#define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000010 +#define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000020 +#define TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000040 +#define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000080 +#define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000100 +#define TXFS_RM_FLAG_GROW_LOG 0x00000400 +#define TXFS_RM_FLAG_SHRINK_LOG 0x00000800 +#define TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE 0x00001000 +#define TXFS_RM_FLAG_PRESERVE_CHANGES 0x00002000 +#define TXFS_RM_FLAG_RESET_RM_AT_NEXT_START 0x00004000 +#define TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START 0x00008000 +#define TXFS_RM_FLAG_PREFER_CONSISTENCY 0x00010000 +#define TXFS_RM_FLAG_PREFER_AVAILABILITY 0x00020000 + +#define TXFS_LOGGING_MODE_SIMPLE (0x0001) +#define TXFS_LOGGING_MODE_FULL (0x0002) + +#define TXFS_TRANSACTION_STATE_NONE 0x00 +#define TXFS_TRANSACTION_STATE_ACTIVE 0x01 +#define TXFS_TRANSACTION_STATE_PREPARED 0x02 +#define TXFS_TRANSACTION_STATE_NOTACTIVE 0x03 + +#define TXFS_MODIFY_RM_VALID_FLAGS \ + (TXFS_RM_FLAG_LOGGING_MODE | \ + TXFS_RM_FLAG_RENAME_RM | \ + TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX | \ + TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN | \ + TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \ + TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \ + TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE | \ + TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \ + TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN | \ + TXFS_RM_FLAG_SHRINK_LOG | \ + TXFS_RM_FLAG_GROW_LOG | \ + TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE | \ + TXFS_RM_FLAG_PRESERVE_CHANGES | \ + TXFS_RM_FLAG_RESET_RM_AT_NEXT_START | \ + TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START | \ + TXFS_RM_FLAG_PREFER_CONSISTENCY | \ + TXFS_RM_FLAG_PREFER_AVAILABILITY) + +typedef struct _TXFS_MODIFY_RM { + ULONG Flags; + ULONG LogContainerCountMax; + ULONG LogContainerCountMin; + ULONG LogContainerCount; + ULONG LogGrowthIncrement; + ULONG LogAutoShrinkPercentage; + ULONGLONG Reserved; + USHORT LoggingMode; +} TXFS_MODIFY_RM, *PTXFS_MODIFY_RM; + +#define TXFS_RM_STATE_NOT_STARTED 0 +#define TXFS_RM_STATE_STARTING 1 +#define TXFS_RM_STATE_ACTIVE 2 +#define TXFS_RM_STATE_SHUTTING_DOWN 3 + +#define TXFS_QUERY_RM_INFORMATION_VALID_FLAGS \ + (TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \ + TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \ + TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \ + TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN | \ + TXFS_RM_FLAG_RESET_RM_AT_NEXT_START | \ + TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START | \ + TXFS_RM_FLAG_PREFER_CONSISTENCY | \ + TXFS_RM_FLAG_PREFER_AVAILABILITY) + +typedef struct _TXFS_QUERY_RM_INFORMATION { + ULONG BytesRequired; + ULONGLONG TailLsn; + ULONGLONG CurrentLsn; + ULONGLONG ArchiveTailLsn; + ULONGLONG LogContainerSize; + LARGE_INTEGER HighestVirtualClock; + ULONG LogContainerCount; + ULONG LogContainerCountMax; + ULONG LogContainerCountMin; + ULONG LogGrowthIncrement; + ULONG LogAutoShrinkPercentage; + ULONG Flags; + USHORT LoggingMode; + USHORT Reserved; + ULONG RmState; + ULONGLONG LogCapacity; + ULONGLONG LogFree; + ULONGLONG TopsSize; + ULONGLONG TopsUsed; + ULONGLONG TransactionCount; + ULONGLONG OnePCCount; + ULONGLONG TwoPCCount; + ULONGLONG NumberLogFileFull; + ULONGLONG OldestTransactionAge; + GUID RMName; + ULONG TmLogPathOffset; +} TXFS_QUERY_RM_INFORMATION, *PTXFS_QUERY_RM_INFORMATION; + +#define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN 0x01 +#define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK 0x02 + +#define TXFS_ROLLFORWARD_REDO_VALID_FLAGS \ + (TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN | \ + TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK) + +typedef struct _TXFS_ROLLFORWARD_REDO_INFORMATION { + LARGE_INTEGER LastVirtualClock; + ULONGLONG LastRedoLsn; + ULONGLONG HighestRecoveryLsn; + ULONG Flags; +} TXFS_ROLLFORWARD_REDO_INFORMATION, *PTXFS_ROLLFORWARD_REDO_INFORMATION; + +#define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000001 +#define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000002 +#define TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE 0x00000004 +#define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000008 +#define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000010 +#define TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000020 +#define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000040 +#define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000080 + +#define TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT 0x00000200 +#define TXFS_START_RM_FLAG_LOGGING_MODE 0x00000400 +#define TXFS_START_RM_FLAG_PRESERVE_CHANGES 0x00000800 + +#define TXFS_START_RM_FLAG_PREFER_CONSISTENCY 0x00001000 +#define TXFS_START_RM_FLAG_PREFER_AVAILABILITY 0x00002000 + +#define TXFS_START_RM_VALID_FLAGS \ + (TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX | \ + TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN | \ + TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE | \ + TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \ + TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \ + TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE | \ + TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT | \ + TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \ + TXFS_START_RM_FLAG_LOGGING_MODE | \ + TXFS_START_RM_FLAG_PRESERVE_CHANGES | \ + TXFS_START_RM_FLAG_PREFER_CONSISTENCY | \ + TXFS_START_RM_FLAG_PREFER_AVAILABILITY) + +typedef struct _TXFS_START_RM_INFORMATION { + ULONG Flags; + ULONGLONG LogContainerSize; + ULONG LogContainerCountMin; + ULONG LogContainerCountMax; + ULONG LogGrowthIncrement; + ULONG LogAutoShrinkPercentage; + ULONG TmLogPathOffset; + USHORT TmLogPathLength; + USHORT LoggingMode; + USHORT LogPathLength; + USHORT Reserved; + WCHAR LogPath[1]; +} TXFS_START_RM_INFORMATION, *PTXFS_START_RM_INFORMATION; + +typedef struct _TXFS_GET_METADATA_INFO_OUT { + struct { + LONGLONG LowPart; + LONGLONG HighPart; + } TxfFileId; + GUID LockingTransaction; + ULONGLONG LastLsn; + ULONG TransactionState; +} TXFS_GET_METADATA_INFO_OUT, *PTXFS_GET_METADATA_INFO_OUT; + +#define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_CREATED 0x00000001 +#define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_DELETED 0x00000002 + +typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY { + ULONGLONG Offset; + ULONG NameFlags; + LONGLONG FileId; + ULONG Reserved1; + ULONG Reserved2; + LONGLONG Reserved3; + WCHAR FileName[1]; +} TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY, *PTXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY; + +typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES { + GUID KtmTransaction; + ULONGLONG NumberOfFiles; + ULONGLONG BufferSizeRequired; + ULONGLONG Offset; +} TXFS_LIST_TRANSACTION_LOCKED_FILES, *PTXFS_LIST_TRANSACTION_LOCKED_FILES; + +typedef struct _TXFS_LIST_TRANSACTIONS_ENTRY { + GUID TransactionId; + ULONG TransactionState; + ULONG Reserved1; + ULONG Reserved2; + LONGLONG Reserved3; +} TXFS_LIST_TRANSACTIONS_ENTRY, *PTXFS_LIST_TRANSACTIONS_ENTRY; + +typedef struct _TXFS_LIST_TRANSACTIONS { + ULONGLONG NumberOfTransactions; + ULONGLONG BufferSizeRequired; +} TXFS_LIST_TRANSACTIONS, *PTXFS_LIST_TRANSACTIONS; + +typedef struct _TXFS_READ_BACKUP_INFORMATION_OUT { + union { + ULONG BufferLength; + UCHAR Buffer[1]; + } DUMMYUNIONNAME; +} TXFS_READ_BACKUP_INFORMATION_OUT, *PTXFS_READ_BACKUP_INFORMATION_OUT; + +typedef struct _TXFS_WRITE_BACKUP_INFORMATION { + UCHAR Buffer[1]; +} TXFS_WRITE_BACKUP_INFORMATION, *PTXFS_WRITE_BACKUP_INFORMATION; + +#define TXFS_TRANSACTED_VERSION_NONTRANSACTED 0xFFFFFFFE +#define TXFS_TRANSACTED_VERSION_UNCOMMITTED 0xFFFFFFFF + +typedef struct _TXFS_GET_TRANSACTED_VERSION { + ULONG ThisBaseVersion; + ULONG LatestVersion; + USHORT ThisMiniVersion; + USHORT FirstMiniVersion; + USHORT LatestMiniVersion; +} TXFS_GET_TRANSACTED_VERSION, *PTXFS_GET_TRANSACTED_VERSION; + +#define TXFS_SAVEPOINT_SET 0x00000001 +#define TXFS_SAVEPOINT_ROLLBACK 0x00000002 +#define TXFS_SAVEPOINT_CLEAR 0x00000004 +#define TXFS_SAVEPOINT_CLEAR_ALL 0x00000010 + +typedef struct _TXFS_SAVEPOINT_INFORMATION { + HANDLE KtmTransaction; + ULONG ActionCode; + ULONG SavepointId; +} TXFS_SAVEPOINT_INFORMATION, *PTXFS_SAVEPOINT_INFORMATION; + +typedef struct _TXFS_CREATE_MINIVERSION_INFO { + USHORT StructureVersion; + USHORT StructureLength; + ULONG BaseVersion; + USHORT MiniVersion; +} TXFS_CREATE_MINIVERSION_INFO, *PTXFS_CREATE_MINIVERSION_INFO; + +typedef struct _TXFS_TRANSACTION_ACTIVE_INFO { + BOOLEAN TransactionsActiveAtSnapshot; +} TXFS_TRANSACTION_ACTIVE_INFO, *PTXFS_TRANSACTION_ACTIVE_INFO; + +#endif /* (_WIN32_WINNT >= 0x0600) */ + +#if (_WIN32_WINNT >= 0x0601) + +#define MARK_HANDLE_REALTIME (0x00000020) +#define MARK_HANDLE_NOT_REALTIME (0x00000040) + +#define NO_8DOT3_NAME_PRESENT (0x00000001) +#define REMOVED_8DOT3_NAME (0x00000002) + +#define PERSISTENT_VOLUME_STATE_SHORT_NAME_CREATION_DISABLED (0x00000001) + +typedef struct _BOOT_AREA_INFO { + ULONG BootSectorCount; + struct { + LARGE_INTEGER Offset; + } BootSectors[2]; +} BOOT_AREA_INFO, *PBOOT_AREA_INFO; + +typedef struct _RETRIEVAL_POINTER_BASE { + LARGE_INTEGER FileAreaOffset; +} RETRIEVAL_POINTER_BASE, *PRETRIEVAL_POINTER_BASE; + +typedef struct _FILE_FS_PERSISTENT_VOLUME_INFORMATION { + ULONG VolumeFlags; + ULONG FlagMask; + ULONG Version; + ULONG Reserved; +} FILE_FS_PERSISTENT_VOLUME_INFORMATION, *PFILE_FS_PERSISTENT_VOLUME_INFORMATION; + +typedef struct _FILE_SYSTEM_RECOGNITION_INFORMATION { + CHAR FileSystem[9]; +} FILE_SYSTEM_RECOGNITION_INFORMATION, *PFILE_SYSTEM_RECOGNITION_INFORMATION; + +#define OPLOCK_LEVEL_CACHE_READ (0x00000001) +#define OPLOCK_LEVEL_CACHE_HANDLE (0x00000002) +#define OPLOCK_LEVEL_CACHE_WRITE (0x00000004) + +#define REQUEST_OPLOCK_INPUT_FLAG_REQUEST (0x00000001) +#define REQUEST_OPLOCK_INPUT_FLAG_ACK (0x00000002) +#define REQUEST_OPLOCK_INPUT_FLAG_COMPLETE_ACK_ON_CLOSE (0x00000004) + +#define REQUEST_OPLOCK_CURRENT_VERSION 1 + +typedef struct _REQUEST_OPLOCK_INPUT_BUFFER { + USHORT StructureVersion; + USHORT StructureLength; + ULONG RequestedOplockLevel; + ULONG Flags; +} REQUEST_OPLOCK_INPUT_BUFFER, *PREQUEST_OPLOCK_INPUT_BUFFER; + +#define REQUEST_OPLOCK_OUTPUT_FLAG_ACK_REQUIRED (0x00000001) +#define REQUEST_OPLOCK_OUTPUT_FLAG_MODES_PROVIDED (0x00000002) + +typedef struct _REQUEST_OPLOCK_OUTPUT_BUFFER { + USHORT StructureVersion; + USHORT StructureLength; + ULONG OriginalOplockLevel; + ULONG NewOplockLevel; + ULONG Flags; + ACCESS_MASK AccessMode; + USHORT ShareMode; +} REQUEST_OPLOCK_OUTPUT_BUFFER, *PREQUEST_OPLOCK_OUTPUT_BUFFER; + +#define SD_GLOBAL_CHANGE_TYPE_MACHINE_SID 1 + +typedef struct _SD_CHANGE_MACHINE_SID_INPUT { + USHORT CurrentMachineSIDOffset; + USHORT CurrentMachineSIDLength; + USHORT NewMachineSIDOffset; + USHORT NewMachineSIDLength; +} SD_CHANGE_MACHINE_SID_INPUT, *PSD_CHANGE_MACHINE_SID_INPUT; + +typedef struct _SD_CHANGE_MACHINE_SID_OUTPUT { + ULONGLONG NumSDChangedSuccess; + ULONGLONG NumSDChangedFail; + ULONGLONG NumSDUnused; + ULONGLONG NumSDTotal; + ULONGLONG NumMftSDChangedSuccess; + ULONGLONG NumMftSDChangedFail; + ULONGLONG NumMftSDTotal; +} SD_CHANGE_MACHINE_SID_OUTPUT, *PSD_CHANGE_MACHINE_SID_OUTPUT; + +typedef struct _SD_GLOBAL_CHANGE_INPUT { + ULONG Flags; + ULONG ChangeType; + union { + SD_CHANGE_MACHINE_SID_INPUT SdChange; + }; +} SD_GLOBAL_CHANGE_INPUT, *PSD_GLOBAL_CHANGE_INPUT; + +typedef struct _SD_GLOBAL_CHANGE_OUTPUT { + ULONG Flags; + ULONG ChangeType; + union { + SD_CHANGE_MACHINE_SID_OUTPUT SdChange; + }; +} SD_GLOBAL_CHANGE_OUTPUT, *PSD_GLOBAL_CHANGE_OUTPUT; + +#define ENCRYPTED_DATA_INFO_SPARSE_FILE 1 + +typedef struct _EXTENDED_ENCRYPTED_DATA_INFO { + ULONG ExtendedCode; + ULONG Length; + ULONG Flags; + ULONG Reserved; +} EXTENDED_ENCRYPTED_DATA_INFO, *PEXTENDED_ENCRYPTED_DATA_INFO; + +typedef struct _LOOKUP_STREAM_FROM_CLUSTER_INPUT { + ULONG Flags; + ULONG NumberOfClusters; + LARGE_INTEGER Cluster[1]; +} LOOKUP_STREAM_FROM_CLUSTER_INPUT, *PLOOKUP_STREAM_FROM_CLUSTER_INPUT; + +typedef struct _LOOKUP_STREAM_FROM_CLUSTER_OUTPUT { + ULONG Offset; + ULONG NumberOfMatches; + ULONG BufferSizeRequired; +} LOOKUP_STREAM_FROM_CLUSTER_OUTPUT, *PLOOKUP_STREAM_FROM_CLUSTER_OUTPUT; + +#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_PAGE_FILE 0x00000001 +#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_DENY_DEFRAG_SET 0x00000002 +#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_FS_SYSTEM_FILE 0x00000004 +#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_TXF_SYSTEM_FILE 0x00000008 + +#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_MASK 0xff000000 +#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_DATA 0x01000000 +#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_INDEX 0x02000000 +#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_SYSTEM 0x03000000 + +typedef struct _LOOKUP_STREAM_FROM_CLUSTER_ENTRY { + ULONG OffsetToNext; + ULONG Flags; + LARGE_INTEGER Reserved; + LARGE_INTEGER Cluster; + WCHAR FileName[1]; +} LOOKUP_STREAM_FROM_CLUSTER_ENTRY, *PLOOKUP_STREAM_FROM_CLUSTER_ENTRY; + +typedef struct _FILE_TYPE_NOTIFICATION_INPUT { + ULONG Flags; + ULONG NumFileTypeIDs; + GUID FileTypeID[1]; +} FILE_TYPE_NOTIFICATION_INPUT, *PFILE_TYPE_NOTIFICATION_INPUT; + +#define FILE_TYPE_NOTIFICATION_FLAG_USAGE_BEGIN 0x00000001 +#define FILE_TYPE_NOTIFICATION_FLAG_USAGE_END 0x00000002 + +DEFINE_GUID( FILE_TYPE_NOTIFICATION_GUID_PAGE_FILE, 0x0d0a64a1, 0x38fc, 0x4db8, 0x9f, 0xe7, 0x3f, 0x43, 0x52, 0xcd, 0x7c, 0x5c ); +DEFINE_GUID( FILE_TYPE_NOTIFICATION_GUID_HIBERNATION_FILE, 0xb7624d64, 0xb9a3, 0x4cf8, 0x80, 0x11, 0x5b, 0x86, 0xc9, 0x40, 0xe7, 0xb7 ); +DEFINE_GUID( FILE_TYPE_NOTIFICATION_GUID_CRASHDUMP_FILE, 0x9d453eb7, 0xd2a6, 0x4dbd, 0xa2, 0xe3, 0xfb, 0xd0, 0xed, 0x91, 0x09, 0xa9 ); + +#ifndef _VIRTUAL_STORAGE_TYPE_DEFINED +#define _VIRTUAL_STORAGE_TYPE_DEFINED +typedef struct _VIRTUAL_STORAGE_TYPE { + ULONG DeviceId; + GUID VendorId; +} VIRTUAL_STORAGE_TYPE, *PVIRTUAL_STORAGE_TYPE; +#endif + +typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST { + ULONG RequestLevel; + ULONG RequestFlags; +} STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST, *PSTORAGE_QUERY_DEPENDENT_VOLUME_REQUEST; + +#define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_HOST_VOLUMES 0x1 +#define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_GUEST_VOLUMES 0x2 + +typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY { + ULONG EntryLength; + ULONG DependencyTypeFlags; + ULONG ProviderSpecificFlags; + VIRTUAL_STORAGE_TYPE VirtualStorageType; +} STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY; + +typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY { + ULONG EntryLength; + ULONG DependencyTypeFlags; + ULONG ProviderSpecificFlags; + VIRTUAL_STORAGE_TYPE VirtualStorageType; + ULONG AncestorLevel; + ULONG HostVolumeNameOffset; + ULONG HostVolumeNameSize; + ULONG DependentVolumeNameOffset; + ULONG DependentVolumeNameSize; + ULONG RelativePathOffset; + ULONG RelativePathSize; + ULONG DependentDeviceNameOffset; + ULONG DependentDeviceNameSize; +} STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY; + +typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE { + ULONG ResponseLevel; + ULONG NumberEntries; + union { + STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY Lev1Depends[]; + STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY Lev2Depends[]; + }; +} STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE, *PSTORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE; + +#endif /* (_WIN32_WINNT >= 0x0601) */ + +typedef struct _FILESYSTEM_STATISTICS { + USHORT FileSystemType; + USHORT Version; + ULONG SizeOfCompleteStructure; + ULONG UserFileReads; + ULONG UserFileReadBytes; + ULONG UserDiskReads; + ULONG UserFileWrites; + ULONG UserFileWriteBytes; + ULONG UserDiskWrites; + ULONG MetaDataReads; + ULONG MetaDataReadBytes; + ULONG MetaDataDiskReads; + ULONG MetaDataWrites; + ULONG MetaDataWriteBytes; + ULONG MetaDataDiskWrites; +} FILESYSTEM_STATISTICS, *PFILESYSTEM_STATISTICS; + +#define FILESYSTEM_STATISTICS_TYPE_NTFS 1 +#define FILESYSTEM_STATISTICS_TYPE_FAT 2 +#define FILESYSTEM_STATISTICS_TYPE_EXFAT 3 + +typedef struct _FAT_STATISTICS { + ULONG CreateHits; + ULONG SuccessfulCreates; + ULONG FailedCreates; + ULONG NonCachedReads; + ULONG NonCachedReadBytes; + ULONG NonCachedWrites; + ULONG NonCachedWriteBytes; + ULONG NonCachedDiskReads; + ULONG NonCachedDiskWrites; +} FAT_STATISTICS, *PFAT_STATISTICS; + +typedef struct _EXFAT_STATISTICS { + ULONG CreateHits; + ULONG SuccessfulCreates; + ULONG FailedCreates; + ULONG NonCachedReads; + ULONG NonCachedReadBytes; + ULONG NonCachedWrites; + ULONG NonCachedWriteBytes; + ULONG NonCachedDiskReads; + ULONG NonCachedDiskWrites; +} EXFAT_STATISTICS, *PEXFAT_STATISTICS; + +typedef struct _NTFS_STATISTICS { + ULONG LogFileFullExceptions; + ULONG OtherExceptions; + ULONG MftReads; + ULONG MftReadBytes; + ULONG MftWrites; + ULONG MftWriteBytes; + struct { + USHORT Write; + USHORT Create; + USHORT SetInfo; + USHORT Flush; + } MftWritesUserLevel; + USHORT MftWritesFlushForLogFileFull; + USHORT MftWritesLazyWriter; + USHORT MftWritesUserRequest; + ULONG Mft2Writes; + ULONG Mft2WriteBytes; + struct { + USHORT Write; + USHORT Create; + USHORT SetInfo; + USHORT Flush; + } Mft2WritesUserLevel; + USHORT Mft2WritesFlushForLogFileFull; + USHORT Mft2WritesLazyWriter; + USHORT Mft2WritesUserRequest; + ULONG RootIndexReads; + ULONG RootIndexReadBytes; + ULONG RootIndexWrites; + ULONG RootIndexWriteBytes; + ULONG BitmapReads; + ULONG BitmapReadBytes; + ULONG BitmapWrites; + ULONG BitmapWriteBytes; + USHORT BitmapWritesFlushForLogFileFull; + USHORT BitmapWritesLazyWriter; + USHORT BitmapWritesUserRequest; + struct { + USHORT Write; + USHORT Create; + USHORT SetInfo; + } BitmapWritesUserLevel; + ULONG MftBitmapReads; + ULONG MftBitmapReadBytes; + ULONG MftBitmapWrites; + ULONG MftBitmapWriteBytes; + USHORT MftBitmapWritesFlushForLogFileFull; + USHORT MftBitmapWritesLazyWriter; + USHORT MftBitmapWritesUserRequest; + struct { + USHORT Write; + USHORT Create; + USHORT SetInfo; + USHORT Flush; + } MftBitmapWritesUserLevel; + ULONG UserIndexReads; + ULONG UserIndexReadBytes; + ULONG UserIndexWrites; + ULONG UserIndexWriteBytes; + ULONG LogFileReads; + ULONG LogFileReadBytes; + ULONG LogFileWrites; + ULONG LogFileWriteBytes; + struct { + ULONG Calls; + ULONG Clusters; + ULONG Hints; + ULONG RunsReturned; + ULONG HintsHonored; + ULONG HintsClusters; + ULONG Cache; + ULONG CacheClusters; + ULONG CacheMiss; + ULONG CacheMissClusters; + } Allocate; +} NTFS_STATISTICS, *PNTFS_STATISTICS; + +#endif // _FILESYSTEMFSCTL_ + +#define SYMLINK_FLAG_RELATIVE 1 + +typedef struct _REPARSE_DATA_BUFFER { + ULONG ReparseTag; + USHORT ReparseDataLength; + USHORT Reserved; + __GNU_EXTENSION union { + struct { + USHORT SubstituteNameOffset; + USHORT SubstituteNameLength; + USHORT PrintNameOffset; + USHORT PrintNameLength; + ULONG Flags; + WCHAR PathBuffer[1]; + } SymbolicLinkReparseBuffer; + struct { + USHORT SubstituteNameOffset; + USHORT SubstituteNameLength; + USHORT PrintNameOffset; + USHORT PrintNameLength; + WCHAR PathBuffer[1]; + } MountPointReparseBuffer; + struct { + UCHAR DataBuffer[1]; + } GenericReparseBuffer; + }; +} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; + +#define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer) + +typedef struct _REPARSE_GUID_DATA_BUFFER { + ULONG ReparseTag; + USHORT ReparseDataLength; + USHORT Reserved; + GUID ReparseGuid; + struct { + UCHAR DataBuffer[1]; + } GenericReparseBuffer; +} REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER; + +#define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer) + +#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE ( 16 * 1024 ) + +/* Reserved reparse tags */ +#define IO_REPARSE_TAG_RESERVED_ZERO (0) +#define IO_REPARSE_TAG_RESERVED_ONE (1) +#define IO_REPARSE_TAG_RESERVED_RANGE IO_REPARSE_TAG_RESERVED_ONE + +#define IsReparseTagMicrosoft(_tag) (((_tag) & 0x80000000)) +#define IsReparseTagNameSurrogate(_tag) (((_tag) & 0x20000000)) + +#define IO_REPARSE_TAG_VALID_VALUES (0xF000FFFF) + +#define IsReparseTagValid(tag) ( \ + !((tag) & ~IO_REPARSE_TAG_VALID_VALUES) && \ + ((tag) > IO_REPARSE_TAG_RESERVED_RANGE) \ + ) + +/* MicroSoft reparse point tags */ +#define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L) +#define IO_REPARSE_TAG_HSM (0xC0000004L) +#define IO_REPARSE_TAG_DRIVE_EXTENDER (0x80000005L) +#define IO_REPARSE_TAG_HSM2 (0x80000006L) +#define IO_REPARSE_TAG_SIS (0x80000007L) +#define IO_REPARSE_TAG_WIM (0x80000008L) +#define IO_REPARSE_TAG_CSV (0x80000009L) +#define IO_REPARSE_TAG_DFS (0x8000000AL) +#define IO_REPARSE_TAG_FILTER_MANAGER (0x8000000BL) +#define IO_REPARSE_TAG_SYMLINK (0xA000000CL) +#define IO_REPARSE_TAG_IIS_CACHE (0xA0000010L) +#define IO_REPARSE_TAG_DFSR (0x80000012L) + +#pragma pack(4) +typedef struct _REPARSE_INDEX_KEY { + ULONG FileReparseTag; + LARGE_INTEGER FileId; +} REPARSE_INDEX_KEY, *PREPARSE_INDEX_KEY; +#pragma pack() + +#define FSCTL_LMR_GET_LINK_TRACKING_INFORMATION CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,58,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define FSCTL_LMR_SET_LINK_TRACKING_INFORMATION CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,59,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_LMR_ARE_FILE_OBJECTS_ON_SAME_SERVER CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,60,METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define FSCTL_PIPE_ASSIGN_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_DISCONNECT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_LISTEN CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_PEEK CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA) +#define FSCTL_PIPE_QUERY_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA) +#define FSCTL_PIPE_WAIT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_IMPERSONATE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_SET_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_QUERY_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_GET_PIPE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_SET_PIPE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_GET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_SET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_GET_HANDLE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_SET_HANDLE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_FLUSH CTL_CODE(FILE_DEVICE_NAMED_PIPE, 16, METHOD_BUFFERED, FILE_WRITE_DATA) + +#define FSCTL_PIPE_INTERNAL_READ CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA) +#define FSCTL_PIPE_INTERNAL_WRITE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_PIPE_INTERNAL_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA) +#define FSCTL_PIPE_INTERNAL_READ_OVFLOW CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA) + +#define FILE_PIPE_READ_DATA 0x00000000 +#define FILE_PIPE_WRITE_SPACE 0x00000001 + +typedef struct _FILE_PIPE_ASSIGN_EVENT_BUFFER { + HANDLE EventHandle; + ULONG KeyValue; +} FILE_PIPE_ASSIGN_EVENT_BUFFER, *PFILE_PIPE_ASSIGN_EVENT_BUFFER; + +typedef struct _FILE_PIPE_EVENT_BUFFER { + ULONG NamedPipeState; + ULONG EntryType; + ULONG ByteCount; + ULONG KeyValue; + ULONG NumberRequests; +} FILE_PIPE_EVENT_BUFFER, *PFILE_PIPE_EVENT_BUFFER; + +typedef struct _FILE_PIPE_PEEK_BUFFER { + ULONG NamedPipeState; + ULONG ReadDataAvailable; + ULONG NumberOfMessages; + ULONG MessageLength; + CHAR Data[1]; +} FILE_PIPE_PEEK_BUFFER, *PFILE_PIPE_PEEK_BUFFER; + +typedef struct _FILE_PIPE_WAIT_FOR_BUFFER { + LARGE_INTEGER Timeout; + ULONG NameLength; + BOOLEAN TimeoutSpecified; + WCHAR Name[1]; +} FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER; + +typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER { +#if !defined(BUILD_WOW6432) + PVOID ClientSession; + PVOID ClientProcess; +#else + ULONGLONG ClientSession; + ULONGLONG ClientProcess; +#endif +} FILE_PIPE_CLIENT_PROCESS_BUFFER, *PFILE_PIPE_CLIENT_PROCESS_BUFFER; + +#define FILE_PIPE_COMPUTER_NAME_LENGTH 15 + +typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER_EX { +#if !defined(BUILD_WOW6432) + PVOID ClientSession; + PVOID ClientProcess; +#else + ULONGLONG ClientSession; + ULONGLONG ClientProcess; +#endif + USHORT ClientComputerNameLength; + WCHAR ClientComputerBuffer[FILE_PIPE_COMPUTER_NAME_LENGTH+1]; +} FILE_PIPE_CLIENT_PROCESS_BUFFER_EX, *PFILE_PIPE_CLIENT_PROCESS_BUFFER_EX; + +#define FSCTL_MAILSLOT_PEEK CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA) + +typedef enum _LINK_TRACKING_INFORMATION_TYPE { + NtfsLinkTrackingInformation, + DfsLinkTrackingInformation +} LINK_TRACKING_INFORMATION_TYPE, *PLINK_TRACKING_INFORMATION_TYPE; + +typedef struct _LINK_TRACKING_INFORMATION { + LINK_TRACKING_INFORMATION_TYPE Type; + UCHAR VolumeId[16]; +} LINK_TRACKING_INFORMATION, *PLINK_TRACKING_INFORMATION; + +typedef struct _REMOTE_LINK_TRACKING_INFORMATION { + PVOID TargetFileObject; + ULONG TargetLinkTrackingInformationLength; + UCHAR TargetLinkTrackingInformationBuffer[1]; +} REMOTE_LINK_TRACKING_INFORMATION, *PREMOTE_LINK_TRACKING_INFORMATION; + +typedef struct _PUBLIC_OBJECT_BASIC_INFORMATION { + ULONG Attributes; + ACCESS_MASK GrantedAccess; + ULONG HandleCount; + ULONG PointerCount; + ULONG Reserved[10]; +} PUBLIC_OBJECT_BASIC_INFORMATION, *PPUBLIC_OBJECT_BASIC_INFORMATION; + +typedef struct _PUBLIC_OBJECT_TYPE_INFORMATION { + UNICODE_STRING TypeName; + ULONG Reserved [22]; +} PUBLIC_OBJECT_TYPE_INFORMATION, *PPUBLIC_OBJECT_TYPE_INFORMATION; + +typedef struct _SECURITY_CLIENT_CONTEXT { + SECURITY_QUALITY_OF_SERVICE SecurityQos; + PACCESS_TOKEN ClientToken; + BOOLEAN DirectlyAccessClientToken; + BOOLEAN DirectAccessEffectiveOnly; + BOOLEAN ServerIsRemote; + TOKEN_CONTROL ClientTokenControl; +} SECURITY_CLIENT_CONTEXT, *PSECURITY_CLIENT_CONTEXT; + +#define SYSTEM_PAGE_PRIORITY_BITS 3 +#define SYSTEM_PAGE_PRIORITY_LEVELS (1 << SYSTEM_PAGE_PRIORITY_BITS) + +typedef struct _KAPC_STATE { + LIST_ENTRY ApcListHead[MaximumMode]; + PKPROCESS Process; + BOOLEAN KernelApcInProgress; + BOOLEAN KernelApcPending; + BOOLEAN UserApcPending; +} KAPC_STATE, *PKAPC_STATE, *RESTRICTED_POINTER PRKAPC_STATE; + +#define KAPC_STATE_ACTUAL_LENGTH (FIELD_OFFSET(KAPC_STATE, UserApcPending) + sizeof(BOOLEAN)) + +typedef struct _KQUEUE { + DISPATCHER_HEADER Header; + LIST_ENTRY EntryListHead; + volatile ULONG CurrentCount; + ULONG MaximumCount; + LIST_ENTRY ThreadListHead; +} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE; + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +VOID +NTAPI +KeInitializeMutant( + OUT PRKMUTANT Mutant, + IN BOOLEAN InitialOwner); + +NTKERNELAPI +LONG +NTAPI +KeReadStateMutant( + IN PRKMUTANT Mutant); + +NTKERNELAPI +LONG +NTAPI +KeReleaseMutant( + IN OUT PRKMUTANT Mutant, + IN KPRIORITY Increment, + IN BOOLEAN Abandoned, + IN BOOLEAN Wait); + +NTKERNELAPI +VOID +NTAPI +KeInitializeQueue( + OUT PRKQUEUE Queue, + IN ULONG Count); + +NTKERNELAPI +LONG +NTAPI +KeReadStateQueue( + IN PRKQUEUE Queue); + +NTKERNELAPI +LONG +NTAPI +KeInsertQueue( + IN OUT PRKQUEUE Queue, + IN OUT PLIST_ENTRY Entry); + +NTKERNELAPI +LONG +NTAPI +KeInsertHeadQueue( + IN OUT PRKQUEUE Queue, + IN OUT PLIST_ENTRY Entry); + +NTKERNELAPI +PLIST_ENTRY +NTAPI +KeRemoveQueue( + IN OUT PRKQUEUE Queue, + IN KPROCESSOR_MODE WaitMode, + IN PLARGE_INTEGER Timeout OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +KeAttachProcess( + IN OUT PKPROCESS Process); + +NTKERNELAPI +VOID +NTAPI +KeDetachProcess( + VOID); + +NTKERNELAPI +PLIST_ENTRY +NTAPI +KeRundownQueue( + IN OUT PRKQUEUE Queue); + +NTKERNELAPI +VOID +NTAPI +KeStackAttachProcess( + IN OUT PKPROCESS Process, + OUT PKAPC_STATE ApcState); + +NTKERNELAPI +VOID +NTAPI +KeUnstackDetachProcess( + IN PKAPC_STATE ApcState); + +NTKERNELAPI +UCHAR +NTAPI +KeSetIdealProcessorThread( + IN OUT PKTHREAD Thread, + IN UCHAR Processor); + +NTKERNELAPI +BOOLEAN +NTAPI +KeSetKernelStackSwapEnable( + IN BOOLEAN Enable); + +#if defined(_X86_) +NTHALAPI +KIRQL +FASTCALL +KeAcquireSpinLockRaiseToSynch( + IN OUT PKSPIN_LOCK SpinLock); +#else +NTKERNELAPI +KIRQL +KeAcquireSpinLockRaiseToSynch( + IN OUT PKSPIN_LOCK SpinLock); +#endif + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +_DECL_HAL_KE_IMPORT +KIRQL +FASTCALL +KeAcquireQueuedSpinLock( + IN OUT KSPIN_LOCK_QUEUE_NUMBER Number); + +NTHALAPI +VOID +FASTCALL +KeReleaseQueuedSpinLock( + IN OUT KSPIN_LOCK_QUEUE_NUMBER Number, + IN KIRQL OldIrql); + +_DECL_HAL_KE_IMPORT +LOGICAL +FASTCALL +KeTryToAcquireQueuedSpinLock( + IN KSPIN_LOCK_QUEUE_NUMBER Number, + OUT PKIRQL OldIrql); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTKERNELAPI +VOID +KeQueryOwnerMutant( + IN PKMUTANT Mutant, + OUT PCLIENT_ID ClientId); + +NTKERNELAPI +ULONG +KeRemoveQueueEx ( + IN OUT PKQUEUE Queue, + IN KPROCESSOR_MODE WaitMode, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL, + OUT PLIST_ENTRY *EntryArray, + IN ULONG Count); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#define INVALID_PROCESSOR_INDEX 0xffffffff + +NTSTATUS +NTAPI +KeGetProcessorNumberFromIndex( + IN ULONG ProcIndex, + OUT PPROCESSOR_NUMBER ProcNumber); + +ULONG +NTAPI +KeGetProcessorIndexFromNumber( + IN PPROCESSOR_NUMBER ProcNumber); + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +SIZE_T +NTAPI +ExQueryPoolBlockSize( + IN PVOID PoolBlock, + OUT PBOOLEAN QuotaCharged); + +VOID +ExAdjustLookasideDepth( + VOID); + +NTKERNELAPI +VOID +NTAPI +ExDisableResourceBoostLite( + IN PERESOURCE Resource); + +#endif + +#define ExDisableResourceBoost ExDisableResourceBoostLite + +#define EX_PUSH_LOCK ULONG_PTR +#define PEX_PUSH_LOCK PULONG_PTR + +VOID +ExInitializePushLock ( + OUT PEX_PUSH_LOCK PushLock); + +#if (NTDDI_VERSION >= NTDDI_WINXP) +PSLIST_ENTRY +FASTCALL +InterlockedPushListSList( + IN OUT PSLIST_HEADER ListHead, + IN OUT PSLIST_ENTRY List, + IN OUT PSLIST_ENTRY ListEnd, + IN ULONG Count); + +#endif + +/* #if !defined(_X86AMD64_) FIXME : WHAT ?! */ +#if defined(_WIN64) + +C_ASSERT(sizeof(ERESOURCE) == 0x68); +C_ASSERT(FIELD_OFFSET(ERESOURCE,ActiveCount) == 0x18); +C_ASSERT(FIELD_OFFSET(ERESOURCE,Flag) == 0x1a); + +#else + +C_ASSERT(sizeof(ERESOURCE) == 0x38); +C_ASSERT(FIELD_OFFSET(ERESOURCE,ActiveCount) == 0x0c); +C_ASSERT(FIELD_OFFSET(ERESOURCE,Flag) == 0x0e); + +#endif +/* #endif */ + +#define TOKEN_HAS_TRAVERSE_PRIVILEGE 0x0001 +#define TOKEN_HAS_BACKUP_PRIVILEGE 0x0002 +#define TOKEN_HAS_RESTORE_PRIVILEGE 0x0004 +#define TOKEN_WRITE_RESTRICTED 0x0008 +#define TOKEN_IS_RESTRICTED 0x0010 +#define TOKEN_SESSION_NOT_REFERENCED 0x0020 +#define TOKEN_SANDBOX_INERT 0x0040 +#define TOKEN_HAS_IMPERSONATE_PRIVILEGE 0x0080 +#define SE_BACKUP_PRIVILEGES_CHECKED 0x0100 +#define TOKEN_VIRTUALIZE_ALLOWED 0x0200 +#define TOKEN_VIRTUALIZE_ENABLED 0x0400 +#define TOKEN_IS_FILTERED 0x0800 +#define TOKEN_UIACCESS 0x1000 +#define TOKEN_NOT_LOW 0x2000 + +typedef struct _SE_EXPORTS { + LUID SeCreateTokenPrivilege; + LUID SeAssignPrimaryTokenPrivilege; + LUID SeLockMemoryPrivilege; + LUID SeIncreaseQuotaPrivilege; + LUID SeUnsolicitedInputPrivilege; + LUID SeTcbPrivilege; + LUID SeSecurityPrivilege; + LUID SeTakeOwnershipPrivilege; + LUID SeLoadDriverPrivilege; + LUID SeCreatePagefilePrivilege; + LUID SeIncreaseBasePriorityPrivilege; + LUID SeSystemProfilePrivilege; + LUID SeSystemtimePrivilege; + LUID SeProfileSingleProcessPrivilege; + LUID SeCreatePermanentPrivilege; + LUID SeBackupPrivilege; + LUID SeRestorePrivilege; + LUID SeShutdownPrivilege; + LUID SeDebugPrivilege; + LUID SeAuditPrivilege; + LUID SeSystemEnvironmentPrivilege; + LUID SeChangeNotifyPrivilege; + LUID SeRemoteShutdownPrivilege; + PSID SeNullSid; + PSID SeWorldSid; + PSID SeLocalSid; + PSID SeCreatorOwnerSid; + PSID SeCreatorGroupSid; + PSID SeNtAuthoritySid; + PSID SeDialupSid; + PSID SeNetworkSid; + PSID SeBatchSid; + PSID SeInteractiveSid; + PSID SeLocalSystemSid; + PSID SeAliasAdminsSid; + PSID SeAliasUsersSid; + PSID SeAliasGuestsSid; + PSID SeAliasPowerUsersSid; + PSID SeAliasAccountOpsSid; + PSID SeAliasSystemOpsSid; + PSID SeAliasPrintOpsSid; + PSID SeAliasBackupOpsSid; + PSID SeAuthenticatedUsersSid; + PSID SeRestrictedSid; + PSID SeAnonymousLogonSid; + LUID SeUndockPrivilege; + LUID SeSyncAgentPrivilege; + LUID SeEnableDelegationPrivilege; + PSID SeLocalServiceSid; + PSID SeNetworkServiceSid; + LUID SeManageVolumePrivilege; + LUID SeImpersonatePrivilege; + LUID SeCreateGlobalPrivilege; + LUID SeTrustedCredManAccessPrivilege; + LUID SeRelabelPrivilege; + LUID SeIncreaseWorkingSetPrivilege; + LUID SeTimeZonePrivilege; + LUID SeCreateSymbolicLinkPrivilege; + PSID SeIUserSid; + PSID SeUntrustedMandatorySid; + PSID SeLowMandatorySid; + PSID SeMediumMandatorySid; + PSID SeHighMandatorySid; + PSID SeSystemMandatorySid; + PSID SeOwnerRightsSid; +} SE_EXPORTS, *PSE_EXPORTS; + +typedef NTSTATUS +(NTAPI *PSE_LOGON_SESSION_TERMINATED_ROUTINE)( + IN PLUID LogonId); + +#define SeLengthSid( Sid ) \ + (8 + (4 * ((SID *)Sid)->SubAuthorityCount)) + +#define SeDeleteClientSecurity(C) { \ + if (SeTokenType((C)->ClientToken) == TokenPrimary) { \ + PsDereferencePrimaryToken( (C)->ClientToken ); \ + } else { \ + PsDereferenceImpersonationToken( (C)->ClientToken ); \ + } \ +} + +#define SeStopImpersonatingClient() PsRevertToSelf() + +#define SeQuerySubjectContextToken( SubjectContext ) \ + ( ARGUMENT_PRESENT( \ + ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken \ + ) ? \ + ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken : \ + ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->PrimaryToken ) + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +VOID +NTAPI +SeCaptureSubjectContext( + OUT PSECURITY_SUBJECT_CONTEXT SubjectContext); + +NTKERNELAPI +VOID +NTAPI +SeLockSubjectContext( + IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + +NTKERNELAPI +VOID +NTAPI +SeUnlockSubjectContext( + IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + +NTKERNELAPI +VOID +NTAPI +SeReleaseSubjectContext( + IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + +NTKERNELAPI +BOOLEAN +NTAPI +SePrivilegeCheck( + IN OUT PPRIVILEGE_SET RequiredPrivileges, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext, + IN KPROCESSOR_MODE AccessMode); + +NTKERNELAPI +VOID +NTAPI +SeOpenObjectAuditAlarm( + IN PUNICODE_STRING ObjectTypeName, + IN PVOID Object OPTIONAL, + IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PACCESS_STATE AccessState, + IN BOOLEAN ObjectCreated, + IN BOOLEAN AccessGranted, + IN KPROCESSOR_MODE AccessMode, + OUT PBOOLEAN GenerateOnClose); + +NTKERNELAPI +VOID +NTAPI +SeOpenObjectForDeleteAuditAlarm( + IN PUNICODE_STRING ObjectTypeName, + IN PVOID Object OPTIONAL, + IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PACCESS_STATE AccessState, + IN BOOLEAN ObjectCreated, + IN BOOLEAN AccessGranted, + IN KPROCESSOR_MODE AccessMode, + OUT PBOOLEAN GenerateOnClose); + +NTKERNELAPI +VOID +NTAPI +SeDeleteObjectAuditAlarm( + IN PVOID Object, + IN HANDLE Handle); + +NTKERNELAPI +TOKEN_TYPE +NTAPI +SeTokenType( + IN PACCESS_TOKEN Token); + +NTKERNELAPI +BOOLEAN +NTAPI +SeTokenIsAdmin( + IN PACCESS_TOKEN Token); + +NTKERNELAPI +BOOLEAN +NTAPI +SeTokenIsRestricted( + IN PACCESS_TOKEN Token); + +NTKERNELAPI +NTSTATUS +NTAPI +SeQueryAuthenticationIdToken( + IN PACCESS_TOKEN Token, + OUT PLUID AuthenticationId); + +NTKERNELAPI +NTSTATUS +NTAPI +SeQuerySessionIdToken( + IN PACCESS_TOKEN Token, + OUT PULONG SessionId); + +NTKERNELAPI +NTSTATUS +NTAPI +SeCreateClientSecurity( + IN PETHREAD ClientThread, + IN PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos, + IN BOOLEAN RemoteSession, + OUT PSECURITY_CLIENT_CONTEXT ClientContext); + +NTKERNELAPI +VOID +NTAPI +SeImpersonateClient( + IN PSECURITY_CLIENT_CONTEXT ClientContext, + IN PETHREAD ServerThread OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +SeImpersonateClientEx( + IN PSECURITY_CLIENT_CONTEXT ClientContext, + IN PETHREAD ServerThread OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +SeCreateClientSecurityFromSubjectContext( + IN PSECURITY_SUBJECT_CONTEXT SubjectContext, + IN PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos, + IN BOOLEAN ServerIsRemote, + OUT PSECURITY_CLIENT_CONTEXT ClientContext); + +NTKERNELAPI +NTSTATUS +NTAPI +SeQuerySecurityDescriptorInfo( + IN PSECURITY_INFORMATION SecurityInformation, + OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN OUT PULONG Length, + IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor); + +NTKERNELAPI +NTSTATUS +NTAPI +SeSetSecurityDescriptorInfo( + IN PVOID Object OPTIONAL, + IN PSECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, + IN POOL_TYPE PoolType, + IN PGENERIC_MAPPING GenericMapping); + +NTKERNELAPI +NTSTATUS +NTAPI +SeSetSecurityDescriptorInfoEx( + IN PVOID Object OPTIONAL, + IN PSECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR ModificationDescriptor, + IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, + IN ULONG AutoInheritFlags, + IN POOL_TYPE PoolType, + IN PGENERIC_MAPPING GenericMapping); + +NTKERNELAPI +NTSTATUS +NTAPI +SeAppendPrivileges( + IN OUT PACCESS_STATE AccessState, + IN PPRIVILEGE_SET Privileges); + +NTKERNELAPI +BOOLEAN +NTAPI +SeAuditingFileEvents( + IN BOOLEAN AccessGranted, + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + +NTKERNELAPI +BOOLEAN +NTAPI +SeAuditingFileOrGlobalEvents( + IN BOOLEAN AccessGranted, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext); + +VOID +NTAPI +SeSetAccessStateGenericMapping( + IN OUT PACCESS_STATE AccessState, + IN PGENERIC_MAPPING GenericMapping); + +NTKERNELAPI +NTSTATUS +NTAPI +SeRegisterLogonSessionTerminatedRoutine( + IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine); + +NTKERNELAPI +NTSTATUS +NTAPI +SeUnregisterLogonSessionTerminatedRoutine( + IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine); + +NTKERNELAPI +NTSTATUS +NTAPI +SeMarkLogonSessionForTerminationNotification( + IN PLUID LogonId); + +NTKERNELAPI +NTSTATUS +NTAPI +SeQueryInformationToken( + IN PACCESS_TOKEN Token, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + OUT PVOID *TokenInformation); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WIN2KSP3) +NTKERNELAPI +BOOLEAN +NTAPI +SeAuditingHardLinkEvents( + IN BOOLEAN AccessGranted, + IN PSECURITY_DESCRIPTOR SecurityDescriptor); +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTKERNELAPI +NTSTATUS +NTAPI +SeFilterToken( + IN PACCESS_TOKEN ExistingToken, + IN ULONG Flags, + IN PTOKEN_GROUPS SidsToDisable OPTIONAL, + IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL, + IN PTOKEN_GROUPS RestrictedSids OPTIONAL, + OUT PACCESS_TOKEN *FilteredToken); + +NTKERNELAPI +VOID +NTAPI +SeAuditHardLinkCreation( + IN PUNICODE_STRING FileName, + IN PUNICODE_STRING LinkName, + IN BOOLEAN bSuccess); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#if (NTDDI_VERSION >= NTDDI_WINXPSP2) + +NTKERNELAPI +BOOLEAN +NTAPI +SeAuditingFileEventsWithContext( + IN BOOLEAN AccessGranted, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +SeAuditingHardLinkEventsWithContext( + IN BOOLEAN AccessGranted, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL); + +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTKERNELAPI +VOID +NTAPI +SeOpenObjectAuditAlarmWithTransaction( + IN PUNICODE_STRING ObjectTypeName, + IN PVOID Object OPTIONAL, + IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PACCESS_STATE AccessState, + IN BOOLEAN ObjectCreated, + IN BOOLEAN AccessGranted, + IN KPROCESSOR_MODE AccessMode, + IN GUID *TransactionId OPTIONAL, + OUT PBOOLEAN GenerateOnClose); + +NTKERNELAPI +VOID +NTAPI +SeOpenObjectForDeleteAuditAlarmWithTransaction( + IN PUNICODE_STRING ObjectTypeName, + IN PVOID Object OPTIONAL, + IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PACCESS_STATE AccessState, + IN BOOLEAN ObjectCreated, + IN BOOLEAN AccessGranted, + IN KPROCESSOR_MODE AccessMode, + IN GUID *TransactionId OPTIONAL, + OUT PBOOLEAN GenerateOnClose); + +NTKERNELAPI +VOID +NTAPI +SeExamineSacl( + IN PACL Sacl, + IN PACCESS_TOKEN Token, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN AccessGranted, + OUT PBOOLEAN GenerateAudit, + OUT PBOOLEAN GenerateAlarm); + +NTKERNELAPI +VOID +NTAPI +SeDeleteObjectAuditAlarmWithTransaction( + IN PVOID Object, + IN HANDLE Handle, + IN GUID *TransactionId OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +SeQueryTokenIntegrity( + IN PACCESS_TOKEN Token, + IN OUT PSID_AND_ATTRIBUTES IntegritySA); + +NTKERNELAPI +NTSTATUS +NTAPI +SeSetSessionIdToken( + IN PACCESS_TOKEN Token, + IN ULONG SessionId); + +NTKERNELAPI +VOID +NTAPI +SeAuditHardLinkCreationWithTransaction( + IN PUNICODE_STRING FileName, + IN PUNICODE_STRING LinkName, + IN BOOLEAN bSuccess, + IN GUID *TransactionId OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +SeAuditTransactionStateChange( + IN GUID *TransactionId, + IN GUID *ResourceManagerId, + IN ULONG NewTransactionState); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_VISTA || (NTDDI_VERSION >= NTDDI_WINXPSP2 && NTDDI_VERSION < NTDDI_WS03)) +NTKERNELAPI +BOOLEAN +NTAPI +SeTokenIsWriteRestricted( + IN PACCESS_TOKEN Token); +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +NTKERNELAPI +BOOLEAN +NTAPI +SeAuditingAnyFileEventsWithContext( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +SeExamineGlobalSacl( + IN PUNICODE_STRING ObjectType, + IN PACCESS_TOKEN Token, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN AccessGranted, + IN OUT PBOOLEAN GenerateAudit, + IN OUT PBOOLEAN GenerateAlarm OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +SeMaximumAuditMaskFromGlobalSacl( + IN PUNICODE_STRING ObjectTypeName OPTIONAL, + IN ACCESS_MASK GrantedAccess, + IN PACCESS_TOKEN Token, + IN OUT PACCESS_MASK AuditMask); + +#endif + +NTSTATUS +NTAPI +SeReportSecurityEventWithSubCategory( + IN ULONG Flags, + IN PUNICODE_STRING SourceName, + IN PSID UserSid OPTIONAL, + IN PSE_ADT_PARAMETER_ARRAY AuditParameters, + IN ULONG AuditSubcategoryId); + +BOOLEAN +NTAPI +SeAccessCheckFromState( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PTOKEN_ACCESS_INFORMATION PrimaryTokenInformation, + IN PTOKEN_ACCESS_INFORMATION ClientTokenInformation OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN ACCESS_MASK PreviouslyGrantedAccess, + OUT PPRIVILEGE_SET *Privileges OPTIONAL, + IN PGENERIC_MAPPING GenericMapping, + IN KPROCESSOR_MODE AccessMode, + OUT PACCESS_MASK GrantedAccess, + OUT PNTSTATUS AccessStatus); + +NTKERNELAPI +VOID +NTAPI +SeFreePrivileges( + IN PPRIVILEGE_SET Privileges); + +NTSTATUS +NTAPI +SeLocateProcessImageName( + IN OUT PEPROCESS Process, + OUT PUNICODE_STRING *pImageFileName); + +extern NTKERNELAPI PSE_EXPORTS SeExports; + +#if !defined(_PSGETCURRENTTHREAD_) +#define _PSGETCURRENTTHREAD_ + +FORCEINLINE +PETHREAD +PsGetCurrentThread( + VOID) +{ + return (PETHREAD)KeGetCurrentThread(); +} +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +PACCESS_TOKEN +NTAPI +PsReferenceImpersonationToken( + IN OUT PETHREAD Thread, + OUT PBOOLEAN CopyOnOpen, + OUT PBOOLEAN EffectiveOnly, + OUT PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel); + +NTKERNELAPI +LARGE_INTEGER +NTAPI +PsGetProcessExitTime( + VOID); + +NTKERNELAPI +BOOLEAN +NTAPI +PsIsThreadTerminating( + IN PETHREAD Thread); + +NTKERNELAPI +NTSTATUS +NTAPI +PsImpersonateClient( + IN OUT PETHREAD Thread, + IN PACCESS_TOKEN Token, + IN BOOLEAN CopyOnOpen, + IN BOOLEAN EffectiveOnly, + IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel); + +NTKERNELAPI +BOOLEAN +NTAPI +PsDisableImpersonation( + IN OUT PETHREAD Thread, + IN OUT PSE_IMPERSONATION_STATE ImpersonationState); + +NTKERNELAPI +VOID +NTAPI +PsRestoreImpersonation( + IN PETHREAD Thread, + IN PSE_IMPERSONATION_STATE ImpersonationState); + +NTKERNELAPI +VOID +NTAPI +PsRevertToSelf( + VOID); + +NTKERNELAPI +VOID +NTAPI +PsChargePoolQuota( + IN PEPROCESS Process, + IN POOL_TYPE PoolType, + IN ULONG_PTR Amount); + +NTKERNELAPI +VOID +NTAPI +PsReturnPoolQuota( + IN PEPROCESS Process, + IN POOL_TYPE PoolType, + IN ULONG_PTR Amount); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTKERNELAPI +VOID +NTAPI +PsDereferencePrimaryToken( + IN PACCESS_TOKEN PrimaryToken); + +NTKERNELAPI +VOID +NTAPI +PsDereferenceImpersonationToken( + IN PACCESS_TOKEN ImpersonationToken); + +NTKERNELAPI +NTSTATUS +NTAPI +PsChargeProcessPoolQuota( + IN PEPROCESS Process, + IN POOL_TYPE PoolType, + IN ULONG_PTR Amount); + +NTKERNELAPI +BOOLEAN +NTAPI +PsIsSystemThread( + IN PETHREAD Thread); + +#endif + +NTKERNELAPI +NTSTATUS +NTAPI +PsLookupProcessByProcessId( + IN HANDLE ProcessId, + OUT PEPROCESS *Process); + +NTKERNELAPI +NTSTATUS +NTAPI +PsLookupThreadByThreadId( + IN HANDLE UniqueThreadId, + OUT PETHREAD *Thread); + +#define IO_OPEN_PAGING_FILE 0x0002 +#define IO_OPEN_TARGET_DIRECTORY 0x0004 +#define IO_STOP_ON_SYMLINK 0x0008 +#define IO_MM_PAGING_FILE 0x0010 + +typedef VOID +(NTAPI *PDRIVER_FS_NOTIFICATION) ( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN FsActive); + +typedef enum _FS_FILTER_SECTION_SYNC_TYPE { + SyncTypeOther = 0, + SyncTypeCreateSection +} FS_FILTER_SECTION_SYNC_TYPE, *PFS_FILTER_SECTION_SYNC_TYPE; + +typedef enum _FS_FILTER_STREAM_FO_NOTIFICATION_TYPE { + NotifyTypeCreate = 0, + NotifyTypeRetired +} FS_FILTER_STREAM_FO_NOTIFICATION_TYPE, *PFS_FILTER_STREAM_FO_NOTIFICATION_TYPE; + +typedef union _FS_FILTER_PARAMETERS { + struct { + PLARGE_INTEGER EndingOffset; + PERESOURCE *ResourceToRelease; + } AcquireForModifiedPageWriter; + struct { + PERESOURCE ResourceToRelease; + } ReleaseForModifiedPageWriter; + struct { + FS_FILTER_SECTION_SYNC_TYPE SyncType; + ULONG PageProtection; + } AcquireForSectionSynchronization; + struct { + FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType; + BOOLEAN POINTER_ALIGNMENT SafeToRecurse; + } NotifyStreamFileObject; + struct { + PVOID Argument1; + PVOID Argument2; + PVOID Argument3; + PVOID Argument4; + PVOID Argument5; + } Others; +} FS_FILTER_PARAMETERS, *PFS_FILTER_PARAMETERS; + +#define FS_FILTER_ACQUIRE_FOR_SECTION_SYNCHRONIZATION (UCHAR)-1 +#define FS_FILTER_RELEASE_FOR_SECTION_SYNCHRONIZATION (UCHAR)-2 +#define FS_FILTER_ACQUIRE_FOR_MOD_WRITE (UCHAR)-3 +#define FS_FILTER_RELEASE_FOR_MOD_WRITE (UCHAR)-4 +#define FS_FILTER_ACQUIRE_FOR_CC_FLUSH (UCHAR)-5 +#define FS_FILTER_RELEASE_FOR_CC_FLUSH (UCHAR)-6 + +typedef struct _FS_FILTER_CALLBACK_DATA { + ULONG SizeOfFsFilterCallbackData; + UCHAR Operation; + UCHAR Reserved; + struct _DEVICE_OBJECT *DeviceObject; + struct _FILE_OBJECT *FileObject; + FS_FILTER_PARAMETERS Parameters; +} FS_FILTER_CALLBACK_DATA, *PFS_FILTER_CALLBACK_DATA; + +typedef NTSTATUS +(NTAPI *PFS_FILTER_CALLBACK) ( + IN PFS_FILTER_CALLBACK_DATA Data, + OUT PVOID *CompletionContext); + +typedef VOID +(NTAPI *PFS_FILTER_COMPLETION_CALLBACK) ( + IN PFS_FILTER_CALLBACK_DATA Data, + IN NTSTATUS OperationStatus, + IN PVOID CompletionContext); + +typedef struct _FS_FILTER_CALLBACKS { + ULONG SizeOfFsFilterCallbacks; + ULONG Reserved; + PFS_FILTER_CALLBACK PreAcquireForSectionSynchronization; + PFS_FILTER_COMPLETION_CALLBACK PostAcquireForSectionSynchronization; + PFS_FILTER_CALLBACK PreReleaseForSectionSynchronization; + PFS_FILTER_COMPLETION_CALLBACK PostReleaseForSectionSynchronization; + PFS_FILTER_CALLBACK PreAcquireForCcFlush; + PFS_FILTER_COMPLETION_CALLBACK PostAcquireForCcFlush; + PFS_FILTER_CALLBACK PreReleaseForCcFlush; + PFS_FILTER_COMPLETION_CALLBACK PostReleaseForCcFlush; + PFS_FILTER_CALLBACK PreAcquireForModifiedPageWriter; + PFS_FILTER_COMPLETION_CALLBACK PostAcquireForModifiedPageWriter; + PFS_FILTER_CALLBACK PreReleaseForModifiedPageWriter; + PFS_FILTER_COMPLETION_CALLBACK PostReleaseForModifiedPageWriter; +} FS_FILTER_CALLBACKS, *PFS_FILTER_CALLBACKS; + +#if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlRegisterFileSystemFilterCallbacks( + IN struct _DRIVER_OBJECT *FilterDriverObject, + IN PFS_FILTER_CALLBACKS Callbacks); +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#if (NTDDI_VERSION >= NTDDI_VISTA) +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNotifyStreamFileObject( + IN struct _FILE_OBJECT * StreamFileObject, + IN struct _DEVICE_OBJECT *DeviceObjectHint OPTIONAL, + IN FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType, + IN BOOLEAN SafeToRecurse); +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#define DO_VERIFY_VOLUME 0x00000002 +#define DO_BUFFERED_IO 0x00000004 +#define DO_EXCLUSIVE 0x00000008 +#define DO_DIRECT_IO 0x00000010 +#define DO_MAP_IO_BUFFER 0x00000020 +#define DO_DEVICE_HAS_NAME 0x00000040 +#define DO_DEVICE_INITIALIZING 0x00000080 +#define DO_SYSTEM_BOOT_PARTITION 0x00000100 +#define DO_LONG_TERM_REQUESTS 0x00000200 +#define DO_NEVER_LAST_DEVICE 0x00000400 +#define DO_SHUTDOWN_REGISTERED 0x00000800 +#define DO_BUS_ENUMERATED_DEVICE 0x00001000 +#define DO_POWER_PAGABLE 0x00002000 +#define DO_POWER_INRUSH 0x00004000 +#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000 +#define DO_SUPPORTS_TRANSACTIONS 0x00040000 +#define DO_FORCE_NEITHER_IO 0x00080000 +#define DO_VOLUME_DEVICE_OBJECT 0x00100000 +#define DO_SYSTEM_SYSTEM_PARTITION 0x00200000 +#define DO_SYSTEM_CRITICAL_PARTITION 0x00400000 +#define DO_DISALLOW_EXECUTE 0x00800000 + +extern KSPIN_LOCK IoStatisticsLock; +extern ULONG IoReadOperationCount; +extern ULONG IoWriteOperationCount; +extern ULONG IoOtherOperationCount; +extern LARGE_INTEGER IoReadTransferCount; +extern LARGE_INTEGER IoWriteTransferCount; +extern LARGE_INTEGER IoOtherTransferCount; + +#define IO_FILE_OBJECT_NON_PAGED_POOL_CHARGE 64 +#define IO_FILE_OBJECT_PAGED_POOL_CHARGE 1024 + +#if (NTDDI_VERSION == NTDDI_WIN2K) +NTKERNELAPI +NTSTATUS +NTAPI +IoRegisterFsRegistrationChangeEx( + IN PDRIVER_OBJECT DriverObject, + IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine); +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +VOID +NTAPI +IoAcquireVpbSpinLock( + OUT PKIRQL Irql); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCheckDesiredAccess( + IN OUT PACCESS_MASK DesiredAccess, + IN ACCESS_MASK GrantedAccess); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCheckEaBufferValidity( + IN PFILE_FULL_EA_INFORMATION EaBuffer, + IN ULONG EaLength, + OUT PULONG ErrorOffset); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCheckFunctionAccess( + IN ACCESS_MASK GrantedAccess, + IN UCHAR MajorFunction, + IN UCHAR MinorFunction, + IN ULONG IoControlCode, + IN PVOID Argument1 OPTIONAL, + IN PVOID Argument2 OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCheckQuerySetFileInformation( + IN FILE_INFORMATION_CLASS FileInformationClass, + IN ULONG Length, + IN BOOLEAN SetOperation); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCheckQuerySetVolumeInformation( + IN FS_INFORMATION_CLASS FsInformationClass, + IN ULONG Length, + IN BOOLEAN SetOperation); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCheckQuotaBufferValidity( + IN PFILE_QUOTA_INFORMATION QuotaBuffer, + IN ULONG QuotaLength, + OUT PULONG ErrorOffset); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +IoCreateStreamFileObject( + IN PFILE_OBJECT FileObject OPTIONAL, + IN PDEVICE_OBJECT DeviceObject OPTIONAL); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +IoCreateStreamFileObjectLite( + IN PFILE_OBJECT FileObject OPTIONAL, + IN PDEVICE_OBJECT DeviceObject OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +IoFastQueryNetworkAttributes( + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ACCESS_MASK DesiredAccess, + IN ULONG OpenOptions, + OUT PIO_STATUS_BLOCK IoStatus, + OUT PFILE_NETWORK_OPEN_INFORMATION Buffer); + +NTKERNELAPI +NTSTATUS +NTAPI +IoPageRead( + IN PFILE_OBJECT FileObject, + IN PMDL Mdl, + IN PLARGE_INTEGER Offset, + IN PKEVENT Event, + OUT PIO_STATUS_BLOCK IoStatusBlock); + +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoGetAttachedDevice( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoGetAttachedDeviceReference( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoGetBaseFileSystemDeviceObject( + IN PFILE_OBJECT FileObject); + +NTKERNELAPI +PCONFIGURATION_INFORMATION +NTAPI +IoGetConfigurationInformation( + VOID); + +NTKERNELAPI +ULONG +NTAPI +IoGetRequestorProcessId( + IN PIRP Irp); + +NTKERNELAPI +PEPROCESS +NTAPI +IoGetRequestorProcess( + IN PIRP Irp); + +NTKERNELAPI +PIRP +NTAPI +IoGetTopLevelIrp( + VOID); + +NTKERNELAPI +BOOLEAN +NTAPI +IoIsOperationSynchronous( + IN PIRP Irp); + +NTKERNELAPI +BOOLEAN +NTAPI +IoIsSystemThread( + IN PETHREAD Thread); + +NTKERNELAPI +BOOLEAN +NTAPI +IoIsValidNameGraftingBuffer( + IN PIRP Irp, + IN PREPARSE_DATA_BUFFER ReparseBuffer); + +NTKERNELAPI +NTSTATUS +NTAPI +IoQueryFileInformation( + IN PFILE_OBJECT FileObject, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN ULONG Length, + OUT PVOID FileInformation, + OUT PULONG ReturnedLength); + +NTKERNELAPI +NTSTATUS +NTAPI +IoQueryVolumeInformation( + IN PFILE_OBJECT FileObject, + IN FS_INFORMATION_CLASS FsInformationClass, + IN ULONG Length, + OUT PVOID FsInformation, + OUT PULONG ReturnedLength); + +NTKERNELAPI +VOID +NTAPI +IoQueueThreadIrp( + IN PIRP Irp); + +NTKERNELAPI +VOID +NTAPI +IoRegisterFileSystem( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +NTSTATUS +NTAPI +IoRegisterFsRegistrationChange( + IN PDRIVER_OBJECT DriverObject, + IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine); + +NTKERNELAPI +VOID +NTAPI +IoReleaseVpbSpinLock( + IN KIRQL Irql); + +NTKERNELAPI +VOID +NTAPI +IoSetDeviceToVerify( + IN PETHREAD Thread, + IN PDEVICE_OBJECT DeviceObject OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +IoSetInformation( + IN PFILE_OBJECT FileObject, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN ULONG Length, + IN PVOID FileInformation); + +NTKERNELAPI +VOID +NTAPI +IoSetTopLevelIrp( + IN PIRP Irp OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +IoStartNextPacket( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN Cancelable); + +NTKERNELAPI +VOID +NTAPI +IoStartNextPacketByKey( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN Cancelable, + IN ULONG Key); + +NTKERNELAPI +VOID +NTAPI +IoStartPacket( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PULONG Key OPTIONAL, + IN PDRIVER_CANCEL CancelFunction OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +IoStartTimer( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +VOID +NTAPI +IoStopTimer( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +NTSTATUS +NTAPI +IoSynchronousPageWrite( + IN PFILE_OBJECT FileObject, + IN PMDL Mdl, + IN PLARGE_INTEGER FileOffset, + IN PKEVENT Event, + OUT PIO_STATUS_BLOCK IoStatusBlock); + +NTKERNELAPI +PEPROCESS +NTAPI +IoThreadToProcess( + IN PETHREAD Thread); + +NTKERNELAPI +VOID +NTAPI +IoUnregisterFileSystem( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +VOID +NTAPI +IoUnregisterFsRegistrationChange( + IN PDRIVER_OBJECT DriverObject, + IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine); + +NTKERNELAPI +NTSTATUS +NTAPI +IoVerifyVolume( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN AllowRawMount); + +NTKERNELAPI +VOID +NTAPI +IoWriteErrorLogEntry( + IN PVOID ElEntry); + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetRequestorSessionId( + IN PIRP Irp, + OUT PULONG pSessionId); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTKERNELAPI +PFILE_OBJECT +NTAPI +IoCreateStreamFileObjectEx( + IN PFILE_OBJECT FileObject OPTIONAL, + IN PDEVICE_OBJECT DeviceObject OPTIONAL, + OUT PHANDLE FileObjectHandle OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +IoQueryFileDosDeviceName( + IN PFILE_OBJECT FileObject, + OUT POBJECT_NAME_INFORMATION *ObjectNameInformation); + +VOID +NTAPI +IoSetStartIoAttributes( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN DeferredStartIo, + IN BOOLEAN NonCancelable); + +NTKERNELAPI +NTSTATUS +NTAPI +IoEnumerateDeviceObjectList( + IN PDRIVER_OBJECT DriverObject, + OUT PDEVICE_OBJECT *DeviceObjectList, + IN ULONG DeviceObjectListSize, + OUT PULONG ActualNumberDeviceObjects); + +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoGetLowerDeviceObject( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoGetDeviceAttachmentBaseRef( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetDiskDeviceObject( + IN PDEVICE_OBJECT FileSystemDeviceObject, + OUT PDEVICE_OBJECT *DiskDeviceObject); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WS03SP1) +NTKERNELAPI +NTSTATUS +NTAPI +IoEnumerateRegisteredFiltersList( + OUT PDRIVER_OBJECT *DriverObjectList, + IN ULONG DriverObjectListSize, + OUT PULONG ActualNumberDriverObjects); +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) +VOID +FORCEINLINE +NTAPI +IoInitializePriorityInfo( + IN PIO_PRIORITY_INFO PriorityInfo) +{ + PriorityInfo->Size = sizeof(IO_PRIORITY_INFO); + PriorityInfo->ThreadPriority = 0xffff; + PriorityInfo->IoPriority = IoPriorityNormal; + PriorityInfo->PagePriority = 0; +} +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +NTKERNELAPI +NTSTATUS +NTAPI +IoRegisterFsRegistrationChangeMountAware( + IN PDRIVER_OBJECT DriverObject, + IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine, + IN BOOLEAN SynchronizeWithMounts); + +NTKERNELAPI +NTSTATUS +NTAPI +IoReplaceFileObjectName( + IN PFILE_OBJECT FileObject, + IN PWSTR NewFileName, + IN USHORT FileNameLength); + +#endif + +#define IoIsFileOpenedExclusively(FileObject) ( \ + (BOOLEAN) !( \ + (FileObject)->SharedRead || \ + (FileObject)->SharedWrite || \ + (FileObject)->SharedDelete \ + ) \ +) + +#if (NTDDI_VERSION >= NTDDI_VISTA) +typedef struct _IO_PRIORITY_INFO { + ULONG Size; + ULONG ThreadPriority; + ULONG PagePriority; + IO_PRIORITY_HINT IoPriority; +} IO_PRIORITY_INFO, *PIO_PRIORITY_INFO; +#endif + +#define PO_CB_SYSTEM_POWER_POLICY 0 +#define PO_CB_AC_STATUS 1 +#define PO_CB_BUTTON_COLLISION 2 +#define PO_CB_SYSTEM_STATE_LOCK 3 +#define PO_CB_LID_SWITCH_STATE 4 +#define PO_CB_PROCESSOR_POWER_POLICY 5 + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +PVOID +NTAPI +PoRegisterSystemState( + IN OUT PVOID StateHandle OPTIONAL, + IN EXECUTION_STATE Flags); + +NTKERNELAPI +VOID +NTAPI +PoUnregisterSystemState( + IN OUT PVOID StateHandle); + +NTKERNELAPI +POWER_STATE +NTAPI +PoSetPowerState( + IN PDEVICE_OBJECT DeviceObject, + IN POWER_STATE_TYPE Type, + IN POWER_STATE State); + +NTKERNELAPI +NTSTATUS +NTAPI +PoCallDriver( + IN PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp); + +NTKERNELAPI +VOID +NTAPI +PoStartNextPowerIrp( + IN OUT PIRP Irp); + +NTKERNELAPI +PULONG +NTAPI +PoRegisterDeviceForIdleDetection( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG ConservationIdleTime, + IN ULONG PerformanceIdleTime, + IN DEVICE_POWER_STATE State); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +NTSTATUS +NTAPI +PoQueueShutdownWorkItem( + IN OUT PWORK_QUEUE_ITEM WorkItem); +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTKERNELAPI +NTSTATUS +NTAPI +PoRegisterPowerSettingCallback( + IN PDEVICE_OBJECT DeviceObject OPTIONAL, + IN LPCGUID SettingGuid, + IN PPOWER_SETTING_CALLBACK Callback, + IN PVOID Context OPTIONAL, + OUT PVOID *Handle); + +NTKERNELAPI +NTSTATUS +PoUnregisterPowerSettingCallback( + IN OUT PVOID Handle); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN6SP1) +NTKERNELAPI +VOID +NTAPI +PoSetDeviceBusyEx( + IN OUT PULONG IdlePointer); +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +NTKERNELAPI +NTSTATUS +NTAPI +PoCreatePowerRequest( + OUT PVOID *PowerRequest, + IN PDEVICE_OBJECT DeviceObject, + IN PCOUNTED_REASON_CONTEXT Context); + +NTKERNELAPI +NTSTATUS +NTAPI +PoSetPowerRequest( + IN OUT PVOID PowerRequest, + IN POWER_REQUEST_TYPE Type); + +NTKERNELAPI +NTSTATUS +NTAPI +PoClearPowerRequest( + IN OUT PVOID PowerRequest, + IN POWER_REQUEST_TYPE Type); + +NTKERNELAPI +VOID +NTAPI +PoDeletePowerRequest( + IN OUT PVOID PowerRequest); + +NTKERNELAPI +VOID +NTAPI +PoStartDeviceBusy( + IN OUT PULONG IdlePointer); + +NTKERNELAPI +VOID +NTAPI +PoEndDeviceBusy( + IN OUT PULONG IdlePointer); + +NTKERNELAPI +BOOLEAN +NTAPI +PoQueryWatchdogTime( + IN PDEVICE_OBJECT Pdo, + OUT PULONG SecondsRemaining); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + +#if defined(_IA64_) +#if (NTDDI_VERSION >= NTDDI_WIN2K) +//DECLSPEC_DEPRECATED_DDK +NTHALAPI +ULONG +NTAPI +HalGetDmaAlignmentRequirement( + VOID); +#endif +#endif + +#if defined(_M_IX86) || defined(_M_AMD64) +#define HalGetDmaAlignmentRequirement() 1L +#endif + +typedef enum _MMFLUSH_TYPE { + MmFlushForDelete, + MmFlushForWrite +} MMFLUSH_TYPE; + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +BOOLEAN +NTAPI +MmIsRecursiveIoFault( + VOID); + +NTKERNELAPI +BOOLEAN +NTAPI +MmForceSectionClosed( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN BOOLEAN DelayClose); + +NTKERNELAPI +BOOLEAN +NTAPI +MmFlushImageSection( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN MMFLUSH_TYPE FlushType); + +NTKERNELAPI +BOOLEAN +NTAPI +MmCanFileBeTruncated( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER NewFileSize OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +MmSetAddressRangeModified( + IN PVOID Address, + IN SIZE_T Length); + +#endif + +typedef struct _READ_LIST { + PFILE_OBJECT FileObject; + ULONG NumberOfEntries; + LOGICAL IsImage; + FILE_SEGMENT_ELEMENT List[ANYSIZE_ARRAY]; +} READ_LIST, *PREAD_LIST; + +#if (NTDDI_VERSION >= NTDDI_WINXP) +typedef union _MM_PREFETCH_FLAGS { + struct { + ULONG Priority : SYSTEM_PAGE_PRIORITY_BITS; + ULONG RepurposePriority : SYSTEM_PAGE_PRIORITY_BITS; + } Flags; + ULONG AllFlags; +} MM_PREFETCH_FLAGS, *PMM_PREFETCH_FLAGS; + +#define MM_PREFETCH_FLAGS_MASK ((1 << (2*SYSTEM_PAGE_PRIORITY_BITS)) - 1) + +NTKERNELAPI +NTSTATUS +NTAPI +MmPrefetchPages( + IN ULONG NumberOfLists, + IN PREAD_LIST *ReadLists); +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) +NTKERNELAPI +ULONG +NTAPI +MmDoesFileHaveUserWritableReferences( + IN PSECTION_OBJECT_POINTERS SectionPointer); +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +NTSTATUS +NTAPI +ObInsertObject( + IN PVOID Object, + IN OUT PACCESS_STATE PassedAccessState OPTIONAL, + IN ACCESS_MASK DesiredAccess OPTIONAL, + IN ULONG ObjectPointerBias, + OUT PVOID *NewObject OPTIONAL, + OUT PHANDLE Handle OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +ObOpenObjectByPointer( + IN PVOID Object, + IN ULONG HandleAttributes, + IN PACCESS_STATE PassedAccessState OPTIONAL, + IN ACCESS_MASK DesiredAccess OPTIONAL, + IN POBJECT_TYPE ObjectType OPTIONAL, + IN KPROCESSOR_MODE AccessMode, + OUT PHANDLE Handle); + +NTKERNELAPI +VOID +NTAPI +ObMakeTemporaryObject( + IN PVOID Object); + +NTKERNELAPI +NTSTATUS +NTAPI +ObQueryNameString( + IN PVOID Object, + OUT POBJECT_NAME_INFORMATION ObjectNameInfo OPTIONAL, + IN ULONG Length, + OUT PULONG ReturnLength); + +NTKERNELAPI +NTSTATUS +NTAPI +ObQueryObjectAuditingByHandle( + IN HANDLE Handle, + OUT PBOOLEAN GenerateOnClose); + +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) +NTKERNELAPI +BOOLEAN +NTAPI +ObIsKernelHandle( + IN HANDLE Handle); +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTKERNELAPI +NTSTATUS +NTAPI +ObOpenObjectByPointerWithTag( + IN PVOID Object, + IN ULONG HandleAttributes, + IN PACCESS_STATE PassedAccessState OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_TYPE ObjectType OPTIONAL, + IN KPROCESSOR_MODE AccessMode, + IN ULONG Tag, + OUT PHANDLE Handle); +#endif + +typedef ULONG LBN; +typedef LBN *PLBN; + +typedef ULONG VBN; +typedef VBN *PVBN; + +typedef enum _FAST_IO_POSSIBLE { + FastIoIsNotPossible = 0, + FastIoIsPossible, + FastIoIsQuestionable +} FAST_IO_POSSIBLE; + +typedef struct _FSRTL_COMMON_FCB_HEADER { + CSHORT NodeTypeCode; + CSHORT NodeByteSize; + UCHAR Flags; + UCHAR IsFastIoPossible; + UCHAR Flags2; + UCHAR Reserved:4; + UCHAR Version:4; + PERESOURCE Resource; + PERESOURCE PagingIoResource; + LARGE_INTEGER AllocationSize; + LARGE_INTEGER FileSize; + LARGE_INTEGER ValidDataLength; +} FSRTL_COMMON_FCB_HEADER, *PFSRTL_COMMON_FCB_HEADER; + +#ifdef __cplusplus +typedef struct _FSRTL_ADVANCED_FCB_HEADER:FSRTL_COMMON_FCB_HEADER { +#else /* __cplusplus */ +typedef struct _FSRTL_ADVANCED_FCB_HEADER { + FSRTL_COMMON_FCB_HEADER DUMMYSTRUCTNAME; +#endif /* __cplusplus */ + PFAST_MUTEX FastMutex; + LIST_ENTRY FilterContexts; +#if (NTDDI_VERSION >= NTDDI_VISTA) + EX_PUSH_LOCK PushLock; + PVOID *FileContextSupportPointer; +#endif +} FSRTL_ADVANCED_FCB_HEADER, *PFSRTL_ADVANCED_FCB_HEADER; + +#define FSRTL_FCB_HEADER_V0 (0x00) +#define FSRTL_FCB_HEADER_V1 (0x01) + #define FSRTL_FLAG_FILE_MODIFIED (0x01) #define FSRTL_FLAG_FILE_LENGTH_CHANGED (0x02) #define FSRTL_FLAG_LIMIT_MODIFIED_PAGES (0x04) @@ -284,7 +6519,376 @@ typedef enum _SECURITY_LOGON_TYPE #define FSRTL_CACHE_TOP_LEVEL_IRP (0x02) #define FSRTL_MOD_WRITE_TOP_LEVEL_IRP (0x03) #define FSRTL_FAST_IO_TOP_LEVEL_IRP (0x04) -#define FSRTL_MAX_TOP_LEVEL_IRP_FLAG (0x04) +#define FSRTL_NETWORK1_TOP_LEVEL_IRP ((LONG_PTR)0x05) +#define FSRTL_NETWORK2_TOP_LEVEL_IRP ((LONG_PTR)0x06) +#define FSRTL_MAX_TOP_LEVEL_IRP_FLAG ((LONG_PTR)0xFFFF) + +typedef struct _EOF_WAIT_BLOCK { + LIST_ENTRY EofWaitLinks; + KEVENT Event; +} EOF_WAIT_BLOCK, *PEOF_WAIT_BLOCK; + +typedef struct _FSRTL_AUXILIARY_BUFFER { + PVOID Buffer; + ULONG Length; + ULONG Flags; + PMDL Mdl; +} FSRTL_AUXILIARY_BUFFER, *PFSRTL_AUXILIARY_BUFFER; + +#define FSRTL_AUXILIARY_FLAG_DEALLOCATE 0x00000001 + +typedef struct _FILE_LOCK_INFO { + LARGE_INTEGER StartingByte; + LARGE_INTEGER Length; + BOOLEAN ExclusiveLock; + ULONG Key; + PFILE_OBJECT FileObject; + PVOID ProcessId; + LARGE_INTEGER EndingByte; +} FILE_LOCK_INFO, *PFILE_LOCK_INFO; + +typedef NTSTATUS +(NTAPI *PCOMPLETE_LOCK_IRP_ROUTINE) ( + IN PVOID Context, + IN PIRP Irp); + +typedef VOID +(NTAPI *PUNLOCK_ROUTINE) ( + IN PVOID Context, + IN PFILE_LOCK_INFO FileLockInfo); + +typedef struct _FILE_LOCK { + PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine; + PUNLOCK_ROUTINE UnlockRoutine; + BOOLEAN FastIoIsQuestionable; + BOOLEAN SpareC[3]; + PVOID LockInformation; + FILE_LOCK_INFO LastReturnedLockInfo; + PVOID LastReturnedLock; + LONG volatile LockRequestsInProgress; +} FILE_LOCK, *PFILE_LOCK; + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCopyRead( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN ULONG LockKey, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCopyWrite( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN ULONG LockKey, + IN PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlMdlReadDev( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG LockKey, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus, + IN PDEVICE_OBJECT DeviceObject OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlMdlReadCompleteDev( + IN PFILE_OBJECT FileObject, + IN PMDL MdlChain, + IN PDEVICE_OBJECT DeviceObject OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlPrepareMdlWriteDev( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG LockKey, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus, + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlMdlWriteCompleteDev( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN PMDL MdlChain, + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +VOID +NTAPI +FsRtlAcquireFileExclusive( + IN PFILE_OBJECT FileObject); + +NTKERNELAPI +VOID +NTAPI +FsRtlReleaseFile( + IN PFILE_OBJECT FileObject); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlGetFileSize( + IN PFILE_OBJECT FileObject, + OUT PLARGE_INTEGER FileSize); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsTotalDeviceFailure( + IN NTSTATUS Status); + +NTKERNELAPI +PFILE_LOCK +NTAPI +FsRtlAllocateFileLock( + IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL, + IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlFreeFileLock( + IN PFILE_LOCK FileLock); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeFileLock( + IN PFILE_LOCK FileLock, + IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL, + IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeFileLock( + IN PFILE_LOCK FileLock); + +/* + FsRtlProcessFileLock: + + ret: + -STATUS_INVALID_DEVICE_REQUEST + -STATUS_RANGE_NOT_LOCKED from unlock routines. + -STATUS_PENDING, STATUS_LOCK_NOT_GRANTED from FsRtlPrivateLock + (redirected IoStatus->Status). + + Internals: + -switch ( Irp->CurrentStackLocation->MinorFunction ) + lock: return FsRtlPrivateLock; + unlocksingle: return FsRtlFastUnlockSingle; + unlockall: return FsRtlFastUnlockAll; + unlockallbykey: return FsRtlFastUnlockAllByKey; + default: IofCompleteRequest with STATUS_INVALID_DEVICE_REQUEST; + return STATUS_INVALID_DEVICE_REQUEST; + + -'AllwaysZero' is passed thru as 'AllwaysZero' to lock / unlock routines. + -'Irp' is passet thru as 'Irp' to FsRtlPrivateLock. +*/ +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlProcessFileLock( + IN PFILE_LOCK FileLock, + IN PIRP Irp, + IN PVOID Context OPTIONAL); + +/* + FsRtlCheckLockForReadAccess: + + All this really does is pick out the lock parameters from the irp (io stack + location?), get IoGetRequestorProcess, and pass values on to + FsRtlFastCheckLockForRead. +*/ +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCheckLockForReadAccess( + IN PFILE_LOCK FileLock, + IN PIRP Irp); + +/* + FsRtlCheckLockForWriteAccess: + + All this really does is pick out the lock parameters from the irp (io stack + location?), get IoGetRequestorProcess, and pass values on to + FsRtlFastCheckLockForWrite. +*/ +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCheckLockForWriteAccess( + IN PFILE_LOCK FileLock, + IN PIRP Irp); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlFastCheckLockForRead( + IN PFILE_LOCK FileLock, + IN PLARGE_INTEGER FileOffset, + IN PLARGE_INTEGER Length, + IN ULONG Key, + IN PFILE_OBJECT FileObject, + IN PVOID Process); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlFastCheckLockForWrite( + IN PFILE_LOCK FileLock, + IN PLARGE_INTEGER FileOffset, + IN PLARGE_INTEGER Length, + IN ULONG Key, + IN PFILE_OBJECT FileObject, + IN PVOID Process); + +/* + FsRtlGetNextFileLock: + + ret: NULL if no more locks + + Internals: + FsRtlGetNextFileLock uses FileLock->LastReturnedLockInfo and + FileLock->LastReturnedLock as storage. + LastReturnedLock is a pointer to the 'raw' lock inkl. double linked + list, and FsRtlGetNextFileLock needs this to get next lock on subsequent + calls with Restart = FALSE. +*/ +NTKERNELAPI +PFILE_LOCK_INFO +NTAPI +FsRtlGetNextFileLock( + IN PFILE_LOCK FileLock, + IN BOOLEAN Restart); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlFastUnlockSingle( + IN PFILE_LOCK FileLock, + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN PLARGE_INTEGER Length, + IN PEPROCESS Process, + IN ULONG Key, + IN PVOID Context OPTIONAL, + IN BOOLEAN AlreadySynchronized); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlFastUnlockAll( + IN PFILE_LOCK FileLock, + IN PFILE_OBJECT FileObject, + IN PEPROCESS Process, + IN PVOID Context OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlFastUnlockAllByKey( + IN PFILE_LOCK FileLock, + IN PFILE_OBJECT FileObject, + IN PEPROCESS Process, + IN ULONG Key, + IN PVOID Context OPTIONAL); + +/* + FsRtlPrivateLock: + + ret: IoStatus->Status: STATUS_PENDING, STATUS_LOCK_NOT_GRANTED + + Internals: + -Calls IoCompleteRequest if Irp + -Uses exception handling / ExRaiseStatus with STATUS_INSUFFICIENT_RESOURCES +*/ +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlPrivateLock( + IN PFILE_LOCK FileLock, + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN PLARGE_INTEGER Length, + IN PEPROCESS Process, + IN ULONG Key, + IN BOOLEAN FailImmediately, + IN BOOLEAN ExclusiveLock, + OUT PIO_STATUS_BLOCK IoStatus, + IN PIRP Irp OPTIONAL, + IN PVOID Context, + IN BOOLEAN AlreadySynchronized); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAreThereCurrentOrInProgressFileLocks( + IN PFILE_LOCK FileLock); +#endif + +#pragma pack(push,4) + +#ifndef VER_PRODUCTBUILD +#define VER_PRODUCTBUILD 10000 +#endif + +#include "csq.h" + +#ifdef _NTOSKRNL_ +extern PUCHAR FsRtlLegalAnsiCharacterArray; +#else +extern DECLSPEC_IMPORT PUCHAR FsRtlLegalAnsiCharacterArray; +#endif +extern PACL SePublicDefaultDacl; +extern PACL SeSystemDefaultDacl; + +#define FS_LFN_APIS 0x00004000 + +#define FILE_STORAGE_TYPE_SPECIFIED 0x00000041 /* FILE_DIRECTORY_FILE | FILE_NON_DIRECTORY_FILE */ +#define FILE_STORAGE_TYPE_DEFAULT (StorageTypeDefault << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_DIRECTORY (StorageTypeDirectory << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_FILE (StorageTypeFile << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_DOCFILE (StorageTypeDocfile << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_JUNCTION_POINT (StorageTypeJunctionPoint << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_CATALOG (StorageTypeCatalog << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_STRUCTURED_STORAGE (StorageTypeStructuredStorage << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_EMBEDDING (StorageTypeEmbedding << FILE_STORAGE_TYPE_SHIFT) +#define FILE_STORAGE_TYPE_STREAM (StorageTypeStream << FILE_STORAGE_TYPE_SHIFT) +#define FILE_MINIMUM_STORAGE_TYPE FILE_STORAGE_TYPE_DEFAULT +#define FILE_MAXIMUM_STORAGE_TYPE FILE_STORAGE_TYPE_STREAM +#define FILE_STORAGE_TYPE_MASK 0x000f0000 +#define FILE_STORAGE_TYPE_SHIFT 16 + +#define FILE_VC_QUOTAS_LOG_VIOLATIONS 0x00000004 #define FSRTL_VOLUME_DISMOUNT 1 #define FSRTL_VOLUME_DISMOUNT_FAILED 2 @@ -312,9 +6916,6 @@ typedef enum _SECURITY_LOGON_TYPE #define IO_ATTACH_DEVICE_API 0x80000000 -#define IO_FILE_OBJECT_NON_PAGED_POOL_CHARGE 64 -#define IO_FILE_OBJECT_PAGED_POOL_CHARGE 1024 - #define IO_TYPE_APC 18 #define IO_TYPE_DPC 19 #define IO_TYPE_DEVICE_QUEUE 20 @@ -362,181 +6963,35 @@ typedef enum _SECURITY_LOGON_TYPE #define PIN_NO_READ (4) #define PIN_IF_BCB (8) -#define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE 1 -#define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING 2 - #define SEC_BASED 0x00200000 #define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1} #define SECURITY_WORLD_RID (0x00000000L) -#define SID_REVISION 1 -#define SID_MAX_SUB_AUTHORITIES 15 -#define SID_RECOMMENDED_SUB_AUTHORITIES 1 - -#define TOKEN_ASSIGN_PRIMARY (0x0001) -#define TOKEN_DUPLICATE (0x0002) -#define TOKEN_IMPERSONATE (0x0004) -#define TOKEN_QUERY (0x0008) -#define TOKEN_QUERY_SOURCE (0x0010) -#define TOKEN_ADJUST_PRIVILEGES (0x0020) -#define TOKEN_ADJUST_GROUPS (0x0040) -#define TOKEN_ADJUST_DEFAULT (0x0080) -#define TOKEN_ADJUST_SESSIONID (0x0100) - -#define TOKEN_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ - TOKEN_ASSIGN_PRIMARY |\ - TOKEN_DUPLICATE |\ - TOKEN_IMPERSONATE |\ - TOKEN_QUERY |\ - TOKEN_QUERY_SOURCE |\ - TOKEN_ADJUST_PRIVILEGES |\ - TOKEN_ADJUST_GROUPS |\ - TOKEN_ADJUST_DEFAULT |\ - TOKEN_ADJUST_SESSIONID) - -#define TOKEN_READ (STANDARD_RIGHTS_READ |\ - TOKEN_QUERY) - -#define TOKEN_WRITE (STANDARD_RIGHTS_WRITE |\ - TOKEN_ADJUST_PRIVILEGES |\ - TOKEN_ADJUST_GROUPS |\ - TOKEN_ADJUST_DEFAULT) - -#define TOKEN_EXECUTE (STANDARD_RIGHTS_EXECUTE) - -#define TOKEN_SOURCE_LENGTH 8 /* end winnt.h */ -#define TOKEN_HAS_TRAVERSE_PRIVILEGE 0x01 -#define TOKEN_HAS_BACKUP_PRIVILEGE 0x02 -#define TOKEN_HAS_RESTORE_PRIVILEGE 0x04 #define TOKEN_HAS_ADMIN_GROUP 0x08 -#define TOKEN_WRITE_RESTRICTED 0x08 -#define TOKEN_IS_RESTRICTED 0x10 -#define SE_BACKUP_PRIVILEGES_CHECKED 0x0100 #define VACB_MAPPING_GRANULARITY (0x40000) #define VACB_OFFSET_SHIFT (18) -#define SE_OWNER_DEFAULTED 0x0001 -#define SE_GROUP_DEFAULTED 0x0002 -#define SE_DACL_PRESENT 0x0004 -#define SE_DACL_DEFAULTED 0x0008 -#define SE_SACL_PRESENT 0x0010 -#define SE_SACL_DEFAULTED 0x0020 -#define SE_DACL_UNTRUSTED 0x0040 -#define SE_SERVER_SECURITY 0x0080 -#define SE_DACL_AUTO_INHERIT_REQ 0x0100 -#define SE_SACL_AUTO_INHERIT_REQ 0x0200 -#define SE_DACL_AUTO_INHERITED 0x0400 -#define SE_SACL_AUTO_INHERITED 0x0800 -#define SE_DACL_PROTECTED 0x1000 -#define SE_SACL_PROTECTED 0x2000 -#define SE_RM_CONTROL_VALID 0x4000 -#define SE_SELF_RELATIVE 0x8000 - -#ifndef _WINNT_H -#define _AUDIT_EVENT_TYPE_HACK 0 -#endif -#if (_AUDIT_EVENT_TYPE_HACK == 1) - -#else -typedef enum _AUDIT_EVENT_TYPE -{ - AuditEventObjectAccess, - AuditEventDirectoryServiceAccess -} AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE; -#endif - -#define AUDIT_ALLOW_NO_PRIVILEGE 0x1 - -#define FSCTL_REQUEST_OPLOCK_LEVEL_1 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_REQUEST_OPLOCK_LEVEL_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_REQUEST_BATCH_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 3, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 4, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_OPLOCK_BREAK_NOTIFY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 5, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 7, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define FSCTL_IS_VOLUME_MOUNTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_IS_PATHNAME_VALID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_MARK_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define FSCTL_QUERY_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 14, METHOD_NEITHER, FILE_ANY_ACCESS) -#define FSCTL_GET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_SET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA) - - -#define FSCTL_MARK_AS_SYSTEM_HIVE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19, METHOD_NEITHER, FILE_ANY_ACCESS) -#define FSCTL_OPLOCK_BREAK_ACK_NO_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 20, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_INVALIDATE_VOLUMES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_QUERY_FAT_BPB CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_REQUEST_FILTER_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS) - #if (VER_PRODUCTBUILD >= 1381) - -#define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_GET_NTFS_FILE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_GET_VOLUME_BITMAP CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27, METHOD_NEITHER, FILE_ANY_ACCESS) -#define FSCTL_GET_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28, METHOD_NEITHER, FILE_ANY_ACCESS) -#define FSCTL_MOVE_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_IS_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 30, METHOD_BUFFERED, FILE_ANY_ACCESS) #define FSCTL_GET_HFS_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 31, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_ALLOW_EXTENDED_DASD_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 32, METHOD_NEITHER, FILE_ANY_ACCESS) - #endif /* (VER_PRODUCTBUILD >= 1381) */ #if (VER_PRODUCTBUILD >= 2195) #define FSCTL_READ_PROPERTY_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 33, METHOD_NEITHER, FILE_ANY_ACCESS) #define FSCTL_WRITE_PROPERTY_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 34, METHOD_NEITHER, FILE_ANY_ACCESS) -#define FSCTL_FIND_FILES_BY_SID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 35, METHOD_NEITHER, FILE_ANY_ACCESS) #define FSCTL_DUMP_PROPERTY_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 37, METHOD_NEITHER, FILE_ANY_ACCESS) -#define FSCTL_SET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 38, METHOD_BUFFERED, FILE_WRITE_DATA) -#define FSCTL_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 39, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_DELETE_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 40, METHOD_BUFFERED, FILE_WRITE_DATA) -#define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_WRITE_DATA) -#define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_WRITE_DATA) -#define FSCTL_ENUM_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 44, METHOD_NEITHER, FILE_READ_DATA) -#define FSCTL_SECURITY_ID_CHECK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 45, METHOD_NEITHER, FILE_READ_DATA) -#define FSCTL_READ_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 46, METHOD_NEITHER, FILE_READ_DATA) -#define FSCTL_SET_OBJECT_ID_EXTENDED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 47, METHOD_BUFFERED, FILE_WRITE_DATA) -#define FSCTL_CREATE_OR_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 48, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_SET_SPARSE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_WRITE_DATA) -#define FSCTL_SET_ZERO_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 50, METHOD_BUFFERED, FILE_WRITE_DATA) -#define FSCTL_QUERY_ALLOCATED_RANGES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51, METHOD_NEITHER, FILE_READ_DATA) -#define FSCTL_ENABLE_UPGRADE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 52, METHOD_BUFFERED, FILE_WRITE_DATA) -#define FSCTL_SET_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 53, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_ENCRYPTION_FSCTL_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 54, METHOD_NEITHER, FILE_ANY_ACCESS) -#define FSCTL_WRITE_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 55, METHOD_NEITHER, FILE_ANY_ACCESS) -#define FSCTL_READ_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 56, METHOD_NEITHER, FILE_ANY_ACCESS) -#define FSCTL_CREATE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 57, METHOD_NEITHER, FILE_READ_DATA) -#define FSCTL_READ_FILE_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 58, METHOD_NEITHER, FILE_READ_DATA) -#define FSCTL_WRITE_USN_CLOSE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 59, METHOD_NEITHER, FILE_READ_DATA) -#define FSCTL_EXTEND_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 60, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_QUERY_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 61, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_DELETE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 62, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_MARK_HANDLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_SIS_COPYFILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 64, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_SIS_LINK_FILES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 65, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA) + #define FSCTL_HSM_MSG CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 66, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA) #define FSCTL_NSS_CONTROL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 67, METHOD_BUFFERED, FILE_WRITE_DATA) #define FSCTL_HSM_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 68, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA) -#define FSCTL_RECALL_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 69, METHOD_NEITHER, FILE_ANY_ACCESS) #define FSCTL_NSS_RCONTROL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 70, METHOD_BUFFERED, FILE_READ_DATA) -#define FSCTL_READ_FROM_PLEX CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_OUT_DIRECT, FILE_READ_DATA) -#define FSCTL_FILE_PREFETCH CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) - #endif /* (VER_PRODUCTBUILD >= 2195) */ -#define FSCTL_MAILSLOT_PEEK CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA) - #define FSCTL_NETWORK_SET_CONFIGURATION_INFO CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 102, METHOD_IN_DIRECT, FILE_ANY_ACCESS) #define FSCTL_NETWORK_GET_CONFIGURATION_INFO CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 103, METHOD_OUT_DIRECT, FILE_ANY_ACCESS) #define FSCTL_NETWORK_GET_CONNECTION_INFO CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 104, METHOD_NEITHER, FILE_ANY_ACCESS) @@ -546,21 +7001,6 @@ typedef enum _AUDIT_EVENT_TYPE #define FSCTL_NETWORK_SET_DOMAIN_NAME CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_ANY_ACCESS) #define FSCTL_NETWORK_REMOTE_BOOT_INIT_SCRT CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 250, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_PIPE_ASSIGN_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_PIPE_DISCONNECT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_PIPE_LISTEN CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_PIPE_PEEK CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA) -#define FSCTL_PIPE_QUERY_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_PIPE_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA) -#define FSCTL_PIPE_WAIT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_PIPE_IMPERSONATE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_PIPE_SET_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_PIPE_QUERY_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define FSCTL_PIPE_INTERNAL_READ CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA) -#define FSCTL_PIPE_INTERNAL_WRITE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA) -#define FSCTL_PIPE_INTERNAL_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA) -#define FSCTL_PIPE_INTERNAL_READ_OVFLOW CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA) - #define IOCTL_REDIR_QUERY_PATH CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS) typedef PVOID OPLOCK, *POPLOCK; @@ -571,20 +7011,8 @@ typedef PVOID OPLOCK, *POPLOCK; struct _RTL_AVL_TABLE; struct _RTL_GENERIC_TABLE; -typedef ULONG LBN; -typedef LBN *PLBN; - -typedef ULONG VBN; -typedef VBN *PVBN; - typedef PVOID PNOTIFY_SYNC; -typedef enum _FAST_IO_POSSIBLE { - FastIoIsNotPossible, - FastIoIsPossible, - FastIoIsQuestionable -} FAST_IO_POSSIBLE; - typedef enum _FILE_STORAGE_TYPE { StorageTypeDefault = 1, StorageTypeDirectory, @@ -596,17 +7024,6 @@ typedef enum _FILE_STORAGE_TYPE { StorageTypeStream } FILE_STORAGE_TYPE; -typedef enum _OBJECT_INFORMATION_CLASS -{ - ObjectBasicInformation, - ObjectNameInformation, - ObjectTypeInformation, - ObjectTypesInformation, - ObjectHandleFlagInformation, - ObjectSessionInformation, - MaxObjectInfoClass -} OBJECT_INFORMATION_CLASS; - typedef struct _OBJECT_BASIC_INFORMATION { ULONG Attributes; @@ -622,15 +7039,6 @@ typedef struct _OBJECT_BASIC_INFORMATION LARGE_INTEGER CreationTime; } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION; -typedef struct _KAPC_STATE { - LIST_ENTRY ApcListHead[2]; - PKPROCESS Process; - BOOLEAN KernelApcInProgress; - BOOLEAN KernelApcPending; - BOOLEAN UserApcPending; -} KAPC_STATE, *PKAPC_STATE, *RESTRICTED_POINTER PRKAPC_STATE; -#define KAPC_STATE_ACTUAL_LENGTH (FIELD_OFFSET(KAPC_STATE, UserApcPending) + sizeof(BOOLEAN)) - typedef struct _BITMAP_RANGE { LIST_ENTRY Links; LONGLONG BasePage; @@ -651,404 +7059,6 @@ typedef struct _CC_FILE_SIZES { LARGE_INTEGER ValidDataLength; } CC_FILE_SIZES, *PCC_FILE_SIZES; -typedef struct _COMPRESSED_DATA_INFO { - USHORT CompressionFormatAndEngine; - UCHAR CompressionUnitShift; - UCHAR ChunkShift; - UCHAR ClusterShift; - UCHAR Reserved; - USHORT NumberOfChunks; - ULONG CompressedChunkSizes[ANYSIZE_ARRAY]; -} COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO; - -typedef struct _SID_IDENTIFIER_AUTHORITY { - UCHAR Value[6]; -} SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY; - -typedef struct _SID { - UCHAR Revision; - UCHAR SubAuthorityCount; - SID_IDENTIFIER_AUTHORITY IdentifierAuthority; - ULONG SubAuthority[ANYSIZE_ARRAY]; -} SID, *PISID; -typedef struct _SID_AND_ATTRIBUTES { - PSID Sid; - ULONG Attributes; -} SID_AND_ATTRIBUTES, *PSID_AND_ATTRIBUTES; -typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY]; -typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY; - - - -// -// Universal well-known SIDs -// -#define SECURITY_NULL_SID_AUTHORITY {0,0,0,0,0,0} -#define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1} -#define SECURITY_LOCAL_SID_AUTHORITY {0,0,0,0,0,2} -#define SECURITY_CREATOR_SID_AUTHORITY {0,0,0,0,0,3} -#define SECURITY_NON_UNIQUE_AUTHORITY {0,0,0,0,0,4} -#define SECURITY_RESOURCE_MANAGER_AUTHORITY {0,0,0,0,0,9} - -#define SECURITY_NULL_RID (0x00000000L) -#define SECURITY_WORLD_RID (0x00000000L) -#define SECURITY_LOCAL_RID (0x00000000L) - -#define SECURITY_CREATOR_OWNER_RID (0x00000000L) -#define SECURITY_CREATOR_GROUP_RID (0x00000001L) - -#define SECURITY_CREATOR_OWNER_SERVER_RID (0x00000002L) -#define SECURITY_CREATOR_GROUP_SERVER_RID (0x00000003L) - -#define SECURITY_CREATOR_OWNER_RIGHTS_RID (0x00000004L) - - - -// -// NT well-known SIDs -// -#define SECURITY_NT_AUTHORITY {0,0,0,0,0,5} - -#define SECURITY_DIALUP_RID (0x00000001L) -#define SECURITY_NETWORK_RID (0x00000002L) -#define SECURITY_BATCH_RID (0x00000003L) -#define SECURITY_INTERACTIVE_RID (0x00000004L) -#define SECURITY_LOGON_IDS_RID (0x00000005L) -#define SECURITY_LOGON_IDS_RID_COUNT (3L) -#define SECURITY_SERVICE_RID (0x00000006L) -#define SECURITY_ANONYMOUS_LOGON_RID (0x00000007L) -#define SECURITY_PROXY_RID (0x00000008L) -#define SECURITY_ENTERPRISE_CONTROLLERS_RID (0x00000009L) -#define SECURITY_SERVER_LOGON_RID SECURITY_ENTERPRISE_CONTROLLERS_RID -#define SECURITY_PRINCIPAL_SELF_RID (0x0000000AL) -#define SECURITY_AUTHENTICATED_USER_RID (0x0000000BL) -#define SECURITY_RESTRICTED_CODE_RID (0x0000000CL) -#define SECURITY_TERMINAL_SERVER_RID (0x0000000DL) -#define SECURITY_REMOTE_LOGON_RID (0x0000000EL) -#define SECURITY_THIS_ORGANIZATION_RID (0x0000000FL) -#define SECURITY_IUSER_RID (0x00000011L) -#define SECURITY_LOCAL_SYSTEM_RID (0x00000012L) -#define SECURITY_LOCAL_SERVICE_RID (0x00000013L) -#define SECURITY_NETWORK_SERVICE_RID (0x00000014L) - -#define SECURITY_NT_NON_UNIQUE (0x00000015L) -#define SECURITY_NT_NON_UNIQUE_SUB_AUTH_COUNT (3L) - -#define SECURITY_ENTERPRISE_READONLY_CONTROLLERS_RID (0x00000016L) - -#define SECURITY_BUILTIN_DOMAIN_RID (0x00000020L) -#define SECURITY_WRITE_RESTRICTED_CODE_RID (0x00000021L) - - -#define SECURITY_PACKAGE_BASE_RID (0x00000040L) -#define SECURITY_PACKAGE_RID_COUNT (2L) -#define SECURITY_PACKAGE_NTLM_RID (0x0000000AL) -#define SECURITY_PACKAGE_SCHANNEL_RID (0x0000000EL) -#define SECURITY_PACKAGE_DIGEST_RID (0x00000015L) - -#define SECURITY_MIN_BASE_RID (0x00000050L) - -#define SECURITY_SERVICE_ID_BASE_RID (0x00000050L) -#define SECURITY_SERVICE_ID_RID_COUNT (6L) - -#define SECURITY_RESERVED_ID_BASE_RID (0x00000051L) - -#define SECURITY_APPPOOL_ID_BASE_RID (0x00000052L) -#define SECURITY_APPPOOL_ID_RID_COUNT (6L) - -#define SECURITY_VIRTUALSERVER_ID_BASE_RID (0x00000053L) -#define SECURITY_VIRTUALSERVER_ID_RID_COUNT (6L) - -#define SECURITY_MAX_BASE_RID (0x0000006FL) - -#define SECURITY_MAX_ALWAYS_FILTERED (0x000003E7L) -#define SECURITY_MIN_NEVER_FILTERED (0x000003E8L) - -#define SECURITY_OTHER_ORGANIZATION_RID (0x000003E8L) - - - -// -// Well-known domain relative sub-authority values (RIDs) -// -#define DOMAIN_GROUP_RID_ENTERPRISE_READONLY_DOMAIN_CONTROLLERS (0x000001F2L) - -#define FOREST_USER_RID_MAX (0x000001F3L) - -// -// Well-known users -// -#define DOMAIN_USER_RID_ADMIN (0x000001F4L) -#define DOMAIN_USER_RID_GUEST (0x000001F5L) -#define DOMAIN_USER_RID_KRBTGT (0x000001F6L) - -#define DOMAIN_USER_RID_MAX (0x000003E7L) - -// -// Well-known groups -// -#define DOMAIN_GROUP_RID_ADMINS (0x00000200L) -#define DOMAIN_GROUP_RID_USERS (0x00000201L) -#define DOMAIN_GROUP_RID_GUESTS (0x00000202L) -#define DOMAIN_GROUP_RID_COMPUTERS (0x00000203L) -#define DOMAIN_GROUP_RID_CONTROLLERS (0x00000204L) -#define DOMAIN_GROUP_RID_CERT_ADMINS (0x00000205L) -#define DOMAIN_GROUP_RID_SCHEMA_ADMINS (0x00000206L) -#define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS (0x00000207L) -#define DOMAIN_GROUP_RID_POLICY_ADMINS (0x00000208L) -#define DOMAIN_GROUP_RID_READONLY_CONTROLLERS (0x00000209L) - -// -// Well-known aliases -// -#define DOMAIN_ALIAS_RID_ADMINS (0x00000220L) -#define DOMAIN_ALIAS_RID_USERS (0x00000221L) -#define DOMAIN_ALIAS_RID_GUESTS (0x00000222L) -#define DOMAIN_ALIAS_RID_POWER_USERS (0x00000223L) - -#define DOMAIN_ALIAS_RID_ACCOUNT_OPS (0x00000224L) -#define DOMAIN_ALIAS_RID_SYSTEM_OPS (0x00000225L) -#define DOMAIN_ALIAS_RID_PRINT_OPS (0x00000226L) -#define DOMAIN_ALIAS_RID_BACKUP_OPS (0x00000227L) - -#define DOMAIN_ALIAS_RID_REPLICATOR (0x00000228L) -#define DOMAIN_ALIAS_RID_RAS_SERVERS (0x00000229L) -#define DOMAIN_ALIAS_RID_PREW2KCOMPACCESS (0x0000022AL) -#define DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS (0x0000022BL) -#define DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS (0x0000022CL) -#define DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS (0x0000022DL) - -#define DOMAIN_ALIAS_RID_MONITORING_USERS (0x0000022EL) -#define DOMAIN_ALIAS_RID_LOGGING_USERS (0x0000022FL) -#define DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS (0x00000230L) -#define DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS (0x00000231L) -#define DOMAIN_ALIAS_RID_DCOM_USERS (0x00000232L) -#define DOMAIN_ALIAS_RID_IUSERS (0x00000238L) -#define DOMAIN_ALIAS_RID_CRYPTO_OPERATORS (0x00000239L) -#define DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP (0x0000023BL) -#define DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP (0x0000023CL) -#define DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP (0x0000023DL) -#define DOMAIN_ALIAS_RID_CERTSVC_DCOM_ACCESS_GROUP (0x0000023EL) - - -#define SECURITY_MANDATORY_LABEL_AUTHORITY {0,0,0,0,0,16} -#define SECURITY_MANDATORY_UNTRUSTED_RID (0x00000000L) -#define SECURITY_MANDATORY_LOW_RID (0x00001000L) -#define SECURITY_MANDATORY_MEDIUM_RID (0x00002000L) -#define SECURITY_MANDATORY_HIGH_RID (0x00003000L) -#define SECURITY_MANDATORY_SYSTEM_RID (0x00004000L) -#define SECURITY_MANDATORY_PROTECTED_PROCESS_RID (0x00005000L) - -// -// SECURITY_MANDATORY_MAXIMUM_USER_RID is the highest RID that -// can be set by a usermode caller. -// -#define SECURITY_MANDATORY_MAXIMUM_USER_RID SECURITY_MANDATORY_SYSTEM_RID - -#define MANDATORY_LEVEL_TO_MANDATORY_RID(IL) (IL * 0x1000) - -// -// Allocate the System Luid. The first 1000 LUIDs are reserved. -// Use #999 here (0x3e7 = 999) -// -#define SYSTEM_LUID { 0x3e7, 0x0 } -#define ANONYMOUS_LOGON_LUID { 0x3e6, 0x0 } -#define LOCALSERVICE_LUID { 0x3e5, 0x0 } -#define NETWORKSERVICE_LUID { 0x3e4, 0x0 } -#define IUSER_LUID { 0x3e3, 0x0 } - - - -typedef struct _TOKEN_SOURCE { - CHAR SourceName[TOKEN_SOURCE_LENGTH]; - LUID SourceIdentifier; -} TOKEN_SOURCE,*PTOKEN_SOURCE; -typedef struct _TOKEN_CONTROL { - LUID TokenId; - LUID AuthenticationId; - LUID ModifiedId; - TOKEN_SOURCE TokenSource; -} TOKEN_CONTROL,*PTOKEN_CONTROL; -typedef struct _TOKEN_DEFAULT_DACL { - PACL DefaultDacl; -} TOKEN_DEFAULT_DACL,*PTOKEN_DEFAULT_DACL; -typedef struct _TOKEN_GROUPS { - ULONG GroupCount; - SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]; -} TOKEN_GROUPS,*PTOKEN_GROUPS,*LPTOKEN_GROUPS; -typedef struct _TOKEN_GROUPS_AND_PRIVILEGES { - ULONG SidCount; - ULONG SidLength; - PSID_AND_ATTRIBUTES Sids; - ULONG RestrictedSidCount; - ULONG RestrictedSidLength; - PSID_AND_ATTRIBUTES RestrictedSids; - ULONG PrivilegeCount; - ULONG PrivilegeLength; - PLUID_AND_ATTRIBUTES Privileges; - LUID AuthenticationId; -} TOKEN_GROUPS_AND_PRIVILEGES, *PTOKEN_GROUPS_AND_PRIVILEGES; -typedef struct _TOKEN_ORIGIN { - LUID OriginatingLogonSession; -} TOKEN_ORIGIN, *PTOKEN_ORIGIN; -typedef struct _TOKEN_OWNER { - PSID Owner; -} TOKEN_OWNER,*PTOKEN_OWNER; -typedef struct _TOKEN_PRIMARY_GROUP { - PSID PrimaryGroup; -} TOKEN_PRIMARY_GROUP,*PTOKEN_PRIMARY_GROUP; -typedef struct _TOKEN_PRIVILEGES { - ULONG PrivilegeCount; - LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]; -} TOKEN_PRIVILEGES,*PTOKEN_PRIVILEGES,*LPTOKEN_PRIVILEGES; -typedef enum tagTOKEN_TYPE { - TokenPrimary = 1, - TokenImpersonation -} TOKEN_TYPE,*PTOKEN_TYPE; -typedef struct _TOKEN_STATISTICS { - LUID TokenId; - LUID AuthenticationId; - LARGE_INTEGER ExpirationTime; - TOKEN_TYPE TokenType; - SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; - ULONG DynamicCharged; - ULONG DynamicAvailable; - ULONG GroupCount; - ULONG PrivilegeCount; - LUID ModifiedId; -} TOKEN_STATISTICS, *PTOKEN_STATISTICS; -typedef struct _TOKEN_USER { - SID_AND_ATTRIBUTES User; -} TOKEN_USER, *PTOKEN_USER; -typedef USHORT SECURITY_DESCRIPTOR_CONTROL,*PSECURITY_DESCRIPTOR_CONTROL; -typedef struct _SECURITY_DESCRIPTOR { - UCHAR Revision; - UCHAR Sbz1; - SECURITY_DESCRIPTOR_CONTROL Control; - PSID Owner; - PSID Group; - PACL Sacl; - PACL Dacl; -} SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR; - -#define SECURITY_DESCRIPTOR_MIN_LENGTH (sizeof(SECURITY_DESCRIPTOR)) - -typedef struct _OBJECT_TYPE_LIST { - USHORT Level; - USHORT Sbz; - GUID *ObjectType; - } OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST; - -typedef struct _SECURITY_DESCRIPTOR_RELATIVE { - UCHAR Revision; - UCHAR Sbz1; - SECURITY_DESCRIPTOR_CONTROL Control; - ULONG Owner; - ULONG Group; - ULONG Sacl; - ULONG Dacl; -} SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE; -typedef enum _TOKEN_INFORMATION_CLASS { - TokenUser=1,TokenGroups,TokenPrivileges,TokenOwner, - TokenPrimaryGroup,TokenDefaultDacl,TokenSource,TokenType, - TokenImpersonationLevel,TokenStatistics,TokenRestrictedSids, - TokenSessionId,TokenGroupsAndPrivileges,TokenSessionReference, - TokenSandBoxInert,TokenAuditPolicy,TokenOrigin, -} TOKEN_INFORMATION_CLASS; - -#define SYMLINK_FLAG_RELATIVE 1 - -typedef struct _REPARSE_DATA_BUFFER { - ULONG ReparseTag; - USHORT ReparseDataLength; - USHORT Reserved; - union { - struct { - USHORT SubstituteNameOffset; - USHORT SubstituteNameLength; - USHORT PrintNameOffset; - USHORT PrintNameLength; - ULONG Flags; - WCHAR PathBuffer[1]; - } SymbolicLinkReparseBuffer; - struct { - USHORT SubstituteNameOffset; - USHORT SubstituteNameLength; - USHORT PrintNameOffset; - USHORT PrintNameLength; - WCHAR PathBuffer[1]; - } MountPointReparseBuffer; - struct { - UCHAR DataBuffer[1]; - } GenericReparseBuffer; - }; -} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; - - - -// -// MicroSoft reparse point tags -// -#define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L) -#define IO_REPARSE_TAG_HSM (0xC0000004L) -#define IO_REPARSE_TAG_DRIVE_EXTENDER (0x80000005L) -#define IO_REPARSE_TAG_HSM2 (0x80000006L) -#define IO_REPARSE_TAG_SIS (0x80000007L) -#define IO_REPARSE_TAG_DFS (0x8000000AL) -#define IO_REPARSE_TAG_FILTER_MANAGER (0x8000000BL) -#define IO_REPARSE_TAG_SYMLINK (0xA000000CL) -#define IO_REPARSE_TAG_IIS_CACHE (0xA0000010L) -#define IO_REPARSE_TAG_DFSR (0x80000012L) - -// -// Reserved reparse tags -// -#define IO_REPARSE_TAG_RESERVED_ZERO (0) -#define IO_REPARSE_TAG_RESERVED_ONE (1) -#define IO_REPARSE_TAG_RESERVED_RANGE IO_REPARSE_TAG_RESERVED_ONE - - -#define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer) - -typedef struct _FILE_ACCESS_INFORMATION { - ACCESS_MASK AccessFlags; -} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION; - -typedef struct _FILE_ALLOCATION_INFORMATION { - LARGE_INTEGER AllocationSize; -} FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION; - -typedef struct _FILE_BOTH_DIR_INFORMATION { - ULONG NextEntryOffset; - ULONG FileIndex; - LARGE_INTEGER CreationTime; - LARGE_INTEGER LastAccessTime; - LARGE_INTEGER LastWriteTime; - LARGE_INTEGER ChangeTime; - LARGE_INTEGER EndOfFile; - LARGE_INTEGER AllocationSize; - ULONG FileAttributes; - ULONG FileNameLength; - ULONG EaSize; - CCHAR ShortNameLength; - WCHAR ShortName[12]; - WCHAR FileName[1]; -} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION; - -typedef struct _FILE_COMPLETION_INFORMATION { - HANDLE Port; - PVOID Key; -} FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION; - -typedef struct _FILE_COMPRESSION_INFORMATION { - LARGE_INTEGER CompressedFileSize; - USHORT CompressionFormat; - UCHAR CompressionUnitShift; - UCHAR ChunkShift; - UCHAR ClusterShift; - UCHAR Reserved[3]; -} FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION; - typedef struct _FILE_COPY_ON_WRITE_INFORMATION { BOOLEAN ReplaceIfExists; HANDLE RootDirectory; @@ -1056,20 +7066,6 @@ typedef struct _FILE_COPY_ON_WRITE_INFORMATION { WCHAR FileName[1]; } FILE_COPY_ON_WRITE_INFORMATION, *PFILE_COPY_ON_WRITE_INFORMATION; -typedef struct _FILE_DIRECTORY_INFORMATION { - ULONG NextEntryOffset; - ULONG FileIndex; - LARGE_INTEGER CreationTime; - LARGE_INTEGER LastAccessTime; - LARGE_INTEGER LastWriteTime; - LARGE_INTEGER ChangeTime; - LARGE_INTEGER EndOfFile; - LARGE_INTEGER AllocationSize; - ULONG FileAttributes; - ULONG FileNameLength; - WCHAR FileName[1]; -} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION; - typedef struct _FILE_FULL_DIRECTORY_INFORMATION { ULONG NextEntryOffset; ULONG FileIndex; @@ -1084,60 +7080,6 @@ typedef struct _FILE_FULL_DIRECTORY_INFORMATION { ULONG EaSize; WCHAR FileName[ANYSIZE_ARRAY]; } FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION; - -typedef struct _FILE_ID_FULL_DIR_INFORMATION { - ULONG NextEntryOffset; - ULONG FileIndex; - LARGE_INTEGER CreationTime; - LARGE_INTEGER LastAccessTime; - LARGE_INTEGER LastWriteTime; - LARGE_INTEGER ChangeTime; - LARGE_INTEGER EndOfFile; - LARGE_INTEGER AllocationSize; - ULONG FileAttributes; - ULONG FileNameLength; - ULONG EaSize; - LARGE_INTEGER FileId; - WCHAR FileName[1]; -} FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION; - -typedef struct _FILE_ID_BOTH_DIR_INFORMATION { - ULONG NextEntryOffset; - ULONG FileIndex; - LARGE_INTEGER CreationTime; - LARGE_INTEGER LastAccessTime; - LARGE_INTEGER LastWriteTime; - LARGE_INTEGER ChangeTime; - LARGE_INTEGER EndOfFile; - LARGE_INTEGER AllocationSize; - ULONG FileAttributes; - ULONG FileNameLength; - ULONG EaSize; - CCHAR ShortNameLength; - WCHAR ShortName[12]; - LARGE_INTEGER FileId; - WCHAR FileName[1]; -} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION; - -typedef struct _FILE_EA_INFORMATION { - ULONG EaSize; -} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION; - -typedef struct _FILE_FS_ATTRIBUTE_INFORMATION { - ULONG FileSystemAttributes; - ULONG MaximumComponentNameLength; - ULONG FileSystemNameLength; - WCHAR FileSystemName[1]; -} FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION; - -typedef struct _FILE_FS_CONTROL_INFORMATION { - LARGE_INTEGER FreeSpaceStartFiltering; - LARGE_INTEGER FreeSpaceThreshold; - LARGE_INTEGER FreeSpaceStopFiltering; - LARGE_INTEGER DefaultQuotaThreshold; - LARGE_INTEGER DefaultQuotaLimit; - ULONG FileSystemControlFlags; -} FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION; typedef struct _FILE_FS_FULL_SIZE_INFORMATION { LARGE_INTEGER TotalAllocationUnits; @@ -1182,95 +7124,6 @@ typedef struct _FILE_FS_OBJECTID_INFORMATION UCHAR ExtendedInfo[48]; } FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; -typedef struct _FILE_FS_DRIVER_PATH_INFORMATION -{ - BOOLEAN DriverInPath; - ULONG DriverNameLength; - WCHAR DriverName[1]; -} FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION; - -typedef struct _FILE_FULL_DIR_INFORMATION { - ULONG NextEntryOffset; - ULONG FileIndex; - LARGE_INTEGER CreationTime; - LARGE_INTEGER LastAccessTime; - LARGE_INTEGER LastWriteTime; - LARGE_INTEGER ChangeTime; - LARGE_INTEGER EndOfFile; - LARGE_INTEGER AllocationSize; - ULONG FileAttributes; - ULONG FileNameLength; - ULONG EaSize; - WCHAR FileName[1]; -} FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION; - -typedef struct _FILE_GET_EA_INFORMATION { - ULONG NextEntryOffset; - UCHAR EaNameLength; - CHAR EaName[1]; -} FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION; - -typedef struct _FILE_GET_QUOTA_INFORMATION { - ULONG NextEntryOffset; - ULONG SidLength; - SID Sid; -} FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION; - -typedef struct _FILE_QUOTA_INFORMATION -{ - ULONG NextEntryOffset; - ULONG SidLength; - LARGE_INTEGER ChangeTime; - LARGE_INTEGER QuotaUsed; - LARGE_INTEGER QuotaThreshold; - LARGE_INTEGER QuotaLimit; - SID Sid; -} FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION; - -typedef struct _FILE_INTERNAL_INFORMATION { - LARGE_INTEGER IndexNumber; -} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION; - -typedef struct _FILE_LINK_INFORMATION { - BOOLEAN ReplaceIfExists; - HANDLE RootDirectory; - ULONG FileNameLength; - WCHAR FileName[1]; -} FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION; - -typedef struct _FILE_LOCK_INFO -{ - LARGE_INTEGER StartingByte; - LARGE_INTEGER Length; - BOOLEAN ExclusiveLock; - ULONG Key; - PFILE_OBJECT FileObject; - PVOID ProcessId; - LARGE_INTEGER EndingByte; -} FILE_LOCK_INFO, *PFILE_LOCK_INFO; - -typedef struct _FILE_REPARSE_POINT_INFORMATION -{ - LONGLONG FileReference; - ULONG Tag; -} FILE_REPARSE_POINT_INFORMATION, *PFILE_REPARSE_POINT_INFORMATION; - -typedef struct _FILE_MOVE_CLUSTER_INFORMATION -{ - ULONG ClusterCount; - HANDLE RootDirectory; - ULONG FileNameLength; - WCHAR FileName[1]; -} FILE_MOVE_CLUSTER_INFORMATION, *PFILE_MOVE_CLUSTER_INFORMATION; - -typedef struct _FILE_NOTIFY_INFORMATION -{ - ULONG NextEntryOffset; - ULONG Action; - ULONG FileNameLength; - WCHAR FileName[1]; -} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION; - /* raw internal file lock struct returned from FsRtlGetNextFileLock */ typedef struct _FILE_SHARED_LOCK_ENTRY { PVOID Unknown1; @@ -1286,80 +7139,12 @@ typedef struct _FILE_EXCLUSIVE_LOCK_ENTRY { FILE_LOCK_INFO FileLock; } FILE_EXCLUSIVE_LOCK_ENTRY, *PFILE_EXCLUSIVE_LOCK_ENTRY; -typedef NTSTATUS (NTAPI *PCOMPLETE_LOCK_IRP_ROUTINE) ( - IN PVOID Context, - IN PIRP Irp -); - -typedef VOID (NTAPI *PUNLOCK_ROUTINE) ( - IN PVOID Context, - IN PFILE_LOCK_INFO FileLockInfo -); - -typedef struct _FILE_LOCK { - PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine; - PUNLOCK_ROUTINE UnlockRoutine; - BOOLEAN FastIoIsQuestionable; - BOOLEAN Pad[3]; - PVOID LockInformation; - FILE_LOCK_INFO LastReturnedLockInfo; - PVOID LastReturnedLock; -} FILE_LOCK, *PFILE_LOCK; - typedef struct _FILE_MAILSLOT_PEEK_BUFFER { ULONG ReadDataAvailable; ULONG NumberOfMessages; ULONG MessageLength; } FILE_MAILSLOT_PEEK_BUFFER, *PFILE_MAILSLOT_PEEK_BUFFER; -typedef struct _FILE_MAILSLOT_QUERY_INFORMATION { - ULONG MaximumMessageSize; - ULONG MailslotQuota; - ULONG NextMessageSize; - ULONG MessagesAvailable; - LARGE_INTEGER ReadTimeout; -} FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION; - -typedef struct _FILE_MAILSLOT_SET_INFORMATION { - PLARGE_INTEGER ReadTimeout; -} FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION; - -typedef struct _FILE_MODE_INFORMATION { - ULONG Mode; -} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION; - -typedef struct _FILE_ALL_INFORMATION { - FILE_BASIC_INFORMATION BasicInformation; - FILE_STANDARD_INFORMATION StandardInformation; - FILE_INTERNAL_INFORMATION InternalInformation; - FILE_EA_INFORMATION EaInformation; - FILE_ACCESS_INFORMATION AccessInformation; - FILE_POSITION_INFORMATION PositionInformation; - FILE_MODE_INFORMATION ModeInformation; - FILE_ALIGNMENT_INFORMATION AlignmentInformation; - FILE_NAME_INFORMATION NameInformation; -} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION; - -typedef struct _FILE_NAMES_INFORMATION { - ULONG NextEntryOffset; - ULONG FileIndex; - ULONG FileNameLength; - WCHAR FileName[1]; -} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION; - -typedef struct _FILE_OBJECTID_INFORMATION { - LONGLONG FileReference; - UCHAR ObjectId[16]; - _ANONYMOUS_UNION union { - struct { - UCHAR BirthVolumeId[16]; - UCHAR BirthObjectId[16]; - UCHAR DomainId[16]; - } ; - UCHAR ExtendedInfo[48]; - } DUMMYUNIONNAME; -} FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION; - typedef struct _FILE_OLE_CLASSID_INFORMATION { GUID ClassId; } FILE_OLE_CLASSID_INFORMATION, *PFILE_OLE_CLASSID_INFORMATION; @@ -1423,116 +7208,6 @@ typedef struct _FILE_OLE_STATE_BITS_INFORMATION { ULONG StateBitsMask; } FILE_OLE_STATE_BITS_INFORMATION, *PFILE_OLE_STATE_BITS_INFORMATION; -typedef struct _FILE_PIPE_ASSIGN_EVENT_BUFFER { - HANDLE EventHandle; - ULONG KeyValue; -} FILE_PIPE_ASSIGN_EVENT_BUFFER, *PFILE_PIPE_ASSIGN_EVENT_BUFFER; - -typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER { - PVOID ClientSession; - PVOID ClientProcess; -} FILE_PIPE_CLIENT_PROCESS_BUFFER, *PFILE_PIPE_CLIENT_PROCESS_BUFFER; - -typedef struct _FILE_PIPE_EVENT_BUFFER { - ULONG NamedPipeState; - ULONG EntryType; - ULONG ByteCount; - ULONG KeyValue; - ULONG NumberRequests; -} FILE_PIPE_EVENT_BUFFER, *PFILE_PIPE_EVENT_BUFFER; - -typedef struct _FILE_PIPE_PEEK_BUFFER -{ - ULONG NamedPipeState; - ULONG ReadDataAvailable; - ULONG NumberOfMessages; - ULONG MessageLength; - CHAR Data[1]; -} FILE_PIPE_PEEK_BUFFER, *PFILE_PIPE_PEEK_BUFFER; - -typedef struct _FILE_PIPE_INFORMATION { - ULONG ReadMode; - ULONG CompletionMode; -} FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION; - -typedef struct _FILE_PIPE_LOCAL_INFORMATION { - ULONG NamedPipeType; - ULONG NamedPipeConfiguration; - ULONG MaximumInstances; - ULONG CurrentInstances; - ULONG InboundQuota; - ULONG ReadDataAvailable; - ULONG OutboundQuota; - ULONG WriteQuotaAvailable; - ULONG NamedPipeState; - ULONG NamedPipeEnd; -} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION; - -typedef struct _FILE_PIPE_REMOTE_INFORMATION { - LARGE_INTEGER CollectDataTime; - ULONG MaximumCollectionCount; -} FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION; - -typedef struct _FILE_PIPE_WAIT_FOR_BUFFER { - LARGE_INTEGER Timeout; - ULONG NameLength; - BOOLEAN TimeoutSpecified; - WCHAR Name[1]; -} FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER; - -typedef struct _FILE_RENAME_INFORMATION { - BOOLEAN ReplaceIfExists; - HANDLE RootDirectory; - ULONG FileNameLength; - WCHAR FileName[1]; -} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION; - -typedef struct _FILE_STREAM_INFORMATION { - ULONG NextEntryOffset; - ULONG StreamNameLength; - LARGE_INTEGER StreamSize; - LARGE_INTEGER StreamAllocationSize; - WCHAR StreamName[1]; -} FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION; - -typedef struct _FILE_TRACKING_INFORMATION { - HANDLE DestinationFile; - ULONG ObjectInformationLength; - CHAR ObjectInformation[1]; -} FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION; - -#if (VER_PRODUCTBUILD >= 2195) -typedef struct _FILE_ZERO_DATA_INFORMATION { - LARGE_INTEGER FileOffset; - LARGE_INTEGER BeyondFinalZero; -} FILE_ZERO_DATA_INFORMATION, *PFILE_ZERO_DATA_INFORMATION; - -typedef struct FILE_ALLOCATED_RANGE_BUFFER { - LARGE_INTEGER FileOffset; - LARGE_INTEGER Length; -} FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER; -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -#define FSRTL_FCB_HEADER_V0 (0x00) -#define FSRTL_FCB_HEADER_V1 (0x01) - - -typedef struct _FSRTL_COMMON_FCB_HEADER { - CSHORT NodeTypeCode; - CSHORT NodeByteSize; - UCHAR Flags; - UCHAR IsFastIoPossible; -#if (VER_PRODUCTBUILD >= 1381) - UCHAR Flags2; - UCHAR Reserved; -#endif /* (VER_PRODUCTBUILD >= 1381) */ - PERESOURCE Resource; - PERESOURCE PagingIoResource; - LARGE_INTEGER AllocationSize; - LARGE_INTEGER FileSize; - LARGE_INTEGER ValidDataLength; -} FSRTL_COMMON_FCB_HEADER, *PFSRTL_COMMON_FCB_HEADER; - typedef enum _FSRTL_COMPARISON_RESULT { LessThan = -1, @@ -1542,25 +7217,6 @@ typedef enum _FSRTL_COMPARISON_RESULT #if (VER_PRODUCTBUILD >= 2600) -typedef struct _FSRTL_ADVANCED_FCB_HEADER { - CSHORT NodeTypeCode; - CSHORT NodeByteSize; - UCHAR Flags; - UCHAR IsFastIoPossible; - UCHAR Flags2; - UCHAR Reserved: 4; - UCHAR Version: 4; - PERESOURCE Resource; - PERESOURCE PagingIoResource; - LARGE_INTEGER AllocationSize; - LARGE_INTEGER FileSize; - LARGE_INTEGER ValidDataLength; - PFAST_MUTEX FastMutex; - LIST_ENTRY FilterContexts; - EX_PUSH_LOCK PushLock; - PVOID *FileContextSupportPointer; -} FSRTL_ADVANCED_FCB_HEADER, *PFSRTL_ADVANCED_FCB_HEADER; - typedef struct _FSRTL_PER_STREAM_CONTEXT { LIST_ENTRY Links; PVOID OwnerId; @@ -1597,16 +7253,6 @@ typedef struct _MCB LARGE_MCB DummyFieldThatSizesThisStructureCorrectly; } MCB, *PMCB; -typedef struct _GENERATE_NAME_CONTEXT { - USHORT Checksum; - BOOLEAN CheckSumInserted; - UCHAR NameLength; - WCHAR NameBuffer[8]; - ULONG ExtensionLength; - WCHAR ExtensionBuffer[4]; - ULONG LastIndexValue; -} GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT; - typedef struct _MAPPING_PAIR { ULONGLONG Vcn; ULONGLONG Lcn; @@ -1618,14 +7264,6 @@ typedef struct _GET_RETRIEVAL_DESCRIPTOR { MAPPING_PAIR Pair[1]; } GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR; -typedef struct _KQUEUE { - DISPATCHER_HEADER Header; - LIST_ENTRY EntryListHead; - ULONG CurrentCount; - ULONG MaximumCount; - LIST_ENTRY ThreadListHead; -} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE; - #define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject); typedef struct _MBCB { @@ -1690,12 +7328,6 @@ typedef struct _OBJECT_ALL_TYPES_INFO { OBJECT_TYPE_INFO ObjectsTypeInfo[1]; } OBJECT_ALL_TYPES_INFO, *POBJECT_ALL_TYPES_INFO; - -typedef struct _PATHNAME_BUFFER { - ULONG PathNameLength; - WCHAR Name[1]; -} PATHNAME_BUFFER, *PPATHNAME_BUFFER; - typedef enum _RTL_GENERIC_COMPARE_RESULTS { GenericLessThan, @@ -1773,21 +7405,6 @@ typedef struct _QUERY_PATH_RESPONSE { ULONG LengthAccepted; } QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE; -typedef struct _RETRIEVAL_POINTERS_BUFFER { - ULONG ExtentCount; - LARGE_INTEGER StartingVcn; - struct { - LARGE_INTEGER NextVcn; - LARGE_INTEGER Lcn; - } Extents[1]; -} RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER; - -typedef struct _RTL_SPLAY_LINKS { - struct _RTL_SPLAY_LINKS *Parent; - struct _RTL_SPLAY_LINKS *LeftChild; - struct _RTL_SPLAY_LINKS *RightChild; -} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS; - typedef struct _RTL_BALANCED_LINKS { struct _RTL_BALANCED_LINKS *Parent; @@ -1810,65 +7427,6 @@ typedef struct _RTL_GENERIC_TABLE PVOID TableContext; } RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; -typedef struct _UNICODE_PREFIX_TABLE_ENTRY -{ - CSHORT NodeTypeCode; - CSHORT NameLength; - struct _UNICODE_PREFIX_TABLE_ENTRY *NextPrefixTree; - struct _UNICODE_PREFIX_TABLE_ENTRY *CaseMatch; - RTL_SPLAY_LINKS Links; - PUNICODE_STRING Prefix; -} UNICODE_PREFIX_TABLE_ENTRY, *PUNICODE_PREFIX_TABLE_ENTRY; - -typedef struct _UNICODE_PREFIX_TABLE -{ - CSHORT NodeTypeCode; - CSHORT NameLength; - PUNICODE_PREFIX_TABLE_ENTRY NextPrefixTree; - PUNICODE_PREFIX_TABLE_ENTRY LastNextEntry; -} UNICODE_PREFIX_TABLE, *PUNICODE_PREFIX_TABLE; - -NTSYSAPI -VOID -NTAPI -RtlInitializeUnicodePrefix ( - IN PUNICODE_PREFIX_TABLE PrefixTable -); - -NTSYSAPI -BOOLEAN -NTAPI -RtlInsertUnicodePrefix ( - IN PUNICODE_PREFIX_TABLE PrefixTable, - IN PUNICODE_STRING Prefix, - IN PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry -); - -NTSYSAPI -VOID -NTAPI -RtlRemoveUnicodePrefix ( - IN PUNICODE_PREFIX_TABLE PrefixTable, - IN PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry -); - -NTSYSAPI -PUNICODE_PREFIX_TABLE_ENTRY -NTAPI -RtlFindUnicodePrefix ( - IN PUNICODE_PREFIX_TABLE PrefixTable, - IN PUNICODE_STRING FullName, - IN ULONG CaseInsensitiveIndex -); - -NTSYSAPI -PUNICODE_PREFIX_TABLE_ENTRY -NTAPI -RtlNextUnicodePrefix ( - IN PUNICODE_PREFIX_TABLE PrefixTable, - IN BOOLEAN Restart -); - #undef PRTL_GENERIC_COMPARE_ROUTINE #undef PRTL_GENERIC_ALLOCATE_ROUTINE #undef PRTL_GENERIC_FREE_ROUTINE @@ -1985,13 +7543,13 @@ typedef struct _PORT_MESSAGE } s2; ULONG ZeroInit; } u2; - union + __GNU_EXTENSION union { LPC_CLIENT_ID ClientId; double DoNotUseThisField; }; ULONG MessageId; - union + __GNU_EXTENSION union { LPC_SIZE_T ClientViewSize; ULONG CallbackId; @@ -2017,137 +7575,6 @@ typedef struct _REMOTE_PORT_VIEW LPC_PVOID ViewBase; } REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW; -typedef struct _SE_EXPORTS { - - LUID SeCreateTokenPrivilege; - LUID SeAssignPrimaryTokenPrivilege; - LUID SeLockMemoryPrivilege; - LUID SeIncreaseQuotaPrivilege; - LUID SeUnsolicitedInputPrivilege; - LUID SeTcbPrivilege; - LUID SeSecurityPrivilege; - LUID SeTakeOwnershipPrivilege; - LUID SeLoadDriverPrivilege; - LUID SeCreatePagefilePrivilege; - LUID SeIncreaseBasePriorityPrivilege; - LUID SeSystemProfilePrivilege; - LUID SeSystemtimePrivilege; - LUID SeProfileSingleProcessPrivilege; - LUID SeCreatePermanentPrivilege; - LUID SeBackupPrivilege; - LUID SeRestorePrivilege; - LUID SeShutdownPrivilege; - LUID SeDebugPrivilege; - LUID SeAuditPrivilege; - LUID SeSystemEnvironmentPrivilege; - LUID SeChangeNotifyPrivilege; - LUID SeRemoteShutdownPrivilege; - - PSID SeNullSid; - PSID SeWorldSid; - PSID SeLocalSid; - PSID SeCreatorOwnerSid; - PSID SeCreatorGroupSid; - - PSID SeNtAuthoritySid; - PSID SeDialupSid; - PSID SeNetworkSid; - PSID SeBatchSid; - PSID SeInteractiveSid; - PSID SeLocalSystemSid; - PSID SeAliasAdminsSid; - PSID SeAliasUsersSid; - PSID SeAliasGuestsSid; - PSID SeAliasPowerUsersSid; - PSID SeAliasAccountOpsSid; - PSID SeAliasSystemOpsSid; - PSID SeAliasPrintOpsSid; - PSID SeAliasBackupOpsSid; - - PSID SeAuthenticatedUsersSid; - - PSID SeRestrictedSid; - PSID SeAnonymousLogonSid; - - LUID SeUndockPrivilege; - LUID SeSyncAgentPrivilege; - LUID SeEnableDelegationPrivilege; - -} SE_EXPORTS, *PSE_EXPORTS; - -extern PSE_EXPORTS SeExports; - -typedef struct -{ - LARGE_INTEGER StartingLcn; -} STARTING_LCN_INPUT_BUFFER, *PSTARTING_LCN_INPUT_BUFFER; - -typedef struct _STARTING_VCN_INPUT_BUFFER { - LARGE_INTEGER StartingVcn; -} STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER; - -typedef struct _SECURITY_CLIENT_CONTEXT { - SECURITY_QUALITY_OF_SERVICE SecurityQos; - PACCESS_TOKEN ClientToken; - BOOLEAN DirectlyAccessClientToken; - BOOLEAN DirectAccessEffectiveOnly; - BOOLEAN ServerIsRemote; - TOKEN_CONTROL ClientTokenControl; -} SECURITY_CLIENT_CONTEXT, *PSECURITY_CLIENT_CONTEXT; - -// -// The following are the inherit flags that go into the AceFlags field -// of an Ace header. -// -#define OBJECT_INHERIT_ACE (0x1) -#define CONTAINER_INHERIT_ACE (0x2) -#define NO_PROPAGATE_INHERIT_ACE (0x4) -#define INHERIT_ONLY_ACE (0x8) -#define INHERITED_ACE (0x10) -#define VALID_INHERIT_FLAGS (0x1F) - -typedef struct _ACE_HEADER -{ - UCHAR AceType; - UCHAR AceFlags; - USHORT AceSize; -} ACE_HEADER, *PACE_HEADER; - -typedef struct _ACCESS_ALLOWED_ACE -{ - ACE_HEADER Header; - ACCESS_MASK Mask; - ULONG SidStart; -} ACCESS_ALLOWED_ACE, *PACCESS_ALLOWED_ACE; - -typedef struct _ACCESS_DENIED_ACE -{ - ACE_HEADER Header; - ACCESS_MASK Mask; - ULONG SidStart; -} ACCESS_DENIED_ACE, *PACCESS_DENIED_ACE; - -typedef struct _SYSTEM_AUDIT_ACE -{ - ACE_HEADER Header; - ACCESS_MASK Mask; - ULONG SidStart; -} SYSTEM_AUDIT_ACE, *PSYSTEM_AUDIT_ACE; - -typedef struct _SYSTEM_ALARM_ACE -{ - ACE_HEADER Header; - ACCESS_MASK Mask; - ULONG SidStart; -} SYSTEM_ALARM_ACE, *PSYSTEM_ALARM_ACE; - -typedef struct _SYSTEM_MANDATORY_LABEL_ACE -{ - ACE_HEADER Header; - ACCESS_MASK Mask; - ULONG SidStart; -} SYSTEM_MANDATORY_LABEL_ACE, *PSYSTEM_MANDATORY_LABEL_ACE; - typedef struct _TUNNEL { FAST_MUTEX Mutex; PRTL_SPLAY_LINKS Cache; @@ -2169,13 +7596,6 @@ typedef struct _VAD_HEADER { LIST_ENTRY Secured; } VAD_HEADER, *PVAD_HEADER; -typedef struct -{ - LARGE_INTEGER StartingLcn; - LARGE_INTEGER BitmapSize; - UCHAR Buffer[1]; -} VOLUME_BITMAP_BUFFER, *PVOLUME_BITMAP_BUFFER; - #if (VER_PRODUCTBUILD >= 2600) typedef BOOLEAN @@ -2184,114 +7604,8 @@ typedef BOOLEAN IN PVOID FilterContext ); -typedef enum _FS_FILTER_SECTION_SYNC_TYPE { - SyncTypeOther = 0, - SyncTypeCreateSection -} FS_FILTER_SECTION_SYNC_TYPE, *PFS_FILTER_SECTION_SYNC_TYPE; - -typedef enum _FS_FILTER_STREAM_FO_NOTIFICATION_TYPE { - NotifyTypeCreate = 0, - NotifyTypeRetired -} FS_FILTER_STREAM_FO_NOTIFICATION_TYPE, *PFS_FILTER_STREAM_FO_NOTIFICATION_TYPE; - -typedef union _FS_FILTER_PARAMETERS { - struct { - PLARGE_INTEGER EndingOffset; - PERESOURCE *ResourceToRelease; - } AcquireForModifiedPageWriter; - - struct { - PERESOURCE ResourceToRelease; - } ReleaseForModifiedPageWriter; - - struct { - FS_FILTER_SECTION_SYNC_TYPE SyncType; - ULONG PageProtection; - } AcquireForSectionSynchronization; - - struct { - FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType; - BOOLEAN POINTER_ALIGNMENT SafeToRecurse; - } NotifyStreamFileObject; - - struct { - PVOID Argument1; - PVOID Argument2; - PVOID Argument3; - PVOID Argument4; - PVOID Argument5; - } Others; -} FS_FILTER_PARAMETERS, *PFS_FILTER_PARAMETERS; - -typedef struct _FS_FILTER_CALLBACK_DATA { - ULONG SizeOfFsFilterCallbackData; - UCHAR Operation; - UCHAR Reserved; - struct _DEVICE_OBJECT *DeviceObject; - struct _FILE_OBJECT *FileObject; - FS_FILTER_PARAMETERS Parameters; -} FS_FILTER_CALLBACK_DATA, *PFS_FILTER_CALLBACK_DATA; - -typedef NTSTATUS -(NTAPI *PFS_FILTER_CALLBACK) ( - IN PFS_FILTER_CALLBACK_DATA Data, - OUT PVOID *CompletionContext -); - -typedef VOID -(NTAPI *PFS_FILTER_COMPLETION_CALLBACK) ( - IN PFS_FILTER_CALLBACK_DATA Data, - IN NTSTATUS OperationStatus, - IN PVOID CompletionContext -); - -typedef struct _FS_FILTER_CALLBACKS { - ULONG SizeOfFsFilterCallbacks; - ULONG Reserved; - PFS_FILTER_CALLBACK PreAcquireForSectionSynchronization; - PFS_FILTER_COMPLETION_CALLBACK PostAcquireForSectionSynchronization; - PFS_FILTER_CALLBACK PreReleaseForSectionSynchronization; - PFS_FILTER_COMPLETION_CALLBACK PostReleaseForSectionSynchronization; - PFS_FILTER_CALLBACK PreAcquireForCcFlush; - PFS_FILTER_COMPLETION_CALLBACK PostAcquireForCcFlush; - PFS_FILTER_CALLBACK PreReleaseForCcFlush; - PFS_FILTER_COMPLETION_CALLBACK PostReleaseForCcFlush; - PFS_FILTER_CALLBACK PreAcquireForModifiedPageWriter; - PFS_FILTER_COMPLETION_CALLBACK PostAcquireForModifiedPageWriter; - PFS_FILTER_CALLBACK PreReleaseForModifiedPageWriter; - PFS_FILTER_COMPLETION_CALLBACK PostReleaseForModifiedPageWriter; -} FS_FILTER_CALLBACKS, *PFS_FILTER_CALLBACKS; - -typedef struct _READ_LIST { - PFILE_OBJECT FileObject; - ULONG NumberOfEntries; - LOGICAL IsImage; - FILE_SEGMENT_ELEMENT List[ANYSIZE_ARRAY]; -} READ_LIST, *PREAD_LIST; - #endif -typedef NTSTATUS -(NTAPI * PRTL_HEAP_COMMIT_ROUTINE) ( - IN PVOID Base, - IN OUT PVOID *CommitAddress, - IN OUT PSIZE_T CommitSize -); - -typedef struct _RTL_HEAP_PARAMETERS { - ULONG Length; - SIZE_T SegmentReserve; - SIZE_T SegmentCommit; - SIZE_T DeCommitFreeBlockThreshold; - SIZE_T DeCommitTotalFreeThreshold; - SIZE_T MaximumAllocationSize; - SIZE_T VirtualMemoryThreshold; - SIZE_T InitialCommit; - SIZE_T InitialReserve; - PRTL_HEAP_COMMIT_ROUTINE CommitRoutine; - SIZE_T Reserved[2]; -} RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS; - NTKERNELAPI BOOLEAN NTAPI @@ -2734,21 +8048,6 @@ CcZeroData ( IN BOOLEAN Wait ); -NTKERNELAPI -VOID -NTAPI -ExDisableResourceBoostLite ( - IN PERESOURCE Resource -); - -NTKERNELAPI -SIZE_T -NTAPI -ExQueryPoolBlockSize ( - IN PVOID PoolBlock, - OUT PBOOLEAN QuotaCharged -); - #if (VER_PRODUCTBUILD >= 2600) #ifndef __NTOSKRNL__ @@ -2871,17 +8170,6 @@ FsRtlAddToTunnelCache ( IN PVOID Data ); -#if (VER_PRODUCTBUILD >= 2195) - -PFILE_LOCK -NTAPI -FsRtlAllocateFileLock ( - IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL, - IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - NTKERNELAPI PVOID NTAPI @@ -2930,36 +8218,6 @@ FsRtlAreNamesEqual ( ((FL)->FastIoIsQuestionable) \ ) -/* - FsRtlCheckLockForReadAccess: - - All this really does is pick out the lock parameters from the irp (io stack - location?), get IoGetRequestorProcess, and pass values on to - FsRtlFastCheckLockForRead. -*/ -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlCheckLockForReadAccess ( - IN PFILE_LOCK FileLock, - IN PIRP Irp -); - -/* - FsRtlCheckLockForWriteAccess: - - All this really does is pick out the lock parameters from the irp (io stack - location?), get IoGetRequestorProcess, and pass values on to - FsRtlFastCheckLockForWrite. -*/ -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlCheckLockForWriteAccess ( - IN PFILE_LOCK FileLock, - IN PIRP Irp -); - typedef VOID (NTAPI*POPLOCK_WAIT_COMPLETE_ROUTINE) ( @@ -2985,59 +8243,6 @@ FsRtlCheckOplock ( IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL ); -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlCopyRead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlCopyWrite ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - IN PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject -); - -#define HEAP_NO_SERIALIZE 0x00000001 -#define HEAP_GROWABLE 0x00000002 -#define HEAP_GENERATE_EXCEPTIONS 0x00000004 -#define HEAP_ZERO_MEMORY 0x00000008 -#define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010 -#define HEAP_TAIL_CHECKING_ENABLED 0x00000020 -#define HEAP_FREE_CHECKING_ENABLED 0x00000040 -#define HEAP_DISABLE_COALESCE_ON_FREE 0x00000080 - -#define HEAP_CREATE_ALIGN_16 0x00010000 -#define HEAP_CREATE_ENABLE_TRACING 0x00020000 -#define HEAP_CREATE_ENABLE_EXECUTE 0x00040000 - -NTSYSAPI -PVOID -NTAPI -RtlCreateHeap ( - IN ULONG Flags, - IN PVOID HeapBase OPTIONAL, - IN SIZE_T ReserveSize OPTIONAL, - IN SIZE_T CommitSize OPTIONAL, - IN PVOID Lock OPTIONAL, - IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL -); - NTKERNELAPI BOOLEAN NTAPI @@ -3067,13 +8272,6 @@ FsRtlDeregisterUncProvider ( IN HANDLE Handle ); -NTSYSAPI -PVOID -NTAPI -RtlDestroyHeap( - IN PVOID HeapHandle -); - NTKERNELAPI VOID NTAPI @@ -3126,72 +8324,10 @@ FsRtlIsFatDbcsLegal ( #define FsRtlExitFileSystem KeLeaveCriticalRegion -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlFastCheckLockForRead ( - IN PFILE_LOCK FileLock, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - IN ULONG Key, - IN PFILE_OBJECT FileObject, - IN PVOID Process -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlFastCheckLockForWrite ( - IN PFILE_LOCK FileLock, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - IN ULONG Key, - IN PFILE_OBJECT FileObject, - IN PVOID Process -); - #define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) ( \ FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11) \ ) -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlFastUnlockAll ( - IN PFILE_LOCK FileLock, - IN PFILE_OBJECT FileObject, - IN PEPROCESS Process, - IN PVOID Context OPTIONAL -); -/* ret: STATUS_RANGE_NOT_LOCKED */ - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlFastUnlockAllByKey ( - IN PFILE_LOCK FileLock, - IN PFILE_OBJECT FileObject, - IN PEPROCESS Process, - IN ULONG Key, - IN PVOID Context OPTIONAL -); -/* ret: STATUS_RANGE_NOT_LOCKED */ - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlFastUnlockSingle ( - IN PFILE_LOCK FileLock, - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - IN PEPROCESS Process, - IN ULONG Key, - IN PVOID Context OPTIONAL, - IN BOOLEAN AlreadySynchronized -); -/* ret: STATUS_RANGE_NOT_LOCKED */ - NTKERNELAPI BOOLEAN NTAPI @@ -3205,25 +8341,6 @@ FsRtlFindInTunnelCache ( OUT PVOID Data ); -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -VOID -NTAPI -FsRtlFreeFileLock ( - IN PFILE_LOCK FileLock -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlGetFileSize ( - IN PFILE_OBJECT FileObject, - IN OUT PLARGE_INTEGER FileSize -); - NTKERNELAPI BOOLEAN NTAPI @@ -3235,26 +8352,6 @@ FsRtlGetNextBaseMcbEntry ( OUT PLONGLONG SectorCount ); -/* - FsRtlGetNextFileLock: - - ret: NULL if no more locks - - Internals: - FsRtlGetNextFileLock uses FileLock->LastReturnedLockInfo and - FileLock->LastReturnedLock as storage. - LastReturnedLock is a pointer to the 'raw' lock inkl. double linked - list, and FsRtlGetNextFileLock needs this to get next lock on subsequent - calls with Restart = FALSE. -*/ -NTKERNELAPI -PFILE_LOCK_INFO -NTAPI -FsRtlGetNextFileLock ( - IN PFILE_LOCK FileLock, - IN BOOLEAN Restart -); - NTKERNELAPI BOOLEAN NTAPI @@ -3289,15 +8386,6 @@ FsRtlInitializeBaseMcb ( IN POOL_TYPE PoolType ); -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeFileLock ( - IN PFILE_LOCK FileLock, - IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL, - IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL -); - NTKERNELAPI VOID NTAPI @@ -3507,19 +8595,6 @@ FsRtlLookupPerStreamContextInternal ( IN PVOID InstanceId OPTIONAL ); -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlMdlReadDev ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject -); - NTKERNELAPI BOOLEAN NTAPI @@ -3528,28 +8603,6 @@ FsRtlMdlReadComplete ( IN PMDL MdlChain ); -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlMdlReadCompleteDev ( - IN PFILE_OBJECT FileObject, - IN PMDL MdlChain, - IN PDEVICE_OBJECT DeviceObject -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlPrepareMdlWriteDev ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject -); - NTKERNELAPI BOOLEAN NTAPI @@ -3559,16 +8612,6 @@ FsRtlMdlWriteComplete ( IN PMDL MdlChain ); -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlMdlWriteCompleteDev ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain, - IN PDEVICE_OBJECT DeviceObject -); - NTKERNELAPI NTSTATUS NTAPI @@ -3754,63 +8797,6 @@ FsRtlPostStackOverflow ( IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine ); -/* - FsRtlPrivateLock: - - ret: IoStatus->Status: STATUS_PENDING, STATUS_LOCK_NOT_GRANTED - - Internals: - -Calls IoCompleteRequest if Irp - -Uses exception handling / ExRaiseStatus with STATUS_INSUFFICIENT_RESOURCES -*/ -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlPrivateLock ( - IN PFILE_LOCK FileLock, - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - IN PEPROCESS Process, - IN ULONG Key, - IN BOOLEAN FailImmediately, - IN BOOLEAN ExclusiveLock, - OUT PIO_STATUS_BLOCK IoStatus, - IN PIRP Irp OPTIONAL, - IN PVOID Context, - IN BOOLEAN AlreadySynchronized -); - -/* - FsRtlProcessFileLock: - - ret: - -STATUS_INVALID_DEVICE_REQUEST - -STATUS_RANGE_NOT_LOCKED from unlock routines. - -STATUS_PENDING, STATUS_LOCK_NOT_GRANTED from FsRtlPrivateLock - (redirected IoStatus->Status). - - Internals: - -switch ( Irp->CurrentStackLocation->MinorFunction ) - lock: return FsRtlPrivateLock; - unlocksingle: return FsRtlFastUnlockSingle; - unlockall: return FsRtlFastUnlockAll; - unlockallbykey: return FsRtlFastUnlockAllByKey; - default: IofCompleteRequest with STATUS_INVALID_DEVICE_REQUEST; - return STATUS_INVALID_DEVICE_REQUEST; - - -'AllwaysZero' is passed thru as 'AllwaysZero' to lock / unlock routines. - -'Irp' is passet thru as 'Irp' to FsRtlPrivateLock. -*/ -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlProcessFileLock ( - IN PFILE_LOCK FileLock, - IN PIRP Irp, - IN PVOID Context OPTIONAL -); - NTKERNELAPI NTSTATUS NTAPI @@ -3926,13 +8912,6 @@ FsRtlUninitializeBaseMcb ( IN PBASE_MCB Mcb ); -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeFileLock ( - IN PFILE_LOCK FileLock -); - NTKERNELAPI VOID NTAPI @@ -3954,14 +8933,6 @@ FsRtlUninitializeOplock ( IN OUT POPLOCK Oplock ); -NTKERNELAPI -UCHAR -NTAPI -KeSetIdealProcessorThread( - IN OUT PKTHREAD Thread, - IN UCHAR Processor -); - NTKERNELAPI NTSTATUS NTAPI @@ -3971,551 +8942,6 @@ IoAttachDeviceToDeviceStackSafe( OUT PDEVICE_OBJECT *AttachedToDeviceObject ); -NTKERNELAPI -VOID -NTAPI -IoAcquireVpbSpinLock ( - OUT PKIRQL Irql -); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCheckDesiredAccess ( - IN OUT PACCESS_MASK DesiredAccess, - IN ACCESS_MASK GrantedAccess -); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCheckEaBufferValidity ( - IN PFILE_FULL_EA_INFORMATION EaBuffer, - IN ULONG EaLength, - OUT PULONG ErrorOffset -); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCheckFunctionAccess ( - IN ACCESS_MASK GrantedAccess, - IN UCHAR MajorFunction, - IN UCHAR MinorFunction, - IN ULONG IoControlCode, - IN PVOID Argument1 OPTIONAL, - IN PVOID Argument2 OPTIONAL -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -NTSTATUS -NTAPI -IoCheckQuotaBufferValidity ( - IN PFILE_QUOTA_INFORMATION QuotaBuffer, - IN ULONG QuotaLength, - OUT PULONG ErrorOffset -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -PFILE_OBJECT -NTAPI -IoCreateStreamFileObject ( - IN PFILE_OBJECT FileObject OPTIONAL, - IN PDEVICE_OBJECT DeviceObject OPTIONAL -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -PFILE_OBJECT -NTAPI -IoCreateStreamFileObjectLite ( - IN PFILE_OBJECT FileObject OPTIONAL, - IN PDEVICE_OBJECT DeviceObject OPTIONAL -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -BOOLEAN -NTAPI -IoFastQueryNetworkAttributes ( - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN ACCESS_MASK DesiredAccess, - IN ULONG OpenOptions, - OUT PIO_STATUS_BLOCK IoStatus, - OUT PFILE_NETWORK_OPEN_INFORMATION Buffer -); - -NTKERNELAPI -PDEVICE_OBJECT -NTAPI -IoGetAttachedDevice ( - IN PDEVICE_OBJECT DeviceObject -); - -NTKERNELAPI -PDEVICE_OBJECT -NTAPI -IoGetBaseFileSystemDeviceObject ( - IN PFILE_OBJECT FileObject -); - -#if (VER_PRODUCTBUILD >= 2600) - -NTKERNELAPI -PDEVICE_OBJECT -NTAPI -IoGetDeviceAttachmentBaseRef ( - IN PDEVICE_OBJECT DeviceObject -); - -NTKERNELAPI -NTSTATUS -NTAPI -IoGetDiskDeviceObject ( - IN PDEVICE_OBJECT FileSystemDeviceObject, - OUT PDEVICE_OBJECT *DiskDeviceObject -); - -NTKERNELAPI -PDEVICE_OBJECT -NTAPI -IoGetLowerDeviceObject ( - IN PDEVICE_OBJECT DeviceObject -); - -#endif /* (VER_PRODUCTBUILD >= 2600) */ - -NTKERNELAPI -PEPROCESS -NTAPI -IoGetRequestorProcess ( - IN PIRP Irp -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -ULONG -NTAPI -IoGetRequestorProcessId ( - IN PIRP Irp -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -PIRP -NTAPI -IoGetTopLevelIrp ( - VOID -); - -#define IoIsFileOpenedExclusively(FileObject) ( \ - (BOOLEAN) !( \ - (FileObject)->SharedRead || \ - (FileObject)->SharedWrite || \ - (FileObject)->SharedDelete \ - ) \ -) - -NTKERNELAPI -BOOLEAN -NTAPI -IoIsOperationSynchronous ( - IN PIRP Irp -); - -NTKERNELAPI -BOOLEAN -NTAPI -IoIsSystemThread ( - IN PETHREAD Thread -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -BOOLEAN -NTAPI -IoIsValidNameGraftingBuffer ( - IN PIRP Irp, - IN PREPARSE_DATA_BUFFER ReparseBuffer -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -NTSTATUS -NTAPI -IoPageRead ( - IN PFILE_OBJECT FileObject, - IN PMDL Mdl, - IN PLARGE_INTEGER Offset, - IN PKEVENT Event, - OUT PIO_STATUS_BLOCK IoStatusBlock -); - -NTKERNELAPI -NTSTATUS -NTAPI -IoQueryFileInformation ( - IN PFILE_OBJECT FileObject, - IN FILE_INFORMATION_CLASS FileInformationClass, - IN ULONG Length, - OUT PVOID FileInformation, - OUT PULONG ReturnedLength -); - -NTKERNELAPI -NTSTATUS -NTAPI -IoQueryVolumeInformation ( - IN PFILE_OBJECT FileObject, - IN FS_INFORMATION_CLASS FsInformationClass, - IN ULONG Length, - OUT PVOID FsInformation, - OUT PULONG ReturnedLength -); - -NTKERNELAPI -VOID -NTAPI -IoQueueThreadIrp( - IN PIRP Irp -); - -NTKERNELAPI -VOID -NTAPI -IoRegisterFileSystem ( - IN OUT PDEVICE_OBJECT DeviceObject -); - -#if (VER_PRODUCTBUILD >= 1381) - -typedef VOID (NTAPI *PDRIVER_FS_NOTIFICATION) ( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN DriverActive -); - -NTKERNELAPI -NTSTATUS -NTAPI -IoRegisterFsRegistrationChange ( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine -); - -#endif /* (VER_PRODUCTBUILD >= 1381) */ - -NTKERNELAPI -VOID -NTAPI -IoReleaseVpbSpinLock ( - IN KIRQL Irql -); - -NTKERNELAPI -VOID -NTAPI -IoSetDeviceToVerify ( - IN PETHREAD Thread, - IN PDEVICE_OBJECT DeviceObject -); - -NTKERNELAPI -NTSTATUS -NTAPI -IoSetInformation ( - IN PFILE_OBJECT FileObject, - IN FILE_INFORMATION_CLASS FileInformationClass, - IN ULONG Length, - IN PVOID FileInformation -); - -NTKERNELAPI -VOID -NTAPI -IoSetTopLevelIrp ( - IN PIRP Irp -); - -NTKERNELAPI -NTSTATUS -NTAPI -IoSynchronousPageWrite ( - IN PFILE_OBJECT FileObject, - IN PMDL Mdl, - IN PLARGE_INTEGER FileOffset, - IN PKEVENT Event, - OUT PIO_STATUS_BLOCK IoStatusBlock -); - -NTKERNELAPI -PEPROCESS -NTAPI -IoThreadToProcess ( - IN PETHREAD Thread -); - -NTKERNELAPI -VOID -NTAPI -IoUnregisterFileSystem ( - IN OUT PDEVICE_OBJECT DeviceObject -); - -#if (VER_PRODUCTBUILD >= 1381) - -NTKERNELAPI -VOID -NTAPI -IoUnregisterFsRegistrationChange ( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine -); - -#endif /* (VER_PRODUCTBUILD >= 1381) */ - -NTKERNELAPI -NTSTATUS -NTAPI -IoVerifyVolume ( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN AllowRawMount -); - -#if !defined (_M_AMD64) - -NTHALAPI -KIRQL -FASTCALL -KeAcquireQueuedSpinLock ( - IN KSPIN_LOCK_QUEUE_NUMBER Number -); - -NTHALAPI -VOID -FASTCALL -KeReleaseQueuedSpinLock ( - IN KSPIN_LOCK_QUEUE_NUMBER Number, - IN KIRQL OldIrql -); - -NTHALAPI -KIRQL -FASTCALL -KeAcquireSpinLockRaiseToSynch( - IN OUT PKSPIN_LOCK SpinLock -); - -NTHALAPI -LOGICAL -FASTCALL -KeTryToAcquireQueuedSpinLock( - KSPIN_LOCK_QUEUE_NUMBER Number, - PKIRQL OldIrql); - -#else - -NTKERNELAPI -KIRQL -FASTCALL -KeAcquireQueuedSpinLock ( - IN KSPIN_LOCK_QUEUE_NUMBER Number -); - -NTKERNELAPI -VOID -FASTCALL -KeReleaseQueuedSpinLock ( - IN KSPIN_LOCK_QUEUE_NUMBER Number, - IN KIRQL OldIrql -); - -NTKERNELAPI -KIRQL -KeAcquireSpinLockRaiseToSynch( - IN OUT PKSPIN_LOCK SpinLock -); - -NTKERNELAPI -LOGICAL -KeTryToAcquireQueuedSpinLock( - KSPIN_LOCK_QUEUE_NUMBER Number, - PKIRQL OldIrql); - -#endif - -NTKERNELAPI -VOID -NTAPI -KeAttachProcess ( - IN PKPROCESS Process -); - -NTKERNELAPI -VOID -NTAPI -KeDetachProcess ( - VOID -); - -NTKERNELAPI -VOID -NTAPI -KeInitializeQueue ( - IN PRKQUEUE Queue, - IN ULONG Count OPTIONAL -); - -NTKERNELAPI -LONG -NTAPI -KeInsertHeadQueue ( - IN PRKQUEUE Queue, - IN PLIST_ENTRY Entry -); - -NTKERNELAPI -LONG -NTAPI -KeInsertQueue ( - IN PRKQUEUE Queue, - IN PLIST_ENTRY Entry -); - -NTKERNELAPI -LONG -NTAPI -KeReadStateQueue ( - IN PRKQUEUE Queue -); - -NTKERNELAPI -PLIST_ENTRY -NTAPI -KeRemoveQueue ( - IN PRKQUEUE Queue, - IN KPROCESSOR_MODE WaitMode, - IN PLARGE_INTEGER Timeout OPTIONAL -); - -NTKERNELAPI -PLIST_ENTRY -NTAPI -KeRundownQueue ( - IN PRKQUEUE Queue -); - -NTKERNELAPI -VOID -NTAPI -KeInitializeMutant ( - IN PRKMUTANT Mutant, - IN BOOLEAN InitialOwner -); - -NTKERNELAPI -LONG -NTAPI -KeReadStateMutant ( - IN PRKMUTANT Mutant -); - -NTKERNELAPI -LONG -NTAPI -KeReleaseMutant ( - IN PRKMUTANT Mutant, - IN KPRIORITY Increment, - IN BOOLEAN Abandoned, - IN BOOLEAN Wait -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -VOID -NTAPI -KeStackAttachProcess ( - IN PKPROCESS Process, - OUT PKAPC_STATE ApcState -); - -NTKERNELAPI -VOID -NTAPI -KeUnstackDetachProcess ( - IN PKAPC_STATE ApcState -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -BOOLEAN -NTAPI -KeSetKernelStackSwapEnable( - IN BOOLEAN Enable -); - -NTKERNELAPI -BOOLEAN -NTAPI -MmCanFileBeTruncated ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER NewFileSize -); - -NTKERNELAPI -BOOLEAN -NTAPI -MmFlushImageSection ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN MMFLUSH_TYPE FlushType -); - -NTKERNELAPI -BOOLEAN -NTAPI -MmForceSectionClosed ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN BOOLEAN DelayClose -); - -#if (VER_PRODUCTBUILD >= 1381) - -NTKERNELAPI -BOOLEAN -NTAPI -MmIsRecursiveIoFault ( - VOID -); - -#else - -#define MmIsRecursiveIoFault() ( \ - (PsGetCurrentThread()->DisablePageFaultClustering) | \ - (PsGetCurrentThread()->ForwardClusterOnly) \ -) - -#endif - - -NTKERNELAPI -BOOLEAN -NTAPI -MmSetAddressRangeModified ( - IN PVOID Address, - IN SIZE_T Length -); - NTKERNELAPI NTSTATUS NTAPI @@ -4538,56 +8964,6 @@ ObGetObjectPointerCount ( IN PVOID Object ); -NTKERNELAPI -NTSTATUS -NTAPI -ObInsertObject ( - IN PVOID Object, - IN PACCESS_STATE PassedAccessState OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN ULONG AdditionalReferences, - OUT PVOID *ReferencedObject OPTIONAL, - OUT PHANDLE Handle -); - -NTKERNELAPI -VOID -NTAPI -ObMakeTemporaryObject ( - IN PVOID Object -); - -NTKERNELAPI -NTSTATUS -NTAPI -ObOpenObjectByPointer ( - IN PVOID Object, - IN ULONG HandleAttributes, - IN PACCESS_STATE PassedAccessState OPTIONAL, - IN ACCESS_MASK DesiredAccess OPTIONAL, - IN POBJECT_TYPE ObjectType OPTIONAL, - IN KPROCESSOR_MODE AccessMode, - OUT PHANDLE Handle -); - -NTKERNELAPI -NTSTATUS -NTAPI -ObQueryNameString ( - IN PVOID Object, - OUT POBJECT_NAME_INFORMATION ObjectNameInfo, - IN ULONG Length, - OUT PULONG ReturnLength -); - -NTKERNELAPI -NTSTATUS -NTAPI -ObQueryObjectAuditingByHandle ( - IN HANDLE Handle, - OUT PBOOLEAN GenerateOnClose -); - NTKERNELAPI NTSTATUS NTAPI @@ -4602,31 +8978,22 @@ ObReferenceObjectByName ( OUT PVOID *Object ); -NTKERNELAPI -NTSTATUS -NTAPI -PsAssignImpersonationToken ( - IN PETHREAD Thread, - IN HANDLE Token -); - -NTKERNELAPI -VOID -NTAPI -PsChargePoolQuota ( - IN PEPROCESS Process, - IN POOL_TYPE PoolType, - IN SIZE_T Amount -); +#if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI NTSTATUS NTAPI -PsChargeProcessPoolQuota ( - IN PEPROCESS Process, - IN POOL_TYPE PoolType, - IN SIZE_T Amount -); +PsAssignImpersonationToken( + IN PETHREAD Thread, + IN HANDLE Token OPTIONAL); + +NTKERNELAPI +HANDLE +NTAPI +PsReferencePrimaryToken( + IN OUT PEPROCESS Process); + +#endif #define PsDereferenceImpersonationToken(T) \ {if (ARGUMENT_PRESENT(T)) { \ @@ -4636,56 +9003,6 @@ PsChargeProcessPoolQuota ( } \ } -#define PsDereferencePrimaryToken(T) (ObDereferenceObject((T))) - -NTKERNELAPI -BOOLEAN -NTAPI -PsDisableImpersonation( - IN PETHREAD Thread, - IN PSE_IMPERSONATION_STATE ImpersonationState -); - -NTKERNELAPI -LARGE_INTEGER -NTAPI -PsGetProcessExitTime ( - VOID -); - -NTKERNELAPI -NTSTATUS -NTAPI -PsImpersonateClient( - IN PETHREAD Thread, - IN PACCESS_TOKEN Token, - IN BOOLEAN CopyOnOpen, - IN BOOLEAN EffectiveOnly, - IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel -); - -NTKERNELAPI -BOOLEAN -NTAPI -PsIsSystemThread( - IN PETHREAD Thread -); - -NTKERNELAPI -BOOLEAN -NTAPI -PsIsThreadTerminating ( - IN PETHREAD Thread -); - -NTKERNELAPI -NTSTATUS -NTAPI -PsLookupProcessByProcessId ( - IN HANDLE ProcessId, - OUT PEPROCESS *Process -); - NTKERNELAPI NTSTATUS NTAPI @@ -4695,412 +9012,6 @@ PsLookupProcessThreadByCid ( OUT PETHREAD *Thread ); -NTKERNELAPI -NTSTATUS -NTAPI -PsLookupThreadByThreadId ( - IN HANDLE UniqueThreadId, - OUT PETHREAD *Thread -); - -NTKERNELAPI -PACCESS_TOKEN -NTAPI -PsReferenceImpersonationToken ( - IN PETHREAD Thread, - OUT PBOOLEAN CopyOnUse, - OUT PBOOLEAN EffectiveOnly, - OUT PSECURITY_IMPERSONATION_LEVEL Level -); - -NTKERNELAPI -HANDLE -NTAPI -PsReferencePrimaryToken ( - IN PEPROCESS Process -); - -NTKERNELAPI -VOID -NTAPI -PsRestoreImpersonation( - IN PETHREAD Thread, - IN PSE_IMPERSONATION_STATE ImpersonationState -); - -NTKERNELAPI -VOID -NTAPI -PsReturnPoolQuota ( - IN PEPROCESS Process, - IN POOL_TYPE PoolType, - IN SIZE_T Amount -); - -NTKERNELAPI -VOID -NTAPI -PsRevertToSelf ( - VOID -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlAbsoluteToSelfRelativeSD ( - IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor, - IN OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor, - IN PULONG BufferLength -); - -NTSYSAPI -PVOID -NTAPI -RtlAllocateHeap ( - IN HANDLE HeapHandle, - IN ULONG Flags, - IN SIZE_T Size -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlAppendStringToString( - PSTRING Destination, - const STRING *Source -); - -NTSYSAPI -USHORT -NTAPI -RtlCaptureStackBackTrace ( - IN ULONG FramesToSkip, - IN ULONG FramesToCapture, - OUT PVOID *BackTrace, - OUT PULONG BackTraceHash OPTIONAL -); - -NTSYSAPI -SIZE_T -NTAPI -RtlCompareMemoryUlong ( - PVOID Source, - SIZE_T Length, - ULONG Pattern -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlCompressBuffer ( - IN USHORT CompressionFormatAndEngine, - IN PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - OUT PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN ULONG UncompressedChunkSize, - OUT PULONG FinalCompressedSize, - IN PVOID WorkSpace -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlCompressChunks ( - IN PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - OUT PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo, - IN ULONG CompressedDataInfoLength, - IN PVOID WorkSpace -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlConvertSidToUnicodeString ( - OUT PUNICODE_STRING DestinationString, - IN PSID Sid, - IN BOOLEAN AllocateDestinationString -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlCopySid ( - IN ULONG Length, - IN PSID Destination, - IN PSID Source -); - -NTSYSAPI -BOOLEAN -NTAPI -RtlCreateUnicodeString( - PUNICODE_STRING DestinationString, - PCWSTR SourceString -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlDecompressBuffer ( - IN USHORT CompressionFormat, - OUT PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - IN PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - OUT PULONG FinalUncompressedSize -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlDecompressChunks ( - OUT PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - IN PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN PUCHAR CompressedTail, - IN ULONG CompressedTailSize, - IN PCOMPRESSED_DATA_INFO CompressedDataInfo -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlDecompressFragment ( - IN USHORT CompressionFormat, - OUT PUCHAR UncompressedFragment, - IN ULONG UncompressedFragmentSize, - IN PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN ULONG FragmentOffset, - OUT PULONG FinalUncompressedSize, - IN PVOID WorkSpace -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlDescribeChunk ( - IN USHORT CompressionFormat, - IN OUT PUCHAR *CompressedBuffer, - IN PUCHAR EndOfCompressedBufferPlus1, - OUT PUCHAR *ChunkBuffer, - OUT PULONG ChunkSize -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlDowncaseUnicodeString( - IN OUT PUNICODE_STRING UniDest, - IN PCUNICODE_STRING UniSource, - IN BOOLEAN AllocateDestinationString -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlDuplicateUnicodeString( - IN ULONG Flags, - IN PCUNICODE_STRING SourceString, - OUT PUNICODE_STRING DestinationString -); - -NTSYSAPI -BOOLEAN -NTAPI -RtlEqualSid ( - IN PSID Sid1, - IN PSID Sid2 -); - -NTSYSAPI -VOID -NTAPI -RtlFillMemoryUlong ( - IN PVOID Destination, - IN ULONG Length, - IN ULONG Fill -); - -NTSYSAPI -BOOLEAN -NTAPI -RtlFreeHeap ( - IN HANDLE HeapHandle, - IN ULONG Flags, - IN PVOID P -); - -NTSYSAPI -VOID -NTAPI -RtlFreeOemString ( - IN POEM_STRING OemString -); - -NTSYSAPI -VOID -NTAPI -RtlGenerate8dot3Name ( - IN PUNICODE_STRING Name, - IN BOOLEAN AllowExtendedCharacters, - IN OUT PGENERATE_NAME_CONTEXT Context, - OUT PUNICODE_STRING Name8dot3 -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlGetCompressionWorkSpaceSize ( - IN USHORT CompressionFormatAndEngine, - OUT PULONG CompressBufferWorkSpaceSize, - OUT PULONG CompressFragmentWorkSpaceSize -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlGetDaclSecurityDescriptor ( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - OUT PBOOLEAN DaclPresent, - OUT PACL *Dacl, - OUT PBOOLEAN DaclDefaulted -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlGetGroupSecurityDescriptor ( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - OUT PSID *Group, - OUT PBOOLEAN GroupDefaulted -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlGetOwnerSecurityDescriptor ( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - OUT PSID *Owner, - OUT PBOOLEAN OwnerDefaulted -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlInitializeSid ( - IN OUT PSID Sid, - IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, - IN UCHAR SubAuthorityCount -); - -NTSYSAPI -BOOLEAN -NTAPI -RtlIsNameLegalDOS8Dot3( - IN PCUNICODE_STRING Name, - IN OUT POEM_STRING OemName OPTIONAL, - IN OUT PBOOLEAN NameContainsSpaces OPTIONAL -); - -NTSYSAPI -ULONG -NTAPI -RtlLengthRequiredSid ( - IN ULONG SubAuthorityCount -); - -NTSYSAPI -ULONG -NTAPI -RtlLengthSid ( - IN PSID Sid -); - -NTSYSAPI -ULONG -NTAPI -RtlNtStatusToDosError ( - IN NTSTATUS Status -); - -NTSYSAPI -ULONG -NTAPI -RtlxUnicodeStringToOemSize( - PCUNICODE_STRING UnicodeString - ); - -NTSYSAPI -ULONG -NTAPI -RtlxOemStringToUnicodeSize( - PCOEM_STRING OemString -); - -#define RtlOemStringToUnicodeSize(STRING) ( \ - NLS_MB_OEM_CODE_PAGE_TAG ? \ - RtlxOemStringToUnicodeSize(STRING) : \ - ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \ -) - -#define RtlOemStringToCountedUnicodeSize(STRING) ( \ - (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \ -) - - -NTSYSAPI -NTSTATUS -NTAPI -RtlOemStringToUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PCOEM_STRING SourceString, - IN BOOLEAN AllocateDestinationString -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlUnicodeStringToOemString( - IN OUT POEM_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlOemStringToCountedUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PCOEM_STRING SourceString, - IN BOOLEAN AllocateDestinationString -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlUnicodeStringToCountedOemString( - IN OUT POEM_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlReserveChunk ( - IN USHORT CompressionFormat, - IN OUT PUCHAR *CompressedBuffer, - IN PUCHAR EndOfCompressedBufferPlus1, - OUT PUCHAR *ChunkBuffer, - IN ULONG ChunkSize -); - NTSYSAPI VOID NTAPI @@ -5109,24 +9020,6 @@ RtlSecondsSince1970ToTime ( OUT PLARGE_INTEGER Time ); -NTSYSAPI -NTSTATUS -NTAPI -RtlSetGroupSecurityDescriptor ( - IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID Group, - IN BOOLEAN GroupDefaulted -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlSetOwnerSecurityDescriptor ( - IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID Owner, - IN BOOLEAN OwnerDefaulted -); - NTSYSAPI NTSTATUS NTAPI @@ -5137,21 +9030,6 @@ RtlSetSaclSecurityDescriptor ( IN BOOLEAN SaclDefaulted ); -NTSYSAPI -PUCHAR -NTAPI -RtlSubAuthorityCountSid ( - IN PSID Sid -); - -NTSYSAPI -PULONG -NTAPI -RtlSubAuthoritySid ( - IN PSID Sid, - IN ULONG SubAuthority -); - NTSYSAPI NTSTATUS NTAPI @@ -5161,28 +9039,6 @@ RtlUnicodeStringToCountedOemString ( IN BOOLEAN AllocateDestinationString ); -NTSYSAPI -NTSTATUS -NTAPI -RtlUnicodeToMultiByteN( - OUT PCHAR MultiByteString, - IN ULONG MaxBytesInMultiByteString, - OUT PULONG BytesInMultiByteString OPTIONAL, - IN PWCH UnicodeString, - IN ULONG BytesInUnicodeString -); - -NTSYSAPI -NTSTATUS -NTAPI -RtlOemToUnicodeN( - OUT PWSTR UnicodeString, - IN ULONG MaxBytesInUnicodeString, - OUT PULONG BytesInUnicodeString OPTIONAL, - IN PCH OemString, - IN ULONG BytesInOemString -); - /* RTL Splay Tree Functions */ NTSYSAPI PRTL_SPLAY_LINKS @@ -5269,355 +9125,12 @@ RtlRealPredecessor(PRTL_SPLAY_LINKS Links); _SplayChild->Parent = _SplayParent; \ } -NTSYSAPI -BOOLEAN -NTAPI -RtlValidSid ( - IN PSID Sid -); - // // RTL time functions // -NTSYSAPI -BOOLEAN -NTAPI -RtlTimeToSecondsSince1980 ( - PLARGE_INTEGER Time, - PULONG ElapsedSeconds -); - -NTSYSAPI -VOID -NTAPI -RtlSecondsSince1980ToTime ( - ULONG ElapsedSeconds, - PLARGE_INTEGER Time -); - -NTSYSAPI -BOOLEAN -NTAPI -RtlTimeToSecondsSince1970 ( - PLARGE_INTEGER Time, - PULONG ElapsedSeconds -); - -NTSYSAPI -VOID -NTAPI -RtlSecondsSince1970ToTime ( - ULONG ElapsedSeconds, - PLARGE_INTEGER Time -); - -NTKERNELAPI -NTSTATUS -NTAPI -SeAppendPrivileges ( - PACCESS_STATE AccessState, - PPRIVILEGE_SET Privileges -); - -NTKERNELAPI -BOOLEAN -NTAPI -SeAuditingFileEvents ( - IN BOOLEAN AccessGranted, - IN PSECURITY_DESCRIPTOR SecurityDescriptor -); - -NTKERNELAPI -BOOLEAN -NTAPI -SeAuditingFileOrGlobalEvents ( - IN BOOLEAN AccessGranted, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext -); - -NTKERNELAPI -VOID -NTAPI -SeCaptureSubjectContext ( - OUT PSECURITY_SUBJECT_CONTEXT SubjectContext -); - -NTKERNELAPI -NTSTATUS -NTAPI -SeCreateClientSecurity ( - IN PETHREAD Thread, - IN PSECURITY_QUALITY_OF_SERVICE QualityOfService, - IN BOOLEAN RemoteClient, - OUT PSECURITY_CLIENT_CONTEXT ClientContext -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -NTSTATUS -NTAPI -SeCreateClientSecurityFromSubjectContext ( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext, - IN PSECURITY_QUALITY_OF_SERVICE QualityOfService, - IN BOOLEAN ServerIsRemote, - OUT PSECURITY_CLIENT_CONTEXT ClientContext -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - - -#define SeLengthSid( Sid ) \ - (8 + (4 * ((SID *)Sid)->SubAuthorityCount)) - -#define SeDeleteClientSecurity(C) { \ - if (SeTokenType((C)->ClientToken) == TokenPrimary) { \ - PsDereferencePrimaryToken( (C)->ClientToken ); \ - } else { \ - PsDereferenceImpersonationToken( (C)->ClientToken ); \ - } \ -} - -NTKERNELAPI -VOID -NTAPI -SeDeleteObjectAuditAlarm ( - IN PVOID Object, - IN HANDLE Handle -); - #define SeEnableAccessToExports() SeExports = *(PSE_EXPORTS *)SeExports; -NTKERNELAPI -VOID -NTAPI -SeFreePrivileges ( - IN PPRIVILEGE_SET Privileges -); - -NTKERNELAPI -VOID -NTAPI -SeImpersonateClient ( - IN PSECURITY_CLIENT_CONTEXT ClientContext, - IN PETHREAD ServerThread OPTIONAL -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -NTSTATUS -NTAPI -SeImpersonateClientEx ( - IN PSECURITY_CLIENT_CONTEXT ClientContext, - IN PETHREAD ServerThread OPTIONAL -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -VOID -NTAPI -SeLockSubjectContext ( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext -); - -NTKERNELAPI -NTSTATUS -NTAPI -SeMarkLogonSessionForTerminationNotification ( - IN PLUID LogonId -); - -NTKERNELAPI -VOID -NTAPI -SeOpenObjectAuditAlarm ( - IN PUNICODE_STRING ObjectTypeName, - IN PVOID Object OPTIONAL, - IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PACCESS_STATE AccessState, - IN BOOLEAN ObjectCreated, - IN BOOLEAN AccessGranted, - IN KPROCESSOR_MODE AccessMode, - OUT PBOOLEAN GenerateOnClose -); - -NTKERNELAPI -VOID -NTAPI -SeOpenObjectForDeleteAuditAlarm ( - IN PUNICODE_STRING ObjectTypeName, - IN PVOID Object OPTIONAL, - IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PACCESS_STATE AccessState, - IN BOOLEAN ObjectCreated, - IN BOOLEAN AccessGranted, - IN KPROCESSOR_MODE AccessMode, - OUT PBOOLEAN GenerateOnClose -); - -NTKERNELAPI -BOOLEAN -NTAPI -SePrivilegeCheck ( - IN OUT PPRIVILEGE_SET RequiredPrivileges, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext, - IN KPROCESSOR_MODE AccessMode -); - -NTKERNELAPI -NTSTATUS -NTAPI -SeQueryAuthenticationIdToken ( - IN PACCESS_TOKEN Token, - OUT PLUID LogonId -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -NTSTATUS -NTAPI -SeQueryInformationToken ( - IN PACCESS_TOKEN Token, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - OUT PVOID *TokenInformation -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -NTSTATUS -NTAPI -SeQuerySecurityDescriptorInfo ( - IN PSECURITY_INFORMATION SecurityInformation, - OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN OUT PULONG Length, - IN PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -NTSTATUS -NTAPI -SeQuerySessionIdToken ( - IN PACCESS_TOKEN Token, - IN PULONG SessionId -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -#define SeQuerySubjectContextToken( SubjectContext ) \ - ( ARGUMENT_PRESENT( \ - ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken \ - ) ? \ - ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken : \ - ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->PrimaryToken ) - -typedef NTSTATUS (NTAPI *PSE_LOGON_SESSION_TERMINATED_ROUTINE) ( - IN PLUID LogonId -); - -NTKERNELAPI -NTSTATUS -NTAPI -SeRegisterLogonSessionTerminatedRoutine ( - IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine -); - -NTKERNELAPI -VOID -NTAPI -SeReleaseSubjectContext ( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext -); - -NTKERNELAPI -VOID -NTAPI -SeSetAccessStateGenericMapping ( - PACCESS_STATE AccessState, - PGENERIC_MAPPING GenericMapping -); - -NTKERNELAPI -NTSTATUS -NTAPI -SeSetSecurityDescriptorInfo ( - IN PVOID Object OPTIONAL, - IN PSECURITY_INFORMATION SecurityInformation, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, - IN POOL_TYPE PoolType, - IN PGENERIC_MAPPING GenericMapping -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -NTSTATUS -NTAPI -SeSetSecurityDescriptorInfoEx ( - IN PVOID Object OPTIONAL, - IN PSECURITY_INFORMATION SecurityInformation, - IN PSECURITY_DESCRIPTOR ModificationDescriptor, - IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, - IN ULONG AutoInheritFlags, - IN POOL_TYPE PoolType, - IN PGENERIC_MAPPING GenericMapping -); - -NTKERNELAPI -BOOLEAN -NTAPI -SeTokenIsAdmin ( - IN PACCESS_TOKEN Token -); - -NTKERNELAPI -BOOLEAN -NTAPI -SeTokenIsRestricted ( - IN PACCESS_TOKEN Token -); - - -NTSTATUS -NTAPI -SeLocateProcessImageName( - IN PEPROCESS Process, - OUT PUNICODE_STRING *pImageFileName -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -TOKEN_TYPE -NTAPI -SeTokenType ( - IN PACCESS_TOKEN Token -); - -NTKERNELAPI -VOID -NTAPI -SeUnlockSubjectContext ( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext -); - -NTKERNELAPI -NTSTATUS -NTAPI -SeUnregisterLogonSessionTerminatedRoutine ( - IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine -); - #if (VER_PRODUCTBUILD >= 2195) NTSYSAPI @@ -5653,70 +9166,6 @@ ZwAllocateVirtualMemory ( IN ULONG Protect ); -NTSTATUS -NTAPI -NtAccessCheckByTypeAndAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN HANDLE HandleId, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid, - IN ACCESS_MASK DesiredAccess, - IN AUDIT_EVENT_TYPE AuditType, - IN ULONG Flags, - IN POBJECT_TYPE_LIST ObjectTypeList, - IN ULONG ObjectTypeLength, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus, - OUT PBOOLEAN GenerateOnClose -); - -NTSTATUS -NTAPI -NtAccessCheckByTypeResultListAndAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN HANDLE HandleId, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid, - IN ACCESS_MASK DesiredAccess, - IN AUDIT_EVENT_TYPE AuditType, - IN ULONG Flags, - IN POBJECT_TYPE_LIST ObjectTypeList, - IN ULONG ObjectTypeLength, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus, - OUT PBOOLEAN GenerateOnClose -); - -NTSTATUS -NTAPI -NtAccessCheckByTypeResultListAndAuditAlarmByHandle( - IN PUNICODE_STRING SubsystemName, - IN HANDLE HandleId, - IN HANDLE ClientToken, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid, - IN ACCESS_MASK DesiredAccess, - IN AUDIT_EVENT_TYPE AuditType, - IN ULONG Flags, - IN POBJECT_TYPE_LIST ObjectTypeList, - IN ULONG ObjectTypeLength, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus, - OUT PBOOLEAN GenerateOnClose -); - NTSYSAPI NTSTATUS NTAPI @@ -5800,21 +9249,23 @@ ZwDeleteValueKey ( IN PUNICODE_STRING Name ); + +#if (NTDDI_VERSION >= NTDDI_WIN2K) NTSYSAPI NTSTATUS NTAPI ZwDeviceIoControlFile ( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG IoControlCode, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength -); + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength); +#endif NTSYSAPI NTSTATUS @@ -5848,17 +9299,6 @@ ZwDuplicateToken ( OUT PHANDLE NewTokenHandle ); -NTSTATUS -NTAPI -NtFilterToken( - IN HANDLE ExistingTokenHandle, - IN ULONG Flags, - IN PTOKEN_GROUPS SidsToDisable OPTIONAL, - IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL, - IN PTOKEN_GROUPS RestrictedSids OPTIONAL, - OUT PHANDLE NewTokenHandle -); - NTSYSAPI NTSTATUS NTAPI @@ -5971,15 +9411,6 @@ ZwOpenDirectoryObject ( IN POBJECT_ATTRIBUTES ObjectAttributes ); -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenEvent ( - OUT PHANDLE EventHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes -); - NTSYSAPI NTSTATUS NTAPI @@ -6287,14 +9718,15 @@ ZwUnloadKey ( IN POBJECT_ATTRIBUTES KeyObjectAttributes ); +#if (NTDDI_VERSION >= NTDDI_WIN2K) NTSYSAPI NTSTATUS NTAPI ZwWaitForSingleObject ( - IN HANDLE Handle, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL -); + IN HANDLE Handle, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL); +#endif NTSYSAPI NTSTATUS @@ -6319,5 +9751,3 @@ ZwYieldExecution ( #ifdef __cplusplus } #endif - -#endif /* _NTIFS_ */ diff --git a/reactos/include/ddk/ntpoapi.h b/reactos/include/ddk/ntpoapi.h index 01f45935fdd..48f71072ab6 100644 --- a/reactos/include/ddk/ntpoapi.h +++ b/reactos/include/ddk/ntpoapi.h @@ -27,15 +27,122 @@ extern "C" { #endif +#ifndef _PO_DDK_ +#define _PO_DDK_ + +/* Power States/Levels */ +typedef enum _SYSTEM_POWER_STATE { + PowerSystemUnspecified, + PowerSystemWorking, + PowerSystemSleeping1, + PowerSystemSleeping2, + PowerSystemSleeping3, + PowerSystemHibernate, + PowerSystemShutdown, + PowerSystemMaximum +} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE; +#define POWER_SYSTEM_MAXIMUM PowerSystemMaximum + +typedef enum _DEVICE_POWER_STATE { + PowerDeviceUnspecified, + PowerDeviceD0, + PowerDeviceD1, + PowerDeviceD2, + PowerDeviceD3, + PowerDeviceMaximum +} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE; + +typedef union _POWER_STATE { + SYSTEM_POWER_STATE SystemState; + DEVICE_POWER_STATE DeviceState; +} POWER_STATE, *PPOWER_STATE; + +typedef enum _POWER_STATE_TYPE { + SystemPowerState = 0, + DevicePowerState +} POWER_STATE_TYPE, *PPOWER_STATE_TYPE; + +typedef enum _POWER_INFORMATION_LEVEL { + SystemPowerPolicyAc, + SystemPowerPolicyDc, + VerifySystemPolicyAc, + VerifySystemPolicyDc, + SystemPowerCapabilities, + SystemBatteryState, + SystemPowerStateHandler, + ProcessorStateHandler, + SystemPowerPolicyCurrent, + AdministratorPowerPolicy, + SystemReserveHiberFile, + ProcessorInformation, + SystemPowerInformation, + ProcessorStateHandler2, + LastWakeTime, + LastSleepTime, + SystemExecutionState, + SystemPowerStateNotifyHandler, + ProcessorPowerPolicyAc, + ProcessorPowerPolicyDc, + VerifyProcessorPowerPolicyAc, + VerifyProcessorPowerPolicyDc, + ProcessorPowerPolicyCurrent, + SystemPowerStateLogging, + SystemPowerLoggingEntry, + SetPowerSettingValue, + NotifyUserPowerSetting, + PowerInformationLevelUnused0, + PowerInformationLevelUnused1, + SystemVideoState, + TraceApplicationPowerMessage, + TraceApplicationPowerMessageEnd, + ProcessorPerfStates, + ProcessorIdleStates, + ProcessorCap, + SystemWakeSource, + SystemHiberFileInformation, + TraceServicePowerMessage, + ProcessorLoad, + PowerShutdownNotification, + MonitorCapabilities, + SessionPowerInit, + SessionDisplayState, + PowerRequestCreate, + PowerRequestAction, + GetPowerRequestList, + ProcessorInformationEx, + NotifyUserModeLegacyPowerEvent, + GroupPark, + ProcessorIdleDomains, + WakeTimerList, + SystemHiberFileSize, + PowerInformationLevelMaximum +} POWER_INFORMATION_LEVEL; + +typedef enum { + PowerActionNone, + PowerActionReserved, + PowerActionSleep, + PowerActionHibernate, + PowerActionShutdown, + PowerActionShutdownReset, + PowerActionShutdownOff, + PowerActionWarmEject +} POWER_ACTION, *PPOWER_ACTION; + +#if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) +typedef struct { + ULONG Granularity; + ULONG Capacity; +} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE; +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */ + + +#endif /* _PO_DDK_ */ + #define POWER_PERF_SCALE 100 #define PERF_LEVEL_TO_PERCENT(x) (((x) * 1000) / (POWER_PERF_SCALE * 10)) #define PERCENT_TO_PERF_LEVEL(x) (((x) * POWER_PERF_SCALE * 10) / 1000) -typedef struct { - ULONG Granularity; - ULONG Capacity; -} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE; - typedef struct _PROCESSOR_IDLE_TIMES { ULONGLONG StartTime; ULONGLONG EndTime; @@ -270,6 +377,39 @@ typedef struct _PROCESSOR_POWER_INFORMATION { ULONG CurrentIdleState; } PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION; +typedef struct _POWER_ACTION_POLICY { + POWER_ACTION Action; + ULONG Flags; + ULONG EventCode; +} POWER_ACTION_POLICY, *PPOWER_ACTION_POLICY; + +/* POWER_ACTION_POLICY.Flags constants */ +#define POWER_ACTION_QUERY_ALLOWED 0x00000001 +#define POWER_ACTION_UI_ALLOWED 0x00000002 +#define POWER_ACTION_OVERRIDE_APPS 0x00000004 +#define POWER_ACTION_LIGHTEST_FIRST 0x10000000 +#define POWER_ACTION_LOCK_CONSOLE 0x20000000 +#define POWER_ACTION_DISABLE_WAKES 0x40000000 +#define POWER_ACTION_CRITICAL 0x80000000 + +/* POWER_ACTION_POLICY.EventCode constants */ +#define POWER_LEVEL_USER_NOTIFY_TEXT 0x00000001 +#define POWER_LEVEL_USER_NOTIFY_SOUND 0x00000002 +#define POWER_LEVEL_USER_NOTIFY_EXEC 0x00000004 +#define POWER_USER_NOTIFY_BUTTON 0x00000008 +#define POWER_USER_NOTIFY_SHUTDOWN 0x00000010 +#define POWER_FORCE_TRIGGER_RESET 0x80000000 + +#define DISCHARGE_POLICY_CRITICAL 0 +#define DISCHARGE_POLICY_LOW 1 +#define NUM_DISCHARGE_POLICIES 4 + +#define PO_THROTTLE_NONE 0 +#define PO_THROTTLE_CONSTANT 1 +#define PO_THROTTLE_DEGRADE 2 +#define PO_THROTTLE_ADAPTIVE 3 +#define PO_THROTTLE_MAXIMUM 4 + #ifdef __cplusplus } #endif diff --git a/reactos/include/ddk/punknown.h b/reactos/include/ddk/punknown.h index 748914701ec..bac87bd652c 100644 --- a/reactos/include/ddk/punknown.h +++ b/reactos/include/ddk/punknown.h @@ -33,7 +33,7 @@ extern "C" { #define __IUnknown_INTERFACE_DEFINED__ DEFINE_GUID( IID_IUnknown, - 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x46); + 0x00000000, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); #undef INTERFACE #define INTERFACE IUnknown diff --git a/reactos/include/ddk/stdunk.h b/reactos/include/ddk/stdunk.h index d4652f6b911..c50e5b1c1b0 100644 --- a/reactos/include/ddk/stdunk.h +++ b/reactos/include/ddk/stdunk.h @@ -13,6 +13,15 @@ #include +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + /* =============================================================== INonDelegatingUnknown interface */ @@ -110,7 +119,7 @@ Unknown_Release( typedef struct CUnknown { - union + __GNU_EXTENSION union { IUnknown IUnknown; INonDelegatingUnknown INonDelegatingUnknown; diff --git a/reactos/include/ddk/strmini.h b/reactos/include/ddk/strmini.h index a223fa24d02..f0a72f52ac3 100644 --- a/reactos/include/ddk/strmini.h +++ b/reactos/include/ddk/strmini.h @@ -5,6 +5,15 @@ #include #include +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + #define STREAMAPI __stdcall #define STREAM_SYSTEM_TIME_MASK ((STREAM_SYSTEM_TIME)0x00000001FFFFFFFF) @@ -37,8 +46,8 @@ typedef enum #endif typedef PHYSICAL_ADDRESS STREAM_PHYSICAL_ADDRESS, *PSTREAM_PHYSICAL_ADDRESS; -typedef unsigned __int64 STREAM_SYSTEM_TIME, *PSTREAM_SYSTEM_TIME; -typedef unsigned __int64 STREAM_TIMESTAMP, *PSTREAM_TIMESTAMP; +__GNU_EXTENSION typedef unsigned __int64 STREAM_SYSTEM_TIME, *PSTREAM_SYSTEM_TIME; +__GNU_EXTENSION typedef unsigned __int64 STREAM_TIMESTAMP, *PSTREAM_TIMESTAMP; typedef enum { @@ -61,7 +70,7 @@ typedef struct _HW_EVENT_DESCRIPTOR BOOLEAN Enable; PKSEVENT_ENTRY EventEntry; PKSEVENTDATA EventData; - union + __GNU_EXTENSION union { struct _HW_STREAM_OBJECT * StreamObject; struct _HW_DEVICE_EXTENSION *DeviceExtension; @@ -285,7 +294,7 @@ typedef struct _HW_STREAM_REQUEST_BLOCK ULONG Flags; PVOID HwInstanceExtension; - union + __GNU_EXTENSION union { ULONG NumberOfBytesToTransfer; ULONG ActualBytesTransferred; @@ -376,11 +385,11 @@ typedef enum _STREAM_MINIDRIVER_DEVICE_NOTIFICATION_TYPE typedef struct _HW_INITIALIZATION_DATA { #if (NTDDI_VERSION >= NTDDI_WINXP) - union - { + __GNU_EXTENSION union + { ULONG HwInitializationDataSize; - struct - { + __GNU_EXTENSION struct + { USHORT SizeOfThisPacket; USHORT StreamClassVersion; }; diff --git a/reactos/include/ddk/tdikrnl.h b/reactos/include/ddk/tdikrnl.h index fa3679ed7b5..7c5f90dfcd3 100644 --- a/reactos/include/ddk/tdikrnl.h +++ b/reactos/include/ddk/tdikrnl.h @@ -397,7 +397,9 @@ TdiDefaultSendPossibleHandler( bIrpSp->DeviceObject = (bDevObj); \ bIrpSp->FileObject = (bFileObj); \ if (bCompRoutine) \ - IoSetCompletionRoutine(bIrp, bCompRoutine, bContxt, TRUE, TRUE, TRUE) \ + { \ + IoSetCompletionRoutine(bIrp, bCompRoutine, bContxt, TRUE, TRUE, TRUE);\ + } \ else \ IoSetCompletionRoutine(bIrp, NULL, NULL, FALSE, FALSE, FALSE); \ } diff --git a/reactos/include/ddk/usb200.h b/reactos/include/ddk/usb200.h deleted file mode 100644 index 7419b7f0b43..00000000000 --- a/reactos/include/ddk/usb200.h +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef __USB200_H__ -#define __USB200_H__ - -#include "usb100.h" - -#include - - -typedef enum _USB_DEVICE_TYPE -{ - Usb11Device = 0, - Usb20Device -} USB_DEVICE_TYPE; - -typedef enum _USB_DEVICE_SPEED -{ - UsbLowSpeed = 0, - UsbFullSpeed, - UsbHighSpeed -} USB_DEVICE_SPEED; - -typedef union _BM_REQUEST_TYPE -{ - struct _BM - { - UCHAR Recipient:2; - UCHAR Reserved:3; - UCHAR Type:2; - UCHAR Dir:1; - } _BM; - UCHAR B; -} BM_REQUEST_TYPE, *PBM_REQUEST_TYPE; - -typedef struct _USB_DEFAULT_PIPE_SETUP_PACKET -{ - BM_REQUEST_TYPE bmRequestType; - UCHAR bRequest; - union _wValue - { - struct - { - UCHAR LowByte; - UCHAR HiByte; - }; - USHORT W; - } wValue; - union _wIndex - { - struct - { - UCHAR LowByte; - UCHAR HiByte; - }; - USHORT W; - } wIndex; - USHORT wLength; -} USB_DEFAULT_PIPE_SETUP_PACKET, *PUSB_DEFAULT_PIPE_SETUP_PACKET; - - -C_ASSERT(sizeof(USB_DEFAULT_PIPE_SETUP_PACKET) == 8); - -typedef struct _USB_DEVICE_QUALIFIER_DESCRIPTOR -{ - UCHAR bLength; - UCHAR bDescriptorType; - USHORT bcdUSB; - UCHAR bDeviceClass; - UCHAR bDeviceSubClass; - UCHAR bDeviceProtocol; - UCHAR bMaxPacketSize0; - UCHAR bNumConfigurations; - UCHAR bReserved; -} USB_DEVICE_QUALIFIER_DESCRIPTOR, *PUSB_DEVICE_QUALIFIER_DESCRIPTOR; - - -typedef union _USB_HIGH_SPEED_MAXPACKET -{ - struct _MP - { - USHORT MaxPacket:11; - USHORT HSmux:2; - USHORT Reserved:3; - } _MP; - USHORT us; -} USB_HIGH_SPEED_MAXPACKET, *PUSB_HIGH_SPEED_MAXPACKET; - -typedef struct _USB_INTERFACE_ASSOCIATION_DESCRIPTOR -{ - UCHAR bLength; - UCHAR bDescriptorType; - UCHAR bFirstInterface; - UCHAR bInterfaceCount; - UCHAR bFunctionClass; - UCHAR bFunctionSubClass; - UCHAR bFunctionProtocol; - UCHAR iFunction; -} USB_INTERFACE_ASSOCIATION_DESCRIPTOR, *PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR; - -#define USB_PORT_STATUS_CONNECT 0x0001 -#define USB_PORT_STATUS_ENABLE 0x0002 -#define USB_PORT_STATUS_SUSPEND 0x0004 -#define USB_PORT_STATUS_OVER_CURRENT 0x0008 -#define USB_PORT_STATUS_RESET 0x0010 -#define USB_PORT_STATUS_POWER 0x0100 -#define USB_PORT_STATUS_LOW_SPEED 0x0200 -#define USB_PORT_STATUS_HIGH_SPEED 0x0400 -#define USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE 0x06 -#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE 0x0B - -#include - -#endif //__USB200_H__ diff --git a/reactos/include/ddk/usbbusif.h b/reactos/include/ddk/usbbusif.h new file mode 100644 index 00000000000..0483738b18a --- /dev/null +++ b/reactos/include/ddk/usbbusif.h @@ -0,0 +1,193 @@ +#pragma once + +#ifndef USB_BUSIFFN +#define USB_BUSIFFN __stdcall +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +typedef PVOID PUSB_DEVICE_HANDLE; + +typedef NTSTATUS +(USB_BUSIFFN *PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB) ( + IN PVOID, + IN PURB); + +#define USB_HCD_CAPS_SUPPORTS_RT_THREADS 0x00000001 + +typedef VOID +(USB_BUSIFFN *PUSB_BUSIFFN_GETUSBDI_VERSION) ( + IN PVOID, + OUT PUSBD_VERSION_INFORMATION OPTIONAL, + OUT PULONG OPTIONAL); + +typedef NTSTATUS +(USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_TIME) ( + IN PVOID, + OUT PULONG OPTIONAL); + +typedef NTSTATUS +(USB_BUSIFFN *PUSB_BUSIFFN_ENUM_LOG_ENTRY) ( + IN PVOID, + IN ULONG, + IN ULONG, + IN ULONG, + IN ULONG); + +typedef struct _USB_BUS_INFORMATION_LEVEL_0 { + ULONG TotalBandwidth; + ULONG ConsumedBandwidth; +} USB_BUS_INFORMATION_LEVEL_0, *PUSB_BUS_INFORMATION_LEVEL_0; + +typedef struct _USB_BUS_INFORMATION_LEVEL_1 { + ULONG TotalBandwidth; + ULONG ConsumedBandwidth; + ULONG ControllerNameLength; + WCHAR ControllerNameUnicodeString[1]; +} USB_BUS_INFORMATION_LEVEL_1, *PUSB_BUS_INFORMATION_LEVEL_1; + +typedef NTSTATUS +(USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_INFORMATION) ( + IN PVOID, + IN ULONG, + IN OUT PVOID, + OUT PULONG, + OUT PULONG OPTIONAL); + +typedef BOOLEAN +(USB_BUSIFFN *PUSB_BUSIFFN_IS_DEVICE_HIGH_SPEED) ( + IN PVOID OPTIONAL); + +#define USB_BUSIF_USBDI_VERSION_0 0x0000 +#define USB_BUSIF_USBDI_VERSION_1 0x0001 +#define USB_BUSIF_USBDI_VERSION_2 0x0002 +#define USB_BUSIF_USBDI_VERSION_3 0x0003 + +DEFINE_GUID(USB_BUS_INTERFACE_USBDI_GUID, +0xb1a96a13, 0x3de0, 0x4574, 0x9b, 0x1, 0xc0, 0x8f, 0xea, 0xb3, 0x18, 0xd6); + +typedef struct _USB_BUS_INTERFACE_USBDI_V0 { + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PUSB_BUSIFFN_GETUSBDI_VERSION GetUSBDIVersion; + PUSB_BUSIFFN_QUERY_BUS_TIME QueryBusTime; + PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB SubmitIsoOutUrb; + PUSB_BUSIFFN_QUERY_BUS_INFORMATION QueryBusInformation; +} USB_BUS_INTERFACE_USBDI_V0, *PUSB_BUS_INTERFACE_USBDI_V0; + +typedef struct _USB_BUS_INTERFACE_USBDI_V1 { + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PUSB_BUSIFFN_GETUSBDI_VERSION GetUSBDIVersion; + PUSB_BUSIFFN_QUERY_BUS_TIME QueryBusTime; + PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB SubmitIsoOutUrb; + PUSB_BUSIFFN_QUERY_BUS_INFORMATION QueryBusInformation; + PUSB_BUSIFFN_IS_DEVICE_HIGH_SPEED IsDeviceHighSpeed; +} USB_BUS_INTERFACE_USBDI_V1, *PUSB_BUS_INTERFACE_USBDI_V1; + +typedef struct _USB_BUS_INTERFACE_USBDI_V2 { + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PUSB_BUSIFFN_GETUSBDI_VERSION GetUSBDIVersion; + PUSB_BUSIFFN_QUERY_BUS_TIME QueryBusTime; + PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB SubmitIsoOutUrb; + PUSB_BUSIFFN_QUERY_BUS_INFORMATION QueryBusInformation; + PUSB_BUSIFFN_IS_DEVICE_HIGH_SPEED IsDeviceHighSpeed; + PUSB_BUSIFFN_ENUM_LOG_ENTRY EnumLogEntry; +} USB_BUS_INTERFACE_USBDI_V2, *PUSB_BUS_INTERFACE_USBDI_V2; + +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +typedef NTSTATUS +(USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_TIME_EX) ( + IN PVOID OPTIONAL, + OUT PULONG OPTIONAL); + +typedef NTSTATUS +(USB_BUSIFFN *PUSB_BUSIFFN_QUERY_CONTROLLER_TYPE) ( + IN PVOID OPTIONAL, + OUT PULONG OPTIONAL, + OUT PUSHORT OPTIONAL, + OUT PUSHORT OPTIONAL, + OUT PUCHAR OPTIONAL, + OUT PUCHAR OPTIONAL, + OUT PUCHAR OPTIONAL, + OUT PUCHAR OPTIONAL); + +typedef struct _USB_BUS_INTERFACE_USBDI_V3 { + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PUSB_BUSIFFN_GETUSBDI_VERSION GetUSBDIVersion; + PUSB_BUSIFFN_QUERY_BUS_TIME QueryBusTime; + PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB SubmitIsoOutUrb; + PUSB_BUSIFFN_QUERY_BUS_INFORMATION QueryBusInformation; + PUSB_BUSIFFN_IS_DEVICE_HIGH_SPEED IsDeviceHighSpeed; + PUSB_BUSIFFN_ENUM_LOG_ENTRY EnumLogEntry; + PUSB_BUSIFFN_QUERY_BUS_TIME_EX QueryBusTimeEx; + PUSB_BUSIFFN_QUERY_CONTROLLER_TYPE QueryControllerType; +} USB_BUS_INTERFACE_USBDI_V3, *PUSB_BUS_INTERFACE_USBDI_V3; + +DEFINE_GUID(USB_BUS_INTERFACE_USBC_CONFIGURATION_GUID, +0x893b6a96, 0xb7f, 0x4d4d, 0xbd, 0xb4, 0xbb, 0xd4, 0xce, 0xeb, 0xb3, 0x1c); + +#define USBC_FUNCTION_FLAG_APPEND_ID 0x1 + +typedef struct _USBC_FUNCTION_DESCRIPTOR{ + UCHAR FunctionNumber; + UCHAR NumberOfInterfaces; + PUSB_INTERFACE_DESCRIPTOR *InterfaceDescriptorList; + UNICODE_STRING HardwareId; + UNICODE_STRING CompatibleId; + UNICODE_STRING FunctionDescription; + ULONG FunctionFlags; + PVOID Reserved; +} USBC_FUNCTION_DESCRIPTOR, *PUSBC_FUNCTION_DESCRIPTOR; + +typedef +NTSTATUS +(USB_BUSIFFN *USBC_START_DEVICE_CALLBACK)( + IN PUSB_DEVICE_DESCRIPTOR DeviceDescriptor, + IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + OUT PUSBC_FUNCTION_DESCRIPTOR *FunctionDescriptorBuffer, + OUT PULONG FunctionDescriptorBufferLength, + IN PDEVICE_OBJECT FdoDeviceObject, + IN PDEVICE_OBJECT PdoDeviceObject); + +typedef +BOOLEAN +(USB_BUSIFFN *USBC_PDO_ENABLE_CALLBACK)( + IN PVOID Context, + IN USHORT FirstInterfaceNumber, + IN USHORT NumberOfInterfaces, + IN UCHAR FunctionClass, + IN UCHAR FunctionSubClass, + IN UCHAR FunctionProtocol); + +#define USBC_DEVICE_CONFIGURATION_INTERFACE_VERSION_1 0x0001 + +typedef struct _USBC_DEVICE_CONFIGURATION_INTERFACE_V1 { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + USBC_START_DEVICE_CALLBACK StartDeviceCallback; + USBC_PDO_ENABLE_CALLBACK PdoEnableCallback; + PVOID Reserved[7]; +} USBC_DEVICE_CONFIGURATION_INTERFACE_V1, *PUSBC_DEVICE_CONFIGURATION_INTERFACE_V1; + +#endif diff --git a/reactos/include/ddk/usbcamdi.h b/reactos/include/ddk/usbcamdi.h deleted file mode 100644 index 461b0bc2b4d..00000000000 --- a/reactos/include/ddk/usbcamdi.h +++ /dev/null @@ -1,398 +0,0 @@ -/* - * usbcamdi.h - * - * USB Camera driver interface. - * - * This file is part of the w32api package. - * - * Contributors: - * Created by Casper S. Hornstrup - * - * THIS SOFTWARE IS NOT COPYRIGHTED - * - * This source code is offered for use in the public domain. You may - * use, modify or distribute it freely. - * - * This code is distributed in the hope that it will be useful but - * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY - * DISCLAIMED. This includes but is not limited to warranties of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#ifndef __USBCAMDI_H -#define __USBCAMDI_H - -#if !defined(__USB_H) && !defined(__USBDI_H) -#error include usb.h or usbdi.h before usbcamdi.h -#else - -#ifdef __cplusplus -extern "C" { -#endif - -#pragma pack(push,4) - -#if defined(_BATTERYCLASS_) - #define USBCAMAPI -#else - #define USBCAMAPI DECLSPEC_IMPORT -#endif - - -/* FIXME: Unknown definition */ -typedef PVOID PHW_STREAM_REQUEST_BLOCK; - -DEFINE_GUID(GUID_USBCAMD_INTERFACE, - 0x2bcb75c0, 0xb27f, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5); - -#define USBCAMD_PROCESSPACKETEX_DropFrame 0x0002 -#define USBCAMD_PROCESSPACKETEX_NextFrameIsStill 0x0004 -#define USBCAMD_PROCESSPACKETEX_CurrentFrameIsStill 0x0008 - -#define USBCAMD_DATA_PIPE 0x0001 -#define USBCAMD_MULTIPLEX_PIPE 0x0002 -#define USBCAMD_SYNC_PIPE 0x0004 -#define USBCAMD_DONT_CARE_PIPE 0x0008 - -#define USBCAMD_VIDEO_STREAM 0x1 -#define USBCAMD_STILL_STREAM 0x2 -#define USBCAMD_VIDEO_STILL_STREAM (USBCAMD_VIDEO_STREAM | USBCAMD_STILL_STREAM) - -#define USBCAMD_STOP_STREAM 0x00000001 -#define USBCAMD_START_STREAM 0x00000000 - -typedef struct _pipe_config_descriptor { - CHAR StreamAssociation; - UCHAR PipeConfigFlags; -} USBCAMD_Pipe_Config_Descriptor, *PUSBCAMD_Pipe_Config_Descriptor; - -typedef enum { - USBCAMD_CamControlFlag_NoVideoRawProcessing = 1, - USBCAMD_CamControlFlag_NoStillRawProcessing = 2, - USBCAMD_CamControlFlag_AssociatedFormat = 4, - USBCAMD_CamControlFlag_EnableDeviceEvents = 8 -} USBCAMD_CamControlFlags; - -typedef NTSTATUS -(DDKAPI *PCAM_ALLOCATE_BW_ROUTINE)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext, - PULONG RawFrameLength, - PVOID Format); - -typedef NTSTATUS -(DDKAPI *PCAM_ALLOCATE_BW_ROUTINE_EX)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext, - PULONG RawFrameLength, - PVOID Format, - ULONG StreamNumber); - -typedef NTSTATUS -(DDKAPI *PCAM_CONFIGURE_ROUTINE)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext, - PUSBD_INTERFACE_INFORMATION Interface, - PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - PLONG DataPipeIndex, - PLONG SyncPipeIndex); - -typedef NTSTATUS -(DDKAPI *PCAM_CONFIGURE_ROUTINE_EX)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext, - PUSBD_INTERFACE_INFORMATION Interface, - PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - ULONG PipeConfigListSize, - PUSBCAMD_Pipe_Config_Descriptor PipeConfig, - PUSB_DEVICE_DESCRIPTOR DeviceDescriptor); - -typedef NTSTATUS -(DDKAPI *PCAM_FREE_BW_ROUTINE)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext); - -typedef NTSTATUS -(DDKAPI *PCAM_FREE_BW_ROUTINE_EX)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext, - ULONG StreamNumber); - -typedef NTSTATUS -(DDKAPI *PCAM_INITIALIZE_ROUTINE)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext); - -typedef VOID -(DDKAPI *PCAM_NEW_FRAME_ROUTINE)( - PVOID DeviceContext, - PVOID FrameContext); - -typedef VOID -(DDKAPI *PCAM_NEW_FRAME_ROUTINE_EX)( - PVOID DeviceContext, - PVOID FrameContext, - ULONG StreamNumber, - PULONG FrameLength); - -typedef NTSTATUS -(DDKAPI *PCAM_PROCESS_RAW_FRAME_ROUTINE)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext, - PVOID FrameContext, - PVOID FrameBuffer, - ULONG FrameLength, - PVOID RawFrameBuffer, - ULONG RawFrameLength, - ULONG NumberOfPackets, - PULONG BytesReturned); - -typedef NTSTATUS -(DDKAPI *PCAM_PROCESS_RAW_FRAME_ROUTINE_EX)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext, - PVOID FrameContext, - PVOID FrameBuffer, - ULONG FrameLength, - PVOID RawFrameBuffer, - ULONG RawFrameLength, - ULONG NumberOfPackets, - PULONG BytesReturned, - ULONG ActualRawFrameLength, - ULONG StreamNumber); - -typedef ULONG -(DDKAPI *PCAM_PROCESS_PACKET_ROUTINE)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext, - PVOID CurrentFrameContext, - PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket, - PVOID SyncBuffer, - PUSBD_ISO_PACKET_DESCRIPTOR DataPacket, - PVOID DataBuffer, - PBOOLEAN FrameComplete, - PBOOLEAN NextFrameIsStill); - -typedef ULONG -(DDKAPI *PCAM_PROCESS_PACKET_ROUTINE_EX)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext, - PVOID CurrentFrameContext, - PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket, - PVOID SyncBuffer, - PUSBD_ISO_PACKET_DESCRIPTOR DataPacket, - PVOID DataBuffer, - PBOOLEAN FrameComplete, - PULONG PacketFlag, - PULONG ValidDataOffset); - -typedef NTSTATUS -(DDKAPI *PCAM_STATE_ROUTINE)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext); - -typedef NTSTATUS -(DDKAPI *PCAM_START_CAPTURE_ROUTINE)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext); - -typedef NTSTATUS -(DDKAPI *PCAM_START_CAPTURE_ROUTINE_EX)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext, - ULONG StreamNumber); - -typedef NTSTATUS -(DDKAPI *PCAM_STOP_CAPTURE_ROUTINE)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext); - -typedef NTSTATUS -(DDKAPI *PCAM_STOP_CAPTURE_ROUTINE_EX)( - PDEVICE_OBJECT BusDeviceObject, - PVOID DeviceContext, - ULONG StreamNumber); - -typedef struct _USBCAMD_DEVICE_DATA { - ULONG Sig; - PCAM_INITIALIZE_ROUTINE CamInitialize; - PCAM_INITIALIZE_ROUTINE CamUnInitialize; - PCAM_PROCESS_PACKET_ROUTINE CamProcessUSBPacket; - PCAM_NEW_FRAME_ROUTINE CamNewVideoFrame; - PCAM_PROCESS_RAW_FRAME_ROUTINE CamProcessRawVideoFrame; - PCAM_START_CAPTURE_ROUTINE CamStartCapture; - PCAM_STOP_CAPTURE_ROUTINE CamStopCapture; - PCAM_CONFIGURE_ROUTINE CamConfigure; - PCAM_STATE_ROUTINE CamSaveState; - PCAM_STATE_ROUTINE CamRestoreState; - PCAM_ALLOCATE_BW_ROUTINE CamAllocateBandwidth; - PCAM_FREE_BW_ROUTINE CamFreeBandwidth; -} USBCAMD_DEVICE_DATA, *PUSBCAMD_DEVICE_DATA; - -typedef struct _USBCAMD_DEVICE_DATA2 { - ULONG Sig; - PCAM_INITIALIZE_ROUTINE CamInitialize; - PCAM_INITIALIZE_ROUTINE CamUnInitialize; - PCAM_PROCESS_PACKET_ROUTINE_EX CamProcessUSBPacketEx; - PCAM_NEW_FRAME_ROUTINE_EX CamNewVideoFrameEx; - PCAM_PROCESS_RAW_FRAME_ROUTINE_EX CamProcessRawVideoFrameEx; - PCAM_START_CAPTURE_ROUTINE_EX CamStartCaptureEx; - PCAM_STOP_CAPTURE_ROUTINE_EX CamStopCaptureEx; - PCAM_CONFIGURE_ROUTINE_EX CamConfigureEx; - PCAM_STATE_ROUTINE CamSaveState; - PCAM_STATE_ROUTINE CamRestoreState; - PCAM_ALLOCATE_BW_ROUTINE_EX CamAllocateBandwidthEx; - PCAM_FREE_BW_ROUTINE_EX CamFreeBandwidthEx; -} USBCAMD_DEVICE_DATA2, *PUSBCAMD_DEVICE_DATA2; - -USBCAMAPI -ULONG -DDKAPI -USBCAMD_InitializeNewInterface( - IN PVOID DeviceContext, - IN PVOID DeviceData, - IN ULONG Version, - IN ULONG CamControlFlag); - -typedef VOID -(DDKAPI *PCOMMAND_COMPLETE_FUNCTION)( - PVOID DeviceContext, - PVOID CommandContext, - NTSTATUS NtStatus); - -typedef NTSTATUS -(DDKAPI *PFNUSBCAMD_BulkReadWrite)( - IN PVOID DeviceContext, - IN USHORT PipeIndex, - IN PVOID Buffer, - IN ULONG BufferLength, - IN PCOMMAND_COMPLETE_FUNCTION CommandComplete, - IN PVOID CommandContext); - -typedef NTSTATUS -(DDKAPI *PFNUSBCAMD_SetIsoPipeState)( - IN PVOID DeviceContext, - IN ULONG PipeStateFlags); - -typedef NTSTATUS -(DDKAPI *PFNUSBCAMD_CancelBulkReadWrite)( - IN PVOID DeviceContext, - IN ULONG PipeIndex); - -typedef NTSTATUS -(DDKAPI *PFNUSBCAMD_SetVideoFormat)( - IN PVOID DeviceContext, - IN PHW_STREAM_REQUEST_BLOCK pSrb); - -typedef NTSTATUS -(DDKAPI *PFNUSBCAMD_WaitOnDeviceEvent)( - IN PVOID DeviceContext, - IN ULONG PipeIndex, - IN PVOID Buffer, - IN ULONG BufferLength, - IN PCOMMAND_COMPLETE_FUNCTION EventComplete, - IN PVOID EventContext, - IN BOOLEAN LoopBack); - -USBCAMAPI -PVOID -DDKAPI -USBCAMD_AdapterReceivePacket( - IN PHW_STREAM_REQUEST_BLOCK Srb, - IN PUSBCAMD_DEVICE_DATA DeviceData, - IN PDEVICE_OBJECT *DeviceObject, - IN BOOLEAN NeedsCompletion); - -USBCAMAPI -NTSTATUS -DDKAPI -USBCAMD_ControlVendorCommand( - IN PVOID DeviceContext, - IN UCHAR Request, - IN USHORT Value, - IN USHORT Index, - IN PVOID Buffer, - IN OUT PULONG BufferLength, - IN BOOLEAN GetData, - IN PCOMMAND_COMPLETE_FUNCTION CommandComplete, - IN PVOID CommandContext); - -typedef VOID -(DDKAPI *PADAPTER_RECEIVE_PACKET_ROUTINE)( - IN PHW_STREAM_REQUEST_BLOCK Srb); - -USBCAMAPI -ULONG -DDKAPI -USBCAMD_DriverEntry( - PVOID Context1, - PVOID Context2, - ULONG DeviceContextSize, - ULONG FrameContextSize, - PADAPTER_RECEIVE_PACKET_ROUTINE ReceivePacket); - -USBCAMAPI -NTSTATUS -DDKAPI -USBCAMD_GetRegistryKeyValue( - IN HANDLE Handle, - IN PWCHAR KeyNameString, - IN ULONG KeyNameStringLength, - IN PVOID Data, - IN ULONG DataLength); - -USBCAMAPI -NTSTATUS -DDKAPI -USBCAMD_SelectAlternateInterface( - IN PVOID DeviceContext, - IN OUT PUSBD_INTERFACE_INFORMATION RequestInterface); - -#define USBCAMD_VERSION_200 0x200 - -typedef struct _USBCAMD_INTERFACE { - INTERFACE Interface; - PFNUSBCAMD_WaitOnDeviceEvent USBCAMD_WaitOnDeviceEvent; - PFNUSBCAMD_BulkReadWrite USBCAMD_BulkReadWrite; - PFNUSBCAMD_SetVideoFormat USBCAMD_SetVideoFormat; - PFNUSBCAMD_SetIsoPipeState USBCAMD_SetIsoPipeState; - PFNUSBCAMD_CancelBulkReadWrite USBCAMD_CancelBulkReadWrite; -} USBCAMD_INTERFACE, *PUSBCAMD_INTERFACE; - -typedef VOID -(DDKAPI *PSTREAM_RECEIVE_PACKET)( - IN PVOID Srb, - IN PVOID DeviceContext, - IN PBOOLEAN Completed); - -#if defined(DEBUG_LOG) - -USBCAMAPI -VOID -DDKAPI -USBCAMD_Debug_LogEntry( - IN CHAR *Name, - IN ULONG Info1, - IN ULONG Info2, - IN ULONG Info3); - -#define ILOGENTRY(sig, info1, info2, info3) \ - USBCAMD_Debug_LogEntry(sig, (ULONG)info1, (ULONG)info2, (ULONG)info3) - -#else - -#define ILOGENTRY(sig, info1, info2, info3) - -#endif /* DEBUG_LOG */ - -#pragma pack(pop) - -#ifdef __cplusplus -} -#endif - -#endif /* !defined(__USB_H) && !defined(__USBDI_H) */ - - -#endif /* __USBCAMDI_H */ diff --git a/reactos/include/ddk/usbdi.h b/reactos/include/ddk/usbdi.h deleted file mode 100644 index 7dd565f07f0..00000000000 --- a/reactos/include/ddk/usbdi.h +++ /dev/null @@ -1,402 +0,0 @@ -/* - * usbdi.h - * - * USBD and USB device driver definitions - * - * This file is part of the w32api package. - * - * Contributors: - * Created by Casper S. Hornstrup - * - * THIS SOFTWARE IS NOT COPYRIGHTED - * - * This source code is offered for use in the public domain. You may - * use, modify or distribute it freely. - * - * This code is distributed in the hope that it will be useful but - * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY - * DISCLAIMED. This includes but is not limited to warranties of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#ifndef __USBDI_H -#define __USBDI_H - -#ifdef __USB_H -#error usb.h cannot be included with usbdi.h -#else - -#include "usbioctl.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define USBDI_VERSION 0x300 - -#define USB_DEFAULT_DEVICE_ADDRESS 0 -#define USB_DEFAULT_ENDPOINT_ADDRESS 0 -#define USB_DEFAULT_MAX_PACKET 64 - -#define URB_FROM_IRP(Irp) ((IoGetCurrentIrpStackLocation(Irp))->Parameters.Others.Argument1) - -#define URB_FUNCTION_SELECT_CONFIGURATION 0x0000 -#define URB_FUNCTION_SELECT_INTERFACE 0x0001 -#define URB_FUNCTION_ABORT_PIPE 0x0002 -#define URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL 0x0003 -#define URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL 0x0004 -#define URB_FUNCTION_GET_FRAME_LENGTH 0x0005 -#define URB_FUNCTION_SET_FRAME_LENGTH 0x0006 -#define URB_FUNCTION_GET_CURRENT_FRAME_NUMBER 0x0007 -#define URB_FUNCTION_CONTROL_TRANSFER 0x0008 -#define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER 0x0009 -#define URB_FUNCTION_ISOCH_TRANSFER 0x000A -#define URB_FUNCTION_RESET_PIPE 0x001E -#define URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE 0x000B -#define URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT 0x0024 -#define URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE 0x0028 -#define URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE 0x000C -#define URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT 0x0025 -#define URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE 0x0029 -#define URB_FUNCTION_SET_FEATURE_TO_DEVICE 0x000D -#define URB_FUNCTION_SET_FEATURE_TO_INTERFACE 0x000E -#define URB_FUNCTION_SET_FEATURE_TO_ENDPOINT 0x000F -#define URB_FUNCTION_SET_FEATURE_TO_OTHER 0x0023 -#define URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE 0x0010 -#define URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE 0x0011 -#define URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT 0x0012 -#define URB_FUNCTION_CLEAR_FEATURE_TO_OTHER 0x0022 -#define URB_FUNCTION_GET_STATUS_FROM_DEVICE 0x0013 -#define URB_FUNCTION_GET_STATUS_FROM_INTERFACE 0x0014 -#define URB_FUNCTION_GET_STATUS_FROM_ENDPOINT 0x0015 -#define URB_FUNCTION_GET_STATUS_FROM_OTHER 0x0021 -#define URB_FUNCTION_RESERVED0 0x0016 -#define URB_FUNCTION_VENDOR_DEVICE 0x0017 -#define URB_FUNCTION_VENDOR_INTERFACE 0x0018 -#define URB_FUNCTION_VENDOR_ENDPOINT 0x0019 -#define URB_FUNCTION_VENDOR_OTHER 0x0020 -#define URB_FUNCTION_CLASS_DEVICE 0x001A -#define URB_FUNCTION_CLASS_INTERFACE 0x001B -#define URB_FUNCTION_CLASS_ENDPOINT 0x001C -#define URB_FUNCTION_CLASS_OTHER 0x001F -#define URB_FUNCTION_RESERVED 0x001D -#define URB_FUNCTION_GET_CONFIGURATION 0x0026 -#define URB_FUNCTION_GET_INTERFACE 0x0027 -#define URB_FUNCTION_LAST 0x0029 - -typedef LONG USBD_STATUS; -typedef PVOID USBD_PIPE_HANDLE; -typedef PVOID USBD_CONFIGURATION_HANDLE; -typedef PVOID USBD_INTERFACE_HANDLE; - -#define USBD_ERROR(Status) ((USBD_STATUS)(Status) < 0) -#define USBD_HALTED(Status) ((ULONG)(Status) >> 30 == 3) -#define USBD_PENDING(Status) ((ULONG)(Status) >> 30 == 1) -#define USBD_STATUS(Status) ((ULONG)(Status) & 0x0FFFFFFFL) -#define USBD_SUCCESS(Status) ((USBD_STATUS)(Status) >= 0) - -#define USBD_STATUS_SUCCESS ((USBD_STATUS)0x00000000L) -#define USBD_STATUS_PENDING ((USBD_STATUS)0x40000000L) -#define USBD_STATUS_HALTED ((USBD_STATUS)0xC0000000L) -#define USBD_STATUS_ERROR ((USBD_STATUS)0x80000000L) -#define USBD_STATUS_NO_MEMORY ((USBD_STATUS)0x80000100L) -#define USBD_STATUS_INVALID_URB_FUNCTION ((USBD_STATUS)0x80000200L) -#define USBD_STATUS_INVALID_PARAMETER ((USBD_STATUS)0x80000300L) -#define USBD_STATUS_ERROR_BUSY ((USBD_STATUS)0x80000400L) -#define USBD_STATUS_REQUEST_FAILED ((USBD_STATUS)0x80000500L) -#define USBD_STATUS_INVALID_PIPE_HANDLE ((USBD_STATUS)0x80000600L) -#define USBD_STATUS_NO_BANDWIDTH ((USBD_STATUS)0x80000700L) -#define USBD_STATUS_INTERNAL_HC_ERROR ((USBD_STATUS)0x80000800L) -#define USBD_STATUS_ERROR_SHORT_TRANSFER ((USBD_STATUS)0x80000900L) -#define USBD_STATUS_CRC ((USBD_STATUS)0xC0000001L) -#define USBD_STATUS_BTSTUFF ((USBD_STATUS)0xC0000002L) -#define USBD_STATUS_DATA_TOGGLE_MISMATCH ((USBD_STATUS)0xC0000003L) -#define USBD_STATUS_STALL_PID ((USBD_STATUS)0xC0000004L) -#define USBD_STATUS_DEV_NOT_RESPONDING ((USBD_STATUS)0xC0000005L) -#define USBD_STATUS_PID_CHECK_FAILURE ((USBD_STATUS)0xC0000006L) -#define USBD_STATUS_UNEXPECTED_PID ((USBD_STATUS)0xC0000007L) -#define USBD_STATUS_DATA_OVERRUN ((USBD_STATUS)0xC0000008L) -#define USBD_STATUS_DATA_UNDERRUN ((USBD_STATUS)0xC0000009L) -#define USBD_STATUS_RESERVED1 ((USBD_STATUS)0xC000000AL) -#define USBD_STATUS_RESERVED2 ((USBD_STATUS)0xC000000BL) -#define USBD_STATUS_BUFFER_OVERRUN ((USBD_STATUS)0xC000000CL) -#define USBD_STATUS_BUFFER_UNDERRUN ((USBD_STATUS)0xC000000DL) -#define USBD_STATUS_NOT_ACCESSED ((USBD_STATUS)0xC000000FL) -#define USBD_STATUS_FIFO ((USBD_STATUS)0xC0000010L) -#define USBD_STATUS_ENDPOINT_HALTED ((USBD_STATUS)0xC0000030L) -#define USBD_STATUS_BAD_START_FRAME ((USBD_STATUS)0xC0000A00L) -#define USBD_STATUS_ISOCH_REQUEST_FAILED ((USBD_STATUS)0xC0000B00L) -#define USBD_STATUS_FRAME_CONTROL_OWNED ((USBD_STATUS)0xC0000C00L) -#define USBD_STATUS_FRAME_CONTROL_NOT_OWNED \ - ((USBD_STATUS)0xC0000D00L) -#define USBD_STATUS_INAVLID_CONFIGURATION_DESCRIPTOR \ - ((USBD_STATUS)0xC0000F00L) -#define USBD_STATUS_CANCELING ((USBD_STATUS)0x00020000L) - -#define USBD_PIPE_DIRECTION_IN(pipeInformation) \ - ((pipeInformation)->EndpointAddress & USB_ENDPOINT_DIRECTION_MASK) - -struct _URB_HEADER { - USHORT Length; - USHORT Function; - USBD_STATUS Status; - PVOID UsbdDeviceHandle; - ULONG UsbdFlags; -}; - -struct _URB_HCD_AREA { - PVOID HcdEndpoint; - PIRP HcdIrp; - LIST_ENTRY HcdListEntry; - LIST_ENTRY HcdListEntry2; - PVOID HcdCurrentIoFlushPointer; - PVOID HcdExtension; -}; - -struct _URB_BULK_OR_INTERRUPT_TRANSFER { - struct _URB_HEADER Hdr; - USBD_PIPE_HANDLE PipeHandle; - ULONG TransferFlags; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; -}; - -struct _URB_CONTROL_DESCRIPTOR_REQUEST { - struct _URB_HEADER Hdr; - PVOID Reserved; - ULONG Reserved0; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - USHORT Reserved1; - UCHAR Index; - UCHAR DescriptorType; - USHORT LanguageId; - USHORT Reserved2; -}; - -struct _URB_CONTROL_FEATURE_REQUEST { - struct _URB_HEADER Hdr; - PVOID Reserved; - ULONG Reserved2; - ULONG Reserved3; - PVOID Reserved4; - PMDL Reserved5; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - USHORT Reserved0; - USHORT FeatureSelector; - USHORT Index; - USHORT Reserved1; -}; - -struct _URB_CONTROL_GET_CONFIGURATION_REQUEST { - struct _URB_HEADER Hdr; - PVOID Reserved; - ULONG Reserved0; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - UCHAR Reserved1[8]; -}; - -struct _URB_CONTROL_GET_INTERFACE_REQUEST { - struct _URB_HEADER Hdr; - PVOID Reserved; - ULONG Reserved0; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - UCHAR Reserved1[4]; - USHORT Interface; - USHORT Reserved2; -}; - -struct _URB_CONTROL_GET_STATUS_REQUEST { - struct _URB_HEADER Hdr; - PVOID Reserved; - ULONG Reserved0; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - UCHAR Reserved1[4]; - USHORT Index; - USHORT Reserved2; -}; - -struct _URB_CONTROL_TRANSFER { - struct _URB_HEADER Hdr; - USBD_PIPE_HANDLE PipeHandle; - ULONG TransferFlags; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - UCHAR SetupPacket[8]; -}; - -struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST { - struct _URB_HEADER Hdr; - PVOID Reserved; - ULONG TransferFlags; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - UCHAR RequestTypeReservedBits; - UCHAR Request; - USHORT Value; - USHORT Index; - USHORT Reserved1; -}; - -struct _URB_FRAME_LENGTH_CONTROL { - struct _URB_HEADER Hdr; -}; - -struct _URB_GET_CURRENT_FRAME_NUMBER { - struct _URB_HEADER Hdr; - ULONG FrameNumber; -}; - -struct _URB_GET_FRAME_LENGTH { - struct _URB_HEADER Hdr; - ULONG FrameLength; - ULONG FrameNumber; -}; - -typedef struct _USBD_ISO_PACKET_DESCRIPTOR { - ULONG Offset; - ULONG Length; - USBD_STATUS Status; -} USBD_ISO_PACKET_DESCRIPTOR, *PUSBD_ISO_PACKET_DESCRIPTOR; - -struct _URB_ISOCH_TRANSFER { - struct _URB_HEADER Hdr; - USBD_PIPE_HANDLE PipeHandle; - ULONG TransferFlags; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - ULONG StartFrame; - ULONG NumberOfPackets; - ULONG ErrorCount; - USBD_ISO_PACKET_DESCRIPTOR IsoPacket[1]; -}; - -struct _URB_PIPE_REQUEST { - struct _URB_HEADER Hdr; - USBD_PIPE_HANDLE PipeHandle; - ULONG Reserved; -}; - -struct _URB_SET_FRAME_LENGTH { - struct _URB_HEADER Hdr; - LONG FrameLengthDelta; -}; - -typedef struct _USBD_DEVICE_INFORMATION { - ULONG OffsetNext; - PVOID UsbdDeviceHandle; - USB_DEVICE_DESCRIPTOR DeviceDescriptor; -} USBD_DEVICE_INFORMATION, *PUSBD_DEVICE_INFORMATION; - -typedef enum _USBD_PIPE_TYPE { - UsbdPipeTypeControl, - UsbdPipeTypeIsochronous, - UsbdPipeTypeBulk, - UsbdPipeTypeInterrupt -} USBD_PIPE_TYPE; - -/* USBD_PIPE_INFORMATION.PipeFlags constants */ -#define USBD_PF_CHANGE_MAX_PACKET 0x00000001 -#define USBD_PF_DOUBLE_BUFFER 0x00000002 -#define USBD_PF_ENABLE_RT_THREAD_ACCESS 0x00000004 -#define USBD_PF_MAP_ADD_TRANSFERS 0x00000008 - -typedef struct _USBD_PIPE_INFORMATION { - USHORT MaximumPacketSize; - UCHAR EndpointAddress; - UCHAR Interval; - USBD_PIPE_TYPE PipeType; - USBD_PIPE_HANDLE PipeHandle; - ULONG MaximumTransferSize; - ULONG PipeFlags; -} USBD_PIPE_INFORMATION, *PUSBD_PIPE_INFORMATION; - -typedef struct _USBD_INTERFACE_INFORMATION { - USHORT Length; - UCHAR InterfaceNumber; - UCHAR AlternateSetting; - UCHAR Class; - UCHAR SubClass; - UCHAR Protocol; - UCHAR Reserved; - USBD_INTERFACE_HANDLE InterfaceHandle; - ULONG NumberOfPipes; - USBD_PIPE_INFORMATION Pipes[1]; -} USBD_INTERFACE_INFORMATION, *PUSBD_INTERFACE_INFORMATION; - -struct _URB_SELECT_CONFIGURATION { - struct _URB_HEADER Hdr; - PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; - USBD_CONFIGURATION_HANDLE ConfigurationHandle; - USBD_INTERFACE_INFORMATION Interface; -}; - -struct _URB_SELECT_INTERFACE { - struct _URB_HEADER Hdr; - USBD_CONFIGURATION_HANDLE ConfigurationHandle; - USBD_INTERFACE_INFORMATION Interface; -}; - -typedef struct _USBD_VERSION_INFORMATION { - ULONG USBDI_Version; - ULONG Supported_USB_Version; -} USBD_VERSION_INFORMATION, *PUSBD_VERSION_INFORMATION; - -typedef struct _URB { - union { - struct _URB_HEADER UrbHeader; - struct _URB_SELECT_INTERFACE UrbSelectInterface; - struct _URB_SELECT_CONFIGURATION UrbSelectConfiguration; - struct _URB_PIPE_REQUEST UrbPipeRequest; - struct _URB_FRAME_LENGTH_CONTROL UrbFrameLengthControl; - struct _URB_GET_FRAME_LENGTH UrbGetFrameLength; - struct _URB_SET_FRAME_LENGTH UrbSetFrameLength; - struct _URB_GET_CURRENT_FRAME_NUMBER UrbGetCurrentFrameNumber; - struct _URB_CONTROL_TRANSFER UrbControlTransfer; - struct _URB_BULK_OR_INTERRUPT_TRANSFER UrbBulkOrInterruptTransfer; - struct _URB_ISOCH_TRANSFER UrbIsochronousTransfer; - struct _URB_CONTROL_DESCRIPTOR_REQUEST UrbControlDescriptorRequest; - struct _URB_CONTROL_GET_STATUS_REQUEST UrbControlGetStatusRequest; - struct _URB_CONTROL_FEATURE_REQUEST UrbControlFeatureRequest; - struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST UrbControlVendorClassRequest; - struct _URB_CONTROL_GET_INTERFACE_REQUEST UrbControlGetInterfaceRequest; - struct _URB_CONTROL_GET_CONFIGURATION_REQUEST UrbControlGetConfigurationRequest; - }; -} URB, *PURB; - -#ifdef __cplusplus -} -#endif - -#endif /* defined __USB_H */ - -#endif /* __USBDI_H */ diff --git a/reactos/include/ddk/usbdlib.h b/reactos/include/ddk/usbdlib.h index 3bb214b92aa..7f21da67b51 100644 --- a/reactos/include/ddk/usbdlib.h +++ b/reactos/include/ddk/usbdlib.h @@ -1,12 +1,9 @@ -#ifndef USBDLIB_H__ -#define USBDLIB_H__ +#pragma once - -typedef struct _USBD_INTERFACE_LIST_ENTRY -{ - PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor; - PUSBD_INTERFACE_INFORMATION Interface; -}USBD_INTERFACE_LIST_ENTRY, *PUSBD_INTERFACE_LIST_ENTRY; +typedef struct _USBD_INTERFACE_LIST_ENTRY { + PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor; + PUSBD_INTERFACE_INFORMATION Interface; +} USBD_INTERFACE_LIST_ENTRY, *PUSBD_INTERFACE_LIST_ENTRY; #define UsbBuildInterruptOrBulkTransferRequest(urb,length, pipeHandle, transferBuffer, transferBufferMDL, transferBufferLength, transferFlags, link) \ { \ @@ -44,7 +41,6 @@ typedef struct _USBD_INTERFACE_LIST_ENTRY (urb)->UrbControlGetStatusRequest.UrbLink = (link); \ } - #define UsbBuildFeatureRequest(urb, op, featureSelector, index, link) \ { \ (urb)->UrbHeader.Function = (op); \ @@ -120,102 +116,87 @@ typedef struct _USBD_INTERFACE_LIST_ENTRY #define GET_ISO_URB_SIZE(n) (sizeof(struct _URB_ISOCH_TRANSFER)+ \ sizeof(USBD_ISO_PACKET_DESCRIPTOR)*n) - #ifndef _USBD_ DECLSPEC_IMPORT VOID NTAPI USBD_GetUSBDIVersion( - OUT PUSBD_VERSION_INFORMATION VersionInformation -); - + OUT PUSBD_VERSION_INFORMATION VersionInformation); DECLSPEC_IMPORT PUSB_INTERFACE_DESCRIPTOR NTAPI USBD_ParseConfigurationDescriptor( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - IN UCHAR InterfaceNumber, - IN UCHAR AlternateSetting -); + IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + IN UCHAR InterfaceNumber, + IN UCHAR AlternateSetting); DECLSPEC_IMPORT PURB NTAPI USBD_CreateConfigurationRequest( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - OUT PUSHORT Siz -); + IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + OUT PUSHORT Siz); DECLSPEC_IMPORT PUSB_COMMON_DESCRIPTOR NTAPI USBD_ParseDescriptors( - IN PVOID DescriptorBuffer, - IN ULONG TotalLength, - IN PVOID StartPosition, - IN LONG DescriptorType -); + IN PVOID DescriptorBuffer, + IN ULONG TotalLength, + IN PVOID StartPosition, + IN LONG DescriptorType); DECLSPEC_IMPORT PUSB_INTERFACE_DESCRIPTOR NTAPI USBD_ParseConfigurationDescriptorEx( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - IN PVOID StartPosition, - IN LONG InterfaceNumber, - IN LONG AlternateSetting, - IN LONG InterfaceClass, - IN LONG InterfaceSubClass, - IN LONG InterfaceProtocol -); + IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + IN PVOID StartPosition, + IN LONG InterfaceNumber, + IN LONG AlternateSetting, + IN LONG InterfaceClass, + IN LONG InterfaceSubClass, + IN LONG InterfaceProtocol); DECLSPEC_IMPORT PURB NTAPI USBD_CreateConfigurationRequestEx( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - IN PUSBD_INTERFACE_LIST_ENTRY InterfaceList -); + IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + IN PUSBD_INTERFACE_LIST_ENTRY InterfaceList); - -DECLSPEC_IMPORT +DECLSPEC_EXPORT ULONG NTAPI USBD_GetInterfaceLength( - IN PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor, - IN PUCHAR BufferEnd -); + IN PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor, + IN PUCHAR BufferEnd); -DECLSPEC_IMPORT +DECLSPEC_EXPORT VOID NTAPI USBD_RegisterHcFilter( - IN PDEVICE_OBJECT DeviceObject, - IN PDEVICE_OBJECT FilterDeviceObject -); + IN PDEVICE_OBJECT DeviceObject, + IN PDEVICE_OBJECT FilterDeviceObject); - - -DECLSPEC_IMPORT +DECLSPEC_EXPORT NTSTATUS NTAPI USBD_GetPdoRegistryParameter( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PVOID Parameter, - IN ULONG ParameterLength, - IN PWSTR KeyName, - IN ULONG KeyNameLength -); + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN OUT PVOID Parameter, + IN ULONG ParameterLength, + IN PWSTR KeyName, + IN ULONG KeyNameLength); -DECLSPEC_IMPORT +DECLSPEC_EXPORT NTSTATUS NTAPI USBD_QueryBusTime( - IN PDEVICE_OBJECT RootHubPdo, - OUT PULONG CurrentFrame -); + IN PDEVICE_OBJECT RootHubPdo, + OUT PULONG CurrentFrame); #if (NTDDI_VERSION >= NTDDI_WINXP) @@ -223,10 +204,9 @@ DECLSPEC_IMPORT ULONG NTAPI USBD_CalculateUsbBandwidth( - IN ULONG MaxPacketSize, - IN UCHAR EndpointType, - IN BOOLEAN LowSpeed -); + IN ULONG MaxPacketSize, + IN UCHAR EndpointType, + IN BOOLEAN LowSpeed); #endif @@ -236,15 +216,11 @@ DECLSPEC_IMPORT USBD_STATUS NTAPI USBD_ValidateConfigurationDescriptor( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc, - IN ULONG BufferLength, - IN USHORT Level, - OUT PUCHAR *Offset, - IN ULONG Tag -); - - -#endif + IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc, + IN ULONG BufferLength, + IN USHORT Level, + OUT PUCHAR *Offset, + IN ULONG Tag OPTIONAL); #endif diff --git a/reactos/include/ddk/usbdrivr.h b/reactos/include/ddk/usbdrivr.h new file mode 100644 index 00000000000..e1a27b6bb13 --- /dev/null +++ b/reactos/include/ddk/usbdrivr.h @@ -0,0 +1,9 @@ +#pragma once + +#define USB_KERNEL_IOCTL +#include "usbioctl.h" +#undef USB_KERNEL_IOCTL + +#include "usb.h" +#include "usbdlib.h" +#include "usbbusif.h" diff --git a/reactos/include/ddk/usbioctl.h b/reactos/include/ddk/usbioctl.h deleted file mode 100644 index 3d5457c7398..00000000000 --- a/reactos/include/ddk/usbioctl.h +++ /dev/null @@ -1,348 +0,0 @@ -/* - * usbioctl.h - * - * USB IOCTL interface. - * - * This file is part of the w32api package. - * - * Contributors: - * Created by Casper S. Hornstrup - * - * THIS SOFTWARE IS NOT COPYRIGHTED - * - * This source code is offered for use in the public domain. You may - * use, modify or distribute it freely. - * - * This code is distributed in the hope that it will be useful but - * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY - * DISCLAIMED. This includes but is not limited to warranties of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#ifndef __USBIOCTL_H -#define __USBIOCTL_H - -#include "usb100.h" -#include "usbiodef.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define USBD_PORT_ENABLED 1 -#define USBD_PORT_CONNECTED 2 - -#define IOCTL_INTERNAL_USB_CYCLE_PORT \ - CTL_CODE(FILE_DEVICE_USB, USB_CYCLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS) - -#define IOCTL_INTERNAL_USB_ENABLE_PORT \ - CTL_CODE(FILE_DEVICE_USB, USB_ENABLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS) - -#define IOCTL_INTERNAL_USB_GET_BUS_INFO \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_BUS_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_INTERNAL_USB_GET_BUSGUID_INFO \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_BUSGUID_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_CONTROLLER_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS) - -#define IOCTL_INTERNAL_USB_GET_HUB_COUNT \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_COUNT, METHOD_NEITHER, FILE_ANY_ACCESS) - -#define IOCTL_INTERNAL_USB_GET_HUB_NAME \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_PARENT_HUB_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_INTERNAL_USB_GET_PORT_STATUS \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_PORT_STATUS, METHOD_NEITHER, FILE_ANY_ACCESS) - -#define IOCTL_INTERNAL_USB_RESET_PORT \ - CTL_CODE(FILE_DEVICE_USB, USB_RESET_PORT, METHOD_NEITHER, FILE_ANY_ACCESS) - -#define IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_ROOTHUB_PDO, METHOD_NEITHER, FILE_ANY_ACCESS) - -#define IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION \ - CTL_CODE(FILE_DEVICE_USB, USB_IDLE_NOTIFICATION, METHOD_NEITHER, FILE_ANY_ACCESS) - -#define IOCTL_INTERNAL_USB_SUBMIT_URB \ - CTL_CODE(FILE_DEVICE_USB, USB_SUBMIT_URB, METHOD_NEITHER, FILE_ANY_ACCESS) - - -#define IOCTL_USB_DIAG_IGNORE_HUBS_ON \ - CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_ON, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_DIAG_IGNORE_HUBS_OFF \ - CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_DIAGNOSTIC_MODE_OFF \ - CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_DIAGNOSTIC_MODE_ON \ - CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_ON, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_HUB_CAPABILITIES \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_ROOT_HUB_NAME \ - CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_GET_HCD_DRIVERKEY_NAME \ - CTL_CODE(FILE_DEVICE_USB, HCD_GET_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_NODE_INFORMATION \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_NODE_CONNECTION_NAME \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_HCD_DISABLE_PORT \ - CTL_CODE(FILE_DEVICE_USB, HCD_DISABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_HCD_ENABLE_PORT \ - CTL_CODE(FILE_DEVICE_USB, HCD_ENABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_HCD_GET_STATS_1 \ - CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_1, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_HCD_GET_STATS_2 \ - CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_2, METHOD_BUFFERED, FILE_ANY_ACCESS) - - -typedef struct _USB_HUB_CAPABILITIES { - ULONG HubIs2xCapable : 1; -} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES; - -typedef enum _USB_CONNECTION_STATUS { - NoDeviceConnected, - DeviceConnected, - DeviceFailedEnumeration, - DeviceGeneralFailure, - DeviceCausedOvercurrent, - DeviceNotEnoughPower, - DeviceNotEnoughBandwidth, - DeviceHubNestedTooDeeply, - DeviceInLegacyHub -} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; - -#include - -typedef struct _USB_DESCRIPTOR_REQUEST { - ULONG ConnectionIndex; - struct { - UCHAR bmRequest; - UCHAR bRequest; - USHORT wValue; - USHORT wIndex; - USHORT wLength; - } SetupPacket; - UCHAR Data[0]; -} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST; - -typedef struct _USB_HCD_DRIVERKEY_NAME { - ULONG ActualLength; - WCHAR DriverKeyName[1]; -} USB_HCD_DRIVERKEY_NAME, *PUSB_HCD_DRIVERKEY_NAME; - -typedef struct _HCD_ISO_STAT_COUNTERS { - USHORT LateUrbs; - USHORT DoubleBufferedPackets; - USHORT TransfersCF_5ms; - USHORT TransfersCF_2ms; - USHORT TransfersCF_1ms; - USHORT MaxInterruptLatency; - USHORT BadStartFrame; - USHORT StaleUrbs; - USHORT IsoPacketNotAccesed; - USHORT IsoPacketHWError; - USHORT SmallestUrbPacketCount; - USHORT LargestUrbPacketCount; - USHORT IsoCRC_Error; - USHORT IsoOVERRUN_Error; - USHORT IsoINTERNAL_Error; - USHORT IsoUNKNOWN_Error; - ULONG IsoBytesTransferred; - USHORT LateMissedCount; - USHORT HWIsoMissedCount; - ULONG Reserved7[8]; -} HCD_ISO_STAT_COUNTERS, *PHCD_ISO_STAT_COUNTERS; - -typedef struct _HCD_STAT_COUNTERS { - ULONG BytesTransferred; - USHORT IsoMissedCount; - USHORT DataOverrunErrorCount; - USHORT CrcErrorCount; - USHORT ScheduleOverrunCount; - USHORT TimeoutErrorCount; - USHORT InternalHcErrorCount; - USHORT BufferOverrunErrorCount; - USHORT SWErrorCount; - USHORT StallPidCount; - USHORT PortDisableCount; -} HCD_STAT_COUNTERS, *PHCD_STAT_COUNTERS; - -typedef struct _HCD_STAT_INFORMATION_1 { - ULONG Reserved1; - ULONG Reserved2; - ULONG ResetCounters; - LARGE_INTEGER TimeRead; - HCD_STAT_COUNTERS Counters; -} HCD_STAT_INFORMATION_1, *PHCD_STAT_INFORMATION_1; - -typedef struct _HCD_STAT_INFORMATION_2 { - ULONG Reserved1; - ULONG Reserved2; - ULONG ResetCounters; - LARGE_INTEGER TimeRead; - LONG LockedMemoryUsed; - HCD_STAT_COUNTERS Counters; - HCD_ISO_STAT_COUNTERS IsoCounters; -} HCD_STAT_INFORMATION_2, *PHCD_STAT_INFORMATION_2; - -typedef struct _USB_HUB_INFORMATION { - USB_HUB_DESCRIPTOR HubDescriptor; - BOOLEAN HubIsBusPowered; -} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION; - -typedef struct _USB_HUB_NAME { - ULONG ActualLength; - WCHAR HubName[1]; -} USB_HUB_NAME, *PUSB_HUB_NAME; - -typedef enum _USB_HUB_NODE { - UsbHub, - UsbMIParent -} USB_HUB_NODE; - -typedef VOID NTAPI -(*USB_IDLE_CALLBACK)( - PVOID Context); - -typedef struct _USB_IDLE_CALLBACK_INFO { - USB_IDLE_CALLBACK IdleCallback; - PVOID IdleContext; -} USB_IDLE_CALLBACK_INFO, *PUSB_IDLE_CALLBACK_INFO; - -typedef struct _USB_NODE_CONNECTION_ATTRIBUTES { - ULONG ConnectionIndex; - USB_CONNECTION_STATUS ConnectionStatus; - ULONG PortAttributes; -} USB_NODE_CONNECTION_ATTRIBUTES, *PUSB_NODE_CONNECTION_ATTRIBUTES; - -typedef struct _USB_NODE_CONNECTION_DRIVERKEY_NAME { - ULONG ConnectionIndex; - ULONG ActualLength; - WCHAR DriverKeyName[1]; -} USB_NODE_CONNECTION_DRIVERKEY_NAME, *PUSB_NODE_CONNECTION_DRIVERKEY_NAME; - -typedef struct _USB_PIPE_INFO { - USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; - ULONG ScheduleOffset; -} USB_PIPE_INFO, *PUSB_PIPE_INFO; - -typedef struct _USB_NODE_CONNECTION_INFORMATION { - ULONG ConnectionIndex; - USB_DEVICE_DESCRIPTOR DeviceDescriptor; - UCHAR CurrentConfigurationValue; - BOOLEAN LowSpeed; - BOOLEAN DeviceIsHub; - USHORT DeviceAddress; - ULONG NumberOfOpenPipes; - USB_CONNECTION_STATUS ConnectionStatus; - USB_PIPE_INFO PipeList[0]; -} USB_NODE_CONNECTION_INFORMATION, *PUSB_NODE_CONNECTION_INFORMATION; - -typedef struct _USB_NODE_CONNECTION_NAME { - ULONG ConnectionIndex; - ULONG ActualLength; - WCHAR NodeName[1]; -} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME; - -typedef struct _USB_MI_PARENT_INFORMATION { - ULONG NumberOfInterfaces; -} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION; - -typedef struct _USB_NODE_INFORMATION { - USB_HUB_NODE NodeType; - union { - USB_HUB_INFORMATION HubInformation; - USB_MI_PARENT_INFORMATION MiParentInformation; - } u; -} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION; - -#define WMI_USB_DRIVER_INFORMATION 0 -#define WMI_USB_DRIVER_NOTIFICATION 1 -#define WMI_USB_POWER_DEVICE_ENABLE 2 - -typedef enum _USB_NOTIFICATION_TYPE { - EnumerationFailure = 0, - InsufficentBandwidth, - InsufficentPower, - OverCurrent, - ResetOvercurrent, - AcquireBusInfo, - AcquireHubName, - AcquireControllerName, - HubOvercurrent, - HubPowerChange, - HubNestedTooDeeply, - ModernDeviceInLegacyHub -} USB_NOTIFICATION_TYPE; - -typedef struct _USB_ACQUIRE_INFO { - USB_NOTIFICATION_TYPE NotificationType; - ULONG TotalSize; - WCHAR Buffer[1]; -} USB_ACQUIRE_INFO, *PUSB_ACQUIRE_INFO; - -typedef struct _USB_NOTIFICATION { - USB_NOTIFICATION_TYPE NotificationType; -} USB_NOTIFICATION, *PUSB_NOTIFICATION; - -typedef struct _USB_BUS_NOTIFICATION { - USB_NOTIFICATION_TYPE NotificationType; - ULONG TotalBandwidth; - ULONG ConsumedBandwidth; - ULONG ControllerNameLength; -} USB_BUS_NOTIFICATION, *PUSB_BUS_NOTIFICATION; - -typedef struct _USB_CONNECTION_NOTIFICATION { - USB_NOTIFICATION_TYPE NotificationType; - ULONG ConnectionNumber; - ULONG RequestedBandwidth; - ULONG EnumerationFailReason; - ULONG PowerRequested; - ULONG HubNameLength; -} USB_CONNECTION_NOTIFICATION, *PUSB_CONNECTION_NOTIFICATION; - -typedef struct _USB_ROOT_HUB_NAME { - ULONG ActualLength; - WCHAR RootHubName[1]; -} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME; - -#include - -#ifdef __cplusplus -} -#endif - -#endif /* __USBIOCTL_H */ diff --git a/reactos/include/ddk/usbkern.h b/reactos/include/ddk/usbkern.h index 26cb6ee6266..56b0f74a1e1 100644 --- a/reactos/include/ddk/usbkern.h +++ b/reactos/include/ddk/usbkern.h @@ -1,15 +1,3 @@ - -#ifndef __USBKERN_H__ -#define __USBKERN_H__ +#pragma once #include "usbiodef.h" - -#define IOCTL_INTERNAL_USB_GET_HUB_COUNT USB_KERNEL_CTL(USB_GET_HUB_COUNT) -#define IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO USB_KERNEL_CTL(USB_GET_ROOTHUB_PDO) - -#define IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS) - -#endif - - diff --git a/reactos/include/ddk/usbprint.h b/reactos/include/ddk/usbprint.h index 58fa13cf170..a2efc4fa746 100644 --- a/reactos/include/ddk/usbprint.h +++ b/reactos/include/ddk/usbprint.h @@ -1,5 +1,5 @@ - #define USBPRINT_IOCTL_INDEX 0x0000 + #define IOCTL_USBPRINT_GET_LPT_STATUS \ CTL_CODE(FILE_DEVICE_UNKNOWN, USBPRINT_IOCTL_INDEX+12, METHOD_BUFFERED, FILE_ANY_ACCESS) @@ -14,4 +14,3 @@ #define IOCTL_USBPRINT_SOFT_RESET \ CTL_CODE(FILE_DEVICE_UNKNOWN, USBPRINT_IOCTL_INDEX+16, METHOD_BUFFERED, FILE_ANY_ACCESS) - diff --git a/reactos/include/ddk/usbprotocoldefs.h b/reactos/include/ddk/usbprotocoldefs.h new file mode 100644 index 00000000000..9a25a1bc745 --- /dev/null +++ b/reactos/include/ddk/usbprotocoldefs.h @@ -0,0 +1,677 @@ +#pragma once + +#include + +#define USB_UnConnected_Device_Address 0 +#define USB_UNCONNECTED_ADDRESS(address) ( USB_UnConnected_Device_Address == (address)) +#define USB_CONNECTED_ADDRESS(address) ( USB_UnConnected_Device_Address != (address) ) + +#define PID_OUT 1 +#define PID_IN 9 +#define PID_SOF 5 +#define PID_SETUP 13 + +#define PID_DATA0 3 +#define PID_DATA1 11 +#define PID_DATA2 7 +#define PID_MDATA 15 + +#define USB_ACK 2 +#define USB_NAK 10 +#define USB_STALL 14 +#define USB_NYET 6 + +#define USB_PRE 12 +#define USB_ERR 12 +#define USB_SPLIT 8 +#define USB_PING 4 + +#define USB_TIMEOUT 0 + +#define USB_SPEC 0x0200 +#define HID_SPEC 0x0101 + +#define USB_20_SPEC 0x0200 +#define USB_11_SPEC 0x0110 +#define USB_10_SPEC 0x0100 + +#define HID_MAX_PACKET_SIZE0 0x08 +#define MICROSOFT_VENDOR_ID 0x045E +#define HID_DEVICE_RELEASE 0x0100 + +#define HID_MAX_PACKET_SIZE 0x0008 +#define HID_POLLING_INTERVAL 0x0A +#define MAX_POLLING_INTERVAL 0xFF + +#define USB_DEFAULT_KEYBOARD_PRODUCT_ID 0x000B +#define USB_DEFAULT_MOUSE_PRODUCT_ID 0x0040 + +#define DEVICE_DESCRIPTOR 0x01 +#define CONFIGURATION_DESCRIPTOR 0x02 +#define STRING_DESCRIPTOR 0x03 +#define INTERFACE_DESCRIPTOR 0x04 +#define ENDPOINT_DESCRIPTOR 0x05 +#define QUALIFIER_DESCRIPTOR 0x06 +#define OTHER_SPEED_DESCRIPTOR 0x07 +#define INTERFACE_POWER_DESCRIPTOR 0x08 + +#define HID_DESCRIPTOR 0x21 +#define REPORT_DESCRIPTOR 0x22 +#define PHYSICAL_DESCRIPTOR 0x23 +#define HUB_DESCRIPTOR 0x29 + +#define USB_DESCRIPTOR_TYPE_STD 0 +#define USB_DESCRIPTOR_TYPE_CLASS 1 +#define USB_DESCRIPTOR_TYPE_VENDOR 2 +#define USB_DESCRIPTOR_TYPE_RESERVED 3 + +#define DIR_HOST_TO_DEVICE 0 +#define DIR_DEVICE_TO_HOST 1 + +#define TYPE_STANDARD 0 +#define TYPE_CLASS 1 +#define TYPE_VENDOR 2 +#define TYPE_RESERVED 3 + +#define RCPT_DEVICE 0 +#define RCPT_INTERFACE 1 +#define RCPT_ENDPOINT 2 +#define RCPT_OTHER 3 +#define RCPT_PORT 4 +#define RCPT_RPIPE 5 + +#if !defined(MIDL_PASS) +#define USB_MAKE_REQUEST_TYPE(direction, type, recipient) (BYTE)( ((BYTE)direction << 7) | ((BYTE)type << 5) | ((BYTE)recipient & 0x07) ) +#endif + +#define GET_STATUS 0 +#define CLEAR_FEATURE 1 +#define SET_FEATURE 3 +#define SET_ADDRESS 5 +#define GET_DESCRIPTOR 6 +#define SET_DESCRIPTOR 7 +#define GET_CONFIGURATION 8 +#define SET_CONFIGURATION 9 +#define GET_INTERFACE 10 +#define SET_INTERFACE 11 +#define SYNCH_FRAME 12 + +#define USB_BULK_ONLY_MASS_STG_RESET 0xFF +#define USB_BULK_ONLY_MASS_STG_GET_MAX_LUN 0xFE + +#define GET_REPORT 0x01 +#define GET_IDLE 0x02 +#define GET_PROTOCOL 0x03 +#define SET_REPORT 0x09 +#define SET_IDLE 0x0A +#define SET_PROTOCOL 0x0B + +#define ADD_MMC_IE 20 +#define REMOVE_MMC_IE 21 +#define SET_NUM_DNTS 22 +#define SET_CLUSTER_ID 23 +#define SET_DEVICE_INFO 24 +#define GET_TIME 25 +#define SET_STREAM_INDEX 26 +#define SET_WUSB_MAS 27 +#define WUSB_CH_STOP 28 + +#define EXEC_RC_CMD 40 + +#define TIME_ADJ 0x01 +#define TIME_BPST 0x02 +#define TIME_WUSB 0x03 + +#define HID_REPORT_TYPE_INPUT 0x01 +#define HID_REPORT_TYPE_OUTPUT 0x02 +#define HID_REPORT_TYPE_FEATURE 0x03 + +#define HID_PROTOCOL_TYPE_BOOT 0x00 +#define HID_PROTOCOL_TYPE_REPORT 0x01 + +#define HUB_DEVICE_PROTOCOL_1X 0 +#define HUB_DEVICE_PROTOCOL_SINGLE_TT 1 +#define HUB_DEVICE_PROTOCOL_MULTI_TT 2 + +#define HUB_INTERFACE_PROTOCOL_1X 0 +#define HUB_INTERFACE_PROTOCOL_SINGLE_TT 0 +#define HUB_INTERFACE_PROTOCOL_MULTI_TT_IN_SINGLE_TT_MODE 1 +#define HUB_INTERFACE_PROTOCOL_MULTI_TT_IN_MULTI_TT_MODE 2 + +#define CLEAR_TT_BUFFER 8 +#define RESET_TT 9 +#define GET_TT_STATE 10 +#define STOP_TT 11 + +#define C_HUB_LOCAL_POWER 0 +#define C_HUB_OVER_CURRENT 1 +#define PORT_CONNECTION 0 +#define PORT_ENABLE 1 +#define PORT_SUSPEND 2 +#define PORT_OVER_CURRENT 3 +#define PORT_RESET 4 +#define PORT_POWER 8 +#define PORT_LOW_SPEED 9 +#define C_PORT_CONNECTION 16 +#define C_PORT_ENABLE 17 +#define C_PORT_SUSPEND 18 +#define C_PORT_OVER_CURRENT 19 +#define C_PORT_RESET 20 +#define PORT_TEST 21 +#define PORT_INDICATOR 22 + +#define USBSETUPSIZE 8 +#define USBINREQUEST 128 + +#define BM_GET_DEVICE 128 +#define BM_GET_INTERFACE 129 +#define BM_GET_ENDPOINT 130 + +#define BM_SET_DEVICE 0 +#define BM_SET_INTERFACE 1 +#define BM_SET_ENDPOINT 2 + +#define HALT_ENDPOINT 0 +#define REMOTE_WAKEUP 1 +#define TEST_MODE 2 + +#define DEVICE_DESCRIPTION_TYPE 0x100 +#define QUALIFIER_DESCRIPTION_TYPE 0x600 +#define OTHER_SPEED_DESCRIPTION_TYPE 0x700 +#define CONFIG_DESCRIPTION_TYPE 0x200 +#define STRING_DESCRIPTION_TYPE 0x300 +#define MSOS_DESCRIPTION_TYPE 0x3EE + +#define CONFIG_BUS_POWERED 0x80 +#define CONFIG_SELF_POWERED 0x40 +#define CONFIG_REMOTE_WAKEUP 0x20 + +#define USB_WA_MULTIFUNCTION 0x02 +#define USB_WA_PROTOCOL 0x01 +#define USB_RADIO_CONTROL 0x2 + +#define USB_HID_CLASS_CODE 0x03 +#define USB_MASS_STORAGE_CLASS_CODE 0x08 +#define USB_HUB_CLASS_CODE 0x09 +#define USB_MISCELLANEOUS 0xEF +#define USB_WIRELESS_WA 0xE0 + +#define BOOT_INTERFACE_SUBCLASS 0x01 +#define COMMON_CLASS 0x02 +#define USB_RF_CONTROL 0x01 + +#define PROTOCOL_NONE 0x00 +#define PROTOCOL_KEYBOARD 0x01 +#define PROTOCOL_MOUSE 0x02 + +#define EP_OUT 0 +#define EP_IN 1 + +#define MAKE_ENDPOINT_ADDRESS(num, dir) ( ((BYTE)(dir) << 7) | ((BYTE)(num) & 0x0F) ) + +#define ENDPOINT_TYPE 0x03 +#define CONTROL_ENDPOINT 0 +#define ISOCHRONOUS_ENDPOINT 1 +#define BULK_ENDPOINT 2 +#define INTERRUPT_ENDPOINT 3 + +typedef union _USBDESCRIPTORTYPE { + BYTE Byte; +#if !defined(MIDL_PASS) + struct Bits { + BYTE Descriptor:5; + BYTE Type:2; + BYTE Reserved:1; + } Bits; +#endif +} USBDESCRIPTORTYPE; + +typedef union _USBCONFIGATTRIBS { + BYTE Byte; +#if !defined(MIDL_PASS) + struct Bits { + BYTE bReserved0_4:5; + BYTE bRemoteWakeup:1; + BYTE bSelfPowered:1; + BYTE bReserved7:1; + } Bits; +#endif +} USBCONFIGATTRIBS; + +typedef union _USBREQUESTTYPE { + BYTE Byte; +#if !defined(MIDL_PASS) + struct Bits { + BYTE Recipient:5; + BYTE Type:2; + BYTE Direction:1; + } Bits; +#endif +} USBREQUESTTYPE; + +#if !defined(MIDL_PASS) +C_ASSERT((sizeof(USBREQUESTTYPE) == sizeof(BYTE))); +#endif + +typedef struct _USBSETUPREQUEST { + USBREQUESTTYPE bmRequestType; + BYTE bRequest; + SHORT sSetupValue; + SHORT sSetupIndex; + SHORT sSetupLength; +} USBSETUPREQUEST; + +#if !defined(MIDL_PASS) + +typedef struct _USBDEVICEDESC { + BYTE bLength; + BYTE bDescriptorType; + USHORT usUSB; + BYTE bDeviceClass; + BYTE bDeviceSubClass; + BYTE bProtocol; + BYTE bMaxPacket0; + USHORT usVendor; + USHORT usProduct; + USHORT usDeviceNumber; + BYTE bManufacturer; + BYTE bProductDesc; + BYTE bSerialNumber; + BYTE bNumConfigs; +} USBDEVICEDESC; + +typedef struct _USBCONFIGDESC { + BYTE bLength; + BYTE bDescriptorType; + USHORT usTotalLength; + BYTE bNumInterfaces; + BYTE bConfigValue; + BYTE bConfig; + BYTE bAttributes; + BYTE bMaxPower; +} USBCONFIGDESC; + + +typedef struct _USBINTERFACEDESC { + BYTE bLength; + BYTE bDescriptorType; + BYTE bInterfaceNumber; + BYTE bAlternateSetting; + BYTE bNumEndpoints; + BYTE bClass; + BYTE bSubClass; + BYTE bProtocol; + BYTE bDescription; +} USBINTERFACEDESC; + +#define ENDPOINT_DIRECTION_OUT 0 +#define ENDPOINT_DIRECTION_IN 1 + +typedef union _USBENDPOINTADDRESS { + BYTE Byte; + struct Bits { + BYTE Number:4; + BYTE Reserved:3; + BYTE Direction:1; + } Bits; +} USBENDPOINTADDRESS; + +C_ASSERT((sizeof(USBENDPOINTADDRESS) == sizeof(BYTE))); + +#define USB_TRANSFER_TYPE_CONTROL 0 +#define USB_TRANSFER_TYPE_ISOCH 1 +#define USB_TRANSFER_TYPE_BULK 2 +#define USB_TRANSFER_TYPE_INTERRUPT 3 + +#define USB_SYNC_TYPE_NONE 0 +#define USB_SYNC_TYPE_ASYNC 1 +#define USB_SYNC_TYPE_ADAPTIVE 2 +#define USB_SYNC_TYPE_SYNC 3 + +#define USB_USAGE_TYPE_DATA 0 +#define USB_USAGE_TYPE_FEEDBACK 1 +#define USB_USAGE_TYPE_IMPLICIT 2 +#define USB_USAGE_TYPE_RESERVED 3 + +typedef union _USBENDPOINTATTRIBS { + BYTE Byte; + struct Bits { + BYTE TransferType:2; + BYTE SyncType:2; + BYTE UsageType:2; + BYTE Reserved:2; + } Bits; +} USBENDPOINTATTRIBS; + +C_ASSERT((sizeof(USBENDPOINTATTRIBS) == sizeof(BYTE))); + +typedef union _USBMAXPACKET { + WORD Word; + struct Bits { + WORD Size:11; + WORD AdditionalXactions:2; + WORD Reserved:3; + } Bits; +} USBMAXPACKET; + +C_ASSERT((sizeof(USBMAXPACKET) == sizeof(WORD))); + +typedef struct _USBENDPOINTDESC { + BYTE bLength; + BYTE bDescriptorType; + USBENDPOINTADDRESS Address; + USBENDPOINTATTRIBS Attributes; + USBMAXPACKET MaxPacket; + BYTE bInterval; +} USBENDPOINTDESC; + +typedef struct _USBQUALIFIERDESC { + BYTE bLength; + BYTE bDescriptorType; + USHORT usUSB; + BYTE bDeviceClass; + BYTE bDeviceSubClass; + BYTE bProtocol; + BYTE bMaxPacket; + BYTE bNumConfigs; + BYTE bReserved; +} USBQUALIFIERDESC; + +typedef struct _USBSTRINGDESC { + BYTE bLength; + BYTE bDescriptorType; + WCHAR wchData[1]; +} USBSTRINGDESC; + +typedef struct _USBSTRINGLANGIDS { + BYTE bLength; + BYTE bDescriptorType; + WORD wLANGIDs[1]; +} USBSTRINGLANGIDS; + +typedef struct _USBHIDSTANDARDDESC { + BYTE bLength; + BYTE bDescriptorType; + USHORT bcdHID; + BYTE bCountryCode; + BYTE bNumDescriptors; +} USBHIDSTANDARDDESC; + +typedef struct _USBHIDOPTIONALDESC { + BYTE bClassDescriptorType; + USHORT usDescriptorLength; +} USBHIDOPTIONALDESC; + +typedef struct _USBPHYSICALDESCSET0 { + BYTE bNumber; + BYTE bLength; +} USBPHYSICALDESCSET0; + +typedef union _USBPHYSICALDESCSET { + BYTE bPhysicalInfo; + struct Bits { + BYTE bPreference:5; + BYTE bBias:3; + } Bits; +} USBPHYSICALDESCSET; + +typedef struct _USBPHYSICALDESCITEM { + BYTE bDesignator; + union Flags { + BYTE bFlags; + struct Bits { + BYTE bEffort:5; + BYTE bQualifier:3; + } Bits; + } Flags; +} USBPHYSICALDESCITEM; + +typedef union _USBHUBCHARACTERISTICS { + WORD wHubCharacteristics; + struct Bits { + BYTE bLogicalPowerSwitchingMode:2; + BYTE fCompoundDevice:1; + BYTE bOverCurrentMode:2; + BYTE bTTThinkTime:2; + BYTE fPortIndicatorSupport:1; + BYTE bReserved:8; + } Bits; +} USBHUBCHARACTERISTICS; + +#if !defined(MIDL_PASS) +C_ASSERT((sizeof(USBHUBCHARACTERISTICS) == sizeof(WORD))); +#endif + +typedef struct _USBHUBDESC { + BYTE bLength; + BYTE bDescriptorType; + BYTE bNumberOfPorts; + USBHUBCHARACTERISTICS Characteristics; + BYTE bPwrOn2PwrGood; + BYTE bHubContrCurrent; + BYTE bDeviceRemovable[32]; + BYTE bPortPwrCtrlMask[32]; +} USBHUBDESC; + +#if !defined(MIDL_PASS) +C_ASSERT((sizeof(USBHUBDESC) == 71)); +#endif + +typedef union _USBHUBPORTSTATUS { + WORD wPortStatus; + struct Bits { + BYTE fCurrentConnectionStatus:1; + BYTE fEnabled:1; + BYTE fSuspend:1; + BYTE fOverCurrent:1; + BYTE fReset:1; + BYTE bReserved1:3; + BYTE fPortPower:1; + BYTE fLowSpeedDevice:1; + BYTE fHighSpeedDevice:1; + BYTE fTestMode:1; + BYTE fPortIndicatorControl:1; + BYTE bReserved2:3; + } Bits; +} USBHUBPORTSTATUS; + +#if !defined(MIDL_PASS) +C_ASSERT((sizeof(USBHUBPORTSTATUS) == sizeof(WORD))); +#endif + +typedef union _USBHUBPORTSTATUSCHANGE { + WORD wPortStatusChange; + struct Bits { + BYTE fConnectionStatusChange:1; + BYTE fEnabledChange:1; + BYTE fSuspendChange:1; + BYTE fOverCurrentChange:1; + BYTE fResetChange:1; + BYTE bReserved1:3; + BYTE bReserved2:8; + } Bits; +} USBHUBPORTSTATUSCHANGE; + +#if !defined(MIDL_PASS) +C_ASSERT((sizeof(USBHUBPORTSTATUSCHANGE) == sizeof(WORD))); +#endif + +typedef struct _USBHUBPORTDATA { + USBHUBPORTSTATUS PortStatus; + USBHUBPORTSTATUSCHANGE PortStatusChange; +} USBHUBPORTDATA; + +#define USB_MAKE_LANGID(lang, sublang) ((((USHORT)(sublang)) << 10) | (USHORT)(lang)) + +#define USB_LANG_RESERVED 0x00 +#define USB_LANG_ARABIC 0x01 +#define USB_LANG_BULGARIAN 0x02 +#define USB_LANG_CATALAN 0x03 +#define USB_LANG_CHINESE 0x04 +#define USB_LANG_CZECH 0x05 +#define USB_LANG_DANISH 0x06 +#define USB_LANG_GERMAN 0x07 +#define USB_LANG_GREEK 0x08 +#define USB_LANG_ENGLISH 0x09 +#define USB_LANG_SPANISH 0x0a +#define USB_LANG_FINNISH 0x0b +#define USB_LANG_FRENCH 0x0c +#define USB_LANG_HEBREW 0x0d +#define USB_LANG_HUNGARIAN 0x0e +#define USB_LANG_ICELANDIC 0x0f +#define USB_LANG_ITALIAN 0x10 +#define USB_LANG_JAPANESE 0x11 +#define USB_LANG_KOREAN 0x12 +#define USB_LANG_DUTCH 0x13 +#define USB_LANG_NORWEGIAN 0x14 +#define USB_LANG_POLISH 0x15 +#define USB_LANG_PORTUGUESE 0x16 +#define USB_LANG_ROMANIAN 0x18 +#define USB_LANG_RUSSIAN 0x19 +#define USB_LANG_CROATIAN 0x1a +#define USB_LANG_SERBIAN 0x1a +#define USB_LANG_SLOVAK 0x1b +#define USB_LANG_ALBANIAN 0x1c +#define USB_LANG_SWEDISH 0x1d +#define USB_LANG_THAI 0x1e +#define USB_LANG_TURKISH 0x1f +#define USB_LANG_URDU 0x20 +#define USB_LANG_INDONESIAN 0x21 +#define USB_LANG_UKRANIAN 0x22 +#define USB_LANG_BELARUSIAN 0x23 +#define USB_LANG_SLOVENIAN 0x24 +#define USB_LANG_ESTONIAN 0x25 +#define USB_LANG_LATVIAN 0x26 +#define USB_LANG_LITHUANIAN 0x27 +#define USB_LANG_FARSI 0x29 +#define USB_LANG_VIETNAMESE 0x2a +#define USB_LANG_ARMENIAN 0x2b +#define USB_LANG_AZERI 0x2c +#define USB_LANG_BASQUE 0x2d +#define USB_LANG_MACEDONIAN 0x2f +#define USB_LANG_AFRIKAANS 0x36 +#define USB_LANG_GEORGIAN 0x37 +#define USB_LANG_FAEROESE 0x38 +#define USB_LANG_HINDI 0x39 +#define USB_LANG_MALAY 0x3e +#define USB_LANG_KAZAK 0x3f +#define USB_LANG_SWAHILI 0x41 +#define USB_LANG_UZBEK 0x43 +#define USB_LANG_TATAR 0x44 +#define USB_LANG_BENGALI 0x45 +#define USB_LANG_PUNJABI 0x46 +#define USB_LANG_GUJARATI 0x47 +#define USB_LANG_ORIYA 0x48 +#define USB_LANG_TAMIL 0x49 +#define USB_LANG_TELUGU 0x4a +#define USB_LANG_KANNADA 0x4b +#define USB_LANG_MALAYALAM 0x4c +#define USB_LANG_ASSAMESE 0x4d +#define USB_LANG_MARATHI 0x4e +#define USB_LANG_SANSKRIT 0x4f +#define USB_LANG_KONKANI 0x57 +#define USB_LANG_MANIPURI 0x58 +#define USB_LANG_SINDHI 0x59 +#define USB_LANG_KASHMIRI 0x60 +#define USB_LANG_NEPALI 0x61 +#define USB_LANG_HID 0xff + +#define USB_SUBLANG_ARABIC_SAUDI_ARABIA 0x01 +#define USB_SUBLANG_ARABIC_SAUDI_ARABIA 0x01 +#define USB_SUBLANG_ARABIC_IRAQ 0x02 +#define USB_SUBLANG_ARABIC_EGYPT 0x03 +#define USB_SUBLANG_ARABIC_LIBYA 0x04 +#define USB_SUBLANG_ARABIC_ALGERIA 0x05 +#define USB_SUBLANG_ARABIC_MOROCCO 0x06 +#define USB_SUBLANG_ARABIC_TUNISIA 0x07 +#define USB_SUBLANG_ARABIC_OMAN 0x08 +#define USB_SUBLANG_ARABIC_YEMEN 0x09 +#define USB_SUBLANG_ARABIC_SYRIA 0x10 +#define USB_SUBLANG_ARABIC_JORDAN 0x11 +#define USB_SUBLANG_ARABIC_LEBANON 0x12 +#define USB_SUBLANG_ARABIC_KUWAIT 0x13 +#define USB_SUBLANG_ARABIC_UAE 0x14 +#define USB_SUBLANG_ARABIC_BAHRAIN 0x15 +#define USB_SUBLANG_ARABIC_QATAR 0x16 +#define USB_SUBLANG_AZERI_CYRILLIC 0x01 +#define USB_SUBLANG_AZERI_LATIN 0x02 +#define USB_SUBLANG_CHINESE_TRADITIONAL 0x01 +#define USB_SUBLANG_CHINESE_SIMPLIFIED 0x02 +#define USB_SUBLANG_CHINESE_HONGKONG 0x03 +#define USB_SUBLANG_CHINESE_SINGAPORE 0x04 +#define USB_SUBLANG_CHINESE_MACAU 0x05 +#define USB_SUBLANG_DUTCH 0x01 +#define USB_SUBLANG_DUTCH_BELGIAN 0x02 +#define USB_SUBLANG_ENGLISH_US 0x01 +#define USB_SUBLANG_ENGLISH_UK 0x02 +#define USB_SUBLANG_ENGLISH_AUS 0x03 +#define USB_SUBLANG_ENGLISH_CAN 0x04 +#define USB_SUBLANG_ENGLISH_NZ 0x05 +#define USB_SUBLANG_ENGLISH_EIRE 0x06 +#define USB_SUBLANG_ENGLISH_SOUTH_AFRICA 0x07 +#define USB_SUBLANG_ENGLISH_JAMAICA 0x08 +#define USB_SUBLANG_ENGLISH_CARIBBEAN 0x09 +#define USB_SUBLANG_ENGLISH_BELIZE 0x0a +#define USB_SUBLANG_ENGLISH_TRINIDAD 0x0b +#define USB_SUBLANG_ENGLISH_PHILIPPINES 0x0c +#define USB_SUBLANG_ENGLISH_ZIMBABWE 0x0d +#define USB_SUBLANG_FRENCH 0x01 +#define USB_SUBLANG_FRENCH_BELGIAN 0x02 +#define USB_SUBLANG_FRENCH_CANADIAN 0x03 +#define USB_SUBLANG_FRENCH_SWISS 0x04 +#define USB_SUBLANG_FRENCH_LUXEMBOURG 0x05 +#define USB_SUBLANG_FRENCH_MONACO 0x06 +#define USB_SUBLANG_GERMAN 0x01 +#define USB_SUBLANG_GERMAN_SWISS 0x02 +#define USB_SUBLANG_GERMAN_AUSTRIAN 0x03 +#define USB_SUBLANG_GERMAN_LUXEMBOURG 0x04 +#define USB_SUBLANG_GERMAN_LIECHTENSTEIN 0x05 +#define USB_SUBLANG_ITALIAN 0x01 +#define USB_SUBLANG_ITALIAN_SWISS 0x02 +#define USB_SUBLANG_KASHMIRI_INDIA 0x02 +#define USB_SUBLANG_KOREAN 0x01 +#define USB_SUBLANG_LITHUANIAN 0x01 +#define USB_SUBLANG_MALAY_MALAYSIA 0x01 +#define USB_SUBLANG_MALAY_BRUNEI_DARUSSALAM 0x02 +#define USB_SUBLANG_NEPALI_INDIA 0x02 +#define USB_SUBLANG_NORWEGIAN_BOKMAL 0x01 +#define USB_SUBLANG_NORWEGIAN_NYNORSK 0x02 +#define USB_SUBLANG_PORTUGUESE 0x01 +#define USB_SUBLANG_PORTUGUESE_BRAZILIAN 0x02 +#define USB_SUBLANG_SERBIAN_LATIN 0x02 +#define USB_SUBLANG_SERBIAN_CYRILLIC 0x03 +#define USB_SUBLANG_SPANISH 0x01 +#define USB_SUBLANG_SPANISH_MEXICAN 0x02 +#define USB_SUBLANG_SPANISH_MODERN 0x03 +#define USB_SUBLANG_SPANISH_GUATEMALA 0x04 +#define USB_SUBLANG_SPANISH_COSTA_RICA 0x05 +#define USB_SUBLANG_SPANISH_PANAMA 0x06 +#define USB_SUBLANG_SPANISH_DOMINICAN_REPUBLIC 0x07 +#define USB_SUBLANG_SPANISH_VENEZUELA 0x08 +#define USB_SUBLANG_SPANISH_COLOMBIA 0x09 +#define USB_SUBLANG_SPANISH_PERU 0x0a +#define USB_SUBLANG_SPANISH_ARGENTINA 0x0b +#define USB_SUBLANG_SPANISH_ECUADOR 0x0c +#define USB_SUBLANG_SPANISH_CHILE 0x0d +#define USB_SUBLANG_SPANISH_URUGUAY 0x0e +#define USB_SUBLANG_SPANISH_PARAGUAY 0x0f +#define USB_SUBLANG_SPANISH_BOLIVIA 0x10 +#define USB_SUBLANG_SPANISH_EL_SALVADOR 0x11 +#define USB_SUBLANG_SPANISH_HONDURAS 0x12 +#define USB_SUBLANG_SPANISH_NICARAGUA 0x13 +#define USB_SUBLANG_SPANISH_PUERTO_RICO 0x14 +#define USB_SUBLANG_SWEDISH 0x01 +#define USB_SUBLANG_SWEDISH_FINLAND 0x02 +#define USB_SUBLANG_URDU_PAKISTAN 0x01 +#define USB_SUBLANG_URDU_INDIA 0x02 +#define USB_SUBLANG_UZBEK_LATIN 0x01 +#define USB_SUBLANG_UZBEK_CYRILLIC 0x02 +#define USB_SUBLANG_HID_USAGE_DATA_DESCRIPTOR 0x01 +#define USB_SUBLANG_HID_VENDOR_DEFINED_1 0x3c +#define USB_SUBLANG_HID_VENDOR_DEFINED_2 0x3d +#define USB_SUBLANG_HID_VENDOR_DEFINED_3 0x3e +#define USB_SUBLANG_HID_VENDOR_DEFINED_4 0x3f + +#endif // !defined(MIDL_PASS) + +#include diff --git a/reactos/include/ddk/usbscan.h b/reactos/include/ddk/usbscan.h index 8e61a7a736b..718b13cad28 100644 --- a/reactos/include/ddk/usbscan.h +++ b/reactos/include/ddk/usbscan.h @@ -20,21 +20,115 @@ * */ -#ifndef __USBSCAN_H -#define __USBSCAN_H +#pragma once #ifdef __cplusplus extern "C" { #endif +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +#pragma pack(push,8) + +#ifndef MAX_NUM_PIPES +#define MAX_NUM_PIPES 8 +#endif + +#define BULKIN_FLAG 0x80 + +typedef struct _DRV_VERSION { + OUT ULONG major; + OUT ULONG minor; + OUT ULONG internal; +} DRV_VERSION, *PDRV_VERSION; + +typedef struct _IO_BLOCK { + IN ULONG uOffset; + IN ULONG uLength; + IN OUT PUCHAR pbyData; + IN ULONG uIndex; +} IO_BLOCK, *PIO_BLOCK; + +typedef struct _IO_BLOCK_EX { + IN ULONG uOffset; + IN ULONG uLength; + IN OUT PUCHAR pbyData; + IN ULONG uIndex; + IN UCHAR bRequest; + IN UCHAR bmRequestType; + IN UCHAR fTransferDirectionIn; +} IO_BLOCK_EX, *PIO_BLOCK_EX; + +typedef struct _CHANNEL_INFO { + OUT ULONG EventChannelSize; + OUT ULONG uReadDataAlignment; + OUT ULONG uWriteDataAlignment; +}CHANNEL_INFO, *PCHANNEL_INFO; + +typedef enum _PIPE_TYPE { + EVENT_PIPE, + READ_DATA_PIPE, + WRITE_DATA_PIPE, + ALL_PIPE +} PIPE_TYPE; + +typedef struct _USBSCAN_GET_DESCRIPTOR { + IN UCHAR DescriptorType; + IN UCHAR Index; + IN USHORT LanguageId; +} USBSCAN_GET_DESCRIPTOR, *PUSBSCAN_GET_DESCRIPTOR; + +typedef struct _DEVICE_DESCRIPTOR { + OUT USHORT usVendorId; + OUT USHORT usProductId; + OUT USHORT usBcdDevice; + OUT USHORT usLanguageId; +} DEVICE_DESCRIPTOR, *PDEVICE_DESCRIPTOR; + +typedef enum _RAW_PIPE_TYPE { + USBSCAN_PIPE_CONTROL, + USBSCAN_PIPE_ISOCHRONOUS, + USBSCAN_PIPE_BULK, + USBSCAN_PIPE_INTERRUPT +} RAW_PIPE_TYPE; + +typedef struct _USBSCAN_PIPE_INFORMATION { + USHORT MaximumPacketSize; + UCHAR EndpointAddress; + UCHAR Interval; + RAW_PIPE_TYPE PipeType; +} USBSCAN_PIPE_INFORMATION, *PUSBSCAN_PIPE_INFORMATION; + +typedef struct _USBSCAN_PIPE_CONFIGURATION { + OUT ULONG NumberOfPipes; + OUT USBSCAN_PIPE_INFORMATION PipeInfo[MAX_NUM_PIPES]; +} USBSCAN_PIPE_CONFIGURATION, *PUSBSCAN_PIPE_CONFIGURATION; + +#if (NTDDI_VERSION >= NTDDI_WINXP) +typedef struct _USBSCAN_TIMEOUT { + IN ULONG TimeoutRead; + IN ULONG TimeoutWrite; + IN ULONG TimeoutEvent; +} USBSCAN_TIMEOUT, *PUSBSCAN_TIMEOUT; +#endif + #define FILE_DEVICE_USB_SCAN 0x8000 #define IOCTL_INDEX 0x0800 +#define IOCTL_GET_VERSION \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 0, METHOD_BUFFERED,FILE_ANY_ACCESS) + #define IOCTL_CANCEL_IO \ CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 1, METHOD_BUFFERED,FILE_ANY_ACCESS) -#define IOCTL_GET_VERSION \ - CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 0, METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_WAIT_ON_DEVICE_EVENT \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 2, METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_READ_REGISTERS \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 3, METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_WRITE_REGISTERS \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 4, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_GET_CHANNEL_ALIGN_RQST \ CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 5, METHOD_BUFFERED,FILE_ANY_ACCESS) @@ -42,111 +136,27 @@ extern "C" { #define IOCTL_GET_DEVICE_DESCRIPTOR \ CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 6, METHOD_BUFFERED,FILE_ANY_ACCESS) -#define IOCTL_GET_PIPE_CONFIGURATION \ - CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 10,METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_RESET_PIPE \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 7, METHOD_BUFFERED,FILE_ANY_ACCESS) #define IOCTL_GET_USB_DESCRIPTOR \ CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 8, METHOD_BUFFERED,FILE_ANY_ACCESS) -#define IOCTL_READ_REGISTERS \ - CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 3, METHOD_BUFFERED,FILE_ANY_ACCESS) - -#define IOCTL_RESET_PIPE \ - CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 7, METHOD_BUFFERED,FILE_ANY_ACCESS) - #define IOCTL_SEND_USB_REQUEST \ CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 9, METHOD_BUFFERED,FILE_ANY_ACCESS) +#define IOCTL_GET_PIPE_CONFIGURATION \ + CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 10,METHOD_BUFFERED,FILE_ANY_ACCESS) + +#if (NTDDI_VERSION >= NTDDI_WINXP) #define IOCTL_SET_TIMEOUT \ CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 11,METHOD_BUFFERED,FILE_ANY_ACCESS) +#endif -#define IOCTL_WAIT_ON_DEVICE_EVENT \ - CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 2, METHOD_BUFFERED,FILE_ANY_ACCESS) +#pragma pack(pop) -#define IOCTL_WRITE_REGISTERS \ - CTL_CODE(FILE_DEVICE_USB_SCAN, IOCTL_INDEX + 4, METHOD_BUFFERED, FILE_ANY_ACCESS) - - -#define MAX_NUM_PIPES 8 - -#define BULKIN_FLAG 0x80 - -typedef struct _CHANNEL_INFO { - OUT ULONG EventChannelSize; - OUT ULONG uReadDataAlignment; - OUT ULONG uWriteDataAlignment; -}CHANNEL_INFO, *PCHANNEL_INFO; - -typedef struct _DEVICE_DESCRIPTOR { - OUT USHORT usVendorId; - OUT USHORT usProductId; - OUT USHORT usBcdDevice; - OUT USHORT usLanguageId; -} DEVICE_DESCRIPTOR, *PDEVICE_DESCRIPTOR; - -typedef struct _DRV_VERSION { - OUT ULONG major; - OUT ULONG minor; - OUT ULONG internal; -} DRV_VERSION, *PDRV_VERSION; - -typedef struct _IO_BLOCK { - IN ULONG uOffset; - IN ULONG uLength; - IN OUT PUCHAR pbyData; - IN ULONG uIndex; -} IO_BLOCK, *PIO_BLOCK; - -typedef struct _IO_BLOCK_EX { - IN ULONG uOffset; - IN ULONG uLength; - IN OUT PUCHAR pbyData; - IN ULONG uIndex; - IN UCHAR bRequest; - IN UCHAR bmRequestType; - IN UCHAR fTransferDirectionIn; -} IO_BLOCK_EX, *PIO_BLOCK_EX; - -typedef struct _USBSCAN_GET_DESCRIPTOR { - IN UCHAR DescriptorType; - IN UCHAR Index; - IN USHORT LanguageId; -} USBSCAN_GET_DESCRIPTOR, *PUSBSCAN_GET_DESCRIPTOR; - -typedef enum _RAW_PIPE_TYPE { - USBSCAN_PIPE_CONTROL, - USBSCAN_PIPE_ISOCHRONOUS, - USBSCAN_PIPE_BULK, - USBSCAN_PIPE_INTERRUPT -} RAW_PIPE_TYPE; - -typedef struct _USBSCAN_PIPE_INFORMATION { - USHORT MaximumPacketSize; - UCHAR EndpointAddress; - UCHAR Interval; - RAW_PIPE_TYPE PipeType; -} USBSCAN_PIPE_INFORMATION, *PUSBSCAN_PIPE_INFORMATION; - -typedef struct _USBSCAN_PIPE_CONFIGURATION { - OUT ULONG NumberOfPipes; - OUT USBSCAN_PIPE_INFORMATION PipeInfo[MAX_NUM_PIPES]; -} USBSCAN_PIPE_CONFIGURATION, *PUSBSCAN_PIPE_CONFIGURATION; - -typedef struct _USBSCAN_TIMEOUT { - IN ULONG TimeoutRead; - IN ULONG TimeoutWrite; - IN ULONG TimeoutEvent; -} USBSCAN_TIMEOUT, *PUSBSCAN_TIMEOUT; - -typedef enum _PIPE_TYPE { - EVENT_PIPE, - READ_DATA_PIPE, - WRITE_DATA_PIPE, - ALL_PIPE -} PIPE_TYPE; +#endif // (NTDDI_VERSION >= NTDDI_WIN2K) #ifdef __cplusplus } #endif - -#endif /* __USBSCAN_H */ diff --git a/reactos/include/ddk/usbstorioctl.h b/reactos/include/ddk/usbstorioctl.h new file mode 100644 index 00000000000..5e71ae3427e --- /dev/null +++ b/reactos/include/ddk/usbstorioctl.h @@ -0,0 +1,64 @@ +#pragma once + +#ifndef MAX_PATH +#define MAX_PATH 260 +#endif + +typedef struct tagACT_AUTHZ_STATE { + UCHAR ACT; + BOOLEAN fAuthorized; +} ACT_AUTHZ_STATE, *PACT_AUTHZ_STATE; + +typedef struct tagSILO_COMMAND { + UCHAR SiloIndex; + UCHAR Command; + ULONG cbCommandBuffer; + UCHAR rgbCommandBuffer[ANYSIZE_ARRAY]; +} SILO_COMMAND, *PSILO_COMMAND; + +typedef enum _PDO_TYPE { + PDO_TYPE_UNDEFINED = 0, + PDO_TYPE_DISK, + PDO_TYPE_CONTROL, + PDO_TYPE_SILO, + PDO_TYPE_THIS = 256 +} PDO_TYPE; + +typedef enum _PDO_STATE { + PDO_STATE_UNDEFINED = 0, + PDO_STATE_STARTED, + PDO_STATE_NOT_STARTED +} PDO_STATE; + +typedef enum _PDO_CAPS { + PDO_CAPABILITY_UNDEFINED = 0, + PDO_CAPABILITY_INC512_SET = 1, + PDO_CAPABILITY_INC512_CLEAR = 2 +} PDO_CAPS; + +typedef struct _ENUM_PDO_ENTRY { + UCHAR type; + UCHAR state; + UCHAR capabilities; + ULONG ulSTID; + UCHAR bSpecificationMajor; + UCHAR bSpecificationMinor; + UCHAR bImplementationMajor; + UCHAR bImplementationMinor; + WCHAR wszDeviceInstancePath[(2 * MAX_PATH) + 1]; +} ENUM_PDO_ENTRY, *PENUM_PDO_ENTRY; + +typedef struct _ENUM_PDO_RESULTS { + ULONG cEntries; + ENUM_PDO_ENTRY rgEntries[ANYSIZE_ARRAY]; +} ENUM_PDO_RESULTS, *PENUM_PDO_RESULTS; + +#define SIZE_ENUM_PDO_RESULTS_HEADER (sizeof(ENUM_PDO_RESULTS) - sizeof(ENUM_PDO_ENTRY)) + +#define IOCTL_EHSTOR_DEVICE_SET_AUTHZ_STATE CTL_CODE(IOCTL_STORAGE_BASE, 0x501, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_EHSTOR_DEVICE_GET_AUTHZ_STATE CTL_CODE(IOCTL_STORAGE_BASE, 0x502, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_EHSTOR_DEVICE_SILO_COMMAND CTL_CODE(IOCTL_STORAGE_BASE, 0x503, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_EHSTOR_DEVICE_ENUMERATE_PDOS CTL_CODE(IOCTL_STORAGE_BASE, 0x504, METHOD_BUFFERED, FILE_ANY_ACCESS) + +DEFINE_GUID(GUID_USBSTOR_EHSTOR_SILO_INTERFACE, 0x7c2bcf57, 0x2bea, 0x46da, 0xad, 0x26, 0x78, 0xfd, 0xc8, 0x3c, 0xee, 0x46); +DEFINE_GUID(GUID_USBSTOR_EHSTOR_CONTROL_INTERFACE, 0x4f40006f, 0xb933, 0x4550, 0xb5, 0x32, 0x2b, 0x58, 0xce, 0xe6, 0x14, 0xd3); diff --git a/reactos/include/ddk/video.h b/reactos/include/ddk/video.h index fcf4d4a7254..047a56721d9 100644 --- a/reactos/include/ddk/video.h +++ b/reactos/include/ddk/video.h @@ -1136,6 +1136,13 @@ DDKAPI VideoPortQuerySystemTime( OUT PLARGE_INTEGER CurrentTime); +VPAPI +BOOLEAN +DDKAPI +VideoPortIsNoVesa( + VOID +); + VPAPI BOOLEAN DDKAPI diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index acdf7a1b5d2..c36761d23ae 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -1,9 +1,39 @@ +/* + * wdm.h + * + * Windows NT WDM Driver Developer Kit + * + * This file is part of the ReactOS DDK package. + * + * Contributors: + * Amine Khaldi + * Timo Kreuzer (timo.kreuzer@reactos.org) + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ +#pragma once + #ifndef _WDMDDK_ #define _WDMDDK_ -// -// Dependencies -// +/* Included via ntddk.h? */ +#ifndef _NTDDK_ +#define _NTDDK_ +#define _WDM_INCLUDED_ +#define _DDK_DRIVER_ +#define NO_INTERLOCKED_INTRINSICS +#endif /* _NTDDK_ */ + +/* Dependencies */ #define NT_INCLUDED #include #include @@ -13,53 +43,87 @@ #include #endif /* GUID_DEFINED */ +#if (NTDDI_VERSION >= NTDDI_WINXP) +#include +#endif + #include "intrin.h" #ifdef __cplusplus extern "C" { #endif -#define NTKERNELAPI DECLSPEC_IMPORT - -#ifdef _WIN64 -#define PORT_MAXIMUM_MESSAGE_LENGTH 512 +#if !defined(_NTHALDLL_) && !defined(_BLDR_) +#define NTHALAPI DECLSPEC_IMPORT #else -#define PORT_MAXIMUM_MESSAGE_LENGTH 256 +#define NTHALAPI #endif +/* For ReactOS */ +#if !defined(_NTOSKRNL_) && !defined(_BLDR_) +#define NTKERNELAPI DECLSPEC_IMPORT +#else +#define NTKERNELAPI +#endif + +#if defined(_X86_) && !defined(_NTHAL_) +#define _DECL_HAL_KE_IMPORT DECLSPEC_IMPORT +#elif defined(_X86_) +#define _DECL_HAL_KE_IMPORT +#else +#define _DECL_HAL_KE_IMPORT NTKERNELAPI +#endif + +#if defined(_WIN64) +#define POINTER_ALIGNMENT DECLSPEC_ALIGN(8) +#else +#define POINTER_ALIGNMENT +#endif + +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif #if defined(_MSC_VER) -// -// Indicate if #pragma alloc_text() is supported -// +/* Indicate if #pragma alloc_text() is supported */ #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64) #define ALLOC_PRAGMA 1 #endif -// -// Indicate if #pragma data_seg() is supported -// +/* Indicate if #pragma data_seg() is supported */ #if defined(_M_IX86) || defined(_M_AMD64) #define ALLOC_DATA_PRAGMA 1 #endif #endif - -/* Simple types */ -typedef UCHAR KPROCESSOR_MODE; -typedef LONG KPRIORITY; -typedef PVOID PSECURITY_DESCRIPTOR; -typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION; +/* Forward declarations */ +struct _IRP; +struct _MDL; +struct _KAPC; +struct _KDPC; +struct _FILE_OBJECT; +struct _DMA_ADAPTER; +struct _DEVICE_OBJECT; +struct _DRIVER_OBJECT; +struct _IO_STATUS_BLOCK; +struct _DEVICE_DESCRIPTION; +struct _SCATTER_GATHER_LIST; +struct _DRIVE_LAYOUT_INFORMATION; +struct _COMPRESSED_DATA_INFO; +struct _IO_RESOURCE_DESCRIPTOR; /* Structures not exposed to drivers */ typedef struct _OBJECT_TYPE *POBJECT_TYPE; typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE; typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE; typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT; -typedef struct _BUS_HANDLER *PBUS_HANDLER; - typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT; typedef struct _ETHREAD *PETHREAD; @@ -68,302 +132,12 @@ typedef struct _IO_TIMER *PIO_TIMER; typedef struct _KINTERRUPT *PKINTERRUPT; typedef struct _KPROCESS *PKPROCESS; typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD; - - typedef struct _CONTEXT *PCONTEXT; -// -// Resource list definitions -// -typedef int CM_RESOURCE_TYPE; - -#define CmResourceTypeNull 0 -#define CmResourceTypePort 1 -#define CmResourceTypeInterrupt 2 -#define CmResourceTypeMemory 3 -#define CmResourceTypeDma 4 -#define CmResourceTypeDeviceSpecific 5 -#define CmResourceTypeBusNumber 6 -#define CmResourceTypeNonArbitrated 128 -#define CmResourceTypeConfigData 128 -#define CmResourceTypeDevicePrivate 129 -#define CmResourceTypePcCardConfig 130 -#define CmResourceTypeMfCardConfig 131 - -typedef enum _INTERFACE_TYPE { - InterfaceTypeUndefined = -1, - Internal, - Isa, - Eisa, - MicroChannel, - TurboChannel, - PCIBus, - VMEBus, - NuBus, - PCMCIABus, - CBus, - MPIBus, - MPSABus, - ProcessorInternal, - InternalPowerBus, - PNPISABus, - PNPBus, - MaximumInterfaceType -} INTERFACE_TYPE, *PINTERFACE_TYPE; - -/* IO_RESOURCE_DESCRIPTOR.Option */ - -#define IO_RESOURCE_PREFERRED 0x01 -#define IO_RESOURCE_DEFAULT 0x02 -#define IO_RESOURCE_ALTERNATIVE 0x08 - -typedef struct _IO_RESOURCE_DESCRIPTOR { - UCHAR Option; - UCHAR Type; - UCHAR ShareDisposition; - UCHAR Spare1; - USHORT Flags; - USHORT Spare2; - union { - struct { - ULONG Length; - ULONG Alignment; - PHYSICAL_ADDRESS MinimumAddress; - PHYSICAL_ADDRESS MaximumAddress; - } Port; - struct { - ULONG Length; - ULONG Alignment; - PHYSICAL_ADDRESS MinimumAddress; - PHYSICAL_ADDRESS MaximumAddress; - } Memory; - struct { - ULONG MinimumVector; - ULONG MaximumVector; - } Interrupt; - struct { - ULONG MinimumChannel; - ULONG MaximumChannel; - } Dma; - struct { - ULONG Length; - ULONG Alignment; - PHYSICAL_ADDRESS MinimumAddress; - PHYSICAL_ADDRESS MaximumAddress; - } Generic; - struct { - ULONG Data[3]; - } DevicePrivate; - struct { - ULONG Length; - ULONG MinBusNumber; - ULONG MaxBusNumber; - ULONG Reserved; - } BusNumber; - struct { - ULONG Priority; - ULONG Reserved1; - ULONG Reserved2; - } ConfigData; - } u; -} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR; - -typedef struct _IO_RESOURCE_LIST { - USHORT Version; - USHORT Revision; - ULONG Count; - IO_RESOURCE_DESCRIPTOR Descriptors[1]; -} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST; - -typedef struct _IO_RESOURCE_REQUIREMENTS_LIST { - ULONG ListSize; - INTERFACE_TYPE InterfaceType; - ULONG BusNumber; - ULONG SlotNumber; - ULONG Reserved[3]; - ULONG AlternativeLists; - IO_RESOURCE_LIST List[1]; -} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST; - -// -// Global debug flag -// -extern ULONG NtGlobalFlag; - - -#include -typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR { - UCHAR Type; - UCHAR ShareDisposition; - USHORT Flags; - union { - struct { - PHYSICAL_ADDRESS Start; - ULONG Length; - } Generic; - struct { - PHYSICAL_ADDRESS Start; - ULONG Length; - } Port; - struct { - ULONG Level; - ULONG Vector; - KAFFINITY Affinity; - } Interrupt; -#if (NTDDI_VERSION >= NTDDI_LONGHORN) - struct { - union { - struct { - USHORT Reserved; - USHORT MessageCount; - ULONG Vector; - KAFFINITY Affinity; - } Raw; - struct { - ULONG Level; - ULONG Vector; - KAFFINITY Affinity; - } Translated; - }; - } MessageInterrupt; -#endif - struct { - PHYSICAL_ADDRESS Start; - ULONG Length; - } Memory; - struct { - ULONG Channel; - ULONG Port; - ULONG Reserved1; - } Dma; - struct { - ULONG Data[3]; - } DevicePrivate; - struct { - ULONG Start; - ULONG Length; - ULONG Reserved; - } BusNumber; - struct { - ULONG DataSize; - ULONG Reserved1; - ULONG Reserved2; - } DeviceSpecificData; -#if (NTDDI_VERSION >= NTDDI_LONGHORN) - struct { - PHYSICAL_ADDRESS Start; - ULONG Length40; - } Memory40; - struct { - PHYSICAL_ADDRESS Start; - ULONG Length48; - } Memory48; - struct { - PHYSICAL_ADDRESS Start; - ULONG Length64; - } Memory64; -#endif - } u; -} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR; -#include - -// -// Section map options -// -typedef enum _SECTION_INHERIT { - ViewShare = 1, - ViewUnmap = 2 -} SECTION_INHERIT; - -// -// Section access rights -// -#define SECTION_QUERY 0x0001 -#define SECTION_MAP_WRITE 0x0002 -#define SECTION_MAP_READ 0x0004 -#define SECTION_MAP_EXECUTE 0x0008 -#define SECTION_EXTEND_SIZE 0x0010 -#define SECTION_MAP_EXECUTE_EXPLICIT 0x0020 - -#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\ - SECTION_MAP_WRITE | \ - SECTION_MAP_READ | \ - SECTION_MAP_EXECUTE | \ - SECTION_EXTEND_SIZE) - -#define SESSION_QUERY_ACCESS 0x0001 -#define SESSION_MODIFY_ACCESS 0x0002 - -#define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \ - SESSION_QUERY_ACCESS | \ - SESSION_MODIFY_ACCESS) - - - -#define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS - -#define PAGE_NOACCESS 0x01 -#define PAGE_READONLY 0x02 -#define PAGE_READWRITE 0x04 -#define PAGE_WRITECOPY 0x08 -#define PAGE_EXECUTE 0x10 -#define PAGE_EXECUTE_READ 0x20 -#define PAGE_EXECUTE_READWRITE 0x40 -#define PAGE_EXECUTE_WRITECOPY 0x80 -#define PAGE_GUARD 0x100 -#define PAGE_NOCACHE 0x200 -#define PAGE_WRITECOMBINE 0x400 - -#define MEM_COMMIT 0x1000 -#define MEM_RESERVE 0x2000 -#define MEM_DECOMMIT 0x4000 -#define MEM_RELEASE 0x8000 -#define MEM_FREE 0x10000 -#define MEM_PRIVATE 0x20000 -#define MEM_MAPPED 0x40000 -#define MEM_RESET 0x80000 -#define MEM_TOP_DOWN 0x100000 -#define MEM_LARGE_PAGES 0x20000000 -#define MEM_4MB_PAGES 0x80000000 - -#define SEC_RESERVE 0x4000000 -#define SEC_LARGE_PAGES 0x80000000 - -#define PROCESS_DUP_HANDLE (0x0040) - -#if (NTDDI_VERSION >= NTDDI_VISTA) -#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \ - 0xFFFF) -#else -#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \ - 0xFFF) -#endif - - - -// -// Processor features -// -#define PF_FLOATING_POINT_PRECISION_ERRATA 0 -#define PF_FLOATING_POINT_EMULATED 1 -#define PF_COMPARE_EXCHANGE_DOUBLE 2 -#define PF_MMX_INSTRUCTIONS_AVAILABLE 3 -#define PF_PPC_MOVEMEM_64BIT_OK 4 -#define PF_ALPHA_BYTE_INSTRUCTIONS 5 -#define PF_XMMI_INSTRUCTIONS_AVAILABLE 6 -#define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7 -#define PF_RDTSC_INSTRUCTION_AVAILABLE 8 -#define PF_PAE_ENABLED 9 -#define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10 -#define PF_SSE_DAZ_MODE_AVAILABLE 11 -#define PF_NX_ENABLED 12 -#define PF_SSE3_INSTRUCTIONS_AVAILABLE 13 -#define PF_COMPARE_EXCHANGE128 14 -#define PF_COMPARE64_EXCHANGE128 15 -#define PF_CHANNELS_ENABLED 16 - - +/****************************************************************************** + * INTERLOCKED Functions * + ******************************************************************************/ // // Intrinsics (note: taken from our winnt.h) // FIXME: 64-bit @@ -410,7 +184,6 @@ InterlockedBitTestAndReset(IN LONG volatile *Base, #define BitScanForward _BitScanForward #define BitScanReverse _BitScanReverse - #define BitTest _bittest #define BitTestAndComplement _bittestandcomplement #define BitTestAndSet _bittestandset @@ -418,8 +191,10 @@ InterlockedBitTestAndReset(IN LONG volatile *Base, #define InterlockedBitTestAndSet _interlockedbittestandset #define InterlockedBitTestAndReset _interlockedbittestandreset - -/** INTERLOCKED FUNCTIONS *****************************************************/ +#ifdef _M_AMD64 +#define InterlockedBitTestAndSet64 _interlockedbittestandset64 +#define InterlockedBitTestAndReset64 _interlockedbittestandreset64 +#endif #if !defined(__INTERLOCKED_DECLARED) #define __INTERLOCKED_DECLARED @@ -553,25 +328,75 @@ InterlockedAdd64( #endif /* !__INTERLOCKED_DECLARED */ -#if defined(_M_IX86) -#define YieldProcessor _mm_pause -#elif defined (_M_AMD64) -#define YieldProcessor _mm_pause -#elif defined(_M_PPC) -#define YieldProcessor() __asm__ __volatile__("nop"); -#elif defined(_M_MIPS) -#define YieldProcessor() __asm__ __volatile__("nop"); -#elif defined(_M_ARM) -#define YieldProcessor() -#else -#error Unknown architecture -#endif +/****************************************************************************** + * Runtime Library Types * + ******************************************************************************/ +#define RTL_REGISTRY_ABSOLUTE 0 +#define RTL_REGISTRY_SERVICES 1 +#define RTL_REGISTRY_CONTROL 2 +#define RTL_REGISTRY_WINDOWS_NT 3 +#define RTL_REGISTRY_DEVICEMAP 4 +#define RTL_REGISTRY_USER 5 +#define RTL_REGISTRY_MAXIMUM 6 +#define RTL_REGISTRY_HANDLE 0x40000000 +#define RTL_REGISTRY_OPTIONAL 0x80000000 -// -// Slist Header -// +/* RTL_QUERY_REGISTRY_TABLE.Flags */ +#define RTL_QUERY_REGISTRY_SUBKEY 0x00000001 +#define RTL_QUERY_REGISTRY_TOPKEY 0x00000002 +#define RTL_QUERY_REGISTRY_REQUIRED 0x00000004 +#define RTL_QUERY_REGISTRY_NOVALUE 0x00000008 +#define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010 +#define RTL_QUERY_REGISTRY_DIRECT 0x00000020 +#define RTL_QUERY_REGISTRY_DELETE 0x00000040 + +#define HASH_STRING_ALGORITHM_DEFAULT 0 +#define HASH_STRING_ALGORITHM_X65599 1 +#define HASH_STRING_ALGORITHM_INVALID 0xffffffff + +typedef struct _RTL_BITMAP { + ULONG SizeOfBitMap; + PULONG Buffer; +} RTL_BITMAP, *PRTL_BITMAP; + +typedef struct _RTL_BITMAP_RUN { + ULONG StartingIndex; + ULONG NumberOfBits; +} RTL_BITMAP_RUN, *PRTL_BITMAP_RUN; + +typedef NTSTATUS +(DDKAPI *PRTL_QUERY_REGISTRY_ROUTINE)( + IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext); + +typedef struct _RTL_QUERY_REGISTRY_TABLE { + PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine; + ULONG Flags; + PCWSTR Name; + PVOID EntryContext; + ULONG DefaultType; + PVOID DefaultData; + ULONG DefaultLength; +} RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE; + +typedef struct _TIME_FIELDS { + CSHORT Year; + CSHORT Month; + CSHORT Day; + CSHORT Hour; + CSHORT Minute; + CSHORT Second; + CSHORT Milliseconds; + CSHORT Weekday; +} TIME_FIELDS, *PTIME_FIELDS; + +/* Slist Header */ #ifndef _SLIST_HEADER_ #define _SLIST_HEADER_ @@ -620,88 +445,1056 @@ typedef union _SLIST_HEADER { #endif /* _SLIST_HEADER_ */ +/* HACK HACK HACK - GCC (or perhaps LD) is messing this up */ +#if defined(_NTSYSTEM_) || defined(__GNUC__) +#define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag +#define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag +#else +#define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag) +#define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag) +#endif /* _NT_SYSTEM */ +extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG; +extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG; -// -// Power States/Levels -// -typedef enum _SYSTEM_POWER_STATE { - PowerSystemUnspecified, - PowerSystemWorking, - PowerSystemSleeping1, - PowerSystemSleeping2, - PowerSystemSleeping3, - PowerSystemHibernate, - PowerSystemShutdown, - PowerSystemMaximum -} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE; -#define POWER_SYSTEM_MAXIMUM PowerSystemMaximum +/****************************************************************************** + * Kernel Types * + ******************************************************************************/ -typedef enum _POWER_INFORMATION_LEVEL { - SystemPowerPolicyAc, - SystemPowerPolicyDc, - VerifySystemPolicyAc, - VerifySystemPolicyDc, - SystemPowerCapabilities, - SystemBatteryState, - SystemPowerStateHandler, - ProcessorStateHandler, - SystemPowerPolicyCurrent, - AdministratorPowerPolicy, - SystemReserveHiberFile, - ProcessorInformation, - SystemPowerInformation, - ProcessorStateHandler2, - LastWakeTime, - LastSleepTime, - SystemExecutionState, - SystemPowerStateNotifyHandler, - ProcessorPowerPolicyAc, - ProcessorPowerPolicyDc, - VerifyProcessorPowerPolicyAc, - VerifyProcessorPowerPolicyDc, - ProcessorPowerPolicyCurrent -} POWER_INFORMATION_LEVEL; - -typedef enum { - PowerActionNone, - PowerActionReserved, - PowerActionSleep, - PowerActionHibernate, - PowerActionShutdown, - PowerActionShutdownReset, - PowerActionShutdownOff, - PowerActionWarmEject -} POWER_ACTION, *PPOWER_ACTION; - -typedef enum _DEVICE_POWER_STATE { - PowerDeviceUnspecified, - PowerDeviceD0, - PowerDeviceD1, - PowerDeviceD2, - PowerDeviceD3, - PowerDeviceMaximum -} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE; - -#define ES_SYSTEM_REQUIRED 0x00000001 -#define ES_DISPLAY_REQUIRED 0x00000002 -#define ES_USER_PRESENT 0x00000004 -#define ES_CONTINUOUS 0x80000000 +typedef UCHAR KIRQL, *PKIRQL; +typedef CCHAR KPROCESSOR_MODE; +typedef LONG KPRIORITY; typedef ULONG EXECUTION_STATE; -typedef enum { - LT_DONT_CARE, - LT_LOWEST_LATENCY -} LATENCY_TIME; +typedef enum _MODE { + KernelMode, + UserMode, + MaximumMode +} MODE; + +/* Processor features */ +#define PF_FLOATING_POINT_PRECISION_ERRATA 0 +#define PF_FLOATING_POINT_EMULATED 1 +#define PF_COMPARE_EXCHANGE_DOUBLE 2 +#define PF_MMX_INSTRUCTIONS_AVAILABLE 3 +#define PF_PPC_MOVEMEM_64BIT_OK 4 +#define PF_ALPHA_BYTE_INSTRUCTIONS 5 +#define PF_XMMI_INSTRUCTIONS_AVAILABLE 6 +#define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7 +#define PF_RDTSC_INSTRUCTION_AVAILABLE 8 +#define PF_PAE_ENABLED 9 +#define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10 +#define PF_SSE_DAZ_MODE_AVAILABLE 11 +#define PF_NX_ENABLED 12 +#define PF_SSE3_INSTRUCTIONS_AVAILABLE 13 +#define PF_COMPARE_EXCHANGE128 14 +#define PF_COMPARE64_EXCHANGE128 15 +#define PF_CHANNELS_ENABLED 16 +#define PF_XSAVE_ENABLED 17 + +#define MAXIMUM_SUPPORTED_EXTENSION 512 +#define MAXIMUM_WAIT_OBJECTS 64 + +#define ASSERT_APC(Object) \ + ASSERT((Object)->Type == ApcObject) + +#define ASSERT_DPC(Object) \ + ASSERT(((Object)->Type == 0) || \ + ((Object)->Type == DpcObject) || \ + ((Object)->Type == ThreadedDpcObject)) + +#define ASSERT_GATE(object) \ + ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \ + (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject)) + +#define ASSERT_DEVICE_QUEUE(Object) \ + ASSERT((Object)->Type == DeviceQueueObject) + +#define ASSERT_TIMER(E) \ + ASSERT(((E)->Header.Type == TimerNotificationObject) || \ + ((E)->Header.Type == TimerSynchronizationObject)) + +#define ASSERT_MUTANT(E) \ + ASSERT((E)->Header.Type == MutantObject) + +#define ASSERT_SEMAPHORE(E) \ + ASSERT((E)->Header.Type == SemaphoreObject) + +#define ASSERT_EVENT(E) \ + ASSERT(((E)->Header.Type == NotificationEvent) || \ + ((E)->Header.Type == SynchronizationEvent)) + +#define DPC_NORMAL 0 +#define DPC_THREADED 1 + +#define GM_LOCK_BIT 0x1 +#define GM_LOCK_BIT_V 0x0 +#define GM_LOCK_WAITER_WOKEN 0x2 +#define GM_LOCK_WAITER_INC 0x4 + +#define LOCK_QUEUE_WAIT 1 +#define LOCK_QUEUE_OWNER 2 +#define LOCK_QUEUE_TIMER_LOCK_SHIFT 4 +#define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT)) + +#define PROCESSOR_FEATURE_MAX 64 + +#define DBG_STATUS_CONTROL_C 1 +#define DBG_STATUS_SYSRQ 2 +#define DBG_STATUS_BUGCHECK_FIRST 3 +#define DBG_STATUS_BUGCHECK_SECOND 4 +#define DBG_STATUS_FATAL 5 +#define DBG_STATUS_DEBUG_CONTROL 6 +#define DBG_STATUS_WORKER 7 + +#if defined(_WIN64) +#define MAXIMUM_PROC_PER_GROUP 64 +#else +#define MAXIMUM_PROC_PER_GROUP 32 +#endif +#define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP + +/* Exception Records */ +#define EXCEPTION_NONCONTINUABLE 1 +#define EXCEPTION_MAXIMUM_PARAMETERS 15 + +typedef struct _EXCEPTION_RECORD { + NTSTATUS ExceptionCode; + ULONG ExceptionFlags; + struct _EXCEPTION_RECORD *ExceptionRecord; + PVOID ExceptionAddress; + ULONG NumberParameters; + ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; +} EXCEPTION_RECORD, *PEXCEPTION_RECORD; + +typedef struct _EXCEPTION_RECORD32 { + NTSTATUS ExceptionCode; + ULONG ExceptionFlags; + ULONG ExceptionRecord; + ULONG ExceptionAddress; + ULONG NumberParameters; + ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; +} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32; + +typedef struct _EXCEPTION_RECORD64 { + NTSTATUS ExceptionCode; + ULONG ExceptionFlags; + ULONG64 ExceptionRecord; + ULONG64 ExceptionAddress; + ULONG NumberParameters; + ULONG __unusedAlignment; + ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; +} EXCEPTION_RECORD64, *PEXCEPTION_RECORD64; + +typedef struct _EXCEPTION_POINTERS { + PEXCEPTION_RECORD ExceptionRecord; + PCONTEXT ContextRecord; +} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS; + + +typedef enum _KBUGCHECK_CALLBACK_REASON { + KbCallbackInvalid, + KbCallbackReserved1, + KbCallbackSecondaryDumpData, + KbCallbackDumpIo, + KbCallbackAddPages +} KBUGCHECK_CALLBACK_REASON; + +struct _KBUGCHECK_REASON_CALLBACK_RECORD; + +typedef VOID +(DDKAPI *PKBUGCHECK_REASON_CALLBACK_ROUTINE)( + IN KBUGCHECK_CALLBACK_REASON Reason, + IN struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record, + IN OUT PVOID ReasonSpecificData, + IN ULONG ReasonSpecificDataLength); + +typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD { + LIST_ENTRY Entry; + PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine; + PUCHAR Component; + ULONG_PTR Checksum; + KBUGCHECK_CALLBACK_REASON Reason; + UCHAR State; +} KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD; + +typedef enum _KBUGCHECK_BUFFER_DUMP_STATE { + BufferEmpty, + BufferInserted, + BufferStarted, + BufferFinished, + BufferIncomplete +} KBUGCHECK_BUFFER_DUMP_STATE; + +typedef VOID +(DDKAPI *PKBUGCHECK_CALLBACK_ROUTINE)( + IN PVOID Buffer, + IN ULONG Length); + +typedef struct _KBUGCHECK_CALLBACK_RECORD { + LIST_ENTRY Entry; + PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine; + PVOID Buffer; + ULONG Length; + PUCHAR Component; + ULONG_PTR Checksum; + UCHAR State; +} KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD; + +typedef BOOLEAN +(DDKAPI *PNMI_CALLBACK)( + IN PVOID Context, + IN BOOLEAN Handled); + +typedef enum _TRACE_INFORMATION_CLASS { + TraceIdClass, + TraceHandleClass, + TraceEnableFlagsClass, + TraceEnableLevelClass, + GlobalLoggerHandleClass, + EventLoggerHandleClass, + AllLoggerHandlesClass, + TraceHandleByNameClass, + LoggerEventsLostClass, + TraceSessionSettingsClass, + LoggerEventsLoggedClass, + MaxTraceInformationClass +} TRACE_INFORMATION_CLASS; + +typedef enum _KINTERRUPT_POLARITY { + InterruptPolarityUnknown, + InterruptActiveHigh, + InterruptActiveLow +} KINTERRUPT_POLARITY, *PKINTERRUPT_POLARITY; + +typedef enum _KPROFILE_SOURCE { + ProfileTime, + ProfileAlignmentFixup, + ProfileTotalIssues, + ProfilePipelineDry, + ProfileLoadInstructions, + ProfilePipelineFrozen, + ProfileBranchInstructions, + ProfileTotalNonissues, + ProfileDcacheMisses, + ProfileIcacheMisses, + ProfileCacheMisses, + ProfileBranchMispredictions, + ProfileStoreInstructions, + ProfileFpInstructions, + ProfileIntegerInstructions, + Profile2Issue, + Profile3Issue, + Profile4Issue, + ProfileSpecialInstructions, + ProfileTotalCycles, + ProfileIcacheIssues, + ProfileDcacheAccesses, + ProfileMemoryBarrierCycles, + ProfileLoadLinkedIssues, + ProfileMaximum +} KPROFILE_SOURCE; + +typedef enum _KWAIT_REASON { + Executive, + FreePage, + PageIn, + PoolAllocation, + DelayExecution, + Suspended, + UserRequest, + WrExecutive, + WrFreePage, + WrPageIn, + WrPoolAllocation, + WrDelayExecution, + WrSuspended, + WrUserRequest, + WrEventPair, + WrQueue, + WrLpcReceive, + WrLpcReply, + WrVirtualMemory, + WrPageOut, + WrRendezvous, + WrKeyedEvent, + WrTerminated, + WrProcessInSwap, + WrCpuRateControl, + WrCalloutStack, + WrKernel, + WrResource, + WrPushLock, + WrMutex, + WrQuantumEnd, + WrDispatchInt, + WrPreempted, + WrYieldExecution, + WrFastMutex, + WrGuardedMutex, + WrRundown, + MaximumWaitReason +} KWAIT_REASON; + +typedef struct _KWAIT_BLOCK { + LIST_ENTRY WaitListEntry; + struct _KTHREAD *Thread; + PVOID Object; + struct _KWAIT_BLOCK *NextWaitBlock; + USHORT WaitKey; + UCHAR WaitType; + volatile UCHAR BlockState; +#if defined(_WIN64) + LONG SpareLong; +#endif +} KWAIT_BLOCK, *PKWAIT_BLOCK, *PRKWAIT_BLOCK; + +typedef enum _KINTERRUPT_MODE { + LevelSensitive, + Latched +} KINTERRUPT_MODE; + +#define THREAD_WAIT_OBJECTS 3 + +typedef VOID +(DDKAPI *PKINTERRUPT_ROUTINE)( + VOID); + +typedef enum _KD_OPTION { + KD_OPTION_SET_BLOCK_ENABLE, +} KD_OPTION; + +typedef enum _INTERFACE_TYPE { + InterfaceTypeUndefined = -1, + Internal, + Isa, + Eisa, + MicroChannel, + TurboChannel, + PCIBus, + VMEBus, + NuBus, + PCMCIABus, + CBus, + MPIBus, + MPSABus, + ProcessorInternal, + InternalPowerBus, + PNPISABus, + PNPBus, + Vmcs, + MaximumInterfaceType +} INTERFACE_TYPE, *PINTERFACE_TYPE; + +typedef VOID +(DDKAPI *PKNORMAL_ROUTINE)( + IN PVOID NormalContext, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2); + +typedef VOID +(DDKAPI *PKRUNDOWN_ROUTINE)( + IN struct _KAPC *Apc); + +typedef VOID +(DDKAPI *PKKERNEL_ROUTINE)( + IN struct _KAPC *Apc, + IN OUT PKNORMAL_ROUTINE *NormalRoutine, + IN OUT PVOID *NormalContext, + IN OUT PVOID *SystemArgument1, + IN OUT PVOID *SystemArgument2); + +typedef struct _KAPC +{ + UCHAR Type; + UCHAR SpareByte0; + UCHAR Size; + UCHAR SpareByte1; + ULONG SpareLong0; + struct _KTHREAD *Thread; + LIST_ENTRY ApcListEntry; + PKKERNEL_ROUTINE KernelRoutine; + PKRUNDOWN_ROUTINE RundownRoutine; + PKNORMAL_ROUTINE NormalRoutine; + PVOID NormalContext; + PVOID SystemArgument1; + PVOID SystemArgument2; + CCHAR ApcStateIndex; + KPROCESSOR_MODE ApcMode; + BOOLEAN Inserted; +} KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC; + +typedef struct _KDEVICE_QUEUE_ENTRY { + LIST_ENTRY DeviceListEntry; + ULONG SortKey; + BOOLEAN Inserted; +} KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY, +*RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY; + +typedef PVOID PKIPI_CONTEXT; + +typedef +VOID +(NTAPI *PKIPI_WORKER)( + IN PKIPI_CONTEXT PacketContext, + IN PVOID Parameter1, + IN PVOID Parameter2, + IN PVOID Parameter3); + +typedef +ULONG_PTR +(NTAPI *PKIPI_BROADCAST_WORKER)( + IN ULONG_PTR Argument); + +typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK; + +typedef struct _KSPIN_LOCK_QUEUE { + struct _KSPIN_LOCK_QUEUE *volatile Next; + PKSPIN_LOCK volatile Lock; +} KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE; + +typedef struct _KLOCK_QUEUE_HANDLE { + KSPIN_LOCK_QUEUE LockQueue; + KIRQL OldIrql; +} KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE; + +#if defined(_AMD64_) + +typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER; + +#define LockQueueDispatcherLock 0 +#define LockQueueExpansionLock 1 +#define LockQueuePfnLock 2 +#define LockQueueSystemSpaceLock 3 +#define LockQueueVacbLock 4 +#define LockQueueMasterLock 5 +#define LockQueueNonPagedPoolLock 6 +#define LockQueueIoCancelLock 7 +#define LockQueueWorkQueueLock 8 +#define LockQueueIoVpbLock 9 +#define LockQueueIoDatabaseLock 10 +#define LockQueueIoCompletionLock 11 +#define LockQueueNtfsStructLock 12 +#define LockQueueAfdWorkQueueLock 13 +#define LockQueueBcbLock 14 +#define LockQueueMmNonPagedPoolLock 15 +#define LockQueueUnusedSpare16 16 +#define LockQueueTimerTableLock 17 +#define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS) + +#else + +typedef enum _KSPIN_LOCK_QUEUE_NUMBER { + LockQueueDispatcherLock, + LockQueueExpansionLock, + LockQueuePfnLock, + LockQueueSystemSpaceLock, + LockQueueVacbLock, + LockQueueMasterLock, + LockQueueNonPagedPoolLock, + LockQueueIoCancelLock, + LockQueueWorkQueueLock, + LockQueueIoVpbLock, + LockQueueIoDatabaseLock, + LockQueueIoCompletionLock, + LockQueueNtfsStructLock, + LockQueueAfdWorkQueueLock, + LockQueueBcbLock, + LockQueueMmNonPagedPoolLock, + LockQueueUnusedSpare16, + LockQueueTimerTableLock, + LockQueueMaximumLock = LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS +} KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER; + +#endif + +typedef VOID +(DDKAPI *PKDEFERRED_ROUTINE)( + IN struct _KDPC *Dpc, + IN PVOID DeferredContext, + IN PVOID SystemArgument1, + IN PVOID SystemArgument2); + +typedef enum _KDPC_IMPORTANCE { + LowImportance, + MediumImportance, + HighImportance, + MediumHighImportance +} KDPC_IMPORTANCE; + +typedef struct _KDPC +{ + UCHAR Type; + UCHAR Importance; + volatile USHORT Number; + LIST_ENTRY DpcListEntry; + PKDEFERRED_ROUTINE DeferredRoutine; + PVOID DeferredContext; + PVOID SystemArgument1; + PVOID SystemArgument2; + volatile PVOID DpcData; +} KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC; + +typedef struct _KDPC_WATCHDOG_INFORMATION { + ULONG DpcTimeLimit; + ULONG DpcTimeCount; + ULONG DpcWatchdogLimit; + ULONG DpcWatchdogCount; + ULONG Reserved; +} KDPC_WATCHDOG_INFORMATION, *PKDPC_WATCHDOG_INFORMATION; + +typedef struct _KDEVICE_QUEUE { + CSHORT Type; + CSHORT Size; + LIST_ENTRY DeviceListHead; + KSPIN_LOCK Lock; + #if defined(_AMD64_) + union { + BOOLEAN Busy; + struct { + LONG64 Reserved : 8; + LONG64 Hint : 56; + }; + }; + #else + BOOLEAN Busy; + #endif + +} KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE; + +#define TIMER_EXPIRED_INDEX_BITS 6 +#define TIMER_PROCESSOR_INDEX_BITS 5 +typedef struct _DISPATCHER_HEADER { + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + UCHAR Type; + _ANONYMOUS_UNION union { + _ANONYMOUS_UNION union { + UCHAR TimerControlFlags; + _ANONYMOUS_STRUCT struct { + UCHAR Absolute:1; + UCHAR Coalescable:1; + UCHAR KeepShifting:1; + UCHAR EncodedTolerableDelay:5; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + UCHAR Abandoned; +#if (NTDDI_VERSION < NTDDI_WIN7) + UCHAR NpxIrql; +#endif + BOOLEAN Signalling; + } DUMMYUNIONNAME; + _ANONYMOUS_UNION union { + _ANONYMOUS_UNION union { + UCHAR ThreadControlFlags; + _ANONYMOUS_STRUCT struct { + UCHAR CpuThrottled:1; + UCHAR CycleProfiling:1; + UCHAR CounterProfiling:1; + UCHAR Reserved:5; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + UCHAR Size; + UCHAR Hand; + } DUMMYUNIONNAME2; + _ANONYMOUS_UNION union { +#if (NTDDI_VERSION >= NTDDI_WIN7) + _ANONYMOUS_UNION union { + UCHAR TimerMiscFlags; + _ANONYMOUS_STRUCT struct { +#if !defined(_X86_) + UCHAR Index:TIMER_EXPIRED_INDEX_BITS; +#else + UCHAR Index:1; + UCHAR Processor:TIMER_PROCESSOR_INDEX_BITS; +#endif + UCHAR Inserted:1; + volatile UCHAR Expired:1; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; +#else + /* Pre Win7 compatibility fix to latest WDK */ + UCHAR Inserted; +#endif + _ANONYMOUS_UNION union { + BOOLEAN DebugActive; + _ANONYMOUS_STRUCT struct { + BOOLEAN ActiveDR7:1; + BOOLEAN Instrumented:1; + BOOLEAN Reserved2:4; + BOOLEAN UmsScheduled:1; + BOOLEAN UmsPrimary:1; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */ + BOOLEAN DpcActive; + } DUMMYUNIONNAME3; + } DUMMYSTRUCTNAME; + volatile LONG Lock; + } DUMMYUNIONNAME; + LONG SignalState; + LIST_ENTRY WaitListHead; +} DISPATCHER_HEADER, *PDISPATCHER_HEADER; + +typedef struct _KEVENT { + DISPATCHER_HEADER Header; +} KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT; + +typedef struct _KSEMAPHORE { + DISPATCHER_HEADER Header; + LONG Limit; +} KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE; + +typedef struct _KGATE +{ + DISPATCHER_HEADER Header; +} KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE; + +typedef struct _KGUARDED_MUTEX +{ + volatile LONG Count; + PKTHREAD Owner; + ULONG Contention; + KGATE Gate; + __GNU_EXTENSION union + { + __GNU_EXTENSION struct + { + SHORT KernelApcDisable; + SHORT SpecialApcDisable; + }; + ULONG CombinedApcDisable; + }; +} KGUARDED_MUTEX, *PKGUARDED_MUTEX; + +typedef struct _KMUTANT { + DISPATCHER_HEADER Header; + LIST_ENTRY MutantListEntry; + struct _KTHREAD *RESTRICTED_POINTER OwnerThread; + BOOLEAN Abandoned; + UCHAR ApcDisable; +} KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX; + +#define TIMER_TABLE_SIZE 512 +#define TIMER_TABLE_SHIFT 9 + +typedef struct _KTIMER { + DISPATCHER_HEADER Header; + ULARGE_INTEGER DueTime; + LIST_ENTRY TimerListEntry; + struct _KDPC *Dpc; + #if !defined(_X86_) + ULONG Processor; + #endif + ULONG Period; +} KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER; + +typedef BOOLEAN +(DDKAPI *PKSYNCHRONIZE_ROUTINE)( + IN PVOID SynchronizeContext); + +typedef enum _POOL_TYPE { + NonPagedPool, + PagedPool, + NonPagedPoolMustSucceed, + DontUseThisType, + NonPagedPoolCacheAligned, + PagedPoolCacheAligned, + NonPagedPoolCacheAlignedMustS, + MaxPoolType, + NonPagedPoolSession = 32, + PagedPoolSession, + NonPagedPoolMustSucceedSession, + DontUseThisTypeSession, + NonPagedPoolCacheAlignedSession, + PagedPoolCacheAlignedSession, + NonPagedPoolCacheAlignedMustSSession +} POOL_TYPE; + +typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE +{ + StandardDesign, + NEC98x86, + EndAlternatives +} ALTERNATIVE_ARCHITECTURE_TYPE; + +typedef struct _KSYSTEM_TIME +{ + ULONG LowPart; + LONG High1Time; + LONG High2Time; +} KSYSTEM_TIME, *PKSYSTEM_TIME; + +typedef struct _PNP_BUS_INFORMATION { + GUID BusTypeGuid; + INTERFACE_TYPE LegacyBusType; + ULONG BusNumber; +} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION; + +typedef struct DECLSPEC_ALIGN(16) _M128A { + ULONGLONG Low; + LONGLONG High; +} M128A, *PM128A; + +typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT { + USHORT ControlWord; + USHORT StatusWord; + UCHAR TagWord; + UCHAR Reserved1; + USHORT ErrorOpcode; + ULONG ErrorOffset; + USHORT ErrorSelector; + USHORT Reserved2; + ULONG DataOffset; + USHORT DataSelector; + USHORT Reserved3; + ULONG MxCsr; + ULONG MxCsr_Mask; + M128A FloatRegisters[8]; +#if defined(_WIN64) + M128A XmmRegisters[16]; + UCHAR Reserved4[96]; +#else + M128A XmmRegisters[8]; + UCHAR Reserved4[192]; + ULONG StackControl[7]; + ULONG Cr0NpxState; +#endif +} XSAVE_FORMAT, *PXSAVE_FORMAT; -// -// Access/Security Stuff -// +/****************************************************************************** + * Memory manager Types * + ******************************************************************************/ + +#define MM_DONT_ZERO_ALLOCATION 0x00000001 +#define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002 +#define MM_ALLOCATE_FULLY_REQUIRED 0x00000004 +#define MM_ALLOCATE_NO_WAIT 0x00000008 +#define MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010 +#define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020 + +#define MDL_MAPPED_TO_SYSTEM_VA 0x0001 +#define MDL_PAGES_LOCKED 0x0002 +#define MDL_SOURCE_IS_NONPAGED_POOL 0x0004 +#define MDL_ALLOCATED_FIXED_SIZE 0x0008 +#define MDL_PARTIAL 0x0010 +#define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020 +#define MDL_IO_PAGE_READ 0x0040 +#define MDL_WRITE_OPERATION 0x0080 +#define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100 +#define MDL_FREE_EXTRA_PTES 0x0200 +#define MDL_DESCRIBES_AWE 0x0400 +#define MDL_IO_SPACE 0x0800 +#define MDL_NETWORK_HEADER 0x1000 +#define MDL_MAPPING_CAN_FAIL 0x2000 +#define MDL_ALLOCATED_MUST_SUCCEED 0x4000 +#define MDL_INTERNAL 0x8000 + +#define MDL_MAPPING_FLAGS ( \ + MDL_MAPPED_TO_SYSTEM_VA | \ + MDL_PAGES_LOCKED | \ + MDL_SOURCE_IS_NONPAGED_POOL | \ + MDL_PARTIAL_HAS_BEEN_MAPPED | \ + MDL_PARENT_MAPPED_SYSTEM_VA | \ + MDL_SYSTEM_VA | \ + MDL_IO_SPACE) + +#define FLUSH_MULTIPLE_MAXIMUM 32 + +/* Section access rights */ +#define SECTION_QUERY 0x0001 +#define SECTION_MAP_WRITE 0x0002 +#define SECTION_MAP_READ 0x0004 +#define SECTION_MAP_EXECUTE 0x0008 +#define SECTION_EXTEND_SIZE 0x0010 +#define SECTION_MAP_EXECUTE_EXPLICIT 0x0020 + +#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\ + SECTION_MAP_WRITE | \ + SECTION_MAP_READ | \ + SECTION_MAP_EXECUTE | \ + SECTION_EXTEND_SIZE) + +#define SESSION_QUERY_ACCESS 0x0001 +#define SESSION_MODIFY_ACCESS 0x0002 + +#define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \ + SESSION_QUERY_ACCESS | \ + SESSION_MODIFY_ACCESS) + +#define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS + +#define PAGE_NOACCESS 0x01 +#define PAGE_READONLY 0x02 +#define PAGE_READWRITE 0x04 +#define PAGE_WRITECOPY 0x08 +#define PAGE_EXECUTE 0x10 +#define PAGE_EXECUTE_READ 0x20 +#define PAGE_EXECUTE_READWRITE 0x40 +#define PAGE_EXECUTE_WRITECOPY 0x80 +#define PAGE_GUARD 0x100 +#define PAGE_NOCACHE 0x200 +#define PAGE_WRITECOMBINE 0x400 + +#define MEM_COMMIT 0x1000 +#define MEM_RESERVE 0x2000 +#define MEM_DECOMMIT 0x4000 +#define MEM_RELEASE 0x8000 +#define MEM_FREE 0x10000 +#define MEM_PRIVATE 0x20000 +#define MEM_MAPPED 0x40000 +#define MEM_RESET 0x80000 +#define MEM_TOP_DOWN 0x100000 +#define MEM_LARGE_PAGES 0x20000000 +#define MEM_4MB_PAGES 0x80000000 + +#define SEC_RESERVE 0x4000000 +#define SEC_COMMIT 0x8000000 +#define SEC_LARGE_PAGES 0x80000000 + +/* Section map options */ +typedef enum _SECTION_INHERIT { + ViewShare = 1, + ViewUnmap = 2 +} SECTION_INHERIT; + +typedef ULONG PFN_COUNT; +typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER; +typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER; + +typedef struct _MDL { + struct _MDL *Next; + CSHORT Size; + CSHORT MdlFlags; + struct _EPROCESS *Process; + PVOID MappedSystemVa; + PVOID StartVa; + ULONG ByteCount; + ULONG ByteOffset; +} MDL, *PMDL; +typedef MDL *PMDLX; + +typedef enum _MEMORY_CACHING_TYPE_ORIG { + MmFrameBufferCached = 2 +} MEMORY_CACHING_TYPE_ORIG; + +typedef enum _MEMORY_CACHING_TYPE { + MmNonCached = FALSE, + MmCached = TRUE, + MmWriteCombined = MmFrameBufferCached, + MmHardwareCoherentCached, + MmNonCachedUnordered, + MmUSWCCached, + MmMaximumCacheType +} MEMORY_CACHING_TYPE; + +typedef enum _MM_PAGE_PRIORITY { + LowPagePriority, + NormalPagePriority = 16, + HighPagePriority = 32 +} MM_PAGE_PRIORITY; + +typedef enum _LOCK_OPERATION { + IoReadAccess, + IoWriteAccess, + IoModifyAccess +} LOCK_OPERATION; + +typedef enum _MM_SYSTEM_SIZE { + MmSmallSystem, + MmMediumSystem, + MmLargeSystem +} MM_SYSTEMSIZE; + + +/****************************************************************************** + * Executive Types * + ******************************************************************************/ + +#define EX_RUNDOWN_ACTIVE 0x1 +#define EX_RUNDOWN_COUNT_SHIFT 0x1 +#define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT) + +#ifdef _WIN64 +#define PORT_MAXIMUM_MESSAGE_LENGTH 512 +#else +#define PORT_MAXIMUM_MESSAGE_LENGTH 256 +#endif + +typedef struct _FAST_MUTEX { + volatile LONG Count; + PKTHREAD Owner; + ULONG Contention; + KEVENT Event; + ULONG OldIrql; +} FAST_MUTEX, *PFAST_MUTEX; + +typedef enum _SUITE_TYPE { + SmallBusiness, + Enterprise, + BackOffice, + CommunicationServer, + TerminalServer, + SmallBusinessRestricted, + EmbeddedNT, + DataCenter, + SingleUserTS, + Personal, + Blade, + EmbeddedRestricted, + SecurityAppliance, + StorageServer, + ComputeServer, + WHServer, + MaxSuiteType +} SUITE_TYPE; + +typedef enum _EX_POOL_PRIORITY { + LowPoolPriority, + LowPoolPrioritySpecialPoolOverrun = 8, + LowPoolPrioritySpecialPoolUnderrun = 9, + NormalPoolPriority = 16, + NormalPoolPrioritySpecialPoolOverrun = 24, + NormalPoolPrioritySpecialPoolUnderrun = 25, + HighPoolPriority = 32, + HighPoolPrioritySpecialPoolOverrun = 40, + HighPoolPrioritySpecialPoolUnderrun = 41 +} EX_POOL_PRIORITY; + +#if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_)) +#define LOOKASIDE_ALIGN +#else +#define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */ +#endif + +typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX; + +typedef PVOID +(DDKAPI *PALLOCATE_FUNCTION)( + IN POOL_TYPE PoolType, + IN SIZE_T NumberOfBytes, + IN ULONG Tag); + +typedef PVOID +(DDKAPI *PALLOCATE_FUNCTION_EX)( + IN POOL_TYPE PoolType, + IN SIZE_T NumberOfBytes, + IN ULONG Tag, + IN OUT PLOOKASIDE_LIST_EX Lookaside); + +typedef VOID +(DDKAPI *PFREE_FUNCTION)( + IN PVOID Buffer); + +typedef VOID +(DDKAPI *PFREE_FUNCTION_EX)( + IN PVOID Buffer, + IN OUT PLOOKASIDE_LIST_EX Lookaside); + +typedef VOID +(DDKAPI *PCALLBACK_FUNCTION)( + IN PVOID CallbackContext, + IN PVOID Argument1, + IN PVOID Argument2); + +#define GENERAL_LOOKASIDE_LAYOUT \ + union { \ + SLIST_HEADER ListHead; \ + SINGLE_LIST_ENTRY SingleListHead; \ + } DUMMYUNIONNAME; \ + USHORT Depth; \ + USHORT MaximumDepth; \ + ULONG TotalAllocates; \ + union { \ + ULONG AllocateMisses; \ + ULONG AllocateHits; \ + } DUMMYUNIONNAME2; \ + \ + ULONG TotalFrees; \ + union { \ + ULONG FreeMisses; \ + ULONG FreeHits; \ + } DUMMYUNIONNAME3; \ + \ + POOL_TYPE Type; \ + ULONG Tag; \ + ULONG Size; \ + union { \ + PALLOCATE_FUNCTION_EX AllocateEx; \ + PALLOCATE_FUNCTION Allocate; \ + } DUMMYUNIONNAME4; \ + \ + union { \ + PFREE_FUNCTION_EX FreeEx; \ + PFREE_FUNCTION Free; \ + } DUMMYUNIONNAME5; \ + \ + LIST_ENTRY ListEntry; \ + ULONG LastTotalAllocates; \ + union { \ + ULONG LastAllocateMisses; \ + ULONG LastAllocateHits; \ + } DUMMYUNIONNAME6; \ + ULONG Future[2]; + +typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE { + GENERAL_LOOKASIDE_LAYOUT +} GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE; + +typedef struct _GENERAL_LOOKASIDE_POOL { + GENERAL_LOOKASIDE_LAYOUT +} GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL; + +typedef struct _PAGED_LOOKASIDE_LIST { + GENERAL_LOOKASIDE L; +#if !defined(_AMD64_) && !defined(_IA64_) + FAST_MUTEX Lock__ObsoleteButDoNotDelete; +#endif +} PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST; + +typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST { + GENERAL_LOOKASIDE L; +#if !defined(_AMD64_) && !defined(_IA64_) + KSPIN_LOCK Lock__ObsoleteButDoNotDelete; +#endif +} NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST; + +typedef struct _LOOKASIDE_LIST_EX { + GENERAL_LOOKASIDE_POOL L; +} LOOKASIDE_LIST_EX; + +typedef struct _EX_RUNDOWN_REF { + __GNU_EXTENSION union { + volatile ULONG_PTR Count; + volatile PVOID Ptr; + }; +} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF; + +typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE; + +typedef VOID +(DDKAPI *PWORKER_THREAD_ROUTINE)( + IN PVOID Parameter); + +typedef struct _WORK_QUEUE_ITEM { + LIST_ENTRY List; + PWORKER_THREAD_ROUTINE WorkerRoutine; + volatile PVOID Parameter; +} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM; + + +/****************************************************************************** + * Security Manager Types * + ******************************************************************************/ + +/* Simple types */ +typedef PVOID PSECURITY_DESCRIPTOR; +typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION; typedef ULONG ACCESS_MASK, *PACCESS_MASK; typedef PVOID PACCESS_TOKEN; +typedef PVOID PSID; #define DELETE 0x00010000L #define READ_CONTROL 0x00020000L @@ -746,17 +1539,11 @@ typedef struct _ACL { USHORT Sbz2; } ACL, *PACL; - - -// -// Current security descriptor revision value -// +/* Current security descriptor revision value */ #define SECURITY_DESCRIPTOR_REVISION (1) #define SECURITY_DESCRIPTOR_REVISION1 (1) -// -// Privilege attributes -// +/* Privilege attributes */ #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L) #define SE_PRIVILEGE_ENABLED (0x00000002L) #define SE_PRIVILEGE_REMOVED (0X00000004L) @@ -773,14 +1560,11 @@ typedef struct _LUID_AND_ATTRIBUTES { ULONG Attributes; } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES; #include + typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY]; typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY; - - -// -// Privilege sets -// +/* Privilege sets */ #define PRIVILEGE_SET_ALL_NECESSARY (1) typedef struct _PRIVILEGE_SET { @@ -831,11 +1615,357 @@ typedef struct _SE_IMPERSONATION_STATE { #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L) #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L) +typedef enum _SECURITY_OPERATION_CODE { + SetSecurityDescriptor, + QuerySecurityDescriptor, + DeleteSecurityDescriptor, + AssignSecurityDescriptor +} SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE; + +#define INITIAL_PRIVILEGE_COUNT 3 + +typedef struct _INITIAL_PRIVILEGE_SET { + ULONG PrivilegeCount; + ULONG Control; + LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT]; +} INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET; + +#define SE_MIN_WELL_KNOWN_PRIVILEGE 2 +#define SE_CREATE_TOKEN_PRIVILEGE 2 +#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3 +#define SE_LOCK_MEMORY_PRIVILEGE 4 +#define SE_INCREASE_QUOTA_PRIVILEGE 5 +#define SE_MACHINE_ACCOUNT_PRIVILEGE 6 +#define SE_TCB_PRIVILEGE 7 +#define SE_SECURITY_PRIVILEGE 8 +#define SE_TAKE_OWNERSHIP_PRIVILEGE 9 +#define SE_LOAD_DRIVER_PRIVILEGE 10 +#define SE_SYSTEM_PROFILE_PRIVILEGE 11 +#define SE_SYSTEMTIME_PRIVILEGE 12 +#define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13 +#define SE_INC_BASE_PRIORITY_PRIVILEGE 14 +#define SE_CREATE_PAGEFILE_PRIVILEGE 15 +#define SE_CREATE_PERMANENT_PRIVILEGE 16 +#define SE_BACKUP_PRIVILEGE 17 +#define SE_RESTORE_PRIVILEGE 18 +#define SE_SHUTDOWN_PRIVILEGE 19 +#define SE_DEBUG_PRIVILEGE 20 +#define SE_AUDIT_PRIVILEGE 21 +#define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22 +#define SE_CHANGE_NOTIFY_PRIVILEGE 23 +#define SE_REMOTE_SHUTDOWN_PRIVILEGE 24 +#define SE_UNDOCK_PRIVILEGE 25 +#define SE_SYNC_AGENT_PRIVILEGE 26 +#define SE_ENABLE_DELEGATION_PRIVILEGE 27 +#define SE_MANAGE_VOLUME_PRIVILEGE 28 +#define SE_IMPERSONATE_PRIVILEGE 29 +#define SE_CREATE_GLOBAL_PRIVILEGE 30 +#define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31 +#define SE_RELABEL_PRIVILEGE 32 +#define SE_INC_WORKING_SET_PRIVILEGE 33 +#define SE_TIME_ZONE_PRIVILEGE 34 +#define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE 35 +#define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE + +typedef struct _SECURITY_SUBJECT_CONTEXT { + PACCESS_TOKEN ClientToken; + SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; + PACCESS_TOKEN PrimaryToken; + PVOID ProcessAuditId; +} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT; + +typedef struct _ACCESS_STATE { + LUID OperationID; + BOOLEAN SecurityEvaluated; + BOOLEAN GenerateAudit; + BOOLEAN GenerateOnClose; + BOOLEAN PrivilegesAllocated; + ULONG Flags; + ACCESS_MASK RemainingDesiredAccess; + ACCESS_MASK PreviouslyGrantedAccess; + ACCESS_MASK OriginalDesiredAccess; + SECURITY_SUBJECT_CONTEXT SubjectSecurityContext; + PSECURITY_DESCRIPTOR SecurityDescriptor; + PVOID AuxData; + union { + INITIAL_PRIVILEGE_SET InitialPrivilegeSet; + PRIVILEGE_SET PrivilegeSet; + } Privileges; + + BOOLEAN AuditPrivileges; + UNICODE_STRING ObjectName; + UNICODE_STRING ObjectTypeName; +} ACCESS_STATE, *PACCESS_STATE; -// -// Registry Access Rights -// +#ifndef _NTLSA_IFS_ + +#ifndef _NTLSA_AUDIT_ +#define _NTLSA_AUDIT_ + +#define SE_MAX_AUDIT_PARAMETERS 32 +#define SE_MAX_GENERIC_AUDIT_PARAMETERS 28 + +#define SE_ADT_OBJECT_ONLY 0x1 + +#define SE_ADT_PARAMETERS_SELF_RELATIVE 0x00000001 +#define SE_ADT_PARAMETERS_SEND_TO_LSA 0x00000002 +#define SE_ADT_PARAMETER_EXTENSIBLE_AUDIT 0x00000004 +#define SE_ADT_PARAMETER_GENERIC_AUDIT 0x00000008 +#define SE_ADT_PARAMETER_WRITE_SYNCHRONOUS 0x00000010 + +#define LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE(Parameters) \ + ( sizeof(SE_ADT_PARAMETER_ARRAY) - sizeof(SE_ADT_PARAMETER_ARRAY_ENTRY) * \ + (SE_MAX_AUDIT_PARAMETERS - Parameters->ParameterCount) ) + +typedef enum _SE_ADT_PARAMETER_TYPE { + SeAdtParmTypeNone = 0, + SeAdtParmTypeString, + SeAdtParmTypeFileSpec, + SeAdtParmTypeUlong, + SeAdtParmTypeSid, + SeAdtParmTypeLogonId, + SeAdtParmTypeNoLogonId, + SeAdtParmTypeAccessMask, + SeAdtParmTypePrivs, + SeAdtParmTypeObjectTypes, + SeAdtParmTypeHexUlong, + SeAdtParmTypePtr, + SeAdtParmTypeTime, + SeAdtParmTypeGuid, + SeAdtParmTypeLuid, + SeAdtParmTypeHexInt64, + SeAdtParmTypeStringList, + SeAdtParmTypeSidList, + SeAdtParmTypeDuration, + SeAdtParmTypeUserAccountControl, + SeAdtParmTypeNoUac, + SeAdtParmTypeMessage, + SeAdtParmTypeDateTime, + SeAdtParmTypeSockAddr, + SeAdtParmTypeSD, + SeAdtParmTypeLogonHours, + SeAdtParmTypeLogonIdNoSid, + SeAdtParmTypeUlongNoConv, + SeAdtParmTypeSockAddrNoPort, + SeAdtParmTypeAccessReason +} SE_ADT_PARAMETER_TYPE, *PSE_ADT_PARAMETER_TYPE; + +typedef struct _SE_ADT_OBJECT_TYPE { + GUID ObjectType; + USHORT Flags; + USHORT Level; + ACCESS_MASK AccessMask; +} SE_ADT_OBJECT_TYPE, *PSE_ADT_OBJECT_TYPE; + +typedef struct _SE_ADT_PARAMETER_ARRAY_ENTRY { + SE_ADT_PARAMETER_TYPE Type; + ULONG Length; + ULONG_PTR Data[2]; + PVOID Address; +} SE_ADT_PARAMETER_ARRAY_ENTRY, *PSE_ADT_PARAMETER_ARRAY_ENTRY; + +typedef struct _SE_ADT_ACCESS_REASON { + ACCESS_MASK AccessMask; + ULONG AccessReasons[32]; + ULONG ObjectTypeIndex; + ULONG AccessGranted; + PSECURITY_DESCRIPTOR SecurityDescriptor; +} SE_ADT_ACCESS_REASON, *PSE_ADT_ACCESS_REASON; + +typedef struct _SE_ADT_PARAMETER_ARRAY { + ULONG CategoryId; + ULONG AuditId; + ULONG ParameterCount; + ULONG Length; + USHORT FlatSubCategoryId; + USHORT Type; + ULONG Flags; + SE_ADT_PARAMETER_ARRAY_ENTRY Parameters[ SE_MAX_AUDIT_PARAMETERS ]; +} SE_ADT_PARAMETER_ARRAY, *PSE_ADT_PARAMETER_ARRAY; + +#endif /* !_NTLSA_AUDIT_ */ +#endif /* !_NTLSA_IFS_ */ + + +/****************************************************************************** + * Power Management Support Types * + ******************************************************************************/ + +#ifndef _PO_DDK_ +#define _PO_DDK_ + +/* Power States/Levels */ +typedef enum _SYSTEM_POWER_STATE { + PowerSystemUnspecified, + PowerSystemWorking, + PowerSystemSleeping1, + PowerSystemSleeping2, + PowerSystemSleeping3, + PowerSystemHibernate, + PowerSystemShutdown, + PowerSystemMaximum +} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE; + +#define POWER_SYSTEM_MAXIMUM PowerSystemMaximum + +typedef enum _POWER_INFORMATION_LEVEL { + SystemPowerPolicyAc, + SystemPowerPolicyDc, + VerifySystemPolicyAc, + VerifySystemPolicyDc, + SystemPowerCapabilities, + SystemBatteryState, + SystemPowerStateHandler, + ProcessorStateHandler, + SystemPowerPolicyCurrent, + AdministratorPowerPolicy, + SystemReserveHiberFile, + ProcessorInformation, + SystemPowerInformation, + ProcessorStateHandler2, + LastWakeTime, + LastSleepTime, + SystemExecutionState, + SystemPowerStateNotifyHandler, + ProcessorPowerPolicyAc, + ProcessorPowerPolicyDc, + VerifyProcessorPowerPolicyAc, + VerifyProcessorPowerPolicyDc, + ProcessorPowerPolicyCurrent, + SystemPowerStateLogging, + SystemPowerLoggingEntry, + SetPowerSettingValue, + NotifyUserPowerSetting, + PowerInformationLevelUnused0, + PowerInformationLevelUnused1, + SystemVideoState, + TraceApplicationPowerMessage, + TraceApplicationPowerMessageEnd, + ProcessorPerfStates, + ProcessorIdleStates, + ProcessorCap, + SystemWakeSource, + SystemHiberFileInformation, + TraceServicePowerMessage, + ProcessorLoad, + PowerShutdownNotification, + MonitorCapabilities, + SessionPowerInit, + SessionDisplayState, + PowerRequestCreate, + PowerRequestAction, + GetPowerRequestList, + ProcessorInformationEx, + NotifyUserModeLegacyPowerEvent, + GroupPark, + ProcessorIdleDomains, + WakeTimerList, + SystemHiberFileSize, + PowerInformationLevelMaximum +} POWER_INFORMATION_LEVEL; + +typedef enum { + PowerActionNone, + PowerActionReserved, + PowerActionSleep, + PowerActionHibernate, + PowerActionShutdown, + PowerActionShutdownReset, + PowerActionShutdownOff, + PowerActionWarmEject +} POWER_ACTION, *PPOWER_ACTION; + +typedef enum _DEVICE_POWER_STATE { + PowerDeviceUnspecified, + PowerDeviceD0, + PowerDeviceD1, + PowerDeviceD2, + PowerDeviceD3, + PowerDeviceMaximum +} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE; + +typedef union _POWER_STATE { + SYSTEM_POWER_STATE SystemState; + DEVICE_POWER_STATE DeviceState; +} POWER_STATE, *PPOWER_STATE; + +typedef enum _POWER_STATE_TYPE { + SystemPowerState = 0, + DevicePowerState +} POWER_STATE_TYPE, *PPOWER_STATE_TYPE; + +#if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) +typedef struct { + ULONG Granularity; + ULONG Capacity; +} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE; +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */ + +#endif /* !_PO_DDK_ */ + +typedef VOID +(DDKAPI *PREQUEST_POWER_COMPLETE)( + IN struct _DEVICE_OBJECT *DeviceObject, + IN UCHAR MinorFunction, + IN POWER_STATE PowerState, + IN PVOID Context, + IN struct _IO_STATUS_BLOCK *IoStatus); + +typedef +NTSTATUS +(DDKAPI POWER_SETTING_CALLBACK)( + IN LPCGUID SettingGuid, + IN PVOID Value, + IN ULONG ValueLength, + IN OUT PVOID Context OPTIONAL); + +typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK; + +#define PO_CB_SYSTEM_POWER_POLICY 0 +#define PO_CB_AC_STATUS 1 +#define PO_CB_BUTTON_COLLISION 2 +#define PO_CB_SYSTEM_STATE_LOCK 3 +#define PO_CB_LID_SWITCH_STATE 4 +#define PO_CB_PROCESSOR_POWER_POLICY 5 + +/****************************************************************************** + * Configuration Manager Types * + ******************************************************************************/ + +/* Resource list definitions */ +typedef int CM_RESOURCE_TYPE; + +#define CmResourceTypeNull 0 +#define CmResourceTypePort 1 +#define CmResourceTypeInterrupt 2 +#define CmResourceTypeMemory 3 +#define CmResourceTypeDma 4 +#define CmResourceTypeDeviceSpecific 5 +#define CmResourceTypeBusNumber 6 +#define CmResourceTypeNonArbitrated 128 +#define CmResourceTypeConfigData 128 +#define CmResourceTypeDevicePrivate 129 +#define CmResourceTypePcCardConfig 130 +#define CmResourceTypeMfCardConfig 131 + +/* KEY_VALUE_Xxx.Type */ +#define REG_NONE 0 +#define REG_SZ 1 +#define REG_EXPAND_SZ 2 +#define REG_BINARY 3 +#define REG_DWORD 4 +#define REG_DWORD_LITTLE_ENDIAN 4 +#define REG_DWORD_BIG_ENDIAN 5 +#define REG_LINK 6 +#define REG_MULTI_SZ 7 +#define REG_RESOURCE_LIST 8 +#define REG_FULL_RESOURCE_DESCRIPTOR 9 +#define REG_RESOURCE_REQUIREMENTS_LIST 10 +#define REG_QWORD 11 +#define REG_QWORD_LITTLE_ENDIAN 11 + +/* Registry Access Rights */ #define KEY_QUERY_VALUE (0x0001) #define KEY_SET_VALUE (0x0002) #define KEY_CREATE_SUB_KEY (0x0004) @@ -873,9 +2003,7 @@ typedef struct _SE_IMPERSONATION_STATE { & \ (~SYNCHRONIZE)) -// -// Registry Open/Create Options -// +/* Registry Open/Create Options */ #define REG_OPTION_RESERVED (0x00000000L) #define REG_OPTION_NON_VOLATILE (0x00000000L) #define REG_OPTION_VOLATILE (0x00000001L) @@ -891,15 +2019,11 @@ typedef struct _SE_IMPERSONATION_STATE { REG_OPTION_BACKUP_RESTORE |\ REG_OPTION_OPEN_LINK) -// -// Key creation/open disposition -// +/* Key creation/open disposition */ #define REG_CREATED_NEW_KEY (0x00000001L) #define REG_OPENED_EXISTING_KEY (0x00000002L) -// -// Key restore & hive load flags -// +/* Key restore & hive load flags */ #define REG_WHOLE_HIVE_VOLATILE (0x00000001L) #define REG_REFRESH_HIVE (0x00000002L) #define REG_NO_LAZY_FLUSH (0x00000004L) @@ -911,14 +2035,10 @@ typedef struct _SE_IMPERSONATION_STATE { #define REG_HIVE_NO_RM (0x00000100L) #define REG_HIVE_SINGLE_LOG (0x00000200L) -// -// Unload Flags -// +/* Unload Flags */ #define REG_FORCE_UNLOAD 1 -// -// Notify Filter Values -// +/* Notify Filter Values */ #define REG_NOTIFY_CHANGE_NAME (0x00000001L) #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L) #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L) @@ -930,80 +2050,3249 @@ typedef struct _SE_IMPERSONATION_STATE { REG_NOTIFY_CHANGE_LAST_SET |\ REG_NOTIFY_CHANGE_SECURITY) +typedef struct _CM_FLOPPY_DEVICE_DATA { + USHORT Version; + USHORT Revision; + CHAR Size[8]; + ULONG MaxDensity; + ULONG MountDensity; + UCHAR StepRateHeadUnloadTime; + UCHAR HeadLoadTime; + UCHAR MotorOffTime; + UCHAR SectorLengthCode; + UCHAR SectorPerTrack; + UCHAR ReadWriteGapLength; + UCHAR DataTransferLength; + UCHAR FormatGapLength; + UCHAR FormatFillCharacter; + UCHAR HeadSettleTime; + UCHAR MotorSettleTime; + UCHAR MaximumTrackValue; + UCHAR DataTransferRate; +} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; - -// -// Thread Access Rights -// -#define THREAD_TERMINATE (0x0001) -#define THREAD_SUSPEND_RESUME (0x0002) -#define THREAD_ALERT (0x0004) -#define THREAD_GET_CONTEXT (0x0008) -#define THREAD_SET_CONTEXT (0x0010) -#define THREAD_SET_INFORMATION (0x0020) -#define THREAD_SET_LIMITED_INFORMATION (0x0400) -#define THREAD_QUERY_LIMITED_INFORMATION (0x0800) -#if (NTDDI_VERSION >= NTDDI_VISTA) -#define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \ - 0xFFFF) +#include +typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR { + UCHAR Type; + UCHAR ShareDisposition; + USHORT Flags; + union { + struct { + PHYSICAL_ADDRESS Start; + ULONG Length; + } Generic; + struct { + PHYSICAL_ADDRESS Start; + ULONG Length; + } Port; + struct { +#if defined(NT_PROCESSOR_GROUPS) + USHORT Level; + USHORT Group; #else -#define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \ - 0x3FF) + ULONG Level; +#endif + ULONG Vector; + KAFFINITY Affinity; + } Interrupt; +#if (NTDDI_VERSION >= NTDDI_LONGHORN) + struct { + __GNU_EXTENSION union { + struct { +#if defined(NT_PROCESSOR_GROUPS) + USHORT Group; +#else + USHORT Reserved; +#endif + USHORT MessageCount; + ULONG Vector; + KAFFINITY Affinity; + } Raw; + struct { +#if defined(NT_PROCESSOR_GROUPS) + USHORT Level; + USHORT Group; +#else + ULONG Level; +#endif + ULONG Vector; + KAFFINITY Affinity; + } Translated; + } DUMMYUNIONNAME; + } MessageInterrupt; +#endif + struct { + PHYSICAL_ADDRESS Start; + ULONG Length; + } Memory; + struct { + ULONG Channel; + ULONG Port; + ULONG Reserved1; + } Dma; + struct { + ULONG Data[3]; + } DevicePrivate; + struct { + ULONG Start; + ULONG Length; + ULONG Reserved; + } BusNumber; + struct { + ULONG DataSize; + ULONG Reserved1; + ULONG Reserved2; + } DeviceSpecificData; +#if (NTDDI_VERSION >= NTDDI_LONGHORN) + struct { + PHYSICAL_ADDRESS Start; + ULONG Length40; + } Memory40; + struct { + PHYSICAL_ADDRESS Start; + ULONG Length48; + } Memory48; + struct { + PHYSICAL_ADDRESS Start; + ULONG Length64; + } Memory64; +#endif + } u; +} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR; +#include + +/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */ +#define CmResourceTypeNull 0 +#define CmResourceTypePort 1 +#define CmResourceTypeInterrupt 2 +#define CmResourceTypeMemory 3 +#define CmResourceTypeDma 4 +#define CmResourceTypeDeviceSpecific 5 +#define CmResourceTypeBusNumber 6 +#define CmResourceTypeMemoryLarge 7 +#define CmResourceTypeNonArbitrated 128 +#define CmResourceTypeConfigData 128 +#define CmResourceTypeDevicePrivate 129 +#define CmResourceTypePcCardConfig 130 +#define CmResourceTypeMfCardConfig 131 + +/* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */ +typedef enum _CM_SHARE_DISPOSITION { + CmResourceShareUndetermined, + CmResourceShareDeviceExclusive, + CmResourceShareDriverExclusive, + CmResourceShareShared +} CM_SHARE_DISPOSITION; + +/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */ +#define CM_RESOURCE_PORT_MEMORY 0x0000 +#define CM_RESOURCE_PORT_IO 0x0001 +#define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004 +#define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008 +#define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010 +#define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020 +#define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040 +#define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080 +#define CM_RESOURCE_PORT_BAR 0x0100 + +/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */ +#define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000 +#define CM_RESOURCE_INTERRUPT_LATCHED 0x0001 +#define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002 +#define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004 + +/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */ +#define CM_RESOURCE_MEMORY_READ_WRITE 0x0000 +#define CM_RESOURCE_MEMORY_READ_ONLY 0x0001 +#define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002 +#define CM_RESOURCE_MEMORY_WRITEABILITY_MASK 0x0003 +#define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004 +#define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008 +#define CM_RESOURCE_MEMORY_24 0x0010 +#define CM_RESOURCE_MEMORY_CACHEABLE 0x0020 +#define CM_RESOURCE_MEMORY_WINDOW_DECODE 0x0040 +#define CM_RESOURCE_MEMORY_BAR 0x0080 +#define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100 + +/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */ +#define CM_RESOURCE_DMA_8 0x0000 +#define CM_RESOURCE_DMA_16 0x0001 +#define CM_RESOURCE_DMA_32 0x0002 +#define CM_RESOURCE_DMA_8_AND_16 0x0004 +#define CM_RESOURCE_DMA_BUS_MASTER 0x0008 +#define CM_RESOURCE_DMA_TYPE_A 0x0010 +#define CM_RESOURCE_DMA_TYPE_B 0x0020 +#define CM_RESOURCE_DMA_TYPE_F 0x0040 + +typedef struct _CM_PARTIAL_RESOURCE_LIST { + USHORT Version; + USHORT Revision; + ULONG Count; + CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1]; +} CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST; + +typedef struct _CM_FULL_RESOURCE_DESCRIPTOR { + INTERFACE_TYPE InterfaceType; + ULONG BusNumber; + CM_PARTIAL_RESOURCE_LIST PartialResourceList; +} CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR; + +typedef struct _CM_RESOURCE_LIST { + ULONG Count; + CM_FULL_RESOURCE_DESCRIPTOR List[1]; +} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST; + +#include +typedef struct _CM_INT13_DRIVE_PARAMETER { + USHORT DriveSelect; + ULONG MaxCylinders; + USHORT SectorsPerTrack; + USHORT MaxHeads; + USHORT NumberDrives; +} CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER; + +typedef struct _CM_PNP_BIOS_DEVICE_NODE { + USHORT Size; + UCHAR Node; + ULONG ProductId; + UCHAR DeviceType[3]; + USHORT DeviceAttributes; +} CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE; + +typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK { + UCHAR Signature[4]; + UCHAR Revision; + UCHAR Length; + USHORT ControlField; + UCHAR Checksum; + ULONG EventFlagAddress; + USHORT RealModeEntryOffset; + USHORT RealModeEntrySegment; + USHORT ProtectedModeEntryOffset; + ULONG ProtectedModeCodeBaseAddress; + ULONG OemDeviceId; + USHORT RealModeDataBaseAddress; + ULONG ProtectedModeDataBaseAddress; +} CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK; +#include + +typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA { + ULONG BytesPerSector; + ULONG NumberOfCylinders; + ULONG SectorsPerTrack; + ULONG NumberOfHeads; +} CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA; + +typedef struct _CM_KEYBOARD_DEVICE_DATA { + USHORT Version; + USHORT Revision; + UCHAR Type; + UCHAR Subtype; + USHORT KeyboardFlags; +} CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA; + +typedef struct _CM_MCA_POS_DATA { + USHORT AdapterId; + UCHAR PosData1; + UCHAR PosData2; + UCHAR PosData3; + UCHAR PosData4; +} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA; + +#if (NTDDI_VERSION >= NTDDI_WINXP) +typedef struct CM_Power_Data_s { + ULONG PD_Size; + DEVICE_POWER_STATE PD_MostRecentPowerState; + ULONG PD_Capabilities; + ULONG PD_D1Latency; + ULONG PD_D2Latency; + ULONG PD_D3Latency; + DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]; + SYSTEM_POWER_STATE PD_DeepestSystemWake; +} CM_POWER_DATA, *PCM_POWER_DATA; + +#define PDCAP_D0_SUPPORTED 0x00000001 +#define PDCAP_D1_SUPPORTED 0x00000002 +#define PDCAP_D2_SUPPORTED 0x00000004 +#define PDCAP_D3_SUPPORTED 0x00000008 +#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010 +#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020 +#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040 +#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080 +#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100 + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +typedef struct _CM_SCSI_DEVICE_DATA { + USHORT Version; + USHORT Revision; + UCHAR HostIdentifier; +} CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA; + +typedef struct _CM_SERIAL_DEVICE_DATA { + USHORT Version; + USHORT Revision; + ULONG BaudClock; +} CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA; + +typedef enum _KEY_INFORMATION_CLASS { + KeyBasicInformation, + KeyNodeInformation, + KeyFullInformation, + KeyNameInformation, + KeyCachedInformation, + KeyFlagsInformation +} KEY_INFORMATION_CLASS; + +typedef struct _KEY_BASIC_INFORMATION { + LARGE_INTEGER LastWriteTime; + ULONG TitleIndex; + ULONG NameLength; + WCHAR Name[1]; +} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION; + +typedef struct _KEY_FULL_INFORMATION { + LARGE_INTEGER LastWriteTime; + ULONG TitleIndex; + ULONG ClassOffset; + ULONG ClassLength; + ULONG SubKeys; + ULONG MaxNameLen; + ULONG MaxClassLen; + ULONG Values; + ULONG MaxValueNameLen; + ULONG MaxValueDataLen; + WCHAR Class[1]; +} KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION; + +typedef struct _KEY_NODE_INFORMATION { + LARGE_INTEGER LastWriteTime; + ULONG TitleIndex; + ULONG ClassOffset; + ULONG ClassLength; + ULONG NameLength; + WCHAR Name[1]; +} KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION; + +typedef struct _KEY_VALUE_BASIC_INFORMATION { + ULONG TitleIndex; + ULONG Type; + ULONG NameLength; + WCHAR Name[1]; +} KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION; + +typedef struct _KEY_VALUE_FULL_INFORMATION { + ULONG TitleIndex; + ULONG Type; + ULONG DataOffset; + ULONG DataLength; + ULONG NameLength; + WCHAR Name[1]; +} KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION; + +typedef struct _KEY_VALUE_PARTIAL_INFORMATION { + ULONG TitleIndex; + ULONG Type; + ULONG DataLength; + UCHAR Data[1]; +} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION; + +typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 { + ULONG Type; + ULONG DataLength; + UCHAR Data[1]; +} KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64; + +typedef struct _KEY_VALUE_ENTRY { + PUNICODE_STRING ValueName; + ULONG DataLength; + ULONG DataOffset; + ULONG Type; +} KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY; + +typedef enum _KEY_VALUE_INFORMATION_CLASS { + KeyValueBasicInformation, + KeyValueFullInformation, + KeyValuePartialInformation, + KeyValueFullInformationAlign64, + KeyValuePartialInformationAlign64 +} KEY_VALUE_INFORMATION_CLASS; + +typedef struct _KEY_WRITE_TIME_INFORMATION { + LARGE_INTEGER LastWriteTime; +} KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION; + +typedef enum _KEY_SET_INFORMATION_CLASS { + KeyWriteTimeInformation, + KeyWow64FlagsInformation, + KeyControlFlagsInformation, + KeySetVirtualizationInformation, + KeySetDebugInformation, + KeySetHandleTagsInformation, + MaxKeySetInfoClass +} KEY_SET_INFORMATION_CLASS; + +typedef enum _REG_NOTIFY_CLASS { + RegNtDeleteKey, + RegNtPreDeleteKey = RegNtDeleteKey, + RegNtSetValueKey, + RegNtPreSetValueKey = RegNtSetValueKey, + RegNtDeleteValueKey, + RegNtPreDeleteValueKey = RegNtDeleteValueKey, + RegNtSetInformationKey, + RegNtPreSetInformationKey = RegNtSetInformationKey, + RegNtRenameKey, + RegNtPreRenameKey = RegNtRenameKey, + RegNtEnumerateKey, + RegNtPreEnumerateKey = RegNtEnumerateKey, + RegNtEnumerateValueKey, + RegNtPreEnumerateValueKey = RegNtEnumerateValueKey, + RegNtQueryKey, + RegNtPreQueryKey = RegNtQueryKey, + RegNtQueryValueKey, + RegNtPreQueryValueKey = RegNtQueryValueKey, + RegNtQueryMultipleValueKey, + RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey, + RegNtPreCreateKey, + RegNtPostCreateKey, + RegNtPreOpenKey, + RegNtPostOpenKey, + RegNtKeyHandleClose, + RegNtPreKeyHandleClose = RegNtKeyHandleClose, + RegNtPostDeleteKey, + RegNtPostSetValueKey, + RegNtPostDeleteValueKey, + RegNtPostSetInformationKey, + RegNtPostRenameKey, + RegNtPostEnumerateKey, + RegNtPostEnumerateValueKey, + RegNtPostQueryKey, + RegNtPostQueryValueKey, + RegNtPostQueryMultipleValueKey, + RegNtPostKeyHandleClose, + RegNtPreCreateKeyEx, + RegNtPostCreateKeyEx, + RegNtPreOpenKeyEx, + RegNtPostOpenKeyEx, + RegNtPreFlushKey, + RegNtPostFlushKey, + RegNtPreLoadKey, + RegNtPostLoadKey, + RegNtPreUnLoadKey, + RegNtPostUnLoadKey, + RegNtPreQueryKeySecurity, + RegNtPostQueryKeySecurity, + RegNtPreSetKeySecurity, + RegNtPostSetKeySecurity, + RegNtCallbackObjectContextCleanup, + RegNtPreRestoreKey, + RegNtPostRestoreKey, + RegNtPreSaveKey, + RegNtPostSaveKey, + RegNtPreReplaceKey, + RegNtPostReplaceKey, + MaxRegNtNotifyClass +} REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS; + +typedef NTSTATUS +(NTAPI *PEX_CALLBACK_FUNCTION)( + IN PVOID CallbackContext, + IN PVOID Argument1, + IN PVOID Argument2 +); + +typedef struct _REG_DELETE_KEY_INFORMATION { + PVOID Object; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION +#if (NTDDI_VERSION >= NTDDI_VISTA) +, REG_FLUSH_KEY_INFORMATION, *PREG_FLUSH_KEY_INFORMATION +#endif +; + +typedef struct _REG_SET_VALUE_KEY_INFORMATION { + PVOID Object; + PUNICODE_STRING ValueName; + ULONG TitleIndex; + ULONG Type; + PVOID Data; + ULONG DataSize; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION; + +typedef struct _REG_DELETE_VALUE_KEY_INFORMATION { + PVOID Object; + PUNICODE_STRING ValueName; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION; + +typedef struct _REG_SET_INFORMATION_KEY_INFORMATION { + PVOID Object; + KEY_SET_INFORMATION_CLASS KeySetInformationClass; + PVOID KeySetInformation; + ULONG KeySetInformationLength; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION; + +typedef struct _REG_ENUMERATE_KEY_INFORMATION { + PVOID Object; + ULONG Index; + KEY_INFORMATION_CLASS KeyInformationClass; + PVOID KeyInformation; + ULONG Length; + PULONG ResultLength; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION; + +typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION { + PVOID Object; + ULONG Index; + KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass; + PVOID KeyValueInformation; + ULONG Length; + PULONG ResultLength; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION; + +typedef struct _REG_QUERY_KEY_INFORMATION { + PVOID Object; + KEY_INFORMATION_CLASS KeyInformationClass; + PVOID KeyInformation; + ULONG Length; + PULONG ResultLength; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION; + +typedef struct _REG_QUERY_VALUE_KEY_INFORMATION { + PVOID Object; + PUNICODE_STRING ValueName; + KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass; + PVOID KeyValueInformation; + ULONG Length; + PULONG ResultLength; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION; + +typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION { + PVOID Object; + PKEY_VALUE_ENTRY ValueEntries; + ULONG EntryCount; + PVOID ValueBuffer; + PULONG BufferLength; + PULONG RequiredBufferLength; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION; + +typedef struct _REG_PRE_CREATE_KEY_INFORMATION { + PUNICODE_STRING CompleteName; +} REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;; + +typedef struct _REG_POST_CREATE_KEY_INFORMATION { + PUNICODE_STRING CompleteName; + PVOID Object; + NTSTATUS Status; +} REG_POST_CREATE_KEY_INFORMATION,REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION; + +typedef struct _REG_POST_OPERATION_INFORMATION { + PVOID Object; + NTSTATUS Status; + PVOID PreInformation; + NTSTATUS ReturnStatus; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION; + +typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION { + PVOID Object; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION; + +/****************************************************************************** + * I/O Manager Types * + ******************************************************************************/ + + /* PCI_COMMON_CONFIG.Command */ +#define PCI_ENABLE_IO_SPACE 0x0001 +#define PCI_ENABLE_MEMORY_SPACE 0x0002 +#define PCI_ENABLE_BUS_MASTER 0x0004 +#define PCI_ENABLE_SPECIAL_CYCLES 0x0008 +#define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010 +#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020 +#define PCI_ENABLE_PARITY 0x0040 +#define PCI_ENABLE_WAIT_CYCLE 0x0080 +#define PCI_ENABLE_SERR 0x0100 +#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 +#define PCI_DISABLE_LEVEL_INTERRUPT 0x0400 + +/* PCI_COMMON_CONFIG.Status */ +#define PCI_STATUS_INTERRUPT_PENDING 0x0008 +#define PCI_STATUS_CAPABILITIES_LIST 0x0010 +#define PCI_STATUS_66MHZ_CAPABLE 0x0020 +#define PCI_STATUS_UDF_SUPPORTED 0x0040 +#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 +#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100 +#define PCI_STATUS_DEVSEL 0x0600 +#define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800 +#define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000 +#define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000 +#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000 +#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000 + +/* PCI_COMMON_CONFIG.HeaderType */ +#define PCI_MULTIFUNCTION 0x80 +#define PCI_DEVICE_TYPE 0x00 +#define PCI_BRIDGE_TYPE 0x01 +#define PCI_CARDBUS_BRIDGE_TYPE 0x02 + +#define PCI_CONFIGURATION_TYPE(PciData) \ + (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION) + +#define PCI_MULTIFUNCTION_DEVICE(PciData) \ + ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0) + +/* PCI device classes */ +#define PCI_CLASS_PRE_20 0x00 +#define PCI_CLASS_MASS_STORAGE_CTLR 0x01 +#define PCI_CLASS_NETWORK_CTLR 0x02 +#define PCI_CLASS_DISPLAY_CTLR 0x03 +#define PCI_CLASS_MULTIMEDIA_DEV 0x04 +#define PCI_CLASS_MEMORY_CTLR 0x05 +#define PCI_CLASS_BRIDGE_DEV 0x06 +#define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07 +#define PCI_CLASS_BASE_SYSTEM_DEV 0x08 +#define PCI_CLASS_INPUT_DEV 0x09 +#define PCI_CLASS_DOCKING_STATION 0x0a +#define PCI_CLASS_PROCESSOR 0x0b +#define PCI_CLASS_SERIAL_BUS_CTLR 0x0c +#define PCI_CLASS_WIRELESS_CTLR 0x0d +#define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e +#define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f +#define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10 +#define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11 + +/* PCI device subclasses for class 0 */ +#define PCI_SUBCLASS_PRE_20_NON_VGA 0x00 +#define PCI_SUBCLASS_PRE_20_VGA 0x01 + +/* PCI device subclasses for class 1 (mass storage controllers)*/ +#define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00 +#define PCI_SUBCLASS_MSC_IDE_CTLR 0x01 +#define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02 +#define PCI_SUBCLASS_MSC_IPI_CTLR 0x03 +#define PCI_SUBCLASS_MSC_RAID_CTLR 0x04 +#define PCI_SUBCLASS_MSC_OTHER 0x80 + +/* PCI device subclasses for class 2 (network controllers)*/ +#define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00 +#define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01 +#define PCI_SUBCLASS_NET_FDDI_CTLR 0x02 +#define PCI_SUBCLASS_NET_ATM_CTLR 0x03 +#define PCI_SUBCLASS_NET_ISDN_CTLR 0x04 +#define PCI_SUBCLASS_NET_OTHER 0x80 + +/* PCI device subclasses for class 3 (display controllers)*/ +#define PCI_SUBCLASS_VID_VGA_CTLR 0x00 +#define PCI_SUBCLASS_VID_XGA_CTLR 0x01 +#define PCI_SUBCLASS_VID_3D_CTLR 0x02 +#define PCI_SUBCLASS_VID_OTHER 0x80 + +/* PCI device subclasses for class 4 (multimedia device)*/ +#define PCI_SUBCLASS_MM_VIDEO_DEV 0x00 +#define PCI_SUBCLASS_MM_AUDIO_DEV 0x01 +#define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02 +#define PCI_SUBCLASS_MM_OTHER 0x80 + +/* PCI device subclasses for class 5 (memory controller)*/ +#define PCI_SUBCLASS_MEM_RAM 0x00 +#define PCI_SUBCLASS_MEM_FLASH 0x01 +#define PCI_SUBCLASS_MEM_OTHER 0x80 + +/* PCI device subclasses for class 6 (bridge device)*/ +#define PCI_SUBCLASS_BR_HOST 0x00 +#define PCI_SUBCLASS_BR_ISA 0x01 +#define PCI_SUBCLASS_BR_EISA 0x02 +#define PCI_SUBCLASS_BR_MCA 0x03 +#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 +#define PCI_SUBCLASS_BR_PCMCIA 0x05 +#define PCI_SUBCLASS_BR_NUBUS 0x06 +#define PCI_SUBCLASS_BR_CARDBUS 0x07 +#define PCI_SUBCLASS_BR_RACEWAY 0x08 +#define PCI_SUBCLASS_BR_OTHER 0x80 + +/* PCI device subclasses for class C (serial bus controller)*/ +#define PCI_SUBCLASS_SB_IEEE1394 0x00 +#define PCI_SUBCLASS_SB_ACCESS 0x01 +#define PCI_SUBCLASS_SB_SSA 0x02 +#define PCI_SUBCLASS_SB_USB 0x03 +#define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04 +#define PCI_SUBCLASS_SB_SMBUS 0x05 + +#define PCI_MAX_DEVICES 32 +#define PCI_MAX_FUNCTION 8 +#define PCI_MAX_BRIDGE_NUMBER 0xFF +#define PCI_INVALID_VENDORID 0xFFFF +#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific)) + +#define PCI_ADDRESS_IO_SPACE 0x00000001 +#define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006 +#define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008 +#define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc +#define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0 +#define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800 + +#define PCI_TYPE_32BIT 0 +#define PCI_TYPE_20BIT 2 +#define PCI_TYPE_64BIT 4 + +#define POOL_COLD_ALLOCATION 256 +#define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8 +#define POOL_RAISE_IF_ALLOCATION_FAILURE 16 + +#define PCI_TYPE0_ADDRESSES 6 +#define PCI_TYPE1_ADDRESSES 2 +#define PCI_TYPE2_ADDRESSES 5 + +#define IO_TYPE_ADAPTER 1 +#define IO_TYPE_CONTROLLER 2 +#define IO_TYPE_DEVICE 3 +#define IO_TYPE_DRIVER 4 +#define IO_TYPE_FILE 5 +#define IO_TYPE_IRP 6 +#define IO_TYPE_MASTER_ADAPTER 7 +#define IO_TYPE_OPEN_PACKET 8 +#define IO_TYPE_TIMER 9 +#define IO_TYPE_VPB 10 +#define IO_TYPE_ERROR_LOG 11 +#define IO_TYPE_ERROR_MESSAGE 12 +#define IO_TYPE_DEVICE_OBJECT_EXTENSION 13 + +#define IO_TYPE_CSQ_IRP_CONTEXT 1 +#define IO_TYPE_CSQ 2 +#define IO_TYPE_CSQ_EX 3 + +/* IO_RESOURCE_DESCRIPTOR.Option */ +#define IO_RESOURCE_PREFERRED 0x01 +#define IO_RESOURCE_DEFAULT 0x02 +#define IO_RESOURCE_ALTERNATIVE 0x08 + +/* DEVICE_OBJECT.Flags */ +#define DO_VERIFY_VOLUME 0x00000002 +#define DO_BUFFERED_IO 0x00000004 +#define DO_EXCLUSIVE 0x00000008 +#define DO_DIRECT_IO 0x00000010 +#define DO_MAP_IO_BUFFER 0x00000020 +#define DO_DEVICE_INITIALIZING 0x00000080 +#define DO_SHUTDOWN_REGISTERED 0x00000800 +#define DO_BUS_ENUMERATED_DEVICE 0x00001000 +#define DO_POWER_PAGABLE 0x00002000 +#define DO_POWER_INRUSH 0x00004000 + +/* DEVICE_OBJECT.Characteristics */ +#define FILE_REMOVABLE_MEDIA 0x00000001 +#define FILE_READ_ONLY_DEVICE 0x00000002 +#define FILE_FLOPPY_DISKETTE 0x00000004 +#define FILE_WRITE_ONCE_MEDIA 0x00000008 +#define FILE_REMOTE_DEVICE 0x00000010 +#define FILE_DEVICE_IS_MOUNTED 0x00000020 +#define FILE_VIRTUAL_VOLUME 0x00000040 +#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 +#define FILE_DEVICE_SECURE_OPEN 0x00000100 +#define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800 +#define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000 +#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000 + +/* DEVICE_OBJECT.AlignmentRequirement */ +#define FILE_BYTE_ALIGNMENT 0x00000000 +#define FILE_WORD_ALIGNMENT 0x00000001 +#define FILE_LONG_ALIGNMENT 0x00000003 +#define FILE_QUAD_ALIGNMENT 0x00000007 +#define FILE_OCTA_ALIGNMENT 0x0000000f +#define FILE_32_BYTE_ALIGNMENT 0x0000001f +#define FILE_64_BYTE_ALIGNMENT 0x0000003f +#define FILE_128_BYTE_ALIGNMENT 0x0000007f +#define FILE_256_BYTE_ALIGNMENT 0x000000ff +#define FILE_512_BYTE_ALIGNMENT 0x000001ff + +/* DEVICE_OBJECT.DeviceType */ +#define DEVICE_TYPE ULONG + +#define FILE_DEVICE_BEEP 0x00000001 +#define FILE_DEVICE_CD_ROM 0x00000002 +#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 +#define FILE_DEVICE_CONTROLLER 0x00000004 +#define FILE_DEVICE_DATALINK 0x00000005 +#define FILE_DEVICE_DFS 0x00000006 +#define FILE_DEVICE_DISK 0x00000007 +#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 +#define FILE_DEVICE_FILE_SYSTEM 0x00000009 +#define FILE_DEVICE_INPORT_PORT 0x0000000a +#define FILE_DEVICE_KEYBOARD 0x0000000b +#define FILE_DEVICE_MAILSLOT 0x0000000c +#define FILE_DEVICE_MIDI_IN 0x0000000d +#define FILE_DEVICE_MIDI_OUT 0x0000000e +#define FILE_DEVICE_MOUSE 0x0000000f +#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 +#define FILE_DEVICE_NAMED_PIPE 0x00000011 +#define FILE_DEVICE_NETWORK 0x00000012 +#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 +#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 +#define FILE_DEVICE_NULL 0x00000015 +#define FILE_DEVICE_PARALLEL_PORT 0x00000016 +#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 +#define FILE_DEVICE_PRINTER 0x00000018 +#define FILE_DEVICE_SCANNER 0x00000019 +#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a +#define FILE_DEVICE_SERIAL_PORT 0x0000001b +#define FILE_DEVICE_SCREEN 0x0000001c +#define FILE_DEVICE_SOUND 0x0000001d +#define FILE_DEVICE_STREAMS 0x0000001e +#define FILE_DEVICE_TAPE 0x0000001f +#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 +#define FILE_DEVICE_TRANSPORT 0x00000021 +#define FILE_DEVICE_UNKNOWN 0x00000022 +#define FILE_DEVICE_VIDEO 0x00000023 +#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 +#define FILE_DEVICE_WAVE_IN 0x00000025 +#define FILE_DEVICE_WAVE_OUT 0x00000026 +#define FILE_DEVICE_8042_PORT 0x00000027 +#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 +#define FILE_DEVICE_BATTERY 0x00000029 +#define FILE_DEVICE_BUS_EXTENDER 0x0000002a +#define FILE_DEVICE_MODEM 0x0000002b +#define FILE_DEVICE_VDM 0x0000002c +#define FILE_DEVICE_MASS_STORAGE 0x0000002d +#define FILE_DEVICE_SMB 0x0000002e +#define FILE_DEVICE_KS 0x0000002f +#define FILE_DEVICE_CHANGER 0x00000030 +#define FILE_DEVICE_SMARTCARD 0x00000031 +#define FILE_DEVICE_ACPI 0x00000032 +#define FILE_DEVICE_DVD 0x00000033 +#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 +#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 +#define FILE_DEVICE_DFS_VOLUME 0x00000036 +#define FILE_DEVICE_SERENUM 0x00000037 +#define FILE_DEVICE_TERMSRV 0x00000038 +#define FILE_DEVICE_KSEC 0x00000039 +#define FILE_DEVICE_FIPS 0x0000003A +#define FILE_DEVICE_INFINIBAND 0x0000003B +#define FILE_DEVICE_VMBUS 0x0000003E +#define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F +#define FILE_DEVICE_WPD 0x00000040 +#define FILE_DEVICE_BLUETOOTH 0x00000041 +#define FILE_DEVICE_MT_COMPOSITE 0x00000042 +#define FILE_DEVICE_MT_TRANSPORT 0x00000043 +#define FILE_DEVICE_BIOMETRIC 0x00000044 +#define FILE_DEVICE_PMI 0x00000045 + +#define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR)) + +typedef struct _OBJECT_HANDLE_INFORMATION { + ULONG HandleAttributes; + ACCESS_MASK GrantedAccess; +} OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION; + +typedef struct _CLIENT_ID { + HANDLE UniqueProcess; + HANDLE UniqueThread; +} CLIENT_ID, *PCLIENT_ID; + +typedef VOID +(DDKAPI *PKSTART_ROUTINE)( + IN PVOID StartContext); + +typedef struct _VPB { + CSHORT Type; + CSHORT Size; + USHORT Flags; + USHORT VolumeLabelLength; + struct _DEVICE_OBJECT *DeviceObject; + struct _DEVICE_OBJECT *RealDevice; + ULONG SerialNumber; + ULONG ReferenceCount; + WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)]; +} VPB, *PVPB; + +typedef enum _IO_ALLOCATION_ACTION { + KeepObject = 1, + DeallocateObject, + DeallocateObjectKeepRegisters +} IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION; + +typedef IO_ALLOCATION_ACTION +(DDKAPI *PDRIVER_CONTROL)( + IN struct _DEVICE_OBJECT *DeviceObject, + IN struct _IRP *Irp, + IN PVOID MapRegisterBase, + IN PVOID Context); + +typedef struct _WAIT_CONTEXT_BLOCK { + KDEVICE_QUEUE_ENTRY WaitQueueEntry; + PDRIVER_CONTROL DeviceRoutine; + PVOID DeviceContext; + ULONG NumberOfMapRegisters; + PVOID DeviceObject; + PVOID CurrentIrp; + PKDPC BufferChainingDpc; +} WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK; + +typedef struct _DEVICE_OBJECT { + CSHORT Type; + USHORT Size; + LONG ReferenceCount; + struct _DRIVER_OBJECT *DriverObject; + struct _DEVICE_OBJECT *NextDevice; + struct _DEVICE_OBJECT *AttachedDevice; + struct _IRP *CurrentIrp; + PIO_TIMER Timer; + ULONG Flags; + ULONG Characteristics; + volatile PVPB Vpb; + PVOID DeviceExtension; + DEVICE_TYPE DeviceType; + CCHAR StackSize; + union { + LIST_ENTRY ListEntry; + WAIT_CONTEXT_BLOCK Wcb; + } Queue; + ULONG AlignmentRequirement; + KDEVICE_QUEUE DeviceQueue; + KDPC Dpc; + ULONG ActiveThreadCount; + PSECURITY_DESCRIPTOR SecurityDescriptor; + KEVENT DeviceLock; + USHORT SectorSize; + USHORT Spare1; + struct _DEVOBJ_EXTENSION *DeviceObjectExtension; + PVOID Reserved; +} DEVICE_OBJECT, *PDEVICE_OBJECT; + +typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK; + +typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK { + BOOLEAN Removed; + BOOLEAN Reserved[3]; + volatile LONG IoCount; + KEVENT RemoveEvent; +} IO_REMOVE_LOCK_COMMON_BLOCK; + +typedef struct _IO_REMOVE_LOCK_DBG_BLOCK { + LONG Signature; + LONG HighWatermark; + LONGLONG MaxLockedTicks; + LONG AllocateTag; + LIST_ENTRY LockList; + KSPIN_LOCK Spin; + volatile LONG LowMemoryCount; + ULONG Reserved1[4]; + PVOID Reserved2; + PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks; +} IO_REMOVE_LOCK_DBG_BLOCK; + +typedef struct _IO_REMOVE_LOCK { + IO_REMOVE_LOCK_COMMON_BLOCK Common; +#if DBG + IO_REMOVE_LOCK_DBG_BLOCK Dbg; +#endif +} IO_REMOVE_LOCK, *PIO_REMOVE_LOCK; + +typedef struct _IO_WORKITEM *PIO_WORKITEM; + +typedef VOID +(DDKAPI IO_WORKITEM_ROUTINE)( + IN PDEVICE_OBJECT DeviceObject, + IN PVOID Context); +typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE; + +typedef struct _SHARE_ACCESS { + ULONG OpenCount; + ULONG Readers; + ULONG Writers; + ULONG Deleters; + ULONG SharedRead; + ULONG SharedWrite; + ULONG SharedDelete; +} SHARE_ACCESS, *PSHARE_ACCESS; + +/* While MS WDK uses inheritance in C++, we cannot do this with gcc, as + inheritance, even from a struct renders the type non-POD. So we use + this hack */ +#define PCI_COMMON_HEADER_LAYOUT \ + USHORT VendorID; \ + USHORT DeviceID; \ + USHORT Command; \ + USHORT Status; \ + UCHAR RevisionID; \ + UCHAR ProgIf; \ + UCHAR SubClass; \ + UCHAR BaseClass; \ + UCHAR CacheLineSize; \ + UCHAR LatencyTimer; \ + UCHAR HeaderType; \ + UCHAR BIST; \ + union { \ + struct _PCI_HEADER_TYPE_0 { \ + ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \ + ULONG CIS; \ + USHORT SubVendorID; \ + USHORT SubSystemID; \ + ULONG ROMBaseAddress; \ + UCHAR CapabilitiesPtr; \ + UCHAR Reserved1[3]; \ + ULONG Reserved2; \ + UCHAR InterruptLine; \ + UCHAR InterruptPin; \ + UCHAR MinimumGrant; \ + UCHAR MaximumLatency; \ + } type0; \ + struct _PCI_HEADER_TYPE_1 { \ + ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \ + UCHAR PrimaryBus; \ + UCHAR SecondaryBus; \ + UCHAR SubordinateBus; \ + UCHAR SecondaryLatency; \ + UCHAR IOBase; \ + UCHAR IOLimit; \ + USHORT SecondaryStatus; \ + USHORT MemoryBase; \ + USHORT MemoryLimit; \ + USHORT PrefetchBase; \ + USHORT PrefetchLimit; \ + ULONG PrefetchBaseUpper32; \ + ULONG PrefetchLimitUpper32; \ + USHORT IOBaseUpper16; \ + USHORT IOLimitUpper16; \ + UCHAR CapabilitiesPtr; \ + UCHAR Reserved1[3]; \ + ULONG ROMBaseAddress; \ + UCHAR InterruptLine; \ + UCHAR InterruptPin; \ + USHORT BridgeControl; \ + } type1; \ + struct _PCI_HEADER_TYPE_2 { \ + ULONG SocketRegistersBaseAddress; \ + UCHAR CapabilitiesPtr; \ + UCHAR Reserved; \ + USHORT SecondaryStatus; \ + UCHAR PrimaryBus; \ + UCHAR SecondaryBus; \ + UCHAR SubordinateBus; \ + UCHAR SecondaryLatency; \ + struct { \ + ULONG Base; \ + ULONG Limit; \ + } Range[PCI_TYPE2_ADDRESSES-1]; \ + UCHAR InterruptLine; \ + UCHAR InterruptPin; \ + USHORT BridgeControl; \ + } type2; \ + } u; + +typedef struct _PCI_COMMON_HEADER { + PCI_COMMON_HEADER_LAYOUT +} PCI_COMMON_HEADER, *PPCI_COMMON_HEADER; + +#ifdef __cplusplus +typedef struct _PCI_COMMON_CONFIG { + PCI_COMMON_HEADER_LAYOUT + UCHAR DeviceSpecific[192]; +} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; +#else +typedef struct _PCI_COMMON_CONFIG { + PCI_COMMON_HEADER DUMMYSTRUCTNAME; + UCHAR DeviceSpecific[192]; +} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; #endif -// -// Service Start Types -// -#define SERVICE_BOOT_START 0x00000000 -#define SERVICE_SYSTEM_START 0x00000001 -#define SERVICE_AUTO_START 0x00000002 -#define SERVICE_DEMAND_START 0x00000003 -#define SERVICE_DISABLED 0x00000004 +typedef enum _CREATE_FILE_TYPE { + CreateFileTypeNone, + CreateFileTypeNamedPipe, + CreateFileTypeMailslot +} CREATE_FILE_TYPE; -// -// Exception Records -// -#define EXCEPTION_NONCONTINUABLE 1 -#define EXCEPTION_MAXIMUM_PARAMETERS 15 +#define IO_FORCE_ACCESS_CHECK 0x001 +#define IO_NO_PARAMETER_CHECKING 0x100 -typedef struct _EXCEPTION_RECORD { - NTSTATUS ExceptionCode; - ULONG ExceptionFlags; - struct _EXCEPTION_RECORD *ExceptionRecord; - PVOID ExceptionAddress; - ULONG NumberParameters; - ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; -} EXCEPTION_RECORD, *PEXCEPTION_RECORD; +#define IO_REPARSE 0x0 +#define IO_REMOUNT 0x1 -typedef struct _EXCEPTION_RECORD32 { - NTSTATUS ExceptionCode; - ULONG ExceptionFlags; - ULONG ExceptionRecord; - ULONG ExceptionAddress; - ULONG NumberParameters; - ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; -} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32; +typedef struct _IO_STATUS_BLOCK { + _ANONYMOUS_UNION union { + NTSTATUS Status; + PVOID Pointer; + } DUMMYUNIONNAME; + ULONG_PTR Information; +} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; -typedef struct _EXCEPTION_RECORD64 { - NTSTATUS ExceptionCode; - ULONG ExceptionFlags; - ULONG64 ExceptionRecord; - ULONG64 ExceptionAddress; - ULONG NumberParameters; - ULONG __unusedAlignment; - ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; -} EXCEPTION_RECORD64, *PEXCEPTION_RECORD64; +typedef struct _PCI_SLOT_NUMBER { + union { + struct { + ULONG DeviceNumber : 5; + ULONG FunctionNumber : 3; + ULONG Reserved : 24; + } bits; + ULONG AsULONG; + } u; +} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER; -typedef struct _EXCEPTION_POINTERS { - PEXCEPTION_RECORD ExceptionRecord; - PCONTEXT ContextRecord; -} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS; +typedef VOID +(DDKAPI *PIO_APC_ROUTINE)( + IN PVOID ApcContext, + IN PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG Reserved); + +typedef VOID +(DDKAPI *WMI_NOTIFICATION_CALLBACK)( + PVOID Wnode, + PVOID Context); + +#define WMIREG_ACTION_REGISTER 1 +#define WMIREG_ACTION_DEREGISTER 2 +#define WMIREG_ACTION_REREGISTER 3 +#define WMIREG_ACTION_UPDATE_GUIDS 4 +#define WMIREG_ACTION_BLOCK_IRPS 5 + +#define EVENT_INCREMENT 1 +#define IO_NO_INCREMENT 0 +#define IO_CD_ROM_INCREMENT 1 +#define IO_DISK_INCREMENT 1 +#define IO_KEYBOARD_INCREMENT 6 +#define IO_MAILSLOT_INCREMENT 2 +#define IO_MOUSE_INCREMENT 6 +#define IO_NAMED_PIPE_INCREMENT 2 +#define IO_NETWORK_INCREMENT 2 +#define IO_PARALLEL_INCREMENT 1 +#define IO_SERIAL_INCREMENT 2 +#define IO_SOUND_INCREMENT 8 +#define IO_VIDEO_INCREMENT 1 +#define SEMAPHORE_INCREMENT 1 + +#define MM_MAXIMUM_DISK_IO_SIZE (0x10000) + +typedef struct _BOOTDISK_INFORMATION { + LONGLONG BootPartitionOffset; + LONGLONG SystemPartitionOffset; + ULONG BootDeviceSignature; + ULONG SystemDeviceSignature; +} BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION; + +typedef struct _BOOTDISK_INFORMATION_EX { + LONGLONG BootPartitionOffset; + LONGLONG SystemPartitionOffset; + ULONG BootDeviceSignature; + ULONG SystemDeviceSignature; + GUID BootDeviceGuid; + GUID SystemDeviceGuid; + BOOLEAN BootDeviceIsGpt; + BOOLEAN SystemDeviceIsGpt; +} BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX; + +typedef struct _EISA_MEMORY_TYPE { + UCHAR ReadWrite : 1; + UCHAR Cached : 1; + UCHAR Reserved0 : 1; + UCHAR Type : 2; + UCHAR Shared : 1; + UCHAR Reserved1 : 1; + UCHAR MoreEntries : 1; +} EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE; + +#include +typedef struct _EISA_MEMORY_CONFIGURATION { + EISA_MEMORY_TYPE ConfigurationByte; + UCHAR DataSize; + USHORT AddressLowWord; + UCHAR AddressHighByte; + USHORT MemorySize; +} EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION; +#include + +typedef struct _EISA_IRQ_DESCRIPTOR { + UCHAR Interrupt : 4; + UCHAR Reserved : 1; + UCHAR LevelTriggered : 1; + UCHAR Shared : 1; + UCHAR MoreEntries : 1; +} EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR; + +typedef struct _EISA_IRQ_CONFIGURATION { + EISA_IRQ_DESCRIPTOR ConfigurationByte; + UCHAR Reserved; +} EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION; + +typedef struct _DMA_CONFIGURATION_BYTE0 { + UCHAR Channel : 3; + UCHAR Reserved : 3; + UCHAR Shared : 1; + UCHAR MoreEntries : 1; +} DMA_CONFIGURATION_BYTE0; + +typedef struct _DMA_CONFIGURATION_BYTE1 { + UCHAR Reserved0 : 2; + UCHAR TransferSize : 2; + UCHAR Timing : 2; + UCHAR Reserved1 : 2; +} DMA_CONFIGURATION_BYTE1; + +typedef struct _EISA_DMA_CONFIGURATION { + DMA_CONFIGURATION_BYTE0 ConfigurationByte0; + DMA_CONFIGURATION_BYTE1 ConfigurationByte1; +} EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION; + +#include +typedef struct _EISA_PORT_DESCRIPTOR { + UCHAR NumberPorts : 5; + UCHAR Reserved : 1; + UCHAR Shared : 1; + UCHAR MoreEntries : 1; +} EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR; + +typedef struct _EISA_PORT_CONFIGURATION { + EISA_PORT_DESCRIPTOR Configuration; + USHORT PortAddress; +} EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION; +#include + +typedef struct _CM_EISA_FUNCTION_INFORMATION { + ULONG CompressedId; + UCHAR IdSlotFlags1; + UCHAR IdSlotFlags2; + UCHAR MinorRevision; + UCHAR MajorRevision; + UCHAR Selections[26]; + UCHAR FunctionFlags; + UCHAR TypeString[80]; + EISA_MEMORY_CONFIGURATION EisaMemory[9]; + EISA_IRQ_CONFIGURATION EisaIrq[7]; + EISA_DMA_CONFIGURATION EisaDma[4]; + EISA_PORT_CONFIGURATION EisaPort[20]; + UCHAR InitializationData[60]; +} CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION; + +/* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */ + +#define EISA_FUNCTION_ENABLED 0x80 +#define EISA_FREE_FORM_DATA 0x40 +#define EISA_HAS_PORT_INIT_ENTRY 0x20 +#define EISA_HAS_PORT_RANGE 0x10 +#define EISA_HAS_DMA_ENTRY 0x08 +#define EISA_HAS_IRQ_ENTRY 0x04 +#define EISA_HAS_MEMORY_ENTRY 0x02 +#define EISA_HAS_TYPE_ENTRY 0x01 +#define EISA_HAS_INFORMATION \ + (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \ + + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY) + +typedef struct _CM_EISA_SLOT_INFORMATION { + UCHAR ReturnCode; + UCHAR ReturnFlags; + UCHAR MajorRevision; + UCHAR MinorRevision; + USHORT Checksum; + UCHAR NumberFunctions; + UCHAR FunctionInformation; + ULONG CompressedId; +} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION; + +/* CM_EISA_SLOT_INFORMATION.ReturnCode */ + +#define EISA_INVALID_SLOT 0x80 +#define EISA_INVALID_FUNCTION 0x81 +#define EISA_INVALID_CONFIGURATION 0x82 +#define EISA_EMPTY_SLOT 0x83 +#define EISA_INVALID_BIOS_CALL 0x86 + +/* +** Plug and Play structures +*/ + +typedef VOID +(DDKAPI *PINTERFACE_REFERENCE)( + PVOID Context); + +typedef VOID +(DDKAPI *PINTERFACE_DEREFERENCE)( + PVOID Context); + +typedef BOOLEAN +(DDKAPI *PTRANSLATE_BUS_ADDRESS)( + IN PVOID Context, + IN PHYSICAL_ADDRESS BusAddress, + IN ULONG Length, + IN OUT PULONG AddressSpace, + OUT PPHYSICAL_ADDRESS TranslatedAddress); + +typedef struct _DMA_ADAPTER* +(DDKAPI *PGET_DMA_ADAPTER)( + IN PVOID Context, + IN struct _DEVICE_DESCRIPTION *DeviceDescriptor, + OUT PULONG NumberOfMapRegisters); + +typedef ULONG +(DDKAPI *PGET_SET_DEVICE_DATA)( + IN PVOID Context, + IN ULONG DataType, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +/* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */ +#define PCI_USE_SUBSYSTEM_IDS 0x00000001 +#define PCI_USE_REVISION 0x00000002 +#define PCI_USE_VENDEV_IDS 0x00000004 +#define PCI_USE_CLASS_SUBCLASS 0x00000008 +#define PCI_USE_PROGIF 0x00000010 +#define PCI_USE_LOCAL_BUS 0x00000020 +#define PCI_USE_LOCAL_DEVICE 0x00000040 + +typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS { + ULONG Size; + ULONG Flags; + USHORT VendorID; + USHORT DeviceID; + UCHAR RevisionID; + USHORT SubVendorID; + USHORT SubSystemID; + UCHAR BaseClass; + UCHAR SubClass; + UCHAR ProgIf; +} PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS; + +typedef BOOLEAN +(DDKAPI *PPCI_IS_DEVICE_PRESENT)( + IN USHORT VendorID, + IN USHORT DeviceID, + IN UCHAR RevisionID, + IN USHORT SubVendorID, + IN USHORT SubSystemID, + IN ULONG Flags); + +typedef BOOLEAN +(DDKAPI *PPCI_IS_DEVICE_PRESENT_EX)( + IN PVOID Context, + IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters); + +typedef struct _BUS_INTERFACE_STANDARD { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PTRANSLATE_BUS_ADDRESS TranslateBusAddress; + PGET_DMA_ADAPTER GetDmaAdapter; + PGET_SET_DEVICE_DATA SetBusData; + PGET_SET_DEVICE_DATA GetBusData; +} BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD; + +typedef struct _PCI_DEVICE_PRESENT_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PPCI_IS_DEVICE_PRESENT IsDevicePresent; + PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx; +} PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE; + +typedef +BOOLEAN +(*PGPE_SERVICE_ROUTINE2)( + PVOID ObjectContext, + PVOID ServiceContext +); + +typedef +NTSTATUS +(*PGPE_CONNECT_VECTOR2)( + PVOID Context, + ULONG GpeNumber, + KINTERRUPT_MODE Mode, + BOOLEAN Shareable, + PGPE_SERVICE_ROUTINE2 ServiceRoutine, + PVOID ServiceContext, + PVOID *ObjectContext +); + +typedef +NTSTATUS +(*PGPE_DISCONNECT_VECTOR2)( + PVOID Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_ENABLE_EVENT2)( + PVOID Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_DISABLE_EVENT2)( + PVOID Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_CLEAR_STATUS2)( + PVOID Context, + PVOID ObjectContext +); + +typedef +VOID +(*PDEVICE_NOTIFY_CALLBACK2)( + PVOID NotificationContext, + ULONG NotifyCode +); + +typedef +NTSTATUS +(*PREGISTER_FOR_DEVICE_NOTIFICATIONS2)( + PVOID Context, + PDEVICE_NOTIFY_CALLBACK2 NotificationHandler, + PVOID NotificationContext +); + +typedef +VOID +(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)( + PVOID Context +); + +typedef struct +{ + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PGPE_CONNECT_VECTOR2 GpeConnectVector; + PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector; + PGPE_ENABLE_EVENT2 GpeEnableEvent; + PGPE_DISABLE_EVENT2 GpeDisableEvent; + PGPE_CLEAR_STATUS2 GpeClearStatus; + PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications; + PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications; +} ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2; + +typedef +BOOLEAN +(*PGPE_SERVICE_ROUTINE)( + PDEVICE_OBJECT ObjectContext, + PVOID ServiceContext +); + +typedef +NTSTATUS +(*PGPE_CONNECT_VECTOR)( + PDEVICE_OBJECT Context, + ULONG GpeNumber, + KINTERRUPT_MODE Mode, + BOOLEAN Shareable, + PGPE_SERVICE_ROUTINE ServiceRoutine, + PVOID ServiceContext, + PVOID *ObjectContext +); + +typedef +NTSTATUS +(*PGPE_DISCONNECT_VECTOR)( + PDEVICE_OBJECT Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_ENABLE_EVENT)( + PDEVICE_OBJECT Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_DISABLE_EVENT)( + PDEVICE_OBJECT Context, + PVOID ObjectContext +); + +typedef +NTSTATUS +(*PGPE_CLEAR_STATUS)( + PDEVICE_OBJECT Context, + PVOID ObjectContext +); + +typedef +VOID +(*PDEVICE_NOTIFY_CALLBACK)( + PVOID NotificationContext, + ULONG NotifyCode +); + +typedef +NTSTATUS +(*PREGISTER_FOR_DEVICE_NOTIFICATIONS)( + PDEVICE_OBJECT Context, + PDEVICE_NOTIFY_CALLBACK NotificationHandler, + PVOID NotificationContext +); + +typedef +VOID +(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)( + PDEVICE_OBJECT Context, + PDEVICE_NOTIFY_CALLBACK NotificationHandler +); + +typedef struct +{ + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PGPE_CONNECT_VECTOR GpeConnectVector; + PGPE_DISCONNECT_VECTOR GpeDisconnectVector; + PGPE_ENABLE_EVENT GpeEnableEvent; + PGPE_DISABLE_EVENT GpeDisableEvent; + PGPE_CLEAR_STATUS GpeClearStatus; + PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications; + PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications; +} ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD; + +typedef struct _DEVICE_CAPABILITIES { + USHORT Size; + USHORT Version; + ULONG DeviceD1 : 1; + ULONG DeviceD2 : 1; + ULONG LockSupported : 1; + ULONG EjectSupported : 1; + ULONG Removable : 1; + ULONG DockDevice : 1; + ULONG UniqueID : 1; + ULONG SilentInstall : 1; + ULONG RawDeviceOK : 1; + ULONG SurpriseRemovalOK : 1; + ULONG WakeFromD0 : 1; + ULONG WakeFromD1 : 1; + ULONG WakeFromD2 : 1; + ULONG WakeFromD3 : 1; + ULONG HardwareDisabled : 1; + ULONG NonDynamic : 1; + ULONG WarmEjectSupported : 1; + ULONG NoDisplayInUI : 1; + ULONG Reserved : 14; + ULONG Address; + ULONG UINumber; + DEVICE_POWER_STATE DeviceState[PowerSystemMaximum]; + SYSTEM_POWER_STATE SystemWake; + DEVICE_POWER_STATE DeviceWake; + ULONG D1Latency; + ULONG D2Latency; + ULONG D3Latency; +} DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES; + +typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION { + USHORT Version; + USHORT Size; + GUID Event; + GUID InterfaceClassGuid; + PUNICODE_STRING SymbolicLinkName; +} DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION; + +typedef struct _HWPROFILE_CHANGE_NOTIFICATION { + USHORT Version; + USHORT Size; + GUID Event; +} HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION; + +#undef INTERFACE + +typedef struct _INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; +} INTERFACE, *PINTERFACE; + +typedef struct _PLUGPLAY_NOTIFICATION_HEADER { + USHORT Version; + USHORT Size; + GUID Event; +} PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER; + +typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE; + +/* PNP_DEVICE_STATE */ + +#define PNP_DEVICE_DISABLED 0x00000001 +#define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002 +#define PNP_DEVICE_FAILED 0x00000004 +#define PNP_DEVICE_REMOVED 0x00000008 +#define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010 +#define PNP_DEVICE_NOT_DISABLEABLE 0x00000020 + +typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION { + USHORT Version; + USHORT Size; + GUID Event; + struct _FILE_OBJECT *FileObject; + LONG NameBufferOffset; + UCHAR CustomDataBuffer[1]; +} TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION; + +typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION { + USHORT Version; + USHORT Size; + GUID Event; + struct _FILE_OBJECT *FileObject; +} TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION; + +typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE { + DeviceUsageTypeUndefined, + DeviceUsageTypePaging, + DeviceUsageTypeHibernation, + DeviceUsageTypeDumpFile +} DEVICE_USAGE_NOTIFICATION_TYPE; + +typedef struct _POWER_SEQUENCE { + ULONG SequenceD1; + ULONG SequenceD2; + ULONG SequenceD3; +} POWER_SEQUENCE, *PPOWER_SEQUENCE; + +typedef enum { + DevicePropertyDeviceDescription = 0x0, + DevicePropertyHardwareID = 0x1, + DevicePropertyCompatibleIDs = 0x2, + DevicePropertyBootConfiguration = 0x3, + DevicePropertyBootConfigurationTranslated = 0x4, + DevicePropertyClassName = 0x5, + DevicePropertyClassGuid = 0x6, + DevicePropertyDriverKeyName = 0x7, + DevicePropertyManufacturer = 0x8, + DevicePropertyFriendlyName = 0x9, + DevicePropertyLocationInformation = 0xa, + DevicePropertyPhysicalDeviceObjectName = 0xb, + DevicePropertyBusTypeGuid = 0xc, + DevicePropertyLegacyBusType = 0xd, + DevicePropertyBusNumber = 0xe, + DevicePropertyEnumeratorName = 0xf, + DevicePropertyAddress = 0x10, + DevicePropertyUINumber = 0x11, + DevicePropertyInstallState = 0x12, + DevicePropertyRemovalPolicy = 0x13, + DevicePropertyResourceRequirements = 0x14, + DevicePropertyAllocatedResources = 0x15, + DevicePropertyContainerID = 0x16 +} DEVICE_REGISTRY_PROPERTY; + +typedef enum _IO_NOTIFICATION_EVENT_CATEGORY { + EventCategoryReserved, + EventCategoryHardwareProfileChange, + EventCategoryDeviceInterfaceChange, + EventCategoryTargetDeviceChange +} IO_NOTIFICATION_EVENT_CATEGORY; + +#define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001 + +typedef NTSTATUS +(DDKAPI *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)( + IN PVOID NotificationStructure, + IN PVOID Context); + +typedef VOID +(DDKAPI *PDEVICE_CHANGE_COMPLETE_CALLBACK)( + IN PVOID Context); + +typedef enum _FILE_INFORMATION_CLASS { + FileDirectoryInformation = 1, + FileFullDirectoryInformation, + FileBothDirectoryInformation, + FileBasicInformation, + FileStandardInformation, + FileInternalInformation, + FileEaInformation, + FileAccessInformation, + FileNameInformation, + FileRenameInformation, + FileLinkInformation, + FileNamesInformation, + FileDispositionInformation, + FilePositionInformation, + FileFullEaInformation, + FileModeInformation, + FileAlignmentInformation, + FileAllInformation, + FileAllocationInformation, + FileEndOfFileInformation, + FileAlternateNameInformation, + FileStreamInformation, + FilePipeInformation, + FilePipeLocalInformation, + FilePipeRemoteInformation, + FileMailslotQueryInformation, + FileMailslotSetInformation, + FileCompressionInformation, + FileObjectIdInformation, + FileCompletionInformation, + FileMoveClusterInformation, + FileQuotaInformation, + FileReparsePointInformation, + FileNetworkOpenInformation, + FileAttributeTagInformation, + FileTrackingInformation, + FileIdBothDirectoryInformation, + FileIdFullDirectoryInformation, + FileValidDataLengthInformation, + FileShortNameInformation, + FileIoCompletionNotificationInformation, + FileIoStatusBlockRangeInformation, + FileIoPriorityHintInformation, + FileSfioReserveInformation, + FileSfioVolumeInformation, + FileHardLinkInformation, + FileProcessIdsUsingFileInformation, + FileNormalizedNameInformation, + FileNetworkPhysicalNameInformation, + FileIdGlobalTxDirectoryInformation, + FileIsRemoteDeviceInformation, + FileAttributeCacheInformation, + FileNumaNodeInformation, + FileStandardLinkInformation, + FileRemoteProtocolInformation, + FileMaximumInformation +} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS; + +typedef struct _FILE_POSITION_INFORMATION { + LARGE_INTEGER CurrentByteOffset; +} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; + +#include +typedef struct _FILE_BASIC_INFORMATION { + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + ULONG FileAttributes; +} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; +#include + +typedef struct _FILE_STANDARD_INFORMATION { + LARGE_INTEGER AllocationSize; + LARGE_INTEGER EndOfFile; + ULONG NumberOfLinks; + BOOLEAN DeletePending; + BOOLEAN Directory; +} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION; + +typedef struct _FILE_NETWORK_OPEN_INFORMATION { + LARGE_INTEGER CreationTime; + LARGE_INTEGER LastAccessTime; + LARGE_INTEGER LastWriteTime; + LARGE_INTEGER ChangeTime; + LARGE_INTEGER AllocationSize; + LARGE_INTEGER EndOfFile; + ULONG FileAttributes; +} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION; + +typedef enum _FSINFOCLASS { + FileFsVolumeInformation = 1, + FileFsLabelInformation, + FileFsSizeInformation, + FileFsDeviceInformation, + FileFsAttributeInformation, + FileFsControlInformation, + FileFsFullSizeInformation, + FileFsObjectIdInformation, + FileFsDriverPathInformation, + FileFsVolumeFlagsInformation, + FileFsMaximumInformation +} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS; + +typedef struct _FILE_FS_DEVICE_INFORMATION { + DEVICE_TYPE DeviceType; + ULONG Characteristics; +} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION; + +typedef struct _FILE_FULL_EA_INFORMATION { + ULONG NextEntryOffset; + UCHAR Flags; + UCHAR EaNameLength; + USHORT EaValueLength; + CHAR EaName[1]; +} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION; + +#define FM_LOCK_BIT (0x1) +#define FM_LOCK_BIT_V (0x0) +#define FM_LOCK_WAITER_WOKEN (0x2) +#define FM_LOCK_WAITER_INC (0x4) + +typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD; + +typedef struct _OWNER_ENTRY { + ERESOURCE_THREAD OwnerThread; + _ANONYMOUS_UNION union { + LONG OwnerCount; + ULONG TableSize; + } DUMMYUNIONNAME; +} OWNER_ENTRY, *POWNER_ENTRY; + +typedef struct _ERESOURCE +{ + LIST_ENTRY SystemResourcesList; + POWNER_ENTRY OwnerTable; + SHORT ActiveCount; + USHORT Flag; + volatile PKSEMAPHORE SharedWaiters; + volatile PKEVENT ExclusiveWaiters; + OWNER_ENTRY OwnerEntry; + ULONG ActiveEntries; + ULONG ContentionCount; + ULONG NumberOfSharedWaiters; + ULONG NumberOfExclusiveWaiters; + __GNU_EXTENSION union + { + PVOID Address; + ULONG_PTR CreatorBackTraceIndex; + }; + KSPIN_LOCK SpinLock; +} ERESOURCE, *PERESOURCE; + +/* ERESOURCE.Flag */ +#define ResourceNeverExclusive 0x0010 +#define ResourceReleaseByOtherThread 0x0020 +#define ResourceOwnedExclusive 0x0080 + +#define RESOURCE_HASH_TABLE_SIZE 64 + +typedef BOOLEAN +(DDKAPI *PFAST_IO_CHECK_IF_POSSIBLE)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN ULONG LockKey, + IN BOOLEAN CheckForReadOperation, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_READ)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN ULONG LockKey, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_WRITE)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN ULONG LockKey, + IN PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_QUERY_BASIC_INFO)( + IN struct _FILE_OBJECT *FileObject, + IN BOOLEAN Wait, + OUT PFILE_BASIC_INFORMATION Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_QUERY_STANDARD_INFO)( + IN struct _FILE_OBJECT *FileObject, + IN BOOLEAN Wait, + OUT PFILE_STANDARD_INFORMATION Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_LOCK)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN PLARGE_INTEGER Length, + PEPROCESS ProcessId, + ULONG Key, + BOOLEAN FailImmediately, + BOOLEAN ExclusiveLock, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_UNLOCK_SINGLE)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN PLARGE_INTEGER Length, + PEPROCESS ProcessId, + ULONG Key, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_UNLOCK_ALL)( + IN struct _FILE_OBJECT *FileObject, + PEPROCESS ProcessId, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_UNLOCK_ALL_BY_KEY)( + IN struct _FILE_OBJECT *FileObject, + PVOID ProcessId, + ULONG Key, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_DEVICE_CONTROL)( + IN struct _FILE_OBJECT *FileObject, + IN BOOLEAN Wait, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength, + IN ULONG IoControlCode, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef VOID +(DDKAPI *PFAST_IO_ACQUIRE_FILE)( + IN struct _FILE_OBJECT *FileObject); + +typedef VOID +(DDKAPI *PFAST_IO_RELEASE_FILE)( + IN struct _FILE_OBJECT *FileObject); + +typedef VOID +(DDKAPI *PFAST_IO_DETACH_DEVICE)( + IN struct _DEVICE_OBJECT *SourceDevice, + IN struct _DEVICE_OBJECT *TargetDevice); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_QUERY_NETWORK_OPEN_INFO)( + IN struct _FILE_OBJECT *FileObject, + IN BOOLEAN Wait, + OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer, + OUT struct _IO_STATUS_BLOCK *IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef NTSTATUS +(DDKAPI *PFAST_IO_ACQUIRE_FOR_MOD_WRITE)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER EndingOffset, + OUT struct _ERESOURCE **ResourceToRelease, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_MDL_READ)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG LockKey, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_MDL_READ_COMPLETE)( + IN struct _FILE_OBJECT *FileObject, + IN PMDL MdlChain, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_PREPARE_MDL_WRITE)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG LockKey, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN PMDL MdlChain, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_READ_COMPRESSED)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG LockKey, + OUT PVOID Buffer, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus, + OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo, + IN ULONG CompressedDataInfoLength, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_WRITE_COMPRESSED)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG LockKey, + IN PVOID Buffer, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus, + IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo, + IN ULONG CompressedDataInfoLength, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)( + IN struct _FILE_OBJECT *FileObject, + IN PMDL MdlChain, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)( + IN struct _FILE_OBJECT *FileObject, + IN PLARGE_INTEGER FileOffset, + IN PMDL MdlChain, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef BOOLEAN +(DDKAPI *PFAST_IO_QUERY_OPEN)( + IN struct _IRP *Irp, + OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef NTSTATUS +(DDKAPI *PFAST_IO_RELEASE_FOR_MOD_WRITE)( + IN struct _FILE_OBJECT *FileObject, + IN struct _ERESOURCE *ResourceToRelease, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef NTSTATUS +(DDKAPI *PFAST_IO_ACQUIRE_FOR_CCFLUSH)( + IN struct _FILE_OBJECT *FileObject, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef NTSTATUS +(DDKAPI *PFAST_IO_RELEASE_FOR_CCFLUSH) ( + IN struct _FILE_OBJECT *FileObject, + IN struct _DEVICE_OBJECT *DeviceObject); + +typedef struct _FAST_IO_DISPATCH { + ULONG SizeOfFastIoDispatch; + PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible; + PFAST_IO_READ FastIoRead; + PFAST_IO_WRITE FastIoWrite; + PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo; + PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo; + PFAST_IO_LOCK FastIoLock; + PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle; + PFAST_IO_UNLOCK_ALL FastIoUnlockAll; + PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey; + PFAST_IO_DEVICE_CONTROL FastIoDeviceControl; + PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection; + PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection; + PFAST_IO_DETACH_DEVICE FastIoDetachDevice; + PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo; + PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite; + PFAST_IO_MDL_READ MdlRead; + PFAST_IO_MDL_READ_COMPLETE MdlReadComplete; + PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite; + PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete; + PFAST_IO_READ_COMPRESSED FastIoReadCompressed; + PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed; + PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed; + PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed; + PFAST_IO_QUERY_OPEN FastIoQueryOpen; + PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite; + PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush; + PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush; +} FAST_IO_DISPATCH, *PFAST_IO_DISPATCH; + +typedef struct _SECTION_OBJECT_POINTERS { + PVOID DataSectionObject; + PVOID SharedCacheMap; + PVOID ImageSectionObject; +} SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS; + +typedef struct _IO_COMPLETION_CONTEXT { + PVOID Port; + PVOID Key; +} IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT; + +/* FILE_OBJECT.Flags */ +#define FO_FILE_OPEN 0x00000001 +#define FO_SYNCHRONOUS_IO 0x00000002 +#define FO_ALERTABLE_IO 0x00000004 +#define FO_NO_INTERMEDIATE_BUFFERING 0x00000008 +#define FO_WRITE_THROUGH 0x00000010 +#define FO_SEQUENTIAL_ONLY 0x00000020 +#define FO_CACHE_SUPPORTED 0x00000040 +#define FO_NAMED_PIPE 0x00000080 +#define FO_STREAM_FILE 0x00000100 +#define FO_MAILSLOT 0x00000200 +#define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400 +#define FO_QUEUE_IRP_TO_THREAD 0x00000400 +#define FO_DIRECT_DEVICE_OPEN 0x00000800 +#define FO_FILE_MODIFIED 0x00001000 +#define FO_FILE_SIZE_CHANGED 0x00002000 +#define FO_CLEANUP_COMPLETE 0x00004000 +#define FO_TEMPORARY_FILE 0x00008000 +#define FO_DELETE_ON_CLOSE 0x00010000 +#define FO_OPENED_CASE_SENSITIVE 0x00020000 +#define FO_HANDLE_CREATED 0x00040000 +#define FO_FILE_FAST_IO_READ 0x00080000 +#define FO_RANDOM_ACCESS 0x00100000 +#define FO_FILE_OPEN_CANCELLED 0x00200000 +#define FO_VOLUME_OPEN 0x00400000 +#define FO_REMOTE_ORIGIN 0x01000000 +#define FO_DISALLOW_EXCLUSIVE 0x02000000 +#define FO_SKIP_COMPLETION_PORT 0x02000000 +#define FO_SKIP_SET_EVENT 0x04000000 +#define FO_SKIP_SET_FAST_IO 0x08000000 + +/* VPB.Flags */ +#define VPB_MOUNTED 0x0001 +#define VPB_LOCKED 0x0002 +#define VPB_PERSISTENT 0x0004 +#define VPB_REMOVE_PENDING 0x0008 +#define VPB_RAW_MOUNT 0x0010 +#define VPB_DIRECT_WRITES_ALLOWED 0x0020 + +/* IRP.Flags */ + +#define SL_FORCE_ACCESS_CHECK 0x01 +#define SL_OPEN_PAGING_FILE 0x02 +#define SL_OPEN_TARGET_DIRECTORY 0x04 +#define SL_CASE_SENSITIVE 0x80 + +#define SL_KEY_SPECIFIED 0x01 +#define SL_OVERRIDE_VERIFY_VOLUME 0x02 +#define SL_WRITE_THROUGH 0x04 +#define SL_FT_SEQUENTIAL_WRITE 0x08 + +#define SL_FAIL_IMMEDIATELY 0x01 +#define SL_EXCLUSIVE_LOCK 0x02 + +#define SL_RESTART_SCAN 0x01 +#define SL_RETURN_SINGLE_ENTRY 0x02 +#define SL_INDEX_SPECIFIED 0x04 + +#define SL_WATCH_TREE 0x01 + +#define SL_ALLOW_RAW_MOUNT 0x01 + +#define CTL_CODE(DeviceType, Function, Method, Access) \ + (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) + +#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16) + +#define IRP_NOCACHE 0x00000001 +#define IRP_PAGING_IO 0x00000002 +#define IRP_MOUNT_COMPLETION 0x00000002 +#define IRP_SYNCHRONOUS_API 0x00000004 +#define IRP_ASSOCIATED_IRP 0x00000008 +#define IRP_BUFFERED_IO 0x00000010 +#define IRP_DEALLOCATE_BUFFER 0x00000020 +#define IRP_INPUT_OPERATION 0x00000040 +#define IRP_SYNCHRONOUS_PAGING_IO 0x00000040 +#define IRP_CREATE_OPERATION 0x00000080 +#define IRP_READ_OPERATION 0x00000100 +#define IRP_WRITE_OPERATION 0x00000200 +#define IRP_CLOSE_OPERATION 0x00000400 +#define IRP_DEFER_IO_COMPLETION 0x00000800 +#define IRP_OB_QUERY_NAME 0x00001000 +#define IRP_HOLD_DEVICE_QUEUE 0x00002000 + +#define IRP_QUOTA_CHARGED 0x01 +#define IRP_ALLOCATED_MUST_SUCCEED 0x02 +#define IRP_ALLOCATED_FIXED_SIZE 0x04 +#define IRP_LOOKASIDE_ALLOCATION 0x08 + +/* +** IRP function codes +*/ + +#define IRP_MJ_CREATE 0x00 +#define IRP_MJ_CREATE_NAMED_PIPE 0x01 +#define IRP_MJ_CLOSE 0x02 +#define IRP_MJ_READ 0x03 +#define IRP_MJ_WRITE 0x04 +#define IRP_MJ_QUERY_INFORMATION 0x05 +#define IRP_MJ_SET_INFORMATION 0x06 +#define IRP_MJ_QUERY_EA 0x07 +#define IRP_MJ_SET_EA 0x08 +#define IRP_MJ_FLUSH_BUFFERS 0x09 +#define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a +#define IRP_MJ_SET_VOLUME_INFORMATION 0x0b +#define IRP_MJ_DIRECTORY_CONTROL 0x0c +#define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d +#define IRP_MJ_DEVICE_CONTROL 0x0e +#define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f +#define IRP_MJ_SCSI 0x0f +#define IRP_MJ_SHUTDOWN 0x10 +#define IRP_MJ_LOCK_CONTROL 0x11 +#define IRP_MJ_CLEANUP 0x12 +#define IRP_MJ_CREATE_MAILSLOT 0x13 +#define IRP_MJ_QUERY_SECURITY 0x14 +#define IRP_MJ_SET_SECURITY 0x15 +#define IRP_MJ_POWER 0x16 +#define IRP_MJ_SYSTEM_CONTROL 0x17 +#define IRP_MJ_DEVICE_CHANGE 0x18 +#define IRP_MJ_QUERY_QUOTA 0x19 +#define IRP_MJ_SET_QUOTA 0x1a +#define IRP_MJ_PNP 0x1b +#define IRP_MJ_PNP_POWER 0x1b +#define IRP_MJ_MAXIMUM_FUNCTION 0x1b + +#define IRP_MN_SCSI_CLASS 0x01 + +#define IRP_MN_START_DEVICE 0x00 +#define IRP_MN_QUERY_REMOVE_DEVICE 0x01 +#define IRP_MN_REMOVE_DEVICE 0x02 +#define IRP_MN_CANCEL_REMOVE_DEVICE 0x03 +#define IRP_MN_STOP_DEVICE 0x04 +#define IRP_MN_QUERY_STOP_DEVICE 0x05 +#define IRP_MN_CANCEL_STOP_DEVICE 0x06 + +#define IRP_MN_QUERY_DEVICE_RELATIONS 0x07 +#define IRP_MN_QUERY_INTERFACE 0x08 +#define IRP_MN_QUERY_CAPABILITIES 0x09 +#define IRP_MN_QUERY_RESOURCES 0x0A +#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B +#define IRP_MN_QUERY_DEVICE_TEXT 0x0C +#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D + +#define IRP_MN_READ_CONFIG 0x0F +#define IRP_MN_WRITE_CONFIG 0x10 +#define IRP_MN_EJECT 0x11 +#define IRP_MN_SET_LOCK 0x12 +#define IRP_MN_QUERY_ID 0x13 +#define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14 +#define IRP_MN_QUERY_BUS_INFORMATION 0x15 +#define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16 +#define IRP_MN_SURPRISE_REMOVAL 0x17 + +#define IRP_MN_WAIT_WAKE 0x00 +#define IRP_MN_POWER_SEQUENCE 0x01 +#define IRP_MN_SET_POWER 0x02 +#define IRP_MN_QUERY_POWER 0x03 + +#define IRP_MN_QUERY_ALL_DATA 0x00 +#define IRP_MN_QUERY_SINGLE_INSTANCE 0x01 +#define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02 +#define IRP_MN_CHANGE_SINGLE_ITEM 0x03 +#define IRP_MN_ENABLE_EVENTS 0x04 +#define IRP_MN_DISABLE_EVENTS 0x05 +#define IRP_MN_ENABLE_COLLECTION 0x06 +#define IRP_MN_DISABLE_COLLECTION 0x07 +#define IRP_MN_REGINFO 0x08 +#define IRP_MN_EXECUTE_METHOD 0x09 + +#define IRP_MN_REGINFO_EX 0x0b + +typedef struct _FILE_OBJECT +{ + CSHORT Type; + CSHORT Size; + PDEVICE_OBJECT DeviceObject; + PVPB Vpb; + PVOID FsContext; + PVOID FsContext2; + PSECTION_OBJECT_POINTERS SectionObjectPointer; + PVOID PrivateCacheMap; + NTSTATUS FinalStatus; + struct _FILE_OBJECT *RelatedFileObject; + BOOLEAN LockOperation; + BOOLEAN DeletePending; + BOOLEAN ReadAccess; + BOOLEAN WriteAccess; + BOOLEAN DeleteAccess; + BOOLEAN SharedRead; + BOOLEAN SharedWrite; + BOOLEAN SharedDelete; + ULONG Flags; + UNICODE_STRING FileName; + LARGE_INTEGER CurrentByteOffset; + volatile ULONG Waiters; + volatile ULONG Busy; + PVOID LastLock; + KEVENT Lock; + KEVENT Event; + volatile PIO_COMPLETION_CONTEXT CompletionContext; + KSPIN_LOCK IrpListLock; + LIST_ENTRY IrpList; + volatile PVOID FileObjectExtension; +} FILE_OBJECT, *PFILE_OBJECT; + +typedef struct _IO_ERROR_LOG_PACKET { + UCHAR MajorFunctionCode; + UCHAR RetryCount; + USHORT DumpDataSize; + USHORT NumberOfStrings; + USHORT StringOffset; + USHORT EventCategory; + NTSTATUS ErrorCode; + ULONG UniqueErrorValue; + NTSTATUS FinalStatus; + ULONG SequenceNumber; + ULONG IoControlCode; + LARGE_INTEGER DeviceOffset; + ULONG DumpData[1]; +} IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET; + +typedef struct _IO_ERROR_LOG_MESSAGE { + USHORT Type; + USHORT Size; + USHORT DriverNameLength; + LARGE_INTEGER TimeStamp; + ULONG DriverNameOffset; + IO_ERROR_LOG_PACKET EntryData; +} IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE; + +#define ERROR_LOG_LIMIT_SIZE 240 +#define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \ + sizeof(IO_ERROR_LOG_PACKET) + \ + (sizeof(WCHAR) * 40)) +#define ERROR_LOG_MESSAGE_LIMIT_SIZE \ + (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH) +#define IO_ERROR_LOG_MESSAGE_LENGTH \ + ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \ + ERROR_LOG_MESSAGE_LIMIT_SIZE : \ + PORT_MAXIMUM_MESSAGE_LENGTH) +#define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \ + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH) + +typedef enum _DMA_WIDTH { + Width8Bits, + Width16Bits, + Width32Bits, + MaximumDmaWidth +} DMA_WIDTH, *PDMA_WIDTH; + +typedef enum _DMA_SPEED { + Compatible, + TypeA, + TypeB, + TypeC, + TypeF, + MaximumDmaSpeed +} DMA_SPEED, *PDMA_SPEED; + +/* DEVICE_DESCRIPTION.Version */ + +#define DEVICE_DESCRIPTION_VERSION 0x0000 +#define DEVICE_DESCRIPTION_VERSION1 0x0001 +#define DEVICE_DESCRIPTION_VERSION2 0x0002 + +typedef struct _DEVICE_DESCRIPTION { + ULONG Version; + BOOLEAN Master; + BOOLEAN ScatterGather; + BOOLEAN DemandMode; + BOOLEAN AutoInitialize; + BOOLEAN Dma32BitAddresses; + BOOLEAN IgnoreCount; + BOOLEAN Reserved1; + BOOLEAN Dma64BitAddresses; + ULONG BusNumber; + ULONG DmaChannel; + INTERFACE_TYPE InterfaceType; + DMA_WIDTH DmaWidth; + DMA_SPEED DmaSpeed; + ULONG MaximumLength; + ULONG DmaPort; +} DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION; + +typedef enum _DEVICE_RELATION_TYPE { + BusRelations, + EjectionRelations, + PowerRelations, + RemovalRelations, + TargetDeviceRelation, + SingleBusRelations, + TransportRelations +} DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE; + +typedef struct _DEVICE_RELATIONS { + ULONG Count; + PDEVICE_OBJECT Objects[1]; +} DEVICE_RELATIONS, *PDEVICE_RELATIONS; + +typedef struct _DEVOBJ_EXTENSION +{ + CSHORT Type; + USHORT Size; + PDEVICE_OBJECT DeviceObject; +} DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION; + +typedef struct _SCATTER_GATHER_ELEMENT { + PHYSICAL_ADDRESS Address; + ULONG Length; + ULONG_PTR Reserved; +} SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT; + +#if defined(_MSC_EXTENSIONS) + +#if _MSC_VER >= 1200 +#pragma warning(push) +#endif +#pragma warning(disable:4200) +typedef struct _SCATTER_GATHER_LIST { + ULONG NumberOfElements; + ULONG_PTR Reserved; + SCATTER_GATHER_ELEMENT Elements[1]; +} SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST; + +#if _MSC_VER >= 1200 +#pragma warning(pop) +#else +#pragma warning(default:4200) +#endif + +#else + +struct _SCATTER_GATHER_LIST; +typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST; + +#endif + +typedef NTSTATUS +(DDKAPI DRIVER_ADD_DEVICE)( + IN struct _DRIVER_OBJECT *DriverObject, + IN struct _DEVICE_OBJECT *PhysicalDeviceObject); +typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE; + +typedef struct _DRIVER_EXTENSION { + struct _DRIVER_OBJECT *DriverObject; + PDRIVER_ADD_DEVICE AddDevice; + ULONG Count; + UNICODE_STRING ServiceKeyName; +} DRIVER_EXTENSION, *PDRIVER_EXTENSION; + +#define DRVO_UNLOAD_INVOKED 0x00000001 +#define DRVO_LEGACY_DRIVER 0x00000002 +#define DRVO_BUILTIN_DRIVER 0x00000004 + +typedef NTSTATUS +(DDKAPI DRIVER_INITIALIZE)( + IN struct _DRIVER_OBJECT *DriverObject, + IN PUNICODE_STRING RegistryPath); +typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE; + +typedef VOID +(DDKAPI DRIVER_STARTIO)( + IN struct _DEVICE_OBJECT *DeviceObject, + IN struct _IRP *Irp); +typedef DRIVER_STARTIO *PDRIVER_STARTIO; + +typedef VOID +(DDKAPI DRIVER_UNLOAD)( + IN struct _DRIVER_OBJECT *DriverObject); +typedef DRIVER_UNLOAD *PDRIVER_UNLOAD; + +typedef NTSTATUS +(DDKAPI DRIVER_DISPATCH)( + IN struct _DEVICE_OBJECT *DeviceObject, + IN struct _IRP *Irp); +typedef DRIVER_DISPATCH *PDRIVER_DISPATCH; + +typedef struct _DRIVER_OBJECT { + CSHORT Type; + CSHORT Size; + PDEVICE_OBJECT DeviceObject; + ULONG Flags; + PVOID DriverStart; + ULONG DriverSize; + PVOID DriverSection; + PDRIVER_EXTENSION DriverExtension; + UNICODE_STRING DriverName; + PUNICODE_STRING HardwareDatabase; + struct _FAST_IO_DISPATCH *FastIoDispatch; + PDRIVER_INITIALIZE DriverInit; + PDRIVER_STARTIO DriverStartIo; + PDRIVER_UNLOAD DriverUnload; + PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]; +} DRIVER_OBJECT; +typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT; + +typedef struct _DMA_ADAPTER { + USHORT Version; + USHORT Size; + struct _DMA_OPERATIONS* DmaOperations; +} DMA_ADAPTER, *PDMA_ADAPTER; + +typedef VOID +(DDKAPI *PPUT_DMA_ADAPTER)( + IN PDMA_ADAPTER DmaAdapter); + +typedef PVOID +(DDKAPI *PALLOCATE_COMMON_BUFFER)( + IN PDMA_ADAPTER DmaAdapter, + IN ULONG Length, + OUT PPHYSICAL_ADDRESS LogicalAddress, + IN BOOLEAN CacheEnabled); + +typedef VOID +(DDKAPI *PFREE_COMMON_BUFFER)( + IN PDMA_ADAPTER DmaAdapter, + IN ULONG Length, + IN PHYSICAL_ADDRESS LogicalAddress, + IN PVOID VirtualAddress, + IN BOOLEAN CacheEnabled); + +typedef NTSTATUS +(DDKAPI *PALLOCATE_ADAPTER_CHANNEL)( + IN PDMA_ADAPTER DmaAdapter, + IN PDEVICE_OBJECT DeviceObject, + IN ULONG NumberOfMapRegisters, + IN PDRIVER_CONTROL ExecutionRoutine, + IN PVOID Context); + +typedef BOOLEAN +(DDKAPI *PFLUSH_ADAPTER_BUFFERS)( + IN PDMA_ADAPTER DmaAdapter, + IN PMDL Mdl, + IN PVOID MapRegisterBase, + IN PVOID CurrentVa, + IN ULONG Length, + IN BOOLEAN WriteToDevice); + +typedef VOID +(DDKAPI *PFREE_ADAPTER_CHANNEL)( + IN PDMA_ADAPTER DmaAdapter); + +typedef VOID +(DDKAPI *PFREE_MAP_REGISTERS)( + IN PDMA_ADAPTER DmaAdapter, + PVOID MapRegisterBase, + ULONG NumberOfMapRegisters); + +typedef PHYSICAL_ADDRESS +(DDKAPI *PMAP_TRANSFER)( + IN PDMA_ADAPTER DmaAdapter, + IN PMDL Mdl, + IN PVOID MapRegisterBase, + IN PVOID CurrentVa, + IN OUT PULONG Length, + IN BOOLEAN WriteToDevice); + +typedef ULONG +(DDKAPI *PGET_DMA_ALIGNMENT)( + IN PDMA_ADAPTER DmaAdapter); + +typedef ULONG +(DDKAPI *PREAD_DMA_COUNTER)( + IN PDMA_ADAPTER DmaAdapter); + +typedef VOID +(DDKAPI *PDRIVER_LIST_CONTROL)( + IN struct _DEVICE_OBJECT *DeviceObject, + IN struct _IRP *Irp, + IN struct _SCATTER_GATHER_LIST *ScatterGather, + IN PVOID Context); + +typedef NTSTATUS +(DDKAPI *PGET_SCATTER_GATHER_LIST)( + IN PDMA_ADAPTER DmaAdapter, + IN PDEVICE_OBJECT DeviceObject, + IN PMDL Mdl, + IN PVOID CurrentVa, + IN ULONG Length, + IN PDRIVER_LIST_CONTROL ExecutionRoutine, + IN PVOID Context, + IN BOOLEAN WriteToDevice); + +typedef VOID +(DDKAPI *PPUT_SCATTER_GATHER_LIST)( + IN PDMA_ADAPTER DmaAdapter, + IN PSCATTER_GATHER_LIST ScatterGather, + IN BOOLEAN WriteToDevice); + +typedef NTSTATUS +(DDKAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)( + IN PDMA_ADAPTER DmaAdapter, + IN PMDL Mdl OPTIONAL, + IN PVOID CurrentVa, + IN ULONG Length, + OUT PULONG ScatterGatherListSize, + OUT PULONG pNumberOfMapRegisters OPTIONAL); + +typedef NTSTATUS +(DDKAPI *PBUILD_SCATTER_GATHER_LIST)( + IN PDMA_ADAPTER DmaAdapter, + IN PDEVICE_OBJECT DeviceObject, + IN PMDL Mdl, + IN PVOID CurrentVa, + IN ULONG Length, + IN PDRIVER_LIST_CONTROL ExecutionRoutine, + IN PVOID Context, + IN BOOLEAN WriteToDevice, + IN PVOID ScatterGatherBuffer, + IN ULONG ScatterGatherLength); + +typedef NTSTATUS +(DDKAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)( + IN PDMA_ADAPTER DmaAdapter, + IN PSCATTER_GATHER_LIST ScatterGather, + IN PMDL OriginalMdl, + OUT PMDL *TargetMdl); + +typedef struct _DMA_OPERATIONS { + ULONG Size; + PPUT_DMA_ADAPTER PutDmaAdapter; + PALLOCATE_COMMON_BUFFER AllocateCommonBuffer; + PFREE_COMMON_BUFFER FreeCommonBuffer; + PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel; + PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers; + PFREE_ADAPTER_CHANNEL FreeAdapterChannel; + PFREE_MAP_REGISTERS FreeMapRegisters; + PMAP_TRANSFER MapTransfer; + PGET_DMA_ALIGNMENT GetDmaAlignment; + PREAD_DMA_COUNTER ReadDmaCounter; + PGET_SCATTER_GATHER_LIST GetScatterGatherList; + PPUT_SCATTER_GATHER_LIST PutScatterGatherList; + PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList; + PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList; + PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList; +} DMA_OPERATIONS, *PDMA_OPERATIONS; + +typedef struct _IO_RESOURCE_DESCRIPTOR { + UCHAR Option; + UCHAR Type; + UCHAR ShareDisposition; + UCHAR Spare1; + USHORT Flags; + USHORT Spare2; + union { + struct { + ULONG Length; + ULONG Alignment; + PHYSICAL_ADDRESS MinimumAddress; + PHYSICAL_ADDRESS MaximumAddress; + } Port; + struct { + ULONG Length; + ULONG Alignment; + PHYSICAL_ADDRESS MinimumAddress; + PHYSICAL_ADDRESS MaximumAddress; + } Memory; + struct { + ULONG MinimumVector; + ULONG MaximumVector; + } Interrupt; + struct { + ULONG MinimumChannel; + ULONG MaximumChannel; + } Dma; + struct { + ULONG Length; + ULONG Alignment; + PHYSICAL_ADDRESS MinimumAddress; + PHYSICAL_ADDRESS MaximumAddress; + } Generic; + struct { + ULONG Data[3]; + } DevicePrivate; + struct { + ULONG Length; + ULONG MinBusNumber; + ULONG MaxBusNumber; + ULONG Reserved; + } BusNumber; + struct { + ULONG Priority; + ULONG Reserved1; + ULONG Reserved2; + } ConfigData; + } u; +} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR; + +typedef struct _IO_RESOURCE_LIST { + USHORT Version; + USHORT Revision; + ULONG Count; + IO_RESOURCE_DESCRIPTOR Descriptors[1]; +} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST; + +typedef struct _IO_RESOURCE_REQUIREMENTS_LIST { + ULONG ListSize; + INTERFACE_TYPE InterfaceType; + ULONG BusNumber; + ULONG SlotNumber; + ULONG Reserved[3]; + ULONG AlternativeLists; + IO_RESOURCE_LIST List[1]; +} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST; + +typedef VOID +(DDKAPI DRIVER_CANCEL)( + IN struct _DEVICE_OBJECT *DeviceObject, + IN struct _IRP *Irp); +typedef DRIVER_CANCEL *PDRIVER_CANCEL; + +typedef struct _IRP { + CSHORT Type; + USHORT Size; + struct _MDL *MdlAddress; + ULONG Flags; + union { + struct _IRP *MasterIrp; + volatile LONG IrpCount; + PVOID SystemBuffer; + } AssociatedIrp; + LIST_ENTRY ThreadListEntry; + IO_STATUS_BLOCK IoStatus; + KPROCESSOR_MODE RequestorMode; + BOOLEAN PendingReturned; + CHAR StackCount; + CHAR CurrentLocation; + BOOLEAN Cancel; + KIRQL CancelIrql; + CCHAR ApcEnvironment; + UCHAR AllocationFlags; + PIO_STATUS_BLOCK UserIosb; + PKEVENT UserEvent; + union { + struct { + _ANONYMOUS_UNION union { + PIO_APC_ROUTINE UserApcRoutine; + PVOID IssuingProcess; + } DUMMYUNIONNAME; + PVOID UserApcContext; + } AsynchronousParameters; + LARGE_INTEGER AllocationSize; + } Overlay; + volatile PDRIVER_CANCEL CancelRoutine; + PVOID UserBuffer; + union { + struct { + _ANONYMOUS_UNION union { + KDEVICE_QUEUE_ENTRY DeviceQueueEntry; + _ANONYMOUS_STRUCT struct { + PVOID DriverContext[4]; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + PETHREAD Thread; + PCHAR AuxiliaryBuffer; + _ANONYMOUS_STRUCT struct { + LIST_ENTRY ListEntry; + _ANONYMOUS_UNION union { + struct _IO_STACK_LOCATION *CurrentStackLocation; + ULONG PacketType; + } DUMMYUNIONNAME; + } DUMMYSTRUCTNAME; + struct _FILE_OBJECT *OriginalFileObject; + } Overlay; + KAPC Apc; + PVOID CompletionKey; + } Tail; +} IRP; +typedef struct _IRP *PIRP; + +typedef enum _IO_PAGING_PRIORITY { + IoPagingPriorityInvalid, + IoPagingPriorityNormal, + IoPagingPriorityHigh, + IoPagingPriorityReserved1, + IoPagingPriorityReserved2 +} IO_PAGING_PRIORITY; + +typedef NTSTATUS +(DDKAPI IO_COMPLETION_ROUTINE)( + IN struct _DEVICE_OBJECT *DeviceObject, + IN struct _IRP *Irp, + IN PVOID Context); +typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE; + +typedef VOID +(DDKAPI *PIO_DPC_ROUTINE)( + IN struct _KDPC *Dpc, + IN struct _DEVICE_OBJECT *DeviceObject, + IN struct _IRP *Irp, + IN PVOID Context); + +typedef NTSTATUS +(DDKAPI *PMM_DLL_INITIALIZE)( + IN PUNICODE_STRING RegistryPath); + +typedef NTSTATUS +(DDKAPI *PMM_DLL_UNLOAD)( + VOID); + +typedef BOOLEAN +(DDKAPI KSERVICE_ROUTINE)( + IN struct _KINTERRUPT *Interrupt, + IN PVOID ServiceContext); +typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE; + +typedef VOID +(DDKAPI *PIO_TIMER_ROUTINE)( + IN struct _DEVICE_OBJECT *DeviceObject, + IN PVOID Context); + +typedef struct _IO_SECURITY_CONTEXT { + PSECURITY_QUALITY_OF_SERVICE SecurityQos; + PACCESS_STATE AccessState; + ACCESS_MASK DesiredAccess; + ULONG FullCreateOptions; +} IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT; + +struct _IO_CSQ; + +typedef struct _IO_CSQ_IRP_CONTEXT { + ULONG Type; + struct _IRP *Irp; + struct _IO_CSQ *Csq; +} IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT; + +typedef VOID +(DDKAPI *PIO_CSQ_INSERT_IRP)( + IN struct _IO_CSQ *Csq, + IN PIRP Irp); + +typedef VOID +(DDKAPI *PIO_CSQ_REMOVE_IRP)( + IN struct _IO_CSQ *Csq, + IN PIRP Irp); + +typedef PIRP +(DDKAPI *PIO_CSQ_PEEK_NEXT_IRP)( + IN struct _IO_CSQ *Csq, + IN PIRP Irp, + IN PVOID PeekContext); + +typedef VOID +(DDKAPI *PIO_CSQ_ACQUIRE_LOCK)( + IN struct _IO_CSQ *Csq, + OUT PKIRQL Irql); + +typedef VOID +(DDKAPI *PIO_CSQ_RELEASE_LOCK)( + IN struct _IO_CSQ *Csq, + IN KIRQL Irql); + +typedef VOID +(DDKAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)( + IN struct _IO_CSQ *Csq, + IN PIRP Irp); + +typedef struct _IO_CSQ { + ULONG Type; + PIO_CSQ_INSERT_IRP CsqInsertIrp; + PIO_CSQ_REMOVE_IRP CsqRemoveIrp; + PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp; + PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock; + PIO_CSQ_RELEASE_LOCK CsqReleaseLock; + PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp; + PVOID ReservePointer; +} IO_CSQ, *PIO_CSQ; + +typedef enum _BUS_QUERY_ID_TYPE { + BusQueryDeviceID, + BusQueryHardwareIDs, + BusQueryCompatibleIDs, + BusQueryInstanceID, + BusQueryDeviceSerialNumber +} BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE; + +typedef enum _DEVICE_TEXT_TYPE { + DeviceTextDescription, + DeviceTextLocationInformation +} DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE; + +typedef enum _WORK_QUEUE_TYPE { + CriticalWorkQueue, + DelayedWorkQueue, + HyperCriticalWorkQueue, + MaximumWorkQueue +} WORK_QUEUE_TYPE; + +#if !defined(_AMD64_) && !defined(_IA64_) +#include +#endif +typedef struct _IO_STACK_LOCATION { + UCHAR MajorFunction; + UCHAR MinorFunction; + UCHAR Flags; + UCHAR Control; + union { + struct { + PIO_SECURITY_CONTEXT SecurityContext; + ULONG Options; + USHORT POINTER_ALIGNMENT FileAttributes; + USHORT ShareAccess; + ULONG POINTER_ALIGNMENT EaLength; + } Create; + struct { + ULONG Length; + ULONG POINTER_ALIGNMENT Key; + LARGE_INTEGER ByteOffset; + } Read; + struct { + ULONG Length; + ULONG POINTER_ALIGNMENT Key; + LARGE_INTEGER ByteOffset; + } Write; + struct { + ULONG Length; + PUNICODE_STRING FileName; + FILE_INFORMATION_CLASS FileInformationClass; + ULONG FileIndex; + } QueryDirectory; + struct { + ULONG Length; + ULONG CompletionFilter; + } NotifyDirectory; + struct { + ULONG Length; + FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass; + } QueryFile; + struct { + ULONG Length; + FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass; + PFILE_OBJECT FileObject; + _ANONYMOUS_UNION union { + _ANONYMOUS_STRUCT struct { + BOOLEAN ReplaceIfExists; + BOOLEAN AdvanceOnly; + } DUMMYSTRUCTNAME; + ULONG ClusterCount; + HANDLE DeleteHandle; + } DUMMYUNIONNAME; + } SetFile; + struct { + ULONG Length; + PVOID EaList; + ULONG EaListLength; + ULONG EaIndex; + } QueryEa; + struct { + ULONG Length; + } SetEa; + struct { + ULONG Length; + FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass; + } QueryVolume; + struct { + ULONG Length; + FS_INFORMATION_CLASS FsInformationClass; + } SetVolume; + struct { + ULONG OutputBufferLength; + ULONG InputBufferLength; + ULONG FsControlCode; + PVOID Type3InputBuffer; + } FileSystemControl; + struct { + PLARGE_INTEGER Length; + ULONG Key; + LARGE_INTEGER ByteOffset; + } LockControl; + struct { + ULONG OutputBufferLength; + ULONG POINTER_ALIGNMENT InputBufferLength; + ULONG POINTER_ALIGNMENT IoControlCode; + PVOID Type3InputBuffer; + } DeviceIoControl; + struct { + SECURITY_INFORMATION SecurityInformation; + ULONG POINTER_ALIGNMENT Length; + } QuerySecurity; + struct { + SECURITY_INFORMATION SecurityInformation; + PSECURITY_DESCRIPTOR SecurityDescriptor; + } SetSecurity; + struct { + PVPB Vpb; + PDEVICE_OBJECT DeviceObject; + } MountVolume; + struct { + PVPB Vpb; + PDEVICE_OBJECT DeviceObject; + } VerifyVolume; + struct { + struct _SCSI_REQUEST_BLOCK *Srb; + } Scsi; + struct { + ULONG Length; + PSID StartSid; + struct _FILE_GET_QUOTA_INFORMATION *SidList; + ULONG SidListLength; + } QueryQuota; + struct { + ULONG Length; + } SetQuota; + struct { + DEVICE_RELATION_TYPE Type; + } QueryDeviceRelations; + struct { + CONST GUID *InterfaceType; + USHORT Size; + USHORT Version; + PINTERFACE Interface; + PVOID InterfaceSpecificData; + } QueryInterface; + struct { + PDEVICE_CAPABILITIES Capabilities; + } DeviceCapabilities; + struct { + PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList; + } FilterResourceRequirements; + struct { + ULONG WhichSpace; + PVOID Buffer; + ULONG Offset; + ULONG POINTER_ALIGNMENT Length; + } ReadWriteConfig; + struct { + BOOLEAN Lock; + } SetLock; + struct { + BUS_QUERY_ID_TYPE IdType; + } QueryId; + struct { + DEVICE_TEXT_TYPE DeviceTextType; + LCID POINTER_ALIGNMENT LocaleId; + } QueryDeviceText; + struct { + BOOLEAN InPath; + BOOLEAN Reserved[3]; + DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type; + } UsageNotification; + struct { + SYSTEM_POWER_STATE PowerState; + } WaitWake; + struct { + PPOWER_SEQUENCE PowerSequence; + } PowerSequence; + struct { + ULONG SystemContext; + POWER_STATE_TYPE POINTER_ALIGNMENT Type; + POWER_STATE POINTER_ALIGNMENT State; + POWER_ACTION POINTER_ALIGNMENT ShutdownType; + } Power; + struct { + PCM_RESOURCE_LIST AllocatedResources; + PCM_RESOURCE_LIST AllocatedResourcesTranslated; + } StartDevice; + struct { + ULONG_PTR ProviderId; + PVOID DataPath; + ULONG BufferSize; + PVOID Buffer; + } WMI; + struct { + PVOID Argument1; + PVOID Argument2; + PVOID Argument3; + PVOID Argument4; + } Others; + } Parameters; + PDEVICE_OBJECT DeviceObject; + PFILE_OBJECT FileObject; + PIO_COMPLETION_ROUTINE CompletionRoutine; + PVOID Context; +} IO_STACK_LOCATION, *PIO_STACK_LOCATION; +#if !defined(_AMD64_) && !defined(_IA64_) +#include +#endif + +/* IO_STACK_LOCATION.Control */ + +#define SL_PENDING_RETURNED 0x01 +#define SL_ERROR_RETURNED 0x02 +#define SL_INVOKE_ON_CANCEL 0x20 +#define SL_INVOKE_ON_SUCCESS 0x40 +#define SL_INVOKE_ON_ERROR 0x80 + +/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */ + +#define PCI_WHICHSPACE_CONFIG 0x0 +#define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */ + +#define METHOD_BUFFERED 0 +#define METHOD_IN_DIRECT 1 +#define METHOD_OUT_DIRECT 2 +#define METHOD_NEITHER 3 +#define FILE_SUPERSEDED 0x00000000 +#define FILE_OPENED 0x00000001 +#define FILE_CREATED 0x00000002 +#define FILE_OVERWRITTEN 0x00000003 +#define FILE_EXISTS 0x00000004 +#define FILE_DOES_NOT_EXIST 0x00000005 -// -// Process Qoutas -// +#define FILE_USE_FILE_POINTER_POSITION 0xfffffffe +#define FILE_WRITE_TO_END_OF_FILE 0xffffffff + +/* also in winnt.h */ +#define FILE_LIST_DIRECTORY 0x00000001 +#define FILE_READ_DATA 0x00000001 +#define FILE_ADD_FILE 0x00000002 +#define FILE_WRITE_DATA 0x00000002 +#define FILE_ADD_SUBDIRECTORY 0x00000004 +#define FILE_APPEND_DATA 0x00000004 +#define FILE_CREATE_PIPE_INSTANCE 0x00000004 +#define FILE_READ_EA 0x00000008 +#define FILE_WRITE_EA 0x00000010 +#define FILE_EXECUTE 0x00000020 +#define FILE_TRAVERSE 0x00000020 +#define FILE_DELETE_CHILD 0x00000040 +#define FILE_READ_ATTRIBUTES 0x00000080 +#define FILE_WRITE_ATTRIBUTES 0x00000100 + +#define FILE_SHARE_READ 0x00000001 +#define FILE_SHARE_WRITE 0x00000002 +#define FILE_SHARE_DELETE 0x00000004 +#define FILE_SHARE_VALID_FLAGS 0x00000007 + +#define FILE_ATTRIBUTE_READONLY 0x00000001 +#define FILE_ATTRIBUTE_HIDDEN 0x00000002 +#define FILE_ATTRIBUTE_SYSTEM 0x00000004 +#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 +#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 +#define FILE_ATTRIBUTE_DEVICE 0x00000040 +#define FILE_ATTRIBUTE_NORMAL 0x00000080 +#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 +#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200 +#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 +#define FILE_ATTRIBUTE_COMPRESSED 0x00000800 +#define FILE_ATTRIBUTE_OFFLINE 0x00001000 +#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000 +#define FILE_ATTRIBUTE_ENCRYPTED 0x00004000 + +#define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7 +#define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7 + +#define FILE_VALID_OPTION_FLAGS 0x00ffffff +#define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032 +#define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032 +#define FILE_VALID_SET_FLAGS 0x00000036 + +#define FILE_SUPERSEDE 0x00000000 +#define FILE_OPEN 0x00000001 +#define FILE_CREATE 0x00000002 +#define FILE_OPEN_IF 0x00000003 +#define FILE_OVERWRITE 0x00000004 +#define FILE_OVERWRITE_IF 0x00000005 +#define FILE_MAXIMUM_DISPOSITION 0x00000005 + +#define FILE_DIRECTORY_FILE 0x00000001 +#define FILE_WRITE_THROUGH 0x00000002 +#define FILE_SEQUENTIAL_ONLY 0x00000004 +#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008 +#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010 +#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020 +#define FILE_NON_DIRECTORY_FILE 0x00000040 +#define FILE_CREATE_TREE_CONNECTION 0x00000080 +#define FILE_COMPLETE_IF_OPLOCKED 0x00000100 +#define FILE_NO_EA_KNOWLEDGE 0x00000200 +#define FILE_OPEN_REMOTE_INSTANCE 0x00000400 +#define FILE_RANDOM_ACCESS 0x00000800 +#define FILE_DELETE_ON_CLOSE 0x00001000 +#define FILE_OPEN_BY_FILE_ID 0x00002000 +#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000 +#define FILE_NO_COMPRESSION 0x00008000 +#define FILE_RESERVE_OPFILTER 0x00100000 +#define FILE_OPEN_REPARSE_POINT 0x00200000 +#define FILE_OPEN_NO_RECALL 0x00400000 +#define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000 + +#define FILE_ANY_ACCESS 0x00000000 +#define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS +#define FILE_READ_ACCESS 0x00000001 +#define FILE_WRITE_ACCESS 0x00000002 + +#define FILE_ALL_ACCESS \ + (STANDARD_RIGHTS_REQUIRED | \ + SYNCHRONIZE | \ + 0x1FF) + +#define FILE_GENERIC_EXECUTE \ + (STANDARD_RIGHTS_EXECUTE | \ + FILE_READ_ATTRIBUTES | \ + FILE_EXECUTE | \ + SYNCHRONIZE) + +#define FILE_GENERIC_READ \ + (STANDARD_RIGHTS_READ | \ + FILE_READ_DATA | \ + FILE_READ_ATTRIBUTES | \ + FILE_READ_EA | \ + SYNCHRONIZE) + +#define FILE_GENERIC_WRITE \ + (STANDARD_RIGHTS_WRITE | \ + FILE_WRITE_DATA | \ + FILE_WRITE_ATTRIBUTES | \ + FILE_WRITE_EA | \ + FILE_APPEND_DATA | \ + SYNCHRONIZE) + +/* end winnt.h */ + +/****************************************************************************** + * Object Manager Types * + ******************************************************************************/ + +typedef struct _OBJECT_NAME_INFORMATION { + UNICODE_STRING Name; +} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; + +/* Exported object types */ +extern POBJECT_TYPE NTSYSAPI ExEventObjectType; +extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType; +extern POBJECT_TYPE NTSYSAPI IoFileObjectType; +extern POBJECT_TYPE NTSYSAPI PsThreadType; +extern POBJECT_TYPE NTSYSAPI SeTokenObjectType; +extern POBJECT_TYPE NTSYSAPI PsProcessType; + + +/****************************************************************************** + * Process Manager Types * + ******************************************************************************/ + +#define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001 +#define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002 +#define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004 +#define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008 +#define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010 + +/* Process Qoutas */ typedef struct _QUOTA_LIMITS { SIZE_T PagedPoolLimit; SIZE_T NonPagedPoolLimit; @@ -1013,170 +5302,322 @@ typedef struct _QUOTA_LIMITS { LARGE_INTEGER TimeLimit; } QUOTA_LIMITS, *PQUOTA_LIMITS; -#define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001 -#define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002 -#define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004 -#define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008 -#define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010 +/* Thread Access Rights */ +#define THREAD_TERMINATE 0x0001 +#define THREAD_SUSPEND_RESUME 0x0002 +#define THREAD_ALERT 0x0004 +#define THREAD_GET_CONTEXT 0x0008 +#define THREAD_SET_CONTEXT 0x0010 +#define THREAD_SET_INFORMATION 0x0020 +#define THREAD_SET_LIMITED_INFORMATION 0x0400 +#define THREAD_QUERY_LIMITED_INFORMATION 0x0800 + +#define PROCESS_DUP_HANDLE (0x0040) + +#if (NTDDI_VERSION >= NTDDI_VISTA) +#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF) +#else +#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF) +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) +#define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF) +#else +#define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF) +#endif + +#define ES_SYSTEM_REQUIRED 0x00000001 +#define ES_DISPLAY_REQUIRED 0x00000002 +#define ES_USER_PRESENT 0x00000004 +#define ES_CONTINUOUS 0x80000000 + +#define LOW_PRIORITY 0 +#define LOW_REALTIME_PRIORITY 16 +#define HIGH_PRIORITY 31 +#define MAXIMUM_PRIORITY 32 -/****************************************************************************** - * WINBASE Functions * - ******************************************************************************/ -#if !defined(_WINBASE_) +#ifdef _X86_ +/** Kernel definitions for x86 **/ -#if defined(_WIN64) +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define CMCI_LEVEL 5 +#define PROFILE_LEVEL 27 +#define CLOCK1_LEVEL 28 +#define CLOCK2_LEVEL 28 +#define IPI_LEVEL 29 +#define POWER_LEVEL 30 +#define HIGH_LEVEL 31 +#define CLOCK_LEVEL (CLOCK2_LEVEL) -#define InterlockedPopEntrySList(Head) \ - ExpInterlockedPopEntrySList(Head) +#define KIP0PCRADDRESS 0xffdff000 +#define KI_USER_SHARED_DATA 0xffdf0000 +#define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA) -#define InterlockedPushEntrySList(Head, Entry) \ - ExpInterlockedPushEntrySList(Head, Entry) +#define PAGE_SIZE 0x1000 +#define PAGE_SHIFT 12L +#define KeGetDcacheFillSize() 1L -#define InterlockedFlushSList(Head) \ - ExpInterlockedFlushSList(Head) +#define EFLAG_SIGN 0x8000 +#define EFLAG_ZERO 0x4000 +#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) -#define QueryDepthSList(Head) \ - ExQueryDepthSList(Head) - -#else // !defined(_WIN64) - -NTKERNELAPI -PSLIST_ENTRY -FASTCALL -InterlockedPopEntrySList( - IN PSLIST_HEADER ListHead); - -NTKERNELAPI -PSLIST_ENTRY -FASTCALL -InterlockedPushEntrySList( - IN PSLIST_HEADER ListHead, - IN PSLIST_ENTRY ListEntry); - -#define InterlockedFlushSList(ListHead) \ - ExInterlockedFlushSList(ListHead) - -#define QueryDepthSList(Head) \ - ExQueryDepthSList(Head) - -#endif // !defined(_WIN64) - -#endif // !defined(_WINBASE_) +#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) +#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT) +#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) -/****************************************************************************** - * Kernel Types * - ******************************************************************************/ +typedef struct _KFLOATING_SAVE { + ULONG ControlWord; + ULONG StatusWord; + ULONG ErrorOffset; + ULONG ErrorSelector; + ULONG DataOffset; + ULONG DataSelector; + ULONG Cr0NpxState; + ULONG Spare1; +} KFLOATING_SAVE, *PKFLOATING_SAVE; -typedef struct _DISPATCHER_HEADER +extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount; + +#define YieldProcessor _mm_pause + +FORCEINLINE +VOID +KeMemoryBarrier( + VOID) { - union + volatile LONG Barrier; +#if defined(__GNUC__) + __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax"); +#elif defined(_MSC_VER) + __asm xchg [Barrier], eax +#endif +} + +NTHALAPI +VOID +FASTCALL +KfLowerIrql( + IN KIRQL NewIrql); +#define KeLowerIrql(a) KfLowerIrql(a) + +NTHALAPI +KIRQL +FASTCALL +KfRaiseIrql( + IN KIRQL NewIrql); +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +NTHALAPI +KIRQL +DDKAPI +KeRaiseIrqlToDpcLevel( + VOID); + +NTHALAPI +KIRQL +DDKAPI +KeRaiseIrqlToSynchLevel( + VOID); + +NTHALAPI +KIRQL +FASTCALL +KfAcquireSpinLock( + IN PKSPIN_LOCK SpinLock); +#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a) + +NTHALAPI +VOID +FASTCALL +KfReleaseSpinLock( + IN PKSPIN_LOCK SpinLock, + IN KIRQL NewIrql); +#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b) + +NTKERNELAPI +VOID +FASTCALL +KefAcquireSpinLockAtDpcLevel( + IN PKSPIN_LOCK SpinLock); +#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock) + +NTKERNELAPI +VOID +FASTCALL +KefReleaseSpinLockFromDpcLevel( + IN PKSPIN_LOCK SpinLock); +#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock) + +NTSYSAPI +PKTHREAD +NTAPI +KeGetCurrentThread( + VOID); + +NTKERNELAPI +NTSTATUS +NTAPI +KeSaveFloatingPointState( + OUT PKFLOATING_SAVE FloatSave); + +NTKERNELAPI +NTSTATUS +NTAPI +KeRestoreFloatingPointState( + IN PKFLOATING_SAVE FloatSave); + +/* VOID + * KeFlushIoBuffers( + * IN PMDL Mdl, + * IN BOOLEAN ReadOperation, + * IN BOOLEAN DmaOperation) + */ +#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) + +/* x86 and x64 performs a 0x2C interrupt */ +#define DbgRaiseAssertionFailure __int2c + +FORCEINLINE +VOID +_KeQueryTickCount( + OUT PLARGE_INTEGER CurrentCount) +{ + for (;;) { - struct - { - UCHAR Type; - union - { - UCHAR Absolute; - UCHAR NpxIrql; - }; - union - { - UCHAR Size; - UCHAR Hand; - }; - union - { - UCHAR Inserted; - BOOLEAN DebugActive; - }; - }; - volatile LONG Lock; - }; - LONG SignalState; - LIST_ENTRY WaitListHead; -} DISPATCHER_HEADER, *PDISPATCHER_HEADER; + CurrentCount->HighPart = KeTickCount.High1Time; + CurrentCount->LowPart = KeTickCount.LowPart; + if (CurrentCount->HighPart == KeTickCount.High2Time) break; + YieldProcessor(); + } +} +#define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount) -typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK; +#endif /* _X86_ */ -typedef struct _KEVENT { - DISPATCHER_HEADER Header; -} KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT; - -typedef struct _KSEMAPHORE { - DISPATCHER_HEADER Header; - LONG Limit; -} KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE; - -/****************************************************************************** - * RTL Types * - ******************************************************************************/ - -#define RTL_REGISTRY_ABSOLUTE 0 -#define RTL_REGISTRY_SERVICES 1 -#define RTL_REGISTRY_CONTROL 2 -#define RTL_REGISTRY_WINDOWS_NT 3 -#define RTL_REGISTRY_DEVICEMAP 4 -#define RTL_REGISTRY_USER 5 -#define RTL_REGISTRY_MAXIMUM 6 -#define RTL_REGISTRY_HANDLE 0x40000000 -#define RTL_REGISTRY_OPTIONAL 0x80000000 - -/* RTL_QUERY_REGISTRY_TABLE.Flags */ -#define RTL_QUERY_REGISTRY_SUBKEY 0x00000001 -#define RTL_QUERY_REGISTRY_TOPKEY 0x00000002 -#define RTL_QUERY_REGISTRY_REQUIRED 0x00000004 -#define RTL_QUERY_REGISTRY_NOVALUE 0x00000008 -#define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010 -#define RTL_QUERY_REGISTRY_DIRECT 0x00000020 -#define RTL_QUERY_REGISTRY_DELETE 0x00000040 - -typedef struct _RTL_BITMAP { - ULONG SizeOfBitMap; - PULONG Buffer; -} RTL_BITMAP, *PRTL_BITMAP; - -typedef struct _RTL_BITMAP_RUN { - ULONG StartingIndex; - ULONG NumberOfBits; -} RTL_BITMAP_RUN, *PRTL_BITMAP_RUN; - -typedef NTSTATUS -(DDKAPI *PRTL_QUERY_REGISTRY_ROUTINE)( - IN PWSTR ValueName, - IN ULONG ValueType, - IN PVOID ValueData, - IN ULONG ValueLength, - IN PVOID Context, - IN PVOID EntryContext); - -typedef struct _RTL_QUERY_REGISTRY_TABLE { - PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine; - ULONG Flags; - PCWSTR Name; - PVOID EntryContext; - ULONG DefaultType; - PVOID DefaultData; - ULONG DefaultLength; -} RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE; - -typedef struct _TIME_FIELDS { - CSHORT Year; - CSHORT Month; - CSHORT Day; - CSHORT Hour; - CSHORT Minute; - CSHORT Second; - CSHORT Milliseconds; - CSHORT Weekday; -} TIME_FIELDS, *PTIME_FIELDS; /****************************************************************************** - * RTL Functions * + * Runtime Library Functions * ******************************************************************************/ +FORCEINLINE +VOID +InitializeListHead( + OUT PLIST_ENTRY ListHead) +{ + ListHead->Flink = ListHead->Blink = ListHead; +} + +FORCEINLINE +VOID +InsertHeadList( + IN OUT PLIST_ENTRY ListHead, + IN OUT PLIST_ENTRY Entry) +{ + PLIST_ENTRY OldFlink; + OldFlink = ListHead->Flink; + Entry->Flink = OldFlink; + Entry->Blink = ListHead; + OldFlink->Blink = Entry; + ListHead->Flink = Entry; +} + +FORCEINLINE +VOID +InsertTailList( + IN OUT PLIST_ENTRY ListHead, + IN OUT PLIST_ENTRY Entry) +{ + PLIST_ENTRY OldBlink; + OldBlink = ListHead->Blink; + Entry->Flink = ListHead; + Entry->Blink = OldBlink; + OldBlink->Flink = Entry; + ListHead->Blink = Entry; +} + +BOOLEAN +FORCEINLINE +IsListEmpty( + IN CONST LIST_ENTRY * ListHead) +{ + return (BOOLEAN)(ListHead->Flink == ListHead); +} + +FORCEINLINE +PSINGLE_LIST_ENTRY +PopEntryList( + IN OUT PSINGLE_LIST_ENTRY ListHead) +{ + PSINGLE_LIST_ENTRY FirstEntry; + FirstEntry = ListHead->Next; + if (FirstEntry != NULL) { + ListHead->Next = FirstEntry->Next; + } + return FirstEntry; +} + +FORCEINLINE +VOID +PushEntryList( + IN OUT PSINGLE_LIST_ENTRY ListHead, + IN OUT PSINGLE_LIST_ENTRY Entry) +{ + Entry->Next = ListHead->Next; + ListHead->Next = Entry; +} + +FORCEINLINE +BOOLEAN +RemoveEntryList( + IN PLIST_ENTRY Entry) +{ + PLIST_ENTRY OldFlink; + PLIST_ENTRY OldBlink; + + OldFlink = Entry->Flink; + OldBlink = Entry->Blink; + OldFlink->Blink = OldBlink; + OldBlink->Flink = OldFlink; + return (BOOLEAN)(OldFlink == OldBlink); +} + +FORCEINLINE +PLIST_ENTRY +RemoveHeadList( + IN OUT PLIST_ENTRY ListHead) +{ + PLIST_ENTRY Flink; + PLIST_ENTRY Entry; + + Entry = ListHead->Flink; + Flink = Entry->Flink; + ListHead->Flink = Flink; + Flink->Blink = ListHead; + return Entry; +} + +FORCEINLINE +PLIST_ENTRY +RemoveTailList( + IN OUT PLIST_ENTRY ListHead) +{ + PLIST_ENTRY Blink; + PLIST_ENTRY Entry; + + Entry = ListHead->Blink; + Blink = Entry->Blink; + ListHead->Blink = Blink; + Blink->Flink = ListHead; + return Entry; +} + NTSYSAPI VOID NTAPI @@ -1184,7 +5625,7 @@ RtlAssert( IN PVOID FailedAssertion, IN PVOID FileName, IN ULONG LineNumber, - IN PCHAR Message); + IN PSTR Message); /* VOID * RtlCopyMemory( @@ -1241,7 +5682,7 @@ NTSYSAPI VOID NTAPI RtlFreeUnicodeString( - IN PUNICODE_STRING UnicodeString); + IN OUT PUNICODE_STRING UnicodeString); NTSYSAPI NTSTATUS @@ -1255,7 +5696,7 @@ VOID NTAPI RtlInitUnicodeString( IN OUT PUNICODE_STRING DestinationString, - IN PCWSTR SourceString); + IN PCWSTR SourceString OPTIONAL); /* VOID * RtlMoveMemory( @@ -1911,7 +6352,7 @@ NTSYSAPI ULONGLONG NTAPI RtlIoDecodeMemIoResource ( - IN PIO_RESOURCE_DESCRIPTOR Descriptor, + IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor, OUT PULONGLONG Alignment OPTIONAL, OUT PULONGLONG MinimumAddress OPTIONAL, OUT PULONGLONG MaximumAddress OPTIONAL); @@ -1920,7 +6361,7 @@ NTSYSAPI NTSTATUS NTAPI RtlIoEncodeMemIoResource( - IN PIO_RESOURCE_DESCRIPTOR Descriptor, + IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor, IN UCHAR Type, IN ULONGLONG Length, IN ULONGLONG Alignment, @@ -1931,7 +6372,7 @@ NTSYSAPI ULONGLONG NTAPI RtlCmDecodeMemIoResource( - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, + IN struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor, OUT PULONGLONG Start OPTIONAL); NTSYSAPI @@ -2163,9 +6604,7 @@ RtlCheckBit( #endif // !defined(MIDL_PASS) -// -// Byte Swap Functions -// +/* Byte Swap Functions */ #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \ ((defined(_M_AMD64) || defined(_M_IA64)) \ && (_MSC_FULL_VER > 13009175 || defined(__GNUC__))) @@ -2176,26 +6615,1094 @@ RtlCheckBit( #endif +#if DBG + +#define ASSERT(exp) \ + (VOID)((!(exp)) ? \ + RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE) + +#define ASSERTMSG(msg, exp) \ + (VOID)((!(exp)) ? \ + RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE) + +#define RTL_SOFT_ASSERT(exp) \ + (VOID)((!(exp)) ? \ + DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE) + +#define RTL_SOFT_ASSERTMSG(msg, exp) \ + (VOID)((!(exp)) ? \ + DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE) + +#define RTL_VERIFY(exp) ASSERT(exp) +#define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp) + +#define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp) +#define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp) + +#if defined(_MSC_VER) + +#define NT_ASSERT(exp) \ + ((!(exp)) ? \ + (__annotation(L"Debug", L"AssertFail", L#exp), \ + DbgRaiseAssertionFailure(), FALSE) : TRUE) + +#define NT_ASSERTMSG(msg, exp) \ + ((!(exp)) ? \ + (__annotation(L"Debug", L"AssertFail", L##msg), \ + DbgRaiseAssertionFailure(), FALSE) : TRUE) + +#define NT_ASSERTMSGW(msg, exp) \ + ((!(exp)) ? \ + (__annotation(L"Debug", L"AssertFail", msg), \ + DbgRaiseAssertionFailure(), FALSE) : TRUE) + +#else + +/* GCC doesn't support __annotation (nor PDB) */ +#define NT_ASSERT(exp) \ + (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE) + +#define NT_ASSERTMSG NT_ASSERT +#define NT_ASSERTMSGW NT_ASSERT + +#endif + +#else /* !DBG */ + +#define ASSERT(exp) ((VOID) 0) +#define ASSERTMSG(msg, exp) ((VOID) 0) + +#define RTL_SOFT_ASSERT(exp) ((VOID) 0) +#define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0) + +#define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE) +#define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE) + +#define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE) +#define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE) + +#define NT_ASSERT(exp) ((VOID)0) +#define NT_ASSERTMSG(exp) ((VOID)0) +#define NT_ASSERTMSGW(exp) ((VOID)0) + +#endif /* DBG */ + +#if !defined(_WINBASE_) + +#if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_)) + +NTKERNELAPI +VOID +InitializeSListHead( + OUT PSLIST_HEADER SListHead); + +#else + +VOID +FORCEINLINE +InitializeSListHead( + OUT PSLIST_HEADER SListHead) +{ +#if defined(_IA64_) + ULONG64 FeatureBits; +#endif + +#if defined(_WIN64) + if (((ULONG_PTR)SListHead & 0xf) != 0) + { + RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT); + } +#endif + + RtlZeroMemory(SListHead, sizeof(SLIST_HEADER)); + +#if defined(_IA64_) + FeatureBits = __getReg(CV_IA64_CPUID4); + if ((FeatureBits & KF_16BYTE_INSTR) != 0) + { + SListHead->Header16.HeaderType = 1; + SListHead->Header16.Init = 1; + } +#endif +} + +#endif + +#if defined(_WIN64) + +#define InterlockedPopEntrySList(Head) \ + ExpInterlockedPopEntrySList(Head) + +#define InterlockedPushEntrySList(Head, Entry) \ + ExpInterlockedPushEntrySList(Head, Entry) + +#define InterlockedFlushSList(Head) \ + ExpInterlockedFlushSList(Head) + +#define QueryDepthSList(Head) \ + ExQueryDepthSList(Head) + +#else /* !defined(_WIN64) */ + +NTKERNELAPI +PSLIST_ENTRY +FASTCALL +InterlockedPopEntrySList( + IN PSLIST_HEADER ListHead); + +NTKERNELAPI +PSLIST_ENTRY +FASTCALL +InterlockedPushEntrySList( + IN PSLIST_HEADER ListHead, + IN PSLIST_ENTRY ListEntry); + +#define InterlockedFlushSList(ListHead) \ + ExInterlockedFlushSList(ListHead) + +#define QueryDepthSList(Head) \ + ExQueryDepthSList(Head) + +#endif /* !defined(_WIN64) */ + +#endif /* !defined(_WINBASE_) */ + /****************************************************************************** - * Memory manager Types * + * Kernel Functions * ******************************************************************************/ -typedef struct _MDL { - struct _MDL *Next; - CSHORT Size; - CSHORT MdlFlags; - struct _EPROCESS *Process; - PVOID MappedSystemVa; - PVOID StartVa; - ULONG ByteCount; - ULONG ByteOffset; -} MDL, *PMDL; +NTHALAPI +KIRQL +NTAPI +KeGetCurrentIrql( + VOID); +NTKERNELAPI +VOID +NTAPI +KeInitializeEvent( + OUT PRKEVENT Event, + IN EVENT_TYPE Type, + IN BOOLEAN State); + +NTKERNELAPI +VOID +NTAPI +KeClearEvent( + IN OUT PRKEVENT Event); + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +VOID +NTAPI +ProbeForRead( + IN CONST VOID *Address, /* CONST is added */ + IN SIZE_T Length, + IN ULONG Alignment); + +NTKERNELAPI +VOID +NTAPI +ProbeForWrite( + IN PVOID Address, + IN SIZE_T Length, + IN ULONG Alignment); + +#if defined(SINGLE_GROUP_LEGACY_API) +NTKERNELAPI +VOID +NTAPI +KeRevertToUserAffinityThread(VOID); + +NTKERNELAPI +VOID +NTAPI +KeSetSystemAffinityThread( + IN KAFFINITY Affinity); + +NTKERNELAPI +VOID +NTAPI +KeSetTargetProcessorDpc( + IN OUT PRKDPC Dpc, + IN CCHAR Number); + +NTKERNELAPI +KAFFINITY +NTAPI +KeQueryActiveProcessors( + VOID); +#endif + +#if !defined(_M_AMD64) +NTKERNELAPI +ULONGLONG +NTAPI +KeQueryInterruptTime( + VOID); + +NTKERNELAPI +VOID +NTAPI +KeQuerySystemTime( + OUT PLARGE_INTEGER CurrentTime); +#endif /* !_M_AMD64 */ + +#if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK)) +NTKERNELAPI +VOID +NTAPI +KeInitializeSpinLock( + IN PKSPIN_LOCK SpinLock); +#else +FORCEINLINE +VOID +KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock) +{ + /* Clear the lock */ + *SpinLock = 0; +} +#endif + +NTKERNELAPI +DECLSPEC_NORETURN +VOID +NTAPI +KeBugCheckEx( + IN ULONG BugCheckCode, + IN ULONG_PTR BugCheckParameter1, + IN ULONG_PTR BugCheckParameter2, + IN ULONG_PTR BugCheckParameter3, + IN ULONG_PTR BugCheckParameter4); + +NTKERNELAPI +BOOLEAN +NTAPI +KeCancelTimer( + IN OUT PKTIMER); + +NTKERNELAPI +NTSTATUS +NTAPI +KeDelayExecutionThread( + IN KPROCESSOR_MODE WaitMode, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Interval); + +NTKERNELAPI +BOOLEAN +NTAPI +KeDeregisterBugCheckCallback( + IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord); + +NTKERNELAPI +VOID +NTAPI +KeEnterCriticalRegion(VOID); + +NTKERNELAPI +VOID +NTAPI +KeInitializeDeviceQueue( + OUT PKDEVICE_QUEUE DeviceQueue); + +NTKERNELAPI +VOID +NTAPI +KeInitializeDpc( + OUT PRKDPC Dpc, + IN PKDEFERRED_ROUTINE DeferredRoutine, + IN PVOID DeferredContext OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +KeInitializeMutex( + OUT PRKMUTEX Mutex, + IN ULONG Level); + +NTKERNELAPI +VOID +NTAPI +KeInitializeSemaphore( + OUT PRKSEMAPHORE Semaphore, + IN LONG Count, + IN LONG Limit); + +NTKERNELAPI +VOID +NTAPI +KeInitializeTimer( + OUT PKTIMER Timer); + +NTKERNELAPI +VOID +NTAPI +KeInitializeTimerEx( + OUT PKTIMER Timer, + IN TIMER_TYPE Type); + +NTKERNELAPI +BOOLEAN +NTAPI +KeInsertByKeyDeviceQueue( + IN OUT PKDEVICE_QUEUE DeviceQueue, + IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry, + IN ULONG SortKey); + +NTKERNELAPI +BOOLEAN +NTAPI +KeInsertDeviceQueue( + IN OUT PKDEVICE_QUEUE DeviceQueue, + IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); + +NTKERNELAPI +BOOLEAN +NTAPI +KeInsertQueueDpc( + IN OUT PRKDPC Dpc, + IN PVOID SystemArgument1 OPTIONAL, + IN PVOID SystemArgument2 OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +KeLeaveCriticalRegion(VOID); + +NTHALAPI +LARGE_INTEGER +NTAPI +KeQueryPerformanceCounter( + OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL); + +NTKERNELAPI +KPRIORITY +NTAPI +KeQueryPriorityThread( + IN PRKTHREAD Thread); + +NTKERNELAPI +ULONG +NTAPI +KeQueryTimeIncrement( + VOID); + +NTKERNELAPI +LONG +NTAPI +KeReadStateEvent( + IN PRKEVENT Event); + +NTKERNELAPI +LONG +NTAPI +KeReadStateMutex( + IN PRKMUTEX Mutex); + + +NTKERNELAPI +LONG +NTAPI +KeReadStateSemaphore( + IN PRKSEMAPHORE Semaphore); + +NTKERNELAPI +BOOLEAN +NTAPI +KeReadStateTimer( + IN PKTIMER Timer); + +NTKERNELAPI +BOOLEAN +NTAPI +KeRegisterBugCheckCallback( + OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord, + IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine, + IN PVOID Buffer, + IN ULONG Length, + IN PUCHAR Component); + +NTKERNELAPI +LONG +NTAPI +KeReleaseMutex( + IN OUT PRKMUTEX Mutex, + IN BOOLEAN Wait); + +NTKERNELAPI +LONG +NTAPI +KeReleaseSemaphore( + IN OUT PRKSEMAPHORE Semaphore, + IN KPRIORITY Increment, + IN LONG Adjustment, + IN BOOLEAN Wait); + +NTKERNELAPI +PKDEVICE_QUEUE_ENTRY +NTAPI +KeRemoveByKeyDeviceQueue( + IN OUT PKDEVICE_QUEUE DeviceQueue, + IN ULONG SortKey); + +NTKERNELAPI +PKDEVICE_QUEUE_ENTRY +NTAPI +KeRemoveDeviceQueue( + IN OUT PKDEVICE_QUEUE DeviceQueue); + +NTKERNELAPI +BOOLEAN +NTAPI +KeRemoveEntryDeviceQueue( + IN OUT PKDEVICE_QUEUE DeviceQueue, + IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); + +NTKERNELAPI +BOOLEAN +NTAPI +KeRemoveQueueDpc( + IN OUT PRKDPC Dpc); + +NTKERNELAPI +LONG +NTAPI +KeResetEvent( + IN OUT PRKEVENT Event); + +NTKERNELAPI +LONG +NTAPI +KeSetEvent( + IN OUT PRKEVENT Event, + IN KPRIORITY Increment, + IN BOOLEAN Wait); + +NTKERNELAPI +VOID +NTAPI +KeSetImportanceDpc( + IN OUT PRKDPC Dpc, + IN KDPC_IMPORTANCE Importance); + +NTKERNELAPI +KPRIORITY +NTAPI +KeSetPriorityThread( + IN OUT PKTHREAD Thread, + IN KPRIORITY Priority); + +NTKERNELAPI +BOOLEAN +NTAPI +KeSetTimer( + IN OUT PKTIMER Timer, + IN LARGE_INTEGER DueTime, + IN PKDPC Dpc OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +KeSetTimerEx( + IN OUT PKTIMER Timer, + IN LARGE_INTEGER DueTime, + IN LONG Period OPTIONAL, + IN PKDPC Dpc OPTIONAL); + +NTHALAPI +VOID +NTAPI +KeStallExecutionProcessor( + IN ULONG MicroSeconds); + +NTKERNELAPI +BOOLEAN +NTAPI +KeSynchronizeExecution( + IN OUT PKINTERRUPT Interrupt, + IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, + IN PVOID SynchronizeContext OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +KeWaitForMultipleObjects( + IN ULONG Count, + IN PVOID Object[], + IN WAIT_TYPE WaitType, + IN KWAIT_REASON WaitReason, + IN KPROCESSOR_MODE WaitMode, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL, + OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL); + +#define KeWaitForMutexObject KeWaitForSingleObject + +NTKERNELAPI +NTSTATUS +NTAPI +KeWaitForSingleObject( + IN PVOID Object, + IN KWAIT_REASON WaitReason, + IN KPROCESSOR_MODE WaitMode, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +_DECL_HAL_KE_IMPORT +VOID +FASTCALL +KeAcquireInStackQueuedSpinLock( + IN OUT PKSPIN_LOCK SpinLock, + OUT PKLOCK_QUEUE_HANDLE LockHandle); + +NTKERNELAPI +VOID +FASTCALL +KeAcquireInStackQueuedSpinLockAtDpcLevel( + IN OUT PKSPIN_LOCK SpinLock, + OUT PKLOCK_QUEUE_HANDLE LockHandle); + +NTKERNELAPI +KIRQL +NTAPI +KeAcquireInterruptSpinLock( + IN OUT PKINTERRUPT Interrupt); + +NTKERNELAPI +BOOLEAN +NTAPI +KeAreApcsDisabled(VOID); + +NTKERNELAPI +ULONG +NTAPI +KeGetRecommendedSharedDataAlignment(VOID); + +NTKERNELAPI +ULONG +NTAPI +KeQueryRuntimeThread( + IN PKTHREAD Thread, + OUT PULONG UserTime); + +NTKERNELAPI +VOID +FASTCALL +KeReleaseInStackQueuedSpinLockFromDpcLevel( + IN PKLOCK_QUEUE_HANDLE LockHandle); + +NTKERNELAPI +VOID +NTAPI +KeReleaseInterruptSpinLock( + IN OUT PKINTERRUPT Interrupt, + IN KIRQL OldIrql); + +NTKERNELAPI +PKDEVICE_QUEUE_ENTRY +NTAPI +KeRemoveByKeyDeviceQueueIfBusy( + IN OUT PKDEVICE_QUEUE DeviceQueue, + IN ULONG SortKey); + +_DECL_HAL_KE_IMPORT +VOID +FASTCALL +KeReleaseInStackQueuedSpinLock( + IN PKLOCK_QUEUE_HANDLE LockHandle); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#if (NTDDI_VERSION >= NTDDI_WINXPSP1) + +NTKERNELAPI +BOOLEAN +NTAPI +KeDeregisterBugCheckReasonCallback( + IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord); + +NTKERNELAPI +BOOLEAN +NTAPI +KeRegisterBugCheckReasonCallback( + OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord, + IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine, + IN KBUGCHECK_CALLBACK_REASON Reason, + IN PUCHAR Component); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */ + +#if (NTDDI_VERSION >= NTDDI_WINXPSP2) + +NTKERNELAPI +VOID +NTAPI +KeFlushQueuedDpcs( + VOID); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */ + +#if (NTDDI_VERSION >= NTDDI_WS03) + +NTKERNELAPI +PVOID +NTAPI +KeRegisterNmiCallback( + IN PNMI_CALLBACK CallbackRoutine, + IN PVOID Context OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +KeDeregisterNmiCallback( + IN PVOID Handle); + +NTKERNELAPI +VOID +NTAPI +KeInitializeThreadedDpc( + OUT PRKDPC Dpc, + IN PKDEFERRED_ROUTINE DeferredRoutine, + IN PVOID DeferredContext OPTIONAL); + +NTKERNELAPI +ULONG_PTR +NTAPI +KeIpiGenericCall( + IN PKIPI_BROADCAST_WORKER BroadcastFunction, + IN ULONG_PTR Context); + +NTKERNELAPI +KIRQL +FASTCALL +KeAcquireSpinLockForDpc( + IN OUT PKSPIN_LOCK SpinLock); + +NTKERNELAPI +VOID +FASTCALL +KeReleaseSpinLockForDpc( + IN OUT PKSPIN_LOCK SpinLock, + IN KIRQL OldIrql); + +NTKERNELAPI +BOOLEAN +FASTCALL +KeTestSpinLock( + IN PKSPIN_LOCK SpinLock); + +#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ + +#if (NTDDI_VERSION >= NTDDI_WS03SP1) + +NTKERNELAPI +BOOLEAN +FASTCALL +KeTryToAcquireSpinLockAtDpcLevel( + IN OUT PKSPIN_LOCK SpinLock); + +NTKERNELAPI +BOOLEAN +NTAPI +KeAreAllApcsDisabled( + VOID); + +NTKERNELAPI +VOID +FASTCALL +KeAcquireGuardedMutex( + IN OUT PKGUARDED_MUTEX GuardedMutex +); + +NTKERNELAPI +VOID +FASTCALL +KeAcquireGuardedMutexUnsafe( + IN OUT PKGUARDED_MUTEX GuardedMutex +); + +NTKERNELAPI +VOID +NTAPI +KeEnterGuardedRegion( + VOID +); + +NTKERNELAPI +VOID +NTAPI +KeLeaveGuardedRegion( + VOID +); + +NTKERNELAPI +VOID +FASTCALL +KeInitializeGuardedMutex( + OUT PKGUARDED_MUTEX GuardedMutex +); + +NTKERNELAPI +VOID +FASTCALL +KeReleaseGuardedMutexUnsafe( + IN OUT PKGUARDED_MUTEX GuardedMutex +); + +NTKERNELAPI +VOID +FASTCALL +KeReleaseGuardedMutex( + IN OUT PKGUARDED_MUTEX GuardedMutex +); + +NTKERNELAPI +BOOLEAN +FASTCALL +KeTryToAcquireGuardedMutex( + IN OUT PKGUARDED_MUTEX GuardedMutex +); + +#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTKERNELAPI +VOID +FASTCALL +KeAcquireInStackQueuedSpinLockForDpc( + IN OUT PKSPIN_LOCK SpinLock, + OUT PKLOCK_QUEUE_HANDLE LockHandle); + +NTKERNELAPI +VOID +FASTCALL +KeReleaseInStackQueuedSpinLockForDpc( + IN PKLOCK_QUEUE_HANDLE LockHandle); + +NTKERNELAPI +NTSTATUS +NTAPI +KeQueryDpcWatchdogInformation( + OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation); + +#if defined(SINGLE_GROUP_LEGACY_API) +NTKERNELAPI +KAFFINITY +NTAPI +KeSetSystemAffinityThreadEx( + IN KAFFINITY Affinity); + +NTKERNELAPI +ULONG +NTAPI +KeQueryActiveProcessorCount( + OUT PKAFFINITY ActiveProcessors OPTIONAL); + +NTKERNELAPI +ULONG +NTAPI +KeQueryMaximumProcessorCount( + VOID); +#endif + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_WS08) + +PVOID +KeRegisterProcessorChangeCallback( + IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction, + IN PVOID CallbackContext OPTIONAL, + IN ULONG Flags); + +VOID +KeDeregisterProcessorChangeCallback( + IN PVOID CallbackHandle); + +#endif /* (NTDDI_VERSION >= NTDDI_WS08) */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +ULONG64 +NTAPI +KeQueryTotalCycleTimeProcess( + IN OUT PKPROCESS Process, + OUT PULONG64 CycleTimeStamp); + +ULONG64 +NTAPI +KeQueryTotalCycleTimeThread( + IN OUT PKTHREAD Thread, + OUT PULONG64 CycleTimeStamp); + +NTKERNELAPI +NTSTATUS +NTAPI +KeSetTargetProcessorDpcEx( + IN OUT PKDPC Dpc, + IN PPROCESSOR_NUMBER ProcNumber); + +NTKERNELAPI +VOID +NTAPI +KeSetSystemGroupAffinityThread( + IN PGROUP_AFFINITY Affinity, + OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +KeRevertToUserGroupAffinityThread( + IN PGROUP_AFFINITY PreviousAffinity); + +NTKERNELAPI +BOOLEAN +NTAPI +KeSetCoalescableTimer( + IN OUT PKTIMER Timer, + IN LARGE_INTEGER DueTime, + IN ULONG Period, + IN ULONG TolerableDelay, + IN PKDPC Dpc OPTIONAL); + +NTKERNELAPI +ULONGLONG +NTAPI +KeQueryUnbiasedInterruptTime( + VOID); + +NTKERNELAPI +ULONG +NTAPI +KeQueryActiveProcessorCountEx( + IN USHORT GroupNumber); + +NTKERNELAPI +ULONG +NTAPI +KeQueryMaximumProcessorCountEx( + IN USHORT GroupNumber); + +NTKERNELAPI +USHORT +NTAPI +KeQueryActiveGroupCount( + VOID); + +NTKERNELAPI +USHORT +NTAPI +KeQueryMaximumGroupCount( + VOID); + +NTKERNELAPI +KAFFINITY +NTAPI +KeQueryGroupAffinity + IN USHORT GroupNumber); + +NTKERNELAPI +ULONG +NTAPI +KeGetCurrentProcessorNumberEx( + OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +KeQueryNodeActiveAffinity( + IN USHORT NodeNumber, + OUT PGROUP_AFFINITY Affinity OPTIONAL, + OUT PUSHORT Count OPTIONAL); + +NTKERNELAPI +USHORT +NTAPI +KeQueryNodeMaximumProcessorCount( + IN USHORT NodeNumber); + +NTKERNELAPI +USHORT +NTAPI +KeQueryHighestNodeNumber( + VOID); + +NTKERNELAPI +USHORT +NTAPI +KeGetCurrentNodeNumber( + VOID); + +NTKERNELAPI +NTSTATUS +NTAPI +KeQueryLogicalProcessorRelationship( + IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL, + IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType, + OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL, + IN OUT PULONG Length); + +NTKERNELAPI +NTSTATUS +NTAPI +KeSaveExtendedProcessorState( + IN ULONG64 Mask, + OUT PXSTATE_SAVE XStateSave); + +NTKERNELAPI +VOID +NTAPI +KeRestoreExtendedProcessorState( + IN PXSTATE_SAVE XStateSave); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + +#if !defined(_IA64_) +NTHALAPI +VOID +NTAPI +KeFlushWriteBuffer(VOID); +#endif + +/* VOID + * KeInitializeCallbackRecord( + * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord) + */ +#define KeInitializeCallbackRecord(CallbackRecord) \ + CallbackRecord->State = BufferEmpty; + +#if DBG + +#if (NTDDI_VERSION >= NTDDI_VISTA) +#define PAGED_ASSERT( exp ) NT_ASSERT( exp ) +#else +#define PAGED_ASSERT( exp ) ASSERT( exp ) +#endif + +#define PAGED_CODE() { \ + if (KeGetCurrentIrql() > APC_LEVEL) { \ + KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \ + PAGED_ASSERT(FALSE); \ + } \ +} + +#else + +#define PAGED_CODE() + +#endif + +#define PAGED_CODE_LOCKED() NOP_FUNCTION; /****************************************************************************** * Memory manager Functions * ******************************************************************************/ +/* + * Alignment Macros + */ +#define ALIGN_DOWN_BY(size, align) \ + ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1)) + +#define ALIGN_UP_BY(size, align) \ + (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align)) + +#define ALIGN_DOWN_POINTER_BY(ptr, align) \ + ((PVOID)ALIGN_DOWN_BY(ptr, align)) + +#define ALIGN_UP_POINTER_BY(ptr, align) \ + ((PVOID)ALIGN_UP_BY(ptr, align)) + +#define ALIGN_DOWN(size, type) \ + ALIGN_DOWN_BY(size, sizeof(type)) + +#define ALIGN_UP(size, type) \ + ALIGN_UP_BY(size, sizeof(type)) + +#define ALIGN_DOWN_POINTER(ptr, type) \ + ALIGN_DOWN_POINTER_BY(ptr, sizeof(type)) + +#define ALIGN_UP_POINTER(ptr, type) \ + ALIGN_UP_POINTER_BY(ptr, sizeof(type)) + +/* ULONG + * BYTE_OFFSET( + * IN PVOID Va) + */ +#define BYTE_OFFSET(Va) \ + ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1))) + +/* ULONG + * BYTES_TO_PAGES( + * IN ULONG Size) + */ +#define BYTES_TO_PAGES(Size) \ + (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0)) + +/* PVOID + * PAGE_ALIGN( + * IN PVOID Va) + */ +#define PAGE_ALIGN(Va) \ + ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1))) + +/* ULONG_PTR + * ROUND_TO_PAGES( + * IN ULONG_PTR Size) + */ +#define ROUND_TO_PAGES(Size) \ + (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)) + +/* ULONG + * ADDRESS_AND_SIZE_TO_SPAN_PAGES( + * IN PVOID Va, + * IN ULONG Size) + */ +#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \ + ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \ + + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT)) + +/* + * ULONG + * MmGetMdlByteCount( + * IN PMDL Mdl) + */ +#define MmGetMdlByteCount(_Mdl) \ + ((_Mdl)->ByteCount) + +/* + * ULONG + * MmGetMdlByteOffset( + * IN PMDL Mdl) + */ +#define MmGetMdlByteOffset(_Mdl) \ + ((_Mdl)->ByteOffset) + +/* + * PPFN_NUMBER + * MmGetMdlPfnArray( + * IN PMDL Mdl) + */ +#define MmGetMdlPfnArray(_Mdl) \ + ((PPFN_NUMBER) ((_Mdl) + 1)) + +/* + * PVOID + * MmGetMdlVirtualAddress( + * IN PMDL Mdl) + */ +#define MmGetMdlVirtualAddress(_Mdl) \ + ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset)) + +#define MmGetProcedureAddress(Address) (Address) + /* PVOID MmGetSystemAddressForMdl( * IN PMDL Mdl); */ @@ -2217,7 +7724,76 @@ typedef struct _MDL { (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \ KernelMode, MmCached, NULL, FALSE, (_Priority))) +/* + * VOID + * MmInitializeMdl( + * IN PMDL MemoryDescriptorList, + * IN PVOID BaseVa, + * IN SIZE_T Length) + */ +#define MmInitializeMdl(_MemoryDescriptorList, \ + _BaseVa, \ + _Length) \ +{ \ + (_MemoryDescriptorList)->Next = (PMDL) NULL; \ + (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \ + (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \ + (_MemoryDescriptorList)->MdlFlags = 0; \ + (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \ + (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \ + (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \ +} + +/* + * VOID + * MmPrepareMdlForReuse( + * IN PMDL Mdl) + */ +#define MmPrepareMdlForReuse(_Mdl) \ +{ \ + if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \ + ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \ + MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \ + } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \ + ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \ + } \ +} + #if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +PVOID +NTAPI +MmAllocateContiguousMemory( + IN SIZE_T NumberOfBytes, + IN PHYSICAL_ADDRESS HighestAcceptableAddress); + +NTKERNELAPI +PVOID +NTAPI +MmAllocateContiguousMemorySpecifyCache( + IN SIZE_T NumberOfBytes, + IN PHYSICAL_ADDRESS LowestAcceptableAddress, + IN PHYSICAL_ADDRESS HighestAcceptableAddress, + IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, + IN MEMORY_CACHING_TYPE CacheType); + +NTKERNELAPI +PMDL +NTAPI +MmAllocatePagesForMdl( + IN PHYSICAL_ADDRESS LowAddress, + IN PHYSICAL_ADDRESS HighAddress, + IN PHYSICAL_ADDRESS SkipBytes, + IN SIZE_T TotalBytes); + +NTKERNELAPI +VOID +NTAPI +MmBuildMdlForNonPagedPool( + IN OUT PMDLX MemoryDescriptorList); + +//DECLSPEC_DEPRECATED_DDK NTKERNELAPI PMDL NTAPI @@ -2226,6 +7802,359 @@ MmCreateMdl( IN PVOID Base, IN SIZE_T Length); +NTKERNELAPI +VOID +NTAPI +MmFreeContiguousMemory( + IN PVOID BaseAddress); + +NTKERNELAPI +VOID +NTAPI +MmFreeContiguousMemorySpecifyCache( + IN PVOID BaseAddress, + IN SIZE_T NumberOfBytes, + IN MEMORY_CACHING_TYPE CacheType); + +NTKERNELAPI +VOID +NTAPI +MmFreePagesFromMdl( + IN PMDLX MemoryDescriptorList); + +NTKERNELAPI +PVOID +NTAPI +MmGetSystemRoutineAddress( + IN PUNICODE_STRING SystemRoutineName); + +NTKERNELAPI +LOGICAL +NTAPI +MmIsDriverVerifying( + IN struct _DRIVER_OBJECT *DriverObject); + +NTKERNELAPI +PVOID +NTAPI +MmLockPagableDataSection( + IN PVOID AddressWithinSection); + +NTKERNELAPI +PVOID +NTAPI +MmMapIoSpace( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN SIZE_T NumberOfBytes, + IN MEMORY_CACHING_TYPE CacheEnable); + +NTKERNELAPI +PVOID +NTAPI +MmMapLockedPages( + IN PMDL MemoryDescriptorList, + IN KPROCESSOR_MODE AccessMode); + +NTKERNELAPI +PVOID +NTAPI +MmMapLockedPagesSpecifyCache( + IN PMDLX MemoryDescriptorList, + IN KPROCESSOR_MODE AccessMode, + IN MEMORY_CACHING_TYPE CacheType, + IN PVOID BaseAddress OPTIONAL, + IN ULONG BugCheckOnFailure, + IN MM_PAGE_PRIORITY Priority); + +NTKERNELAPI +PVOID +NTAPI +MmPageEntireDriver( + IN PVOID AddressWithinSection); + +NTKERNELAPI +VOID +NTAPI +MmProbeAndLockPages( + IN OUT PMDL MemoryDescriptorList, + IN KPROCESSOR_MODE AccessMode, + IN LOCK_OPERATION Operation); + +NTKERNELAPI +MM_SYSTEMSIZE +NTAPI +MmQuerySystemSize( + VOID); + +NTKERNELAPI +VOID +NTAPI +MmResetDriverPaging( + IN PVOID AddressWithinSection); + +NTKERNELAPI +SIZE_T +NTAPI +MmSizeOfMdl( + IN PVOID Base, + IN SIZE_T Length); + +NTKERNELAPI +VOID +NTAPI +MmUnlockPagableImageSection( + IN PVOID ImageSectionHandle); + +NTKERNELAPI +VOID +NTAPI +MmUnlockPages( + IN OUT PMDL MemoryDescriptorList); + +NTKERNELAPI +VOID +NTAPI +MmUnmapIoSpace( + IN PVOID BaseAddress, + IN SIZE_T NumberOfBytes); + +NTKERNELAPI +VOID +NTAPI +MmProbeAndLockProcessPages( + IN OUT PMDL MemoryDescriptorList, + IN PEPROCESS Process, + IN KPROCESSOR_MODE AccessMode, + IN LOCK_OPERATION Operation); + +NTKERNELAPI +VOID +NTAPI +MmUnmapLockedPages( + IN PVOID BaseAddress, + IN PMDL MemoryDescriptorList); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTKERNELAPI +NTSTATUS +NTAPI +MmAdvanceMdl( + IN OUT PMDL Mdl, + IN ULONG NumberOfBytes); + +NTKERNELAPI +PVOID +NTAPI +MmAllocateMappingAddress( + IN SIZE_T NumberOfBytes, + IN ULONG PoolTag); + +NTKERNELAPI +VOID +NTAPI +MmFreeMappingAddress( + IN PVOID BaseAddress, + IN ULONG PoolTag); + +NTKERNELAPI +NTSTATUS +NTAPI +MmIsVerifierEnabled( + OUT PULONG VerifierFlags); + +NTKERNELAPI +PVOID +NTAPI +MmMapLockedPagesWithReservedMapping( + IN PVOID MappingAddress, + IN ULONG PoolTag, + IN PMDL MemoryDescriptorList, + IN MEMORY_CACHING_TYPE CacheType); + +NTKERNELAPI +NTSTATUS +NTAPI +MmProtectMdlSystemAddress( + IN PMDL MemoryDescriptorList, + IN ULONG NewProtect); + +NTKERNELAPI +VOID +NTAPI +MmUnmapReservedMapping( + IN PVOID BaseAddress, + IN ULONG PoolTag, + IN PMDL MemoryDescriptorList); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WS03SP1) +NTKERNELAPI +PMDL +NTAPI +MmAllocatePagesForMdlEx( + IN PHYSICAL_ADDRESS LowAddress, + IN PHYSICAL_ADDRESS HighAddress, + IN PHYSICAL_ADDRESS SkipBytes, + IN SIZE_T TotalBytes, + IN MEMORY_CACHING_TYPE CacheType, + IN ULONG Flags); +#endif + +/****************************************************************************** + * Security Manager Functions * + ******************************************************************************/ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +BOOLEAN +NTAPI +SeAccessCheck( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, + IN BOOLEAN SubjectContextLocked, + IN ACCESS_MASK DesiredAccess, + IN ACCESS_MASK PreviouslyGrantedAccess, + OUT PPRIVILEGE_SET *Privileges OPTIONAL, + IN PGENERIC_MAPPING GenericMapping, + IN KPROCESSOR_MODE AccessMode, + OUT PACCESS_MASK GrantedAccess, + OUT PNTSTATUS AccessStatus); + +NTKERNELAPI +NTSTATUS +NTAPI +SeAssignSecurity( + IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL, + IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL, + OUT PSECURITY_DESCRIPTOR *NewDescriptor, + IN BOOLEAN IsDirectoryObject, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext, + IN PGENERIC_MAPPING GenericMapping, + IN POOL_TYPE PoolType); + +NTKERNELAPI +NTSTATUS +NTAPI +SeAssignSecurityEx( + IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL, + IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL, + OUT PSECURITY_DESCRIPTOR *NewDescriptor, + IN GUID *ObjectType OPTIONAL, + IN BOOLEAN IsDirectoryObject, + IN ULONG AutoInheritFlags, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext, + IN PGENERIC_MAPPING GenericMapping, + IN POOL_TYPE PoolType); + +NTKERNELAPI +NTSTATUS +NTAPI +SeDeassignSecurity( + IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor); + +NTKERNELAPI +BOOLEAN +NTAPI +SeValidSecurityDescriptor( + IN ULONG Length, + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + +NTKERNELAPI +ULONG +NTAPI +SeObjectCreateSaclAccessBits( + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + +NTKERNELAPI +VOID +NTAPI +SeReleaseSubjectContext( + IN OUT PSECURITY_SUBJECT_CONTEXT SubjectContext); + +NTKERNELAPI +VOID +NTAPI +SeUnlockSubjectContext( + IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + +NTKERNELAPI +VOID +NTAPI +SeCaptureSubjectContext( + OUT PSECURITY_SUBJECT_CONTEXT SubjectContext); + +NTKERNELAPI +VOID +NTAPI +SeLockSubjectContext( + IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WS03SP1) + +NTSTATUS +NTAPI +SeSetAuditParameter( + IN OUT PSE_ADT_PARAMETER_ARRAY AuditParameters, + IN SE_ADT_PARAMETER_TYPE Type, + IN ULONG Index, + IN PVOID Data); + +NTSTATUS +NTAPI +SeReportSecurityEvent( + IN ULONG Flags, + IN PUNICODE_STRING SourceName, + IN PSID UserSid OPTIONAL, + IN PSE_ADT_PARAMETER_ARRAY AuditParameters); + +#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTKERNELAPI +ULONG +NTAPI +SeComputeAutoInheritByObjectType( + IN PVOID ObjectType, + IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, + IN PSECURITY_DESCRIPTOR ParentSecurityDescriptor OPTIONAL); + +#ifdef SE_NTFS_WORLD_CACHE +VOID +NTAPI +SeGetWorldRights( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN PGENERIC_MAPPING GenericMapping, + OUT PACCESS_MASK GrantedAccess); +#endif /* SE_NTFS_WORLD_CACHE */ + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +/****************************************************************************** + * Configuration Manager Functions * + ******************************************************************************/ + +#if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +NTSTATUS +NTAPI +CmRegisterCallback( + IN PEX_CALLBACK_FUNCTION Function, + IN PVOID Context OPTIONAL, + OUT PLARGE_INTEGER Cookie); + +NTKERNELAPI +NTSTATUS +NTAPI +CmUnRegisterCallback( + IN LARGE_INTEGER Cookie); #endif @@ -2233,6 +8162,418 @@ MmCreateMdl( * I/O Manager Functions * ******************************************************************************/ +#if !defined(_M_AMD64) +NTHALAPI +VOID +NTAPI +READ_PORT_BUFFER_UCHAR( + IN PUCHAR Port, + IN PUCHAR Buffer, + IN ULONG Count); + +NTHALAPI +VOID +NTAPI +READ_PORT_BUFFER_ULONG( + IN PULONG Port, + IN PULONG Buffer, + IN ULONG Count); + +NTHALAPI +VOID +NTAPI +READ_PORT_BUFFER_USHORT( + IN PUSHORT Port, + IN PUSHORT Buffer, + IN ULONG Count); + +NTHALAPI +UCHAR +NTAPI +READ_PORT_UCHAR( + IN PUCHAR Port); + +NTHALAPI +ULONG +NTAPI +READ_PORT_ULONG( + IN PULONG Port); + +NTHALAPI +USHORT +NTAPI +READ_PORT_USHORT( + IN PUSHORT Port); + +NTKERNELAPI +VOID +NTAPI +READ_REGISTER_BUFFER_UCHAR( + IN PUCHAR Register, + IN PUCHAR Buffer, + IN ULONG Count); + +NTKERNELAPI +VOID +NTAPI +READ_REGISTER_BUFFER_ULONG( + IN PULONG Register, + IN PULONG Buffer, + IN ULONG Count); + +NTKERNELAPI +VOID +NTAPI +READ_REGISTER_BUFFER_USHORT( + IN PUSHORT Register, + IN PUSHORT Buffer, + IN ULONG Count); + +NTKERNELAPI +UCHAR +NTAPI +READ_REGISTER_UCHAR( + IN PUCHAR Register); + +NTKERNELAPI +ULONG +NTAPI +READ_REGISTER_ULONG( + IN PULONG Register); + +NTKERNELAPI +USHORT +NTAPI +READ_REGISTER_USHORT( + IN PUSHORT Register); + +NTHALAPI +VOID +NTAPI +WRITE_PORT_BUFFER_UCHAR( + IN PUCHAR Port, + IN PUCHAR Buffer, + IN ULONG Count); + +NTHALAPI +VOID +NTAPI +WRITE_PORT_BUFFER_ULONG( + IN PULONG Port, + IN PULONG Buffer, + IN ULONG Count); + +NTHALAPI +VOID +NTAPI +WRITE_PORT_BUFFER_USHORT( + IN PUSHORT Port, + IN PUSHORT Buffer, + IN ULONG Count); + +NTHALAPI +VOID +NTAPI +WRITE_PORT_UCHAR( + IN PUCHAR Port, + IN UCHAR Value); + +NTHALAPI +VOID +NTAPI +WRITE_PORT_ULONG( + IN PULONG Port, + IN ULONG Value); + +NTHALAPI +VOID +NTAPI +WRITE_PORT_USHORT( + IN PUSHORT Port, + IN USHORT Value); + +NTKERNELAPI +VOID +NTAPI +WRITE_REGISTER_BUFFER_UCHAR( + IN PUCHAR Register, + IN PUCHAR Buffer, + IN ULONG Count); + +NTKERNELAPI +VOID +NTAPI +WRITE_REGISTER_BUFFER_ULONG( + IN PULONG Register, + IN PULONG Buffer, + IN ULONG Count); + +NTKERNELAPI +VOID +NTAPI +WRITE_REGISTER_BUFFER_USHORT( + IN PUSHORT Register, + IN PUSHORT Buffer, + IN ULONG Count); + +NTKERNELAPI +VOID +NTAPI +WRITE_REGISTER_UCHAR( + IN PUCHAR Register, + IN UCHAR Value); + +NTKERNELAPI +VOID +NTAPI +WRITE_REGISTER_ULONG( + IN PULONG Register, + IN ULONG Value); + +NTKERNELAPI +VOID +NTAPI +WRITE_REGISTER_USHORT( + IN PUSHORT Register, + IN USHORT Value); + +#else + +FORCEINLINE +VOID +READ_PORT_BUFFER_UCHAR( + IN PUCHAR Port, + IN PUCHAR Buffer, + IN ULONG Count) +{ + __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count); +} + +FORCEINLINE +VOID +READ_PORT_BUFFER_ULONG( + IN PULONG Port, + IN PULONG Buffer, + IN ULONG Count) +{ + __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count); +} + +FORCEINLINE +VOID +READ_PORT_BUFFER_USHORT( + IN PUSHORT Port, + IN PUSHORT Buffer, + IN ULONG Count) +{ + __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count); +} + +FORCEINLINE +UCHAR +READ_PORT_UCHAR( + IN PUCHAR Port) +{ + return __inbyte((USHORT)(ULONG_PTR)Port); +} + +FORCEINLINE +ULONG +READ_PORT_ULONG( + IN PULONG Port) +{ + return __indword((USHORT)(ULONG_PTR)Port); +} + +FORCEINLINE +USHORT +READ_PORT_USHORT( + IN PUSHORT Port) +{ + return __inword((USHORT)(ULONG_PTR)Port); +} + +FORCEINLINE +VOID +READ_REGISTER_BUFFER_UCHAR( + IN PUCHAR Register, + IN PUCHAR Buffer, + IN ULONG Count) +{ + __movsb(Register, Buffer, Count); +} + +FORCEINLINE +VOID +READ_REGISTER_BUFFER_ULONG( + IN PULONG Register, + IN PULONG Buffer, + IN ULONG Count) +{ + __movsd(Register, Buffer, Count); +} + +FORCEINLINE +VOID +READ_REGISTER_BUFFER_USHORT( + IN PUSHORT Register, + IN PUSHORT Buffer, + IN ULONG Count) +{ + __movsw(Register, Buffer, Count); +} + +FORCEINLINE +UCHAR +READ_REGISTER_UCHAR( + IN volatile UCHAR *Register) +{ + return *Register; +} + +FORCEINLINE +ULONG +READ_REGISTER_ULONG( + IN volatile ULONG *Register) +{ + return *Register; +} + +FORCEINLINE +USHORT +READ_REGISTER_USHORT( + IN volatile USHORT *Register) +{ + return *Register; +} + +FORCEINLINE +VOID +WRITE_PORT_BUFFER_UCHAR( + IN PUCHAR Port, + IN PUCHAR Buffer, + IN ULONG Count) +{ + __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count); +} + +FORCEINLINE +VOID +WRITE_PORT_BUFFER_ULONG( + IN PULONG Port, + IN PULONG Buffer, + IN ULONG Count) +{ + __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count); +} + +FORCEINLINE +VOID +WRITE_PORT_BUFFER_USHORT( + IN PUSHORT Port, + IN PUSHORT Buffer, + IN ULONG Count) +{ + __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count); +} + +FORCEINLINE +VOID +WRITE_PORT_UCHAR( + IN PUCHAR Port, + IN UCHAR Value) +{ + __outbyte((USHORT)(ULONG_PTR)Port, Value); +} + +FORCEINLINE +VOID +WRITE_PORT_ULONG( + IN PULONG Port, + IN ULONG Value) +{ + __outdword((USHORT)(ULONG_PTR)Port, Value); +} + +FORCEINLINE +VOID +WRITE_PORT_USHORT( + IN PUSHORT Port, + IN USHORT Value) +{ + __outword((USHORT)(ULONG_PTR)Port, Value); +} + +FORCEINLINE +VOID +WRITE_REGISTER_BUFFER_UCHAR( + IN PUCHAR Register, + IN PUCHAR Buffer, + IN ULONG Count) +{ + LONG Synch; + __movsb(Register, Buffer, Count); + InterlockedOr(&Synch, 1); +} + +FORCEINLINE +VOID +WRITE_REGISTER_BUFFER_ULONG( + IN PULONG Register, + IN PULONG Buffer, + IN ULONG Count) +{ + LONG Synch; + __movsd(Register, Buffer, Count); + InterlockedOr(&Synch, 1); +} + +FORCEINLINE +VOID +WRITE_REGISTER_BUFFER_USHORT( + IN PUSHORT Register, + IN PUSHORT Buffer, + IN ULONG Count) +{ + LONG Synch; + __movsw(Register, Buffer, Count); + InterlockedOr(&Synch, 1); +} + +FORCEINLINE +VOID +WRITE_REGISTER_UCHAR( + IN volatile UCHAR *Register, + IN UCHAR Value) +{ + LONG Synch; + *Register = Value; + InterlockedOr(&Synch, 1); +} + +FORCEINLINE +VOID +WRITE_REGISTER_ULONG( + IN volatile ULONG *Register, + IN ULONG Value) +{ + LONG Synch; + *Register = Value; + InterlockedOr(&Synch, 1); +} + +FORCEINLINE +VOID +WRITE_REGISTER_USHORT( + IN volatile USHORT *Register, + IN USHORT Value) +{ + LONG Sync; + *Register = Value; + InterlockedOr(&Sync, 1); +} +#endif + #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \ (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) @@ -2241,7 +8582,7 @@ MmCreateMdl( FORCEINLINE NTSTATUS IoAllocateAdapterChannel( - IN PADAPTER_OBJECT AdapterObject, + IN PDMA_ADAPTER DmaAdapter, IN PDEVICE_OBJECT DeviceObject, IN ULONG NumberOfMapRegisters, IN PDRIVER_CONTROL ExecutionRoutine, @@ -2260,8 +8601,9 @@ IoAllocateAdapterChannel( FORCEINLINE BOOLEAN +NTAPI IoFlushAdapterBuffers( - IN PADAPTER_OBJECT AdapterObject, + IN PDMA_ADAPTER DmaAdapter, IN PMDL Mdl, IN PVOID MapRegisterBase, IN PVOID CurrentVa, @@ -2281,8 +8623,9 @@ IoFlushAdapterBuffers( FORCEINLINE VOID +NTAPI IoFreeAdapterChannel( - IN PADAPTER_OBJECT AdapterObject) + IN PDMA_ADAPTER DmaAdapter) { PFREE_ADAPTER_CHANNEL FreeAdapterChannel; FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel; @@ -2292,8 +8635,9 @@ IoFreeAdapterChannel( FORCEINLINE VOID +NTAPI IoFreeMapRegisters( - IN PADAPTER_OBJECT AdapterObject, + IN PDMA_ADAPTER DmaAdapter, IN PVOID MapRegisterBase, IN ULONG NumberOfMapRegisters) { @@ -2305,6 +8649,7 @@ IoFreeMapRegisters( FORCEINLINE PHYSICAL_ADDRESS +NTAPI IoMapTransfer( IN PDMA_ADAPTER DmaAdapter, IN PMDL Mdl, @@ -2326,218 +8671,1252 @@ IoMapTransfer( } #endif +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +VOID +NTAPI +IoAcquireCancelSpinLock( + OUT PKIRQL Irql); + +NTKERNELAPI +NTSTATUS +NTAPI +IoAcquireRemoveLockEx( + IN PIO_REMOVE_LOCK RemoveLock, + IN PVOID Tag OPTIONAL, + IN PCSTR File, + IN ULONG Line, + IN ULONG RemlockSize); +#endif + +/* + * NTSTATUS + * IoAcquireRemoveLock( + * IN PIO_REMOVE_LOCK RemoveLock, + * IN OPTIONAL PVOID Tag) + */ +#if DBG +#define IoAcquireRemoveLock(RemoveLock, Tag) \ + IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK)) +#else +#define IoAcquireRemoveLock(RemoveLock, Tag) \ + IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK)) +#endif + +/* + * VOID + * IoAdjustPagingPathCount( + * IN PLONG Count, + * IN BOOLEAN Increment) + */ +#define IoAdjustPagingPathCount(_Count, \ + _Increment) \ +{ \ + if (_Increment) \ + { \ + InterlockedIncrement(_Count); \ + } \ + else \ + { \ + InterlockedDecrement(_Count); \ + } \ +} + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +NTSTATUS +NTAPI +IoAllocateDriverObjectExtension( + IN PDRIVER_OBJECT DriverObject, + IN PVOID ClientIdentificationAddress, + IN ULONG DriverObjectExtensionSize, + OUT PVOID *DriverObjectExtension); + +NTKERNELAPI +PVOID +NTAPI +IoAllocateErrorLogEntry( + IN PVOID IoObject, + IN UCHAR EntrySize); + +NTKERNELAPI +PIRP +NTAPI +IoAllocateIrp( + IN CCHAR StackSize, + IN BOOLEAN ChargeQuota); + +NTKERNELAPI +PMDL +NTAPI +IoAllocateMdl( + IN PVOID VirtualAddress OPTIONAL, + IN ULONG Length, + IN BOOLEAN SecondaryBuffer, + IN BOOLEAN ChargeQuota, + IN OUT PIRP Irp OPTIONAL); + +NTKERNELAPI +PIO_WORKITEM +NTAPI +IoAllocateWorkItem( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +NTSTATUS +NTAPI +IoAttachDevice( + IN PDEVICE_OBJECT SourceDevice, + IN PUNICODE_STRING TargetDevice, + OUT PDEVICE_OBJECT *AttachedDevice); + +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoAttachDeviceToDeviceStack( + IN PDEVICE_OBJECT SourceDevice, + IN PDEVICE_OBJECT TargetDevice); + +NTKERNELAPI +PIRP +NTAPI +IoBuildAsynchronousFsdRequest( + IN ULONG MajorFunction, + IN PDEVICE_OBJECT DeviceObject, + IN OUT PVOID Buffer OPTIONAL, + IN ULONG Length OPTIONAL, + IN PLARGE_INTEGER StartingOffset OPTIONAL, + IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL); + +NTKERNELAPI +PIRP +NTAPI +IoBuildDeviceIoControlRequest( + IN ULONG IoControlCode, + IN PDEVICE_OBJECT DeviceObject, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength, + IN BOOLEAN InternalDeviceIoControl, + IN PKEVENT Event, + OUT PIO_STATUS_BLOCK IoStatusBlock); + +NTKERNELAPI +VOID +NTAPI +IoBuildPartialMdl( + IN PMDL SourceMdl, + IN OUT PMDL TargetMdl, + IN PVOID VirtualAddress, + IN ULONG Length); + +NTKERNELAPI +PIRP +NTAPI +IoBuildSynchronousFsdRequest( + IN ULONG MajorFunction, + IN PDEVICE_OBJECT DeviceObject, + IN OUT PVOID Buffer OPTIONAL, + IN ULONG Length OPTIONAL, + IN PLARGE_INTEGER StartingOffset OPTIONAL, + IN PKEVENT Event, + OUT PIO_STATUS_BLOCK IoStatusBlock); + +NTKERNELAPI +NTSTATUS +FASTCALL +IofCallDriver( + IN PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp); +#define IoCallDriver IofCallDriver + +NTKERNELAPI +VOID +FASTCALL +IofCompleteRequest( + IN PIRP Irp, + IN CCHAR PriorityBoost); +#define IoCompleteRequest IofCompleteRequest + +NTKERNELAPI +BOOLEAN +NTAPI +IoCancelIrp( + IN PIRP Irp); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCheckShareAccess( + IN ACCESS_MASK DesiredAccess, + IN ULONG DesiredShareAccess, + IN OUT PFILE_OBJECT FileObject, + IN OUT PSHARE_ACCESS ShareAccess, + IN BOOLEAN Update); + +NTKERNELAPI +VOID +FASTCALL +IofCompleteRequest( + IN PIRP Irp, + IN CCHAR PriorityBoost); + +NTKERNELAPI +NTSTATUS +NTAPI +IoConnectInterrupt( + OUT PKINTERRUPT *InterruptObject, + IN PKSERVICE_ROUTINE ServiceRoutine, + IN PVOID ServiceContext OPTIONAL, + IN PKSPIN_LOCK SpinLock OPTIONAL, + IN ULONG Vector, + IN KIRQL Irql, + IN KIRQL SynchronizeIrql, + IN KINTERRUPT_MODE InterruptMode, + IN BOOLEAN ShareVector, + IN KAFFINITY ProcessorEnableMask, + IN BOOLEAN FloatingSave); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCreateDevice( + IN PDRIVER_OBJECT DriverObject, + IN ULONG DeviceExtensionSize, + IN PUNICODE_STRING DeviceName OPTIONAL, + IN DEVICE_TYPE DeviceType, + IN ULONG DeviceCharacteristics, + IN BOOLEAN Exclusive, + OUT PDEVICE_OBJECT *DeviceObject); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCreateFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG Disposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer OPTIONAL, + IN ULONG EaLength, + IN CREATE_FILE_TYPE CreateFileType, + IN PVOID InternalParameters OPTIONAL, + IN ULONG Options); + +NTKERNELAPI +PKEVENT +NTAPI +IoCreateNotificationEvent( + IN PUNICODE_STRING EventName, + OUT PHANDLE EventHandle); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCreateSymbolicLink( + IN PUNICODE_STRING SymbolicLinkName, + IN PUNICODE_STRING DeviceName); + +NTKERNELAPI +PKEVENT +NTAPI +IoCreateSynchronizationEvent( + IN PUNICODE_STRING EventName, + OUT PHANDLE EventHandle); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCreateUnprotectedSymbolicLink( + IN PUNICODE_STRING SymbolicLinkName, + IN PUNICODE_STRING DeviceName); + +NTKERNELAPI +VOID +NTAPI +IoDeleteDevice( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +NTSTATUS +NTAPI +IoDeleteSymbolicLink( + IN PUNICODE_STRING SymbolicLinkName); + +NTKERNELAPI +VOID +NTAPI +IoDetachDevice( + IN OUT PDEVICE_OBJECT TargetDevice); + +NTKERNELAPI +VOID +NTAPI +IoDisconnectInterrupt( + IN PKINTERRUPT InterruptObject); + +NTKERNELAPI +VOID +NTAPI +IoFreeIrp( + IN PIRP Irp); + +NTKERNELAPI +VOID +NTAPI +IoFreeMdl( + IN PMDL Mdl); + +NTKERNELAPI +VOID +NTAPI +IoFreeWorkItem( + IN PIO_WORKITEM IoWorkItem); + +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoGetAttachedDevice( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoGetAttachedDeviceReference( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetBootDiskInformation( + IN OUT PBOOTDISK_INFORMATION BootDiskInformation, + IN ULONG Size); + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetDeviceInterfaceAlias( + IN PUNICODE_STRING SymbolicLinkName, + IN CONST GUID *AliasInterfaceClassGuid, + OUT PUNICODE_STRING AliasSymbolicLinkName); + +NTKERNELAPI +PEPROCESS +NTAPI +IoGetCurrentProcess( + VOID); + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetDeviceInterfaces( + IN CONST GUID *InterfaceClassGuid, + IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, + IN ULONG Flags, + OUT PWSTR *SymbolicLinkList); + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetDeviceObjectPointer( + IN PUNICODE_STRING ObjectName, + IN ACCESS_MASK DesiredAccess, + OUT PFILE_OBJECT *FileObject, + OUT PDEVICE_OBJECT *DeviceObject); + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetDeviceProperty( + IN PDEVICE_OBJECT DeviceObject, + IN DEVICE_REGISTRY_PROPERTY DeviceProperty, + IN ULONG BufferLength, + OUT PVOID PropertyBuffer, + OUT PULONG ResultLength); + +NTKERNELAPI +PDMA_ADAPTER +NTAPI +IoGetDmaAdapter( + IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, + IN PDEVICE_DESCRIPTION DeviceDescription, + IN OUT PULONG NumberOfMapRegisters); + +NTKERNELAPI +PVOID +NTAPI +IoGetDriverObjectExtension( + IN PDRIVER_OBJECT DriverObject, + IN PVOID ClientIdentificationAddress); + +NTKERNELAPI +PVOID +NTAPI +IoGetInitialStack( + VOID); + +NTKERNELAPI +PDEVICE_OBJECT +NTAPI +IoGetRelatedDeviceObject( + IN PFILE_OBJECT FileObject); + +NTKERNELAPI +VOID +NTAPI +IoQueueWorkItem( + IN PIO_WORKITEM IoWorkItem, + IN PIO_WORKITEM_ROUTINE WorkerRoutine, + IN WORK_QUEUE_TYPE QueueType, + IN PVOID Context OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +IoInitializeIrp( + IN OUT PIRP Irp, + IN USHORT PacketSize, + IN CCHAR StackSize); + +NTKERNELAPI +VOID +NTAPI +IoInitializeRemoveLockEx( + IN PIO_REMOVE_LOCK Lock, + IN ULONG AllocateTag, + IN ULONG MaxLockedMinutes, + IN ULONG HighWatermark, + IN ULONG RemlockSize); + +NTKERNELAPI +NTSTATUS +NTAPI +IoInitializeTimer( + IN PDEVICE_OBJECT DeviceObject, + IN PIO_TIMER_ROUTINE TimerRoutine, + IN PVOID Context OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +IoInvalidateDeviceRelations( + IN PDEVICE_OBJECT DeviceObject, + IN DEVICE_RELATION_TYPE Type); + +NTKERNELAPI +VOID +NTAPI +IoInvalidateDeviceState( + IN PDEVICE_OBJECT PhysicalDeviceObject); + +NTKERNELAPI +BOOLEAN +NTAPI +IoIsWdmVersionAvailable( + IN UCHAR MajorVersion, + IN UCHAR MinorVersion); + +NTKERNELAPI +NTSTATUS +NTAPI +IoOpenDeviceInterfaceRegistryKey( + IN PUNICODE_STRING SymbolicLinkName, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE DeviceInterfaceKey); + +NTKERNELAPI +NTSTATUS +NTAPI +IoOpenDeviceRegistryKey( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG DevInstKeyType, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE DevInstRegKey); + +NTKERNELAPI +NTSTATUS +NTAPI +IoRegisterDeviceInterface( + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN CONST GUID *InterfaceClassGuid, + IN PUNICODE_STRING ReferenceString OPTIONAL, + OUT PUNICODE_STRING SymbolicLinkName); + +NTKERNELAPI +NTSTATUS +NTAPI +IoRegisterPlugPlayNotification( + IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory, + IN ULONG EventCategoryFlags, + IN PVOID EventCategoryData OPTIONAL, + IN PDRIVER_OBJECT DriverObject, + IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine, + IN OUT PVOID Context OPTIONAL, + OUT PVOID *NotificationEntry); + +NTKERNELAPI +NTSTATUS +NTAPI +IoRegisterShutdownNotification( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +VOID +NTAPI +IoReleaseCancelSpinLock( + IN KIRQL Irql); + +NTKERNELAPI +VOID +NTAPI +IoReleaseRemoveLockAndWaitEx( + IN PIO_REMOVE_LOCK RemoveLock, + IN PVOID Tag OPTIONAL, + IN ULONG RemlockSize); + +NTKERNELAPI +VOID +NTAPI +IoReleaseRemoveLockEx( + IN PIO_REMOVE_LOCK RemoveLock, + IN PVOID Tag OPTIONAL, + IN ULONG RemlockSize); + +NTKERNELAPI +VOID +NTAPI +IoRemoveShareAccess( + IN PFILE_OBJECT FileObject, + IN OUT PSHARE_ACCESS ShareAccess); + +NTKERNELAPI +NTSTATUS +NTAPI +IoReportTargetDeviceChange( + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PVOID NotificationStructure); + +NTKERNELAPI +NTSTATUS +NTAPI +IoReportTargetDeviceChangeAsynchronous( + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PVOID NotificationStructure, + IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL, + IN PVOID Context OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +IoRequestDeviceEject( + IN PDEVICE_OBJECT PhysicalDeviceObject); + +NTKERNELAPI +VOID +NTAPI +IoReuseIrp( + IN OUT PIRP Irp, + IN NTSTATUS Status); + +NTKERNELAPI +NTSTATUS +NTAPI +IoSetDeviceInterfaceState( + IN PUNICODE_STRING SymbolicLinkName, + IN BOOLEAN Enable); + +NTKERNELAPI +VOID +NTAPI +IoSetShareAccess( + IN ACCESS_MASK DesiredAccess, + IN ULONG DesiredShareAccess, + IN OUT PFILE_OBJECT FileObject, + OUT PSHARE_ACCESS ShareAccess); + +NTKERNELAPI +VOID +NTAPI +IoStartNextPacket( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN Cancelable); + +NTKERNELAPI +VOID +NTAPI +IoStartNextPacketByKey( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN Cancelable, + IN ULONG Key); + +NTKERNELAPI +VOID +NTAPI +IoStartPacket( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PULONG Key OPTIONAL, + IN PDRIVER_CANCEL CancelFunction OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +IoStartTimer( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +VOID +NTAPI +IoStopTimer( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +NTSTATUS +NTAPI +IoUnregisterPlugPlayNotification( + IN PVOID NotificationEntry); + +NTKERNELAPI +VOID +NTAPI +IoUnregisterShutdownNotification( + IN PDEVICE_OBJECT DeviceObject); + +NTKERNELAPI +VOID +NTAPI +IoUpdateShareAccess( + IN PFILE_OBJECT FileObject, + IN OUT PSHARE_ACCESS ShareAccess); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWMIAllocateInstanceIds( + IN GUID *Guid, + IN ULONG InstanceCount, + OUT ULONG *FirstInstanceId); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWMIQuerySingleInstanceMultiple( + IN PVOID *DataBlockObjectList, + IN PUNICODE_STRING InstanceNames, + IN ULONG ObjectCount, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWMIRegistrationControl( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG Action); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWMISuggestInstanceName( + IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, + IN PUNICODE_STRING SymbolicLinkName OPTIONAL, + IN BOOLEAN CombineNames, + OUT PUNICODE_STRING SuggestedInstanceName); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWMIWriteEvent( + IN PVOID WnodeEventItem); + +NTKERNELAPI +VOID +NTAPI +IoWriteErrorLogEntry( + IN PVOID ElEntry); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTKERNELAPI +NTSTATUS +NTAPI +IoCsqInitialize( + IN PIO_CSQ Csq, + IN PIO_CSQ_INSERT_IRP CsqInsertIrp, + IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp, + IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, + IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, + IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock, + IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp); + +NTKERNELAPI +VOID +NTAPI +IoCsqInsertIrp( + IN PIO_CSQ Csq, + IN PIRP Irp, + IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL); + +NTKERNELAPI +PIRP +NTAPI +IoCsqRemoveIrp( + IN PIO_CSQ Csq, + IN PIO_CSQ_IRP_CONTEXT Context); + +NTKERNELAPI +PIRP +NTAPI +IoCsqRemoveNextIrp( + IN PIO_CSQ Csq, + IN PVOID PeekContext); + +NTKERNELAPI +BOOLEAN +NTAPI +IoForwardIrpSynchronously( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + +#define IoForwardAndCatchIrp IoForwardIrpSynchronously + +NTKERNELAPI +VOID +NTAPI +IoFreeErrorLogEntry( + PVOID ElEntry); + +NTKERNELAPI +NTSTATUS +NTAPI +IoSetCompletionRoutineEx( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PIO_COMPLETION_ROUTINE CompletionRoutine, + IN PVOID Context, + IN BOOLEAN InvokeOnSuccess, + IN BOOLEAN InvokeOnError, + IN BOOLEAN InvokeOnCancel); + +VOID +NTAPI +IoSetStartIoAttributes( + IN PDEVICE_OBJECT DeviceObject, + IN BOOLEAN DeferredStartIo, + IN BOOLEAN NonCancelable); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWMIDeviceObjectToInstanceName( + IN PVOID DataBlockObject, + IN PDEVICE_OBJECT DeviceObject, + OUT PUNICODE_STRING InstanceName); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWMIExecuteMethod( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN ULONG MethodId, + IN ULONG InBufferSize, + IN OUT PULONG OutBufferSize, + IN OUT PUCHAR InOutBuffer); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWMIHandleToInstanceName( + IN PVOID DataBlockObject, + IN HANDLE FileHandle, + OUT PUNICODE_STRING InstanceName); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWMIOpenBlock( + IN GUID *DataBlockGuid, + IN ULONG DesiredAccess, + OUT PVOID *DataBlockObject); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWMIQueryAllData( + IN PVOID DataBlockObject, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWMIQueryAllDataMultiple( + IN PVOID *DataBlockObjectList, + IN ULONG ObjectCount, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWMIQuerySingleInstance( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN OUT ULONG *InOutBufferSize, + OUT PVOID OutBuffer); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWMISetNotificationCallback( + IN OUT PVOID Object, + IN WMI_NOTIFICATION_CALLBACK Callback, + IN PVOID Context OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWMISetSingleInstance( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN ULONG Version, + IN ULONG ValueBufferSize, + IN PVOID ValueBuffer); + +NTKERNELAPI +NTSTATUS +NTAPI +IoWMISetSingleItem( + IN PVOID DataBlockObject, + IN PUNICODE_STRING InstanceName, + IN ULONG DataItemId, + IN ULONG Version, + IN ULONG ValueBufferSize, + IN PVOID ValueBuffer); + +#endif + +#if defined(_WIN64) +NTKERNELAPI +ULONG +NTAPI +IoWMIDeviceObjectToProviderId( + IN PDEVICE_OBJECT DeviceObject); +#else +#define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject)) +#endif + +/* + * USHORT + * IoSizeOfIrp( + * IN CCHAR StackSize) + */ +#define IoSizeOfIrp(_StackSize) \ + ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION))))) + +FORCEINLINE +VOID +IoSkipCurrentIrpStackLocation ( + IN OUT PIRP Irp) +{ + ASSERT(Irp->CurrentLocation <= Irp->StackCount); + Irp->CurrentLocation++; + Irp->Tail.Overlay.CurrentStackLocation++; +} + +FORCEINLINE +VOID +IoSetNextIrpStackLocation ( + IN OUT PIRP Irp) +{ + ASSERT(Irp->CurrentLocation > 0); + Irp->CurrentLocation--; + Irp->Tail.Overlay.CurrentStackLocation--; +} + +FORCEINLINE +PIO_STACK_LOCATION +IoGetNextIrpStackLocation( + IN PIRP Irp) +{ + ASSERT(Irp->CurrentLocation > 0); + return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 ); +} + +FORCEINLINE +VOID +IoSetCompletionRoutine( + IN PIRP Irp, + IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL, + IN PVOID Context OPTIONAL, + IN BOOLEAN InvokeOnSuccess, + IN BOOLEAN InvokeOnError, + IN BOOLEAN InvokeOnCancel) +{ + PIO_STACK_LOCATION irpSp; + ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE ); + irpSp = IoGetNextIrpStackLocation(Irp); + irpSp->CompletionRoutine = CompletionRoutine; + irpSp->Context = Context; + irpSp->Control = 0; + + if (InvokeOnSuccess) { + irpSp->Control = SL_INVOKE_ON_SUCCESS; + } + + if (InvokeOnError) { + irpSp->Control |= SL_INVOKE_ON_ERROR; + } + + if (InvokeOnCancel) { + irpSp->Control |= SL_INVOKE_ON_CANCEL; + } +} + +/* + * PDRIVER_CANCEL + * IoSetCancelRoutine( + * IN PIRP Irp, + * IN PDRIVER_CANCEL CancelRoutine) + */ +#define IoSetCancelRoutine(_Irp, \ + _CancelRoutine) \ + ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \ + (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine))) + +/* + * VOID + * IoRequestDpc( + * IN PDEVICE_OBJECT DeviceObject, + * IN PIRP Irp, + * IN PVOID Context); + */ +#define IoRequestDpc(DeviceObject, Irp, Context)( \ + KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context))) + +/* + * VOID + * IoReleaseRemoveLock( + * IN PIO_REMOVE_LOCK RemoveLock, + * IN PVOID Tag) + */ +#define IoReleaseRemoveLock(_RemoveLock, \ + _Tag) \ + IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK)) + +/* + * VOID + * IoReleaseRemoveLockAndWait( + * IN PIO_REMOVE_LOCK RemoveLock, + * IN PVOID Tag) + */ +#define IoReleaseRemoveLockAndWait(_RemoveLock, \ + _Tag) \ + IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK)) + +#if defined(_WIN64) + +NTKERNELAPI +BOOLEAN +IoIs32bitProcess( + IN PIRP Irp OPTIONAL); + +#endif + +#define PLUGPLAY_REGKEY_DEVICE 1 +#define PLUGPLAY_REGKEY_DRIVER 2 +#define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4 + +FORCEINLINE +PIO_STACK_LOCATION +IoGetCurrentIrpStackLocation( + IN PIRP Irp) +{ + ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1); + return Irp->Tail.Overlay.CurrentStackLocation; +} + +FORCEINLINE +VOID +IoMarkIrpPending( + IN OUT PIRP Irp) +{ + IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED; +} + +/* + * BOOLEAN + * IoIsErrorUserInduced( + * IN NTSTATUS Status); + */ +#define IoIsErrorUserInduced(Status) \ + ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \ + ((Status) == STATUS_IO_TIMEOUT) || \ + ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \ + ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \ + ((Status) == STATUS_VERIFY_REQUIRED) || \ + ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \ + ((Status) == STATUS_WRONG_VOLUME))) + +/* VOID + * IoInitializeRemoveLock( + * IN PIO_REMOVE_LOCK Lock, + * IN ULONG AllocateTag, + * IN ULONG MaxLockedMinutes, + * IN ULONG HighWatermark) + */ +#define IoInitializeRemoveLock( \ + Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \ + IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \ + HighWatermark, sizeof(IO_REMOVE_LOCK)) + +VOID +FORCEINLINE +IoInitializeDpcRequest( + IN PDEVICE_OBJECT DeviceObject, + IN PIO_DPC_ROUTINE DpcRoutine) +{ + KeInitializeDpc( &DeviceObject->Dpc, + (PKDEFERRED_ROUTINE) DpcRoutine, + DeviceObject ); +} + +#define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001 + +/* + * ULONG + * IoGetFunctionCodeFromCtlCode( + * IN ULONG ControlCode) + */ +#define IoGetFunctionCodeFromCtlCode(_ControlCode) \ + (((_ControlCode) >> 2) & 0x00000FFF) + +FORCEINLINE +VOID +IoCopyCurrentIrpStackLocationToNext( + IN PIRP Irp) +{ + PIO_STACK_LOCATION irpSp; + PIO_STACK_LOCATION nextIrpSp; + irpSp = IoGetCurrentIrpStackLocation(Irp); + nextIrpSp = IoGetNextIrpStackLocation(Irp); + RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); + nextIrpSp->Control = 0; +} + +NTKERNELAPI +VOID +NTAPI +IoGetStackLimits( + OUT PULONG_PTR LowLimit, + OUT PULONG_PTR HighLimit); + +FORCEINLINE +ULONG_PTR +IoGetRemainingStackSize( + VOID) +{ + ULONG_PTR End, Begin; + ULONG_PTR Result; + + IoGetStackLimits(&Begin, &End); + Result = (ULONG_PTR)(&End) - Begin; + return Result; +} /****************************************************************************** - * Executive Types * + * Power Management Support Functions * ******************************************************************************/ -typedef enum _POOL_TYPE { - NonPagedPool, - PagedPool, - NonPagedPoolMustSucceed, - DontUseThisType, - NonPagedPoolCacheAligned, - PagedPoolCacheAligned, - NonPagedPoolCacheAlignedMustS, - MaxPoolType, - NonPagedPoolSession = 32, - PagedPoolSession, - NonPagedPoolMustSucceedSession, - DontUseThisTypeSession, - NonPagedPoolCacheAlignedSession, - PagedPoolCacheAlignedSession, - NonPagedPoolCacheAlignedMustSSession -} POOL_TYPE; +#define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0)) -typedef enum _SUITE_TYPE { - SmallBusiness, - Enterprise, - BackOffice, - CommunicationServer, - TerminalServer, - SmallBusinessRestricted, - EmbeddedNT, - DataCenter, - SingleUserTS, - Personal, - Blade, - MaxSuiteType -} SUITE_TYPE; +#if (NTDDI_VERSION >= NTDDI_WIN2K) -typedef enum _EX_POOL_PRIORITY { - LowPoolPriority, - LowPoolPrioritySpecialPoolOverrun = 8, - LowPoolPrioritySpecialPoolUnderrun = 9, - NormalPoolPriority = 16, - NormalPoolPrioritySpecialPoolOverrun = 24, - NormalPoolPrioritySpecialPoolUnderrun = 25, - HighPoolPriority = 32, - HighPoolPrioritySpecialPoolOverrun = 40, - HighPoolPrioritySpecialPoolUnderrun = 41 -} EX_POOL_PRIORITY; +NTKERNELAPI +NTSTATUS +NTAPI +PoCallDriver( + IN struct _DEVICE_OBJECT *DeviceObject, + IN OUT struct _IRP *Irp); -typedef struct _FAST_MUTEX -{ - LONG Count; - PKTHREAD Owner; - ULONG Contention; - KEVENT Gate; - ULONG OldIrql; -} FAST_MUTEX, *PFAST_MUTEX; +NTKERNELAPI +PULONG +NTAPI +PoRegisterDeviceForIdleDetection( + IN struct _DEVICE_OBJECT *DeviceObject, + IN ULONG ConservationIdleTime, + IN ULONG PerformanceIdleTime, + IN DEVICE_POWER_STATE State); -typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD; +NTKERNELAPI +PVOID +NTAPI +PoRegisterSystemState( + IN OUT PVOID StateHandle OPTIONAL, + IN EXECUTION_STATE Flags); -typedef struct _OWNER_ENTRY { - ERESOURCE_THREAD OwnerThread; - _ANONYMOUS_UNION union { - LONG OwnerCount; - ULONG TableSize; - } DUMMYUNIONNAME; -} OWNER_ENTRY, *POWNER_ENTRY; +NTKERNELAPI +NTSTATUS +NTAPI +PoRequestPowerIrp( + IN struct _DEVICE_OBJECT *DeviceObject, + IN UCHAR MinorFunction, + IN POWER_STATE PowerState, + IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL, + IN PVOID Context OPTIONAL, + OUT struct _IRP **Irp OPTIONAL); -typedef struct _ERESOURCE -{ - LIST_ENTRY SystemResourcesList; - POWNER_ENTRY OwnerTable; - SHORT ActiveCount; - USHORT Flag; - volatile PKSEMAPHORE SharedWaiters; - volatile PKEVENT ExclusiveWaiters; - OWNER_ENTRY OwnerEntry; - ULONG ActiveEntries; - ULONG ContentionCount; - ULONG NumberOfSharedWaiters; - ULONG NumberOfExclusiveWaiters; - union - { - PVOID Address; - ULONG_PTR CreatorBackTraceIndex; - }; - KSPIN_LOCK SpinLock; -} ERESOURCE, *PERESOURCE; +NTKERNELAPI +POWER_STATE +NTAPI +PoSetPowerState( + IN struct _DEVICE_OBJECT *DeviceObject, + IN POWER_STATE_TYPE Type, + IN POWER_STATE State); -#if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_)) -#define LOOKASIDE_ALIGN -#else -#define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */ -#endif +NTKERNELAPI +VOID +NTAPI +PoSetSystemState( + IN EXECUTION_STATE Flags); -typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX; +NTKERNELAPI +VOID +NTAPI +PoStartNextPowerIrp( + IN OUT struct _IRP *Irp); -typedef PVOID -(DDKAPI *PALLOCATE_FUNCTION)( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag); +NTKERNELAPI +VOID +NTAPI +PoUnregisterSystemState( + IN OUT PVOID StateHandle); -typedef PVOID -(DDKAPI *PALLOCATE_FUNCTION_EX)( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag, - IN OUT PLOOKASIDE_LIST_EX Lookaside); +NTKERNELAPI +NTSTATUS +NTAPI +PoRequestShutdownEvent( + OUT PVOID *Event); -typedef VOID -(DDKAPI *PFREE_FUNCTION)( - IN PVOID Buffer); +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ -typedef VOID -(DDKAPI *PFREE_FUNCTION_EX)( - IN PVOID Buffer, - IN OUT PLOOKASIDE_LIST_EX Lookaside); +#if (NTDDI_VERSION >= NTDDI_VISTA) -typedef VOID -(DDKAPI *PCALLBACK_FUNCTION)( - IN PVOID CallbackContext, - IN PVOID Argument1, - IN PVOID Argument2); +NTKERNELAPI +VOID +NTAPI +PoSetSystemWake( + IN OUT struct _IRP *Irp); -typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE { - union { - SLIST_HEADER ListHead; - SINGLE_LIST_ENTRY SingleListHead; - } DUMMYUNIONNAME; - USHORT Depth; - USHORT MaximumDepth; - ULONG TotalAllocates; - union { - ULONG AllocateMisses; - ULONG AllocateHits; - } DUMMYUNIONNAME2; - ULONG TotalFrees; - union { - ULONG FreeMisses; - ULONG FreeHits; - } DUMMYUNIONNAME3; - POOL_TYPE Type; - ULONG Tag; - ULONG Size; - union { - PALLOCATE_FUNCTION_EX AllocateEx; - PALLOCATE_FUNCTION Allocate; - } DUMMYUNIONNAME4; - union { - PFREE_FUNCTION_EX FreeEx; - PFREE_FUNCTION Free; - } DUMMYUNIONNAME5; - LIST_ENTRY ListEntry; - ULONG LastTotalAllocates; - union { - ULONG LastAllocateMisses; - ULONG LastAllocateHits; - } DUMMYUNIONNAME6; - ULONG Future[2]; -} GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE; +NTKERNELAPI +BOOLEAN +NTAPI +PoGetSystemWake( + IN struct _IRP *Irp); -typedef struct _PAGED_LOOKASIDE_LIST { - GENERAL_LOOKASIDE L; -#if !defined(_AMD64_) && !defined(_IA64_) - FAST_MUTEX Lock__ObsoleteButDoNotDelete; -#endif -} PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST; +NTKERNELAPI +NTSTATUS +NTAPI +PoRegisterPowerSettingCallback( + IN PDEVICE_OBJECT DeviceObject OPTIONAL, + IN LPCGUID SettingGuid, + IN PPOWER_SETTING_CALLBACK Callback, + IN PVOID Context OPTIONAL, + OUT PVOID *Handle OPTIONAL); -typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST { - GENERAL_LOOKASIDE L; -#if !defined(_AMD64_) && !defined(_IA64_) - KSPIN_LOCK Lock__ObsoleteButDoNotDelete; -#endif -} NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST; +NTKERNELAPI +NTSTATUS +NTAPI +PoUnregisterPowerSettingCallback( + IN OUT PVOID Handle); -//typedef struct _LOOKASIDE_LIST_EX { -// GENERAL_LOOKASIDE_POOL L; -//} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX; +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ -typedef struct _EX_RUNDOWN_REF { - union { - volatile ULONG_PTR Count; - volatile PVOID Ptr; - }; -} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF; +#if (NTDDI_VERSION >= NTDDI_VISTASP1) -typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE; +NTKERNELAPI +VOID +NTAPI +PoSetDeviceBusyEx( + IN OUT PULONG IdlePointer); -typedef enum _WORK_QUEUE_TYPE { - CriticalWorkQueue, - DelayedWorkQueue, - HyperCriticalWorkQueue, - MaximumWorkQueue -} WORK_QUEUE_TYPE; +#endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */ -typedef VOID -(DDKAPI *PWORKER_THREAD_ROUTINE)( - IN PVOID Parameter); +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTKERNELAPI +VOID +NTAPI +PoStartDeviceBusy( + IN OUT PULONG IdlePointer); -typedef struct _WORK_QUEUE_ITEM { - LIST_ENTRY List; - PWORKER_THREAD_ROUTINE WorkerRoutine; - volatile PVOID Parameter; -} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM; +NTKERNELAPI +VOID +NTAPI +PoEndDeviceBusy( + IN OUT PULONG IdlePointer); +NTKERNELAPI +BOOLEAN +NTAPI +PoQueryWatchdogTime( + IN PDEVICE_OBJECT Pdo, + OUT PULONG SecondsRemaining); + +NTKERNELAPI +VOID +NTAPI +PoDeletePowerRequest( + IN OUT PVOID PowerRequest); + +NTKERNELAPI +NTSTATUS +NTAPI +PoSetPowerRequest( + IN OUT PVOID PowerRequest, + IN POWER_REQUEST_TYPE Type); + +NTKERNELAPI +NTSTATUS +NTAPI +PoClearPowerRequest( + IN OUT PVOID PowerRequest, + IN POWER_REQUEST_TYPE Type); + +NTKERNELAPI +NTSTATUS +NTAPI +PoCreatePowerRequest( + OUT PVOID *PowerRequest, + IN PDEVICE_OBJECT DeviceObject, + IN PCOUNTED_REASON_CONTEXT Context); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ /****************************************************************************** * Executive Functions * ******************************************************************************/ +#define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend) +#define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend) +#define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value) + +#define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql)) +#define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql)) +#define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock) +#define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock) + +#define ExInitializeSListHead InitializeSListHead + #if defined(_X86_) #if defined(_NTHAL_) #define ExAcquireFastMutex ExiAcquireFastMutex @@ -2646,6 +10025,18 @@ ExInterlockedPushEntrySList( (Item)->List.Flink = NULL; \ } +FORCEINLINE +VOID +ExInitializeFastMutex( + OUT PFAST_MUTEX FastMutex) +{ + FastMutex->Count = FM_LOCK_BIT; + FastMutex->Owner = NULL; + FastMutex->Contention = 0; + KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE); + return; +} + #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -3108,26 +10499,24 @@ ExReleaseRundownProtectionEx( IN ULONG Count); #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2) -#if (NTDDI_VERSION >= NTDDI_WS03) - -#endif // (NTDDI_VERSION >= NTDDI_WS03) - #if (NTDDI_VERSION >= NTDDI_WS03SP1) NTKERNELAPI PEX_RUNDOWN_REF_CACHE_AWARE +NTAPI ExAllocateCacheAwareRundownProtection( IN POOL_TYPE PoolType, IN ULONG PoolTag); NTKERNELAPI SIZE_T +NTAPI ExSizeOfRundownProtectionCacheAware(VOID); - #endif // (NTDDI_VERSION >= NTDDI_WS03SP1) #if (NTDDI_VERSION >= NTDDI_VISTA) NTKERNELAPI NTSTATUS +NTAPI ExInitializeLookasideListEx( OUT PLOOKASIDE_LIST_EX Lookaside, IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL, @@ -3139,7 +10528,6 @@ ExInitializeLookasideListEx( IN USHORT Depth); #endif - #if !defined(MIDL_PASS) static __inline PVOID @@ -3204,12 +10592,1184 @@ ExFreeToPagedLookasideList( } } - #endif // !defined(MIDL_PASS) +/****************************************************************************** + * Object Manager Functions * + ******************************************************************************/ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +LONG_PTR +FASTCALL +ObfDereferenceObject( + IN PVOID Object); +#define ObDereferenceObject ObfDereferenceObject + +NTKERNELAPI +NTSTATUS +NTAPI +ObGetObjectSecurity( + IN PVOID Object, + OUT PSECURITY_DESCRIPTOR *SecurityDescriptor, + OUT PBOOLEAN MemoryAllocated); + +NTKERNELAPI +LONG_PTR +FASTCALL +ObfReferenceObject( + IN PVOID Object); +#define ObReferenceObject ObfReferenceObject + +NTKERNELAPI +NTSTATUS +NTAPI +ObReferenceObjectByHandle( + IN HANDLE Handle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_TYPE ObjectType OPTIONAL, + IN KPROCESSOR_MODE AccessMode, + OUT PVOID *Object, + OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +ObReferenceObjectByPointer( + IN PVOID Object, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_TYPE ObjectType OPTIONAL, + IN KPROCESSOR_MODE AccessMode); + +NTKERNELAPI +VOID +NTAPI +ObReleaseObjectSecurity( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN BOOLEAN MemoryAllocated); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +/****************************************************************************** + * Process Manager Functions * + ******************************************************************************/ + +/* + * PEPROCESS + * PsGetCurrentProcess(VOID) + */ +#define PsGetCurrentProcess IoGetCurrentProcess + +#if !defined(_PSGETCURRENTTHREAD_) + +#define _PSGETCURRENTTHREAD_ + +FORCEINLINE +PETHREAD +NTAPI +PsGetCurrentThread ( + VOID) +{ + return (PETHREAD)KeGetCurrentThread(); +} + +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +NTSTATUS +NTAPI +PsCreateSystemThread( + OUT PHANDLE ThreadHandle, + IN ULONG DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN HANDLE ProcessHandle OPTIONAL, + OUT PCLIENT_ID ClientId OPTIONAL, + IN PKSTART_ROUTINE StartRoutine, + IN PVOID StartContext OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +PsTerminateSystemThread( + IN NTSTATUS ExitStatus); + +#endif + +/****************************************************************************** + * WMI Library Support Functions * + ******************************************************************************/ + +#ifdef RUN_WPP + +#if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +NTSTATUS +DDKCDECLAPI +WmiTraceMessage( + IN TRACEHANDLE LoggerHandle, + IN ULONG MessageFlags, + IN LPGUID MessageGuid, + IN USHORT MessageNumber, + IN ...); +#endif + +#endif + + #if (NTDDI_VERSION >= NTDDI_WINXP) + +NTKERNELAPI +NTSTATUS +NTAPI +WmiQueryTraceInformation( + IN TRACE_INFORMATION_CLASS TraceInformationClass, + OUT PVOID TraceInformation, + IN ULONG TraceInformationLength, + OUT PULONG RequiredLength OPTIONAL, + IN PVOID Buffer OPTIONAL); + +#if 0 +/* FIXME: Get va_list from where? */ +NTKERNELAPI +NTSTATUS +DDKCDECLAPI +WmiTraceMessageVa( + IN TRACEHANDLE LoggerHandle, + IN ULONG MessageFlags, + IN LPGUID MessageGuid, + IN USHORT MessageNumber, + IN va_list MessageArgList); +#endif + +#endif + +/****************************************************************************** + * Kernel Debugger Functions * + ******************************************************************************/ + +#ifndef _DBGNT_ +ULONG +DDKCDECLAPI +DbgPrint( + IN PCSTR Format, + IN ...); +#endif + +#if DBG + +#define KdPrint(_x_) DbgPrint _x_ +#define KdPrintEx(_x_) DbgPrintEx _x_ +#define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_ +#define KdBreakPoint() DbgBreakPoint() +#define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s) + +#else /* !DBG */ + +#define KdPrint(_x_) +#define KdPrintEx(_x_) +#define vKdPrintExWithPrefix(_x_) +#define KdBreakPoint() +#define KdBreakPointWithStatus(s) + +#endif /* !DBG */ + +#if defined(__GNUC__) + +extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent; +extern NTKERNELAPI BOOLEAN KdDebuggerEnabled; +#define KD_DEBUGGER_ENABLED KdDebuggerEnabled +#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent + +#elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_) + +extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent; +extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled; +#define KD_DEBUGGER_ENABLED *KdDebuggerEnabled +#define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent + +#else + +extern BOOLEAN KdDebuggerNotPresent; +extern BOOLEAN KdDebuggerEnabled; +#define KD_DEBUGGER_ENABLED KdDebuggerEnabled +#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent + +#endif + +#ifdef _VA_LIST_DEFINED +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTSYSAPI +ULONG +NTAPI +vDbgPrintEx( + IN ULONG ComponentId, + IN ULONG Level, + IN PCCH Format, + IN va_list ap); + +NTSYSAPI +ULONG +NTAPI +vDbgPrintExWithPrefix( + IN PCCH Prefix, + IN ULONG ComponentId, + IN ULONG Level, + IN PCCH Format, + IN va_list ap); + +#endif +#endif // _VA_LIST_DEFINED + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +NTSTATUS +NTAPI +KdDisableDebugger( + VOID); + +NTKERNELAPI +NTSTATUS +NTAPI +KdEnableDebugger( + VOID); + +#if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK) +#define DbgBreakPoint __debugbreak +#else +VOID +NTAPI +DbgBreakPoint( + VOID); +#endif + +NTSYSAPI +VOID +NTAPI +DbgBreakPointWithStatus( + IN ULONG Status); + +NTSYSAPI +ULONG +DDKCDECLAPI +DbgPrintReturnControlC( + IN PCCH Format, + IN ...); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTSYSAPI +ULONG +DDKCDECLAPI +DbgPrintEx( + IN ULONG ComponentId, + IN ULONG Level, + IN PCSTR Format, + IN ...); + +NTSYSAPI +NTSTATUS +NTAPI +DbgQueryDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level); + +NTSYSAPI +NTSTATUS +NTAPI +DbgSetDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level, + IN BOOLEAN State); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WS03) + +NTKERNELAPI +BOOLEAN +NTAPI +KdRefreshDebuggerNotPresent( + VOID +); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WS03SP1) +NTKERNELAPI +NTSTATUS +NTAPI +KdChangeOption( + IN KD_OPTION Option, + IN ULONG InBufferBytes OPTIONAL, + IN PVOID InBuffer, + IN ULONG OutBufferBytes OPTIONAL, + OUT PVOID OutBuffer, + OUT PULONG OutBufferNeeded OPTIONAL); +#endif + +#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) +FORCEINLINE +PVOID +NTAPI +HalAllocateCommonBuffer( + IN PDMA_ADAPTER DmaAdapter, + IN ULONG Length, + OUT PPHYSICAL_ADDRESS LogicalAddress, + IN BOOLEAN CacheEnabled) +{ + PALLOCATE_COMMON_BUFFER allocateCommonBuffer; + PVOID commonBuffer; + + allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer; + ASSERT( allocateCommonBuffer != NULL ); + commonBuffer = allocateCommonBuffer( DmaAdapter, Length, LogicalAddress, CacheEnabled ); + return commonBuffer; +} + +FORCEINLINE +VOID +NTAPI +HalFreeCommonBuffer( + IN PDMA_ADAPTER DmaAdapter, + IN ULONG Length, + IN PHYSICAL_ADDRESS LogicalAddress, + IN PVOID VirtualAddress, + IN BOOLEAN CacheEnabled) +{ + PFREE_COMMON_BUFFER freeCommonBuffer; + + freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer; + ASSERT( freeCommonBuffer != NULL ); + freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled ); +} + +FORCEINLINE +ULONG +NTAPI +HalReadDmaCounter( + IN PDMA_ADAPTER DmaAdapter) +{ + PREAD_DMA_COUNTER readDmaCounter; + ULONG counter; + + readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter; + ASSERT( readDmaCounter != NULL ); + counter = readDmaCounter( DmaAdapter ); + return counter; +} + +#endif + + +#ifndef _NTTMAPI_ +#define _NTTMAPI_ + +#include + +typedef enum _KTMOBJECT_TYPE { + KTMOBJECT_TRANSACTION, + KTMOBJECT_TRANSACTION_MANAGER, + KTMOBJECT_RESOURCE_MANAGER, + KTMOBJECT_ENLISTMENT, + KTMOBJECT_INVALID +} KTMOBJECT_TYPE, *PKTMOBJECT_TYPE; + +typedef struct _KTMOBJECT_CURSOR { + GUID LastQuery; + ULONG ObjectIdCount; + GUID ObjectIds[1]; +} KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR; + +typedef enum _TRANSACTION_INFORMATION_CLASS { + TransactionBasicInformation, + TransactionPropertiesInformation, + TransactionEnlistmentInformation, + TransactionSuperiorEnlistmentInformation +} TRANSACTION_INFORMATION_CLASS; + +typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS { + TransactionManagerBasicInformation, + TransactionManagerLogInformation, + TransactionManagerLogPathInformation, + TransactionManagerRecoveryInformation = 4 +} TRANSACTIONMANAGER_INFORMATION_CLASS; + +typedef enum _RESOURCEMANAGER_INFORMATION_CLASS { + ResourceManagerBasicInformation, + ResourceManagerCompletionInformation, +} RESOURCEMANAGER_INFORMATION_CLASS; + +typedef enum _ENLISTMENT_INFORMATION_CLASS { + EnlistmentBasicInformation, + EnlistmentRecoveryInformation, + EnlistmentCrmInformation +} ENLISTMENT_INFORMATION_CLASS; + +#endif /* !_NTTMAPI_ */ +/****************************************************************************** + * ZwXxx Functions * + ******************************************************************************/ + +/* Constants */ +#define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 ) +#define ZwCurrentProcess() NtCurrentProcess() +#define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 ) +#define ZwCurrentThread() NtCurrentThread() + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTSYSAPI +NTSTATUS +NTAPI +ZwClose( + IN HANDLE Handle); + +NTSYSAPI +NTSTATUS +NTAPI +ZwCreateDirectoryObject( + OUT PHANDLE DirectoryHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTSYSAPI +NTSTATUS +NTAPI +ZwCreateFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG CreateDisposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer OPTIONAL, + IN ULONG EaLength); + +NTSYSAPI +NTSTATUS +NTAPI +ZwCreateKey( + OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ULONG TitleIndex, + IN PUNICODE_STRING Class OPTIONAL, + IN ULONG CreateOptions, + OUT PULONG Disposition OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwCreateSection( + OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PLARGE_INTEGER MaximumSize OPTIONAL, + IN ULONG SectionPageProtection, + IN ULONG AllocationAttributes, + IN HANDLE FileHandle OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDeleteKey( + IN HANDLE KeyHandle); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDeleteValueKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING ValueName); + +NTSYSAPI +NTSTATUS +NTAPI +ZwEnumerateKey( + IN HANDLE KeyHandle, + IN ULONG Index, + IN KEY_INFORMATION_CLASS KeyInformationClass, + OUT PVOID KeyInformation OPTIONAL, + IN ULONG Length, + OUT PULONG ResultLength); + +NTSYSAPI +NTSTATUS +NTAPI +ZwEnumerateValueKey( + IN HANDLE KeyHandle, + IN ULONG Index, + IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, + OUT PVOID KeyValueInformation OPTIONAL, + IN ULONG Length, + OUT PULONG ResultLength); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFlushKey( + IN HANDLE KeyHandle); + +NTSYSAPI +NTSTATUS +NTAPI +ZwLoadDriver( + IN PUNICODE_STRING DriverServiceName); + +NTSYSAPI +NTSTATUS +NTAPI +ZwMakeTemporaryObject( + IN HANDLE Handle); + +NTSYSAPI +NTSTATUS +NTAPI +ZwMapViewOfSection( + IN HANDLE SectionHandle, + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG_PTR ZeroBits, + IN SIZE_T CommitSize, + IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, + IN OUT PSIZE_T ViewSize, + IN SECTION_INHERIT InheritDisposition, + IN ULONG AllocationType, + IN ULONG Protect); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenFile( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG ShareAccess, + IN ULONG OpenOptions); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenKey( + OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenSection( + OUT PHANDLE SectionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenSymbolicLinkObject( + OUT PHANDLE LinkHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryKey( + IN HANDLE KeyHandle, + IN KEY_INFORMATION_CLASS KeyInformationClass, + OUT PVOID KeyInformation OPTIONAL, + IN ULONG Length, + OUT PULONG ResultLength); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQuerySymbolicLinkObject( + IN HANDLE LinkHandle, + IN OUT PUNICODE_STRING LinkTarget, + OUT PULONG ReturnedLength OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryValueKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING ValueName, + IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, + OUT PVOID KeyValueInformation OPTIONAL, + IN ULONG Length, + OUT PULONG ResultLength); + +NTSYSAPI +NTSTATUS +NTAPI +ZwReadFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetValueKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING ValueName, + IN ULONG TitleIndex OPTIONAL, + IN ULONG Type, + IN PVOID Data OPTIONAL, + IN ULONG DataSize); + +NTSYSAPI +NTSTATUS +NTAPI +ZwUnloadDriver( + IN PUNICODE_STRING DriverServiceName); + +NTSYSAPI +NTSTATUS +NTAPI +ZwUnmapViewOfSection( + IN HANDLE ProcessHandle, + IN PVOID BaseAddress OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwWriteFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length, + IN PLARGE_INTEGER ByteOffset OPTIONAL, + IN PULONG Key OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryFullAttributesFile( + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN2003) + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwOpenEvent( + OUT PHANDLE EventHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTSYSAPI +NTSTATUS +ZwCreateKeyTransacted( + OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ULONG TitleIndex, + IN PUNICODE_STRING Class OPTIONAL, + IN ULONG CreateOptions, + IN HANDLE TransactionHandle, + OUT PULONG Disposition OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenKeyTransacted( + OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN HANDLE TransactionHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwCreateTransactionManager( + OUT PHANDLE TmHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PUNICODE_STRING LogFileName OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN ULONG CommitStrength OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwOpenTransactionManager( + OUT PHANDLE TmHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PUNICODE_STRING LogFileName OPTIONAL, + IN LPGUID TmIdentity OPTIONAL, + IN ULONG OpenOptions OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwRollforwardTransactionManager( + IN HANDLE TransactionManagerHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwRecoverTransactionManager( + IN HANDLE TransactionManagerHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwQueryInformationTransactionManager( + IN HANDLE TransactionManagerHandle, + IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + OUT PVOID TransactionManagerInformation, + IN ULONG TransactionManagerInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwSetInformationTransactionManager( + IN HANDLE TmHandle, + IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + IN PVOID TransactionManagerInformation, + IN ULONG TransactionManagerInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwEnumerateTransactionObject( + IN HANDLE RootObjectHandle OPTIONAL, + IN KTMOBJECT_TYPE QueryType, + IN OUT PKTMOBJECT_CURSOR ObjectCursor, + IN ULONG ObjectCursorLength, + OUT PULONG ReturnLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwCreateTransaction( + OUT PHANDLE TransactionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN LPGUID Uow OPTIONAL, + IN HANDLE TmHandle OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN ULONG IsolationLevel OPTIONAL, + IN ULONG IsolationFlags OPTIONAL, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN PUNICODE_STRING Description OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwOpenTransaction( + OUT PHANDLE TransactionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN LPGUID Uow, + IN HANDLE TmHandle OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwQueryInformationTransaction( + IN HANDLE TransactionHandle, + IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + OUT PVOID TransactionInformation, + IN ULONG TransactionInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwSetInformationTransaction( + IN HANDLE TransactionHandle, + IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + IN PVOID TransactionInformation, + IN ULONG TransactionInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwCommitTransaction( + IN HANDLE TransactionHandle, + IN BOOLEAN Wait); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwRollbackTransaction( + IN HANDLE TransactionHandle, + IN BOOLEAN Wait); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwCreateResourceManager( + OUT PHANDLE ResourceManagerHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE TmHandle, + IN LPGUID ResourceManagerGuid OPTIONAL, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN PUNICODE_STRING Description OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwOpenResourceManager( + OUT PHANDLE ResourceManagerHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE TmHandle, + IN LPGUID ResourceManagerGuid, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwRecoverResourceManager( + IN HANDLE ResourceManagerHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwGetNotificationResourceManager( + IN HANDLE ResourceManagerHandle, + OUT PTRANSACTION_NOTIFICATION TransactionNotification, + IN ULONG NotificationLength, + IN PLARGE_INTEGER Timeout, + IN PULONG ReturnLength OPTIONAL, + IN ULONG Asynchronous, + IN ULONG_PTR AsynchronousContext OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwQueryInformationResourceManager( + IN HANDLE ResourceManagerHandle, + IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + OUT PVOID ResourceManagerInformation, + IN ULONG ResourceManagerInformationLength, + IN PULONG ReturnLength OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwSetInformationResourceManager( + IN HANDLE ResourceManagerHandle, + IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + IN PVOID ResourceManagerInformation, + IN ULONG ResourceManagerInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwCreateEnlistment( + OUT PHANDLE EnlistmentHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE ResourceManagerHandle, + IN HANDLE TransactionHandle, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN NOTIFICATION_MASK NotificationMask, + IN PVOID EnlistmentKey OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwOpenEnlistment( + OUT PHANDLE EnlistmentHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE RmHandle, + IN LPGUID EnlistmentGuid, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwQueryInformationEnlistment( + IN HANDLE EnlistmentHandle, + IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + OUT PVOID EnlistmentInformation, + IN ULONG EnlistmentInformationLength, + IN PULONG ReturnLength OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwSetInformationEnlistment( + IN HANDLE EnlistmentHandle, + IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + IN PVOID EnlistmentInformation, + IN ULONG EnlistmentInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwRecoverEnlistment( + IN HANDLE EnlistmentHandle, + IN PVOID EnlistmentKey OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwPrePrepareEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwPrepareEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwCommitEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwRollbackEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwPrePrepareComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwPrepareComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwCommitComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwReadOnlyEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwRollbackComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +ZwSinglePhaseReject( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + + +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenKeyEx( + OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ULONG OpenOptions); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenKeyTransactedEx( + OUT PHANDLE KeyHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN ULONG OpenOptions, + IN HANDLE TransactionHandle); + +NTSYSAPI +NTSTATUS +NTAPI +ZwNotifyChangeMultipleKeys( + IN HANDLE MasterKeyHandle, + IN ULONG Count OPTIONAL, + IN OBJECT_ATTRIBUTES SubordinateObjects[] OPTIONAL, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG CompletionFilter, + IN BOOLEAN WatchTree, + OUT PVOID Buffer OPTIONAL, + IN ULONG BufferSize, + IN BOOLEAN Asynchronous); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryMultipleValueKey( + IN HANDLE KeyHandle, + IN OUT PKEY_VALUE_ENTRY ValueEntries, + IN ULONG EntryCount, + OUT PVOID ValueBuffer, + IN OUT PULONG BufferLength, + OUT PULONG RequiredBufferLength OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwRenameKey( + IN HANDLE KeyHandle, + IN PUNICODE_STRING NewName); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetInformationKey( + IN HANDLE KeyHandle, + IN KEY_SET_INFORMATION_CLASS KeySetInformationClass, + IN PVOID KeySetInformation, + IN ULONG KeySetInformationLength); + +#endif + +/****************************************************************************** + * Unsorted * + ******************************************************************************/ + +/* GUID Comparison */ +#ifndef __IID_ALIGNED__ +#define __IID_ALIGNED__ +#ifdef __cplusplus +inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2) +{ + return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && + (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) ); +} +#else +#define IsEqualGUIDAligned(guid1, guid2) \ + ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \ + (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) ) +#endif /* __cplusplus */ +#endif /* !__IID_ALIGNED__ */ + +typedef enum { + LT_DONT_CARE, + LT_LOWEST_LATENCY +} LATENCY_TIME; + +#define MAXIMUM_SUSPEND_COUNT MAXCHAR + +#define MAXIMUM_FILENAME_LENGTH 256 + +#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\') + +#define OBJECT_TYPE_CREATE (0x0001) +#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) + +#define DIRECTORY_QUERY (0x0001) +#define DIRECTORY_TRAVERSE (0x0002) +#define DIRECTORY_CREATE_OBJECT (0x0004) +#define DIRECTORY_CREATE_SUBDIRECTORY (0x0008) +#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) + +#define EVENT_QUERY_STATE (0x0001) +#define EVENT_MODIFY_STATE (0x0002) +#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) + +#define SEMAPHORE_QUERY_STATE (0x0001) +#define SEMAPHORE_MODIFY_STATE (0x0002) +#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) + +#define SYMBOLIC_LINK_QUERY 0x0001 +#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) + +#define DUPLICATE_CLOSE_SOURCE 0x00000001 +#define DUPLICATE_SAME_ACCESS 0x00000002 +#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 + +/* Global debug flag */ +extern ULONG NtGlobalFlag; + +/* Service Start Types */ +#define SERVICE_BOOT_START 0x00000000 +#define SERVICE_SYSTEM_START 0x00000001 +#define SERVICE_AUTO_START 0x00000002 +#define SERVICE_DEMAND_START 0x00000003 +#define SERVICE_DISABLED 0x00000004 + +#ifndef _TRACEHANDLE_DEFINED +#define _TRACEHANDLE_DEFINED +typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE; +#endif + + #ifdef __cplusplus } #endif -#endif // _WDMDDK_ \ No newline at end of file +#endif /* !_WDMDDK_ */ diff --git a/reactos/include/ddk/winddk.h b/reactos/include/ddk/winddk.h deleted file mode 100644 index d3cf6623974..00000000000 --- a/reactos/include/ddk/winddk.h +++ /dev/null @@ -1,10904 +0,0 @@ -/* - * winddk.h - * - * Windows Device Driver Kit - * - * This file is part of the w32api package. - * - * Contributors: - * Created by Casper S. Hornstrup - * - * THIS SOFTWARE IS NOT COPYRIGHTED - * - * This source code is offered for use in the public domain. You may - * use, modify or distribute it freely. - * - * This code is distributed in the hope that it will be useful but - * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY - * DISCLAIMED. This includes but is not limited to warranties of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - */ - -#ifndef __WINDDK_H -#define __WINDDK_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include - -#include "intrin.h" - -#if !defined(_NTHAL_) -#define NTHALAPI DECLSPEC_IMPORT -#else -#define NTHALAPI -#endif - -/* Pseudo modifiers for parameters */ -#define IN -#define OUT -#define OPTIONAL -#define UNALIGNED - -#define CONST const - -#define RESTRICTED_POINTER - -#if defined(_WIN64) -#define POINTER_ALIGNMENT DECLSPEC_ALIGN(8) -#else -#define POINTER_ALIGNMENT -#endif - -#define DECLSPEC_ADDRSAFE - -#ifdef NONAMELESSUNION -# define _DDK_DUMMYUNION_MEMBER(name) DUMMYUNIONNAME.name -# define _DDK_DUMMYUNION_N_MEMBER(n, name) DUMMYUNIONNAME##n.name -#else -# define _DDK_DUMMYUNION_MEMBER(name) name -# define _DDK_DUMMYUNION_N_MEMBER(n, name) name -#endif - -/* - * Alignment Macros - */ -#define ALIGN_DOWN(s, t) \ - ((ULONG)(s) & ~(sizeof(t) - 1)) - -#define ALIGN_UP(s, t) \ - (ALIGN_DOWN(((ULONG)(s) + sizeof(t) - 1), t)) - -#define ALIGN_DOWN_POINTER(p, t) \ - ((PVOID)((ULONG_PTR)(p) & ~((ULONG_PTR)sizeof(t) - 1))) - -#define ALIGN_UP_POINTER(p, t) \ - (ALIGN_DOWN_POINTER(((ULONG_PTR)(p) + sizeof(t) - 1), t)) - -/* - * GUID Comparison - */ - -#ifndef __IID_ALIGNED__ - #define __IID_ALIGNED__ - #ifdef __cplusplus - inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2) - { - return ((*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1))); - } - #else - #define IsEqualGUIDAligned(guid1, guid2) \ - ((*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1))) - #endif -#endif - -/* -** Forward declarations -*/ - -struct _IRP; -struct _MDL; -struct _KAPC; -struct _KDPC; -struct _KPCR; -struct _KPRCB; -struct _KTSS; -struct _FILE_OBJECT; -struct _DMA_ADAPTER; -struct _DEVICE_OBJECT; -struct _DRIVER_OBJECT; -struct _IO_STATUS_BLOCK; -struct _DEVICE_DESCRIPTION; -struct _SCATTER_GATHER_LIST; -struct _DRIVE_LAYOUT_INFORMATION; -struct _DRIVE_LAYOUT_INFORMATION_EX; -struct _LOADER_PARAMETER_BLOCK; - -typedef PVOID PSID; - -#if 1 -/* FIXME: Unknown definitions */ -struct _SET_PARTITION_INFORMATION_EX; -typedef ULONG WAIT_TYPE; -#define WaitAll 0 -#define WaitAny 1 -typedef HANDLE TRACEHANDLE; -typedef PVOID PWMILIB_CONTEXT; -typedef ULONG LOGICAL; -#endif - -/* -** WmiLib specific structure -*/ -typedef enum -{ - IrpProcessed, // Irp was processed and possibly completed - IrpNotCompleted, // Irp was process and NOT completed - IrpNotWmi, // Irp is not a WMI irp - IrpForward // Irp is wmi irp, but targeted at another device object -} SYSCTL_IRP_DISPOSITION, *PSYSCTL_IRP_DISPOSITION; - -/* -** Routines specific to this DDK -*/ -#define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 ) - -/* -** Simple structures -*/ - -typedef UCHAR KIRQL, *PKIRQL; - -typedef enum _MODE { - KernelMode, - UserMode, - MaximumMode -} MODE; - -// -// Forwarder -// -struct _COMPRESSED_DATA_INFO; - -/* Constants */ -#define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 ) -#define ZwCurrentProcess() NtCurrentProcess() -#define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 ) -#define ZwCurrentThread() NtCurrentThread() - -#if (_M_IX86) -#define KIP0PCRADDRESS 0xffdff000 - -#endif - -#define KERNEL_STACK_SIZE 12288 -#define KERNEL_LARGE_STACK_SIZE 61440 -#define KERNEL_LARGE_STACK_COMMIT 12288 - -#define EXCEPTION_READ_FAULT 0 -#define EXCEPTION_WRITE_FAULT 1 -#define EXCEPTION_EXECUTE_FAULT 8 - -#define DPFLTR_ERROR_LEVEL 0 -#define DPFLTR_WARNING_LEVEL 1 -#define DPFLTR_TRACE_LEVEL 2 -#define DPFLTR_INFO_LEVEL 3 -#define DPFLTR_MASK 0x80000000 - -typedef enum _DPFLTR_TYPE -{ - DPFLTR_SYSTEM_ID = 0, - DPFLTR_SMSS_ID = 1, - DPFLTR_SETUP_ID = 2, - DPFLTR_NTFS_ID = 3, - DPFLTR_FSTUB_ID = 4, - DPFLTR_CRASHDUMP_ID = 5, - DPFLTR_CDAUDIO_ID = 6, - DPFLTR_CDROM_ID = 7, - DPFLTR_CLASSPNP_ID = 8, - DPFLTR_DISK_ID = 9, - DPFLTR_REDBOOK_ID = 10, - DPFLTR_STORPROP_ID = 11, - DPFLTR_SCSIPORT_ID = 12, - DPFLTR_SCSIMINIPORT_ID = 13, - DPFLTR_CONFIG_ID = 14, - DPFLTR_I8042PRT_ID = 15, - DPFLTR_SERMOUSE_ID = 16, - DPFLTR_LSERMOUS_ID = 17, - DPFLTR_KBDHID_ID = 18, - DPFLTR_MOUHID_ID = 19, - DPFLTR_KBDCLASS_ID = 20, - DPFLTR_MOUCLASS_ID = 21, - DPFLTR_TWOTRACK_ID = 22, - DPFLTR_WMILIB_ID = 23, - DPFLTR_ACPI_ID = 24, - DPFLTR_AMLI_ID = 25, - DPFLTR_HALIA64_ID = 26, - DPFLTR_VIDEO_ID = 27, - DPFLTR_SVCHOST_ID = 28, - DPFLTR_VIDEOPRT_ID = 29, - DPFLTR_TCPIP_ID = 30, - DPFLTR_DMSYNTH_ID = 31, - DPFLTR_NTOSPNP_ID = 32, - DPFLTR_FASTFAT_ID = 33, - DPFLTR_SAMSS_ID = 34, - DPFLTR_PNPMGR_ID = 35, - DPFLTR_NETAPI_ID = 36, - DPFLTR_SCSERVER_ID = 37, - DPFLTR_SCCLIENT_ID = 38, - DPFLTR_SERIAL_ID = 39, - DPFLTR_SERENUM_ID = 40, - DPFLTR_UHCD_ID = 41, - DPFLTR_BOOTOK_ID = 42, - DPFLTR_BOOTVRFY_ID = 43, - DPFLTR_RPCPROXY_ID = 44, - DPFLTR_AUTOCHK_ID = 45, - DPFLTR_DCOMSS_ID = 46, - DPFLTR_UNIMODEM_ID = 47, - DPFLTR_SIS_ID = 48, - DPFLTR_FLTMGR_ID = 49, - DPFLTR_WMICORE_ID = 50, - DPFLTR_BURNENG_ID = 51, - DPFLTR_IMAPI_ID = 52, - DPFLTR_SXS_ID = 53, - DPFLTR_FUSION_ID = 54, - DPFLTR_IDLETASK_ID = 55, - DPFLTR_SOFTPCI_ID = 56, - DPFLTR_TAPE_ID = 57, - DPFLTR_MCHGR_ID = 58, - DPFLTR_IDEP_ID = 59, - DPFLTR_PCIIDE_ID = 60, - DPFLTR_FLOPPY_ID = 61, - DPFLTR_FDC_ID = 62, - DPFLTR_TERMSRV_ID = 63, - DPFLTR_W32TIME_ID = 64, - DPFLTR_PREFETCHER_ID = 65, - DPFLTR_RSFILTER_ID = 66, - DPFLTR_FCPORT_ID = 67, - DPFLTR_PCI_ID = 68, - DPFLTR_DMIO_ID = 69, - DPFLTR_DMCONFIG_ID = 70, - DPFLTR_DMADMIN_ID = 71, - DPFLTR_WSOCKTRANSPORT_ID = 72, - DPFLTR_VSS_ID = 73, - DPFLTR_PNPMEM_ID = 74, - DPFLTR_PROCESSOR_ID = 75, - DPFLTR_DMSERVER_ID = 76, - DPFLTR_SR_ID = 77, - DPFLTR_INFINIBAND_ID = 78, - DPFLTR_IHVDRIVER_ID = 79, - DPFLTR_IHVVIDEO_ID = 80, - DPFLTR_IHVAUDIO_ID = 81, - DPFLTR_IHVNETWORK_ID = 82, - DPFLTR_IHVSTREAMING_ID = 83, - DPFLTR_IHVBUS_ID = 84, - DPFLTR_HPS_ID = 85, - DPFLTR_RTLTHREADPOOL_ID = 86, - DPFLTR_LDR_ID = 87, - DPFLTR_TCPIP6_ID = 88, - DPFLTR_ISAPNP_ID = 89, - DPFLTR_SHPC_ID = 90, - DPFLTR_STORPORT_ID = 91, - DPFLTR_STORMINIPORT_ID = 92, - DPFLTR_PRINTSPOOLER_ID = 93, - DPFLTR_VDS_ID = 94, - DPFLTR_VDSBAS_ID = 95, - DPFLTR_VDSDYNDR_ID = 96, - DPFLTR_VDSUTIL_ID = 97, - DPFLTR_DFRGIFC_ID = 98, - DPFLTR_DEFAULT_ID = 99, - DPFLTR_MM_ID = 100, - DPFLTR_DFSC_ID = 101, - DPFLTR_WOW64_ID = 102, - DPFLTR_ENDOFTABLE_ID -} DPFLTR_TYPE; - -#define MAXIMUM_PROCESSORS 32 - -#define MAXIMUM_WAIT_OBJECTS 64 - -#define EX_RUNDOWN_ACTIVE 0x1 -#define EX_RUNDOWN_COUNT_SHIFT 0x1 -#define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT) - -#define METHOD_BUFFERED 0 -#define METHOD_IN_DIRECT 1 -#define METHOD_OUT_DIRECT 2 -#define METHOD_NEITHER 3 - -#define LOW_PRIORITY 0 -#define LOW_REALTIME_PRIORITY 16 -#define HIGH_PRIORITY 31 -#define MAXIMUM_PRIORITY 32 - -#define MAXIMUM_SUSPEND_COUNT MAXCHAR - -#define MAXIMUM_FILENAME_LENGTH 256 - -#define FILE_SUPERSEDED 0x00000000 -#define FILE_OPENED 0x00000001 -#define FILE_CREATED 0x00000002 -#define FILE_OVERWRITTEN 0x00000003 -#define FILE_EXISTS 0x00000004 -#define FILE_DOES_NOT_EXIST 0x00000005 - -#define FILE_USE_FILE_POINTER_POSITION 0xfffffffe -#define FILE_WRITE_TO_END_OF_FILE 0xffffffff - -/* also in winnt.h */ -#define FILE_LIST_DIRECTORY 0x00000001 -#define FILE_READ_DATA 0x00000001 -#define FILE_ADD_FILE 0x00000002 -#define FILE_WRITE_DATA 0x00000002 -#define FILE_ADD_SUBDIRECTORY 0x00000004 -#define FILE_APPEND_DATA 0x00000004 -#define FILE_CREATE_PIPE_INSTANCE 0x00000004 -#define FILE_READ_EA 0x00000008 -#define FILE_WRITE_EA 0x00000010 -#define FILE_EXECUTE 0x00000020 -#define FILE_TRAVERSE 0x00000020 -#define FILE_DELETE_CHILD 0x00000040 -#define FILE_READ_ATTRIBUTES 0x00000080 -#define FILE_WRITE_ATTRIBUTES 0x00000100 - -#define FILE_SHARE_READ 0x00000001 -#define FILE_SHARE_WRITE 0x00000002 -#define FILE_SHARE_DELETE 0x00000004 -#define FILE_SHARE_VALID_FLAGS 0x00000007 - -#define FILE_ATTRIBUTE_READONLY 0x00000001 -#define FILE_ATTRIBUTE_HIDDEN 0x00000002 -#define FILE_ATTRIBUTE_SYSTEM 0x00000004 -#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 -#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 -#define FILE_ATTRIBUTE_DEVICE 0x00000040 -#define FILE_ATTRIBUTE_NORMAL 0x00000080 -#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 -#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200 -#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 -#define FILE_ATTRIBUTE_COMPRESSED 0x00000800 -#define FILE_ATTRIBUTE_OFFLINE 0x00001000 -#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000 -#define FILE_ATTRIBUTE_ENCRYPTED 0x00004000 - -#define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7 -#define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7 - -#define FILE_COPY_STRUCTURED_STORAGE 0x00000041 -#define FILE_STRUCTURED_STORAGE 0x00000441 - -#define FILE_VALID_OPTION_FLAGS 0x00ffffff -#define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032 -#define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032 -#define FILE_VALID_SET_FLAGS 0x00000036 - -#define FILE_SUPERSEDE 0x00000000 -#define FILE_OPEN 0x00000001 -#define FILE_CREATE 0x00000002 -#define FILE_OPEN_IF 0x00000003 -#define FILE_OVERWRITE 0x00000004 -#define FILE_OVERWRITE_IF 0x00000005 -#define FILE_MAXIMUM_DISPOSITION 0x00000005 - -#define FILE_DIRECTORY_FILE 0x00000001 -#define FILE_WRITE_THROUGH 0x00000002 -#define FILE_SEQUENTIAL_ONLY 0x00000004 -#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008 -#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010 -#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020 -#define FILE_NON_DIRECTORY_FILE 0x00000040 -#define FILE_CREATE_TREE_CONNECTION 0x00000080 -#define FILE_COMPLETE_IF_OPLOCKED 0x00000100 -#define FILE_NO_EA_KNOWLEDGE 0x00000200 -#define FILE_OPEN_FOR_RECOVERY 0x00000400 -#define FILE_RANDOM_ACCESS 0x00000800 -#define FILE_DELETE_ON_CLOSE 0x00001000 -#define FILE_OPEN_BY_FILE_ID 0x00002000 -#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000 -#define FILE_NO_COMPRESSION 0x00008000 -#define FILE_RESERVE_OPFILTER 0x00100000 -#define FILE_OPEN_REPARSE_POINT 0x00200000 -#define FILE_OPEN_NO_RECALL 0x00400000 -#define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000 - -#define FILE_ANY_ACCESS 0x00000000 -#define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS -#define FILE_READ_ACCESS 0x00000001 -#define FILE_WRITE_ACCESS 0x00000002 - -#define FILE_ALL_ACCESS \ - (STANDARD_RIGHTS_REQUIRED | \ - SYNCHRONIZE | \ - 0x1FF) - -#define FILE_GENERIC_EXECUTE \ - (STANDARD_RIGHTS_EXECUTE | \ - FILE_READ_ATTRIBUTES | \ - FILE_EXECUTE | \ - SYNCHRONIZE) - -#define FILE_GENERIC_READ \ - (STANDARD_RIGHTS_READ | \ - FILE_READ_DATA | \ - FILE_READ_ATTRIBUTES | \ - FILE_READ_EA | \ - SYNCHRONIZE) - -#define FILE_GENERIC_WRITE \ - (STANDARD_RIGHTS_WRITE | \ - FILE_WRITE_DATA | \ - FILE_WRITE_ATTRIBUTES | \ - FILE_WRITE_EA | \ - FILE_APPEND_DATA | \ - SYNCHRONIZE) -/* end winnt.h */ - -#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\') - -#define OBJECT_TYPE_CREATE (0x0001) -#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) - -#define DIRECTORY_QUERY (0x0001) -#define DIRECTORY_TRAVERSE (0x0002) -#define DIRECTORY_CREATE_OBJECT (0x0004) -#define DIRECTORY_CREATE_SUBDIRECTORY (0x0008) -#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) - -#define EVENT_QUERY_STATE (0x0001) -#define EVENT_MODIFY_STATE (0x0002) -#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) - -#define SEMAPHORE_QUERY_STATE (0x0001) -#define SEMAPHORE_MODIFY_STATE (0x0002) -#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) - -#define THREAD_ALERT (0x0004) - -#define FM_LOCK_BIT (0x1) -#define FM_LOCK_BIT_V (0x0) -#define FM_LOCK_WAITER_WOKEN (0x2) -#define FM_LOCK_WAITER_INC (0x4) - -/* Exported object types */ -extern POBJECT_TYPE NTSYSAPI ExDesktopObjectType; -extern POBJECT_TYPE NTSYSAPI ExEventObjectType; -extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType; -extern POBJECT_TYPE NTSYSAPI ExWindowStationObjectType; -extern ULONG NTSYSAPI IoDeviceHandlerObjectSize; -extern POBJECT_TYPE NTSYSAPI IoDeviceHandlerObjectType; -extern POBJECT_TYPE NTSYSAPI IoDeviceObjectType; -extern POBJECT_TYPE NTSYSAPI IoDriverObjectType; -extern POBJECT_TYPE NTSYSAPI IoFileObjectType; -extern POBJECT_TYPE NTSYSAPI PsThreadType; -extern POBJECT_TYPE NTSYSAPI LpcPortObjectType; -extern POBJECT_TYPE NTSYSAPI SeTokenObjectType; -extern POBJECT_TYPE NTSYSAPI PsProcessType; - -#if (NTDDI_VERSION >= NTDDI_LONGHORN) -extern volatile CCHAR NTSYSAPI KeNumberProcessors; -#else -#if (NTDDI_VERSION >= NTDDI_WINXP) -extern CCHAR NTSYSAPI KeNumberProcessors; -#else -//extern PCCHAR KeNumberProcessors; -extern NTSYSAPI CCHAR KeNumberProcessors; //FIXME: Note to Alex: I won't fix this atm, since I prefer to discuss this with you first. -#endif -#endif - -#define PROCESSOR_FEATURE_MAX 64 -#define MAX_WOW64_SHARED_ENTRIES 16 - -typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE -{ - StandardDesign, - NEC98x86, - EndAlternatives -} ALTERNATIVE_ARCHITECTURE_TYPE; - -typedef struct _KSYSTEM_TIME -{ - ULONG LowPart; - LONG High1Time; - LONG High2Time; -} KSYSTEM_TIME, *PKSYSTEM_TIME; - -extern volatile KSYSTEM_TIME KeTickCount; - -#define NX_SUPPORT_POLICY_ALWAYSOFF 0 -#define NX_SUPPORT_POLICY_ALWAYSON 1 -#define NX_SUPPORT_POLICY_OPTIN 2 -#define NX_SUPPORT_POLICY_OPTOUT 3 - -typedef struct _KUSER_SHARED_DATA -{ - ULONG TickCountLowDeprecated; - ULONG TickCountMultiplier; - volatile KSYSTEM_TIME InterruptTime; - volatile KSYSTEM_TIME SystemTime; - volatile KSYSTEM_TIME TimeZoneBias; - USHORT ImageNumberLow; - USHORT ImageNumberHigh; - WCHAR NtSystemRoot[260]; - ULONG MaxStackTraceDepth; - ULONG CryptoExponent; - ULONG TimeZoneId; - ULONG LargePageMinimum; - ULONG Reserved2[7]; - NT_PRODUCT_TYPE NtProductType; - BOOLEAN ProductTypeIsValid; - ULONG NtMajorVersion; - ULONG NtMinorVersion; - BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX]; - ULONG Reserved1; - ULONG Reserved3; - volatile ULONG TimeSlip; - ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture; - LARGE_INTEGER SystemExpirationDate; - ULONG SuiteMask; - BOOLEAN KdDebuggerEnabled; -#if (NTDDI_VERSION >= NTDDI_WINXPSP2) - UCHAR NXSupportPolicy; -#endif - volatile ULONG ActiveConsoleId; - volatile ULONG DismountCount; - ULONG ComPlusPackage; - ULONG LastSystemRITEventTickCount; - ULONG NumberOfPhysicalPages; - BOOLEAN SafeBootMode; - ULONG TraceLogging; - ULONG Fill0; - ULONGLONG TestRetInstruction; - ULONG SystemCall; - ULONG SystemCallReturn; - ULONGLONG SystemCallPad[3]; - union { - volatile KSYSTEM_TIME TickCount; - volatile ULONG64 TickCountQuad; - }; - ULONG Cookie; -#if (NTDDI_VERSION >= NTDDI_WS03) - LONGLONG ConsoleSessionForegroundProcessId; - ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES]; -#endif -#if (NTDDI_VERSION >= NTDDI_LONGHORN) - USHORT UserModeGlobalLogger[8]; - ULONG HeapTracingPid[2]; - ULONG CritSecTracingPid[2]; - union - { - ULONG SharedDataFlags; - struct - { - ULONG DbgErrorPortPresent:1; - ULONG DbgElevationEnabled:1; - ULONG DbgVirtEnabled:1; - ULONG DbgInstallerDetectEnabled:1; - ULONG SpareBits:28; - }; - }; - ULONG ImageFileExecutionOptions; - KAFFINITY ActiveProcessorAffinity; -#endif -} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA; - -/* -** IRP function codes -*/ - -#define IRP_MJ_CREATE 0x00 -#define IRP_MJ_CREATE_NAMED_PIPE 0x01 -#define IRP_MJ_CLOSE 0x02 -#define IRP_MJ_READ 0x03 -#define IRP_MJ_WRITE 0x04 -#define IRP_MJ_QUERY_INFORMATION 0x05 -#define IRP_MJ_SET_INFORMATION 0x06 -#define IRP_MJ_QUERY_EA 0x07 -#define IRP_MJ_SET_EA 0x08 -#define IRP_MJ_FLUSH_BUFFERS 0x09 -#define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a -#define IRP_MJ_SET_VOLUME_INFORMATION 0x0b -#define IRP_MJ_DIRECTORY_CONTROL 0x0c -#define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d -#define IRP_MJ_DEVICE_CONTROL 0x0e -#define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f -#define IRP_MJ_SCSI 0x0f -#define IRP_MJ_SHUTDOWN 0x10 -#define IRP_MJ_LOCK_CONTROL 0x11 -#define IRP_MJ_CLEANUP 0x12 -#define IRP_MJ_CREATE_MAILSLOT 0x13 -#define IRP_MJ_QUERY_SECURITY 0x14 -#define IRP_MJ_SET_SECURITY 0x15 -#define IRP_MJ_POWER 0x16 -#define IRP_MJ_SYSTEM_CONTROL 0x17 -#define IRP_MJ_DEVICE_CHANGE 0x18 -#define IRP_MJ_QUERY_QUOTA 0x19 -#define IRP_MJ_SET_QUOTA 0x1a -#define IRP_MJ_PNP 0x1b -#define IRP_MJ_PNP_POWER 0x1b -#define IRP_MJ_MAXIMUM_FUNCTION 0x1b - -#define IRP_MN_QUERY_DIRECTORY 0x01 -#define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02 - -#define IRP_MN_USER_FS_REQUEST 0x00 -#define IRP_MN_MOUNT_VOLUME 0x01 -#define IRP_MN_VERIFY_VOLUME 0x02 -#define IRP_MN_LOAD_FILE_SYSTEM 0x03 -#define IRP_MN_TRACK_LINK 0x04 -#define IRP_MN_KERNEL_CALL 0x04 - -#define IRP_MN_LOCK 0x01 -#define IRP_MN_UNLOCK_SINGLE 0x02 -#define IRP_MN_UNLOCK_ALL 0x03 -#define IRP_MN_UNLOCK_ALL_BY_KEY 0x04 - -#define IRP_MN_NORMAL 0x00 -#define IRP_MN_DPC 0x01 -#define IRP_MN_MDL 0x02 -#define IRP_MN_COMPLETE 0x04 -#define IRP_MN_COMPRESSED 0x08 - -#define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC) -#define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL) -#define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC) - -#define IRP_MN_SCSI_CLASS 0x01 - -#define IRP_MN_START_DEVICE 0x00 -#define IRP_MN_QUERY_REMOVE_DEVICE 0x01 -#define IRP_MN_REMOVE_DEVICE 0x02 -#define IRP_MN_CANCEL_REMOVE_DEVICE 0x03 -#define IRP_MN_STOP_DEVICE 0x04 -#define IRP_MN_QUERY_STOP_DEVICE 0x05 -#define IRP_MN_CANCEL_STOP_DEVICE 0x06 - -#define IRP_MN_QUERY_DEVICE_RELATIONS 0x07 -#define IRP_MN_QUERY_INTERFACE 0x08 -#define IRP_MN_QUERY_CAPABILITIES 0x09 -#define IRP_MN_QUERY_RESOURCES 0x0A -#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B -#define IRP_MN_QUERY_DEVICE_TEXT 0x0C -#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D - -#define IRP_MN_READ_CONFIG 0x0F -#define IRP_MN_WRITE_CONFIG 0x10 -#define IRP_MN_EJECT 0x11 -#define IRP_MN_SET_LOCK 0x12 -#define IRP_MN_QUERY_ID 0x13 -#define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14 -#define IRP_MN_QUERY_BUS_INFORMATION 0x15 -#define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16 -#define IRP_MN_SURPRISE_REMOVAL 0x17 -#define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18 - -#define IRP_MN_WAIT_WAKE 0x00 -#define IRP_MN_POWER_SEQUENCE 0x01 -#define IRP_MN_SET_POWER 0x02 -#define IRP_MN_QUERY_POWER 0x03 - -#define IRP_MN_QUERY_ALL_DATA 0x00 -#define IRP_MN_QUERY_SINGLE_INSTANCE 0x01 -#define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02 -#define IRP_MN_CHANGE_SINGLE_ITEM 0x03 -#define IRP_MN_ENABLE_EVENTS 0x04 -#define IRP_MN_DISABLE_EVENTS 0x05 -#define IRP_MN_ENABLE_COLLECTION 0x06 -#define IRP_MN_DISABLE_COLLECTION 0x07 -#define IRP_MN_REGINFO 0x08 -#define IRP_MN_EXECUTE_METHOD 0x09 - -#define IRP_MN_REGINFO_EX 0x0b - -typedef enum _IO_PAGING_PRIORITY -{ - IoPagingPriorityInvalid, - IoPagingPriorityNormal, - IoPagingPriorityHigh, - IoPagingPriorityReserved1, - IoPagingPriorityReserved2 -} IO_PAGING_PRIORITY; - -typedef enum _IO_ALLOCATION_ACTION { - KeepObject = 1, - DeallocateObject, - DeallocateObjectKeepRegisters -} IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION; - -typedef IO_ALLOCATION_ACTION -(DDKAPI *PDRIVER_CONTROL)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp, - IN PVOID MapRegisterBase, - IN PVOID Context); - - -typedef EXCEPTION_DISPOSITION -(DDKAPI *PEXCEPTION_ROUTINE)( - IN struct _EXCEPTION_RECORD *ExceptionRecord, - IN PVOID EstablisherFrame, - IN OUT struct _CONTEXT *ContextRecord, - IN OUT PVOID DispatcherContext); - -typedef VOID -(DDKAPI *PDRIVER_LIST_CONTROL)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp, - IN struct _SCATTER_GATHER_LIST *ScatterGather, - IN PVOID Context); - -typedef NTSTATUS -(DDKAPI DRIVER_ADD_DEVICE)( - IN struct _DRIVER_OBJECT *DriverObject, - IN struct _DEVICE_OBJECT *PhysicalDeviceObject); -typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE; - -typedef NTSTATUS -(DDKAPI IO_COMPLETION_ROUTINE)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp, - IN PVOID Context); -typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE; - -typedef VOID -(DDKAPI DRIVER_CANCEL)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp); -typedef DRIVER_CANCEL *PDRIVER_CANCEL; - -typedef VOID -(DDKAPI *PKDEFERRED_ROUTINE)( - IN struct _KDPC *Dpc, - IN PVOID DeferredContext, - IN PVOID SystemArgument1, - IN PVOID SystemArgument2); - -typedef NTSTATUS -(DDKAPI DRIVER_DISPATCH)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp); -typedef DRIVER_DISPATCH *PDRIVER_DISPATCH; - -typedef VOID -(DDKAPI *PIO_DPC_ROUTINE)( - IN struct _KDPC *Dpc, - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp, - IN PVOID Context); - -typedef NTSTATUS -(DDKAPI *PMM_DLL_INITIALIZE)( - IN PUNICODE_STRING RegistryPath); - -typedef NTSTATUS -(DDKAPI *PMM_DLL_UNLOAD)( - VOID); - -typedef NTSTATUS -(DDKAPI *PDRIVER_ENTRY)( - IN struct _DRIVER_OBJECT *DriverObject, - IN PUNICODE_STRING RegistryPath); - -typedef NTSTATUS -(DDKAPI DRIVER_INITIALIZE)( - IN struct _DRIVER_OBJECT *DriverObject, - IN PUNICODE_STRING RegistryPath); -typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE; - -typedef BOOLEAN -(DDKAPI KSERVICE_ROUTINE)( - IN struct _KINTERRUPT *Interrupt, - IN PVOID ServiceContext); -typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE; - -typedef VOID -(DDKAPI *PIO_TIMER_ROUTINE)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN PVOID Context); - -typedef VOID -(DDKAPI *PDRIVER_REINITIALIZE)( - IN struct _DRIVER_OBJECT *DriverObject, - IN PVOID Context, - IN ULONG Count); - -typedef VOID -(DDKAPI DRIVER_STARTIO)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp); -typedef DRIVER_STARTIO *PDRIVER_STARTIO; - -typedef BOOLEAN -(DDKAPI *PKSYNCHRONIZE_ROUTINE)( - IN PVOID SynchronizeContext); - -typedef VOID -(DDKAPI DRIVER_UNLOAD)( - IN struct _DRIVER_OBJECT *DriverObject); -typedef DRIVER_UNLOAD *PDRIVER_UNLOAD; - - - -/* -** Plug and Play structures -*/ - -typedef VOID -(DDKAPI *PINTERFACE_REFERENCE)( - PVOID Context); - -typedef VOID -(DDKAPI *PINTERFACE_DEREFERENCE)( - PVOID Context); - -typedef BOOLEAN -(DDKAPI *PTRANSLATE_BUS_ADDRESS)( - IN PVOID Context, - IN PHYSICAL_ADDRESS BusAddress, - IN ULONG Length, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress); - -typedef struct _DMA_ADAPTER* -(DDKAPI *PGET_DMA_ADAPTER)( - IN PVOID Context, - IN struct _DEVICE_DESCRIPTION *DeviceDescriptor, - OUT PULONG NumberOfMapRegisters); - -typedef ULONG -(DDKAPI *PGET_SET_DEVICE_DATA)( - IN PVOID Context, - IN ULONG DataType, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -/* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */ -#define PCI_USE_SUBSYSTEM_IDS 0x00000001 -#define PCI_USE_REVISION 0x00000002 -#define PCI_USE_VENDEV_IDS 0x00000004 -#define PCI_USE_CLASS_SUBCLASS 0x00000008 -#define PCI_USE_PROGIF 0x00000010 -#define PCI_USE_LOCAL_BUS 0x00000020 -#define PCI_USE_LOCAL_DEVICE 0x00000040 - -typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS { - ULONG Size; - ULONG Flags; - USHORT VendorID; - USHORT DeviceID; - UCHAR RevisionID; - USHORT SubVendorID; - USHORT SubSystemID; - UCHAR BaseClass; - UCHAR SubClass; - UCHAR ProgIf; -} PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS; - -typedef BOOLEAN -(DDKAPI *PPCI_IS_DEVICE_PRESENT)( - IN USHORT VendorID, - IN USHORT DeviceID, - IN UCHAR RevisionID, - IN USHORT SubVendorID, - IN USHORT SubSystemID, - IN ULONG Flags); - -typedef BOOLEAN -(DDKAPI *PPCI_IS_DEVICE_PRESENT_EX)( - IN PVOID Context, - IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters); - -typedef union _POWER_STATE { - SYSTEM_POWER_STATE SystemState; - DEVICE_POWER_STATE DeviceState; -} POWER_STATE, *PPOWER_STATE; - -typedef enum _POWER_STATE_TYPE { - SystemPowerState, - DevicePowerState -} POWER_STATE_TYPE, *PPOWER_STATE_TYPE; - -typedef struct _BUS_INTERFACE_STANDARD { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PTRANSLATE_BUS_ADDRESS TranslateBusAddress; - PGET_DMA_ADAPTER GetDmaAdapter; - PGET_SET_DEVICE_DATA SetBusData; - PGET_SET_DEVICE_DATA GetBusData; -} BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD; - -typedef struct _PCI_DEVICE_PRESENT_INTERFACE { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PPCI_IS_DEVICE_PRESENT IsDevicePresent; - PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx; -} PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE; - -typedef struct _DEVICE_CAPABILITIES { - USHORT Size; - USHORT Version; - ULONG DeviceD1 : 1; - ULONG DeviceD2 : 1; - ULONG LockSupported : 1; - ULONG EjectSupported : 1; - ULONG Removable : 1; - ULONG DockDevice : 1; - ULONG UniqueID : 1; - ULONG SilentInstall : 1; - ULONG RawDeviceOK : 1; - ULONG SurpriseRemovalOK : 1; - ULONG WakeFromD0 : 1; - ULONG WakeFromD1 : 1; - ULONG WakeFromD2 : 1; - ULONG WakeFromD3 : 1; - ULONG HardwareDisabled : 1; - ULONG NonDynamic : 1; - ULONG WarmEjectSupported : 1; - ULONG NoDisplayInUI : 1; - ULONG Reserved : 14; - ULONG Address; - ULONG UINumber; - DEVICE_POWER_STATE DeviceState[PowerSystemMaximum]; - SYSTEM_POWER_STATE SystemWake; - DEVICE_POWER_STATE DeviceWake; - ULONG D1Latency; - ULONG D2Latency; - ULONG D3Latency; -} DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES; - -typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION { - USHORT Version; - USHORT Size; - GUID Event; - GUID InterfaceClassGuid; - PUNICODE_STRING SymbolicLinkName; -} DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION; - -typedef struct _HWPROFILE_CHANGE_NOTIFICATION { - USHORT Version; - USHORT Size; - GUID Event; -} HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION; - -#undef INTERFACE - -typedef struct _INTERFACE { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; -} INTERFACE, *PINTERFACE; - -typedef struct _PLUGPLAY_NOTIFICATION_HEADER { - USHORT Version; - USHORT Size; - GUID Event; -} PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER; - -typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE; - -/* PNP_DEVICE_STATE */ - -#define PNP_DEVICE_DISABLED 0x00000001 -#define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002 -#define PNP_DEVICE_FAILED 0x00000004 -#define PNP_DEVICE_REMOVED 0x00000008 -#define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010 -#define PNP_DEVICE_NOT_DISABLEABLE 0x00000020 - -typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION { - USHORT Version; - USHORT Size; - GUID Event; - struct _FILE_OBJECT *FileObject; - LONG NameBufferOffset; - UCHAR CustomDataBuffer[1]; -} TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION; - -typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION { - USHORT Version; - USHORT Size; - GUID Event; - struct _FILE_OBJECT *FileObject; -} TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION; - -typedef enum _BUS_QUERY_ID_TYPE { - BusQueryDeviceID, - BusQueryHardwareIDs, - BusQueryCompatibleIDs, - BusQueryInstanceID, - BusQueryDeviceSerialNumber -} BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE; - -typedef enum _DEVICE_TEXT_TYPE { - DeviceTextDescription, - DeviceTextLocationInformation -} DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE; - -typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE { - DeviceUsageTypeUndefined, - DeviceUsageTypePaging, - DeviceUsageTypeHibernation, - DeviceUsageTypeDumpFile -} DEVICE_USAGE_NOTIFICATION_TYPE; - -typedef struct _POWER_SEQUENCE { - ULONG SequenceD1; - ULONG SequenceD2; - ULONG SequenceD3; -} POWER_SEQUENCE, *PPOWER_SEQUENCE; - -typedef enum { - DevicePropertyDeviceDescription, - DevicePropertyHardwareID, - DevicePropertyCompatibleIDs, - DevicePropertyBootConfiguration, - DevicePropertyBootConfigurationTranslated, - DevicePropertyClassName, - DevicePropertyClassGuid, - DevicePropertyDriverKeyName, - DevicePropertyManufacturer, - DevicePropertyFriendlyName, - DevicePropertyLocationInformation, - DevicePropertyPhysicalDeviceObjectName, - DevicePropertyBusTypeGuid, - DevicePropertyLegacyBusType, - DevicePropertyBusNumber, - DevicePropertyEnumeratorName, - DevicePropertyAddress, - DevicePropertyUINumber, - DevicePropertyInstallState, - DevicePropertyRemovalPolicy -} DEVICE_REGISTRY_PROPERTY; - -typedef enum _IO_NOTIFICATION_EVENT_CATEGORY { - EventCategoryReserved, - EventCategoryHardwareProfileChange, - EventCategoryDeviceInterfaceChange, - EventCategoryTargetDeviceChange -} IO_NOTIFICATION_EVENT_CATEGORY; - -#define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001 - -typedef NTSTATUS -(DDKAPI *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)( - IN PVOID NotificationStructure, - IN PVOID Context); - -typedef VOID -(DDKAPI *PDEVICE_CHANGE_COMPLETE_CALLBACK)( - IN PVOID Context); - - -/* -** System structures -*/ - -#define SYMBOLIC_LINK_QUERY 0x0001 -#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) - -/* also in winnt,h */ -#define DUPLICATE_CLOSE_SOURCE 0x00000001 -#define DUPLICATE_SAME_ACCESS 0x00000002 -#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 -/* end winnt.h */ - -typedef struct _OBJECT_NAME_INFORMATION { - UNICODE_STRING Name; -} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; - -typedef struct _IO_STATUS_BLOCK { - _ANONYMOUS_UNION union { - NTSTATUS Status; - PVOID Pointer; - } DUMMYUNIONNAME; - ULONG_PTR Information; -} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; - -typedef VOID -(DDKAPI *PIO_APC_ROUTINE)( - IN PVOID ApcContext, - IN PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG Reserved); - -typedef VOID -(DDKAPI *PKNORMAL_ROUTINE)( - IN PVOID NormalContext, - IN PVOID SystemArgument1, - IN PVOID SystemArgument2); - -typedef VOID -(DDKAPI *PKKERNEL_ROUTINE)( - IN struct _KAPC *Apc, - IN OUT PKNORMAL_ROUTINE *NormalRoutine, - IN OUT PVOID *NormalContext, - IN OUT PVOID *SystemArgument1, - IN OUT PVOID *SystemArgument2); - -typedef VOID -(DDKAPI *PKRUNDOWN_ROUTINE)( - IN struct _KAPC *Apc); - -typedef BOOLEAN -(DDKAPI *PKTRANSFER_ROUTINE)( - VOID); - -typedef struct _KAPC -{ - UCHAR Type; - UCHAR SpareByte0; - UCHAR Size; - UCHAR SpareByte1; - ULONG SpareLong0; - struct _KTHREAD *Thread; - LIST_ENTRY ApcListEntry; - PKKERNEL_ROUTINE KernelRoutine; - PKRUNDOWN_ROUTINE RundownRoutine; - PKNORMAL_ROUTINE NormalRoutine; - PVOID NormalContext; - PVOID SystemArgument1; - PVOID SystemArgument2; - CCHAR ApcStateIndex; - KPROCESSOR_MODE ApcMode; - BOOLEAN Inserted; -} KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC; - -typedef struct _KDEVICE_QUEUE { - CSHORT Type; - CSHORT Size; - LIST_ENTRY DeviceListHead; - KSPIN_LOCK Lock; - BOOLEAN Busy; -} KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE; - -typedef struct _KDEVICE_QUEUE_ENTRY { - LIST_ENTRY DeviceListEntry; - ULONG SortKey; - BOOLEAN Inserted; -} KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY, -*RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY; - -#define LOCK_QUEUE_WAIT 1 -#define LOCK_QUEUE_OWNER 2 -#define LOCK_QUEUE_TIMER_LOCK_SHIFT 4 -#define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT)) - -typedef enum _KSPIN_LOCK_QUEUE_NUMBER -{ - LockQueueDispatcherLock, - LockQueueExpansionLock, - LockQueuePfnLock, - LockQueueSystemSpaceLock, - LockQueueVacbLock, - LockQueueMasterLock, - LockQueueNonPagedPoolLock, - LockQueueIoCancelLock, - LockQueueWorkQueueLock, - LockQueueIoVpbLock, - LockQueueIoDatabaseLock, - LockQueueIoCompletionLock, - LockQueueNtfsStructLock, - LockQueueAfdWorkQueueLock, - LockQueueBcbLock, - LockQueueMmNonPagedPoolLock, - LockQueueUnusedSpare16, - LockQueueTimerTableLock, - LockQueueMaximumLock = LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS -} KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER; - -typedef struct _KSPIN_LOCK_QUEUE { - struct _KSPIN_LOCK_QUEUE *volatile Next; - PKSPIN_LOCK volatile Lock; -} KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE; - -typedef struct _KLOCK_QUEUE_HANDLE { - KSPIN_LOCK_QUEUE LockQueue; - KIRQL OldIrql; -} KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE; - -#define DPC_NORMAL 0 -#define DPC_THREADED 1 - -#define ASSERT_APC(Object) \ - ASSERT((Object)->Type == ApcObject) - -#define ASSERT_DPC(Object) \ - ASSERT(((Object)->Type == 0) || \ - ((Object)->Type == DpcObject) || \ - ((Object)->Type == ThreadedDpcObject)) - -#define ASSERT_DEVICE_QUEUE(Object) \ - ASSERT((Object)->Type == DeviceQueueObject) - -typedef struct _KDPC -{ - UCHAR Type; - UCHAR Importance; - USHORT Number; - LIST_ENTRY DpcListEntry; - PKDEFERRED_ROUTINE DeferredRoutine; - PVOID DeferredContext; - PVOID SystemArgument1; - PVOID SystemArgument2; - volatile PVOID DpcData; -} KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC; - -typedef PVOID PKIPI_CONTEXT; - -typedef -VOID -(NTAPI *PKIPI_WORKER)( - IN PKIPI_CONTEXT PacketContext, - IN PVOID Parameter1, - IN PVOID Parameter2, - IN PVOID Parameter3 -); - -typedef struct _WAIT_CONTEXT_BLOCK { - KDEVICE_QUEUE_ENTRY WaitQueueEntry; - PDRIVER_CONTROL DeviceRoutine; - PVOID DeviceContext; - ULONG NumberOfMapRegisters; - PVOID DeviceObject; - PVOID CurrentIrp; - PKDPC BufferChainingDpc; -} WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK; - -#define ASSERT_GATE(object) \ - ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \ - (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject)) - -typedef struct _KGATE -{ - DISPATCHER_HEADER Header; -} KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE; - -#define GM_LOCK_BIT 0x1 -#define GM_LOCK_BIT_V 0x0 -#define GM_LOCK_WAITER_WOKEN 0x2 -#define GM_LOCK_WAITER_INC 0x4 - -typedef struct _KGUARDED_MUTEX -{ - volatile LONG Count; - PKTHREAD Owner; - ULONG Contention; - KGATE Gate; - union - { - struct - { - SHORT KernelApcDisable; - SHORT SpecialApcDisable; - }; - ULONG CombinedApcDisable; - }; -} KGUARDED_MUTEX, *PKGUARDED_MUTEX; - -#define TIMER_TABLE_SIZE 512 -#define TIMER_TABLE_SHIFT 9 - -typedef struct _KTIMER { - DISPATCHER_HEADER Header; - ULARGE_INTEGER DueTime; - LIST_ENTRY TimerListEntry; - struct _KDPC *Dpc; - LONG Period; -} KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER; - -#define ASSERT_TIMER(E) \ - ASSERT(((E)->Header.Type == TimerNotificationObject) || \ - ((E)->Header.Type == TimerSynchronizationObject)) - -#define ASSERT_MUTANT(E) \ - ASSERT((E)->Header.Type == MutantObject) - -#define ASSERT_SEMAPHORE(E) \ - ASSERT((E)->Header.Type == SemaphoreObject) - -#define ASSERT_EVENT(E) \ - ASSERT(((E)->Header.Type == NotificationEvent) || \ - ((E)->Header.Type == SynchronizationEvent)) - -typedef struct _KMUTANT { - DISPATCHER_HEADER Header; - LIST_ENTRY MutantListEntry; - struct _KTHREAD *RESTRICTED_POINTER OwnerThread; - BOOLEAN Abandoned; - UCHAR ApcDisable; -} KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX; - -typedef enum _TIMER_TYPE { - NotificationTimer, - SynchronizationTimer -} TIMER_TYPE; - -#define EVENT_INCREMENT 1 -#define IO_NO_INCREMENT 0 -#define IO_CD_ROM_INCREMENT 1 -#define IO_DISK_INCREMENT 1 -#define IO_KEYBOARD_INCREMENT 6 -#define IO_MAILSLOT_INCREMENT 2 -#define IO_MOUSE_INCREMENT 6 -#define IO_NAMED_PIPE_INCREMENT 2 -#define IO_NETWORK_INCREMENT 2 -#define IO_PARALLEL_INCREMENT 1 -#define IO_SERIAL_INCREMENT 2 -#define IO_SOUND_INCREMENT 8 -#define IO_VIDEO_INCREMENT 1 -#define SEMAPHORE_INCREMENT 1 - -#define MM_MAXIMUM_DISK_IO_SIZE (0x10000) - -typedef struct _IRP { - CSHORT Type; - USHORT Size; - struct _MDL *MdlAddress; - ULONG Flags; - union { - struct _IRP *MasterIrp; - volatile LONG IrpCount; - PVOID SystemBuffer; - } AssociatedIrp; - LIST_ENTRY ThreadListEntry; - IO_STATUS_BLOCK IoStatus; - KPROCESSOR_MODE RequestorMode; - BOOLEAN PendingReturned; - CHAR StackCount; - CHAR CurrentLocation; - BOOLEAN Cancel; - KIRQL CancelIrql; - CCHAR ApcEnvironment; - UCHAR AllocationFlags; - PIO_STATUS_BLOCK UserIosb; - PKEVENT UserEvent; - union { - struct { - PIO_APC_ROUTINE UserApcRoutine; - PVOID UserApcContext; - } AsynchronousParameters; - LARGE_INTEGER AllocationSize; - } Overlay; - volatile PDRIVER_CANCEL CancelRoutine; - PVOID UserBuffer; - union { - struct { - _ANONYMOUS_UNION union { - KDEVICE_QUEUE_ENTRY DeviceQueueEntry; - _ANONYMOUS_STRUCT struct { - PVOID DriverContext[4]; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME; - PETHREAD Thread; - PCHAR AuxiliaryBuffer; - _ANONYMOUS_STRUCT struct { - LIST_ENTRY ListEntry; - _ANONYMOUS_UNION union { - struct _IO_STACK_LOCATION *CurrentStackLocation; - ULONG PacketType; - } DUMMYUNIONNAME; - } DUMMYSTRUCTNAME; - struct _FILE_OBJECT *OriginalFileObject; - } Overlay; - KAPC Apc; - PVOID CompletionKey; - } Tail; -} IRP; -typedef struct _IRP *PIRP; - -/* IRP.Flags */ - -#define SL_FORCE_ACCESS_CHECK 0x01 -#define SL_OPEN_PAGING_FILE 0x02 -#define SL_OPEN_TARGET_DIRECTORY 0x04 -#define SL_CASE_SENSITIVE 0x80 - -#define SL_KEY_SPECIFIED 0x01 -#define SL_OVERRIDE_VERIFY_VOLUME 0x02 -#define SL_WRITE_THROUGH 0x04 -#define SL_FT_SEQUENTIAL_WRITE 0x08 - -#define SL_FAIL_IMMEDIATELY 0x01 -#define SL_EXCLUSIVE_LOCK 0x02 - -#define SL_RESTART_SCAN 0x01 -#define SL_RETURN_SINGLE_ENTRY 0x02 -#define SL_INDEX_SPECIFIED 0x04 - -#define SL_WATCH_TREE 0x01 - -#define SL_ALLOW_RAW_MOUNT 0x01 - -#define CTL_CODE(DeviceType, Function, Method, Access)( \ - ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) - -#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16) - -enum -{ - IRP_NOCACHE = 0x1, - IRP_PAGING_IO = 0x2, - IRP_MOUNT_COMPLETION = 0x2, - IRP_SYNCHRONOUS_API = 0x4, - IRP_ASSOCIATED_IRP = 0x8, - IRP_BUFFERED_IO = 0x10, - IRP_DEALLOCATE_BUFFER = 0x20, - IRP_INPUT_OPERATION = 0x40, - IRP_SYNCHRONOUS_PAGING_IO = 0x40, - IRP_CREATE_OPERATION = 0x80, - IRP_READ_OPERATION = 0x100, - IRP_WRITE_OPERATION = 0x200, - IRP_CLOSE_OPERATION = 0x400, - IRP_DEFER_IO_COMPLETION = 0x800, - IRP_OB_QUERY_NAME = 0x1000, - IRP_HOLD_DEVICE_QUEUE = 0x2000, - IRP_RETRY_IO_COMPLETION = 0x4000 -}; - -#define IRP_QUOTA_CHARGED 0x01 -#define IRP_ALLOCATED_MUST_SUCCEED 0x02 -#define IRP_ALLOCATED_FIXED_SIZE 0x04 -#define IRP_LOOKASIDE_ALLOCATION 0x08 - -typedef struct _BOOTDISK_INFORMATION { - LONGLONG BootPartitionOffset; - LONGLONG SystemPartitionOffset; - ULONG BootDeviceSignature; - ULONG SystemDeviceSignature; -} BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION; - -typedef struct _BOOTDISK_INFORMATION_EX { - LONGLONG BootPartitionOffset; - LONGLONG SystemPartitionOffset; - ULONG BootDeviceSignature; - ULONG SystemDeviceSignature; - GUID BootDeviceGuid; - GUID SystemDeviceGuid; - BOOLEAN BootDeviceIsGpt; - BOOLEAN SystemDeviceIsGpt; -} BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX; - -typedef struct _EISA_MEMORY_TYPE { - UCHAR ReadWrite : 1; - UCHAR Cached : 1; - UCHAR Reserved0 : 1; - UCHAR Type : 2; - UCHAR Shared : 1; - UCHAR Reserved1 : 1; - UCHAR MoreEntries : 1; -} EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE; - -#include -typedef struct _EISA_MEMORY_CONFIGURATION { - EISA_MEMORY_TYPE ConfigurationByte; - UCHAR DataSize; - USHORT AddressLowWord; - UCHAR AddressHighByte; - USHORT MemorySize; -} EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION; -#include - -typedef struct _EISA_IRQ_DESCRIPTOR { - UCHAR Interrupt : 4; - UCHAR Reserved : 1; - UCHAR LevelTriggered : 1; - UCHAR Shared : 1; - UCHAR MoreEntries : 1; -} EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR; - -typedef struct _EISA_IRQ_CONFIGURATION { - EISA_IRQ_DESCRIPTOR ConfigurationByte; - UCHAR Reserved; -} EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION; - -typedef struct _DMA_CONFIGURATION_BYTE0 { - UCHAR Channel : 3; - UCHAR Reserved : 3; - UCHAR Shared : 1; - UCHAR MoreEntries : 1; -} DMA_CONFIGURATION_BYTE0; - -typedef struct _DMA_CONFIGURATION_BYTE1 { - UCHAR Reserved0 : 2; - UCHAR TransferSize : 2; - UCHAR Timing : 2; - UCHAR Reserved1 : 2; -} DMA_CONFIGURATION_BYTE1; - -typedef struct _EISA_DMA_CONFIGURATION { - DMA_CONFIGURATION_BYTE0 ConfigurationByte0; - DMA_CONFIGURATION_BYTE1 ConfigurationByte1; -} EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION; - -#include -typedef struct _EISA_PORT_DESCRIPTOR { - UCHAR NumberPorts : 5; - UCHAR Reserved : 1; - UCHAR Shared : 1; - UCHAR MoreEntries : 1; -} EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR; - -typedef struct _EISA_PORT_CONFIGURATION { - EISA_PORT_DESCRIPTOR Configuration; - USHORT PortAddress; -} EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION; -#include - -typedef struct _CM_EISA_FUNCTION_INFORMATION { - ULONG CompressedId; - UCHAR IdSlotFlags1; - UCHAR IdSlotFlags2; - UCHAR MinorRevision; - UCHAR MajorRevision; - UCHAR Selections[26]; - UCHAR FunctionFlags; - UCHAR TypeString[80]; - EISA_MEMORY_CONFIGURATION EisaMemory[9]; - EISA_IRQ_CONFIGURATION EisaIrq[7]; - EISA_DMA_CONFIGURATION EisaDma[4]; - EISA_PORT_CONFIGURATION EisaPort[20]; - UCHAR InitializationData[60]; -} CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION; - -/* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */ - -#define EISA_FUNCTION_ENABLED 0x80 -#define EISA_FREE_FORM_DATA 0x40 -#define EISA_HAS_PORT_INIT_ENTRY 0x20 -#define EISA_HAS_PORT_RANGE 0x10 -#define EISA_HAS_DMA_ENTRY 0x08 -#define EISA_HAS_IRQ_ENTRY 0x04 -#define EISA_HAS_MEMORY_ENTRY 0x02 -#define EISA_HAS_TYPE_ENTRY 0x01 -#define EISA_HAS_INFORMATION \ - (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \ - + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY) - -typedef struct _CM_EISA_SLOT_INFORMATION { - UCHAR ReturnCode; - UCHAR ReturnFlags; - UCHAR MajorRevision; - UCHAR MinorRevision; - USHORT Checksum; - UCHAR NumberFunctions; - UCHAR FunctionInformation; - ULONG CompressedId; -} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION; - -/* CM_EISA_SLOT_INFORMATION.ReturnCode */ - -#define EISA_INVALID_SLOT 0x80 -#define EISA_INVALID_FUNCTION 0x81 -#define EISA_INVALID_CONFIGURATION 0x82 -#define EISA_EMPTY_SLOT 0x83 -#define EISA_INVALID_BIOS_CALL 0x86 - -typedef struct _CM_FLOPPY_DEVICE_DATA { - USHORT Version; - USHORT Revision; - CHAR Size[8]; - ULONG MaxDensity; - ULONG MountDensity; - UCHAR StepRateHeadUnloadTime; - UCHAR HeadLoadTime; - UCHAR MotorOffTime; - UCHAR SectorLengthCode; - UCHAR SectorPerTrack; - UCHAR ReadWriteGapLength; - UCHAR DataTransferLength; - UCHAR FormatGapLength; - UCHAR FormatFillCharacter; - UCHAR HeadSettleTime; - UCHAR MotorSettleTime; - UCHAR MaximumTrackValue; - UCHAR DataTransferRate; -} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; - -typedef struct _PNP_BUS_INFORMATION { - GUID BusTypeGuid; - INTERFACE_TYPE LegacyBusType; - ULONG BusNumber; -} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION; - -#include -/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */ - -#define CmResourceTypeNull 0 -#define CmResourceTypePort 1 -#define CmResourceTypeInterrupt 2 -#define CmResourceTypeMemory 3 -#define CmResourceTypeDma 4 -#define CmResourceTypeDeviceSpecific 5 -#define CmResourceTypeBusNumber 6 -#define CmResourceTypeMaximum 7 -#define CmResourceTypeNonArbitrated 128 -#define CmResourceTypeConfigData 128 -#define CmResourceTypeDevicePrivate 129 -#define CmResourceTypePcCardConfig 130 -#define CmResourceTypeMfCardConfig 131 - -/* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */ - -typedef enum _CM_SHARE_DISPOSITION { - CmResourceShareUndetermined, - CmResourceShareDeviceExclusive, - CmResourceShareDriverExclusive, - CmResourceShareShared -} CM_SHARE_DISPOSITION; - -/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */ - -#define CM_RESOURCE_PORT_MEMORY 0x0000 -#define CM_RESOURCE_PORT_IO 0x0001 -#define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004 -#define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008 -#define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010 -#define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020 -#define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040 -#define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080 - -/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */ - -#define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000 -#define CM_RESOURCE_INTERRUPT_LATCHED 0x0001 - -/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */ - -#define CM_RESOURCE_MEMORY_READ_WRITE 0x0000 -#define CM_RESOURCE_MEMORY_READ_ONLY 0x0001 -#define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002 -#define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004 -#define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008 -#define CM_RESOURCE_MEMORY_24 0x0010 -#define CM_RESOURCE_MEMORY_CACHEABLE 0x0020 - -/* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */ - -#define CM_RESOURCE_DMA_8 0x0000 -#define CM_RESOURCE_DMA_16 0x0001 -#define CM_RESOURCE_DMA_32 0x0002 -#define CM_RESOURCE_DMA_8_AND_16 0x0004 -#define CM_RESOURCE_DMA_BUS_MASTER 0x0008 -#define CM_RESOURCE_DMA_TYPE_A 0x0010 -#define CM_RESOURCE_DMA_TYPE_B 0x0020 -#define CM_RESOURCE_DMA_TYPE_F 0x0040 - -typedef struct _CM_PARTIAL_RESOURCE_LIST { - USHORT Version; - USHORT Revision; - ULONG Count; - CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1]; -} CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST; - -typedef struct _CM_FULL_RESOURCE_DESCRIPTOR { - INTERFACE_TYPE InterfaceType; - ULONG BusNumber; - CM_PARTIAL_RESOURCE_LIST PartialResourceList; -} CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR; - -typedef struct _CM_RESOURCE_LIST { - ULONG Count; - CM_FULL_RESOURCE_DESCRIPTOR List[1]; -} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST; - -typedef struct _CM_INT13_DRIVE_PARAMETER { - USHORT DriveSelect; - ULONG MaxCylinders; - USHORT SectorsPerTrack; - USHORT MaxHeads; - USHORT NumberDrives; -} CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER; - -typedef struct _CM_PNP_BIOS_DEVICE_NODE -{ - USHORT Size; - UCHAR Node; - ULONG ProductId; - UCHAR DeviceType[3]; - USHORT DeviceAttributes; -} CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE; - -typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK -{ - UCHAR Signature[4]; - UCHAR Revision; - UCHAR Length; - USHORT ControlField; - UCHAR Checksum; - ULONG EventFlagAddress; - USHORT RealModeEntryOffset; - USHORT RealModeEntrySegment; - USHORT ProtectedModeEntryOffset; - ULONG ProtectedModeCodeBaseAddress; - ULONG OemDeviceId; - USHORT RealModeDataBaseAddress; - ULONG ProtectedModeDataBaseAddress; -} CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK; - -#include - - -typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA -{ - ULONG BytesPerSector; - ULONG NumberOfCylinders; - ULONG SectorsPerTrack; - ULONG NumberOfHeads; -} CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA; - -typedef struct _CM_KEYBOARD_DEVICE_DATA { - USHORT Version; - USHORT Revision; - UCHAR Type; - UCHAR Subtype; - USHORT KeyboardFlags; -} CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA; - -#define KEYBOARD_INSERT_ON 0x08 -#define KEYBOARD_CAPS_LOCK_ON 0x04 -#define KEYBOARD_NUM_LOCK_ON 0x02 -#define KEYBOARD_SCROLL_LOCK_ON 0x01 -#define KEYBOARD_ALT_KEY_DOWN 0x80 -#define KEYBOARD_CTRL_KEY_DOWN 0x40 -#define KEYBOARD_LEFT_SHIFT_DOWN 0x20 -#define KEYBOARD_RIGHT_SHIFT_DOWN 0x10 - -typedef struct _CM_MCA_POS_DATA { - USHORT AdapterId; - UCHAR PosData1; - UCHAR PosData2; - UCHAR PosData3; - UCHAR PosData4; -} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA; - -typedef struct CM_Power_Data_s { - ULONG PD_Size; - DEVICE_POWER_STATE PD_MostRecentPowerState; - ULONG PD_Capabilities; - ULONG PD_D1Latency; - ULONG PD_D2Latency; - ULONG PD_D3Latency; - DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]; -} CM_POWER_DATA, *PCM_POWER_DATA; - -#define PDCAP_D0_SUPPORTED 0x00000001 -#define PDCAP_D1_SUPPORTED 0x00000002 -#define PDCAP_D2_SUPPORTED 0x00000004 -#define PDCAP_D3_SUPPORTED 0x00000008 -#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010 -#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020 -#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040 -#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080 -#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100 - -typedef struct _CM_SCSI_DEVICE_DATA { - USHORT Version; - USHORT Revision; - UCHAR HostIdentifier; -} CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA; - -typedef struct _CM_SERIAL_DEVICE_DATA { - USHORT Version; - USHORT Revision; - ULONG BaudClock; -} CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA; - -typedef struct _IO_COUNTERS { - ULONGLONG ReadOperationCount; - ULONGLONG WriteOperationCount; - ULONGLONG OtherOperationCount; - ULONGLONG ReadTransferCount; - ULONGLONG WriteTransferCount; - ULONGLONG OtherTransferCount; -} IO_COUNTERS, *PIO_COUNTERS; - -typedef struct _VM_COUNTERS -{ - SIZE_T PeakVirtualSize; - SIZE_T VirtualSize; - ULONG PageFaultCount; - SIZE_T PeakWorkingSetSize; - SIZE_T WorkingSetSize; - SIZE_T QuotaPeakPagedPoolUsage; - SIZE_T QuotaPagedPoolUsage; - SIZE_T QuotaPeakNonPagedPoolUsage; - SIZE_T QuotaNonPagedPoolUsage; - SIZE_T PagefileUsage; - SIZE_T PeakPagefileUsage; -} VM_COUNTERS, *PVM_COUNTERS; - -typedef struct _VM_COUNTERS_EX -{ - SIZE_T PeakVirtualSize; - SIZE_T VirtualSize; - ULONG PageFaultCount; - SIZE_T PeakWorkingSetSize; - SIZE_T WorkingSetSize; - SIZE_T QuotaPeakPagedPoolUsage; - SIZE_T QuotaPagedPoolUsage; - SIZE_T QuotaPeakNonPagedPoolUsage; - SIZE_T QuotaNonPagedPoolUsage; - SIZE_T PagefileUsage; - SIZE_T PeakPagefileUsage; - SIZE_T PrivateUsage; -} VM_COUNTERS_EX, *PVM_COUNTERS_EX; - -typedef struct _POOLED_USAGE_AND_LIMITS -{ - SIZE_T PeakPagedPoolUsage; - SIZE_T PagedPoolUsage; - SIZE_T PagedPoolLimit; - SIZE_T PeakNonPagedPoolUsage; - SIZE_T NonPagedPoolUsage; - SIZE_T NonPagedPoolLimit; - SIZE_T PeakPagefileUsage; - SIZE_T PagefileUsage; - SIZE_T PagefileLimit; -} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS; - -typedef enum _KINTERRUPT_POLARITY -{ - InterruptPolarityUnknown, - InterruptActiveHigh, - InterruptActiveLow -} KINTERRUPT_POLARITY, *PKINTERRUPT_POLARITY; - -typedef struct _IO_ERROR_LOG_PACKET { - UCHAR MajorFunctionCode; - UCHAR RetryCount; - USHORT DumpDataSize; - USHORT NumberOfStrings; - USHORT StringOffset; - USHORT EventCategory; - NTSTATUS ErrorCode; - ULONG UniqueErrorValue; - NTSTATUS FinalStatus; - ULONG SequenceNumber; - ULONG IoControlCode; - LARGE_INTEGER DeviceOffset; - ULONG DumpData[1]; -} IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET; - -typedef struct _IO_ERROR_LOG_MESSAGE { - USHORT Type; - USHORT Size; - USHORT DriverNameLength; - LARGE_INTEGER TimeStamp; - ULONG DriverNameOffset; - IO_ERROR_LOG_PACKET EntryData; -} IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE; - -#define ERROR_LOG_LIMIT_SIZE 240 -#define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \ - sizeof(IO_ERROR_LOG_PACKET) + \ - (sizeof(WCHAR) * 40)) -#define ERROR_LOG_MESSAGE_LIMIT_SIZE \ - (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH) -#define IO_ERROR_LOG_MESSAGE_LENGTH \ - ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \ - ERROR_LOG_MESSAGE_LIMIT_SIZE : \ - PORT_MAXIMUM_MESSAGE_LENGTH) -#define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \ - IO_ERROR_LOG_MESSAGE_HEADER_LENGTH) - -typedef struct _CONTROLLER_OBJECT { - CSHORT Type; - CSHORT Size; - PVOID ControllerExtension; - KDEVICE_QUEUE DeviceWaitQueue; - ULONG Spare1; - LARGE_INTEGER Spare2; -} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT; - -typedef enum _DMA_WIDTH { - Width8Bits, - Width16Bits, - Width32Bits, - MaximumDmaWidth -} DMA_WIDTH, *PDMA_WIDTH; - -typedef enum _DMA_SPEED { - Compatible, - TypeA, - TypeB, - TypeC, - TypeF, - MaximumDmaSpeed -} DMA_SPEED, *PDMA_SPEED; - -/* DEVICE_DESCRIPTION.Version */ - -#define DEVICE_DESCRIPTION_VERSION 0x0000 -#define DEVICE_DESCRIPTION_VERSION1 0x0001 -#define DEVICE_DESCRIPTION_VERSION2 0x0002 - -typedef struct _DEVICE_DESCRIPTION { - ULONG Version; - BOOLEAN Master; - BOOLEAN ScatterGather; - BOOLEAN DemandMode; - BOOLEAN AutoInitialize; - BOOLEAN Dma32BitAddresses; - BOOLEAN IgnoreCount; - BOOLEAN Reserved1; - BOOLEAN Dma64BitAddresses; - ULONG BusNumber; - ULONG DmaChannel; - INTERFACE_TYPE InterfaceType; - DMA_WIDTH DmaWidth; - DMA_SPEED DmaSpeed; - ULONG MaximumLength; - ULONG DmaPort; -} DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION; - -/* VPB.Flags */ -#define VPB_MOUNTED 0x0001 -#define VPB_LOCKED 0x0002 -#define VPB_PERSISTENT 0x0004 -#define VPB_REMOVE_PENDING 0x0008 -#define VPB_RAW_MOUNT 0x0010 - -#define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR)) - -typedef struct _VPB { - CSHORT Type; - CSHORT Size; - USHORT Flags; - USHORT VolumeLabelLength; - struct _DEVICE_OBJECT *DeviceObject; - struct _DEVICE_OBJECT *RealDevice; - ULONG SerialNumber; - ULONG ReferenceCount; - WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)]; -} VPB, *PVPB; - -/* DEVICE_OBJECT.Flags */ - -#define DO_VERIFY_VOLUME 0x00000002 -#define DO_BUFFERED_IO 0x00000004 -#define DO_EXCLUSIVE 0x00000008 -#define DO_DIRECT_IO 0x00000010 -#define DO_MAP_IO_BUFFER 0x00000020 -#define DO_DEVICE_HAS_NAME 0x00000040 -#define DO_DEVICE_INITIALIZING 0x00000080 -#define DO_SYSTEM_BOOT_PARTITION 0x00000100 -#define DO_LONG_TERM_REQUESTS 0x00000200 -#define DO_NEVER_LAST_DEVICE 0x00000400 -#define DO_SHUTDOWN_REGISTERED 0x00000800 -#define DO_BUS_ENUMERATED_DEVICE 0x00001000 -#define DO_POWER_PAGABLE 0x00002000 -#define DO_POWER_INRUSH 0x00004000 -#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000 -#define DO_XIP 0x00020000 - -/* DEVICE_OBJECT.Characteristics */ - -#define FILE_REMOVABLE_MEDIA 0x00000001 -#define FILE_READ_ONLY_DEVICE 0x00000002 -#define FILE_FLOPPY_DISKETTE 0x00000004 -#define FILE_WRITE_ONCE_MEDIA 0x00000008 -#define FILE_REMOTE_DEVICE 0x00000010 -#define FILE_DEVICE_IS_MOUNTED 0x00000020 -#define FILE_VIRTUAL_VOLUME 0x00000040 -#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 -#define FILE_DEVICE_SECURE_OPEN 0x00000100 - -/* DEVICE_OBJECT.AlignmentRequirement */ - -#define FILE_BYTE_ALIGNMENT 0x00000000 -#define FILE_WORD_ALIGNMENT 0x00000001 -#define FILE_LONG_ALIGNMENT 0x00000003 -#define FILE_QUAD_ALIGNMENT 0x00000007 -#define FILE_OCTA_ALIGNMENT 0x0000000f -#define FILE_32_BYTE_ALIGNMENT 0x0000001f -#define FILE_64_BYTE_ALIGNMENT 0x0000003f -#define FILE_128_BYTE_ALIGNMENT 0x0000007f -#define FILE_256_BYTE_ALIGNMENT 0x000000ff -#define FILE_512_BYTE_ALIGNMENT 0x000001ff - -/* DEVICE_OBJECT.DeviceType */ - -#define DEVICE_TYPE ULONG - -#define FILE_DEVICE_BEEP 0x00000001 -#define FILE_DEVICE_CD_ROM 0x00000002 -#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 -#define FILE_DEVICE_CONTROLLER 0x00000004 -#define FILE_DEVICE_DATALINK 0x00000005 -#define FILE_DEVICE_DFS 0x00000006 -#define FILE_DEVICE_DISK 0x00000007 -#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 -#define FILE_DEVICE_FILE_SYSTEM 0x00000009 -#define FILE_DEVICE_INPORT_PORT 0x0000000a -#define FILE_DEVICE_KEYBOARD 0x0000000b -#define FILE_DEVICE_MAILSLOT 0x0000000c -#define FILE_DEVICE_MIDI_IN 0x0000000d -#define FILE_DEVICE_MIDI_OUT 0x0000000e -#define FILE_DEVICE_MOUSE 0x0000000f -#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 -#define FILE_DEVICE_NAMED_PIPE 0x00000011 -#define FILE_DEVICE_NETWORK 0x00000012 -#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 -#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 -#define FILE_DEVICE_NULL 0x00000015 -#define FILE_DEVICE_PARALLEL_PORT 0x00000016 -#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 -#define FILE_DEVICE_PRINTER 0x00000018 -#define FILE_DEVICE_SCANNER 0x00000019 -#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a -#define FILE_DEVICE_SERIAL_PORT 0x0000001b -#define FILE_DEVICE_SCREEN 0x0000001c -#define FILE_DEVICE_SOUND 0x0000001d -#define FILE_DEVICE_STREAMS 0x0000001e -#define FILE_DEVICE_TAPE 0x0000001f -#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 -#define FILE_DEVICE_TRANSPORT 0x00000021 -#define FILE_DEVICE_UNKNOWN 0x00000022 -#define FILE_DEVICE_VIDEO 0x00000023 -#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 -#define FILE_DEVICE_WAVE_IN 0x00000025 -#define FILE_DEVICE_WAVE_OUT 0x00000026 -#define FILE_DEVICE_8042_PORT 0x00000027 -#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 -#define FILE_DEVICE_BATTERY 0x00000029 -#define FILE_DEVICE_BUS_EXTENDER 0x0000002a -#define FILE_DEVICE_MODEM 0x0000002b -#define FILE_DEVICE_VDM 0x0000002c -#define FILE_DEVICE_MASS_STORAGE 0x0000002d -#define FILE_DEVICE_SMB 0x0000002e -#define FILE_DEVICE_KS 0x0000002f -#define FILE_DEVICE_CHANGER 0x00000030 -#define FILE_DEVICE_SMARTCARD 0x00000031 -#define FILE_DEVICE_ACPI 0x00000032 -#define FILE_DEVICE_DVD 0x00000033 -#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 -#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 -#define FILE_DEVICE_DFS_VOLUME 0x00000036 -#define FILE_DEVICE_SERENUM 0x00000037 -#define FILE_DEVICE_TERMSRV 0x00000038 -#define FILE_DEVICE_KSEC 0x00000039 -#define FILE_DEVICE_FIPS 0x0000003a - -typedef struct _DEVICE_OBJECT { - CSHORT Type; - USHORT Size; - LONG ReferenceCount; - struct _DRIVER_OBJECT *DriverObject; - struct _DEVICE_OBJECT *NextDevice; - struct _DEVICE_OBJECT *AttachedDevice; - struct _IRP *CurrentIrp; - PIO_TIMER Timer; - ULONG Flags; - ULONG Characteristics; - volatile PVPB Vpb; - PVOID DeviceExtension; - DEVICE_TYPE DeviceType; - CCHAR StackSize; - union { - LIST_ENTRY ListEntry; - WAIT_CONTEXT_BLOCK Wcb; - } Queue; - ULONG AlignmentRequirement; - KDEVICE_QUEUE DeviceQueue; - KDPC Dpc; - ULONG ActiveThreadCount; - PSECURITY_DESCRIPTOR SecurityDescriptor; - KEVENT DeviceLock; - USHORT SectorSize; - USHORT Spare1; - struct _DEVOBJ_EXTENSION *DeviceObjectExtension; - PVOID Reserved; -} DEVICE_OBJECT, *PDEVICE_OBJECT; - -typedef enum _DEVICE_RELATION_TYPE { - BusRelations, - EjectionRelations, - PowerRelations, - RemovalRelations, - TargetDeviceRelation, - SingleBusRelations -} DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE; - -typedef struct _DEVICE_RELATIONS { - ULONG Count; - PDEVICE_OBJECT Objects[1]; -} DEVICE_RELATIONS, *PDEVICE_RELATIONS; - -typedef struct _SCATTER_GATHER_ELEMENT { - PHYSICAL_ADDRESS Address; - ULONG Length; - ULONG_PTR Reserved; -} SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT; - -typedef struct _SCATTER_GATHER_LIST { - ULONG NumberOfElements; - ULONG_PTR Reserved; - SCATTER_GATHER_ELEMENT Elements[1]; -} SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST; - -#define MDL_MAPPED_TO_SYSTEM_VA 0x0001 -#define MDL_PAGES_LOCKED 0x0002 -#define MDL_SOURCE_IS_NONPAGED_POOL 0x0004 -#define MDL_ALLOCATED_FIXED_SIZE 0x0008 -#define MDL_PARTIAL 0x0010 -#define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020 -#define MDL_IO_PAGE_READ 0x0040 -#define MDL_WRITE_OPERATION 0x0080 -#define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100 -#define MDL_FREE_EXTRA_PTES 0x0200 -#define MDL_DESCRIBES_AWE 0x0400 -#define MDL_IO_SPACE 0x0800 -#define MDL_NETWORK_HEADER 0x1000 -#define MDL_MAPPING_CAN_FAIL 0x2000 -#define MDL_ALLOCATED_MUST_SUCCEED 0x4000 -#define MDL_INTERNAL 0x8000 - - -#define MDL_MAPPING_FLAGS ( \ - MDL_MAPPED_TO_SYSTEM_VA | \ - MDL_PAGES_LOCKED | \ - MDL_SOURCE_IS_NONPAGED_POOL | \ - MDL_PARTIAL_HAS_BEEN_MAPPED | \ - MDL_PARENT_MAPPED_SYSTEM_VA | \ - MDL_SYSTEM_VA | \ - MDL_IO_SPACE) - -typedef struct _DRIVER_EXTENSION { - struct _DRIVER_OBJECT *DriverObject; - PDRIVER_ADD_DEVICE AddDevice; - ULONG Count; - UNICODE_STRING ServiceKeyName; -} DRIVER_EXTENSION, *PDRIVER_EXTENSION; - -#define DRVO_UNLOAD_INVOKED 0x00000001 -#define DRVO_LEGACY_DRIVER 0x00000002 -#define DRVO_BUILTIN_DRIVER 0x00000004 -#define DRVO_REINIT_REGISTERED 0x00000008 -#define DRVO_INITIALIZED 0x00000010 -#define DRVO_BOOTREINIT_REGISTERED 0x00000020 -#define DRVO_LEGACY_RESOURCES 0x00000040 - -typedef struct _DRIVER_OBJECT { - CSHORT Type; - CSHORT Size; - PDEVICE_OBJECT DeviceObject; - ULONG Flags; - PVOID DriverStart; - ULONG DriverSize; - PVOID DriverSection; - PDRIVER_EXTENSION DriverExtension; - UNICODE_STRING DriverName; - PUNICODE_STRING HardwareDatabase; - struct _FAST_IO_DISPATCH *FastIoDispatch; - PDRIVER_INITIALIZE DriverInit; - PDRIVER_STARTIO DriverStartIo; - PDRIVER_UNLOAD DriverUnload; - PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1]; -} DRIVER_OBJECT; -typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT; - -typedef struct _DMA_ADAPTER { - USHORT Version; - USHORT Size; - struct _DMA_OPERATIONS* DmaOperations; -} DMA_ADAPTER, *PDMA_ADAPTER; - -typedef VOID -(DDKAPI *PPUT_DMA_ADAPTER)( - IN PDMA_ADAPTER DmaAdapter); - -typedef PVOID -(DDKAPI *PALLOCATE_COMMON_BUFFER)( - IN PDMA_ADAPTER DmaAdapter, - IN ULONG Length, - OUT PPHYSICAL_ADDRESS LogicalAddress, - IN BOOLEAN CacheEnabled); - -typedef VOID -(DDKAPI *PFREE_COMMON_BUFFER)( - IN PDMA_ADAPTER DmaAdapter, - IN ULONG Length, - IN PHYSICAL_ADDRESS LogicalAddress, - IN PVOID VirtualAddress, - IN BOOLEAN CacheEnabled); - -typedef NTSTATUS -(DDKAPI *PALLOCATE_ADAPTER_CHANNEL)( - IN PDMA_ADAPTER DmaAdapter, - IN PDEVICE_OBJECT DeviceObject, - IN ULONG NumberOfMapRegisters, - IN PDRIVER_CONTROL ExecutionRoutine, - IN PVOID Context); - -typedef BOOLEAN -(DDKAPI *PFLUSH_ADAPTER_BUFFERS)( - IN PDMA_ADAPTER DmaAdapter, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN ULONG Length, - IN BOOLEAN WriteToDevice); - -typedef VOID -(DDKAPI *PFREE_ADAPTER_CHANNEL)( - IN PDMA_ADAPTER DmaAdapter); - -typedef VOID -(DDKAPI *PFREE_MAP_REGISTERS)( - IN PDMA_ADAPTER DmaAdapter, - PVOID MapRegisterBase, - ULONG NumberOfMapRegisters); - -typedef PHYSICAL_ADDRESS -(DDKAPI *PMAP_TRANSFER)( - IN PDMA_ADAPTER DmaAdapter, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN OUT PULONG Length, - IN BOOLEAN WriteToDevice); - -typedef ULONG -(DDKAPI *PGET_DMA_ALIGNMENT)( - IN PDMA_ADAPTER DmaAdapter); - -typedef ULONG -(DDKAPI *PREAD_DMA_COUNTER)( - IN PDMA_ADAPTER DmaAdapter); - -typedef NTSTATUS -(DDKAPI *PGET_SCATTER_GATHER_LIST)( - IN PDMA_ADAPTER DmaAdapter, - IN PDEVICE_OBJECT DeviceObject, - IN PMDL Mdl, - IN PVOID CurrentVa, - IN ULONG Length, - IN PDRIVER_LIST_CONTROL ExecutionRoutine, - IN PVOID Context, - IN BOOLEAN WriteToDevice); - -typedef VOID -(DDKAPI *PPUT_SCATTER_GATHER_LIST)( - IN PDMA_ADAPTER DmaAdapter, - IN PSCATTER_GATHER_LIST ScatterGather, - IN BOOLEAN WriteToDevice); - -typedef NTSTATUS -(DDKAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)( - IN PDMA_ADAPTER DmaAdapter, - IN PMDL Mdl OPTIONAL, - IN PVOID CurrentVa, - IN ULONG Length, - OUT PULONG ScatterGatherListSize, - OUT PULONG pNumberOfMapRegisters OPTIONAL); - -typedef NTSTATUS -(DDKAPI *PBUILD_SCATTER_GATHER_LIST)( - IN PDMA_ADAPTER DmaAdapter, - IN PDEVICE_OBJECT DeviceObject, - IN PMDL Mdl, - IN PVOID CurrentVa, - IN ULONG Length, - IN PDRIVER_LIST_CONTROL ExecutionRoutine, - IN PVOID Context, - IN BOOLEAN WriteToDevice, - IN PVOID ScatterGatherBuffer, - IN ULONG ScatterGatherLength); - -typedef NTSTATUS -(DDKAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)( - IN PDMA_ADAPTER DmaAdapter, - IN PSCATTER_GATHER_LIST ScatterGather, - IN PMDL OriginalMdl, - OUT PMDL *TargetMdl); - -typedef struct _DMA_OPERATIONS { - ULONG Size; - PPUT_DMA_ADAPTER PutDmaAdapter; - PALLOCATE_COMMON_BUFFER AllocateCommonBuffer; - PFREE_COMMON_BUFFER FreeCommonBuffer; - PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel; - PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers; - PFREE_ADAPTER_CHANNEL FreeAdapterChannel; - PFREE_MAP_REGISTERS FreeMapRegisters; - PMAP_TRANSFER MapTransfer; - PGET_DMA_ALIGNMENT GetDmaAlignment; - PREAD_DMA_COUNTER ReadDmaCounter; - PGET_SCATTER_GATHER_LIST GetScatterGatherList; - PPUT_SCATTER_GATHER_LIST PutScatterGatherList; - PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList; - PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList; - PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList; -} DMA_OPERATIONS, *PDMA_OPERATIONS; - -typedef enum _ARBITER_REQUEST_SOURCE { - ArbiterRequestUndefined = -1, - ArbiterRequestLegacyReported, - ArbiterRequestHalReported, - ArbiterRequestLegacyAssigned, - ArbiterRequestPnpDetected, - ArbiterRequestPnpEnumerated -} ARBITER_REQUEST_SOURCE; - -typedef enum _ARBITER_RESULT { - ArbiterResultUndefined = -1, - ArbiterResultSuccess, - ArbiterResultExternalConflict, - ArbiterResultNullRequest -} ARBITER_RESULT; - -typedef enum _ARBITER_ACTION { - ArbiterActionTestAllocation, - ArbiterActionRetestAllocation, - ArbiterActionCommitAllocation, - ArbiterActionRollbackAllocation, - ArbiterActionQueryAllocatedResources, - ArbiterActionWriteReservedResources, - ArbiterActionQueryConflict, - ArbiterActionQueryArbitrate, - ArbiterActionAddReserved, - ArbiterActionBootAllocation -} ARBITER_ACTION, *PARBITER_ACTION; - -typedef struct _ARBITER_CONFLICT_INFO { - PDEVICE_OBJECT OwningObject; - ULONGLONG Start; - ULONGLONG End; -} ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO; - -typedef struct _ARBITER_PARAMETERS { - union { - struct { - IN OUT PLIST_ENTRY ArbitrationList; - IN ULONG AllocateFromCount; - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom; - } TestAllocation; - - struct { - IN OUT PLIST_ENTRY ArbitrationList; - IN ULONG AllocateFromCount; - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom; - } RetestAllocation; - - struct { - IN OUT PLIST_ENTRY ArbitrationList; - } BootAllocation; - - struct { - OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources; - } QueryAllocatedResources; - - struct { - IN PDEVICE_OBJECT PhysicalDeviceObject; - IN PIO_RESOURCE_DESCRIPTOR ConflictingResource; - OUT PULONG ConflictCount; - OUT PARBITER_CONFLICT_INFO *Conflicts; - } QueryConflict; - - struct { - IN PLIST_ENTRY ArbitrationList; - } QueryArbitrate; - - struct { - IN PDEVICE_OBJECT ReserveDevice; - } AddReserved; - } Parameters; -} ARBITER_PARAMETERS, *PARBITER_PARAMETERS; - -#define ARBITER_FLAG_BOOT_CONFIG 0x00000001 - -typedef struct _ARBITER_LIST_ENTRY { - LIST_ENTRY ListEntry; - ULONG AlternativeCount; - PIO_RESOURCE_DESCRIPTOR Alternatives; - PDEVICE_OBJECT PhysicalDeviceObject; - ARBITER_REQUEST_SOURCE RequestSource; - ULONG Flags; - LONG_PTR WorkSpace; - INTERFACE_TYPE InterfaceType; - ULONG SlotNumber; - ULONG BusNumber; - PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment; - PIO_RESOURCE_DESCRIPTOR SelectedAlternative; - ARBITER_RESULT Result; -} ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY; - -typedef NTSTATUS -(DDKAPI *PARBITER_HANDLER)( - IN PVOID Context, - IN ARBITER_ACTION Action, - IN OUT PARBITER_PARAMETERS Parameters); - -#define ARBITER_PARTIAL 0x00000001 - -typedef struct _ARBITER_INTERFACE { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PARBITER_HANDLER ArbiterHandler; - ULONG Flags; -} ARBITER_INTERFACE, *PARBITER_INTERFACE; - -typedef enum _KPROFILE_SOURCE { - ProfileTime, - ProfileAlignmentFixup, - ProfileTotalIssues, - ProfilePipelineDry, - ProfileLoadInstructions, - ProfilePipelineFrozen, - ProfileBranchInstructions, - ProfileTotalNonissues, - ProfileDcacheMisses, - ProfileIcacheMisses, - ProfileCacheMisses, - ProfileBranchMispredictions, - ProfileStoreInstructions, - ProfileFpInstructions, - ProfileIntegerInstructions, - Profile2Issue, - Profile3Issue, - Profile4Issue, - ProfileSpecialInstructions, - ProfileTotalCycles, - ProfileIcacheIssues, - ProfileDcacheAccesses, - ProfileMemoryBarrierCycles, - ProfileLoadLinkedIssues, - ProfileMaximum -} KPROFILE_SOURCE; - -typedef enum _HAL_QUERY_INFORMATION_CLASS { - HalInstalledBusInformation, - HalProfileSourceInformation, - HalInformationClassUnused1, - HalPowerInformation, - HalProcessorSpeedInformation, - HalCallbackInformation, - HalMapRegisterInformation, - HalMcaLogInformation, - HalFrameBufferCachingInformation, - HalDisplayBiosInformation, - HalProcessorFeatureInformation, - HalNumaTopologyInterface, - HalErrorInformation, - HalCmcLogInformation, - HalCpeLogInformation, - HalQueryMcaInterface, - HalQueryAMLIIllegalIOPortAddresses, - HalQueryMaxHotPlugMemoryAddress, - HalPartitionIpiInterface, - HalPlatformInformation, - HalQueryProfileSourceList -} HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS; - -typedef enum _HAL_SET_INFORMATION_CLASS { - HalProfileSourceInterval, - HalProfileSourceInterruptHandler, - HalMcaRegisterDriver, - HalKernelErrorHandler, - HalCmcRegisterDriver, - HalCpeRegisterDriver, - HalMcaLog, - HalCmcLog, - HalCpeLog, - HalGenerateCmcInterrupt -} HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS; - -typedef struct _HAL_PROFILE_SOURCE_INTERVAL -{ - KPROFILE_SOURCE Source; - ULONG_PTR Interval; -} HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL; - -typedef struct _HAL_PROFILE_SOURCE_INFORMATION -{ - KPROFILE_SOURCE Source; - BOOLEAN Supported; - ULONG Interval; -} HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION; - -typedef struct _MAP_REGISTER_ENTRY -{ - PVOID MapRegister; - BOOLEAN WriteToDevice; -} MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY; - -typedef struct -{ - UCHAR Type; - BOOLEAN Valid; - UCHAR Reserved[2]; - PUCHAR TranslatedAddress; - ULONG Length; -} DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS; - -typedef struct -{ - PHYSICAL_ADDRESS Start; - PHYSICAL_ADDRESS MaxEnd; - PVOID VirtualAddress; - ULONG Length; - BOOLEAN Cached; - BOOLEAN Aligned; -} DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS; - -typedef struct -{ - ULONG Bus; - ULONG Slot; - USHORT VendorID; - USHORT DeviceID; - UCHAR BaseClass; - UCHAR SubClass; - UCHAR ProgIf; - BOOLEAN Initialized; - DEBUG_DEVICE_ADDRESS BaseAddress[6]; - DEBUG_MEMORY_REQUIREMENTS Memory; -} DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR; - -typedef enum _KD_OPTION { - KD_OPTION_SET_BLOCK_ENABLE, -} KD_OPTION; - -/* Function Type Defintions for Dispatch Functions */ -struct _DEVICE_CONTROL_CONTEXT; - -typedef VOID -(DDKAPI *PDEVICE_CONTROL_COMPLETION)( - IN struct _DEVICE_CONTROL_CONTEXT *ControlContext); - -typedef struct _DEVICE_CONTROL_CONTEXT { - NTSTATUS Status; - PDEVICE_HANDLER_OBJECT DeviceHandler; - PDEVICE_OBJECT DeviceObject; - ULONG ControlCode; - PVOID Buffer; - PULONG BufferLength; - PVOID Context; -} DEVICE_CONTROL_CONTEXT, *PDEVICE_CONTROL_CONTEXT; - -typedef struct _PM_DISPATCH_TABLE { - ULONG Signature; - ULONG Version; - PVOID Function[1]; -} PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE; - -typedef enum _RESOURCE_TRANSLATION_DIRECTION { - TranslateChildToParent, - TranslateParentToChild -} RESOURCE_TRANSLATION_DIRECTION; - -typedef NTSTATUS -(DDKAPI *PTRANSLATE_RESOURCE_HANDLER)( - IN PVOID Context, - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, - IN RESOURCE_TRANSLATION_DIRECTION Direction, - IN ULONG AlternativesCount, - IN IO_RESOURCE_DESCRIPTOR Alternatives[], - IN PDEVICE_OBJECT PhysicalDeviceObject, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target); - -typedef NTSTATUS -(DDKAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)( - IN PVOID Context, - IN PIO_RESOURCE_DESCRIPTOR Source, - IN PDEVICE_OBJECT PhysicalDeviceObject, - OUT PULONG TargetCount, - OUT PIO_RESOURCE_DESCRIPTOR *Target); - -typedef struct _TRANSLATOR_INTERFACE { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PTRANSLATE_RESOURCE_HANDLER TranslateResources; - PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements; -} TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE; - -typedef NTSTATUS -(DDKAPI *pHalDeviceControl)( - IN PDEVICE_HANDLER_OBJECT DeviceHandler, - IN PDEVICE_OBJECT DeviceObject, - IN ULONG ControlCode, - IN OUT PVOID Buffer OPTIONAL, - IN OUT PULONG BufferLength OPTIONAL, - IN PVOID Context, - IN PDEVICE_CONTROL_COMPLETION CompletionRoutine); - -typedef VOID -(FASTCALL *pHalExamineMBR)( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG MBRTypeIdentifier, - OUT PVOID *Buffer); - -typedef VOID -(FASTCALL *pHalIoAssignDriveLetters)( - IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, - IN PSTRING NtDeviceName, - OUT PUCHAR NtSystemPath, - OUT PSTRING NtSystemPathString); - -typedef NTSTATUS -(FASTCALL *pHalIoReadPartitionTable)( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN BOOLEAN ReturnRecognizedPartitions, - OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); - -typedef NTSTATUS -(FASTCALL *pHalIoSetPartitionInformation)( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG PartitionNumber, - IN ULONG PartitionType); - -typedef NTSTATUS -(FASTCALL *pHalIoWritePartitionTable)( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG SectorsPerTrack, - IN ULONG NumberOfHeads, - IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); - -typedef PBUS_HANDLER -(FASTCALL *pHalHandlerForBus)( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber); - -typedef VOID -(FASTCALL *pHalReferenceBusHandler)( - IN PBUS_HANDLER BusHandler); - -typedef NTSTATUS -(DDKAPI *pHalQuerySystemInformation)( - IN HAL_QUERY_INFORMATION_CLASS InformationClass, - IN ULONG BufferSize, - IN OUT PVOID Buffer, - OUT PULONG ReturnedLength); - -typedef NTSTATUS -(DDKAPI *pHalSetSystemInformation)( - IN HAL_SET_INFORMATION_CLASS InformationClass, - IN ULONG BufferSize, - IN PVOID Buffer); - -typedef NTSTATUS -(DDKAPI *pHalQueryBusSlots)( - IN PBUS_HANDLER BusHandler, - IN ULONG BufferSize, - OUT PULONG SlotNumbers, - OUT PULONG ReturnedLength); - -typedef NTSTATUS -(DDKAPI *pHalInitPnpDriver)( - VOID); - -typedef NTSTATUS -(DDKAPI *pHalInitPowerManagement)( - IN PPM_DISPATCH_TABLE PmDriverDispatchTable, - OUT PPM_DISPATCH_TABLE *PmHalDispatchTable); - -typedef struct _DMA_ADAPTER* -(DDKAPI *pHalGetDmaAdapter)( - IN PVOID Context, - IN struct _DEVICE_DESCRIPTION *DeviceDescriptor, - OUT PULONG NumberOfMapRegisters); - -typedef NTSTATUS -(DDKAPI *pHalGetInterruptTranslator)( - IN INTERFACE_TYPE ParentInterfaceType, - IN ULONG ParentBusNumber, - IN INTERFACE_TYPE BridgeInterfaceType, - IN USHORT Size, - IN USHORT Version, - OUT PTRANSLATOR_INTERFACE Translator, - OUT PULONG BridgeBusNumber); - -typedef NTSTATUS -(DDKAPI *pHalStartMirroring)( - VOID); - -typedef NTSTATUS -(DDKAPI *pHalEndMirroring)( - IN ULONG PassNumber); - -typedef NTSTATUS -(DDKAPI *pHalMirrorPhysicalMemory)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN LARGE_INTEGER NumberOfBytes); - -typedef NTSTATUS -(DDKAPI *pHalMirrorVerify)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN LARGE_INTEGER NumberOfBytes); - -typedef VOID -(DDKAPI *pHalEndOfBoot)( - VOID); - -typedef -BOOLEAN -(DDKAPI *pHalTranslateBusAddress)( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN PHYSICAL_ADDRESS BusAddress, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress -); - -typedef -NTSTATUS -(DDKAPI *pHalAssignSlotResources)( - IN PUNICODE_STRING RegistryPath, - IN PUNICODE_STRING DriverClassName OPTIONAL, - IN PDRIVER_OBJECT DriverObject, - IN PDEVICE_OBJECT DeviceObject, - IN INTERFACE_TYPE BusType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN OUT PCM_RESOURCE_LIST *AllocatedResources -); - -typedef -VOID -(DDKAPI *pHalHaltSystem)( - VOID -); - -typedef -BOOLEAN -(DDKAPI *pHalResetDisplay)( - VOID -); - -typedef -UCHAR -(DDKAPI *pHalVectorToIDTEntry)( - ULONG Vector -); - -typedef -BOOLEAN -(DDKAPI *pHalFindBusAddressTranslation)( - IN PHYSICAL_ADDRESS BusAddress, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress, - IN OUT PULONG_PTR Context, - IN BOOLEAN NextBus -); - -typedef -NTSTATUS -(DDKAPI *pKdSetupPciDeviceForDebugging)( - IN PVOID LoaderBlock OPTIONAL, - IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice -); - -typedef -NTSTATUS -(DDKAPI *pKdReleasePciDeviceForDebugging)( - IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice -); - -typedef -PVOID -(DDKAPI *pKdGetAcpiTablePhase0)( - IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, - IN ULONG Signature -); - -typedef -VOID -(DDKAPI *pKdCheckPowerButton)( - VOID -); - -typedef -ULONG -(DDKAPI *pHalGetInterruptVector)( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN ULONG BusInterruptLevel, - IN ULONG BusInterruptVector, - OUT PKIRQL Irql, - OUT PKAFFINITY Affinity -); - -typedef -NTSTATUS -(DDKAPI *pHalGetVectorInput)( - IN ULONG Vector, - IN KAFFINITY Affinity, - OUT PULONG Input, - OUT PKINTERRUPT_POLARITY Polarity -); - -typedef -PVOID -(DDKAPI *pKdMapPhysicalMemory64)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberPages -); - -typedef -VOID -(DDKAPI *pKdUnmapVirtualAddress)( - IN PVOID VirtualAddress, - IN ULONG NumberPages -); - -typedef -ULONG -(DDKAPI *pKdGetPciDataByOffset)( - IN ULONG BusNumber, - IN ULONG SlotNumber, - OUT PVOID Buffer, - IN ULONG Offset, - IN ULONG Length -); - -typedef -ULONG -(DDKAPI *pKdSetPciDataByOffset)( - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length -); - -typedef BOOLEAN -(DDKAPI *PHAL_RESET_DISPLAY_PARAMETERS)( - ULONG Columns, ULONG Rows); - -typedef struct { - ULONG Version; - pHalQuerySystemInformation HalQuerySystemInformation; - pHalSetSystemInformation HalSetSystemInformation; - pHalQueryBusSlots HalQueryBusSlots; - ULONG Spare1; - pHalExamineMBR HalExamineMBR; - pHalIoAssignDriveLetters HalIoAssignDriveLetters; - pHalIoReadPartitionTable HalIoReadPartitionTable; - pHalIoSetPartitionInformation HalIoSetPartitionInformation; - pHalIoWritePartitionTable HalIoWritePartitionTable; - pHalHandlerForBus HalReferenceHandlerForBus; - pHalReferenceBusHandler HalReferenceBusHandler; - pHalReferenceBusHandler HalDereferenceBusHandler; - pHalInitPnpDriver HalInitPnpDriver; - pHalInitPowerManagement HalInitPowerManagement; - pHalGetDmaAdapter HalGetDmaAdapter; - pHalGetInterruptTranslator HalGetInterruptTranslator; - pHalStartMirroring HalStartMirroring; - pHalEndMirroring HalEndMirroring; - pHalMirrorPhysicalMemory HalMirrorPhysicalMemory; - pHalEndOfBoot HalEndOfBoot; - pHalMirrorVerify HalMirrorVerify; -} HAL_DISPATCH, *PHAL_DISPATCH; - -#if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTHAL_) -extern NTSYSAPI PHAL_DISPATCH HalDispatchTable; -#define HALDISPATCH ((PHAL_DISPATCH)&HalDispatchTable) -#else -extern __declspec(dllexport) HAL_DISPATCH HalDispatchTable; -#define HALDISPATCH (&HalDispatchTable) -#endif - -#define HAL_DISPATCH_VERSION 3 -#define HalDispatchTableVersion HALDISPATCH->Version -#define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation -#define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation -#define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots -#define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus -#define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler -#define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler -#define HalInitPnpDriver HALDISPATCH->HalInitPnpDriver -#define HalInitPowerManagement HALDISPATCH->HalInitPowerManagement -#define HalGetDmaAdapter HALDISPATCH->HalGetDmaAdapter -#define HalGetInterruptTranslator HALDISPATCH->HalGetInterruptTranslator -#define HalStartMirroring HALDISPATCH->HalStartMirroring -#define HalEndMirroring HALDISPATCH->HalEndMirroring -#define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory -#define HalEndOfBoot HALDISPATCH->HalEndOfBoot -#define HalMirrorVerify HALDISPATCH->HalMirrorVerify - -typedef enum _FILE_INFORMATION_CLASS { - FileDirectoryInformation = 1, - FileFullDirectoryInformation, - FileBothDirectoryInformation, - FileBasicInformation, - FileStandardInformation, - FileInternalInformation, - FileEaInformation, - FileAccessInformation, - FileNameInformation, - FileRenameInformation, - FileLinkInformation, - FileNamesInformation, - FileDispositionInformation, - FilePositionInformation, - FileFullEaInformation, - FileModeInformation, - FileAlignmentInformation, - FileAllInformation, - FileAllocationInformation, - FileEndOfFileInformation, - FileAlternateNameInformation, - FileStreamInformation, - FilePipeInformation, - FilePipeLocalInformation, - FilePipeRemoteInformation, - FileMailslotQueryInformation, - FileMailslotSetInformation, - FileCompressionInformation, - FileObjectIdInformation, - FileCompletionInformation, - FileMoveClusterInformation, - FileQuotaInformation, - FileReparsePointInformation, - FileNetworkOpenInformation, - FileAttributeTagInformation, - FileTrackingInformation, - FileIdBothDirectoryInformation, - FileIdFullDirectoryInformation, - FileValidDataLengthInformation, - FileShortNameInformation, - FileMaximumInformation -} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS; - -typedef struct _FILE_POSITION_INFORMATION { - LARGE_INTEGER CurrentByteOffset; -} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; - -typedef struct _FILE_ALIGNMENT_INFORMATION { - ULONG AlignmentRequirement; -} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; - -typedef struct _FILE_NAME_INFORMATION { - ULONG FileNameLength; - WCHAR FileName[1]; -} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; - -#include -typedef struct _FILE_BASIC_INFORMATION { - LARGE_INTEGER CreationTime; - LARGE_INTEGER LastAccessTime; - LARGE_INTEGER LastWriteTime; - LARGE_INTEGER ChangeTime; - ULONG FileAttributes; -} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; -#include - -typedef struct _FILE_STANDARD_INFORMATION { - LARGE_INTEGER AllocationSize; - LARGE_INTEGER EndOfFile; - ULONG NumberOfLinks; - BOOLEAN DeletePending; - BOOLEAN Directory; -} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION; - -typedef struct _FILE_NETWORK_OPEN_INFORMATION { - LARGE_INTEGER CreationTime; - LARGE_INTEGER LastAccessTime; - LARGE_INTEGER LastWriteTime; - LARGE_INTEGER ChangeTime; - LARGE_INTEGER AllocationSize; - LARGE_INTEGER EndOfFile; - ULONG FileAttributes; -} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION; - -typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION { - ULONG FileAttributes; - ULONG ReparseTag; -} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION; - -typedef struct _FILE_DISPOSITION_INFORMATION { - BOOLEAN DeleteFile; -} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; - -typedef struct _FILE_END_OF_FILE_INFORMATION { - LARGE_INTEGER EndOfFile; -} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; - -typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION { - LARGE_INTEGER ValidDataLength; -} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION; - -typedef union _FILE_SEGMENT_ELEMENT { - PVOID64 Buffer; - ULONGLONG Alignment; -}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT; - -typedef enum _FSINFOCLASS { - FileFsVolumeInformation = 1, - FileFsLabelInformation, - FileFsSizeInformation, - FileFsDeviceInformation, - FileFsAttributeInformation, - FileFsControlInformation, - FileFsFullSizeInformation, - FileFsObjectIdInformation, - FileFsDriverPathInformation, - FileFsMaximumInformation -} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS; - -typedef struct _FILE_FS_DEVICE_INFORMATION { - DEVICE_TYPE DeviceType; - ULONG Characteristics; -} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION; - -typedef struct _FILE_FULL_EA_INFORMATION { - ULONG NextEntryOffset; - UCHAR Flags; - UCHAR EaNameLength; - USHORT EaValueLength; - CHAR EaName[1]; -} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION; - -/* ERESOURCE.Flag */ - -#define ResourceNeverExclusive 0x0010 -#define ResourceReleaseByOtherThread 0x0020 -#define ResourceOwnedExclusive 0x0080 - -#define RESOURCE_HASH_TABLE_SIZE 64 - -typedef struct _DEVOBJ_EXTENSION -{ - CSHORT Type; - USHORT Size; - PDEVICE_OBJECT DeviceObject; -} DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION; - -typedef BOOLEAN -(DDKAPI *PFAST_IO_CHECK_IF_POSSIBLE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - IN BOOLEAN CheckForReadOperation, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_READ)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_WRITE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - IN PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_QUERY_BASIC_INFO)( - IN struct _FILE_OBJECT *FileObject, - IN BOOLEAN Wait, - OUT PFILE_BASIC_INFORMATION Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_QUERY_STANDARD_INFO)( - IN struct _FILE_OBJECT *FileObject, - IN BOOLEAN Wait, - OUT PFILE_STANDARD_INFORMATION Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_LOCK)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - PEPROCESS ProcessId, - ULONG Key, - BOOLEAN FailImmediately, - BOOLEAN ExclusiveLock, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_UNLOCK_SINGLE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - PEPROCESS ProcessId, - ULONG Key, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_UNLOCK_ALL)( - IN struct _FILE_OBJECT *FileObject, - PEPROCESS ProcessId, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_UNLOCK_ALL_BY_KEY)( - IN struct _FILE_OBJECT *FileObject, - PVOID ProcessId, - ULONG Key, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_DEVICE_CONTROL)( - IN struct _FILE_OBJECT *FileObject, - IN BOOLEAN Wait, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength, - IN ULONG IoControlCode, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef VOID -(DDKAPI *PFAST_IO_ACQUIRE_FILE)( - IN struct _FILE_OBJECT *FileObject); - -typedef VOID -(DDKAPI *PFAST_IO_RELEASE_FILE)( - IN struct _FILE_OBJECT *FileObject); - -typedef VOID -(DDKAPI *PFAST_IO_DETACH_DEVICE)( - IN struct _DEVICE_OBJECT *SourceDevice, - IN struct _DEVICE_OBJECT *TargetDevice); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_QUERY_NETWORK_OPEN_INFO)( - IN struct _FILE_OBJECT *FileObject, - IN BOOLEAN Wait, - OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer, - OUT struct _IO_STATUS_BLOCK *IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef NTSTATUS -(DDKAPI *PFAST_IO_ACQUIRE_FOR_MOD_WRITE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER EndingOffset, - OUT struct _ERESOURCE **ResourceToRelease, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_MDL_READ)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_MDL_READ_COMPLETE)( - IN struct _FILE_OBJECT *FileObject, - IN PMDL MdlChain, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_PREPARE_MDL_WRITE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_READ_COMPRESSED)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PVOID Buffer, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo, - IN ULONG CompressedDataInfoLength, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_WRITE_COMPRESSED)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - IN PVOID Buffer, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo, - IN ULONG CompressedDataInfoLength, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)( - IN struct _FILE_OBJECT *FileObject, - IN PMDL MdlChain, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef BOOLEAN -(DDKAPI *PFAST_IO_QUERY_OPEN)( - IN struct _IRP *Irp, - OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef NTSTATUS -(DDKAPI *PFAST_IO_RELEASE_FOR_MOD_WRITE)( - IN struct _FILE_OBJECT *FileObject, - IN struct _ERESOURCE *ResourceToRelease, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef NTSTATUS -(DDKAPI *PFAST_IO_ACQUIRE_FOR_CCFLUSH)( - IN struct _FILE_OBJECT *FileObject, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef NTSTATUS -(DDKAPI *PFAST_IO_RELEASE_FOR_CCFLUSH) ( - IN struct _FILE_OBJECT *FileObject, - IN struct _DEVICE_OBJECT *DeviceObject); - -typedef struct _FAST_IO_DISPATCH { - ULONG SizeOfFastIoDispatch; - PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible; - PFAST_IO_READ FastIoRead; - PFAST_IO_WRITE FastIoWrite; - PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo; - PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo; - PFAST_IO_LOCK FastIoLock; - PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle; - PFAST_IO_UNLOCK_ALL FastIoUnlockAll; - PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey; - PFAST_IO_DEVICE_CONTROL FastIoDeviceControl; - PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection; - PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection; - PFAST_IO_DETACH_DEVICE FastIoDetachDevice; - PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo; - PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite; - PFAST_IO_MDL_READ MdlRead; - PFAST_IO_MDL_READ_COMPLETE MdlReadComplete; - PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite; - PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete; - PFAST_IO_READ_COMPRESSED FastIoReadCompressed; - PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed; - PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed; - PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed; - PFAST_IO_QUERY_OPEN FastIoQueryOpen; - PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite; - PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush; - PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush; -} FAST_IO_DISPATCH, *PFAST_IO_DISPATCH; - -typedef struct _SECTION_OBJECT_POINTERS { - PVOID DataSectionObject; - PVOID SharedCacheMap; - PVOID ImageSectionObject; -} SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS; - -typedef struct _IO_COMPLETION_CONTEXT { - PVOID Port; - PVOID Key; -} IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT; - -/* FILE_OBJECT.Flags */ - -#define FO_FILE_OPEN 0x00000001 -#define FO_SYNCHRONOUS_IO 0x00000002 -#define FO_ALERTABLE_IO 0x00000004 -#define FO_NO_INTERMEDIATE_BUFFERING 0x00000008 -#define FO_WRITE_THROUGH 0x00000010 -#define FO_SEQUENTIAL_ONLY 0x00000020 -#define FO_CACHE_SUPPORTED 0x00000040 -#define FO_NAMED_PIPE 0x00000080 -#define FO_STREAM_FILE 0x00000100 -#define FO_MAILSLOT 0x00000200 -#define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400 -#define FO_DIRECT_DEVICE_OPEN 0x00000800 -#define FO_FILE_MODIFIED 0x00001000 -#define FO_FILE_SIZE_CHANGED 0x00002000 -#define FO_CLEANUP_COMPLETE 0x00004000 -#define FO_TEMPORARY_FILE 0x00008000 -#define FO_DELETE_ON_CLOSE 0x00010000 -#define FO_OPENED_CASE_SENSITIVE 0x00020000 -#define FO_HANDLE_CREATED 0x00040000 -#define FO_FILE_FAST_IO_READ 0x00080000 -#define FO_RANDOM_ACCESS 0x00100000 -#define FO_FILE_OPEN_CANCELLED 0x00200000 -#define FO_VOLUME_OPEN 0x00400000 -#define FO_REMOTE_ORIGIN 0x01000000 - -typedef struct _FILE_OBJECT -{ - CSHORT Type; - CSHORT Size; - PDEVICE_OBJECT DeviceObject; - PVPB Vpb; - PVOID FsContext; - PVOID FsContext2; - PSECTION_OBJECT_POINTERS SectionObjectPointer; - PVOID PrivateCacheMap; - NTSTATUS FinalStatus; - struct _FILE_OBJECT *RelatedFileObject; - BOOLEAN LockOperation; - BOOLEAN DeletePending; - BOOLEAN ReadAccess; - BOOLEAN WriteAccess; - BOOLEAN DeleteAccess; - BOOLEAN SharedRead; - BOOLEAN SharedWrite; - BOOLEAN SharedDelete; - ULONG Flags; - UNICODE_STRING FileName; - LARGE_INTEGER CurrentByteOffset; - volatile ULONG Waiters; - volatile ULONG Busy; - PVOID LastLock; - KEVENT Lock; - KEVENT Event; - volatile PIO_COMPLETION_CONTEXT CompletionContext; - KSPIN_LOCK IrpListLock; - LIST_ENTRY IrpList; - volatile PVOID FileObjectExtension; -} FILE_OBJECT; -typedef struct _FILE_OBJECT *PFILE_OBJECT; - -typedef enum _SECURITY_OPERATION_CODE { - SetSecurityDescriptor, - QuerySecurityDescriptor, - DeleteSecurityDescriptor, - AssignSecurityDescriptor -} SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE; - -#define INITIAL_PRIVILEGE_COUNT 3 - -typedef struct _INITIAL_PRIVILEGE_SET { - ULONG PrivilegeCount; - ULONG Control; - LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT]; -} INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET; - -#define SE_MIN_WELL_KNOWN_PRIVILEGE 2 -#define SE_CREATE_TOKEN_PRIVILEGE 2 -#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3 -#define SE_LOCK_MEMORY_PRIVILEGE 4 -#define SE_INCREASE_QUOTA_PRIVILEGE 5 -#define SE_UNSOLICITED_INPUT_PRIVILEGE 6 -#define SE_MACHINE_ACCOUNT_PRIVILEGE 6 -#define SE_TCB_PRIVILEGE 7 -#define SE_SECURITY_PRIVILEGE 8 -#define SE_TAKE_OWNERSHIP_PRIVILEGE 9 -#define SE_LOAD_DRIVER_PRIVILEGE 10 -#define SE_SYSTEM_PROFILE_PRIVILEGE 11 -#define SE_SYSTEMTIME_PRIVILEGE 12 -#define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13 -#define SE_INC_BASE_PRIORITY_PRIVILEGE 14 -#define SE_CREATE_PAGEFILE_PRIVILEGE 15 -#define SE_CREATE_PERMANENT_PRIVILEGE 16 -#define SE_BACKUP_PRIVILEGE 17 -#define SE_RESTORE_PRIVILEGE 18 -#define SE_SHUTDOWN_PRIVILEGE 19 -#define SE_DEBUG_PRIVILEGE 20 -#define SE_AUDIT_PRIVILEGE 21 -#define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22 -#define SE_CHANGE_NOTIFY_PRIVILEGE 23 -#define SE_REMOTE_SHUTDOWN_PRIVILEGE 24 -#define SE_UNDOCK_PRIVILEGE 25 -#define SE_SYNC_AGENT_PRIVILEGE 26 -#define SE_ENABLE_DELEGATION_PRIVILEGE 27 -#define SE_MANAGE_VOLUME_PRIVILEGE 28 -#define SE_IMPERSONATE_PRIVILEGE 29 -#define SE_CREATE_GLOBAL_PRIVILEGE 30 -#define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_GLOBAL_PRIVILEGE - -typedef struct _SECURITY_SUBJECT_CONTEXT { - PACCESS_TOKEN ClientToken; - SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; - PACCESS_TOKEN PrimaryToken; - PVOID ProcessAuditId; -} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT; - -#include -typedef struct _ACCESS_STATE { - LUID OperationID; - BOOLEAN SecurityEvaluated; - BOOLEAN GenerateAudit; - BOOLEAN GenerateOnClose; - BOOLEAN PrivilegesAllocated; - ULONG Flags; - ACCESS_MASK RemainingDesiredAccess; - ACCESS_MASK PreviouslyGrantedAccess; - ACCESS_MASK OriginalDesiredAccess; - SECURITY_SUBJECT_CONTEXT SubjectSecurityContext; - PSECURITY_DESCRIPTOR SecurityDescriptor; - PVOID AuxData; - union { - INITIAL_PRIVILEGE_SET InitialPrivilegeSet; - PRIVILEGE_SET PrivilegeSet; - } Privileges; - - BOOLEAN AuditPrivileges; - UNICODE_STRING ObjectName; - UNICODE_STRING ObjectTypeName; -} ACCESS_STATE, *PACCESS_STATE; -#include - -typedef struct _IO_SECURITY_CONTEXT { - PSECURITY_QUALITY_OF_SERVICE SecurityQos; - PACCESS_STATE AccessState; - ACCESS_MASK DesiredAccess; - ULONG FullCreateOptions; -} IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT; - -#define IO_TYPE_ADAPTER 1 -#define IO_TYPE_CONTROLLER 2 -#define IO_TYPE_DEVICE 3 -#define IO_TYPE_DRIVER 4 -#define IO_TYPE_FILE 5 -#define IO_TYPE_IRP 6 -#define IO_TYPE_MASTER_ADAPTER 7 -#define IO_TYPE_OPEN_PACKET 8 -#define IO_TYPE_TIMER 9 -#define IO_TYPE_VPB 10 -#define IO_TYPE_ERROR_LOG 11 -#define IO_TYPE_ERROR_MESSAGE 12 -#define IO_TYPE_DEVICE_OBJECT_EXTENSION 13 - -#define IO_TYPE_CSQ_IRP_CONTEXT 1 -#define IO_TYPE_CSQ 2 - -struct _IO_CSQ; - -typedef struct _IO_CSQ_IRP_CONTEXT { - ULONG Type; - struct _IRP *Irp; - struct _IO_CSQ *Csq; -} IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT; - -typedef VOID -(DDKAPI *PIO_CSQ_INSERT_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp); - -typedef VOID -(DDKAPI *PIO_CSQ_REMOVE_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp); - -typedef PIRP -(DDKAPI *PIO_CSQ_PEEK_NEXT_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp, - IN PVOID PeekContext); - -typedef VOID -(DDKAPI *PIO_CSQ_ACQUIRE_LOCK)( - IN struct _IO_CSQ *Csq, - OUT PKIRQL Irql); - -typedef VOID -(DDKAPI *PIO_CSQ_RELEASE_LOCK)( - IN struct _IO_CSQ *Csq, - IN KIRQL Irql); - -typedef VOID -(DDKAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp); - -typedef struct _IO_CSQ { - ULONG Type; - PIO_CSQ_INSERT_IRP CsqInsertIrp; - PIO_CSQ_REMOVE_IRP CsqRemoveIrp; - PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp; - PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock; - PIO_CSQ_RELEASE_LOCK CsqReleaseLock; - PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp; - PVOID ReservePointer; -} IO_CSQ, *PIO_CSQ; - -#if !defined(_ALPHA_) -#include -#endif -typedef struct _IO_STACK_LOCATION { - UCHAR MajorFunction; - UCHAR MinorFunction; - UCHAR Flags; - UCHAR Control; - union { - struct { - PIO_SECURITY_CONTEXT SecurityContext; - ULONG Options; - USHORT POINTER_ALIGNMENT FileAttributes; - USHORT ShareAccess; - ULONG POINTER_ALIGNMENT EaLength; - } Create; - struct { - ULONG Length; - ULONG POINTER_ALIGNMENT Key; - LARGE_INTEGER ByteOffset; - } Read; - struct { - ULONG Length; - ULONG POINTER_ALIGNMENT Key; - LARGE_INTEGER ByteOffset; - } Write; - struct { - ULONG Length; - PUNICODE_STRING FileName; - FILE_INFORMATION_CLASS FileInformationClass; - ULONG FileIndex; - } QueryDirectory; - struct { - ULONG Length; - ULONG CompletionFilter; - } NotifyDirectory; - struct { - ULONG Length; - FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass; - } QueryFile; - struct { - ULONG Length; - FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass; - PFILE_OBJECT FileObject; - _ANONYMOUS_UNION union { - _ANONYMOUS_STRUCT struct { - BOOLEAN ReplaceIfExists; - BOOLEAN AdvanceOnly; - } DUMMYSTRUCTNAME; - ULONG ClusterCount; - HANDLE DeleteHandle; - } DUMMYUNIONNAME; - } SetFile; - struct { - ULONG Length; - PVOID EaList; - ULONG EaListLength; - ULONG EaIndex; - } QueryEa; - struct { - ULONG Length; - } SetEa; - struct { - ULONG Length; - FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass; - } QueryVolume; - struct { - ULONG Length; - FS_INFORMATION_CLASS FsInformationClass; - } SetVolume; - struct { - ULONG OutputBufferLength; - ULONG InputBufferLength; - ULONG FsControlCode; - PVOID Type3InputBuffer; - } FileSystemControl; - struct { - PLARGE_INTEGER Length; - ULONG Key; - LARGE_INTEGER ByteOffset; - } LockControl; - struct { - ULONG OutputBufferLength; - ULONG POINTER_ALIGNMENT InputBufferLength; - ULONG POINTER_ALIGNMENT IoControlCode; - PVOID Type3InputBuffer; - } DeviceIoControl; - struct { - SECURITY_INFORMATION SecurityInformation; - ULONG POINTER_ALIGNMENT Length; - } QuerySecurity; - struct { - SECURITY_INFORMATION SecurityInformation; - PSECURITY_DESCRIPTOR SecurityDescriptor; - } SetSecurity; - struct { - PVPB Vpb; - PDEVICE_OBJECT DeviceObject; - } MountVolume; - struct { - PVPB Vpb; - PDEVICE_OBJECT DeviceObject; - } VerifyVolume; - struct { - struct _SCSI_REQUEST_BLOCK *Srb; - } Scsi; - struct { - ULONG Length; - PSID StartSid; - struct _FILE_GET_QUOTA_INFORMATION *SidList; - ULONG SidListLength; - } QueryQuota; - struct { - ULONG Length; - } SetQuota; - struct { - DEVICE_RELATION_TYPE Type; - } QueryDeviceRelations; - struct { - CONST GUID *InterfaceType; - USHORT Size; - USHORT Version; - PINTERFACE Interface; - PVOID InterfaceSpecificData; - } QueryInterface; - struct { - PDEVICE_CAPABILITIES Capabilities; - } DeviceCapabilities; - struct { - PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList; - } FilterResourceRequirements; - struct { - ULONG WhichSpace; - PVOID Buffer; - ULONG Offset; - ULONG POINTER_ALIGNMENT Length; - } ReadWriteConfig; - struct { - BOOLEAN Lock; - } SetLock; - struct { - BUS_QUERY_ID_TYPE IdType; - } QueryId; - struct { - DEVICE_TEXT_TYPE DeviceTextType; - LCID POINTER_ALIGNMENT LocaleId; - } QueryDeviceText; - struct { - BOOLEAN InPath; - BOOLEAN Reserved[3]; - DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type; - } UsageNotification; - struct { - SYSTEM_POWER_STATE PowerState; - } WaitWake; - struct { - PPOWER_SEQUENCE PowerSequence; - } PowerSequence; - struct { - ULONG SystemContext; - POWER_STATE_TYPE POINTER_ALIGNMENT Type; - POWER_STATE POINTER_ALIGNMENT State; - POWER_ACTION POINTER_ALIGNMENT ShutdownType; - } Power; - struct { - PCM_RESOURCE_LIST AllocatedResources; - PCM_RESOURCE_LIST AllocatedResourcesTranslated; - } StartDevice; - struct { - ULONG_PTR ProviderId; - PVOID DataPath; - ULONG BufferSize; - PVOID Buffer; - } WMI; - struct { - PVOID Argument1; - PVOID Argument2; - PVOID Argument3; - PVOID Argument4; - } Others; - } Parameters; - PDEVICE_OBJECT DeviceObject; - PFILE_OBJECT FileObject; - PIO_COMPLETION_ROUTINE CompletionRoutine; - PVOID Context; -} IO_STACK_LOCATION, *PIO_STACK_LOCATION; -#if !defined(_ALPHA_) -#include -#endif - -/* IO_STACK_LOCATION.Control */ - -#define SL_PENDING_RETURNED 0x01 -#define SL_ERROR_RETURNED 0x02 -#define SL_INVOKE_ON_CANCEL 0x20 -#define SL_INVOKE_ON_SUCCESS 0x40 -#define SL_INVOKE_ON_ERROR 0x80 - -/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */ - -#define PCI_WHICHSPACE_CONFIG 0x0 -#define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */ - -typedef enum _KEY_INFORMATION_CLASS { - KeyBasicInformation, - KeyNodeInformation, - KeyFullInformation, - KeyNameInformation, - KeyCachedInformation, - KeyFlagsInformation -} KEY_INFORMATION_CLASS; - -typedef struct _KEY_BASIC_INFORMATION { - LARGE_INTEGER LastWriteTime; - ULONG TitleIndex; - ULONG NameLength; - WCHAR Name[1]; -} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION; - -typedef struct _KEY_FULL_INFORMATION { - LARGE_INTEGER LastWriteTime; - ULONG TitleIndex; - ULONG ClassOffset; - ULONG ClassLength; - ULONG SubKeys; - ULONG MaxNameLen; - ULONG MaxClassLen; - ULONG Values; - ULONG MaxValueNameLen; - ULONG MaxValueDataLen; - WCHAR Class[1]; -} KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION; - -typedef struct _KEY_NODE_INFORMATION { - LARGE_INTEGER LastWriteTime; - ULONG TitleIndex; - ULONG ClassOffset; - ULONG ClassLength; - ULONG NameLength; - WCHAR Name[1]; -} KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION; - -typedef struct _KEY_VALUE_BASIC_INFORMATION { - ULONG TitleIndex; - ULONG Type; - ULONG NameLength; - WCHAR Name[1]; -} KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION; - -typedef struct _KEY_VALUE_FULL_INFORMATION { - ULONG TitleIndex; - ULONG Type; - ULONG DataOffset; - ULONG DataLength; - ULONG NameLength; - WCHAR Name[1]; -} KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION; - -typedef struct _KEY_VALUE_PARTIAL_INFORMATION { - ULONG TitleIndex; - ULONG Type; - ULONG DataLength; - UCHAR Data[1]; -} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION; - -typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 { - ULONG Type; - ULONG DataLength; - UCHAR Data[1]; -} KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64; - -typedef struct _KEY_VALUE_ENTRY { - PUNICODE_STRING ValueName; - ULONG DataLength; - ULONG DataOffset; - ULONG Type; -} KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY; - -typedef enum _KEY_VALUE_INFORMATION_CLASS { - KeyValueBasicInformation, - KeyValueFullInformation, - KeyValuePartialInformation, - KeyValueFullInformationAlign64, - KeyValuePartialInformationAlign64 -} KEY_VALUE_INFORMATION_CLASS; - -typedef struct _KEY_WRITE_TIME_INFORMATION { - LARGE_INTEGER LastWriteTime; -} KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION; - -typedef struct _KEY_USER_FLAGS_INFORMATION { - ULONG UserFlags; -} KEY_USER_FLAGS_INFORMATION, *PKEY_USER_FLAGS_INFORMATION; - -typedef enum _KEY_SET_INFORMATION_CLASS { - KeyWriteTimeInformation, - KeyUserFlagsInformation, - MaxKeySetInfoClass -} KEY_SET_INFORMATION_CLASS; - -/* KEY_VALUE_Xxx.Type */ - -#define REG_NONE 0 -#define REG_SZ 1 -#define REG_EXPAND_SZ 2 -#define REG_BINARY 3 -#define REG_DWORD 4 -#define REG_DWORD_LITTLE_ENDIAN 4 -#define REG_DWORD_BIG_ENDIAN 5 -#define REG_LINK 6 -#define REG_MULTI_SZ 7 -#define REG_RESOURCE_LIST 8 -#define REG_FULL_RESOURCE_DESCRIPTOR 9 -#define REG_RESOURCE_REQUIREMENTS_LIST 10 -#define REG_QWORD 11 -#define REG_QWORD_LITTLE_ENDIAN 11 - -#define PCI_TYPE0_ADDRESSES 6 -#define PCI_TYPE1_ADDRESSES 2 -#define PCI_TYPE2_ADDRESSES 5 - -typedef struct _PCI_COMMON_CONFIG { - USHORT VendorID; - USHORT DeviceID; - USHORT Command; - USHORT Status; - UCHAR RevisionID; - UCHAR ProgIf; - UCHAR SubClass; - UCHAR BaseClass; - UCHAR CacheLineSize; - UCHAR LatencyTimer; - UCHAR HeaderType; - UCHAR BIST; - union { - struct _PCI_HEADER_TYPE_0 { - ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; - ULONG CIS; - USHORT SubVendorID; - USHORT SubSystemID; - ULONG ROMBaseAddress; - UCHAR CapabilitiesPtr; - UCHAR Reserved1[3]; - ULONG Reserved2; - UCHAR InterruptLine; - UCHAR InterruptPin; - UCHAR MinimumGrant; - UCHAR MaximumLatency; - } type0; - struct _PCI_HEADER_TYPE_1 { - ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; - UCHAR PrimaryBus; - UCHAR SecondaryBus; - UCHAR SubordinateBus; - UCHAR SecondaryLatency; - UCHAR IOBase; - UCHAR IOLimit; - USHORT SecondaryStatus; - USHORT MemoryBase; - USHORT MemoryLimit; - USHORT PrefetchBase; - USHORT PrefetchLimit; - ULONG PrefetchBaseUpper32; - ULONG PrefetchLimitUpper32; - USHORT IOBaseUpper16; - USHORT IOLimitUpper16; - UCHAR CapabilitiesPtr; - UCHAR Reserved1[3]; - ULONG ROMBaseAddress; - UCHAR InterruptLine; - UCHAR InterruptPin; - USHORT BridgeControl; - } type1; - struct _PCI_HEADER_TYPE_2 { - ULONG SocketRegistersBaseAddress; - UCHAR CapabilitiesPtr; - UCHAR Reserved; - USHORT SecondaryStatus; - UCHAR PrimaryBus; - UCHAR SecondaryBus; - UCHAR SubordinateBus; - UCHAR SecondaryLatency; - struct { - ULONG Base; - ULONG Limit; - } Range[PCI_TYPE2_ADDRESSES - 1]; - UCHAR InterruptLine; - UCHAR InterruptPin; - USHORT BridgeControl; - } type2; - } u; - UCHAR DeviceSpecific[192]; -} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; - -/* PCI_COMMON_CONFIG.Command */ - -#define PCI_ENABLE_IO_SPACE 0x0001 -#define PCI_ENABLE_MEMORY_SPACE 0x0002 -#define PCI_ENABLE_BUS_MASTER 0x0004 -#define PCI_ENABLE_SPECIAL_CYCLES 0x0008 -#define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010 -#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020 -#define PCI_ENABLE_PARITY 0x0040 -#define PCI_ENABLE_WAIT_CYCLE 0x0080 -#define PCI_ENABLE_SERR 0x0100 -#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 - -/* PCI_COMMON_CONFIG.Status */ - -#define PCI_STATUS_CAPABILITIES_LIST 0x0010 -#define PCI_STATUS_66MHZ_CAPABLE 0x0020 -#define PCI_STATUS_UDF_SUPPORTED 0x0040 -#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 -#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100 -#define PCI_STATUS_DEVSEL 0x0600 -#define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800 -#define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000 -#define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000 -#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000 -#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000 - -/* PCI_COMMON_CONFIG.HeaderType */ - -#define PCI_MULTIFUNCTION 0x80 -#define PCI_DEVICE_TYPE 0x00 -#define PCI_BRIDGE_TYPE 0x01 -#define PCI_CARDBUS_BRIDGE_TYPE 0x02 - -#define PCI_CONFIGURATION_TYPE(PciData) \ - (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION) - -#define PCI_MULTIFUNCTION_DEVICE(PciData) \ - ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0) - -/* PCI device classes */ - -#define PCI_CLASS_PRE_20 0x00 -#define PCI_CLASS_MASS_STORAGE_CTLR 0x01 -#define PCI_CLASS_NETWORK_CTLR 0x02 -#define PCI_CLASS_DISPLAY_CTLR 0x03 -#define PCI_CLASS_MULTIMEDIA_DEV 0x04 -#define PCI_CLASS_MEMORY_CTLR 0x05 -#define PCI_CLASS_BRIDGE_DEV 0x06 -#define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07 -#define PCI_CLASS_BASE_SYSTEM_DEV 0x08 -#define PCI_CLASS_INPUT_DEV 0x09 -#define PCI_CLASS_DOCKING_STATION 0x0a -#define PCI_CLASS_PROCESSOR 0x0b -#define PCI_CLASS_SERIAL_BUS_CTLR 0x0c - -/* PCI device subclasses for class 0 */ - -#define PCI_SUBCLASS_PRE_20_NON_VGA 0x00 -#define PCI_SUBCLASS_PRE_20_VGA 0x01 - -/* PCI device subclasses for class 1 (mass storage controllers)*/ - -#define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00 -#define PCI_SUBCLASS_MSC_IDE_CTLR 0x01 -#define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02 -#define PCI_SUBCLASS_MSC_IPI_CTLR 0x03 -#define PCI_SUBCLASS_MSC_RAID_CTLR 0x04 -#define PCI_SUBCLASS_MSC_OTHER 0x80 - -/* PCI device subclasses for class 2 (network controllers)*/ - -#define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00 -#define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01 -#define PCI_SUBCLASS_NET_FDDI_CTLR 0x02 -#define PCI_SUBCLASS_NET_ATM_CTLR 0x03 -#define PCI_SUBCLASS_NET_OTHER 0x80 - -/* PCI device subclasses for class 3 (display controllers)*/ - -#define PCI_SUBCLASS_VID_VGA_CTLR 0x00 -#define PCI_SUBCLASS_VID_XGA_CTLR 0x01 -#define PCI_SUBCLASS_VID_3D_CTLR 0x02 -#define PCI_SUBCLASS_VID_OTHER 0x80 - -/* PCI device subclasses for class 4 (multimedia device)*/ - -#define PCI_SUBCLASS_MM_VIDEO_DEV 0x00 -#define PCI_SUBCLASS_MM_AUDIO_DEV 0x01 -#define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02 -#define PCI_SUBCLASS_MM_OTHER 0x80 - -/* PCI device subclasses for class 5 (memory controller)*/ - -#define PCI_SUBCLASS_MEM_RAM 0x00 -#define PCI_SUBCLASS_MEM_FLASH 0x01 -#define PCI_SUBCLASS_MEM_OTHER 0x80 - -/* PCI device subclasses for class 6 (bridge device)*/ - -#define PCI_SUBCLASS_BR_HOST 0x00 -#define PCI_SUBCLASS_BR_ISA 0x01 -#define PCI_SUBCLASS_BR_EISA 0x02 -#define PCI_SUBCLASS_BR_MCA 0x03 -#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 -#define PCI_SUBCLASS_BR_PCMCIA 0x05 -#define PCI_SUBCLASS_BR_NUBUS 0x06 -#define PCI_SUBCLASS_BR_CARDBUS 0x07 -#define PCI_SUBCLASS_BR_OTHER 0x80 - -/* PCI device subclasses for class C (serial bus controller)*/ - -#define PCI_SUBCLASS_SB_IEEE1394 0x00 -#define PCI_SUBCLASS_SB_ACCESS 0x01 -#define PCI_SUBCLASS_SB_SSA 0x02 -#define PCI_SUBCLASS_SB_USB 0x03 -#define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04 -#define PCI_SUBCLASS_SB_SMBUS 0x05 - -#define PCI_MAX_DEVICES 32 -#define PCI_MAX_FUNCTION 8 -#define PCI_MAX_BRIDGE_NUMBER 0xFF -#define PCI_INVALID_VENDORID 0xFFFF -#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific)) - -#define PCI_ADDRESS_IO_SPACE 0x01 -#define PCI_ADDRESS_MEMORY_TYPE_MASK 0x06 -#define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x08 -#define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc -#define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0 -#define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800 - -#define PCI_TYPE_32BIT 0 -#define PCI_TYPE_20BIT 2 -#define PCI_TYPE_64BIT 4 - -typedef struct _PCI_SLOT_NUMBER { - union { - struct { - ULONG DeviceNumber : 5; - ULONG FunctionNumber : 3; - ULONG Reserved : 24; - } bits; - ULONG AsULONG; - } u; -} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER; - -#define POOL_COLD_ALLOCATION 256 -#define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8 -#define POOL_RAISE_IF_ALLOCATION_FAILURE 16 - -typedef struct _OSVERSIONINFOA { - ULONG dwOSVersionInfoSize; - ULONG dwMajorVersion; - ULONG dwMinorVersion; - ULONG dwBuildNumber; - ULONG dwPlatformId; - CHAR szCSDVersion[128]; -} OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA; - -typedef struct _OSVERSIONINFOW { - ULONG dwOSVersionInfoSize; - ULONG dwMajorVersion; - ULONG dwMinorVersion; - ULONG dwBuildNumber; - ULONG dwPlatformId; - WCHAR szCSDVersion[128]; -} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW; - -#ifdef UNICODE -typedef OSVERSIONINFOW OSVERSIONINFO; -typedef POSVERSIONINFOW POSVERSIONINFO; -typedef LPOSVERSIONINFOW LPOSVERSIONINFO; -#else -typedef OSVERSIONINFOA OSVERSIONINFO; -typedef POSVERSIONINFOA POSVERSIONINFO; -typedef LPOSVERSIONINFOA LPOSVERSIONINFO; -#endif // UNICODE - -typedef struct _OSVERSIONINFOEXA { - ULONG dwOSVersionInfoSize; - ULONG dwMajorVersion; - ULONG dwMinorVersion; - ULONG dwBuildNumber; - ULONG dwPlatformId; - CHAR szCSDVersion[128]; - USHORT wServicePackMajor; - USHORT wServicePackMinor; - USHORT wSuiteMask; - UCHAR wProductType; - UCHAR wReserved; -} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA; - -typedef struct _OSVERSIONINFOEXW { - ULONG dwOSVersionInfoSize; - ULONG dwMajorVersion; - ULONG dwMinorVersion; - ULONG dwBuildNumber; - ULONG dwPlatformId; - WCHAR szCSDVersion[128]; - USHORT wServicePackMajor; - USHORT wServicePackMinor; - USHORT wSuiteMask; - UCHAR wProductType; - UCHAR wReserved; -} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW; - -#ifdef UNICODE -typedef OSVERSIONINFOEXW OSVERSIONINFOEX; -typedef POSVERSIONINFOEXW POSVERSIONINFOEX; -typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX; -#else -typedef OSVERSIONINFOEXA OSVERSIONINFOEX; -typedef POSVERSIONINFOEXA POSVERSIONINFOEX; -typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX; -#endif // UNICODE - -NTSYSAPI -ULONGLONG -DDKAPI -VerSetConditionMask( - IN ULONGLONG ConditionMask, - IN ULONG TypeMask, - IN UCHAR Condition); - -#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \ - ((ConditionMask) = VerSetConditionMask((ConditionMask), \ - (TypeBitMask), (ComparisonType))) - -/* RtlVerifyVersionInfo() TypeMask */ - -#define VER_MINORVERSION 0x0000001 -#define VER_MAJORVERSION 0x0000002 -#define VER_BUILDNUMBER 0x0000004 -#define VER_PLATFORMID 0x0000008 -#define VER_SERVICEPACKMINOR 0x0000010 -#define VER_SERVICEPACKMAJOR 0x0000020 -#define VER_SUITENAME 0x0000040 -#define VER_PRODUCT_TYPE 0x0000080 - -/* RtlVerifyVersionInfo() ComparisonType */ - -#define VER_EQUAL 1 -#define VER_GREATER 2 -#define VER_GREATER_EQUAL 3 -#define VER_LESS 4 -#define VER_LESS_EQUAL 5 -#define VER_AND 6 -#define VER_OR 7 - -#define VER_CONDITION_MASK 7 -#define VER_NUM_BITS_PER_CONDITION_MASK 3 - -struct _RTL_RANGE; - -typedef BOOLEAN -(NTAPI *PRTL_CONFLICT_RANGE_CALLBACK) ( - PVOID Context, - struct _RTL_RANGE *Range -); - -typedef enum _EVENT_TYPE { - NotificationEvent, - SynchronizationEvent -} EVENT_TYPE; - -typedef enum _KWAIT_REASON { - Executive, - FreePage, - PageIn, - PoolAllocation, - DelayExecution, - Suspended, - UserRequest, - WrExecutive, - WrFreePage, - WrPageIn, - WrPoolAllocation, - WrDelayExecution, - WrSuspended, - WrUserRequest, - WrEventPair, - WrQueue, - WrLpcReceive, - WrLpcReply, - WrVirtualMemory, - WrPageOut, - WrRendezvous, - Spare2, - WrGuardedMutex, - Spare4, - Spare5, - Spare6, - WrKernel, - WrResource, - WrPushLock, - WrMutex, - WrQuantumEnd, - WrDispatchInt, - WrPreempted, - WrYieldExecution, - MaximumWaitReason -} KWAIT_REASON; - -typedef struct _KWAIT_BLOCK { - LIST_ENTRY WaitListEntry; - struct _KTHREAD * RESTRICTED_POINTER Thread; - PVOID Object; - struct _KWAIT_BLOCK * RESTRICTED_POINTER NextWaitBlock; - USHORT WaitKey; - UCHAR WaitType; - UCHAR SpareByte; -} KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK; - -typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK; - -typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK { - BOOLEAN Removed; - BOOLEAN Reserved[3]; - volatile LONG IoCount; - KEVENT RemoveEvent; -} IO_REMOVE_LOCK_COMMON_BLOCK; - -typedef struct _IO_REMOVE_LOCK_DBG_BLOCK { - LONG Signature; - LONG HighWatermark; - LONGLONG MaxLockedTicks; - LONG AllocateTag; - LIST_ENTRY LockList; - KSPIN_LOCK Spin; - volatile LONG LowMemoryCount; - ULONG Reserved1[4]; - PVOID Reserved2; - PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks; -} IO_REMOVE_LOCK_DBG_BLOCK; - -typedef struct _IO_REMOVE_LOCK { - IO_REMOVE_LOCK_COMMON_BLOCK Common; -#if DBG - IO_REMOVE_LOCK_DBG_BLOCK Dbg; -#endif -} IO_REMOVE_LOCK, *PIO_REMOVE_LOCK; - -typedef struct _IO_WORKITEM *PIO_WORKITEM; - -typedef VOID -(DDKAPI IO_WORKITEM_ROUTINE)( - IN PDEVICE_OBJECT DeviceObject, - IN PVOID Context); -typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE; - -typedef struct _SHARE_ACCESS { - ULONG OpenCount; - ULONG Readers; - ULONG Writers; - ULONG Deleters; - ULONG SharedRead; - ULONG SharedWrite; - ULONG SharedDelete; -} SHARE_ACCESS, *PSHARE_ACCESS; - -typedef enum _KINTERRUPT_MODE { - LevelSensitive, - Latched -} KINTERRUPT_MODE; - -#define THREAD_WAIT_OBJECTS 3 - -typedef VOID -(DDKAPI *PKINTERRUPT_ROUTINE)( - VOID); - -typedef enum _CREATE_FILE_TYPE { - CreateFileTypeNone, - CreateFileTypeNamedPipe, - CreateFileTypeMailslot -} CREATE_FILE_TYPE; - -typedef struct _CONFIGURATION_INFORMATION { - ULONG DiskCount; - ULONG FloppyCount; - ULONG CdRomCount; - ULONG TapeCount; - ULONG ScsiPortCount; - ULONG SerialCount; - ULONG ParallelCount; - BOOLEAN AtDiskPrimaryAddressClaimed; - BOOLEAN AtDiskSecondaryAddressClaimed; - ULONG Version; - ULONG MediumChangerCount; -} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION; - -typedef enum _CONFIGURATION_TYPE { - ArcSystem, - CentralProcessor, - FloatingPointProcessor, - PrimaryIcache, - PrimaryDcache, - SecondaryIcache, - SecondaryDcache, - SecondaryCache, - EisaAdapter, - TcAdapter, - ScsiAdapter, - DtiAdapter, - MultiFunctionAdapter, - DiskController, - TapeController, - CdromController, - WormController, - SerialController, - NetworkController, - DisplayController, - ParallelController, - PointerController, - KeyboardController, - AudioController, - OtherController, - DiskPeripheral, - FloppyDiskPeripheral, - TapePeripheral, - ModemPeripheral, - MonitorPeripheral, - PrinterPeripheral, - PointerPeripheral, - KeyboardPeripheral, - TerminalPeripheral, - OtherPeripheral, - LinePeripheral, - NetworkPeripheral, - SystemMemory, - DockingInformation, - RealModeIrqRoutingTable, - RealModePCIEnumeration, - MaximumType -} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE; - -#define IO_FORCE_ACCESS_CHECK 0x001 -#define IO_NO_PARAMETER_CHECKING 0x100 - -#define IO_REPARSE 0x0 -#define IO_REMOUNT 0x1 - -typedef NTSTATUS -(DDKAPI *PIO_QUERY_DEVICE_ROUTINE)( - IN PVOID Context, - IN PUNICODE_STRING PathName, - IN INTERFACE_TYPE BusType, - IN ULONG BusNumber, - IN PKEY_VALUE_FULL_INFORMATION *BusInformation, - IN CONFIGURATION_TYPE ControllerType, - IN ULONG ControllerNumber, - IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, - IN CONFIGURATION_TYPE PeripheralType, - IN ULONG PeripheralNumber, - IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation); - -typedef enum _IO_QUERY_DEVICE_DATA_FORMAT { - IoQueryDeviceIdentifier = 0, - IoQueryDeviceConfigurationData, - IoQueryDeviceComponentInformation, - IoQueryDeviceMaxData -} IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT; - -typedef enum _KBUGCHECK_CALLBACK_REASON { - KbCallbackInvalid, - KbCallbackReserved1, - KbCallbackSecondaryDumpData, - KbCallbackDumpIo, -} KBUGCHECK_CALLBACK_REASON; - -struct _KBUGCHECK_REASON_CALLBACK_RECORD; - -typedef VOID -(DDKAPI *PKBUGCHECK_REASON_CALLBACK_ROUTINE)( - IN KBUGCHECK_CALLBACK_REASON Reason, - IN struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record, - IN OUT PVOID ReasonSpecificData, - IN ULONG ReasonSpecificDataLength); - -typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD { - LIST_ENTRY Entry; - PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine; - PUCHAR Component; - ULONG_PTR Checksum; - KBUGCHECK_CALLBACK_REASON Reason; - UCHAR State; -} KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD; - -typedef enum _KBUGCHECK_BUFFER_DUMP_STATE { - BufferEmpty, - BufferInserted, - BufferStarted, - BufferFinished, - BufferIncomplete -} KBUGCHECK_BUFFER_DUMP_STATE; - -typedef VOID -(DDKAPI *PKBUGCHECK_CALLBACK_ROUTINE)( - IN PVOID Buffer, - IN ULONG Length); - -typedef struct _KBUGCHECK_CALLBACK_RECORD { - LIST_ENTRY Entry; - PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine; - PVOID Buffer; - ULONG Length; - PUCHAR Component; - ULONG_PTR Checksum; - UCHAR State; -} KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD; - -typedef BOOLEAN -(DDKAPI *PNMI_CALLBACK)( - IN PVOID Context, - IN BOOLEAN Handled); - -/* - * VOID - * KeInitializeCallbackRecord( - * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord) - */ -#define KeInitializeCallbackRecord(CallbackRecord) \ - CallbackRecord->State = BufferEmpty; - -typedef enum _KDPC_IMPORTANCE { - LowImportance, - MediumImportance, - HighImportance -} KDPC_IMPORTANCE; - -typedef enum _MEMORY_CACHING_TYPE_ORIG { - MmFrameBufferCached = 2 -} MEMORY_CACHING_TYPE_ORIG; - -typedef enum _MEMORY_CACHING_TYPE { - MmNonCached = FALSE, - MmCached = TRUE, - MmWriteCombined = MmFrameBufferCached, - MmHardwareCoherentCached, - MmNonCachedUnordered, - MmUSWCCached, - MmMaximumCacheType -} MEMORY_CACHING_TYPE; - -typedef enum _MM_PAGE_PRIORITY { - LowPagePriority, - NormalPagePriority = 16, - HighPagePriority = 32 -} MM_PAGE_PRIORITY; - -typedef enum _LOCK_OPERATION { - IoReadAccess, - IoWriteAccess, - IoModifyAccess -} LOCK_OPERATION; - -#define FLUSH_MULTIPLE_MAXIMUM 32 - -typedef enum _MM_SYSTEM_SIZE { - MmSmallSystem, - MmMediumSystem, - MmLargeSystem -} MM_SYSTEMSIZE; - -typedef struct _OBJECT_HANDLE_INFORMATION { - ULONG HandleAttributes; - ACCESS_MASK GrantedAccess; -} OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION; - -typedef struct _CLIENT_ID { - HANDLE UniqueProcess; - HANDLE UniqueThread; -} CLIENT_ID, *PCLIENT_ID; - -typedef VOID -(DDKAPI *PKSTART_ROUTINE)( - IN PVOID StartContext); - -typedef VOID -(DDKAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)( - IN HANDLE ParentId, - IN HANDLE ProcessId, - IN BOOLEAN Create); - -typedef VOID -(DDKAPI *PCREATE_THREAD_NOTIFY_ROUTINE)( - IN HANDLE ProcessId, - IN HANDLE ThreadId, - IN BOOLEAN Create); - -typedef struct _IMAGE_INFO { - _ANONYMOUS_UNION union { - ULONG Properties; - _ANONYMOUS_STRUCT struct { - ULONG ImageAddressingMode : 8; - ULONG SystemModeImage : 1; - ULONG ImageMappedToAllPids : 1; - ULONG Reserved : 22; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME; - PVOID ImageBase; - ULONG ImageSelector; - SIZE_T ImageSize; - ULONG ImageSectionNumber; -} IMAGE_INFO, *PIMAGE_INFO; - -#define IMAGE_ADDRESSING_MODE_32BIT 3 - -typedef VOID -(DDKAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)( - IN PUNICODE_STRING FullImageName, - IN HANDLE ProcessId, - IN PIMAGE_INFO ImageInfo); - -#pragma pack(push,4) -typedef enum _BUS_DATA_TYPE { - ConfigurationSpaceUndefined = -1, - Cmos, - EisaConfiguration, - Pos, - CbusConfiguration, - PCIConfiguration, - VMEConfiguration, - NuBusConfiguration, - PCMCIAConfiguration, - MPIConfiguration, - MPSAConfiguration, - PNPISAConfiguration, - SgiInternalConfiguration, - MaximumBusDataType -} BUS_DATA_TYPE, *PBUS_DATA_TYPE; -#pragma pack(pop) - -typedef struct _NT_TIB { - struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; - PVOID StackBase; - PVOID StackLimit; - PVOID SubSystemTib; - _ANONYMOUS_UNION union { - PVOID FiberData; - ULONG Version; - } DUMMYUNIONNAME; - PVOID ArbitraryUserPointer; - struct _NT_TIB *Self; -} NT_TIB, *PNT_TIB; - -typedef struct _NT_TIB32 { - ULONG ExceptionList; - ULONG StackBase; - ULONG StackLimit; - ULONG SubSystemTib; - union { - ULONG FiberData; - ULONG Version; - }; - ULONG ArbitraryUserPointer; - ULONG Self; -} NT_TIB32,*PNT_TIB32; - -typedef struct _NT_TIB64 { - ULONG64 ExceptionList; - ULONG64 StackBase; - ULONG64 StackLimit; - ULONG64 SubSystemTib; - union { - ULONG64 FiberData; - ULONG Version; - }; - ULONG64 ArbitraryUserPointer; - ULONG64 Self; -} NT_TIB64,*PNT_TIB64; - -typedef enum _PROCESSINFOCLASS { - ProcessBasicInformation, - ProcessQuotaLimits, - ProcessIoCounters, - ProcessVmCounters, - ProcessTimes, - ProcessBasePriority, - ProcessRaisePriority, - ProcessDebugPort, - ProcessExceptionPort, - ProcessAccessToken, - ProcessLdtInformation, - ProcessLdtSize, - ProcessDefaultHardErrorMode, - ProcessIoPortHandlers, - ProcessPooledUsageAndLimits, - ProcessWorkingSetWatch, - ProcessUserModeIOPL, - ProcessEnableAlignmentFaultFixup, - ProcessPriorityClass, - ProcessWx86Information, - ProcessHandleCount, - ProcessAffinityMask, - ProcessPriorityBoost, - ProcessDeviceMap, - ProcessSessionInformation, - ProcessForegroundInformation, - ProcessWow64Information, - ProcessImageFileName, - ProcessLUIDDeviceMapsEnabled, - ProcessBreakOnTermination, - ProcessDebugObjectHandle, - ProcessDebugFlags, - ProcessHandleTracing, - ProcessIoPriority, - ProcessExecuteFlags, - ProcessTlsInformation, - ProcessCookie, - ProcessImageInformation, - ProcessCycleTime, - ProcessPagePriority, - ProcessInstrumentationCallback, - MaxProcessInfoClass -} PROCESSINFOCLASS; - -typedef enum _THREADINFOCLASS { - ThreadBasicInformation, - ThreadTimes, - ThreadPriority, - ThreadBasePriority, - ThreadAffinityMask, - ThreadImpersonationToken, - ThreadDescriptorTableEntry, - ThreadEnableAlignmentFaultFixup, - ThreadEventPair_Reusable, - ThreadQuerySetWin32StartAddress, - ThreadZeroTlsCell, - ThreadPerformanceCount, - ThreadAmILastThread, - ThreadIdealProcessor, - ThreadPriorityBoost, - ThreadSetTlsArrayAddress, - ThreadIsIoPending, - ThreadHideFromDebugger, - ThreadBreakOnTermination, - ThreadSwitchLegacyState, - ThreadIsTerminated, - ThreadLastSystemCall, - ThreadIoPriority, - ThreadCycleTime, - ThreadPagePriority, - ThreadActualBasePriority, - MaxThreadInfoClass -} THREADINFOCLASS; - -typedef struct _PROCESS_BASIC_INFORMATION -{ - NTSTATUS ExitStatus; - struct _PEB *PebBaseAddress; - ULONG_PTR AffinityMask; - KPRIORITY BasePriority; - ULONG_PTR UniqueProcessId; - ULONG_PTR InheritedFromUniqueProcessId; -} PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION; - -typedef struct _PROCESS_WS_WATCH_INFORMATION -{ - PVOID FaultingPc; - PVOID FaultingVa; -} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION; - -typedef struct _PROCESS_DEVICEMAP_INFORMATION -{ - union - { - struct - { - HANDLE DirectoryHandle; - } Set; - struct - { - ULONG DriveMap; - UCHAR DriveType[32]; - } Query; - }; -} PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION; - -typedef struct _KERNEL_USER_TIMES -{ - LARGE_INTEGER CreateTime; - LARGE_INTEGER ExitTime; - LARGE_INTEGER KernelTime; - LARGE_INTEGER UserTime; -} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES; - -typedef struct _PROCESS_ACCESS_TOKEN -{ - HANDLE Token; - HANDLE Thread; -} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN; - -typedef struct _PROCESS_SESSION_INFORMATION -{ - ULONG SessionId; -} PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION; - -typedef VOID -(DDKAPI *PREQUEST_POWER_COMPLETE)( - IN PDEVICE_OBJECT DeviceObject, - IN UCHAR MinorFunction, - IN POWER_STATE PowerState, - IN PVOID Context, - IN PIO_STATUS_BLOCK IoStatus); - -typedef enum _TRACE_INFORMATION_CLASS { - TraceIdClass, - TraceHandleClass, - TraceEnableFlagsClass, - TraceEnableLevelClass, - GlobalLoggerHandleClass, - EventLoggerHandleClass, - AllLoggerHandlesClass, - TraceHandleByNameClass -} TRACE_INFORMATION_CLASS; - -typedef enum _REG_NOTIFY_CLASS -{ - RegNtDeleteKey, - RegNtPreDeleteKey = RegNtDeleteKey, - RegNtSetValueKey, - RegNtPreSetValueKey = RegNtSetValueKey, - RegNtDeleteValueKey, - RegNtPreDeleteValueKey = RegNtDeleteValueKey, - RegNtSetInformationKey, - RegNtPreSetInformationKey = RegNtSetInformationKey, - RegNtRenameKey, - RegNtPreRenameKey = RegNtRenameKey, - RegNtEnumerateKey, - RegNtPreEnumerateKey = RegNtEnumerateKey, - RegNtEnumerateValueKey, - RegNtPreEnumerateValueKey = RegNtEnumerateValueKey, - RegNtQueryKey, - RegNtPreQueryKey = RegNtQueryKey, - RegNtQueryValueKey, - RegNtPreQueryValueKey = RegNtQueryValueKey, - RegNtQueryMultipleValueKey, - RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey, - RegNtPreCreateKey, - RegNtPostCreateKey, - RegNtPreOpenKey, - RegNtPostOpenKey, - RegNtKeyHandleClose, - RegNtPreKeyHandleClose = RegNtKeyHandleClose, - RegNtPostDeleteKey, - RegNtPostSetValueKey, - RegNtPostDeleteValueKey, - RegNtPostSetInformationKey, - RegNtPostRenameKey, - RegNtPostEnumerateKey, - RegNtPostEnumerateValueKey, - RegNtPostQueryKey, - RegNtPostQueryValueKey, - RegNtPostQueryMultipleValueKey, - RegNtPostKeyHandleClose, - RegNtPreCreateKeyEx, - RegNtPostCreateKeyEx, - RegNtPreOpenKeyEx, - RegNtPostOpenKeyEx -} REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS; - -typedef NTSTATUS -(NTAPI *PEX_CALLBACK_FUNCTION)( - IN PVOID CallbackContext, - IN PVOID Argument1, - IN PVOID Argument2 -); - -typedef struct _REG_DELETE_KEY_INFORMATION -{ - PVOID Object; -} REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION; - -typedef struct _REG_SET_VALUE_KEY_INFORMATION -{ - PVOID Object; - PUNICODE_STRING ValueName; - ULONG TitleIndex; - ULONG Type; - PVOID Data; - ULONG DataSize; -} REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION; - -typedef struct _REG_DELETE_VALUE_KEY_INFORMATION -{ - PVOID Object; - PUNICODE_STRING ValueName; -} REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION; - -typedef struct _REG_SET_INFORMATION_KEY_INFORMATION -{ - PVOID Object; - KEY_SET_INFORMATION_CLASS KeySetInformationClass; - PVOID KeySetInformation; - ULONG KeySetInformationLength; -} REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION; - -typedef struct _REG_ENUMERATE_KEY_INFORMATION -{ - PVOID Object; - ULONG Index; - KEY_INFORMATION_CLASS KeyInformationClass; - PVOID KeyInformation; - ULONG Length; - PULONG ResultLength; -} REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION; - -typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION -{ - PVOID Object; - ULONG Index; - KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass; - PVOID KeyValueInformation; - ULONG Length; - PULONG ResultLength; -} REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION; - -typedef struct _REG_QUERY_KEY_INFORMATION -{ - PVOID Object; - KEY_INFORMATION_CLASS KeyInformationClass; - PVOID KeyInformation; - ULONG Length; - PULONG ResultLength; -} REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION; - -typedef struct _REG_QUERY_VALUE_KEY_INFORMATION -{ - PVOID Object; - PUNICODE_STRING ValueName; - KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass; - PVOID KeyValueInformation; - ULONG Length; - PULONG ResultLength; -} REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION; - -typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION -{ - PVOID Object; - PKEY_VALUE_ENTRY ValueEntries; - ULONG EntryCount; - PVOID ValueBuffer; - PULONG BufferLength; - PULONG RequiredBufferLength; -} REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION; - -typedef struct _REG_PRE_CREATE_KEY_INFORMATION -{ - PUNICODE_STRING CompleteName; -} REG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_CREATE_KEY_INFORMATION; - -typedef struct _REG_POST_CREATE_KEY_INFORMATION -{ - PUNICODE_STRING CompleteName; - PVOID Object; - NTSTATUS Status; -} REG_POST_CREATE_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION; - -typedef struct _REG_PRE_OPEN_KEY_INFORMATION -{ - PUNICODE_STRING CompleteName; -} REG_PRE_OPEN_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION; - -typedef struct _REG_POST_OPEN_KEY_INFORMATION -{ - PUNICODE_STRING CompleteName; - PVOID Object; - NTSTATUS Status; -} REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION; - -typedef struct _REG_POST_OPERATION_INFORMATION -{ - PVOID Object; - NTSTATUS Status; -} REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION; - -typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION -{ - PVOID Object; -} REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION; - -/* -** Storage structures -*/ -typedef enum _PARTITION_STYLE { - PARTITION_STYLE_MBR, - PARTITION_STYLE_GPT, - PARTITION_STYLE_RAW -} PARTITION_STYLE; - -typedef struct _CREATE_DISK_MBR { - ULONG Signature; -} CREATE_DISK_MBR, *PCREATE_DISK_MBR; - -typedef struct _CREATE_DISK_GPT { - GUID DiskId; - ULONG MaxPartitionCount; -} CREATE_DISK_GPT, *PCREATE_DISK_GPT; - -typedef struct _CREATE_DISK { - PARTITION_STYLE PartitionStyle; - _ANONYMOUS_UNION union { - CREATE_DISK_MBR Mbr; - CREATE_DISK_GPT Gpt; - } DUMMYUNIONNAME; -} CREATE_DISK, *PCREATE_DISK; - -typedef struct _DISK_SIGNATURE { - ULONG PartitionStyle; - _ANONYMOUS_UNION union { - struct { - ULONG Signature; - ULONG CheckSum; - } Mbr; - struct { - GUID DiskId; - } Gpt; - } DUMMYUNIONNAME; -} DISK_SIGNATURE, *PDISK_SIGNATURE; - -typedef VOID -(FASTCALL*PTIME_UPDATE_NOTIFY_ROUTINE)( - IN HANDLE ThreadId, - IN KPROCESSOR_MODE Mode); - -#define DBG_STATUS_CONTROL_C 1 -#define DBG_STATUS_SYSRQ 2 -#define DBG_STATUS_BUGCHECK_FIRST 3 -#define DBG_STATUS_BUGCHECK_SECOND 4 -#define DBG_STATUS_FATAL 5 -#define DBG_STATUS_DEBUG_CONTROL 6 -#define DBG_STATUS_WORKER 7 - -typedef struct _PHYSICAL_MEMORY_RANGE { - PHYSICAL_ADDRESS BaseAddress; - LARGE_INTEGER NumberOfBytes; -} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE; - -typedef ULONG_PTR -(NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)( - IN PVOID Context); - -typedef struct _DRIVER_VERIFIER_THUNK_PAIRS { - PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine; - PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine; -} DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS; - -#define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001 -#define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002 -#define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004 -#define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008 -#define DRIVER_VERIFIER_IO_CHECKING 0x0010 - -#define HASH_STRING_ALGORITHM_DEFAULT 0 -#define HASH_STRING_ALGORITHM_X65599 1 -#define HASH_STRING_ALGORITHM_INVALID 0xffffffff - -typedef VOID -(DDKAPI *PTIMER_APC_ROUTINE)( - IN PVOID TimerContext, - IN ULONG TimerLowValue, - IN LONG TimerHighValue); - - - -/* -** WMI structures -*/ - -typedef VOID -(DDKAPI *WMI_NOTIFICATION_CALLBACK)( - PVOID Wnode, - PVOID Context); - - -/* -** Architecture specific structures -*/ -#define PCR_MINOR_VERSION 1 -#define PCR_MAJOR_VERSION 1 - -#ifdef _X86_ - -#define SIZE_OF_80387_REGISTERS 80 -#define CONTEXT_i386 0x10000 -#define CONTEXT_i486 0x10000 -#define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L) -#define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L) -#define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L) -#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L) -#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L) -#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L) -#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS) -#define MAXIMUM_SUPPORTED_EXTENSION 512 - -typedef struct _FLOATING_SAVE_AREA { - ULONG ControlWord; - ULONG StatusWord; - ULONG TagWord; - ULONG ErrorOffset; - ULONG ErrorSelector; - ULONG DataOffset; - ULONG DataSelector; - UCHAR RegisterArea[SIZE_OF_80387_REGISTERS]; - ULONG Cr0NpxState; -} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; - -typedef struct _CONTEXT { - ULONG ContextFlags; - ULONG Dr0; - ULONG Dr1; - ULONG Dr2; - ULONG Dr3; - ULONG Dr6; - ULONG Dr7; - FLOATING_SAVE_AREA FloatSave; - ULONG SegGs; - ULONG SegFs; - ULONG SegEs; - ULONG SegDs; - ULONG Edi; - ULONG Esi; - ULONG Ebx; - ULONG Edx; - ULONG Ecx; - ULONG Eax; - ULONG Ebp; - ULONG Eip; - ULONG SegCs; - ULONG EFlags; - ULONG Esp; - ULONG SegSs; - UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; -} CONTEXT; - -// -// Used to contain PFNs and PFN counts -// -typedef ULONG PFN_COUNT; -typedef ULONG PFN_NUMBER, *PPFN_NUMBER; -typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; - -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define PROFILE_LEVEL 27 -#define CLOCK1_LEVEL 28 -#define CLOCK2_LEVEL 28 -#define IPI_LEVEL 29 -#define POWER_LEVEL 30 -#define HIGH_LEVEL 31 - -typedef struct _KPCR_TIB { - PVOID ExceptionList; /* 00 */ - PVOID StackBase; /* 04 */ - PVOID StackLimit; /* 08 */ - PVOID SubSystemTib; /* 0C */ - _ANONYMOUS_UNION union { - PVOID FiberData; /* 10 */ - ULONG Version; /* 10 */ - } DUMMYUNIONNAME; - PVOID ArbitraryUserPointer; /* 14 */ - struct _KPCR_TIB *Self; /* 18 */ -} KPCR_TIB, *PKPCR_TIB; /* 1C */ - -typedef struct _KPCR { - KPCR_TIB Tib; /* 00 */ - struct _KPCR *Self; /* 1C */ - struct _KPRCB *Prcb; /* 20 */ - KIRQL Irql; /* 24 */ - ULONG IRR; /* 28 */ - ULONG IrrActive; /* 2C */ - ULONG IDR; /* 30 */ - PVOID KdVersionBlock; /* 34 */ - PUSHORT IDT; /* 38 */ - PUSHORT GDT; /* 3C */ - struct _KTSS *TSS; /* 40 */ - USHORT MajorVersion; /* 44 */ - USHORT MinorVersion; /* 46 */ - KAFFINITY SetMember; /* 48 */ - ULONG StallScaleFactor; /* 4C */ - UCHAR SpareUnused; /* 50 */ - UCHAR Number; /* 51 */ - UCHAR Spare0; - UCHAR SecondLevelCacheAssociativity; - ULONG VdmAlert; - ULONG KernelReserved[14]; // For use by the kernel - ULONG SecondLevelCacheSize; - ULONG HalReserved[16]; // For use by Hal -} KPCR, *PKPCR; /* 54 */ - -#define KeGetPcr() PCR - -typedef struct _KFLOATING_SAVE { - ULONG ControlWord; - ULONG StatusWord; - ULONG ErrorOffset; - ULONG ErrorSelector; - ULONG DataOffset; - ULONG DataSelector; - ULONG Cr0NpxState; - ULONG Spare1; -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -FORCEINLINE -ULONG -KeGetCurrentProcessorNumber(VOID) -{ - return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number)); -} - -NTHALAPI -KIRQL -DDKAPI -KeGetCurrentIrql( - VOID); - -NTKERNELAPI -PRKTHREAD -NTAPI -KeGetCurrentThread( - VOID); - -#define KI_USER_SHARED_DATA 0xffdf0000 - -#define PAGE_SIZE 0x1000 -#define PAGE_SHIFT 12L - -#define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA) - -extern NTKERNELAPI PVOID MmHighestUserAddress; -extern NTKERNELAPI PVOID MmSystemRangeStart; -extern NTKERNELAPI ULONG_PTR MmUserProbeAddress; - -#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress -#define MM_SYSTEM_RANGE_START MmSystemRangeStart -#define MM_USER_PROBE_ADDRESS MmUserProbeAddress -#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 -#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000 - -#define MM_KSEG0_BASE MM_SYSTEM_RANGE_START -#define MM_SYSTEM_SPACE_END 0xFFFFFFFF - -#elif defined(__x86_64__) - -#define CONTEXT_AMD64 0x100000 -#if !defined(RC_INVOKED) -#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) -#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) -#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) -#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) -#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) - -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) -#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) - -#define CONTEXT_EXCEPTION_ACTIVE 0x8000000 -#define CONTEXT_SERVICE_ACTIVE 0x10000000 -#define CONTEXT_EXCEPTION_REQUEST 0x40000000 -#define CONTEXT_EXCEPTION_REPORTING 0x80000000 -#endif - -typedef struct DECLSPEC_ALIGN(16) _M128A { - ULONGLONG Low; - LONGLONG High; -} M128A, *PM128A; - -typedef struct _XMM_SAVE_AREA32 { - USHORT ControlWord; - USHORT StatusWord; - UCHAR TagWord; - UCHAR Reserved1; - USHORT ErrorOpcode; - ULONG ErrorOffset; - USHORT ErrorSelector; - USHORT Reserved2; - ULONG DataOffset; - USHORT DataSelector; - USHORT Reserved3; - ULONG MxCsr; - ULONG MxCsr_Mask; - M128A FloatRegisters[8]; - M128A XmmRegisters[16]; - UCHAR Reserved4[96]; -} XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; - -typedef struct DECLSPEC_ALIGN(16) _CONTEXT { - ULONG64 P1Home; - ULONG64 P2Home; - ULONG64 P3Home; - ULONG64 P4Home; - ULONG64 P5Home; - ULONG64 P6Home; - - /* Control flags */ - ULONG ContextFlags; - ULONG MxCsr; - - /* Segment */ - USHORT SegCs; - USHORT SegDs; - USHORT SegEs; - USHORT SegFs; - USHORT SegGs; - USHORT SegSs; - ULONG EFlags; - - /* Debug */ - ULONG64 Dr0; - ULONG64 Dr1; - ULONG64 Dr2; - ULONG64 Dr3; - ULONG64 Dr6; - ULONG64 Dr7; - - /* Integer */ - ULONG64 Rax; - ULONG64 Rcx; - ULONG64 Rdx; - ULONG64 Rbx; - ULONG64 Rsp; - ULONG64 Rbp; - ULONG64 Rsi; - ULONG64 Rdi; - ULONG64 R8; - ULONG64 R9; - ULONG64 R10; - ULONG64 R11; - ULONG64 R12; - ULONG64 R13; - ULONG64 R14; - ULONG64 R15; - - /* Counter */ - ULONG64 Rip; - - /* Floating point */ - union { - XMM_SAVE_AREA32 FltSave; - struct { - M128A Header[2]; - M128A Legacy[8]; - M128A Xmm0; - M128A Xmm1; - M128A Xmm2; - M128A Xmm3; - M128A Xmm4; - M128A Xmm5; - M128A Xmm6; - M128A Xmm7; - M128A Xmm8; - M128A Xmm9; - M128A Xmm10; - M128A Xmm11; - M128A Xmm12; - M128A Xmm13; - M128A Xmm14; - M128A Xmm15; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME; - - /* Vector */ - M128A VectorRegister[26]; - ULONG64 VectorControl; - - /* Debug control */ - ULONG64 DebugControl; - ULONG64 LastBranchToRip; - ULONG64 LastBranchFromRip; - ULONG64 LastExceptionToRip; - ULONG64 LastExceptionFromRip; -} CONTEXT; - -// -// Used to contain PFNs and PFN counts -// -typedef ULONG PFN_COUNT; -typedef ULONG64 PFN_NUMBER, *PPFN_NUMBER; -typedef LONG64 SPFN_NUMBER, *PSPFN_NUMBER; - -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define CLOCK_LEVEL 13 -#define IPI_LEVEL 14 -#define POWER_LEVEL 14 -#define PROFILE_LEVEL 15 -#define HIGH_LEVEL 15 - -#define PAGE_SIZE 0x1000 -#define PAGE_SHIFT 12L -#define PTI_SHIFT 12L -#define PDI_SHIFT 21L -#define PPI_SHIFT 30L -#define PXI_SHIFT 39L -#define PTE_PER_PAGE 512 -#define PDE_PER_PAGE 512 -#define PPE_PER_PAGE 512 -#define PXE_PER_PAGE 512 -#define PTI_MASK_AMD64 (PTE_PER_PAGE - 1) -#define PDI_MASK_AMD64 (PDE_PER_PAGE - 1) -#define PPI_MASK (PPE_PER_PAGE - 1) -#define PXI_MASK (PXE_PER_PAGE - 1) - -#define PXE_BASE 0xFFFFF6FB7DBED000ULL -#define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL -#define PPE_BASE 0xFFFFF6FB7DA00000ULL -#define PDE_BASE 0xFFFFF6FB40000000ULL -#define PTE_BASE 0xFFFFF68000000000ULL -#define PXE_TOP 0xFFFFF6FB7DBEDFFFULL -#define PPE_TOP 0xFFFFF6FB7DBFFFFFULL -#define PDE_TOP 0xFFFFF6FB7FFFFFFFULL -#define PTE_TOP 0xFFFFF6FFFFFFFFFFULL - -extern NTKERNELAPI PVOID MmHighestUserAddress; -extern NTKERNELAPI PVOID MmSystemRangeStart; -extern NTKERNELAPI ULONG_PTR MmUserProbeAddress; - -#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress -#define MM_SYSTEM_RANGE_START MmSystemRangeStart -#define MM_USER_PROBE_ADDRESS MmUserProbeAddress -#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 -#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL -#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL - -#define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA) -#define SharedInterruptTime (&SharedUserData->InterruptTime) -#define SharedSystemTime (&SharedUserData->SystemTime) -#define SharedTickCount (&SharedUserData->TickCount) - -#define KeQueryInterruptTime() \ - (*(volatile ULONG64*)SharedInterruptTime) -#define KeQuerySystemTime(CurrentCount) \ - *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime -#define KeQueryTickCount(CurrentCount) \ - *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount - -typedef struct _KPCR -{ - union - { - NT_TIB NtTib; - struct - { - union _KGDTENTRY64 *GdtBase; - struct _KTSS64 *TssBase; - ULONG64 UserRsp; - struct _KPCR *Self; - struct _KPRCB *CurrentPrcb; - PKSPIN_LOCK_QUEUE LockArray; - PVOID Used_Self; - }; - }; - union _KIDTENTRY64 *IdtBase; - ULONG64 Unused[2]; - KIRQL Irql; - UCHAR SecondLevelCacheAssociativity; - UCHAR ObsoleteNumber; - UCHAR Fill0; - ULONG Unused0[3]; - USHORT MajorVersion; - USHORT MinorVersion; - ULONG StallScaleFactor; - PVOID Unused1[3]; - ULONG KernelReserved[15]; - ULONG SecondLevelCacheSize; - ULONG HalReserved[16]; - ULONG Unused2; - PVOID KdVersionBlock; - PVOID Unused3; - ULONG PcrAlign1[24]; -} KPCR, *PKPCR; - -typedef struct _KFLOATING_SAVE { - ULONG Dummy; -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -NTKERNELAPI -PRKTHREAD -NTAPI -KeGetCurrentThread( - VOID); - -FORCEINLINE -PKPCR -KeGetPcr(VOID) -{ - return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self)); -} - -FORCEINLINE -ULONG -KeGetCurrentProcessorNumber(VOID) -{ - return (ULONG)__readgsword(0x184); -} - -#elif defined(__PowerPC__) - -// -// Used to contain PFNs and PFN counts -// -typedef ULONG PFN_COUNT; -typedef ULONG PFN_NUMBER, *PPFN_NUMBER; -typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; - -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define PROFILE_LEVEL 27 -#define CLOCK1_LEVEL 28 -#define CLOCK2_LEVEL 28 -#define IPI_LEVEL 29 -#define POWER_LEVEL 30 -#define HIGH_LEVEL 31 - -typedef struct _KFLOATING_SAVE { - ULONG Dummy; -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -typedef struct _KPCR_TIB { - PVOID ExceptionList; /* 00 */ - PVOID StackBase; /* 04 */ - PVOID StackLimit; /* 08 */ - PVOID SubSystemTib; /* 0C */ - _ANONYMOUS_UNION union { - PVOID FiberData; /* 10 */ - ULONG Version; /* 10 */ - } DUMMYUNIONNAME; - PVOID ArbitraryUserPointer; /* 14 */ - struct _KPCR_TIB *Self; /* 18 */ -} KPCR_TIB, *PKPCR_TIB; /* 1C */ - -#define PCR_MINOR_VERSION 1 -#define PCR_MAJOR_VERSION 1 - -typedef struct _KPCR { - KPCR_TIB Tib; /* 00 */ - struct _KPCR *Self; /* 1C */ - struct _KPRCB *Prcb; /* 20 */ - KIRQL Irql; /* 24 */ - ULONG IRR; /* 28 */ - ULONG IrrActive; /* 2C */ - ULONG IDR; /* 30 */ - PVOID KdVersionBlock; /* 34 */ - PUSHORT IDT; /* 38 */ - PUSHORT GDT; /* 3C */ - struct _KTSS *TSS; /* 40 */ - USHORT MajorVersion; /* 44 */ - USHORT MinorVersion; /* 46 */ - KAFFINITY SetMember; /* 48 */ - ULONG StallScaleFactor; /* 4C */ - UCHAR SpareUnused; /* 50 */ - UCHAR Number; /* 51 */ -} KPCR, *PKPCR; /* 54 */ - -#define KeGetPcr() PCR - -static __inline -ULONG -DDKAPI -KeGetCurrentProcessorNumber(VOID) -{ - ULONG Number; - __asm__ __volatile__ ( - "lwz %0, %c1(12)\n" - : "=r" (Number) - : "i" (FIELD_OFFSET(KPCR, Number)) - ); - return Number; -} - -#elif defined(_MIPS_) - -#error MIPS Headers are totally incorrect - -// -// Used to contain PFNs and PFN counts -// -typedef ULONG PFN_COUNT; -typedef ULONG PFN_NUMBER, *PPFN_NUMBER; -typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; - -#define PASSIVE_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define PROFILE_LEVEL 27 -#define IPI_LEVEL 29 -#define HIGH_LEVEL 31 - -typedef struct _KPCR { - struct _KPRCB *Prcb; /* 20 */ - KIRQL Irql; /* 24 */ - ULONG IRR; /* 28 */ - ULONG IDR; /* 30 */ -} KPCR, *PKPCR; - -#define KeGetPcr() PCR - -typedef struct _KFLOATING_SAVE { -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -static __inline -ULONG -DDKAPI -KeGetCurrentProcessorNumber(VOID) -{ - return 0; -} - -#elif defined(_M_ARM) - -// -// NT-ARM is not documented, need DDK-ARM -// -#include - -#else -#error Unknown architecture -#endif - -#define MM_DONT_ZERO_ALLOCATION 0x00000001 -#define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002 - - -#define EFLAG_SIGN 0x8000 -#define EFLAG_ZERO 0x4000 -#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) - -#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) -#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT) -#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) - -typedef enum _INTERLOCKED_RESULT { - ResultNegative = RESULT_NEGATIVE, - ResultZero = RESULT_ZERO, - ResultPositive = RESULT_POSITIVE -} INTERLOCKED_RESULT; - -typedef VOID -(NTAPI *PciPin2Line)( - IN struct _BUS_HANDLER *BusHandler, - IN struct _BUS_HANDLER *RootHandler, - IN PCI_SLOT_NUMBER SlotNumber, - IN PPCI_COMMON_CONFIG PciData -); - -typedef VOID -(NTAPI *PciLine2Pin)( - IN struct _BUS_HANDLER *BusHandler, - IN struct _BUS_HANDLER *RootHandler, - IN PCI_SLOT_NUMBER SlotNumber, - IN PPCI_COMMON_CONFIG PciNewData, - IN PPCI_COMMON_CONFIG PciOldData -); - -typedef VOID -(NTAPI *PciReadWriteConfig)( - IN struct _BUS_HANDLER *BusHandler, - IN PCI_SLOT_NUMBER Slot, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length -); - -#define PCI_DATA_TAG ' ICP' -#define PCI_DATA_VERSION 1 - -typedef struct _PCIBUSDATA -{ - ULONG Tag; - ULONG Version; - PciReadWriteConfig ReadConfig; - PciReadWriteConfig WriteConfig; - PciPin2Line Pin2Line; - PciLine2Pin Line2Pin; - PCI_SLOT_NUMBER ParentSlot; - PVOID Reserved[4]; -} PCIBUSDATA, *PPCIBUSDATA; - - -/** SPINLOCK FUNCTIONS ********************************************************/ - -NTKERNELAPI -BOOLEAN -FASTCALL -KeTryToAcquireSpinLockAtDpcLevel( - IN OUT PKSPIN_LOCK SpinLock -); - -NTKERNELAPI -BOOLEAN -FASTCALL -KeTestSpinLock( - IN PKSPIN_LOCK SpinLock -); - -#if defined (_X86_) - -#if defined(WIN9X_COMPAT_SPINLOCK) - -NTKERNELAPI -VOID -NTAPI -KeInitializeSpinLock( - IN PKSPIN_LOCK SpinLock -); - -#else - -FORCEINLINE -VOID -KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock) -{ - /* Clear the lock */ - *SpinLock = 0; -} - -#endif - -NTHALAPI -KIRQL -FASTCALL -KfAcquireSpinLock( - IN PKSPIN_LOCK SpinLock); - -NTHALAPI -VOID -FASTCALL -KfReleaseSpinLock( - IN PKSPIN_LOCK SpinLock, - IN KIRQL NewIrql); - -NTKERNELAPI -VOID -FASTCALL -KefAcquireSpinLockAtDpcLevel( - IN PKSPIN_LOCK SpinLock); - -NTKERNELAPI -VOID -FASTCALL -KefReleaseSpinLockFromDpcLevel( - IN PKSPIN_LOCK SpinLock); - -#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock) -#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock) -#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a) -#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b) - -#define KeGetDcacheFillSize() 1L - -#elif defined(_M_ARM) // !defined (_X86_) - - FORCEINLINE - VOID - KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock) - { - /* Clear the lock */ - *SpinLock = 0; - } - - NTHALAPI - KIRQL - FASTCALL - KfAcquireSpinLock( - IN PKSPIN_LOCK SpinLock); - - NTHALAPI - VOID - FASTCALL - KfReleaseSpinLock( - IN PKSPIN_LOCK SpinLock, - IN KIRQL NewIrql); - - - NTKERNELAPI - VOID - FASTCALL - KefAcquireSpinLockAtDpcLevel( - IN PKSPIN_LOCK SpinLock); - - NTKERNELAPI - VOID - FASTCALL - KefReleaseSpinLockFromDpcLevel( - IN PKSPIN_LOCK SpinLock); - - -#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock) -#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock) -#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a) -#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b) - - NTKERNELAPI - VOID - NTAPI - KeInitializeSpinLock( - IN PKSPIN_LOCK SpinLock); - -#else - -FORCEINLINE -VOID -NTAPI -KeInitializeSpinLock( - PKSPIN_LOCK SpinLock) -{ - *SpinLock = 0; -} - -NTKERNELAPI -VOID -KeReleaseSpinLock( - IN PKSPIN_LOCK SpinLock, - IN KIRQL NewIrql); - -NTKERNELAPI -VOID -KeAcquireSpinLockAtDpcLevel( - IN PKSPIN_LOCK SpinLock); - -NTKERNELAPI -VOID -KeReleaseSpinLockFromDpcLevel( - IN PKSPIN_LOCK SpinLock); - -NTKERNELAPI -KIRQL -KeAcquireSpinLockRaiseToDpc( - IN PKSPIN_LOCK SpinLock); - -#define KeAcquireSpinLock(SpinLock, OldIrql) \ - *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock) - -#endif // !defined (_X86_) - -/* -** Utillity functions -*/ - -#define ARGUMENT_PRESENT(ArgumentPointer) \ - ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL) - -/* - * ULONG - * BYTE_OFFSET( - * IN PVOID Va) - */ -#define BYTE_OFFSET(Va) \ - ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1))) - -/* - * ULONG - * BYTES_TO_PAGES( - * IN ULONG Size) - */ -#define BYTES_TO_PAGES(Size) \ - ((ULONG) ((ULONG_PTR) (Size) >> PAGE_SHIFT) + (((ULONG) (Size) & (PAGE_SIZE - 1)) != 0)) - -/* - * PVOID - * PAGE_ALIGN( - * IN PVOID Va) - */ -#define PAGE_ALIGN(Va) \ - ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1))) - -/* - * ULONG_PTR - * ROUND_TO_PAGES( - * IN ULONG_PTR Size) - */ -#define ROUND_TO_PAGES(Size) \ - ((ULONG_PTR) (((ULONG_PTR) Size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))) - - - -#if defined(_X86_) || defined(_AMD64_) - -// -// x86 and x64 performs a 0x2C interrupt -// -#define DbgRaiseAssertionFailure __int2c - -#elif defined(_ARM_) - -// -// TODO -// - -#else -#error Unsupported Architecture -#endif - -#if DBG - -#define ASSERT(exp) \ - (VOID)((!(exp)) ? \ - RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE) - -#define ASSERTMSG(msg, exp) \ - (VOID)((!(exp)) ? \ - RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE) - -#define RTL_SOFT_ASSERT(exp) \ - (VOID)((!(exp)) ? \ - DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE) - -#define RTL_SOFT_ASSERTMSG(msg, exp) \ - (VOID)((!(exp)) ? \ - DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE) - -#define RTL_VERIFY(exp) ASSERT(exp) -#define RTL_VERIFYMSG(msg, exp) ASSERT(msg, exp) - -#define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp) -#define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp) - -#if defined(_MSC_VER) - -#define NT_ASSERT(exp) \ - ((!(exp)) ? \ - (__annotation(L"Debug", L"AssertFail", L#exp), \ - DbgRaiseAssertionFailure(), FALSE) : TRUE) - -#define NT_ASSERTMSG(msg, exp) \ - ((!(exp)) ? \ - (__annotation(L"Debug", L"AssertFail", L##msg), \ - DbgRaiseAssertionFailure(), FALSE) : TRUE) - -#define NT_ASSERTMSGW(msg, exp) \ - ((!(exp)) ? \ - (__annotation(L"Debug", L"AssertFail", msg), \ - DbgRaiseAssertionFailure(), FALSE) : TRUE) - -#else - -// -// GCC doesn't support __annotation (nor PDB) -// -#define NT_ASSERT(exp) \ - (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE) - -#define NT_ASSERTMSG NT_ASSERT -#define NT_ASSERTMSGW NT_ASSERT - -#endif - -#else /* !DBG */ - -#define ASSERT(exp) ((VOID) 0) -#define ASSERTMSG(msg, exp) ((VOID) 0) - -#define RTL_SOFT_ASSERT(exp) ((VOID) 0) -#define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0) - -#define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE) -#define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE) - -#define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE) -#define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE) - -#define NT_ASSERT(exp) ((VOID)0) -#define NT_ASSERTMSG(exp) ((VOID)0) -#define NT_ASSERTMSGW(exp) ((VOID)0) - -#endif /* DBG */ - -/* HACK HACK HACK - GCC (or perhaps LD) is messing this up */ -#if defined(_NTSYSTEM_) || defined(__GNUC__) -#define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag -#define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag -#else -#define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag) -#define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag) -#endif /* _NT_SYSTEM */ - -extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG; -extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG; - -/* -** Driver support routines -*/ - -/** Runtime library routines **/ - -static __inline VOID -InitializeListHead( - IN PLIST_ENTRY ListHead) -{ - ListHead->Flink = ListHead->Blink = ListHead; -} - -static __inline VOID -InsertHeadList( - IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY Entry) -{ - PLIST_ENTRY OldFlink; - OldFlink = ListHead->Flink; - Entry->Flink = OldFlink; - Entry->Blink = ListHead; - OldFlink->Blink = Entry; - ListHead->Flink = Entry; -} - -static __inline VOID -InsertTailList( - IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY Entry) -{ - PLIST_ENTRY OldBlink; - OldBlink = ListHead->Blink; - Entry->Flink = ListHead; - Entry->Blink = OldBlink; - OldBlink->Flink = Entry; - ListHead->Blink = Entry; -} - -/* - * BOOLEAN - * IsListEmpty( - * IN PLIST_ENTRY ListHead) - */ -#define IsListEmpty(_ListHead) \ - ((_ListHead)->Flink == (_ListHead)) - -/* - * PSINGLE_LIST_ENTRY - * PopEntryList( - * IN PSINGLE_LIST_ENTRY ListHead) - */ -#define PopEntryList(ListHead) \ - (ListHead)->Next; \ - { \ - PSINGLE_LIST_ENTRY _FirstEntry; \ - _FirstEntry = (ListHead)->Next; \ - if (_FirstEntry != NULL) \ - (ListHead)->Next = _FirstEntry->Next; \ - } - -/* - * VOID - * PushEntryList( - * IN PSINGLE_LIST_ENTRY ListHead, - * IN PSINGLE_LIST_ENTRY Entry) - */ -#define PushEntryList(_ListHead, _Entry) \ - (_Entry)->Next = (_ListHead)->Next; \ - (_ListHead)->Next = (_Entry); \ - -static __inline BOOLEAN -RemoveEntryList( - IN PLIST_ENTRY Entry) -{ - PLIST_ENTRY OldFlink; - PLIST_ENTRY OldBlink; - - OldFlink = Entry->Flink; - OldBlink = Entry->Blink; - OldFlink->Blink = OldBlink; - OldBlink->Flink = OldFlink; - return (BOOLEAN)(OldFlink == OldBlink); -} - -static __inline PLIST_ENTRY -RemoveHeadList( - IN PLIST_ENTRY ListHead) -{ - PLIST_ENTRY Flink; - PLIST_ENTRY Entry; - - Entry = ListHead->Flink; - Flink = Entry->Flink; - ListHead->Flink = Flink; - Flink->Blink = ListHead; - return Entry; -} - -static __inline PLIST_ENTRY -RemoveTailList( - IN PLIST_ENTRY ListHead) -{ - PLIST_ENTRY Blink; - PLIST_ENTRY Entry; - - Entry = ListHead->Blink; - Blink = Entry->Blink; - ListHead->Blink = Blink; - Blink->Flink = ListHead; - return Entry; -} - -NTSYSAPI -NTSTATUS -NTAPI -RtlCharToInteger( - IN PCSZ String, - IN ULONG Base OPTIONAL, - IN OUT PULONG Value); - -NTSYSAPI -LONG -NTAPI -RtlCompareString( - IN PSTRING String1, - IN PSTRING String2, - BOOLEAN CaseInSensitive); - -#if !defined(MIDL_PASS) - -FORCEINLINE -LUID -NTAPI -RtlConvertLongToLuid( - IN LONG Val) -{ - LUID Luid; - LARGE_INTEGER Temp; - - Temp.QuadPart = Val; - Luid.LowPart = Temp.u.LowPart; - Luid.HighPart = Temp.u.HighPart; - - return Luid; -} - -FORCEINLINE -LUID -NTAPI -RtlConvertUlongToLuid( - IN ULONG Val) -{ - LUID Luid; - - Luid.LowPart = Val; - Luid.HighPart = 0; - - return Luid; -} -#endif - - -NTSYSAPI -VOID -NTAPI -RtlCopyMemory32( - IN VOID UNALIGNED *Destination, - IN CONST VOID UNALIGNED *Source, - IN ULONG Length); - -NTSYSAPI -VOID -NTAPI -RtlCopyString( - IN OUT PSTRING DestinationString, - IN PSTRING SourceString OPTIONAL); - -NTSYSAPI -BOOLEAN -NTAPI -RtlEqualString( - IN PSTRING String1, - IN PSTRING String2, - IN BOOLEAN CaseInSensitive); - -#if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_) -#define RtlGetCallersAddress(CallersAddress, CallersCaller) \ - *CallersAddress = (PVOID)_ReturnAddress(); \ - *CallersCaller = NULL; -#else -NTSYSAPI -VOID -NTAPI -RtlGetCallersAddress( - OUT PVOID *CallersAddress, - OUT PVOID *CallersCaller); -#endif - -NTSYSAPI -NTSTATUS -NTAPI -RtlGetVersion( - IN OUT PRTL_OSVERSIONINFOW lpVersionInformation); - -NTSYSAPI -VOID -NTAPI -RtlMapGenericMask( - IN OUT PACCESS_MASK AccessMask, - IN PGENERIC_MAPPING GenericMapping); - -NTSYSAPI -BOOLEAN -NTAPI -RtlPrefixUnicodeString( - IN PCUNICODE_STRING String1, - IN PCUNICODE_STRING String2, - IN BOOLEAN CaseInSensitive); - -NTSYSAPI -NTSTATUS -NTAPI -RtlUpcaseUnicodeString( - IN OUT PUNICODE_STRING DestinationString OPTIONAL, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString); - -NTSYSAPI -CHAR -NTAPI -RtlUpperChar( - IN CHAR Character); - -NTSYSAPI -VOID -NTAPI -RtlUpperString( - IN OUT PSTRING DestinationString, - IN PSTRING SourceString); - -NTSYSAPI -NTSTATUS -NTAPI -RtlVerifyVersionInfo( - IN PRTL_OSVERSIONINFOEXW VersionInfo, - IN ULONG TypeMask, - IN ULONGLONG ConditionMask); - -NTSYSAPI -NTSTATUS -NTAPI -RtlVolumeDeviceToDosName( - IN PVOID VolumeDeviceObject, - OUT PUNICODE_STRING DosName); - -NTSYSAPI -ULONG -NTAPI -RtlWalkFrameChain( - OUT PVOID *Callers, - IN ULONG Count, - IN ULONG Flags); - -NTKERNELAPI -BOOLEAN -NTAPI -KeAreAllApcsDisabled( - VOID -); - -/* Guarded Mutex routines */ - -NTKERNELAPI -VOID -FASTCALL -KeAcquireGuardedMutex( - IN OUT PKGUARDED_MUTEX GuardedMutex -); - -NTKERNELAPI -VOID -FASTCALL -KeAcquireGuardedMutexUnsafe( - IN OUT PKGUARDED_MUTEX GuardedMutex -); - -NTKERNELAPI -VOID -NTAPI -KeEnterGuardedRegion( - VOID -); - -NTKERNELAPI -VOID -NTAPI -KeLeaveGuardedRegion( - VOID -); - -NTKERNELAPI -VOID -FASTCALL -KeInitializeGuardedMutex( - OUT PKGUARDED_MUTEX GuardedMutex -); - -NTKERNELAPI -VOID -FASTCALL -KeReleaseGuardedMutexUnsafe( - IN OUT PKGUARDED_MUTEX GuardedMutex -); - -NTKERNELAPI -VOID -FASTCALL -KeReleaseGuardedMutex( - IN OUT PKGUARDED_MUTEX GuardedMutex -); - -NTKERNELAPI -BOOLEAN -FASTCALL -KeTryToAcquireGuardedMutex( - IN OUT PKGUARDED_MUTEX GuardedMutex -); - -/* Fast Mutex */ -#define ExInitializeFastMutex(_FastMutex) \ -{ \ - (_FastMutex)->Count = FM_LOCK_BIT; \ - (_FastMutex)->Owner = NULL; \ - (_FastMutex)->Contention = 0; \ - KeInitializeEvent(&(_FastMutex)->Gate, SynchronizationEvent, FALSE); \ -} - -NTKERNELAPI -VOID -NTAPI -KeInitializeEvent( - IN PRKEVENT Event, - IN EVENT_TYPE Type, - IN BOOLEAN State); - -/****************************************************************************** - * Executive Types * - ******************************************************************************/ - -typedef struct _ZONE_SEGMENT_HEADER { - SINGLE_LIST_ENTRY SegmentList; - PVOID Reserved; -} ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER; - -typedef struct _ZONE_HEADER { - SINGLE_LIST_ENTRY FreeList; - SINGLE_LIST_ENTRY SegmentList; - ULONG BlockSize; - ULONG TotalSegmentSize; -} ZONE_HEADER, *PZONE_HEADER; - -#define PROTECTED_POOL 0x80000000 - -/****************************************************************************** - * Executive Functions * - ******************************************************************************/ - -NTKERNELAPI -NTSTATUS -NTAPI -ExExtendZone( - IN PZONE_HEADER Zone, - IN PVOID Segment, - IN ULONG SegmentSize); - -static __inline PVOID -ExAllocateFromZone( - IN PZONE_HEADER Zone) -{ - if (Zone->FreeList.Next) - Zone->FreeList.Next = Zone->FreeList.Next->Next; - return (PVOID) Zone->FreeList.Next; -} - -static __inline PVOID -ExFreeToZone( - IN PZONE_HEADER Zone, - IN PVOID Block) -{ - ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next; - Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block); - return ((PSINGLE_LIST_ENTRY) Block)->Next; -} - -NTKERNELAPI -NTSTATUS -NTAPI -ExInitializeZone( - IN PZONE_HEADER Zone, - IN ULONG BlockSize, - IN PVOID InitialSegment, - IN ULONG InitialSegmentSize); - -/* - * PVOID - * ExInterlockedAllocateFromZone( - * IN PZONE_HEADER Zone, - * IN PKSPIN_LOCK Lock) - */ -#define ExInterlockedAllocateFromZone(Zone, Lock) \ - ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock)) - -NTKERNELAPI -NTSTATUS -NTAPI -ExInterlockedExtendZone( - IN PZONE_HEADER Zone, - IN PVOID Segment, - IN ULONG SegmentSize, - IN PKSPIN_LOCK Lock); - -/* PVOID - * ExInterlockedFreeToZone( - * IN PZONE_HEADER Zone, - * IN PVOID Block, - * IN PKSPIN_LOCK Lock); - */ -#define ExInterlockedFreeToZone(Zone, Block, Lock) \ - ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock) - -/* - * VOID - * InitializeSListHead( - * IN PSLIST_HEADER SListHead) - */ -#define InitializeSListHead(_SListHead) \ - (_SListHead)->Alignment = 0 - -#define ExInitializeSListHead InitializeSListHead - -/* - * BOOLEAN - * ExIsFullZone( - * IN PZONE_HEADER Zone) - */ -#define ExIsFullZone(Zone) \ - ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL) - -/* BOOLEAN - * ExIsObjectInFirstZoneSegment( - * IN PZONE_HEADER Zone, - * IN PVOID Object); - */ -#define ExIsObjectInFirstZoneSegment(Zone,Object) \ - ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \ - ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \ - (Zone)->TotalSegmentSize)) ) - -NTKERNELAPI -DECLSPEC_NORETURN -VOID -NTAPI -ExRaiseAccessViolation( - VOID); - -NTKERNELAPI -DECLSPEC_NORETURN -VOID -NTAPI -ExRaiseDatatypeMisalignment( - VOID); - -NTKERNELAPI -NTSTATUS -NTAPI -ExUuidCreate( - OUT UUID *Uuid); - -#define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite -#define ExAcquireResourceShared ExAcquireResourceSharedLite -#define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite -#define ExDeleteResource ExDeleteResourceLite -#define ExInitializeResource ExInitializeResourceLite -#define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite -#define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite -#define ExIsResourceAcquired ExIsResourceAcquiredSharedLite -#define ExReleaseResourceForThread ExReleaseResourceForThreadLite - - -#if DBG - -#define PAGED_CODE() { \ - if (KeGetCurrentIrql() > APC_LEVEL) { \ - KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \ - ASSERT(FALSE); \ - } \ -} - -#else - -#define PAGED_CODE() - -#endif - -NTKERNELAPI -VOID -NTAPI -ProbeForRead( - IN CONST VOID *Address, - IN SIZE_T Length, - IN ULONG Alignment); - -NTKERNELAPI -VOID -NTAPI -ProbeForWrite( - IN PVOID Address, - IN SIZE_T Length, - IN ULONG Alignment); - - - -/** Configuration manager routines **/ - -NTKERNELAPI -NTSTATUS -NTAPI -CmRegisterCallback( - IN PEX_CALLBACK_FUNCTION Function, - IN PVOID Context, - IN OUT PLARGE_INTEGER Cookie); - -NTKERNELAPI -NTSTATUS -NTAPI -CmUnRegisterCallback( - IN LARGE_INTEGER Cookie); - - - -/** Filesystem runtime library routines **/ - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsTotalDeviceFailure( - IN NTSTATUS Status); - - - -/** Hardware abstraction layer routines **/ - -NTHALAPI -BOOLEAN -NTAPI -HalMakeBeep( - IN ULONG Frequency); - -NTKERNELAPI -VOID -FASTCALL -HalExamineMBR( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG MBRTypeIdentifier, - OUT PVOID *Buffer); - -VOID -NTAPI -HalPutDmaAdapter( - PADAPTER_OBJECT AdapterObject -); - - -/** Io access routines **/ - -#if !defined(_M_AMD64) -NTHALAPI -VOID -NTAPI -READ_PORT_BUFFER_UCHAR( - IN PUCHAR Port, - IN PUCHAR Buffer, - IN ULONG Count); - -NTHALAPI -VOID -NTAPI -READ_PORT_BUFFER_ULONG( - IN PULONG Port, - IN PULONG Buffer, - IN ULONG Count); - -NTHALAPI -VOID -NTAPI -READ_PORT_BUFFER_USHORT( - IN PUSHORT Port, - IN PUSHORT Buffer, - IN ULONG Count); - -NTHALAPI -UCHAR -NTAPI -READ_PORT_UCHAR( - IN PUCHAR Port); - -NTHALAPI -ULONG -NTAPI -READ_PORT_ULONG( - IN PULONG Port); - -NTHALAPI -USHORT -NTAPI -READ_PORT_USHORT( - IN PUSHORT Port); - -NTKERNELAPI -VOID -NTAPI -READ_REGISTER_BUFFER_UCHAR( - IN PUCHAR Register, - IN PUCHAR Buffer, - IN ULONG Count); - -NTKERNELAPI -VOID -NTAPI -READ_REGISTER_BUFFER_ULONG( - IN PULONG Register, - IN PULONG Buffer, - IN ULONG Count); - -NTKERNELAPI -VOID -NTAPI -READ_REGISTER_BUFFER_USHORT( - IN PUSHORT Register, - IN PUSHORT Buffer, - IN ULONG Count); - -NTKERNELAPI -UCHAR -NTAPI -READ_REGISTER_UCHAR( - IN PUCHAR Register); - -NTKERNELAPI -ULONG -NTAPI -READ_REGISTER_ULONG( - IN PULONG Register); - -NTKERNELAPI -USHORT -NTAPI -READ_REGISTER_USHORT( - IN PUSHORT Register); - -NTHALAPI -VOID -NTAPI -WRITE_PORT_BUFFER_UCHAR( - IN PUCHAR Port, - IN PUCHAR Buffer, - IN ULONG Count); - -NTHALAPI -VOID -NTAPI -WRITE_PORT_BUFFER_ULONG( - IN PULONG Port, - IN PULONG Buffer, - IN ULONG Count); - -NTHALAPI -VOID -NTAPI -WRITE_PORT_BUFFER_USHORT( - IN PUSHORT Port, - IN PUSHORT Buffer, - IN ULONG Count); - -NTHALAPI -VOID -NTAPI -WRITE_PORT_UCHAR( - IN PUCHAR Port, - IN UCHAR Value); - -NTHALAPI -VOID -NTAPI -WRITE_PORT_ULONG( - IN PULONG Port, - IN ULONG Value); - -NTHALAPI -VOID -NTAPI -WRITE_PORT_USHORT( - IN PUSHORT Port, - IN USHORT Value); - -NTKERNELAPI -VOID -NTAPI -WRITE_REGISTER_BUFFER_UCHAR( - IN PUCHAR Register, - IN PUCHAR Buffer, - IN ULONG Count); - -NTKERNELAPI -VOID -NTAPI -WRITE_REGISTER_BUFFER_ULONG( - IN PULONG Register, - IN PULONG Buffer, - IN ULONG Count); - -NTKERNELAPI -VOID -NTAPI -WRITE_REGISTER_BUFFER_USHORT( - IN PUSHORT Register, - IN PUSHORT Buffer, - IN ULONG Count); - -NTKERNELAPI -VOID -NTAPI -WRITE_REGISTER_UCHAR( - IN PUCHAR Register, - IN UCHAR Value); - -NTKERNELAPI -VOID -NTAPI -WRITE_REGISTER_ULONG( - IN PULONG Register, - IN ULONG Value); - -NTKERNELAPI -VOID -NTAPI -WRITE_REGISTER_USHORT( - IN PUSHORT Register, - IN USHORT Value); - -#else - -FORCEINLINE -VOID -READ_PORT_BUFFER_UCHAR( - IN PUCHAR Port, - IN PUCHAR Buffer, - IN ULONG Count) -{ - __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count); -} - -FORCEINLINE -VOID -READ_PORT_BUFFER_ULONG( - IN PULONG Port, - IN PULONG Buffer, - IN ULONG Count) -{ - __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count); -} - -FORCEINLINE -VOID -READ_PORT_BUFFER_USHORT( - IN PUSHORT Port, - IN PUSHORT Buffer, - IN ULONG Count) -{ - __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count); -} - -FORCEINLINE -UCHAR -READ_PORT_UCHAR( - IN PUCHAR Port) -{ - return __inbyte((USHORT)(ULONG_PTR)Port); -} - -FORCEINLINE -ULONG -READ_PORT_ULONG( - IN PULONG Port) -{ - return __indword((USHORT)(ULONG_PTR)Port); -} - -FORCEINLINE -USHORT -READ_PORT_USHORT( - IN PUSHORT Port) -{ - return __inword((USHORT)(ULONG_PTR)Port); -} - -FORCEINLINE -VOID -READ_REGISTER_BUFFER_UCHAR( - IN PUCHAR Register, - IN PUCHAR Buffer, - IN ULONG Count) -{ - __movsb(Register, Buffer, Count); -} - -FORCEINLINE -VOID -READ_REGISTER_BUFFER_ULONG( - IN PULONG Register, - IN PULONG Buffer, - IN ULONG Count) -{ - __movsd(Register, Buffer, Count); -} - -FORCEINLINE -VOID -READ_REGISTER_BUFFER_USHORT( - IN PUSHORT Register, - IN PUSHORT Buffer, - IN ULONG Count) -{ - __movsw(Register, Buffer, Count); -} - -FORCEINLINE -UCHAR -READ_REGISTER_UCHAR( - IN PUCHAR Register) -{ - return *Register; -} - -FORCEINLINE -ULONG -READ_REGISTER_ULONG( - IN PULONG Register) -{ - return *Register; -} - -FORCEINLINE -USHORT -READ_REGISTER_USHORT( - IN PUSHORT Register) -{ - return *Register; -} - -FORCEINLINE -VOID -WRITE_PORT_BUFFER_UCHAR( - IN PUCHAR Port, - IN PUCHAR Buffer, - IN ULONG Count) -{ - __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count); -} - -FORCEINLINE -VOID -WRITE_PORT_BUFFER_ULONG( - IN PULONG Port, - IN PULONG Buffer, - IN ULONG Count) -{ - __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count); -} - -FORCEINLINE -VOID -WRITE_PORT_BUFFER_USHORT( - IN PUSHORT Port, - IN PUSHORT Buffer, - IN ULONG Count) -{ - __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count); -} - -FORCEINLINE -VOID -WRITE_PORT_UCHAR( - IN PUCHAR Port, - IN UCHAR Value) -{ - __outbyte((USHORT)(ULONG_PTR)Port, Value); -} - -FORCEINLINE -VOID -WRITE_PORT_ULONG( - IN PULONG Port, - IN ULONG Value) -{ - __outdword((USHORT)(ULONG_PTR)Port, Value); -} - -FORCEINLINE -VOID -WRITE_PORT_USHORT( - IN PUSHORT Port, - IN USHORT Value) -{ - __outword((USHORT)(ULONG_PTR)Port, Value); -} - -FORCEINLINE -VOID -WRITE_REGISTER_BUFFER_UCHAR( - IN PUCHAR Register, - IN PUCHAR Buffer, - IN ULONG Count) -{ - LONG Synch; - __movsb(Register, Buffer, Count); - InterlockedOr(&Synch, 1); -} - -FORCEINLINE -VOID -WRITE_REGISTER_BUFFER_ULONG( - IN PULONG Register, - IN PULONG Buffer, - IN ULONG Count) -{ - LONG Synch; - __movsd(Register, Buffer, Count); - InterlockedOr(&Synch, 1); -} - -FORCEINLINE -VOID -WRITE_REGISTER_BUFFER_USHORT( - IN PUSHORT Register, - IN PUSHORT Buffer, - IN ULONG Count) -{ - LONG Synch; - __movsw(Register, Buffer, Count); - InterlockedOr(&Synch, 1); -} - -FORCEINLINE -VOID -WRITE_REGISTER_UCHAR( - IN PUCHAR Register, - IN UCHAR Value) -{ - LONG Synch; - *Register = Value; - InterlockedOr(&Synch, 1); -} - -FORCEINLINE -VOID -WRITE_REGISTER_ULONG( - IN PULONG Register, - IN ULONG Value) -{ - LONG Synch; - *Register = Value; - InterlockedOr(&Synch, 1); -} - -FORCEINLINE -VOID -WRITE_REGISTER_USHORT( - IN PUSHORT Register, - IN USHORT Value) -{ - LONG Sync; - *Register = Value; - InterlockedOr(&Sync, 1); -} - -#endif - -/** I/O manager routines **/ - -NTKERNELAPI -VOID -NTAPI -IoAcquireCancelSpinLock( - OUT PKIRQL Irql); - -NTKERNELAPI -NTSTATUS -NTAPI -IoAcquireRemoveLockEx( - IN PIO_REMOVE_LOCK RemoveLock, - IN OPTIONAL PVOID Tag OPTIONAL, - IN PCSTR File, - IN ULONG Line, - IN ULONG RemlockSize); - -/* - * NTSTATUS - * IoAcquireRemoveLock( - * IN PIO_REMOVE_LOCK RemoveLock, - * IN OPTIONAL PVOID Tag) - */ -#define IoAcquireRemoveLock(_RemoveLock, \ - _Tag) \ - IoAcquireRemoveLockEx(_RemoveLock, _Tag, __FILE__, __LINE__, sizeof(IO_REMOVE_LOCK)) - -/* - * VOID - * IoAdjustPagingPathCount( - * IN PLONG Count, - * IN BOOLEAN Increment) - */ -#define IoAdjustPagingPathCount(_Count, \ - _Increment) \ -{ \ - if (_Increment) \ - { \ - InterlockedIncrement(_Count); \ - } \ - else \ - { \ - InterlockedDecrement(_Count); \ - } \ -} - -#ifndef DMA_MACROS_DEFINED -NTKERNELAPI -NTSTATUS -NTAPI -IoAllocateAdapterChannel( - IN PADAPTER_OBJECT AdapterObject, - IN PDEVICE_OBJECT DeviceObject, - IN ULONG NumberOfMapRegisters, - IN PDRIVER_CONTROL ExecutionRoutine, - IN PVOID Context); -#endif - -NTKERNELAPI -VOID -NTAPI -IoAllocateController( - IN PCONTROLLER_OBJECT ControllerObject, - IN PDEVICE_OBJECT DeviceObject, - IN PDRIVER_CONTROL ExecutionRoutine, - IN PVOID Context); - -NTKERNELAPI -NTSTATUS -NTAPI -IoAllocateDriverObjectExtension( - IN PDRIVER_OBJECT DriverObject, - IN PVOID ClientIdentificationAddress, - IN ULONG DriverObjectExtensionSize, - OUT PVOID *DriverObjectExtension); - -NTKERNELAPI -PVOID -NTAPI -IoAllocateErrorLogEntry( - IN PVOID IoObject, - IN UCHAR EntrySize); - -NTKERNELAPI -PIRP -NTAPI -IoAllocateIrp( - IN CCHAR StackSize, - IN BOOLEAN ChargeQuota); - -NTKERNELAPI -PMDL -NTAPI -IoAllocateMdl( - IN PVOID VirtualAddress, - IN ULONG Length, - IN BOOLEAN SecondaryBuffer, - IN BOOLEAN ChargeQuota, - IN OUT PIRP Irp OPTIONAL); - -NTKERNELAPI -PIO_WORKITEM -NTAPI -IoAllocateWorkItem( - IN PDEVICE_OBJECT DeviceObject); - -/* - * VOID IoAssignArcName( - * IN PUNICODE_STRING ArcName, - * IN PUNICODE_STRING DeviceName); - */ -#define IoAssignArcName(_ArcName, _DeviceName) ( \ - IoCreateSymbolicLink((_ArcName), (_DeviceName))) - -NTKERNELAPI -NTSTATUS -NTAPI -IoAttachDevice( - IN PDEVICE_OBJECT SourceDevice, - IN PUNICODE_STRING TargetDevice, - OUT PDEVICE_OBJECT *AttachedDevice); - -NTKERNELAPI -PDEVICE_OBJECT -NTAPI -IoAttachDeviceToDeviceStack( - IN PDEVICE_OBJECT SourceDevice, - IN PDEVICE_OBJECT TargetDevice); - -NTKERNELAPI -PIRP -NTAPI -IoBuildAsynchronousFsdRequest( - IN ULONG MajorFunction, - IN PDEVICE_OBJECT DeviceObject, - IN OUT PVOID Buffer OPTIONAL, - IN ULONG Length OPTIONAL, - IN PLARGE_INTEGER StartingOffset OPTIONAL, - IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL); - -NTKERNELAPI -PIRP -NTAPI -IoBuildDeviceIoControlRequest( - IN ULONG IoControlCode, - IN PDEVICE_OBJECT DeviceObject, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength, - IN BOOLEAN InternalDeviceIoControl, - IN PKEVENT Event, - OUT PIO_STATUS_BLOCK IoStatusBlock); - -NTKERNELAPI -VOID -NTAPI -IoBuildPartialMdl( - IN PMDL SourceMdl, - IN OUT PMDL TargetMdl, - IN PVOID VirtualAddress, - IN ULONG Length); - -NTKERNELAPI -PIRP -NTAPI -IoBuildSynchronousFsdRequest( - IN ULONG MajorFunction, - IN PDEVICE_OBJECT DeviceObject, - IN OUT PVOID Buffer OPTIONAL, - IN ULONG Length OPTIONAL, - IN PLARGE_INTEGER StartingOffset OPTIONAL, - IN PKEVENT Event, - OUT PIO_STATUS_BLOCK IoStatusBlock); - -NTKERNELAPI -NTSTATUS -FASTCALL -IofCallDriver( - IN PDEVICE_OBJECT DeviceObject, - IN OUT PIRP Irp); - -/* - * NTSTATUS - * IoCallDriver( - * IN PDEVICE_OBJECT DeviceObject, - * IN OUT PIRP Irp) - */ -#define IoCallDriver IofCallDriver - -NTKERNELAPI -VOID -NTAPI -IoCancelFileOpen( - IN PDEVICE_OBJECT DeviceObject, - IN PFILE_OBJECT FileObject); - -NTKERNELAPI -BOOLEAN -NTAPI -IoCancelIrp( - IN PIRP Irp); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCheckShareAccess( - IN ACCESS_MASK DesiredAccess, - IN ULONG DesiredShareAccess, - IN OUT PFILE_OBJECT FileObject, - IN OUT PSHARE_ACCESS ShareAccess, - IN BOOLEAN Update); - -NTKERNELAPI -VOID -FASTCALL -IofCompleteRequest( - IN PIRP Irp, - IN CCHAR PriorityBoost); - -/* - * VOID - * IoCompleteRequest( - * IN PIRP Irp, - * IN CCHAR PriorityBoost) - */ -#define IoCompleteRequest IofCompleteRequest - -NTKERNELAPI -NTSTATUS -NTAPI -IoConnectInterrupt( - OUT PKINTERRUPT *InterruptObject, - IN PKSERVICE_ROUTINE ServiceRoutine, - IN PVOID ServiceContext, - IN PKSPIN_LOCK SpinLock OPTIONAL, - IN ULONG Vector, - IN KIRQL Irql, - IN KIRQL SynchronizeIrql, - IN KINTERRUPT_MODE InterruptMode, - IN BOOLEAN ShareVector, - IN KAFFINITY ProcessorEnableMask, - IN BOOLEAN FloatingSave); - -/* - * PIO_STACK_LOCATION - * IoGetCurrentIrpStackLocation( - * IN PIRP Irp) - */ -#define IoGetCurrentIrpStackLocation(_Irp) \ - ((_Irp)->Tail.Overlay.CurrentStackLocation) - -/* - * PIO_STACK_LOCATION - * IoGetNextIrpStackLocation( - * IN PIRP Irp) - */ -#define IoGetNextIrpStackLocation(_Irp) \ - ((_Irp)->Tail.Overlay.CurrentStackLocation - 1) - -/* - * VOID - * IoCopyCurrentIrpStackLocationToNext( - * IN PIRP Irp) - */ -#define IoCopyCurrentIrpStackLocationToNext(_Irp) \ -{ \ - PIO_STACK_LOCATION _IrpSp; \ - PIO_STACK_LOCATION _NextIrpSp; \ - _IrpSp = IoGetCurrentIrpStackLocation(_Irp); \ - _NextIrpSp = IoGetNextIrpStackLocation(_Irp); \ - RtlCopyMemory(_NextIrpSp, _IrpSp, \ - FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \ - _NextIrpSp->Control = 0; \ -} - -NTKERNELAPI -PCONTROLLER_OBJECT -NTAPI -IoCreateController( - IN ULONG Size); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCreateDevice( - IN PDRIVER_OBJECT DriverObject, - IN ULONG DeviceExtensionSize, - IN PUNICODE_STRING DeviceName OPTIONAL, - IN DEVICE_TYPE DeviceType, - IN ULONG DeviceCharacteristics, - IN BOOLEAN Exclusive, - OUT PDEVICE_OBJECT *DeviceObject); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCreateDisk( - IN PDEVICE_OBJECT DeviceObject, - IN PCREATE_DISK Disk); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCreateFile( - OUT PHANDLE FileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER AllocationSize OPTIONAL, - IN ULONG FileAttributes, - IN ULONG ShareAccess, - IN ULONG Disposition, - IN ULONG CreateOptions, - IN PVOID EaBuffer OPTIONAL, - IN ULONG EaLength, - IN CREATE_FILE_TYPE CreateFileType, - IN PVOID ExtraCreateParameters OPTIONAL, - IN ULONG Options); - -NTKERNELAPI -PKEVENT -NTAPI -IoCreateNotificationEvent( - IN PUNICODE_STRING EventName, - OUT PHANDLE EventHandle); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCreateSymbolicLink( - IN PUNICODE_STRING SymbolicLinkName, - IN PUNICODE_STRING DeviceName); - -NTKERNELAPI -PKEVENT -NTAPI -IoCreateSynchronizationEvent( - IN PUNICODE_STRING EventName, - OUT PHANDLE EventHandle); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCreateUnprotectedSymbolicLink( - IN PUNICODE_STRING SymbolicLinkName, - IN PUNICODE_STRING DeviceName); - -NTKERNELAPI -NTSTATUS -NTAPI -IoCsqInitialize( - PIO_CSQ Csq, - IN PIO_CSQ_INSERT_IRP CsqInsertIrp, - IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp, - IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, - IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, - IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock, - IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp); - -NTKERNELAPI -VOID -NTAPI -IoCsqInsertIrp( - IN PIO_CSQ Csq, - IN PIRP Irp, - IN PIO_CSQ_IRP_CONTEXT Context); - -NTKERNELAPI -PIRP -NTAPI -IoCsqRemoveIrp( - IN PIO_CSQ Csq, - IN PIO_CSQ_IRP_CONTEXT Context); - -NTKERNELAPI -PIRP -NTAPI -IoCsqRemoveNextIrp( - IN PIO_CSQ Csq, - IN PVOID PeekContext); - -NTKERNELAPI -VOID -NTAPI -IoDeleteController( - IN PCONTROLLER_OBJECT ControllerObject); - -NTKERNELAPI -VOID -NTAPI -IoDeleteDevice( - IN PDEVICE_OBJECT DeviceObject); - -NTKERNELAPI -NTSTATUS -NTAPI -IoDeleteSymbolicLink( - IN PUNICODE_STRING SymbolicLinkName); - -/* - * VOID - * IoDeassignArcName( - * IN PUNICODE_STRING ArcName) - */ -#define IoDeassignArcName IoDeleteSymbolicLink - -NTKERNELAPI -VOID -NTAPI -IoDetachDevice( - IN OUT PDEVICE_OBJECT TargetDevice); - -NTKERNELAPI -VOID -NTAPI -IoDisconnectInterrupt( - IN PKINTERRUPT InterruptObject); - -NTKERNELAPI -BOOLEAN -NTAPI -IoForwardIrpSynchronously( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp); - -#define IoForwardAndCatchIrp IoForwardIrpSynchronously - -NTKERNELAPI -VOID -NTAPI -IoFreeController( - IN PCONTROLLER_OBJECT ControllerObject); - -NTKERNELAPI -VOID -NTAPI -IoFreeErrorLogEntry( - PVOID ElEntry); - -NTKERNELAPI -VOID -NTAPI -IoFreeIrp( - IN PIRP Irp); - -NTKERNELAPI -VOID -NTAPI -IoFreeMdl( - IN PMDL Mdl); - -NTKERNELAPI -VOID -NTAPI -IoFreeWorkItem( - IN PIO_WORKITEM pIOWorkItem); - -NTKERNELAPI -PDEVICE_OBJECT -NTAPI -IoGetAttachedDevice( - IN PDEVICE_OBJECT DeviceObject); - -NTKERNELAPI -PDEVICE_OBJECT -NTAPI -IoGetAttachedDeviceReference( - IN PDEVICE_OBJECT DeviceObject); - -NTKERNELAPI -NTSTATUS -NTAPI -IoGetBootDiskInformation( - IN OUT PBOOTDISK_INFORMATION BootDiskInformation, - IN ULONG Size); - -NTKERNELAPI -PCONFIGURATION_INFORMATION -NTAPI -IoGetConfigurationInformation( - VOID); - -NTKERNELAPI -PEPROCESS -NTAPI -IoGetCurrentProcess( - VOID); - -NTKERNELAPI -NTSTATUS -NTAPI -IoGetDeviceInterfaceAlias( - IN PUNICODE_STRING SymbolicLinkName, - IN CONST GUID *AliasInterfaceClassGuid, - OUT PUNICODE_STRING AliasSymbolicLinkName); - -#define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001 - -NTKERNELAPI -NTSTATUS -NTAPI -IoGetDeviceInterfaces( - IN CONST GUID *InterfaceClassGuid, - IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, - IN ULONG Flags, - OUT PWSTR *SymbolicLinkList); - -NTKERNELAPI -NTSTATUS -NTAPI -IoGetDeviceObjectPointer( - IN PUNICODE_STRING ObjectName, - IN ACCESS_MASK DesiredAccess, - OUT PFILE_OBJECT *FileObject, - OUT PDEVICE_OBJECT *DeviceObject); - -NTKERNELAPI -NTSTATUS -NTAPI -IoGetDeviceProperty( - IN PDEVICE_OBJECT DeviceObject, - IN DEVICE_REGISTRY_PROPERTY DeviceProperty, - IN ULONG BufferLength, - OUT PVOID PropertyBuffer, - OUT PULONG ResultLength); - -NTKERNELAPI -PDEVICE_OBJECT -NTAPI -IoGetDeviceToVerify( - IN PETHREAD Thread); - -NTKERNELAPI -PDMA_ADAPTER -NTAPI -IoGetDmaAdapter( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PDEVICE_DESCRIPTION DeviceDescription, - IN OUT PULONG NumberOfMapRegisters); - -NTKERNELAPI -PVOID -NTAPI -IoGetDriverObjectExtension( - IN PDRIVER_OBJECT DriverObject, - IN PVOID ClientIdentificationAddress); - -NTKERNELAPI -PGENERIC_MAPPING -NTAPI -IoGetFileObjectGenericMapping( - VOID); - -/* - * ULONG - * IoGetFunctionCodeFromCtlCode( - * IN ULONG ControlCode) - */ -#define IoGetFunctionCodeFromCtlCode(_ControlCode) \ - (((_ControlCode) >> 2) & 0x00000FFF) - -NTKERNELAPI -PVOID -NTAPI -IoGetInitialStack( - VOID); - -NTKERNELAPI -PDEVICE_OBJECT -NTAPI -IoGetRelatedDeviceObject( - IN PFILE_OBJECT FileObject); - -NTKERNELAPI -VOID -NTAPI -IoGetStackLimits( - OUT PULONG_PTR LowLimit, - OUT PULONG_PTR HighLimit); - -FORCEINLINE -ULONG_PTR -IoGetRemainingStackSize( - VOID -) -{ - ULONG_PTR End, Begin; - ULONG_PTR Result; - - IoGetStackLimits(&Begin, &End); - Result = (ULONG_PTR)(&End) - Begin; - return Result; -} - -NTKERNELAPI -VOID -NTAPI -KeInitializeDpc( - IN PRKDPC Dpc, - IN PKDEFERRED_ROUTINE DeferredRoutine, - IN PVOID DeferredContext); - -/* - * VOID - * IoInitializeDpcRequest( - * IN PDEVICE_OBJECT DeviceObject, - * IN PIO_DPC_ROUTINE DpcRoutine) - */ -#define IoInitializeDpcRequest(_DeviceObject, \ - _DpcRoutine) \ - KeInitializeDpc(&(_DeviceObject)->Dpc, \ - (PKDEFERRED_ROUTINE) (_DpcRoutine), \ - _DeviceObject) - -NTKERNELAPI -VOID -NTAPI -IoInitializeIrp( - IN OUT PIRP Irp, - IN USHORT PacketSize, - IN CCHAR StackSize); - -NTKERNELAPI -VOID -NTAPI -IoInitializeRemoveLockEx( - IN PIO_REMOVE_LOCK Lock, - IN ULONG AllocateTag, - IN ULONG MaxLockedMinutes, - IN ULONG HighWatermark, - IN ULONG RemlockSize); - -/* VOID - * IoInitializeRemoveLock( - * IN PIO_REMOVE_LOCK Lock, - * IN ULONG AllocateTag, - * IN ULONG MaxLockedMinutes, - * IN ULONG HighWatermark) - */ -#define IoInitializeRemoveLock( \ - Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \ - IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \ - HighWatermark, sizeof(IO_REMOVE_LOCK)) - -NTKERNELAPI -NTSTATUS -NTAPI -IoInitializeTimer( - IN PDEVICE_OBJECT DeviceObject, - IN PIO_TIMER_ROUTINE TimerRoutine, - IN PVOID Context); - -NTKERNELAPI -VOID -NTAPI -IoInvalidateDeviceRelations( - IN PDEVICE_OBJECT DeviceObject, - IN DEVICE_RELATION_TYPE Type); - -NTKERNELAPI -VOID -NTAPI -IoInvalidateDeviceState( - IN PDEVICE_OBJECT PhysicalDeviceObject); - -NTKERNELAPI -BOOLEAN -NTAPI -IoIs32bitProcess( - IN PIRP Irp OPTIONAL); - -/* - * BOOLEAN - * IoIsErrorUserInduced( - * IN NTSTATUS Status); - */ -#define IoIsErrorUserInduced(Status) \ - ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \ - ((Status) == STATUS_IO_TIMEOUT) || \ - ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \ - ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \ - ((Status) == STATUS_VERIFY_REQUIRED) || \ - ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \ - ((Status) == STATUS_WRONG_VOLUME))) - -NTKERNELAPI -BOOLEAN -NTAPI -IoIsWdmVersionAvailable( - IN UCHAR MajorVersion, - IN UCHAR MinorVersion); - -NTKERNELAPI -PIRP -NTAPI -IoMakeAssociatedIrp( - IN PIRP Irp, - IN CCHAR StackSize); - -/* - * VOID - * IoMarkIrpPending( - * IN OUT PIRP Irp) - */ -#define IoMarkIrpPending(_Irp) \ - (IoGetCurrentIrpStackLocation(_Irp)->Control |= SL_PENDING_RETURNED) - -NTKERNELAPI -NTSTATUS -NTAPI -IoOpenDeviceInterfaceRegistryKey( - IN PUNICODE_STRING SymbolicLinkName, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE DeviceInterfaceKey); - -#define PLUGPLAY_REGKEY_DEVICE 1 -#define PLUGPLAY_REGKEY_DRIVER 2 -#define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4 - -NTKERNELAPI -NTSTATUS -NTAPI -IoOpenDeviceRegistryKey( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DevInstKeyType, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE DevInstRegKey); - -NTKERNELAPI -NTSTATUS -NTAPI -IoQueryDeviceDescription( - IN PINTERFACE_TYPE BusType OPTIONAL, - IN PULONG BusNumber OPTIONAL, - IN PCONFIGURATION_TYPE ControllerType OPTIONAL, - IN PULONG ControllerNumber OPTIONAL, - IN PCONFIGURATION_TYPE PeripheralType OPTIONAL, - IN PULONG PeripheralNumber OPTIONAL, - IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine, - IN PVOID Context); - -NTKERNELAPI -VOID -NTAPI -IoQueueWorkItem( - IN PIO_WORKITEM pIOWorkItem, - IN PIO_WORKITEM_ROUTINE Routine, - IN WORK_QUEUE_TYPE QueueType, - IN PVOID Context); - -NTKERNELAPI -VOID -NTAPI -IoRaiseHardError( - IN PIRP Irp, - IN PVPB Vpb OPTIONAL, - IN PDEVICE_OBJECT RealDeviceObject); - -NTKERNELAPI -BOOLEAN -NTAPI -IoRaiseInformationalHardError( - IN NTSTATUS ErrorStatus, - IN PUNICODE_STRING String OPTIONAL, - IN PKTHREAD Thread OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -IoReadDiskSignature( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG BytesPerSector, - OUT PDISK_SIGNATURE Signature); - -NTKERNELAPI -NTSTATUS -FASTCALL -IoReadPartitionTable( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN BOOLEAN ReturnRecognizedPartitions, - OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); - -NTKERNELAPI -NTSTATUS -NTAPI -IoReadPartitionTableEx( - IN PDEVICE_OBJECT DeviceObject, - IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer); - -NTKERNELAPI -VOID -NTAPI -IoRegisterBootDriverReinitialization( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_REINITIALIZE DriverReinitializationRoutine, - IN PVOID Context); - -NTKERNELAPI -VOID -NTAPI -IoRegisterBootDriverReinitialization( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_REINITIALIZE DriverReinitializationRoutine, - IN PVOID Context); - -NTKERNELAPI -NTSTATUS -NTAPI -IoRegisterDeviceInterface( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN CONST GUID *InterfaceClassGuid, - IN PUNICODE_STRING ReferenceString OPTIONAL, - OUT PUNICODE_STRING SymbolicLinkName); - -NTKERNELAPI -VOID -NTAPI -IoRegisterDriverReinitialization( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_REINITIALIZE DriverReinitializationRoutine, - IN PVOID Context); - -NTKERNELAPI -NTSTATUS -NTAPI -IoRegisterPlugPlayNotification( - IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory, - IN ULONG EventCategoryFlags, - IN PVOID EventCategoryData OPTIONAL, - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine, - IN PVOID Context, - OUT PVOID *NotificationEntry); - -NTKERNELAPI -NTSTATUS -NTAPI -IoRegisterShutdownNotification( - IN PDEVICE_OBJECT DeviceObject); - -NTKERNELAPI -VOID -NTAPI -IoReleaseCancelSpinLock( - IN KIRQL Irql); - -NTKERNELAPI -VOID -NTAPI -IoReleaseRemoveLockAndWaitEx( - IN PIO_REMOVE_LOCK RemoveLock, - IN PVOID Tag, - IN ULONG RemlockSize); - -NTKERNELAPI -VOID -NTAPI -IoReleaseRemoveLockEx( - IN PIO_REMOVE_LOCK RemoveLock, - IN PVOID Tag, - IN ULONG RemlockSize); - -/* - * VOID - * IoReleaseRemoveLock( - * IN PIO_REMOVE_LOCK RemoveLock, - * IN PVOID Tag) - */ -#define IoReleaseRemoveLock(_RemoveLock, \ - _Tag) \ - IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK)) - -/* - * VOID - * IoReleaseRemoveLockAndWait( - * IN PIO_REMOVE_LOCK RemoveLock, - * IN PVOID Tag) - */ -#define IoReleaseRemoveLockAndWait(_RemoveLock, \ - _Tag) \ - IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK)) - -NTKERNELAPI -VOID -NTAPI -IoRemoveShareAccess( - IN PFILE_OBJECT FileObject, - IN OUT PSHARE_ACCESS ShareAccess); - -NTKERNELAPI -NTSTATUS -NTAPI -IoReportDetectedDevice( - IN PDRIVER_OBJECT DriverObject, - IN INTERFACE_TYPE LegacyBusType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PCM_RESOURCE_LIST ResourceList, - IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL, - IN BOOLEAN ResourceAssigned, - IN OUT PDEVICE_OBJECT *DeviceObject); - -NTKERNELAPI -NTSTATUS -NTAPI -IoReportResourceForDetection( - IN PDRIVER_OBJECT DriverObject, - IN PCM_RESOURCE_LIST DriverList OPTIONAL, - IN ULONG DriverListSize OPTIONAL, - IN PDEVICE_OBJECT DeviceObject OPTIONAL, - IN PCM_RESOURCE_LIST DeviceList OPTIONAL, - IN ULONG DeviceListSize OPTIONAL, - OUT PBOOLEAN ConflictDetected); - -NTKERNELAPI -NTSTATUS -NTAPI -IoReportResourceUsage( - IN PUNICODE_STRING DriverClassName OPTIONAL, - IN PDRIVER_OBJECT DriverObject, - IN PCM_RESOURCE_LIST DriverList OPTIONAL, - IN ULONG DriverListSize OPTIONAL, - IN PDEVICE_OBJECT DeviceObject, - IN PCM_RESOURCE_LIST DeviceList OPTIONAL, - IN ULONG DeviceListSize OPTIONAL, - IN BOOLEAN OverrideConflict, - OUT PBOOLEAN ConflictDetected); - -NTKERNELAPI -NTSTATUS -NTAPI -IoReportTargetDeviceChange( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PVOID NotificationStructure); - -NTKERNELAPI -NTSTATUS -NTAPI -IoReportTargetDeviceChangeAsynchronous( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PVOID NotificationStructure, - IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL, - IN PVOID Context OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -IoRequestDeviceEject( - IN PDEVICE_OBJECT PhysicalDeviceObject); - -/* - * VOID - * IoRequestDpc( - * IN PDEVICE_OBJECT DeviceObject, - * IN PIRP Irp, - * IN PVOID Context); - */ -#define IoRequestDpc(DeviceObject, Irp, Context)( \ - KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context))) - -NTKERNELAPI -VOID -NTAPI -IoReuseIrp( - IN OUT PIRP Irp, - IN NTSTATUS Status); - -/* - * PDRIVER_CANCEL - * IoSetCancelRoutine( - * IN PIRP Irp, - * IN PDRIVER_CANCEL CancelRoutine) - */ -#define IoSetCancelRoutine(_Irp, \ - _CancelRoutine) \ - ((PDRIVER_CANCEL) InterlockedExchangePointer( \ - (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (_CancelRoutine))) - -/* - * VOID - * IoSetCompletionRoutine( - * IN PIRP Irp, - * IN PIO_COMPLETION_ROUTINE CompletionRoutine, - * IN PVOID Context, - * IN BOOLEAN InvokeOnSuccess, - * IN BOOLEAN InvokeOnError, - * IN BOOLEAN InvokeOnCancel) - */ -#define IoSetCompletionRoutine(_Irp, \ - _CompletionRoutine, \ - _Context, \ - _InvokeOnSuccess, \ - _InvokeOnError, \ - _InvokeOnCancel) \ -{ \ - PIO_STACK_LOCATION _IrpSp; \ - ASSERT((_InvokeOnSuccess) || (_InvokeOnError) || (_InvokeOnCancel) ? \ - (_CompletionRoutine) != NULL : TRUE); \ - _IrpSp = IoGetNextIrpStackLocation(_Irp); \ - _IrpSp->CompletionRoutine = (PIO_COMPLETION_ROUTINE)(_CompletionRoutine); \ - _IrpSp->Context = (_Context); \ - _IrpSp->Control = 0; \ - if (_InvokeOnSuccess) _IrpSp->Control = SL_INVOKE_ON_SUCCESS; \ - if (_InvokeOnError) _IrpSp->Control |= SL_INVOKE_ON_ERROR; \ - if (_InvokeOnCancel) _IrpSp->Control |= SL_INVOKE_ON_CANCEL; \ -} - -NTKERNELAPI -NTSTATUS -NTAPI -IoSetCompletionRoutineEx( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PIO_COMPLETION_ROUTINE CompletionRoutine, - IN PVOID Context, - IN BOOLEAN InvokeOnSuccess, - IN BOOLEAN InvokeOnError, - IN BOOLEAN InvokeOnCancel); - -NTKERNELAPI -NTSTATUS -NTAPI -IoSetDeviceInterfaceState( - IN PUNICODE_STRING SymbolicLinkName, - IN BOOLEAN Enable); - -NTKERNELAPI -VOID -NTAPI -IoSetHardErrorOrVerifyDevice( - IN PIRP Irp, - IN PDEVICE_OBJECT DeviceObject); - -/* - * VOID - * IoSetNextIrpStackLocation( - * IN OUT PIRP Irp) - */ -#define IoSetNextIrpStackLocation(_Irp) \ -{ \ - (_Irp)->CurrentLocation--; \ - (_Irp)->Tail.Overlay.CurrentStackLocation--; \ -} - -NTKERNELAPI -NTSTATUS -FASTCALL -IoSetPartitionInformation( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG PartitionNumber, - IN ULONG PartitionType); - -NTKERNELAPI -NTSTATUS -NTAPI -IoSetPartitionInformationEx( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG PartitionNumber, - IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo); - -NTKERNELAPI -VOID -NTAPI -IoSetShareAccess( - IN ACCESS_MASK DesiredAccess, - IN ULONG DesiredShareAccess, - IN OUT PFILE_OBJECT FileObject, - OUT PSHARE_ACCESS ShareAccess); - -NTKERNELAPI -VOID -NTAPI -IoSetStartIoAttributes( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN DeferredStartIo, - IN BOOLEAN NonCancelable); - -NTKERNELAPI -NTSTATUS -NTAPI -IoSetSystemPartition( - IN PUNICODE_STRING VolumeNameString); - -NTKERNELAPI -BOOLEAN -NTAPI -IoSetThreadHardErrorMode( - IN BOOLEAN EnableHardErrors); - -/* - * USHORT - * IoSizeOfIrp( - * IN CCHAR StackSize) - */ -#define IoSizeOfIrp(_StackSize) \ - ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION))))) - -/* - * VOID - * IoSkipCurrentIrpStackLocation( - * IN PIRP Irp) - */ -#define IoSkipCurrentIrpStackLocation(_Irp) \ -{ \ - (_Irp)->CurrentLocation++; \ - (_Irp)->Tail.Overlay.CurrentStackLocation++; \ -} - -NTKERNELAPI -VOID -NTAPI -IoStartNextPacket( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN Cancelable); - -NTKERNELAPI -VOID -NTAPI -IoStartNextPacketByKey( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN Cancelable, - IN ULONG Key); - -NTKERNELAPI -VOID -NTAPI -IoStartPacket( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PULONG Key OPTIONAL, - IN PDRIVER_CANCEL CancelFunction OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -IoStartTimer( - IN PDEVICE_OBJECT DeviceObject); - -NTKERNELAPI -VOID -NTAPI -IoStopTimer( - IN PDEVICE_OBJECT DeviceObject); - -NTKERNELAPI -NTSTATUS -NTAPI -IoUnregisterPlugPlayNotification( - IN PVOID NotificationEntry); - -NTKERNELAPI -VOID -NTAPI -IoUnregisterShutdownNotification( - IN PDEVICE_OBJECT DeviceObject); - -NTKERNELAPI -VOID -NTAPI -IoUpdateShareAccess( - IN PFILE_OBJECT FileObject, - IN OUT PSHARE_ACCESS ShareAccess); - -NTKERNELAPI -NTSTATUS -NTAPI -IoVerifyPartitionTable( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN FixErrors); - -NTKERNELAPI -NTSTATUS -NTAPI -IoVolumeDeviceToDosName( - IN PVOID VolumeDeviceObject, - OUT PUNICODE_STRING DosName); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWMIAllocateInstanceIds( - IN GUID *Guid, - IN ULONG InstanceCount, - OUT ULONG *FirstInstanceId); - -NTKERNELAPI -ULONG -NTAPI -IoWMIDeviceObjectToProviderId( - IN PDEVICE_OBJECT DeviceObject); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWMIDeviceObjectToInstanceName( - IN PVOID DataBlockObject, - IN PDEVICE_OBJECT DeviceObject, - OUT PUNICODE_STRING InstanceName); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWMIExecuteMethod( - IN PVOID DataBlockObject, - IN PUNICODE_STRING InstanceName, - IN ULONG MethodId, - IN ULONG InBufferSize, - IN OUT PULONG OutBufferSize, - IN OUT PUCHAR InOutBuffer); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWMIHandleToInstanceName( - IN PVOID DataBlockObject, - IN HANDLE FileHandle, - OUT PUNICODE_STRING InstanceName); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWMIOpenBlock( - IN GUID *DataBlockGuid, - IN ULONG DesiredAccess, - OUT PVOID *DataBlockObject); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWMIQueryAllData( - IN PVOID DataBlockObject, - IN OUT ULONG *InOutBufferSize, - OUT PVOID OutBuffer); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWMIQueryAllDataMultiple( - IN PVOID *DataBlockObjectList, - IN ULONG ObjectCount, - IN OUT ULONG *InOutBufferSize, - OUT PVOID OutBuffer); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWMIQuerySingleInstance( - IN PVOID DataBlockObject, - IN PUNICODE_STRING InstanceName, - IN OUT ULONG *InOutBufferSize, - OUT PVOID OutBuffer); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWMIQuerySingleInstanceMultiple( - IN PVOID *DataBlockObjectList, - IN PUNICODE_STRING InstanceNames, - IN ULONG ObjectCount, - IN OUT ULONG *InOutBufferSize, - OUT PVOID OutBuffer); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWMIRegistrationControl( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG Action); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWMISetNotificationCallback( - IN PVOID Object, - IN WMI_NOTIFICATION_CALLBACK Callback, - IN PVOID Context); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWMISetSingleInstance( - IN PVOID DataBlockObject, - IN PUNICODE_STRING InstanceName, - IN ULONG Version, - IN ULONG ValueBufferSize, - IN PVOID ValueBuffer); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWMISetSingleItem( - IN PVOID DataBlockObject, - IN PUNICODE_STRING InstanceName, - IN ULONG DataItemId, - IN ULONG Version, - IN ULONG ValueBufferSize, - IN PVOID ValueBuffer); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWMISuggestInstanceName( - IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, - IN PUNICODE_STRING SymbolicLinkName OPTIONAL, - IN BOOLEAN CombineNames, - OUT PUNICODE_STRING SuggestedInstanceName); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWMIWriteEvent( - IN PVOID WnodeEventItem); - -NTKERNELAPI -VOID -NTAPI -IoWriteErrorLogEntry( - IN PVOID ElEntry); - -NTKERNELAPI -NTSTATUS -FASTCALL -IoWritePartitionTable( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG SectorsPerTrack, - IN ULONG NumberOfHeads, - IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); - -NTKERNELAPI -NTSTATUS -NTAPI -IoWritePartitionTableEx( - IN PDEVICE_OBJECT DeviceObject, - IN struct _DRIVE_LAYOUT_INFORMATION_EX *PartitionBuffer); - - - -/** Kernel routines **/ - -#if defined (_M_AMD64) -NTKERNELAPI -VOID -FASTCALL -KeAcquireInStackQueuedSpinLock( - IN PKSPIN_LOCK SpinLock, - IN PKLOCK_QUEUE_HANDLE LockHandle); - -NTKERNELAPI -VOID -FASTCALL -KeReleaseInStackQueuedSpinLock( - IN PKLOCK_QUEUE_HANDLE LockHandle); -#else -NTHALAPI -VOID -FASTCALL -KeAcquireInStackQueuedSpinLock( - IN PKSPIN_LOCK SpinLock, - IN PKLOCK_QUEUE_HANDLE LockHandle); - -NTHALAPI -VOID -FASTCALL -KeReleaseInStackQueuedSpinLock( - IN PKLOCK_QUEUE_HANDLE LockHandle); -#endif - -NTKERNELAPI -VOID -FASTCALL -KeAcquireInStackQueuedSpinLockAtDpcLevel( - IN PKSPIN_LOCK SpinLock, - IN PKLOCK_QUEUE_HANDLE LockHandle); - -NTKERNELAPI -KIRQL -NTAPI -KeAcquireInterruptSpinLock( - IN PKINTERRUPT Interrupt); - -NTKERNELAPI -BOOLEAN -NTAPI -KeAreApcsDisabled( - VOID); - -NTKERNELAPI -DECLSPEC_NORETURN -VOID -NTAPI -KeBugCheck( - IN ULONG BugCheckCode); - -NTKERNELAPI -DECLSPEC_NORETURN -VOID -NTAPI -KeBugCheckEx( - IN ULONG BugCheckCode, - IN ULONG_PTR BugCheckParameter1, - IN ULONG_PTR BugCheckParameter2, - IN ULONG_PTR BugCheckParameter3, - IN ULONG_PTR BugCheckParameter4); - -NTKERNELAPI -BOOLEAN -NTAPI -KeCancelTimer( - IN PKTIMER Timer); - -NTKERNELAPI -VOID -NTAPI -KeClearEvent( - IN PRKEVENT Event); - -NTKERNELAPI -NTSTATUS -NTAPI -KeDelayExecutionThread( - IN KPROCESSOR_MODE WaitMode, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Interval); - -NTKERNELAPI -BOOLEAN -NTAPI -KeDeregisterBugCheckCallback( - IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord); - -NTKERNELAPI -VOID -NTAPI -KeEnterCriticalRegion( - VOID); - -/* - * VOID - * KeFlushIoBuffers( - * IN PMDL Mdl, - * IN BOOLEAN ReadOperation, - * IN BOOLEAN DmaOperation) - */ -#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) - -#define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql)) -#define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql)) -#define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock) -#define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock) - -NTKERNELAPI -VOID -NTAPI -KeFlushQueuedDpcs( - VOID -); - -NTHALAPI -VOID -NTAPI -KeFlushWriteBuffer(VOID); - -NTKERNELAPI -ULONG -NTAPI -KeGetRecommendedSharedDataAlignment( - VOID); - -NTKERNELAPI -VOID -NTAPI -KeInitializeDeviceQueue( - IN PKDEVICE_QUEUE DeviceQueue); - -NTKERNELAPI -VOID -NTAPI -KeInitializeMutex( - IN PRKMUTEX Mutex, - IN ULONG Level); - -NTKERNELAPI -VOID -NTAPI -KeInitializeSemaphore( - IN PRKSEMAPHORE Semaphore, - IN LONG Count, - IN LONG Limit); - -NTKERNELAPI -VOID -NTAPI -KeInitializeTimer( - IN PKTIMER Timer); - -NTKERNELAPI -VOID -NTAPI -KeInitializeTimerEx( - IN PKTIMER Timer, - IN TIMER_TYPE Type); - -NTKERNELAPI -BOOLEAN -NTAPI -KeInsertByKeyDeviceQueue( - IN PKDEVICE_QUEUE DeviceQueue, - IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry, - IN ULONG SortKey); - -NTKERNELAPI -BOOLEAN -NTAPI -KeInsertDeviceQueue( - IN PKDEVICE_QUEUE DeviceQueue, - IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); - -NTKERNELAPI -BOOLEAN -NTAPI -KeInsertQueueDpc( - IN PRKDPC Dpc, - IN PVOID SystemArgument1, - IN PVOID SystemArgument2); - -NTKERNELAPI -VOID -NTAPI -KeLeaveCriticalRegion( - VOID); - -#ifdef _X86_ - -static __inline -VOID -KeMemoryBarrier( - VOID) -{ - volatile LONG Barrier; -#if defined(__GNUC__) - __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax"); -#elif defined(_MSC_VER) - __asm xchg [Barrier], eax -#endif -} - -#endif - -NTKERNELAPI -LONG -NTAPI -KePulseEvent( - IN PRKEVENT Event, - IN KPRIORITY Increment, - IN BOOLEAN Wait); - -NTKERNELAPI -KAFFINITY -NTAPI -KeQueryActiveProcessors( - VOID -); - -NTHALAPI -LARGE_INTEGER -NTAPI -KeQueryPerformanceCounter( - OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL); - -NTKERNELAPI -KPRIORITY -NTAPI -KeQueryPriorityThread( - IN PRKTHREAD Thread); - -NTKERNELAPI -ULONG -NTAPI -KeQueryRuntimeThread( - IN PKTHREAD Thread, - OUT PULONG UserTime); - -#if !defined(_M_AMD64) -NTKERNELAPI -ULONGLONG -NTAPI -KeQueryInterruptTime( - VOID); - -NTKERNELAPI -VOID -NTAPI -KeQuerySystemTime( - OUT PLARGE_INTEGER CurrentTime); - -NTKERNELAPI -VOID -NTAPI -KeQueryTickCount( - OUT PLARGE_INTEGER TickCount); -#endif - -NTKERNELAPI -ULONG -NTAPI -KeQueryTimeIncrement( - VOID); - -NTKERNELAPI -LONG -NTAPI -KeReadStateEvent( - IN PRKEVENT Event); - -NTKERNELAPI -LONG -NTAPI -KeReadStateMutex( - IN PRKMUTEX Mutex); - - -NTKERNELAPI -LONG -NTAPI -KeReadStateSemaphore( - IN PRKSEMAPHORE Semaphore); - -NTKERNELAPI -BOOLEAN -NTAPI -KeReadStateTimer( - IN PKTIMER Timer); - -NTKERNELAPI -BOOLEAN -NTAPI -KeRegisterBugCheckCallback( - IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord, - IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine, - IN PVOID Buffer, - IN ULONG Length, - IN PUCHAR Component); - -NTKERNELAPI -PVOID -NTAPI -KeRegisterNmiCallback( - IN PNMI_CALLBACK CallbackRoutine, - IN PVOID Context -); - -NTKERNELAPI -NTSTATUS -NTAPI -KeDeregisterNmiCallback( - IN PVOID Handle -); - -NTKERNELAPI -VOID -FASTCALL -KeReleaseInStackQueuedSpinLockFromDpcLevel( - IN PKLOCK_QUEUE_HANDLE LockHandle); - -NTKERNELAPI -VOID -NTAPI -KeReleaseInterruptSpinLock( - IN PKINTERRUPT Interrupt, - IN KIRQL OldIrql); - -NTKERNELAPI -LONG -NTAPI -KeReleaseMutex( - IN PRKMUTEX Mutex, - IN BOOLEAN Wait); - -NTKERNELAPI -LONG -NTAPI -KeReleaseSemaphore( - IN PRKSEMAPHORE Semaphore, - IN KPRIORITY Increment, - IN LONG Adjustment, - IN BOOLEAN Wait); - -NTKERNELAPI -PKDEVICE_QUEUE_ENTRY -NTAPI -KeRemoveByKeyDeviceQueue( - IN PKDEVICE_QUEUE DeviceQueue, - IN ULONG SortKey); - -NTKERNELAPI -PKDEVICE_QUEUE_ENTRY -NTAPI -KeRemoveDeviceQueue( - IN PKDEVICE_QUEUE DeviceQueue); - -NTKERNELAPI -BOOLEAN -NTAPI -KeRemoveEntryDeviceQueue( - IN PKDEVICE_QUEUE DeviceQueue, - IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); - -NTKERNELAPI -BOOLEAN -NTAPI -KeRemoveQueueDpc( - IN PRKDPC Dpc); - -NTKERNELAPI -LONG -NTAPI -KeResetEvent( - IN PRKEVENT Event); - -NTKERNELAPI -NTSTATUS -NTAPI -KeRestoreFloatingPointState( - IN PKFLOATING_SAVE FloatSave); - -NTKERNELAPI -VOID -NTAPI -KeRevertToUserAffinityThread(VOID); - -NTKERNELAPI -NTSTATUS -NTAPI -KeSaveFloatingPointState( - OUT PKFLOATING_SAVE FloatSave); - -NTKERNELAPI -LONG -NTAPI -KeSetBasePriorityThread( - IN PRKTHREAD Thread, - IN LONG Increment); - -NTKERNELAPI -LONG -NTAPI -KeSetEvent( - IN PRKEVENT Event, - IN KPRIORITY Increment, - IN BOOLEAN Wait); - -NTKERNELAPI -VOID -NTAPI -KeSetImportanceDpc( - IN PRKDPC Dpc, - IN KDPC_IMPORTANCE Importance); - -NTKERNELAPI -KPRIORITY -NTAPI -KeSetPriorityThread( - IN PKTHREAD Thread, - IN KPRIORITY Priority); - -NTKERNELAPI -VOID -NTAPI -KeSetSystemAffinityThread( - IN KAFFINITY Affinity); - -NTKERNELAPI -VOID -NTAPI -KeSetTargetProcessorDpc( - IN PRKDPC Dpc, - IN CCHAR Number); - -NTKERNELAPI -BOOLEAN -NTAPI -KeSetTimer( - IN PKTIMER Timer, - IN LARGE_INTEGER DueTime, - IN PKDPC Dpc OPTIONAL); - -NTKERNELAPI -BOOLEAN -NTAPI -KeSetTimerEx( - IN PKTIMER Timer, - IN LARGE_INTEGER DueTime, - IN LONG Period OPTIONAL, - IN PKDPC Dpc OPTIONAL); - -NTKERNELAPI -VOID -FASTCALL -KeSetTimeUpdateNotifyRoutine( - IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine); - -NTHALAPI -VOID -NTAPI -KeStallExecutionProcessor( - IN ULONG MicroSeconds); - -NTKERNELAPI -BOOLEAN -NTAPI -KeSynchronizeExecution( - IN PKINTERRUPT Interrupt, - IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, - IN PVOID SynchronizeContext); - -NTKERNELAPI -NTSTATUS -NTAPI -KeWaitForMultipleObjects( - IN ULONG Count, - IN PVOID Object[], - IN WAIT_TYPE WaitType, - IN KWAIT_REASON WaitReason, - IN KPROCESSOR_MODE WaitMode, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL, - IN PKWAIT_BLOCK WaitBlockArray OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -KeWaitForMutexObject( - IN PRKMUTEX Mutex, - IN KWAIT_REASON WaitReason, - IN KPROCESSOR_MODE WaitMode, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -KeWaitForSingleObject( - IN PVOID Object, - IN KWAIT_REASON WaitReason, - IN KPROCESSOR_MODE WaitMode, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL); - -typedef -ULONG_PTR -(NTAPI *PKIPI_BROADCAST_WORKER)( - IN ULONG_PTR Argument -); - -NTKERNELAPI -ULONG_PTR -NTAPI -KeIpiGenericCall( - IN PKIPI_BROADCAST_WORKER BroadcastFunction, - IN ULONG_PTR Context -); - -#if defined(_X86_) - -NTHALAPI -VOID -FASTCALL -KfLowerIrql( - IN KIRQL NewIrql); - -NTHALAPI -KIRQL -FASTCALL -KfRaiseIrql( - IN KIRQL NewIrql); - -NTHALAPI -KIRQL -DDKAPI -KeRaiseIrqlToDpcLevel( - VOID); - -NTHALAPI -KIRQL -DDKAPI -KeRaiseIrqlToSynchLevel( - VOID); - -#define KeLowerIrql(a) KfLowerIrql(a) -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -#elif defined(_M_AMD64) - -FORCEINLINE -KIRQL -KeGetCurrentIrql(VOID) -{ - return (KIRQL)__readcr8(); -} - -FORCEINLINE -VOID -KeLowerIrql(IN KIRQL NewIrql) -{ - ASSERT(KeGetCurrentIrql() >= NewIrql); - __writecr8(NewIrql); -} - -FORCEINLINE -KIRQL -KfRaiseIrql(IN KIRQL NewIrql) -{ - KIRQL OldIrql; - - OldIrql = __readcr8(); - ASSERT(OldIrql <= NewIrql); - __writecr8(NewIrql); - return OldIrql; -} -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -FORCEINLINE -KIRQL -KeRaiseIrqlToDpcLevel(VOID) -{ - return KfRaiseIrql(DISPATCH_LEVEL); -} - -FORCEINLINE -KIRQL -KeRaiseIrqlToSynchLevel(VOID) -{ - return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2 -} - -#elif defined(__PowerPC__) - -NTHALAPI -VOID -FASTCALL -KfLowerIrql( - IN KIRQL NewIrql); - -NTHALAPI -KIRQL -FASTCALL -KfRaiseIrql( - IN KIRQL NewIrql); - -NTHALAPI -KIRQL -DDKAPI -KeRaiseIrqlToDpcLevel( - VOID); - -NTHALAPI -KIRQL -DDKAPI -KeRaiseIrqlToSynchLevel( - VOID); - -#define KeLowerIrql(a) KfLowerIrql(a) -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -#elif defined(_M_MIPS) - -#define KeLowerIrql(a) KfLowerIrql(a) -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -NTKERNELAPI -VOID -NTAPI -KfLowerIrql( - IN KIRQL NewIrql); - -NTKERNELAPI -KIRQL -NTAPI -KfRaiseIrql( - IN KIRQL NewIrql); - -NTKERNELAPI -KIRQL -NTAPI -KeRaiseIrqlToDpcLevel( - VOID); - -NTKERNELAPI -KIRQL -DDKAPI -KeRaiseIrqlToSynchLevel( - VOID); - -#elif defined(_M_ARM) - -#include - -#else - -NTKERNELAPI -VOID -NTAPI -KeLowerIrql( - IN KIRQL NewIrql); - -NTKERNELAPI -VOID -NTAPI -KeRaiseIrql( - IN KIRQL NewIrql, - OUT PKIRQL OldIrql); - -NTKERNELAPI -KIRQL -NTAPI -KeRaiseIrqlToDpcLevel( - VOID); - -NTKERNELAPI -KIRQL -DDKAPI -KeRaiseIrqlToSynchLevel( - VOID); - -#endif - -/** Memory manager routines **/ - -NTKERNELAPI -NTSTATUS -NTAPI -MmAdvanceMdl( - IN PMDL Mdl, - IN ULONG NumberOfBytes); - -NTKERNELAPI -PVOID -NTAPI -MmAllocateContiguousMemory( - IN ULONG NumberOfBytes, - IN PHYSICAL_ADDRESS HighestAcceptableAddress); - -NTKERNELAPI -PVOID -NTAPI -MmAllocateContiguousMemorySpecifyCache( - IN SIZE_T NumberOfBytes, - IN PHYSICAL_ADDRESS LowestAcceptableAddress, - IN PHYSICAL_ADDRESS HighestAcceptableAddress, - IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, - IN MEMORY_CACHING_TYPE CacheType); - -NTKERNELAPI -PVOID -NTAPI -MmAllocateMappingAddress( - IN SIZE_T NumberOfBytes, - IN ULONG PoolTag); - -NTKERNELAPI -PVOID -NTAPI -MmAllocateNonCachedMemory( - IN ULONG NumberOfBytes); - -NTKERNELAPI -PMDL -NTAPI -MmAllocatePagesForMdl( - IN PHYSICAL_ADDRESS LowAddress, - IN PHYSICAL_ADDRESS HighAddress, - IN PHYSICAL_ADDRESS SkipBytes, - IN SIZE_T TotalBytes); - -#if (NTDDI_VERSION >= NTDDI_WS03SP1) -NTKERNELAPI -PMDL -NTAPI -MmAllocatePagesForMdlEx( - IN PHYSICAL_ADDRESS LowAddress, - IN PHYSICAL_ADDRESS HighAddress, - IN PHYSICAL_ADDRESS SkipBytes, - IN SIZE_T TotalBytes, - IN MEMORY_CACHING_TYPE CacheType, - IN ULONG Flags); -#endif - -NTKERNELAPI -VOID -NTAPI -MmBuildMdlForNonPagedPool( - IN OUT PMDL MemoryDescriptorList); - -typedef enum _MMFLUSH_TYPE { - MmFlushForDelete, - MmFlushForWrite -} MMFLUSH_TYPE; - -NTKERNELAPI -BOOLEAN -NTAPI -MmFlushImageSection( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN MMFLUSH_TYPE FlushType); - -NTKERNELAPI -VOID -NTAPI -MmFreeContiguousMemory( - IN PVOID BaseAddress); - -NTKERNELAPI -VOID -NTAPI -MmFreeContiguousMemorySpecifyCache( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheType); - -NTKERNELAPI -VOID -NTAPI -MmFreeMappingAddress( - IN PVOID BaseAddress, - IN ULONG PoolTag); - -NTKERNELAPI -VOID -NTAPI -MmFreeNonCachedMemory( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes); - -NTKERNELAPI -VOID -NTAPI -MmFreePagesFromMdl( - IN PMDL MemoryDescriptorList); - -/* - * ULONG - * MmGetMdlByteCount( - * IN PMDL Mdl) - */ -#define MmGetMdlByteCount(_Mdl) \ - ((_Mdl)->ByteCount) - -/* - * ULONG - * MmGetMdlByteOffset( - * IN PMDL Mdl) - */ -#define MmGetMdlByteOffset(_Mdl) \ - ((_Mdl)->ByteOffset) - -/* - * PPFN_NUMBER - * MmGetMdlPfnArray( - * IN PMDL Mdl) - */ -#define MmGetMdlPfnArray(_Mdl) \ - ((PPFN_NUMBER) ((_Mdl) + 1)) - -/* - * PVOID - * MmGetMdlVirtualAddress( - * IN PMDL Mdl) - */ -#define MmGetMdlVirtualAddress(_Mdl) \ - ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset)) - -NTKERNELAPI -PHYSICAL_ADDRESS -NTAPI -MmGetPhysicalAddress( - IN PVOID BaseAddress); - -NTKERNELAPI -PPHYSICAL_MEMORY_RANGE -NTAPI -MmGetPhysicalMemoryRanges( - VOID); - -NTKERNELAPI -PVOID -NTAPI -MmGetVirtualForPhysical( - IN PHYSICAL_ADDRESS PhysicalAddress); - -NTKERNELAPI -PVOID -NTAPI -MmMapLockedPagesSpecifyCache( - IN PMDL MemoryDescriptorList, - IN KPROCESSOR_MODE AccessMode, - IN MEMORY_CACHING_TYPE CacheType, - IN PVOID BaseAddress, - IN ULONG BugCheckOnFailure, - IN MM_PAGE_PRIORITY Priority); - -NTKERNELAPI -PVOID -NTAPI -MmMapLockedPagesWithReservedMapping( - IN PVOID MappingAddress, - IN ULONG PoolTag, - IN PMDL MemoryDescriptorList, - IN MEMORY_CACHING_TYPE CacheType); - -NTKERNELAPI -NTSTATUS -NTAPI -MmMapUserAddressesToPage( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes, - IN PVOID PageAddress); - -NTKERNELAPI -PVOID -NTAPI -MmMapVideoDisplay( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN SIZE_T NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheType); - -NTKERNELAPI -NTSTATUS -NTAPI -MmMapViewInSessionSpace( - IN PVOID Section, - OUT PVOID *MappedBase, - IN OUT PSIZE_T ViewSize); - -NTKERNELAPI -NTSTATUS -NTAPI -MmMapViewInSystemSpace( - IN PVOID Section, - OUT PVOID *MappedBase, - IN PSIZE_T ViewSize); - -NTKERNELAPI -NTSTATUS -NTAPI -MmMarkPhysicalMemoryAsBad( - IN PPHYSICAL_ADDRESS StartAddress, - IN OUT PLARGE_INTEGER NumberOfBytes); - -NTKERNELAPI -NTSTATUS -NTAPI -MmMarkPhysicalMemoryAsGood( - IN PPHYSICAL_ADDRESS StartAddress, - IN OUT PLARGE_INTEGER NumberOfBytes); - -NTKERNELAPI -PVOID -NTAPI -MmGetSystemRoutineAddress( - IN PUNICODE_STRING SystemRoutineName); - -/* - * ULONG - * ADDRESS_AND_SIZE_TO_SPAN_PAGES( - * IN PVOID Va, - * IN ULONG Size) - */ -#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, \ - _Size) \ - ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \ - + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT)) - -/* - * VOID - * MmInitializeMdl( - * IN PMDL MemoryDescriptorList, - * IN PVOID BaseVa, - * IN SIZE_T Length) - */ -#define MmInitializeMdl(_MemoryDescriptorList, \ - _BaseVa, \ - _Length) \ -{ \ - (_MemoryDescriptorList)->Next = (PMDL) NULL; \ - (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \ - (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \ - (_MemoryDescriptorList)->MdlFlags = 0; \ - (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \ - (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \ - (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \ -} - -NTKERNELAPI -BOOLEAN -NTAPI -MmIsAddressValid( - IN PVOID VirtualAddress); - -NTKERNELAPI -LOGICAL -NTAPI -MmIsDriverVerifying( - IN PDRIVER_OBJECT DriverObject); - -NTKERNELAPI -BOOLEAN -NTAPI -MmIsThisAnNtAsSystem( - VOID); - -NTKERNELAPI -NTSTATUS -NTAPI -MmIsVerifierEnabled( - OUT PULONG VerifierFlags); - -NTKERNELAPI -PVOID -NTAPI -MmLockPagableDataSection( - IN PVOID AddressWithinSection); - -NTKERNELAPI -PVOID -NTAPI -MmLockPagableImageSection( - IN PVOID AddressWithinSection); - -/* - * PVOID - * MmLockPagableCodeSection( - * IN PVOID AddressWithinSection) - */ -#define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address) - -NTKERNELAPI -VOID -NTAPI -MmLockPagableSectionByHandle( - IN PVOID ImageSectionHandle); - -NTKERNELAPI -PVOID -NTAPI -MmMapIoSpace( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheEnable); - -NTKERNELAPI -PVOID -NTAPI -MmMapLockedPages( - IN PMDL MemoryDescriptorList, - IN KPROCESSOR_MODE AccessMode); - -NTKERNELAPI -PVOID -NTAPI -MmLockPageableDataSection ( - IN PVOID AddressWithinSection -); - -NTKERNELAPI -VOID -NTAPI -MmUnlockPageableImageSection( - IN PVOID ImageSectionHandle -); - -NTKERNELAPI -PVOID -NTAPI -MmPageEntireDriver( - IN PVOID AddressWithinSection); - -NTKERNELAPI -VOID -NTAPI -MmProbeAndLockProcessPages( - IN OUT PMDL MemoryDescriptorList, - IN PEPROCESS Process, - IN KPROCESSOR_MODE AccessMode, - IN LOCK_OPERATION Operation); - -NTKERNELAPI -NTSTATUS -NTAPI -MmProtectMdlSystemAddress( - IN PMDL MemoryDescriptorList, - IN ULONG NewProtect); - -NTKERNELAPI -VOID -NTAPI -MmUnmapLockedPages( - IN PVOID BaseAddress, - IN PMDL MemoryDescriptorList); - -NTKERNELAPI -NTSTATUS -NTAPI -MmUnmapViewInSessionSpace( - IN PVOID MappedBase); - -NTKERNELAPI -NTSTATUS -NTAPI -MmUnmapViewInSystemSpace( - IN PVOID MappedBase); - -NTKERNELAPI -VOID -NTAPI -MmUnsecureVirtualMemory( - IN HANDLE SecureHandle); - -/* - * VOID - * MmPrepareMdlForReuse( - * IN PMDL Mdl) - */ -#define MmPrepareMdlForReuse(_Mdl) \ -{ \ - if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \ - ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \ - MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \ - } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \ - ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \ - } \ -} - -#define MmGetProcedureAddress(Address) (Address) - -NTKERNELAPI -VOID -NTAPI -MmProbeAndLockPages( - IN OUT PMDL MemoryDescriptorList, - IN KPROCESSOR_MODE AccessMode, - IN LOCK_OPERATION Operation); - -NTKERNELAPI -MM_SYSTEMSIZE -NTAPI -MmQuerySystemSize( - VOID); - -NTKERNELAPI -NTSTATUS -NTAPI -MmRemovePhysicalMemory( - IN PPHYSICAL_ADDRESS StartAddress, - IN OUT PLARGE_INTEGER NumberOfBytes); - -NTKERNELAPI -VOID -NTAPI -MmResetDriverPaging( - IN PVOID AddressWithinSection); - -NTKERNELAPI -HANDLE -NTAPI -MmSecureVirtualMemory( - IN PVOID Address, - IN SIZE_T Size, - IN ULONG ProbeMode); - -NTKERNELAPI -SIZE_T -NTAPI -MmSizeOfMdl( - IN PVOID Base, - IN SIZE_T Length); - -NTKERNELAPI -VOID -NTAPI -MmUnlockPagableImageSection( - IN PVOID ImageSectionHandle); - -NTKERNELAPI -VOID -NTAPI -MmUnlockPages( - IN PMDL MemoryDescriptorList); - -NTKERNELAPI -VOID -NTAPI -MmUnmapIoSpace( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes); - -NTKERNELAPI -VOID -NTAPI -MmUnmapReservedMapping( - IN PVOID BaseAddress, - IN ULONG PoolTag, - IN PMDL MemoryDescriptorList); - -NTKERNELAPI -VOID -NTAPI -MmUnmapVideoDisplay( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes); - - - -/** Object manager routines **/ - -NTKERNELAPI -NTSTATUS -NTAPI -ObAssignSecurity( - IN PACCESS_STATE AccessState, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PVOID Object, - IN POBJECT_TYPE Type); - -NTKERNELAPI -VOID -NTAPI -ObDereferenceSecurityDescriptor( - PSECURITY_DESCRIPTOR SecurityDescriptor, - ULONG Count); - -NTKERNELAPI -LONG_PTR -FASTCALL -ObfDereferenceObject( - IN PVOID Object); - -/* - * VOID - * ObDereferenceObject( - * IN PVOID Object) - */ -#define ObDereferenceObject ObfDereferenceObject - -NTKERNELAPI -NTSTATUS -NTAPI -ObGetObjectSecurity( - IN PVOID Object, - OUT PSECURITY_DESCRIPTOR *SecurityDescriptor, - OUT PBOOLEAN MemoryAllocated); - -NTKERNELAPI -NTSTATUS -NTAPI -ObInsertObject( - IN PVOID Object, - IN PACCESS_STATE PassedAccessState OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN ULONG AdditionalReferences, - OUT PVOID* ReferencedObject OPTIONAL, - OUT PHANDLE Handle); - -NTKERNELAPI -LONG_PTR -FASTCALL -ObfReferenceObject( - IN PVOID Object); - -NTKERNELAPI -NTSTATUS -NTAPI -ObLogSecurityDescriptor( - IN PSECURITY_DESCRIPTOR InputSecurityDescriptor, - OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor, - IN ULONG RefBias); -/* - * VOID - * ObReferenceObject( - * IN PVOID Object) - */ -#define ObReferenceObject ObfReferenceObject - -NTKERNELAPI -VOID -NTAPI -ObMakeTemporaryObject( - IN PVOID Object); - -NTKERNELAPI -NTSTATUS -NTAPI -ObOpenObjectByName( - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN POBJECT_TYPE ObjectType, - IN KPROCESSOR_MODE AccessMode, - IN PACCESS_STATE PassedAccessState, - IN ACCESS_MASK DesiredAccess, - IN OUT PVOID ParseContext OPTIONAL, - OUT PHANDLE Handle); - -NTKERNELAPI -NTSTATUS -NTAPI -ObOpenObjectByPointer( - IN PVOID Object, - IN ULONG HandleAttributes, - IN PACCESS_STATE PassedAccessState OPTIONAL, - IN ACCESS_MASK DesiredAccess OPTIONAL, - IN POBJECT_TYPE ObjectType OPTIONAL, - IN KPROCESSOR_MODE AccessMode, - OUT PHANDLE Handle); - -NTKERNELAPI -NTSTATUS -NTAPI -ObQueryObjectAuditingByHandle( - IN HANDLE Handle, - OUT PBOOLEAN GenerateOnClose); - -NTKERNELAPI -NTSTATUS -NTAPI -ObReferenceObjectByHandle( - IN HANDLE Handle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_TYPE ObjectType OPTIONAL, - IN KPROCESSOR_MODE AccessMode, - OUT PVOID *Object, - OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -ObReferenceObjectByName( - IN PUNICODE_STRING ObjectPath, - IN ULONG Attributes, - IN PACCESS_STATE PassedAccessState OPTIONAL, - IN ACCESS_MASK DesiredAccess OPTIONAL, - IN POBJECT_TYPE ObjectType, - IN KPROCESSOR_MODE AccessMode, - IN OUT PVOID ParseContext OPTIONAL, - OUT PVOID *Object); - -NTKERNELAPI -NTSTATUS -NTAPI -ObReferenceObjectByPointer( - IN PVOID Object, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_TYPE ObjectType, - IN KPROCESSOR_MODE AccessMode); - -NTKERNELAPI -VOID -NTAPI -ObReferenceSecurityDescriptor( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN ULONG Count); - -NTKERNELAPI -VOID -NTAPI -ObReleaseObjectSecurity( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN BOOLEAN MemoryAllocated); - - - -/** Process manager routines **/ - -NTKERNELAPI -NTSTATUS -NTAPI -PsCreateSystemProcess( - IN PHANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); - -NTKERNELAPI -NTSTATUS -NTAPI -PsCreateSystemThread( - OUT PHANDLE ThreadHandle, - IN ULONG DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN HANDLE ProcessHandle OPTIONAL, - OUT PCLIENT_ID ClientId OPTIONAL, - IN PKSTART_ROUTINE StartRoutine, - IN PVOID StartContext); - -/* - * PEPROCESS - * PsGetCurrentProcess(VOID) - */ -#define PsGetCurrentProcess IoGetCurrentProcess - -NTKERNELAPI -HANDLE -NTAPI -PsGetCurrentProcessId( - VOID); - -/* - * PETHREAD - * PsGetCurrentThread(VOID) - */ -#define PsGetCurrentThread() \ - ((PETHREAD) KeGetCurrentThread()) - -NTKERNELAPI -HANDLE -NTAPI -PsGetCurrentThreadId( - VOID); - -NTKERNELAPI -HANDLE -NTAPI -PsGetProcessId(PEPROCESS Process); - -NTKERNELAPI -BOOLEAN -NTAPI -PsGetVersion( - PULONG MajorVersion OPTIONAL, - PULONG MinorVersion OPTIONAL, - PULONG BuildNumber OPTIONAL, - PUNICODE_STRING CSDVersion OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -PsRemoveCreateThreadNotifyRoutine( - IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); - -NTKERNELAPI -NTSTATUS -NTAPI -PsRemoveLoadImageNotifyRoutine( - IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); - -NTKERNELAPI -NTSTATUS -NTAPI -PsSetCreateProcessNotifyRoutine( - IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, - IN BOOLEAN Remove); - -NTKERNELAPI -NTSTATUS -NTAPI -PsSetCreateThreadNotifyRoutine( - IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); - -NTKERNELAPI -NTSTATUS -NTAPI -PsSetLoadImageNotifyRoutine( - IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); - -NTKERNELAPI -NTSTATUS -NTAPI -PsTerminateSystemThread( - IN NTSTATUS ExitStatus); - -extern NTSYSAPI PEPROCESS PsInitialSystemProcess; - - -/** Security reference monitor routines **/ - -NTKERNELAPI -BOOLEAN -NTAPI -SeAccessCheck( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, - IN BOOLEAN SubjectContextLocked, - IN ACCESS_MASK DesiredAccess, - IN ACCESS_MASK PreviouslyGrantedAccess, - OUT PPRIVILEGE_SET *Privileges OPTIONAL, - IN PGENERIC_MAPPING GenericMapping, - IN KPROCESSOR_MODE AccessMode, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus); - -NTKERNELAPI -NTSTATUS -NTAPI -SeAssignSecurity( - IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL, - IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL, - OUT PSECURITY_DESCRIPTOR *NewDescriptor, - IN BOOLEAN IsDirectoryObject, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext, - IN PGENERIC_MAPPING GenericMapping, - IN POOL_TYPE PoolType); - -NTKERNELAPI -NTSTATUS -NTAPI -SeAssignSecurityEx( - IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL, - IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL, - OUT PSECURITY_DESCRIPTOR *NewDescriptor, - IN GUID *ObjectType OPTIONAL, - IN BOOLEAN IsDirectoryObject, - IN ULONG AutoInheritFlags, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext, - IN PGENERIC_MAPPING GenericMapping, - IN POOL_TYPE PoolType); - -NTKERNELAPI -NTSTATUS -NTAPI -SeDeassignSecurity( - IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor); - -NTKERNELAPI -BOOLEAN -NTAPI -SeSinglePrivilegeCheck( - LUID PrivilegeValue, - KPROCESSOR_MODE PreviousMode); - -NTKERNELAPI -BOOLEAN -NTAPI -SeValidSecurityDescriptor( - IN ULONG Length, - IN PSECURITY_DESCRIPTOR SecurityDescriptor); - - - -/** NtXxx routines **/ - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtOpenProcess( - OUT PHANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN PCLIENT_ID ClientId OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtQueryInformationProcess( - IN HANDLE ProcessHandle, - IN PROCESSINFOCLASS ProcessInformationClass, - OUT PVOID ProcessInformation, - IN ULONG ProcessInformationLength, - OUT PULONG ReturnLength OPTIONAL); - - - -/** NtXxx and ZwXxx routines **/ - -NTSYSAPI -NTSTATUS -NTAPI -ZwCancelTimer( - IN HANDLE TimerHandle, - OUT PBOOLEAN CurrentState OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtClose( - IN HANDLE Handle); - -NTSYSAPI -NTSTATUS -NTAPI -ZwClose( - IN HANDLE Handle); - -NTSYSAPI -NTSTATUS -NTAPI -ZwCreateDirectoryObject( - OUT PHANDLE DirectoryHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtCreateEvent( - OUT PHANDLE EventHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN EVENT_TYPE EventType, - IN BOOLEAN InitialState); - -NTSYSAPI -NTSTATUS -NTAPI -ZwCreateEvent( - OUT PHANDLE EventHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN EVENT_TYPE EventType, - IN BOOLEAN InitialState); - -NTSYSAPI -NTSTATUS -NTAPI -ZwCreateFile( - OUT PHANDLE FileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER AllocationSize OPTIONAL, - IN ULONG FileAttributes, - IN ULONG ShareAccess, - IN ULONG CreateDisposition, - IN ULONG CreateOptions, - IN PVOID EaBuffer OPTIONAL, - IN ULONG EaLength); - -NTSYSAPI -NTSTATUS -NTAPI -ZwCreateKey( - OUT PHANDLE KeyHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN ULONG TitleIndex, - IN PUNICODE_STRING Class OPTIONAL, - IN ULONG CreateOptions, - OUT PULONG Disposition OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -ZwCreateTimer( - OUT PHANDLE TimerHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN TIMER_TYPE TimerType); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDeleteKey( - IN HANDLE KeyHandle); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDeleteValueKey( - IN HANDLE KeyHandle, - IN PUNICODE_STRING ValueName); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtDeviceIoControlFile( - IN HANDLE DeviceHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL, - IN PVOID UserApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG IoControlCode, - IN PVOID InputBuffer, - IN ULONG InputBufferSize, - OUT PVOID OutputBuffer, - IN ULONG OutputBufferSize); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDeviceIoControlFile( - IN HANDLE DeviceHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL, - IN PVOID UserApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG IoControlCode, - IN PVOID InputBuffer, - IN ULONG InputBufferSize, - OUT PVOID OutputBuffer, - IN ULONG OutputBufferSize); - -NTSYSAPI -NTSTATUS -NTAPI -ZwEnumerateKey( - IN HANDLE KeyHandle, - IN ULONG Index, - IN KEY_INFORMATION_CLASS KeyInformationClass, - OUT PVOID KeyInformation, - IN ULONG Length, - OUT PULONG ResultLength); - -NTSYSAPI -NTSTATUS -NTAPI -ZwEnumerateValueKey( - IN HANDLE KeyHandle, - IN ULONG Index, - IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, - OUT PVOID KeyValueInformation, - IN ULONG Length, - OUT PULONG ResultLength); - -NTSYSAPI -NTSTATUS -NTAPI -ZwFlushKey( - IN HANDLE KeyHandle); - -NTSYSAPI -NTSTATUS -NTAPI -ZwMakeTemporaryObject( - IN HANDLE Handle); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtMapViewOfSection( - IN HANDLE SectionHandle, - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN ULONG_PTR ZeroBits, - IN SIZE_T CommitSize, - IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, - IN OUT PSIZE_T ViewSize, - IN SECTION_INHERIT InheritDisposition, - IN ULONG AllocationType, - IN ULONG Protect); - -NTSYSAPI -NTSTATUS -NTAPI -ZwMapViewOfSection( - IN HANDLE SectionHandle, - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN ULONG_PTR ZeroBits, - IN SIZE_T CommitSize, - IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, - IN OUT PSIZE_T ViewSize, - IN SECTION_INHERIT InheritDisposition, - IN ULONG AllocationType, - IN ULONG Protect); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtOpenFile( - OUT PHANDLE FileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG ShareAccess, - IN ULONG OpenOptions); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenFile( - OUT PHANDLE FileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG ShareAccess, - IN ULONG OpenOptions); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenKey( - OUT PHANDLE KeyHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenSection( - OUT PHANDLE SectionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenSymbolicLinkObject( - OUT PHANDLE LinkHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenTimer( - OUT PHANDLE TimerHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryKey( - IN HANDLE KeyHandle, - IN KEY_INFORMATION_CLASS KeyInformationClass, - OUT PVOID KeyInformation, - IN ULONG Length, - OUT PULONG ResultLength); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQuerySymbolicLinkObject( - IN HANDLE LinkHandle, - IN OUT PUNICODE_STRING LinkTarget, - OUT PULONG ReturnedLength OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryValueKey( - IN HANDLE KeyHandle, - IN PUNICODE_STRING ValueName, - IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, - OUT PVOID KeyValueInformation, - IN ULONG Length, - OUT PULONG ResultLength); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtReadFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length, - IN PLARGE_INTEGER ByteOffset OPTIONAL, - IN PULONG Key OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -ZwReadFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length, - IN PLARGE_INTEGER ByteOffset OPTIONAL, - IN PULONG Key OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtSetEvent( - IN HANDLE EventHandle, - OUT PLONG PreviousState OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetEvent( - IN HANDLE EventHandle, - OUT PLONG PreviousState OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass); - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetInformationThread( - IN HANDLE ThreadHandle, - IN THREADINFOCLASS ThreadInformationClass, - IN PVOID ThreadInformation, - IN ULONG ThreadInformationLength); - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetTimer( - IN HANDLE TimerHandle, - IN PLARGE_INTEGER DueTime, - IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL, - IN PVOID TimerContext OPTIONAL, - IN BOOLEAN WakeTimer, - IN LONG Period OPTIONAL, - OUT PBOOLEAN PreviousState OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetValueKey( - IN HANDLE KeyHandle, - IN PUNICODE_STRING ValueName, - IN ULONG TitleIndex OPTIONAL, - IN ULONG Type, - IN PVOID Data, - IN ULONG DataSize); - -/* [Nt|Zw]MapViewOfSection.InheritDisposition constants */ -#define AT_EXTENDABLE_FILE 0x00002000 -#define AT_RESERVED 0x20000000 -#define AT_ROUND_TO_PAGE 0x40000000 - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtUnmapViewOfSection( - IN HANDLE ProcessHandle, - IN PVOID BaseAddress); - -NTSYSAPI -NTSTATUS -NTAPI -ZwUnmapViewOfSection( - IN HANDLE ProcessHandle, - IN PVOID BaseAddress); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtWaitForSingleObject( - IN HANDLE ObjectHandle, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER TimeOut OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -ZwWaitForSingleObject( - IN HANDLE ObjectHandle, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER TimeOut OPTIONAL); - -NTSYSCALLAPI -NTSTATUS -NTAPI -NtWriteFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID Buffer, - IN ULONG Length, - IN PLARGE_INTEGER ByteOffset OPTIONAL, - IN PULONG Key OPTIONAL); - -NTSYSAPI -NTSTATUS -NTAPI -ZwWriteFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID Buffer, - IN ULONG Length, - IN PLARGE_INTEGER ByteOffset OPTIONAL, - IN PULONG Key OPTIONAL); - - - -/** Power management support routines **/ - -NTKERNELAPI -NTSTATUS -NTAPI -PoCallDriver( - IN PDEVICE_OBJECT DeviceObject, - IN OUT PIRP Irp); - -NTKERNELAPI -PULONG -NTAPI -PoRegisterDeviceForIdleDetection( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG ConservationIdleTime, - IN ULONG PerformanceIdleTime, - IN DEVICE_POWER_STATE State); - -NTKERNELAPI -PVOID -NTAPI -PoRegisterSystemState( - IN PVOID StateHandle, - IN EXECUTION_STATE Flags); - -NTKERNELAPI -NTSTATUS -NTAPI -PoRequestPowerIrp( - IN PDEVICE_OBJECT DeviceObject, - IN UCHAR MinorFunction, - IN POWER_STATE PowerState, - IN PREQUEST_POWER_COMPLETE CompletionFunction, - IN PVOID Context, - OUT PIRP *Irp OPTIONAL); - -NTKERNELAPI -NTSTATUS -NTAPI -PoRequestShutdownEvent( - OUT PVOID *Event); - -NTKERNELAPI -VOID -NTAPI -PoSetDeviceBusy( - PULONG IdlePointer); - -#define PoSetDeviceBusy(IdlePointer) \ - ((void)(*(IdlePointer) = 0)) - -NTKERNELAPI -POWER_STATE -NTAPI -PoSetPowerState( - IN PDEVICE_OBJECT DeviceObject, - IN POWER_STATE_TYPE Type, - IN POWER_STATE State); - -NTKERNELAPI -VOID -NTAPI -PoSetSystemState( - IN EXECUTION_STATE Flags); - -NTKERNELAPI -VOID -NTAPI -PoStartNextPowerIrp( - IN PIRP Irp); - -NTKERNELAPI -VOID -NTAPI -PoUnregisterSystemState( - IN PVOID StateHandle); - - - -/** WMI library support routines **/ - -NTSTATUS -NTAPI -WmiCompleteRequest( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN NTSTATUS Status, - IN ULONG BufferUsed, - IN CCHAR PriorityBoost); - -NTSTATUS -NTAPI -WmiFireEvent( - IN PDEVICE_OBJECT DeviceObject, - IN LPGUID Guid, - IN ULONG InstanceIndex, - IN ULONG EventDataSize, - IN PVOID EventData); - -NTKERNELAPI -NTSTATUS -NTAPI -WmiQueryTraceInformation( - IN TRACE_INFORMATION_CLASS TraceInformationClass, - OUT PVOID TraceInformation, - IN ULONG TraceInformationLength, - OUT PULONG RequiredLength OPTIONAL, - IN PVOID Buffer OPTIONAL); - -NTSTATUS -NTAPI -WmiSystemControl( - IN PWMILIB_CONTEXT WmiLibInfo, - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - OUT PSYSCTL_IRP_DISPOSITION IrpDisposition); - -NTKERNELAPI -NTSTATUS -DDKCDECLAPI -WmiTraceMessage( - IN TRACEHANDLE LoggerHandle, - IN ULONG MessageFlags, - IN LPGUID MessageGuid, - IN USHORT MessageNumber, - IN ...); - -#if 0 -/* FIXME: Get va_list from where? */ -NTKERNELAPI -NTSTATUS -DDKCDECLAPI -WmiTraceMessageVa( - IN TRACEHANDLE LoggerHandle, - IN ULONG MessageFlags, - IN LPGUID MessageGuid, - IN USHORT MessageNumber, - IN va_list MessageArgList); -#endif - - -/** Kernel debugger routines **/ - -NTKERNELAPI -NTSTATUS -NTAPI -KdDisableDebugger( - VOID); - -NTKERNELAPI -NTSTATUS -NTAPI -KdEnableDebugger( - VOID); - -NTKERNELAPI -BOOLEAN -NTAPI -KdRefreshDebuggerNotPresent( - VOID -); - -#if (NTDDI_VERSION >= NTDDI_WS03SP1) -NTKERNELAPI -NTSTATUS -NTAPI -KdChangeOption( - IN KD_OPTION Option, - IN ULONG InBufferBytes OPTIONAL, - IN PVOID InBuffer, - IN ULONG OutBufferBytes OPTIONAL, - OUT PVOID OutBuffer, - OUT PULONG OutBufferNeeded OPTIONAL); -#endif - -VOID -NTAPI -DbgBreakPoint( - VOID); - -NTSYSAPI -VOID -NTAPI -DbgBreakPointWithStatus( - IN ULONG Status); - -ULONG -DDKCDECLAPI -DbgPrint( - IN PCCH Format, - IN ...); - -NTSYSAPI -ULONG -DDKCDECLAPI -DbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCCH Format, - IN ...); - -ULONG -NTAPI -vDbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCCH Format, - IN va_list ap); - -ULONG -NTAPI -vDbgPrintExWithPrefix( - IN PCCH Prefix, - IN ULONG ComponentId, - IN ULONG Level, - IN PCCH Format, - IN va_list ap); - -NTKERNELAPI -ULONG -DDKCDECLAPI -DbgPrintReturnControlC( - IN PCCH Format, - IN ...); - -ULONG -NTAPI -DbgPrompt( - IN PCCH Prompt, - OUT PCH Response, - IN ULONG MaximumResponseLength -); - -NTKERNELAPI -NTSTATUS -NTAPI -DbgQueryDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level); - -NTKERNELAPI -NTSTATUS -NTAPI -DbgSetDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level, - IN BOOLEAN State); - -#if DBG - -#define KdPrint(_x_) DbgPrint _x_ -#define KdPrintEx(_x_) DbgPrintEx _x_ -#define KdBreakPoint() DbgBreakPoint() -#define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s) - -#else /* !DBG */ - -#define KdPrint(_x_) -#define KdPrintEx(_x_) -#define KdBreakPoint() -#define KdBreakPointWithStatus(s) - -#endif /* !DBG */ - -#if defined(__GNUC__) - -extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent; -extern NTKERNELAPI BOOLEAN KdDebuggerEnabled; -#define KD_DEBUGGER_ENABLED KdDebuggerEnabled -#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent - -#elif defined(_NTDDK_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_) - -extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent; -extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled; -#define KD_DEBUGGER_ENABLED *KdDebuggerEnabled -#define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent - -#else - -extern BOOLEAN KdDebuggerNotPresent; -extern BOOLEAN KdDebuggerEnabled; -#define KD_DEBUGGER_ENABLED KdDebuggerEnabled -#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent - -#endif - -/** Stuff from winnt4.h */ - -#ifndef DMA_MACROS_DEFINED - -#if (NTDDI_VERSION >= NTDDI_WIN2K) - -//DECLSPEC_DEPRECATED_DDK -NTHALAPI -BOOLEAN -NTAPI -IoFlushAdapterBuffers( - IN PADAPTER_OBJECT AdapterObject, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN ULONG Length, - IN BOOLEAN WriteToDevice); - -//DECLSPEC_DEPRECATED_DDK -NTHALAPI -VOID -NTAPI -IoFreeAdapterChannel( - IN PADAPTER_OBJECT AdapterObject); - -//DECLSPEC_DEPRECATED_DDK -NTHALAPI -VOID -NTAPI -IoFreeMapRegisters( - IN PADAPTER_OBJECT AdapterObject, - IN PVOID MapRegisterBase, - IN ULONG NumberOfMapRegisters); - -//DECLSPEC_DEPRECATED_DDK -NTHALAPI -PHYSICAL_ADDRESS -NTAPI -IoMapTransfer( - IN PADAPTER_OBJECT AdapterObject, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN OUT PULONG Length, - IN BOOLEAN WriteToDevice); - - -#endif // (NTDDI_VERSION >= NTDDI_WIN2K) -#endif // !defined(DMA_MACROS_DEFINED) - -NTKERNELAPI -NTSTATUS -NTAPI -IoAssignResources( - IN PUNICODE_STRING RegistryPath, - IN PUNICODE_STRING DriverClassName OPTIONAL, - IN PDRIVER_OBJECT DriverObject, - IN PDEVICE_OBJECT DeviceObject OPTIONAL, - IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources, - IN OUT PCM_RESOURCE_LIST *AllocatedResources); - -NTKERNELAPI -NTSTATUS -NTAPI -IoAttachDeviceByPointer( - IN PDEVICE_OBJECT SourceDevice, - IN PDEVICE_OBJECT TargetDevice); - -NTKERNELAPI -BOOLEAN -NTAPI -MmIsNonPagedSystemAddressValid( - IN PVOID VirtualAddress); - -#if defined(_AMD64_) || defined(_IA64_) -//DECLSPEC_DEPRECATED_DDK_WINXP -static __inline -LARGE_INTEGER -NTAPI_INLINE -RtlLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER Divisor, - IN OUT PLARGE_INTEGER Remainder) -{ - LARGE_INTEGER ret; - ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart; - if (Remainder) - Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart; - return ret; -} -#else -NTSYSAPI -LARGE_INTEGER -NTAPI -RtlLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER Divisor, - IN OUT PLARGE_INTEGER Remainder); -#endif - -NTKERNELAPI -INTERLOCKED_RESULT -NTAPI -ExInterlockedDecrementLong( - IN PLONG Addend, - IN PKSPIN_LOCK Lock); - -NTKERNELAPI -ULONG -NTAPI -ExInterlockedExchangeUlong( - IN PULONG Target, - IN ULONG Value, - IN PKSPIN_LOCK Lock); - -NTKERNELAPI -INTERLOCKED_RESULT -NTAPI -ExInterlockedIncrementLong( - IN PLONG Addend, - IN PKSPIN_LOCK Lock); - -NTHALAPI -VOID -NTAPI -HalAcquireDisplayOwnership( - IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters); - -NTHALAPI -NTSTATUS -NTAPI -HalAllocateAdapterChannel( - IN PADAPTER_OBJECT AdapterObject, - IN PWAIT_CONTEXT_BLOCK Wcb, - IN ULONG NumberOfMapRegisters, - IN PDRIVER_CONTROL ExecutionRoutine); - -NTHALAPI -PVOID -NTAPI -HalAllocateCommonBuffer( - IN PADAPTER_OBJECT AdapterObject, - IN ULONG Length, - OUT PPHYSICAL_ADDRESS LogicalAddress, - IN BOOLEAN CacheEnabled); - -NTHALAPI -NTSTATUS -NTAPI -HalAssignSlotResources( - IN PUNICODE_STRING RegistryPath, - IN PUNICODE_STRING DriverClassName, - IN PDRIVER_OBJECT DriverObject, - IN PDEVICE_OBJECT DeviceObject, - IN INTERFACE_TYPE BusType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN OUT PCM_RESOURCE_LIST *AllocatedResources); - -NTHALAPI -VOID -NTAPI -HalFreeCommonBuffer( - IN PADAPTER_OBJECT AdapterObject, - IN ULONG Length, - IN PHYSICAL_ADDRESS LogicalAddress, - IN PVOID VirtualAddress, - IN BOOLEAN CacheEnabled); - -NTHALAPI -PADAPTER_OBJECT -NTAPI -HalGetAdapter( - IN PDEVICE_DESCRIPTION DeviceDescription, - IN OUT PULONG NumberOfMapRegisters); - -NTHALAPI -ULONG -NTAPI -HalGetBusData( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Length); - -NTHALAPI -ULONG -NTAPI -HalGetBusDataByOffset( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -NTHALAPI -ULONG -NTAPI -HalGetDmaAlignmentRequirement( - VOID); - -NTHALAPI -ULONG -NTAPI -HalGetInterruptVector( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN ULONG BusInterruptLevel, - IN ULONG BusInterruptVector, - OUT PKIRQL Irql, - OUT PKAFFINITY Affinity); - -NTHALAPI -ULONG -NTAPI -HalReadDmaCounter( - IN PADAPTER_OBJECT AdapterObject); - -NTHALAPI -ULONG -NTAPI -HalSetBusData( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Length); - -NTHALAPI -ULONG -NTAPI -HalSetBusDataByOffset( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -NTHALAPI -BOOLEAN -NTAPI -HalTranslateBusAddress( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN PHYSICAL_ADDRESS BusAddress, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress); - -NTSYSAPI -BOOLEAN -NTAPI -RtlLargeIntegerEqualToZero( - IN LARGE_INTEGER Operand); - -NTSYSAPI -BOOLEAN -NTAPI -RtlLargeIntegerGreaterOrEqualToZero( - IN LARGE_INTEGER Operand); - -NTSYSAPI -BOOLEAN -NTAPI -RtlLargeIntegerGreaterThan( - IN LARGE_INTEGER Operand1, - IN LARGE_INTEGER Operand2); - -NTSYSAPI -BOOLEAN -NTAPI -RtlLargeIntegerGreaterThanOrEqualTo( - IN LARGE_INTEGER Operand1, - IN LARGE_INTEGER Operand2); - -NTSYSAPI -BOOLEAN -NTAPI -RtlLargeIntegerGreaterThanZero( - IN LARGE_INTEGER Operand); - -NTSYSAPI -BOOLEAN -NTAPI -RtlLargeIntegerLessOrEqualToZero( - IN LARGE_INTEGER Operand); - -NTSYSAPI -BOOLEAN -NTAPI -RtlLargeIntegerLessThan( - IN LARGE_INTEGER Operand1, - IN LARGE_INTEGER Operand2); - -NTSYSAPI -BOOLEAN -NTAPI -RtlLargeIntegerLessThanOrEqualTo( - IN LARGE_INTEGER Operand1, - IN LARGE_INTEGER Operand2); - -NTSYSAPI -BOOLEAN -NTAPI -RtlLargeIntegerLessThanZero( - IN LARGE_INTEGER Operand); - -NTSYSAPI -LARGE_INTEGER -NTAPI -RtlLargeIntegerNegate( - IN LARGE_INTEGER Subtrahend); - -NTSYSAPI -BOOLEAN -NTAPI -RtlLargeIntegerNotEqualTo( - IN LARGE_INTEGER Operand1, - IN LARGE_INTEGER Operand2); - -NTSYSAPI -BOOLEAN -NTAPI -RtlLargeIntegerNotEqualToZero( - IN LARGE_INTEGER Operand); - -NTSYSAPI -LARGE_INTEGER -NTAPI -RtlLargeIntegerShiftLeft( - IN LARGE_INTEGER LargeInteger, - IN CCHAR ShiftCount); - -NTSYSAPI -LARGE_INTEGER -NTAPI -RtlLargeIntegerShiftRight( - IN LARGE_INTEGER LargeInteger, - IN CCHAR ShiftCount); - -NTSYSAPI -LARGE_INTEGER -NTAPI -RtlLargeIntegerSubtract( - IN LARGE_INTEGER Minuend, - IN LARGE_INTEGER Subtrahend); - - -/* - * ULONG - * COMPUTE_PAGES_SPANNED( - * IN PVOID Va, - * IN ULONG Size) - */ -#define COMPUTE_PAGES_SPANNED(Va, \ - Size) \ - (ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va, Size)) - - -/* -** Architecture specific structures -*/ - -#ifdef _X86_ - -NTKERNELAPI -INTERLOCKED_RESULT -FASTCALL -Exfi386InterlockedIncrementLong( - IN PLONG Addend); - -NTKERNELAPI -INTERLOCKED_RESULT -FASTCALL -Exfi386InterlockedDecrementLong( - IN PLONG Addend); - -NTKERNELAPI -ULONG -FASTCALL -Exfi386InterlockedExchangeUlong( - IN PULONG Target, - IN ULONG Value); - -#define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend) -#define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend) -#define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value) - -#endif /* _X86_ */ - -#ifdef _M_ARM -// -// NT-ARM is not documented -// -#include -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* __WINDDK_H */ diff --git a/reactos/include/ddk/wmilib.h b/reactos/include/ddk/wmilib.h new file mode 100644 index 00000000000..22bb087a2a7 --- /dev/null +++ b/reactos/include/ddk/wmilib.h @@ -0,0 +1,126 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +typedef enum _WMIENABLEDISABLECONTROL { + WmiEventControl, + WmiDataBlockControl +} WMIENABLEDISABLECONTROL, *PWMIENABLEDISABLECONTROL; + +typedef enum _SYSCTL_IRP_DISPOSITION { + IrpProcessed, + IrpNotCompleted, + IrpNotWmi, + IrpForward +} SYSCTL_IRP_DISPOSITION, *PSYSCTL_IRP_DISPOSITION; + +typedef struct _WMIGUIDREGINFO { + LPCGUID Guid; + ULONG InstanceCount; + ULONG Flags; +} WMIGUIDREGINFO, *PWMIGUIDREGINFO; + +typedef NTSTATUS +(NTAPI *PWMI_QUERY_REGINFO) ( + IN OUT PDEVICE_OBJECT DeviceObject, + IN OUT PULONG RegFlags, + IN OUT PUNICODE_STRING InstanceName, + OUT PUNICODE_STRING *RegistryPath OPTIONAL, + IN OUT PUNICODE_STRING MofResourceName, + OUT PDEVICE_OBJECT *Pdo OPTIONAL); + +typedef NTSTATUS +(NTAPI *PWMI_QUERY_DATABLOCK) ( + IN OUT PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp, + IN ULONG GuidIndex, + IN ULONG InstanceIndex, + IN ULONG InstanceCount, + OUT PULONG InstanceLengthArray OPTIONAL, + IN ULONG BufferAvail, + OUT PUCHAR Buffer OPTIONAL); + +typedef NTSTATUS +(NTAPI *PWMI_SET_DATABLOCK) ( + IN OUT PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp, + IN ULONG GuidIndex, + IN ULONG InstanceIndex, + IN ULONG BufferSize, + IN PUCHAR Buffer); + +typedef NTSTATUS +(NTAPI *PWMI_SET_DATAITEM) ( + IN OUT PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp, + IN ULONG GuidIndex, + IN ULONG InstanceIndex, + IN ULONG DataItemId, + IN ULONG BufferSize, + IN PUCHAR Buffer); + +typedef NTSTATUS +(NTAPI *PWMI_EXECUTE_METHOD) ( + IN OUT PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp, + IN ULONG GuidIndex, + IN ULONG InstanceIndex, + IN ULONG MethodId, + IN ULONG InBufferSize, + IN ULONG OutBufferSize, + IN OUT PUCHAR Buffer); + +typedef NTSTATUS +(NTAPI *PWMI_FUNCTION_CONTROL) ( + IN OUT PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp, + IN ULONG GuidIndex, + IN WMIENABLEDISABLECONTROL Function, + IN BOOLEAN Enable); + +typedef struct _WMILIB_CONTEXT { + ULONG GuidCount; + PWMIGUIDREGINFO GuidList; + PWMI_QUERY_REGINFO QueryWmiRegInfo; + PWMI_QUERY_DATABLOCK QueryWmiDataBlock; + PWMI_SET_DATABLOCK SetWmiDataBlock; + PWMI_SET_DATAITEM SetWmiDataItem; + PWMI_EXECUTE_METHOD ExecuteWmiMethod; + PWMI_FUNCTION_CONTROL WmiFunctionControl; +} WMILIB_CONTEXT, *PWMILIB_CONTEXT; + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTSTATUS +NTAPI +WmiCompleteRequest( + IN PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp, + IN NTSTATUS Status, + IN ULONG BufferUsed, + IN CCHAR PriorityBoost); + +NTSTATUS +NTAPI +WmiSystemControl( + IN PWMILIB_CONTEXT WmiLibInfo, + IN PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp, + OUT PSYSCTL_IRP_DISPOSITION IrpDisposition); + +NTSTATUS +NTAPI +WmiFireEvent( + IN PDEVICE_OBJECT DeviceObject, + IN LPCGUID Guid, + IN ULONG InstanceIndex, + IN ULONG EventDataSize, + IN PVOID EventData); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#ifdef __cplusplus +} +#endif diff --git a/reactos/include/ddk/wmlib.h b/reactos/include/ddk/wmlib.h new file mode 100644 index 00000000000..98b857500c5 --- /dev/null +++ b/reactos/include/ddk/wmlib.h @@ -0,0 +1,129 @@ + +#ifndef _WMILIB_ +#define _WMILIB_ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _WMIGUIDREGINFO { + LPCGUID Guid; + ULONG InstanceCount; + ULONG Flags; +} WMIGUIDREGINFO, *PWMIGUIDREGINFO; + +typedef enum _WMIENABLEDISABLECONTROL { + WmiEventControl, + WmiDataBlockControl +} WMIENABLEDISABLECONTROL, *PWMIENABLEDISABLECONTROL; + +typedef enum _SYSCTL_IRP_DISPOSITION { + IrpProcessed, + IrpNotCompleted, + IrpNotWmi, + IrpForward +} SYSCTL_IRP_DISPOSITION, *PSYSCTL_IRP_DISPOSITION; + +typedef +NTSTATUS +(NTAPI WMI_QUERY_REGINFO_CALLBACK)( + IN OUT PDEVICE_OBJECT DeviceObject, + IN OUT PULONG RegFlags, + IN OUT PUNICODE_STRING InstanceName, + IN OUT PUNICODE_STRING *RegistryPath OPTIONAL, + IN OUT PUNICODE_STRING MofResourceName, + OUT PDEVICE_OBJECT *Pdo OPTIONAL); + +typedef WMI_QUERY_REGINFO_CALLBACK *PWMI_QUERY_REGINFO; + +typedef +NTSTATUS +(NTAPI WMI_QUERY_DATABLOCK_CALLBACK)( + IN OUT PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp, + IN OUT ULONG GuidIndex, + IN ULONG InstanceIndex, + IN ULONG InstanceCount, + OUT PULONG InstanceLengthArray OPTIONAL, + IN ULONG BufferAvail, + OUT PUCHAR Buffer OPTIONAL); + +typedef WMI_QUERY_DATABLOCK_CALLBACK *PWMI_QUERY_DATABLOCK; + +typedef +NTSTATUS +(NTAPI WMI_SET_DATABLOCK_CALLBACK)( + IN OUT PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp, + IN ULONG GuidIndex, + IN ULONG InstanceIndex, + IN ULONG BufferSize, + IN PUCHAR Buffer); + +typedef WMI_SET_DATABLOCK_CALLBACK *PWMI_SET_DATABLOCK; + +typedef +NTSTATUS +(NTAPI WMI_SET_DATAITEM_CALLBACK)( + IN OUT PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp, + IN ULONG GuidIndex, + IN ULONG InstanceIndex, + IN ULONG DataItemId, + IN ULONG BufferSize, + IN PUCHAR Buffer); + +typedef WMI_SET_DATAITEM_CALLBACK *PWMI_SET_DATAITEM; + +typedef +NTSTATUS +(NTAPI WMI_EXECUTE_METHOD_CALLBACK)( + IN OUT PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp, + IN ULONG GuidIndex, + IN ULONG InstanceIndex, + IN ULONG MethodId, + IN ULONG InBufferSize, + IN ULONG OutBufferSize, + IN OUT PUCHAR Buffer); + +typedef WMI_EXECUTE_METHOD_CALLBACK *PWMI_EXECUTE_METHOD; + +typedef +NTSTATUS +(NTAPI WMI_FUNCTION_CONTROL_CALLBACK)( + IN OUT PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp, + IN ULONG GuidIndex, + IN WMIENABLEDISABLECONTROL Function, + IN BOOLEAN Enable); + +typedef WMI_FUNCTION_CONTROL_CALLBACK *PWMI_FUNCTION_CONTROL; + +typedef struct _WMILIB_CONTEXT { + ULONG GuidCount; + PWMIGUIDREGINFO GuidList; + PWMI_QUERY_REGINFO QueryWmiRegInfo; + PWMI_QUERY_DATABLOCK QueryWmiDataBlock; + PWMI_SET_DATABLOCK SetWmiDataBlock; + PWMI_SET_DATAITEM SetWmiDataItem; + PWMI_EXECUTE_METHOD ExecuteWmiMethod; + PWMI_FUNCTION_CONTROL WmiFunctionControl; +} WMILIB_CONTEXT, *PWMILIB_CONTEXT; + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSTATUS +NTAPI +WmiSystemControl( + IN PWMILIB_CONTEXT WmiLibInfo, + IN PDEVICE_OBJECT DeviceObject, + IN OUT PIRP Irp, + OUT PSYSCTL_IRP_DISPOSITION IrpDisposition); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !_WMILIB_ */ + diff --git a/reactos/include/dxsdk/axcore.idl b/reactos/include/dxsdk/axcore.idl index 52e695935be..683003e1fb2 100644 --- a/reactos/include/dxsdk/axcore.idl +++ b/reactos/include/dxsdk/axcore.idl @@ -348,6 +348,22 @@ interface IReferenceClock : IUnknown typedef IReferenceClock *PREFERENCECLOCK; + +[ +local, +object, +uuid(ebec459c-2eca-4d42-a8af-30df557614b8), +pointer_default(unique) +] +interface IReferenceClockTimerControl : IUnknown { + + HRESULT SetDefaultTimerResolution( + REFERENCE_TIME timerResolution); + HRESULT GetDefaultTimerResolution( + [out] REFERENCE_TIME* pTimerResolution); +} + + /* [ object, diff --git a/reactos/include/dxsdk/axextend.idl b/reactos/include/dxsdk/axextend.idl index 27dd4db207f..72e37ce47c7 100644 --- a/reactos/include/dxsdk/axextend.idl +++ b/reactos/include/dxsdk/axextend.idl @@ -420,6 +420,10 @@ interface IOverlayNotify : IUnknown typedef IOverlayNotify *POVERLAYNOTIFY; +cpp_quote("#if 0") +typedef HANDLE HMONITOR; +cpp_quote("#endif /* 0 */") + [ object, local, @@ -548,6 +552,21 @@ interface IFileSinkFilter2 : IFileSinkFilter typedef IFileSinkFilter2 *PFILESINKFILTER2; +[ + object, + uuid(f90a6130-b658-11d2-ae49-0000f8754b99), + pointer_default(unique) +] +interface IAMDeviceRemoval : IUnknown +{ + HRESULT DeviceInfo( + [out] CLSID *pclsidInterfaceClass, + [out] LPWSTR *pwszSymbolicLink); + HRESULT Reassociate(); + HRESULT Disassociate(); +} + + typedef enum { AM_FILE_OVERWRITE = 0x00000001, @@ -775,6 +794,37 @@ interface IStreamBuilder : IUnknown ); } +[ + object, + uuid(56a868af-0ad4-11ce-b03a-0020af0ba770), + pointer_default(unique) +] +interface IDistributorNotify : IUnknown +{ + HRESULT Stop(void); + HRESULT Pause(void); + HRESULT Run(REFERENCE_TIME tStart); + HRESULT SetSyncSource([in] IReferenceClock * pClock); + HRESULT NotifyGraphChange(void); +} + +typedef enum +{ + AM_STREAM_INFO_START_DEFINED = 0x01, + AM_STREAM_INFO_STOP_DEFINED = 0x02, + AM_STREAM_INFO_DISCARDING = 0x04, + AM_STREAM_INFO_STOP_SEND_EXTRA = 0x10 +} AM_STREAM_INFO_FLAGS; + +typedef struct +{ + REFERENCE_TIME tStart; + REFERENCE_TIME tStop; + DWORD dwStartCookie; + DWORD dwStopCookie; + DWORD dwFlags; +}AM_STREAM_INFO; + /***************************************************************************** * IAMStreamConfig interface @@ -990,6 +1040,19 @@ interface ISeekingPassThru : IUnknown HRESULT Init( [in] BOOL bSupportRendering, [in] IPin *pPin); } +[ + local, + object, + uuid(4d5466b0-a49c-11d1-abe8-00a0c905f375), + pointer_default(unique) + +] +interface IAMClockAdjust : IUnknown +{ + HRESULT SetClockDelta([in] REFERENCE_TIME rtDelta); +}; + + enum _AM_FILTER_MISC_FLAGS { AM_FILTER_MISC_FLAGS_IS_RENDERER = 0x1, @@ -1006,3 +1069,49 @@ interface IAMFilterMiscFlags : IUnknown { ULONG GetMiscFlags(); }; + +[ + local, + object, + uuid(56ED71A0-AF5F-11D0-B3F0-00AA003761C5), + pointer_default(unique) +] +interface IAMBufferNegotiation : IUnknown +{ + HRESULT SuggestAllocatorProperties ( + [in] const ALLOCATOR_PROPERTIES *pprop); + + HRESULT GetAllocatorProperties ( + [out] ALLOCATOR_PROPERTIES *pprop); + +} + +#include + +[ + object, + uuid(36b73881-c2c8-11cf-8b46-00805f6cef60), + pointer_default(unique) +] +interface IAMStreamControl : IUnknown +{ + HRESULT StartAt( [in] REFERENCE_TIME * ptStart, + [in] DWORD dwCookie ); + HRESULT StopAt( [in] REFERENCE_TIME * ptStop, + [in] BOOL bSendExtra, + [in] DWORD dwCookie ); + HRESULT GetInfo( [out] AM_STREAM_INFO *pInfo); +} + +typedef enum tagTVAudioMode +{ + AMTVAUDIO_MODE_MONO = 0x0001, + AMTVAUDIO_MODE_STEREO = 0x0002, + AMTVAUDIO_MODE_LANG_A = 0x0010, + AMTVAUDIO_MODE_LANG_B = 0x0020, + AMTVAUDIO_MODE_LANG_C = 0x0040, + AMTVAUDIO_PRESET_STEREO = 0x0200, + AMTVAUDIO_PRESET_LANG_A = 0x1000, + AMTVAUDIO_PRESET_LANG_B = 0x2000, + AMTVAUDIO_PRESET_LANG_C = 0x4000, +}TVAudioMode; diff --git a/reactos/include/dxsdk/axextendenums.h b/reactos/include/dxsdk/axextendenums.h new file mode 100644 index 00000000000..feb8b410a1a --- /dev/null +++ b/reactos/include/dxsdk/axextendenums.h @@ -0,0 +1,38 @@ +#ifndef AXEXTEND_ENUM_H +#define AXEXTEND_ENUM_H + +typedef enum tagAnalogVideoStandard +{ + AnalogVideo_None = 0x00000000, + AnalogVideo_NTSC_M = 0x00000001, + AnalogVideo_NTSC_M_J = 0x00000002, + AnalogVideo_NTSC_433 = 0x00000004, + AnalogVideo_PAL_B = 0x00000010, + AnalogVideo_PAL_D = 0x00000020, + AnalogVideo_PAL_G = 0x00000040, + AnalogVideo_PAL_H = 0x00000080, + AnalogVideo_PAL_I = 0x00000100, + AnalogVideo_PAL_M = 0x00000200, + AnalogVideo_PAL_N = 0x00000400, + AnalogVideo_PAL_60 = 0x00000800, + AnalogVideo_SECAM_B = 0x00001000, + AnalogVideo_SECAM_D = 0x00002000, + AnalogVideo_SECAM_G = 0x00004000, + AnalogVideo_SECAM_H = 0x00008000, + AnalogVideo_SECAM_K = 0x00010000, + AnalogVideo_SECAM_K1 = 0x00020000, + AnalogVideo_SECAM_L = 0x00040000, + AnalogVideo_SECAM_L1 = 0x00080000, + AnalogVideo_PAL_N_COMBO = 0x00100000, + AnalogVideoMask_MCE_NTSC = AnalogVideo_NTSC_M | AnalogVideo_NTSC_M_J | AnalogVideo_NTSC_433 | AnalogVideo_PAL_M | AnalogVideo_PAL_N | AnalogVideo_PAL_60 | AnalogVideo_PAL_N_COMBO, + AnalogVideoMask_MCE_PAL = AnalogVideo_PAL_B | AnalogVideo_PAL_D | AnalogVideo_PAL_G | AnalogVideo_PAL_H | AnalogVideo_PAL_I, + AnalogVideoMask_MCE_SECAM = AnalogVideo_SECAM_B | AnalogVideo_SECAM_D | AnalogVideo_SECAM_G |AnalogVideo_SECAM_H |AnalogVideo_SECAM_K | AnalogVideo_SECAM_K1 |AnalogVideo_SECAM_L | AnalogVideo_SECAM_L1, +}AnalogVideoStandard; + +typedef enum tagTunerInputType +{ + TunerInputCable, + TunerInputAntenna +} TunerInputType; + +#endif diff --git a/reactos/include/dxsdk/bdamedia.h b/reactos/include/dxsdk/bdamedia.h index 2eab21c70ba..3cf12d5617b 100644 --- a/reactos/include/dxsdk/bdamedia.h +++ b/reactos/include/dxsdk/bdamedia.h @@ -201,4 +201,189 @@ typedef enum { NULL, 0, NULL, NULL, 0) +/* ------------------------------------------------------------ + BDA Change Sync Method Set {FD0A5AF3-B41D-11d2-9C95-00C04F7971E0} +*/ + +#define STATIC_KSMETHODSETID_BdaChangeSync \ + 0xfd0a5af3, 0xb41d, 0x11d2, {0x9c, 0x95, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0} +DEFINE_GUIDSTRUCT("FD0A5AF3-B41D-11d2-9C95-00C04F7971E0", KSMETHODSETID_BdaChangeSync); +#define KSMETHODSETID_BdaChangeSync DEFINE_GUIDNAMED(KSMETHODSETID_BdaChangeSync) + +typedef enum { + KSMETHOD_BDA_START_CHANGES = 0, + KSMETHOD_BDA_CHECK_CHANGES, + KSMETHOD_BDA_COMMIT_CHANGES, + KSMETHOD_BDA_GET_CHANGE_STATE +} KSMETHOD_BDA_CHANGE_SYNC; + +#define DEFINE_KSMETHOD_ITEM_BDA_START_CHANGES(MethodHandler, SupportHandler)\ + DEFINE_KSMETHOD_ITEM(\ + KSMETHOD_BDA_START_CHANGES,\ + KSMETHOD_TYPE_NONE,\ + (MethodHandler),\ + sizeof(KSMETHOD),\ + 0,\ + SupportHandler) + +#define DEFINE_KSMETHOD_ITEM_BDA_CHECK_CHANGES(MethodHandler, SupportHandler)\ + DEFINE_KSMETHOD_ITEM(\ + KSMETHOD_BDA_CHECK_CHANGES,\ + KSMETHOD_TYPE_NONE,\ + (MethodHandler),\ + sizeof(KSMETHOD),\ + 0,\ + SupportHandler) + +#define DEFINE_KSMETHOD_ITEM_BDA_COMMIT_CHANGES(MethodHandler, SupportHandler)\ + DEFINE_KSMETHOD_ITEM(\ + KSMETHOD_BDA_COMMIT_CHANGES,\ + KSMETHOD_TYPE_NONE,\ + (MethodHandler),\ + sizeof(KSMETHOD),\ + 0,\ + SupportHandler) + +#define DEFINE_KSMETHOD_ITEM_BDA_GET_CHANGE_STATE(MethodHandler, SupportHandler)\ + DEFINE_KSMETHOD_ITEM(\ + KSMETHOD_BDA_GET_CHANGE_STATE,\ + KSMETHOD_TYPE_READ,\ + (MethodHandler),\ + sizeof(KSMETHOD),\ + 0,\ + SupportHandler) + +#define STATIC_KSPROPSETID_BdaFrequencyFilter \ + 0x71985f47, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 +DEFINE_GUIDSTRUCT("71985F47-1CA1-11d3-9CC8-00C04F7971E0", KSPROPSETID_BdaFrequencyFilter); +#define KSPROPSETID_BdaFrequencyFilter DEFINE_GUIDNAMED(KSPROPSETID_BdaFrequencyFilter) + +typedef enum { + KSPROPERTY_BDA_RF_TUNER_FREQUENCY = 0, + KSPROPERTY_BDA_RF_TUNER_POLARITY, + KSPROPERTY_BDA_RF_TUNER_RANGE, + KSPROPERTY_BDA_RF_TUNER_TRANSPONDER, + KSPROPERTY_BDA_RF_TUNER_BANDWIDTH, + KSPROPERTY_BDA_RF_TUNER_FREQUENCY_MULTIPLIER, + KSPROPERTY_BDA_RF_TUNER_CAPS, + KSPROPERTY_BDA_RF_TUNER_SCAN_STATUS, + KSPROPERTY_BDA_RF_TUNER_STANDARD, + KSPROPERTY_BDA_RF_TUNER_STANDARD_MODE +}KSPROPERTY_BDA_FREQUENCY_FILTER; + + +#define STATIC_KSPROPSETID_BdaDigitalDemodulator \ + 0xef30f379, 0x985b, 0x4d10, 0xb6, 0x40, 0xa7, 0x9d, 0x5e, 0x4, 0xe1, 0xe0 +DEFINE_GUIDSTRUCT("EF30F379-985B-4d10-B640-A79D5E04E1E0", KSPROPSETID_BdaDigitalDemodulator); +#define KSPROPSETID_BdaDigitalDemodulator DEFINE_GUIDNAMED(KSPROPSETID_BdaDigitalDemodulator) + +typedef enum { + KSPROPERTY_BDA_MODULATION_TYPE = 0, + KSPROPERTY_BDA_INNER_FEC_TYPE, + KSPROPERTY_BDA_INNER_FEC_RATE, + KSPROPERTY_BDA_OUTER_FEC_TYPE, + KSPROPERTY_BDA_OUTER_FEC_RATE, + KSPROPERTY_BDA_SYMBOL_RATE, + KSPROPERTY_BDA_SPECTRAL_INVERSION, + KSPROPERTY_BDA_GUARD_INTERVAL, + KSPROPERTY_BDA_TRANSMISSION_MODE, + KSPROPERTY_BDA_ROLL_OFF, + KSPROPERTY_BDA_PILOT, + KSPROPERTY_BDA_SIGNALTIMEOUTS +}KSPROPERTY_BDA_DIGITAL_DEMODULATOR; + +#define STATIC_KSPROPSETID_BdaLNBInfo \ + 0x992cf102, 0x49f9, 0x4719, 0xa6, 0x64, 0xc4, 0xf2, 0x3e, 0x24, 0x8, 0xf4 +DEFINE_GUIDSTRUCT("992CF102-49F9-4719-A664-C4F23E2408F4", KSPROPSETID_BdaLNBInfo); +#define KSPROPSETID_BdaLNBInfo DEFINE_GUIDNAMED(KSPROPSETID_BdaLNBInfo) + +typedef enum { + KSPROPERTY_BDA_LNB_LOF_LOW_BAND = 0, + KSPROPERTY_BDA_LNB_LOF_HIGH_BAND, + KSPROPERTY_BDA_LNB_SWITCH_FREQUENCY +}KSPROPERTY_BDA_LNB_INFO; + +#define STATIC_KSPROPSETID_BdaSignalStats \ + 0x1347d106, 0xcf3a, 0x428a, 0xa5, 0xcb, 0xac, 0xd, 0x9a, 0x2a, 0x43, 0x38 +DEFINE_GUIDSTRUCT("1347D106-CF3A-428a-A5CB-AC0D9A2A4338", KSPROPSETID_BdaSignalStats); +#define KSPROPSETID_BdaSignalStats DEFINE_GUIDNAMED(KSPROPSETID_BdaSignalStats) + +typedef enum { + KSPROPERTY_BDA_SIGNAL_STRENGTH = 0, + KSPROPERTY_BDA_SIGNAL_QUALITY, + KSPROPERTY_BDA_SIGNAL_PRESENT, + KSPROPERTY_BDA_SIGNAL_LOCKED, + KSPROPERTY_BDA_SAMPLE_TIME +}KSPROPERTY_BDA_SIGNAL_STATS; + + +/* ------------------------------------------------------------ + BDA Stream Format GUIDs +*/ + +#define STATIC_KSDATAFORMAT_TYPE_BDA_ANTENNA\ + 0x71985f41, 0x1ca1, 0x11d3, 0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0 +DEFINE_GUIDSTRUCT("71985F41-1CA1-11d3-9CC8-00C04F7971E0", KSDATAFORMAT_TYPE_BDA_ANTENNA); +#define KSDATAFORMAT_TYPE_BDA_ANTENNA DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_BDA_ANTENNA) + + +#define STATIC_KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT\ + 0xf4aeb342, 0x0329, 0x4fdd, 0xa8, 0xfd, 0x4a, 0xff, 0x49, 0x26, 0xc9, 0x78 +DEFINE_GUIDSTRUCT("F4AEB342-0329-4fdd-A8FD-4AFF4926C978", KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT); +#define KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT) + + +#define STATIC_KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT\ + 0x8deda6fd, 0xac5f, 0x4334, 0x8e, 0xcf, 0xa4, 0xba, 0x8f, 0xa7, 0xd0, 0xf0 +DEFINE_GUIDSTRUCT("8DEDA6FD-AC5F-4334-8ECF-A4BA8FA7D0F0", KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT); +#define KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_BDA_TRANSPORT) + + +#define STATIC_KSDATAFORMAT_TYPE_BDA_IF_SIGNAL\ + 0x61be0b47, 0xa5eb, 0x499b, 0x9a, 0x85, 0x5b, 0x16, 0xc0, 0x7f, 0x12, 0x58 +DEFINE_GUIDSTRUCT("61BE0B47-A5EB-499b-9A85-5B16C07F1258", KSDATAFORMAT_TYPE_BDA_IF_SIGNAL); +#define KSDATAFORMAT_TYPE_BDA_IF_SIGNAL DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_BDA_IF_SIGNAL) + + +#define STATIC_KSDATAFORMAT_TYPE_MPEG2_SECTIONS\ + 0x455f176c, 0x4b06, 0x47ce, 0x9a, 0xef, 0x8c, 0xae, 0xf7, 0x3d, 0xf7, 0xb5 +DEFINE_GUIDSTRUCT("455F176C-4B06-47CE-9AEF-8CAEF73DF7B5", KSDATAFORMAT_TYPE_MPEG2_SECTIONS); +#define KSDATAFORMAT_TYPE_MPEG2_SECTIONS DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_MPEG2_SECTIONS) + + +#define STATIC_KSDATAFORMAT_SUBTYPE_ATSC_SI\ + 0xb3c7397c, 0xd303, 0x414d, 0xb3, 0x3c, 0x4e, 0xd2, 0xc9, 0xd2, 0x97, 0x33 +DEFINE_GUIDSTRUCT("B3C7397C-D303-414D-B33C-4ED2C9D29733", KSDATAFORMAT_SUBTYPE_ATSC_SI); +#define KSDATAFORMAT_SUBTYPE_ATSC_SI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ATSC_SI) + + +#define STATIC_KSDATAFORMAT_SUBTYPE_DVB_SI\ + 0xe9dd31a3, 0x221d, 0x4adb, 0x85, 0x32, 0x9a, 0xf3, 0x9, 0xc1, 0xa4, 0x8 +DEFINE_GUIDSTRUCT("e9dd31a3-221d-4adb-8532-9af309c1a408", KSDATAFORMAT_SUBTYPE_DVB_SI); +#define KSDATAFORMAT_SUBTYPE_DVB_SI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DVB_SI) + + +#define STATIC_KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP\ + 0x762e3f66, 0x336f, 0x48d1, 0xbf, 0x83, 0x2b, 0x0, 0x35, 0x2c, 0x11, 0xf0 +DEFINE_GUIDSTRUCT("762E3F66-336F-48d1-BF83-2B00352C11F0", KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP); +#define KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_PSIP) + + +#define STATIC_KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP\ + 0x951727db, 0xd2ce, 0x4528, 0x96, 0xf6, 0x33, 0x1, 0xfa, 0xbb, 0x2d, 0xe0 +DEFINE_GUIDSTRUCT("951727DB-D2CE-4528-96F6-3301FABB2DE0", KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP); +#define KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_BDA_OPENCABLE_OOB_PSIP) + + +#define STATIC_KSDATAFORMAT_SUBTYPE_ISDB_SI\ + 0x4a2eeb99, 0x6458, 0x4538, 0xb1, 0x87, 0x04, 0x01, 0x7c, 0x41, 0x41, 0x3f +DEFINE_GUIDSTRUCT("4a2eeb99-6458-4538-b187-04017c41413f", KSDATAFORMAT_SUBTYPE_ISDB_SI); +#define KSDATAFORMAT_SUBTYPE_ISDB_SI DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ISDB_SI) + + +#define STATIC_KSDATAFORMAT_SUBTYPE_PBDA_TRANSPORT_RAW\ + 0x0d7aed42, 0xcb9a, 0x11db, 0x97, 0x05, 0x00, 0x50, 0x56, 0xc0, 0x00, 0x08 +DEFINE_GUIDSTRUCT("0d7AED42-CB9A-11DB-9705-005056C00008", KSDATAFORMAT_SUBTYPE_PBDA_TRANSPORT_RAW); +#define KSDATAFORMAT_SUBTYPE_PBDA_TRANSPORT_RAW DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_PBDA_TRANSPORT_RAW) + #endif diff --git a/reactos/include/dxsdk/bdatypes.h b/reactos/include/dxsdk/bdatypes.h index 6220d8527d9..5dc72cd6d43 100644 --- a/reactos/include/dxsdk/bdatypes.h +++ b/reactos/include/dxsdk/bdatypes.h @@ -162,19 +162,6 @@ typedef struct MEDIA_SAMPLE_CONTENT MediaSampleContent ; } PID_MAP ; - -typedef struct _KSM_PIN -{ - KSMETHOD Method; - union - { - ULONG PinId; - ULONG PinType; - }; - ULONG Reserved; -} KSM_PIN, * PKSM_PIN; - - typedef struct _BDA_PID_MAP { MEDIA_SAMPLE_CONTENT MediaSampleContent; diff --git a/reactos/include/dxsdk/d3dx9shader.h b/reactos/include/dxsdk/d3dx9shader.h index a15cab600d6..766d4ca1089 100644 --- a/reactos/include/dxsdk/d3dx9shader.h +++ b/reactos/include/dxsdk/d3dx9shader.h @@ -44,6 +44,15 @@ typedef LPCSTR D3DXHANDLE; +typedef enum _D3DXREGISTER_SET +{ + D3DXRS_BOOL, + D3DXRS_INT4, + D3DXRS_FLOAT4, + D3DXRS_SAMPLER, + D3DXRS_FORCE_DWORD = 0x7fffffff +} D3DXREGISTER_SET, *LPD3DXREGISTER_SET; + typedef enum D3DXPARAMETER_CLASS { D3DXPC_SCALAR, @@ -80,6 +89,131 @@ typedef enum D3DXPARAMETER_TYPE D3DXPT_FORCE_DWORD = 0x7fffffff, } D3DXPARAMETER_TYPE, *LPD3DXPARAMETER_TYPE; +typedef struct _D3DXCONSTANTTABLE_DESC +{ + LPCSTR Creator; + DWORD Version; + UINT Constants; +} D3DXCONSTANTTABLE_DESC, *LPD3DXCONSTANTTABLE_DESC; + +typedef struct _D3DXCONSTANT_DESC +{ + LPCSTR Name; + D3DXREGISTER_SET RegisterSet; + UINT RegisterIndex; + UINT RegisterCount; + D3DXPARAMETER_CLASS Class; + D3DXPARAMETER_TYPE Type; + UINT Rows; + UINT Columns; + UINT Elements; + UINT StructMembers; + UINT Bytes; + LPCVOID DefaultValue; +} D3DXCONSTANT_DESC, *LPD3DXCONSTANT_DESC; + +DEFINE_GUID(IID_ID3DXConstantTable, 0x9dca3190, 0x38b9, 0x4fc3, 0x92, 0xe3, 0x39, 0xc6, 0xdd, 0xfb, 0x35, 0x8b); + +#undef INTERFACE +#define INTERFACE ID3DXConstantTable + +DECLARE_INTERFACE_(ID3DXConstantTable, ID3DXBuffer) +{ + /*** IUnknown methods ***/ + STDMETHOD(QueryInterface)(THIS_ REFIID iid, LPVOID *ppv) PURE; + STDMETHOD_(ULONG, AddRef)(THIS) PURE; + STDMETHOD_(ULONG, Release)(THIS) PURE; + /*** ID3DXBuffer methods ***/ + STDMETHOD_(LPVOID, GetBufferPointer)(THIS) PURE; + STDMETHOD_(DWORD, GetBufferSize)(THIS) PURE; + /*** ID3DXConstantTable methods ***/ + STDMETHOD(GetDesc)(THIS_ D3DXCONSTANTTABLE_DESC *pDesc) PURE; + STDMETHOD(GetConstantDesc)(THIS_ D3DXHANDLE hConstant, D3DXCONSTANT_DESC *pConstantDesc, UINT *pCount) PURE; + STDMETHOD_(D3DXHANDLE, GetConstant)(THIS_ D3DXHANDLE hConstant, UINT Index) PURE; + STDMETHOD_(D3DXHANDLE, GetConstantByName)(THIS_ D3DXHANDLE hConstant, LPCSTR pName) PURE; + STDMETHOD_(D3DXHANDLE, GetConstantElement)(THIS_ D3DXHANDLE hConstant, UINT Index) PURE; + STDMETHOD(SetDefaults)(THIS_ LPDIRECT3DDEVICE9 pDevice) PURE; + STDMETHOD(SetValue)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, LPCVOID pData, UINT Bytes) PURE; + STDMETHOD(SetBool)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, BOOL b) PURE; + STDMETHOD(SetBoolArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST BOOL* pb, UINT Count) PURE; + STDMETHOD(SetInt)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, INT n) PURE; + STDMETHOD(SetIntArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST INT* pn, UINT Count) PURE; + STDMETHOD(SetFloat)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, FLOAT f) PURE; + STDMETHOD(SetFloatArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST FLOAT* pf, UINT Count) PURE; + STDMETHOD(SetVector)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXVECTOR4* pVector) PURE; + STDMETHOD(SetVectorArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXVECTOR4* pVector, UINT Count) PURE; + STDMETHOD(SetMatrix)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix) PURE; + STDMETHOD(SetMatrixArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix, UINT Count) PURE; + STDMETHOD(SetMatrixPointerArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX** ppMatrix, UINT Count) PURE; + STDMETHOD(SetMatrixTranspose)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix) PURE; + STDMETHOD(SetMatrixTransposeArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX* pMatrix, UINT Count) PURE; + STDMETHOD(SetMatrixTransposePointerArray)(THIS_ LPDIRECT3DDEVICE9 pDevice, D3DXHANDLE hConstant, CONST D3DXMATRIX** ppMatrix, UINT Count) PURE; +}; + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define ID3DXConstantTable_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define ID3DXConstantTable_AddRef(p) (p)->lpVtbl->AddRef(p) +#define ID3DXConstantTable_Release(p) (p)->lpVtbl->Release(p) +/*** ID3DXBuffer methods ***/ +#define ID3DXConstantTable_GetBufferPointer(p) (p)->lpVtbl->GetBufferPointer(p) +#define ID3DXConstantTable_GetBufferSize(p) (p)->lpVtbl->GetBufferSize(p) +/*** ID3DXConstantTable methods ***/ +#define ID3DXConstantTable_GetDesc(p,a) (p)->lpVtbl->GetDesc(p,a) +#define ID3DXConstantTable_GetConstantDesc(p,a,b,c) (p)->lpVtbl->GetConstantDesc(p,a,b,c) +#define ID3DXConstantTable_GetConstant(p,a,b) (p)->lpVtbl->GetConstant(p,a,b) +#define ID3DXConstantTable_GetConstantByName(p,a,b) (p)->lpVtbl->GetConstantByName(p,a,b) +#define ID3DXConstantTable_GetConstantElement(p,a,b) (p)->lpVtbl->GetConstantElement(p,a,b) +#define ID3DXConstantTable_SetDefaults(p,a) (p)->lpVtbl->SetDefaults(p,a) +#define ID3DXConstantTable_SetValue(p,a,b,c,d) (p)->lpVtbl->SetValue(p,a,b,c,d) +#define ID3DXConstantTable_SetBool(p,a,b,c) (p)->lpVtbl->SetBool(p,a,b,c) +#define ID3DXConstantTable_SetBoolArray(p,a,b,c,d) (p)->lpVtbl->SetBoolArray(p,a,b,c,d) +#define ID3DXConstantTable_SetInt(p,a,b,c) (p)->lpVtbl->SetInt(p,a,b,c) +#define ID3DXConstantTable_SetIntArray(p,a,b,c,d) (p)->lpVtbl->SetIntArray(p,a,b,c,d) +#define ID3DXConstantTable_SetFloat(p,a,b,c) (p)->lpVtbl->SetFloat(p,a,b,c) +#define ID3DXConstantTable_SetFloatArray(p,a,b,c,d) (p)->lpVtbl->SetFloatArray(p,a,b,c,d) +#define ID3DXConstantTable_SetVector(p,a,b,c) (p)->lpVtbl->SetVector(p,a,b,c) +#define ID3DXConstantTable_SetVectorArray(p,a,b,c,d) (p)->lpVtbl->SetVectorArray(p,a,b,c,d) +#define ID3DXConstantTable_SetMatrix(p,a,b,c) (p)->lpVtbl->SetMatrix(p,a,b,c) +#define ID3DXConstantTable_SetMatrixArray(p,a,b,c,d) (p)->lpVtbl->SetMatrixArray(p,a,b,c,d) +#define ID3DXConstantTable_SetMatrixPointerArray(p,a,b,c,d) (p)->lpVtbl->SetMatrixPointerArray(p,a,b,c,d) +#define ID3DXConstantTable_SetMatrixTranspose(p,a,b,c) (p)->lpVtbl->SetMatrixTranspose(p,a,b,c) +#define ID3DXConstantTable_SetMatrixTransposeArray(p,a,b,c,d) (p)->lpVtbl->SetMatrixTransposeArray(p,a,b,c,d) +#define ID3DXConstantTable_SetMatrixTransposePointerArray(p,a,b,c,d) (p)->lpVtbl->SetMatrixTransposePointerArray(p,a,b,c,d) +#else +/*** IUnknown methods ***/ +#define ID3DXConstantTable_QueryInterface(p,a,b) (p)->QueryInterface(a,b) +#define ID3DXConstantTable_AddRef(p) (p)->AddRef() +#define ID3DXConstantTable_Release(p) (p)->Release() +/*** ID3DXBuffer methods ***/ +#define ID3DXConstantTable_GetBufferPointer(p) (p)->GetBufferPointer() +#define ID3DXConstantTable_GetBufferSize(p) (p)->GetBufferSize() +/*** ID3DXConstantTable methods ***/ +#define ID3DXConstantTable_GetDesc(p,a) (p)->GetDesc(a) +#define ID3DXConstantTable_GetConstantDesc(p,a,b,c) (p)->GetConstantDesc(a,b,c) +#define ID3DXConstantTable_GetConstant(p,a,b) (p)->GetConstant(a,b) +#define ID3DXConstantTable_GetConstantByName(p,a,b) (p)->GetConstantByName(a,b) +#define ID3DXConstantTable_GetConstantElement(p,a,b) (p)->GetConstantElement(a,b) +#define ID3DXConstantTable_SetDefaults(p,a) (p)->SetDefaults(a) +#define ID3DXConstantTable_SetValue(p,a,b,c,d) (p)->SetValue(a,b,c,d) +#define ID3DXConstantTable_SetBool(p,a,b,c) (p)->SetBool(a,b,c) +#define ID3DXConstantTable_SetBoolArray(p,a,b,c,d) (p)->SetBoolArray(a,b,c,d) +#define ID3DXConstantTable_SetInt(p,a,b,c) (p)->SetInt(a,b,c) +#define ID3DXConstantTable_SetIntArray(p,a,b,c,d) (p)->SetIntArray(a,b,c,d) +#define ID3DXConstantTable_SetFloat(p,a,b,c) (p)->SetFloat(a,b,c) +#define ID3DXConstantTable_SetFloatArray(p,a,b,c,d) (p)->SetFloatArray(a,b,c,d) +#define ID3DXConstantTable_SetVector(p,a,b,c) (p)->SetVector(a,b,c) +#define ID3DXConstantTable_SetVectorArray(p,a,b,c,d) (p)->SetVectorArray(a,b,c,d) +#define ID3DXConstantTable_SetMatrix(p,a,b,c) (p)->SetMatrix(a,b,c) +#define ID3DXConstantTable_SetMatrixArray(p,a,b,c,d) (p)->SetMatrixArray(a,b,c,d) +#define ID3DXConstantTable_SetMatrixPointerArray(p,a,b,c,d) (p)->SetMatrixPointerArray(a,b,c,d) +#define ID3DXConstantTable_SetMatrixTranspose(p,a,b,c) (p)->>SetMatrixTranspose(a,b,c) +#define ID3DXConstantTable_SetMatrixTransposeArray(p,a,b,c,d) (p)->SetMatrixTransposeArray(a,b,c,d) +#define ID3DXConstantTable_SetMatrixTransposePointerArray(p,a,b,c,d) (p)->SetMatrixTransposePointerArray(a,b,c,d) +#endif + +typedef struct ID3DXConstantTable *LPD3DXCONSTANTTABLE; + typedef struct _D3DXMACRO { LPCSTR Name; LPCSTR Definition; @@ -114,6 +248,7 @@ LPCSTR WINAPI D3DXGetPixelShaderProfile(LPDIRECT3DDEVICE9 device); UINT WINAPI D3DXGetShaderSize(const DWORD *byte_code); DWORD WINAPI D3DXGetShaderVersion(const DWORD *byte_code); LPCSTR WINAPI D3DXGetVertexShaderProfile(LPDIRECT3DDEVICE9 device); +HRESULT WINAPI D3DXFindShaderComment(CONST DWORD* byte_code, DWORD fourcc, LPCVOID* data, UINT* size); HRESULT WINAPI D3DXAssembleShaderFromFileA(LPCSTR filename, CONST D3DXMACRO* defines, @@ -153,6 +288,13 @@ HRESULT WINAPI D3DXAssembleShader(LPCSTR data, LPD3DXBUFFER* shader, LPD3DXBUFFER* error_messages); +HRESULT WINAPI D3DXGetShaderConstantTableEx(CONST DWORD* byte_code, + DWORD flags, + LPD3DXCONSTANTTABLE* constant_table); + +HRESULT WINAPI D3DXGetShaderConstantTable(CONST DWORD* byte_code, + LPD3DXCONSTANTTABLE* constant_table); + #ifdef __cplusplus } #endif diff --git a/reactos/include/dxsdk/dmo.h b/reactos/include/dxsdk/dmo.h index 73bc011a3a6..adc24b0f39b 100644 --- a/reactos/include/dxsdk/dmo.h +++ b/reactos/include/dxsdk/dmo.h @@ -1,20 +1,34 @@ +/* + * Copyright (C) 2002 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ #ifndef __DMO_H__ #define __DMO_H__ -#include "mediaerr.h" +#include #ifdef FIX_LOCK_NAME - #define Lock DMOLock +#define Lock DMOLock #endif - -#include "mediaobj.h" - +#include #ifdef FIX_LOCK_NAME - #undef Lock +#undef Lock #endif +#include +#include -#include "dmoreg.h" -#include "dmort.h" - -#endif /* __DMO_H__ */ +#endif /* __DMO_H__ */ diff --git a/reactos/include/dxsdk/dmoreg.h b/reactos/include/dxsdk/dmoreg.h index 7fc7af24495..66966f9c31a 100644 --- a/reactos/include/dxsdk/dmoreg.h +++ b/reactos/include/dxsdk/dmoreg.h @@ -1,75 +1,70 @@ +/* + * Copyright (C) 2002 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + #ifndef __DMOREG_H__ #define __DMOREG_H__ #include "mediaobj.h" -DEFINE_GUID(DMOCATEGORY_ACOUSTIC_ECHO_CANCEL, 0xBF963D80, 0xC559, 0x11D0, 0x8A, 0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1); -DEFINE_GUID(DMOCATEGORY_AGC, 0xE88C9BA0, 0xC557, 0x11D0, 0x8A, 0x2B,0x00,0xA0,0xC9,0x25,0x5A,0xC1); -DEFINE_GUID(DMOCATEGORY_AUDIO_CAPTURE_EFFECT, 0xF665AAba, 0x3E09, 0x4920, 0xAA, 0x5F,0x21,0x98,0x11,0x14,0x8F,0x09); -DEFINE_GUID(DMOCATEGORY_AUDIO_DECODER, 0x57F2db8b, 0xE6BB, 0x4513, 0x9D, 0x43,0xDC,0xD2,0xA6,0x59,0x31,0x25); -DEFINE_GUID(DMOCATEGORY_AUDIO_EFFECT, 0xF3602b3f, 0x0592, 0x48DF, 0xA4, 0xCD,0x67,0x47,0x21,0xE7,0xEB,0xEB); -DEFINE_GUID(DMOCATEGORY_AUDIO_ENCODER, 0x33D9A761, 0x90C8, 0x11D0, 0xBD, 0x43,0x00,0xA0,0xC9,0x11,0xCE,0x86); -DEFINE_GUID(DMOCATEGORY_AUDIO_NOISE_SUPPRESS, 0xE07f903f, 0x62FD, 0x4e60, 0x8C, 0xDD,0xDE,0xA7,0x23,0x66,0x65,0xB5); -DEFINE_GUID(DMOCATEGORY_VIDEO_DECODER, 0x4A69b442, 0x28BE, 0x4991, 0x96, 0x9C,0xB5,0x00,0xAD,0xF5,0xd8,0xA8); -DEFINE_GUID(DMOCATEGORY_VIDEO_EFFECT, 0xd990eE14, 0x776C, 0x4723, 0xBE, 0x46,0x3D,0xA2,0xF5,0x6F,0x10,0xB9); -DEFINE_GUID(DMOCATEGORY_VIDEO_ENCODER, 0x33D9A760, 0x90C8, 0x11D0, 0xBD, 0x43,0x00,0xA0,0xC9,0x11,0xCE,0x86); - typedef struct _DMO_PARTIAL_MEDIATYPE { - GUID type; - GUID subtype; + GUID type; + GUID subtype; } DMO_PARTIAL_MEDIATYPE, *PDMO_PARTIAL_MEDIATYPE; enum DMO_REGISTER_FLAGS { - DMO_REGISTERF_IS_KEYED = 0x00000001 + DMO_REGISTERF_IS_KEYED = 1 }; enum DMO_ENUM_FLAGS { - DMO_ENUMF_INCLUDE_KEYED = 0x00000001 + DMO_ENUMF_INCLUDE_KEYED = 1 }; -STDAPI -DMOEnum( - REFGUID guidCategory, - DWORD dwFlags, - DWORD cInTypes, - const DMO_PARTIAL_MEDIATYPE *pInTypes, - DWORD cOutTypes, - const DMO_PARTIAL_MEDIATYPE *pOutTypes, - IEnumDMO **ppEnum); +HRESULT WINAPI DMORegister(LPCWSTR,REFCLSID,REFGUID,DWORD,DWORD,const DMO_PARTIAL_MEDIATYPE*, + DWORD,const DMO_PARTIAL_MEDIATYPE*); +HRESULT WINAPI DMOUnregister(REFCLSID,REFGUID); +HRESULT WINAPI DMOEnum(REFGUID,DWORD,DWORD,const DMO_PARTIAL_MEDIATYPE*,DWORD, + const DMO_PARTIAL_MEDIATYPE*,IEnumDMO**); +HRESULT WINAPI DMOGetTypes(REFCLSID,ULONG,ULONG*,DMO_PARTIAL_MEDIATYPE*, + ULONG,ULONG*,DMO_PARTIAL_MEDIATYPE*); +HRESULT WINAPI DMOGetName(REFCLSID,WCHAR[80]); -STDAPI -DMOGetName( - REFCLSID clsidDMO, - WCHAR szName[80]); - -STDAPI DMOGetTypes( - REFCLSID clsidDMO, - unsigned long ulInputTypesRequested, - unsigned long *pulInputTypesSupplied, - DMO_PARTIAL_MEDIATYPE *pInputTypes, - unsigned long ulOutputTypesRequested, - unsigned long *pulOutputTypesSupplied, - DMO_PARTIAL_MEDIATYPE *pOutputTypes -); - -STDAPI -DMORegister( - LPCWSTR szName, - REFCLSID clsidDMO, - REFGUID guidCategory, - DWORD dwFlags, - DWORD cInTypes, - const DMO_PARTIAL_MEDIATYPE *pInTypes, - DWORD cOutTypes, - const DMO_PARTIAL_MEDIATYPE *pOutTypes); - -STDAPI -DMOUnregister( - REFCLSID clsidDMO, - REFGUID guidCategory); - -#endif +DEFINE_GUID(DMOCATEGORY_AUDIO_DECODER, + 0x57f2db8b,0xe6bb,0x4513,0x9d,0x43,0xdc,0xd2,0xa6,0x59,0x31,0x25); +DEFINE_GUID(DMOCATEGORY_AUDIO_ENCODER, + 0x33d9a761,0x90c8,0x11d0,0xbd,0x43,0x00,0xa0,0xc9,0x11,0xce,0x86); +DEFINE_GUID(DMOCATEGORY_VIDEO_DECODER, + 0x4a69b442,0x28be,0x4991,0x96,0x9c,0xb5,0x00,0xad,0xf5,0xd8,0xa8); +DEFINE_GUID(DMOCATEGORY_VIDEO_ENCODER, + 0x33d9a760,0x90c8,0x11d0,0xbd,0x43,0x00,0xa0,0xc9,0x11,0xce,0x86); +DEFINE_GUID(DMOCATEGORY_AUDIO_EFFECT, + 0xf3602b3f,0x0592,0x48df,0xa4,0xcd,0x67,0x47,0x21,0xe7,0xeb,0xeb); +DEFINE_GUID(DMOCATEGORY_VIDEO_EFFECT, + 0xd990ee14,0x776c,0x4723,0xbe,0x46,0x3d,0xa2,0xf5,0x6f,0x10,0xb9); +DEFINE_GUID(DMOCATEGORY_AUDIO_CAPTURE_EFFECT, + 0xf665aaba,0x3e09,0x4920,0xaa,0x5f,0x21,0x98,0x11,0x14,0x8f,0x09); +DEFINE_GUID(DMOCATEGORY_ACOUSTIC_ECHO_CANCEL, + 0xbf963d80,0xc559,0x11d0,0x8a,0x2b,0x00,0xa0,0xc9,0x25,0x5a,0xc1); +DEFINE_GUID(DMOCATEGORY_AUDIO_NOISE_SUPPRESS, + 0xe07f903f,0x62fd,0x4e60,0x8c,0xdd,0xde,0xa7,0x23,0x66,0x65,0xb5); +DEFINE_GUID(DMOCATEGORY_AGC, + 0xe88c9ba0,0xc557,0x11d0,0x8a,0x2b,0x00,0xa0,0xc9,0x25,0x5a,0xc1); +#endif /* __DMOREG_H__ */ diff --git a/reactos/include/dxsdk/dmort.h b/reactos/include/dxsdk/dmort.h index 6efe7053450..01b081d4701 100644 --- a/reactos/include/dxsdk/dmort.h +++ b/reactos/include/dxsdk/dmort.h @@ -1,13 +1,29 @@ +/* + * Copyright (C) 2002 Alexandre Julliard + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ #ifndef __DMORT_H__ #define __DMORT_H__ -STDAPI MoCopyMediaType(DMO_MEDIA_TYPE *pmtDest, const DMO_MEDIA_TYPE *pmtSrc); -STDAPI MoCreateMediaType(DMO_MEDIA_TYPE **ppmt, DWORD cbFormat); -STDAPI MoDeleteMediaType(DMO_MEDIA_TYPE *pmt); -STDAPI MoDuplicateMediaType(DMO_MEDIA_TYPE **ppmtDest, const DMO_MEDIA_TYPE *pmtSrc); -STDAPI MoFreeMediaType(DMO_MEDIA_TYPE *pmt); -STDAPI MoInitMediaType(DMO_MEDIA_TYPE *pmt, DWORD cbFormat); - -#endif +HRESULT WINAPI MoCopyMediaType(DMO_MEDIA_TYPE*,const DMO_MEDIA_TYPE*); +HRESULT WINAPI MoCreateMediaType(DMO_MEDIA_TYPE**,DWORD); +HRESULT WINAPI MoDeleteMediaType(DMO_MEDIA_TYPE*); +HRESULT WINAPI MoDuplicateMediaType(DMO_MEDIA_TYPE**,const DMO_MEDIA_TYPE*); +HRESULT WINAPI MoFreeMediaType(DMO_MEDIA_TYPE*); +HRESULT WINAPI MoInitMediaType(DMO_MEDIA_TYPE*,DWORD); +#endif /* __DMORT_H__ */ diff --git a/reactos/include/dxsdk/qedit.idl b/reactos/include/dxsdk/qedit.idl index 48764c11a72..ea1e593ad65 100644 --- a/reactos/include/dxsdk/qedit.idl +++ b/reactos/include/dxsdk/qedit.idl @@ -37,7 +37,7 @@ interface ISampleGrabberCB : IUnknown HRESULT BufferCB( double SampleTime, BYTE * pBuffer, - long BufferLen + LONG BufferLen ); } @@ -66,8 +66,8 @@ interface ISampleGrabber: IUnknown ); HRESULT GetCurrentBuffer( - [in,out] long * pBufferSize, - [out] long * pBuffer + [in,out] LONG * pBufferSize, + [out] LONG * pBuffer ); HRESULT GetCurrentSample( @@ -76,7 +76,7 @@ interface ISampleGrabber: IUnknown HRESULT SetCallback( ISampleGrabberCB * pCallback, - long WhichMethodToCallback + LONG WhichMethodToCallback ); }; @@ -96,15 +96,15 @@ interface IMediaDet : IUnknown ); HRESULT get_OutputStreams( - [out] long *pVal + [out] LONG *pVal ); HRESULT get_CurrentStream( - [out] long *pVal + [out] LONG *pVal ); HRESULT put_CurrentStream( - long newVal + LONG newVal ); HRESULT get_StreamType( @@ -129,16 +129,16 @@ interface IMediaDet : IUnknown HRESULT GetBitmapBits( double StreamTime, - long * pBufferSize, + LONG * pBufferSize, char * pBuffer, - long Width, - long Height + LONG Width, + LONG Height ); HRESULT WriteBitmapBits( double StreamTime, - long Width, - long Height, + LONG Width, + LONG Height, BSTR Filename ); diff --git a/reactos/include/dxsdk/uuids.h b/reactos/include/dxsdk/uuids.h index 54a30fc2de2..376cca748fc 100644 --- a/reactos/include/dxsdk/uuids.h +++ b/reactos/include/dxsdk/uuids.h @@ -135,6 +135,7 @@ OUR_GUID_ENTRY(CLSID_WAVEParser, 0xd51bd5a1, 0x7548, 0x11cf, OUR_GUID_ENTRY(CLSID_QTDec, 0xfdfe9681, 0x74a3, 0x11d0, 0xaf, 0xa7, 0x00, 0xaa, 0x00, 0xb6, 0x7a, 0x42) OUR_GUID_ENTRY(CLSID_AVIDoc, 0xd3588ab0, 0x0781, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) OUR_GUID_ENTRY(CLSID_AVIDocWriter, 0xd3588ab1, 0x0781, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70) +OUR_GUID_ENTRY(CLSID_SampleGrabber, 0xc1f400a0, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37) OUR_GUID_ENTRY(CLSID_NullRenderer, 0xc1f400a4, 0x3f08, 0x11d3, 0x9f, 0x0b, 0x00, 0x60, 0x08, 0x03, 0x9e, 0x37) OUR_GUID_ENTRY(CLSID_VideoRenderer, 0x70e102b0, 0x5556, 0x11ce, 0x97, 0xc0, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a) OUR_GUID_ENTRY(CLSID_VideoRendererDefault, 0x6bc1cffa, 0x8fc1, 0x4261, 0xac, 0x22, 0xcf, 0xb4, 0xcc, 0x38, 0xdb, 0x50) diff --git a/reactos/include/dxsdk/vmrender.idl b/reactos/include/dxsdk/vmrender.idl index f29f7dd5bd0..cb44aabb610 100644 --- a/reactos/include/dxsdk/vmrender.idl +++ b/reactos/include/dxsdk/vmrender.idl @@ -168,8 +168,7 @@ typedef struct _NORMALIZEDRECT typedef struct tagVMRGUID { - GUID* pGUID; - GUID GUID; + struct _GUID *pGUID, GUID; } VMRGUID; typedef struct tagVMRMONITORINFO diff --git a/reactos/include/ndk/arm/ketypes.h b/reactos/include/ndk/arm/ketypes.h index aa024b1f28f..bbf85af50cb 100644 --- a/reactos/include/ndk/arm/ketypes.h +++ b/reactos/include/ndk/arm/ketypes.h @@ -316,9 +316,13 @@ typedef struct _KPRCB UCHAR Reserved; USHORT BuildType; KAFFINITY SetMember; + UCHAR CpuType; + UCHAR CpuID; + USHORT CpuStep; KPROCESSOR_STATE ProcessorState; ULONG KernelReserved[16]; ULONG HalReserved[16]; + UCHAR PrcbPad0[92]; KSPIN_LOCK_QUEUE LockQueue[LockQueueMaximumLock]; struct _KTHREAD *NpxThread; ULONG InterruptCount; @@ -334,7 +338,6 @@ typedef struct _KPRCB UCHAR NodeColor; UCHAR Spare1; ULONG NodeShiftedColor; - ULONG PcrPage; struct _KNODE *ParentNode; ULONG MultiThreadProcessorSet; struct _KPRCB *MultiThreadSetMaster; @@ -361,19 +364,22 @@ typedef struct _KPRCB LARGE_INTEGER IoReadTransferCount; LARGE_INTEGER IoWriteTransferCount; LARGE_INTEGER IoOtherTransferCount; - ULONG KeContextSwitches; + ULONG SpareCounter1[8]; PP_LOOKASIDE_LIST PPLookasideList[16]; PP_LOOKASIDE_LIST PPNPagedLookasideList[32]; PP_LOOKASIDE_LIST PPPagedLookasideList[32]; volatile ULONG PacketBarrier; volatile ULONG ReverseStall; PVOID IpiFrame; + UCHAR PrcbPad2[52]; volatile PVOID CurrentPacket[3]; volatile ULONG TargetSet; volatile PKIPI_WORKER WorkerRoutine; volatile ULONG IpiFrozen; + UCHAR PrcbPad3[40]; volatile ULONG RequestSummary; volatile struct _KPRCB *SignalDone; + UCHAR PrcbPad4[56]; struct _KDPC_DATA DpcData[2]; PVOID DpcStack; ULONG MaximumDpcQueueDepth; @@ -391,15 +397,19 @@ typedef struct _KPRCB KEVENT DpcEvent; UCHAR ThreadDpcEnable; volatile BOOLEAN QuantumEnd; + UCHAR PrcbPad50; volatile UCHAR IdleSchedule; LONG DpcSetEventRequest; + UCHAR PrcbPad5[18]; LONG TickOffset; KDPC CallDpc; + ULONG PrcbPad7[8]; LIST_ENTRY WaitListHead; ULONG ReadySummary; ULONG QueueIndex; LIST_ENTRY DispatcherReadyListHead[32]; SINGLE_LIST_ENTRY DeferredReadyListHead; + ULONG PrcbPad72[11]; PVOID ChainedInterruptList; LONG LookasideIrpFloat; volatile LONG MmPageFaultCount; @@ -415,13 +425,79 @@ typedef struct _KPRCB volatile LONG MmDirtyWriteIoCount; volatile LONG MmMappedPagesWriteCount; volatile LONG MmMappedWriteIoCount; + ULONG SpareFields0[1]; CHAR VendorString[13]; + UCHAR InitialApicId; + UCHAR LogicalProcessorsPerPhysicalProcessor; ULONG MHz; ULONG FeatureBits; + LARGE_INTEGER UpdateSignature; volatile LARGE_INTEGER IsrTime; + LARGE_INTEGER SpareField1; + //FX_SAVE_AREA NpxSaveArea; PROCESSOR_POWER_STATE PowerState; } KPRCB, *PKPRCB; +// +// Processor Control Region +// +typedef struct _KIPCR +{ + union + { + NT_TIB NtTib; + struct + { + struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; // Unused + PVOID Used_StackBase; // Unused + PVOID PerfGlobalGroupMask; + PVOID TssCopy; // Unused + ULONG ContextSwitches; + KAFFINITY SetMemberCopy; // Unused + PVOID Used_Self; + }; + }; + struct _KPCR *Self; + struct _KPRCB *Prcb; + KIRQL Irql; + ULONG IRR; // Unused + ULONG IrrActive; // Unused + ULONG IDR; // Unused + PVOID KdVersionBlock; + PVOID IDT; // Unused + PVOID GDT; // Unused + PVOID TSS; // Unused + USHORT MajorVersion; + USHORT MinorVersion; + KAFFINITY SetMember; + ULONG StallScaleFactor; + UCHAR SpareUnused; + UCHAR Number; + // arm part + UCHAR Spare0[2]; + UCHAR IrqlMask[32]; + ULONG IrqlTable[32]; + PKINTERRUPT_ROUTINE InterruptRoutine[32]; + ULONG ReservedVectors; + ULONG FirstLevelDcacheSize; + ULONG FirstLevelDcacheFillSize; + ULONG FirstLevelIcacheSize; + ULONG FirstLevelIcacheFillSize; + ULONG SecondLevelDcacheSize; + ULONG SecondLevelDcacheFillSize; + ULONG SecondLevelIcacheSize; + ULONG SecondLevelIcacheFillSize; + ULONG DcacheFillSize; + ULONG DcacheAlignment; + ULONG IcacheAlignment; + ULONG IcacheFillSize; + ULONG ProcessorId; + PVOID InterruptStack; + PVOID PanicStack; + PVOID InitialStack; + KPRCB PrcbData; +} KIPCR, *PKIPCR; + // // Macro to get current KPRCB // @@ -432,5 +508,17 @@ KeGetCurrentPrcb(VOID) return PCR->Prcb; } +// +// Just read it from the PCR +// +#define KeGetCurrentProcessorNumber() (int)PCR->Number +#define KeGetCurrentIrql() PCR->Irql +#define _KeGetCurrentThread() KeGetCurrentPrcb()->CurrentThread +#define _KeGetPreviousMode() KeGetCurrentPrcb()->CurrentThread->PreviousMode +#define _KeIsExecutingDpc() (KeGetCurrentPrcb()->DpcRoutineActive != 0) +#define KeGetCurrentThread() _KeGetCurrentThread() +#define KeGetPreviousMode() _KeGetPreviousMode() +#define KeGetDcacheFillSize() PCR->DcacheFillSize + #endif #endif diff --git a/reactos/include/ndk/arm/mmtypes.h b/reactos/include/ndk/arm/mmtypes.h index 98755647fc6..febadda1cd5 100644 --- a/reactos/include/ndk/arm/mmtypes.h +++ b/reactos/include/ndk/arm/mmtypes.h @@ -47,90 +47,56 @@ C_ASSERT(MM_ALLOCATION_GRANULARITY >= PAGE_SIZE); // // Page Table Entry Definitions // -typedef struct _HARDWARE_PTE_ARM +typedef struct _HARDWARE_PDE_ARMV6 { - union - { - union - { - struct - { - ULONG Type:2; - ULONG Unused:30; - } Fault; - struct - { - ULONG Type:2; - ULONG Ignored:2; - ULONG Reserved:1; - ULONG Domain:4; - ULONG Ignored1:1; - ULONG BaseAddress:22; - } Coarse; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Reserved:1; - ULONG Domain:4; - ULONG Ignored:1; - ULONG Access:2; - ULONG Ignored1:8; - ULONG BaseAddress:12; - } Section; - struct - { - ULONG Type:2; - ULONG Reserved:3; - ULONG Domain:4; - ULONG Ignored:3; - ULONG BaseAddress:20; - } Fine; - } L1; - union - { - struct - { - ULONG Type:2; - ULONG Unused:30; - } Fault; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Access0:2; - ULONG Access1:2; - ULONG Access2:2; - ULONG Access3:2; - ULONG Ignored:4; - ULONG BaseAddress:16; - } Large; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Access0:2; - ULONG Access1:2; - ULONG Access2:2; - ULONG Access3:2; - ULONG BaseAddress:20; - } Small; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Access0:2; - ULONG Ignored:4; - ULONG BaseAddress:22; - } Tiny; - } L2; - ULONG AsUlong; - }; -} HARDWARE_PTE_ARM, *PHARDWARE_PTE_ARM; + ULONG Valid:1; // Only for small pages + ULONG LargePage:1; // Note, if large then Valid = 0 + ULONG Buffered:1; + ULONG Cached:1; + ULONG NoExecute:1; + ULONG Domain:4; + ULONG Ecc:1; + ULONG PageFrameNumber:22; +} HARDWARE_PDE_ARMV6, *PHARDWARE_PDE_ARMV6; + +typedef struct _HARDWARE_LARGE_PTE_ARMV6 +{ + ULONG Valid:1; // Only for small pages + ULONG LargePage:1; // Note, if large then Valid = 0 + ULONG Buffered:1; + ULONG Cached:1; + ULONG NoExecute:1; + ULONG Domain:4; + ULONG Ecc:1; + ULONG Accessed:1; + ULONG Owner:1; + ULONG CacheAttributes:3; + ULONG ReadOnly:1; + ULONG Shared:1; + ULONG NonGlobal:1; + ULONG SuperLagePage:1; + ULONG Reserved:1; + ULONG PageFrameNumber:12; +} HARDWARE_LARGE_PTE_ARMV6, *PHARDWARE_LARGE_PTE_ARMV6; + +typedef struct _HARDWARE_PTE_ARMV6 +{ + ULONG NoExecute:1; + ULONG Valid:1; + ULONG Buffered:1; + ULONG Cached:1; + ULONG Accessed:1; + ULONG Owner:1; + ULONG CacheAttributes:3; + ULONG ReadOnly:1; + ULONG Shared:1; + ULONG NonGlobal:1; + ULONG PageFrameNumber:20; +} HARDWARE_PTE_ARMV6, *PHARDWARE_PTE_ARMV6; + +C_ASSERT(sizeof(HARDWARE_PDE_ARMV6) == sizeof(ULONG)); +C_ASSERT(sizeof(HARDWARE_LARGE_PTE_ARMV6) == sizeof(ULONG)); +C_ASSERT(sizeof(HARDWARE_PTE_ARMV6) == sizeof(ULONG)); typedef struct _MMPTE_SOFTWARE { @@ -185,53 +151,18 @@ typedef struct _MMPTE_LIST ULONG filler1:1; } MMPTE_LIST; -typedef struct _MMPDE_HARDWARE // FIXFIX: Find a way to make this more portable -{ - union - { - union - { - struct - { - ULONG Valid:1; - ULONG Section:1; - ULONG Sbz:3; - ULONG Domain:4; - ULONG EccEnabled:1; - ULONG PageFrameNumber:22; - } Coarse; - struct - { - ULONG Coarse:1; - ULONG Valid:1; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Reserved:1; - ULONG Domain:4; - ULONG EccEnabled:1; - ULONG Access:2; - ULONG ExtendedAccess:3; - ULONG Sbz:3; - ULONG SuperSection:1; - ULONG Sbz1:1; - ULONG PageFrameNumber:12; - } Section; - ULONG AsUlong; - } Hard; - } u; -} MMPDE_HARDWARE, *PMMPDE_HARDWARE; - typedef union _MMPTE_HARDWARE { struct { - ULONG ExecuteNever:1; + ULONG NoExecute:1; ULONG Valid:1; ULONG Buffered:1; ULONG Cached:1; - ULONG Access:2; - ULONG TypeExtension:3; - ULONG ExtendedAccess:1; + ULONG Access:1; + ULONG Owner:1; + ULONG CacheAttributes:3; + ULONG ReadOnly:1; ULONG Shared:1; ULONG NonGlobal:1; ULONG PageFrameNumber:20; @@ -239,10 +170,35 @@ typedef union _MMPTE_HARDWARE ULONG AsUlong; } MMPTE_HARDWARE, *PMMPTE_HARDWARE; +typedef union _MMPDE_HARDWARE +{ + struct + { + ULONG Valid:1; + ULONG LargePage:1; + ULONG Buffered:1; + ULONG Cached:1; + ULONG NoExecute:1; + ULONG Domain:4; + ULONG Ecc:1; + ULONG PageFrameNumber:22; + }; + ULONG AsUlong; +} MMPDE_HARDWARE, *PMMPDE_HARDWARE; + +typedef struct _MMPDE +{ + union + { + MMPDE_HARDWARE Hard; + ULONG Long; + } u; +} MMPDE, *PMMPDE; + // // Use the right PTE structure // -#define HARDWARE_PTE HARDWARE_PTE_ARM -#define PHARDWARE_PTE PHARDWARE_PTE_ARM +#define HARDWARE_PTE HARDWARE_PTE_ARMV6 +#define PHARDWARE_PTE PHARDWARE_PTE_ARMV6 #endif diff --git a/reactos/include/ndk/cmtypes.h b/reactos/include/ndk/cmtypes.h index c800f1370de..36840f6a140 100644 --- a/reactos/include/ndk/cmtypes.h +++ b/reactos/include/ndk/cmtypes.h @@ -54,7 +54,7 @@ Author: #define CmResourceTypeDma 4 #define CmResourceTypeDeviceSpecific 5 #define CmResourceTypeBusNumber 6 -#define CmResourceTypeMaximum 7 +#define CmResourceTypeMemoryLarge 7 #define CmResourceTypeNonArbitrated 128 #define CmResourceTypeConfigData 128 #define CmResourceTypeDevicePrivate 129 @@ -142,11 +142,14 @@ typedef enum _KEY_VALUE_INFORMATION_CLASS KeyValuePartialInformationAlign64 } KEY_VALUE_INFORMATION_CLASS; -typedef enum _KEY_SET_INFORMATION_CLASS -{ - KeyWriteTimeInformation, - KeyUserFlagsInformation, - MaxKeySetInfoClass +typedef enum _KEY_SET_INFORMATION_CLASS { + KeyWriteTimeInformation, + KeyWow64FlagsInformation, + KeyControlFlagsInformation, + KeySetVirtualizationInformation, + KeySetDebugInformation, + KeySetHandleTagsInformation, + MaxKeySetInfoClass } KEY_SET_INFORMATION_CLASS; #endif diff --git a/reactos/include/ndk/exfuncs.h b/reactos/include/ndk/exfuncs.h index f65655b3b58..0d40a3fd0d4 100644 --- a/reactos/include/ndk/exfuncs.h +++ b/reactos/include/ndk/exfuncs.h @@ -732,7 +732,7 @@ ZwFindAtom( OUT PRTL_ATOM Atom OPTIONAL ); -NTSYSAPI +NTSYSCALLAPI NTSTATUS NTAPI ZwOpenEvent( diff --git a/reactos/include/ndk/i386/asm.h b/reactos/include/ndk/i386/asm.h index e2dbeb60963..eaaf2ae1bc4 100644 --- a/reactos/include/ndk/i386/asm.h +++ b/reactos/include/ndk/i386/asm.h @@ -248,10 +248,12 @@ Author: #define KINTERRUPT_SERVICE_CONTEXT 0x10 #define KINTERRUPT_TICK_COUNT 0x18 #define KINTERRUPT_ACTUAL_LOCK 0x1C +#define KINTERRUPT_DISPATCH_ADDRESS 0x20 #define KINTERRUPT_VECTOR 0x24 #define KINTERRUPT_IRQL 0x28 #define KINTERRUPT_SYNCHRONIZE_IRQL 0x29 #define KINTERRUPT_DISPATCH_COUNT 0x38 +#define KINTERRUPT_DISPATCH_CODE 0x3C // // KGDTENTRY Offsets diff --git a/reactos/include/ndk/i386/ketypes.h b/reactos/include/ndk/i386/ketypes.h index 736c2ced376..39d775228b3 100644 --- a/reactos/include/ndk/i386/ketypes.h +++ b/reactos/include/ndk/i386/ketypes.h @@ -30,7 +30,7 @@ Author: #define PCR ((KPCR * const)K0IPCR) #if defined(CONFIG_SMP) || defined(NT_BUILD) #undef KeGetPcr -#define KeGetPcr() ((KPCR * const)__readfsdword(FIELD_OFFSET(KPCR, Self))) +#define KeGetPcr() ((KPCR * const)__readfsdword(FIELD_OFFSET(KPCR, SelfPcr))) #endif // diff --git a/reactos/include/ndk/ifssupp.h b/reactos/include/ndk/ifssupp.h index 15e58332c93..b970ee33ae7 100644 --- a/reactos/include/ndk/ifssupp.h +++ b/reactos/include/ndk/ifssupp.h @@ -21,13 +21,35 @@ Author: #define TOKEN_SOURCE_LENGTH 8 +#ifndef _NTIFS_ typedef enum _TOKEN_TYPE { TokenPrimary = 1, TokenImpersonation } TOKEN_TYPE, *PTOKEN_TYPE; -typedef PVOID PRTL_HEAP_PARAMETERS; +typedef NTSTATUS +(NTAPI * PRTL_HEAP_COMMIT_ROUTINE)( + IN PVOID Base, + IN OUT PVOID *CommitAddress, + IN OUT PSIZE_T CommitSize +); + +typedef struct _RTL_HEAP_PARAMETERS +{ + ULONG Length; + SIZE_T SegmentReserve; + SIZE_T SegmentCommit; + SIZE_T DeCommitFreeBlockThreshold; + SIZE_T DeCommitTotalFreeThreshold; + SIZE_T MaximumAllocationSize; + SIZE_T VirtualMemoryThreshold; + SIZE_T InitialCommit; + SIZE_T InitialReserve; + PRTL_HEAP_COMMIT_ROUTINE CommitRoutine; + SIZE_T Reserved[2]; +} RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS; + typedef PVOID PFS_FILTER_CALLBACKS; typedef USHORT SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL; @@ -260,5 +282,7 @@ typedef struct _TOKEN_DEFAULT_DACL #define HEAP_CREATE_ENABLE_TRACING 0x00020000 #define HEAP_CREATE_ENABLE_EXECUTE 0x00040000 +#endif + #endif // !NTOS_MODE_USER #endif // _NTIFS_ diff --git a/reactos/include/ndk/iotypes.h b/reactos/include/ndk/iotypes.h index 04fd0380480..121ce2db03d 100644 --- a/reactos/include/ndk/iotypes.h +++ b/reactos/include/ndk/iotypes.h @@ -107,7 +107,7 @@ extern POBJECT_TYPE NTSYSAPI IoDriverObjectType; #define FILE_CREATE_TREE_CONNECTION 0x00000080 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100 #define FILE_NO_EA_KNOWLEDGE 0x00000200 -#define FILE_OPEN_FOR_RECOVERY 0x00000400 +#define FILE_OPEN_REMOTE_INSTANCE 0x00000400 #define FILE_RANDOM_ACCESS 0x00000800 #define FILE_DELETE_ON_CLOSE 0x00001000 #define FILE_OPEN_BY_FILE_ID 0x00002000 diff --git a/reactos/include/ndk/obfuncs.h b/reactos/include/ndk/obfuncs.h index af48d6e5c31..19ed1fd4314 100644 --- a/reactos/include/ndk/obfuncs.h +++ b/reactos/include/ndk/obfuncs.h @@ -74,6 +74,14 @@ ObCreateObjectType( OUT POBJECT_TYPE *ObjectType ); +NTKERNELAPI +VOID +NTAPI +ObDereferenceSecurityDescriptor( + PSECURITY_DESCRIPTOR SecurityDescriptor, + ULONG Count +); + NTKERNELAPI ULONG NTAPI @@ -81,6 +89,15 @@ ObGetObjectPointerCount( IN PVOID Object ); +NTKERNELAPI +NTSTATUS +NTAPI +ObLogSecurityDescriptor( + IN PSECURITY_DESCRIPTOR InputSecurityDescriptor, + OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor, + IN ULONG RefBias +); + NTKERNELAPI NTSTATUS NTAPI @@ -108,6 +125,14 @@ ObReferenceObjectByName( OUT PVOID *Object ); +NTKERNELAPI +VOID +NTAPI +ObReferenceSecurityDescriptor( + IN PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG Count +); + NTKERNELAPI NTSTATUS NTAPI diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index 960d8d2af34..210dd2fffc5 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -1479,7 +1479,7 @@ RtlUpcaseUnicodeToOemN( PCHAR OemString, ULONG OemSize, PULONG ResultSize, - PWCHAR UnicodeString, + PCWCH UnicodeString, ULONG UnicodeSize ); @@ -1509,7 +1509,7 @@ RtlUnicodeToOemN( PCHAR OemString, ULONG OemSize, PULONG ResultSize, - PWCHAR UnicodeString, + PCWCH UnicodeString, ULONG UnicodeSize ); @@ -1534,7 +1534,7 @@ RtlUpcaseUnicodeToMultiByteN( PCHAR MbString, ULONG MbSize, PULONG ResultSize, - PWCHAR UnicodeString, + PCWCH UnicodeString, ULONG UnicodeSize ); @@ -1543,7 +1543,7 @@ NTSTATUS NTAPI RtlUnicodeToMultiByteSize( PULONG MbSize, - PWCHAR UnicodeString, + PCWCH UnicodeString, ULONG UnicodeSize ); @@ -1571,7 +1571,7 @@ RtlOemToUnicodeN( PWSTR UnicodeString, ULONG MaxBytesInUnicodeString, PULONG BytesInUnicodeString, - IN PCHAR OemString, + IN PCCH OemString, ULONG BytesInOemString ); @@ -2653,6 +2653,7 @@ DbgPrintEx( IN ... ); +NTSYSAPI ULONG NTAPI DbgPrompt( diff --git a/reactos/include/psdk/access.idl b/reactos/include/psdk/access.idl new file mode 100644 index 00000000000..d3d94240384 --- /dev/null +++ b/reactos/include/psdk/access.idl @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + object, + uuid(0c733a8c-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface IAccessor : IUnknown +{ + + typedef DWORD DBACCESSORFLAGS; + + typedef DWORD DBBINDSTATUS; + + [local] + HRESULT AddRefAccessor([in] HACCESSOR hAccessor, + [in, out, unique, annotation("__out_opt")] DBREFCOUNT *pcRefCount); + + [call_as(AddRefAccessor)] + HRESULT RemoteAddRefAccessor([in] HACCESSOR hAccessor, + [in, out, unique, annotation("__out_opt")] DBREFCOUNT *pcRefCount, + [out] IErrorInfo **ppErrorInfoRem); + + [local] + HRESULT CreateAccessor([in] DBACCESSORFLAGS dwAccessorFlags, + [in] DBCOUNTITEM cBindings, + [in, size_is(cBindings), annotation("__in_ecount(cBindings)")] const DBBINDING rgBindings[], + [in] DBLENGTH cbRowSize, + [out, annotation("__out")] HACCESSOR *phAccessor, + [out, size_is(cBindings), annotation("__out_ecount_opt(cBindings)")] DBBINDSTATUS rgStatus[]); + + [call_as(CreateAccessor)] + HRESULT RemoteCreateAccessor([in] DBACCESSORFLAGS dwAccessorFlags, + [in] DBCOUNTITEM cBindings, + [in, unique, size_is(cBindings)] DBBINDING *rgBindings, + [in] DBLENGTH cbRowSize, + [out] HACCESSOR *phAccessor, + [in, out, unique, size_is(cBindings)] DBBINDSTATUS *rgStatus, + [out] IErrorInfo **ppErrorInfoRem); + + [local] + HRESULT GetBindings([in] HACCESSOR hAccessor, + [out, annotation("__out")] DBACCESSORFLAGS *pdwAccessorFlags, + [in, out, annotation("__out_opt")] DBCOUNTITEM *pcBindings, + [out, size_is(,*pcBindings), annotation("__deref_out_ecount_opt(*pcBindings)")] DBBINDING **prgBindings); + + [call_as(GetBindings)] + HRESULT RemoteGetBindings([in] HACCESSOR hAccessor, + [out] DBACCESSORFLAGS *pdwAccessorFlags, + [in, out] DBCOUNTITEM *pcBindings, + [out, size_is(,*pcBindings)] DBBINDING **prgBindings, + [out] IErrorInfo **ppErrorInfoRem); + + [local] + HRESULT ReleaseAccessor([in] HACCESSOR hAccessor, + [in, out, unique, annotation("__out_opt")] DBREFCOUNT *pcRefCount); + + [call_as(ReleaseAccessor)] + HRESULT RemoteReleaseAccessor([in] HACCESSOR hAccessor, + [in, out, unique] DBREFCOUNT *pcRefCount, + [out] IErrorInfo **ppErrorInfoRem); + +}; diff --git a/reactos/include/psdk/asynot.idl b/reactos/include/psdk/asynot.idl new file mode 100644 index 00000000000..b745bd9c796 --- /dev/null +++ b/reactos/include/psdk/asynot.idl @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + object, + uuid(0c733a96-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface IDBAsynchNotify : IUnknown +{ + [local] + HRESULT OnLowResource([in] DB_DWRESERVE dwReserved); + + [call_as(OnLowResource)] + HRESULT RemoteOnLowResource([in] DB_DWRESERVE dwReserved); + + [local] + HRESULT OnProgress([in] HCHAPTER hChapter, + [in] DBASYNCHOP eOperation, + [in] DBCOUNTITEM ulProgress, + [in] DBCOUNTITEM ulProgressMax, + [in] DBASYNCHPHASE eAsynchPhase, + [in, annotation("__in_opt")] LPOLESTR pwszStatusText); + + [call_as(OnProgress)] + HRESULT RemoteOnProgress([in] HCHAPTER hChapter, + [in] DBASYNCHOP eOperation, + [in] DBCOUNTITEM ulProgress, + [in] DBCOUNTITEM ulProgressMax, + [in] DBASYNCHPHASE eAsynchPhase, + [in, unique, string] LPOLESTR pwszStatusText); + + [local] + HRESULT OnStop([in] HCHAPTER hChapter, + [in] DBASYNCHOP eOperation, + [in] HRESULT hrStatus, + [in, annotation("__in_opt")] LPOLESTR pwszStatusText); + + [call_as(OnStop)] + HRESULT RemoteOnStop([in] HCHAPTER hChapter, + [in] DBASYNCHOP eOperation, + [in] HRESULT hrStatus, + [in, unique, string] LPOLESTR pwszStatusText); +} diff --git a/reactos/include/psdk/asysta.idl b/reactos/include/psdk/asysta.idl new file mode 100644 index 00000000000..40bca846530 --- /dev/null +++ b/reactos/include/psdk/asysta.idl @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + object, + uuid(0c733a95-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface IDBAsynchStatus : IUnknown +{ + [local] + HRESULT Abort([in] HCHAPTER hChapter, + [in] DBASYNCHOP eOperation); + + [call_as(Abort)] + HRESULT RemoteAbort([in] HCHAPTER hChapter, + [in] DBASYNCHOP eOperation, + [out] IErrorInfo **ppErrorInfoRem); + + [local] + HRESULT GetStatus([in] HCHAPTER hChapter, + [in] DBASYNCHOP eOperation, + [out, annotation("__out_opt")] DBCOUNTITEM *pulProgress, + [out, annotation("__out_opt")] DBCOUNTITEM *pulProgressMax, + [out, annotation("__out")] DBASYNCHPHASE *peAsynchPhase, + [out, annotation("__deref_opt_inout_opt")] LPOLESTR *ppwszStatusText); + + [call_as(GetStatus)] + HRESULT RemoteGetStatus([in] HCHAPTER hChapter, + [in] DBASYNCHOP eOperation, + [in, out, unique] DBCOUNTITEM *pulProgress, + [in, out, unique] DBCOUNTITEM *pulProgressMax, + [in, out, unique] DBASYNCHPHASE *peAsynchPhase, + [in, out, unique] LPOLESTR *ppwszStatusText, + [out] IErrorInfo **ppErrorInfoRem); +} diff --git a/reactos/include/psdk/batclass.h b/reactos/include/psdk/batclass.h index fcddcb82f6d..457212519d0 100644 --- a/reactos/include/psdk/batclass.h +++ b/reactos/include/psdk/batclass.h @@ -274,10 +274,10 @@ NTSTATUS DDKAPI BatteryClassSystemControl( IN PVOID ClassData, - IN PWMILIB_CONTEXT WmiLibContext, + IN PVOID WmiLibContext, /* PWMILIB_CONTEXT */ IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, - OUT PSYSCTL_IRP_DISPOSITION Disposition); + OUT PVOID Disposition); /* PSYSCTL_IRP_DISPOSITION */ BCLASSAPI NTSTATUS diff --git a/reactos/include/psdk/bdaiface.idl b/reactos/include/psdk/bdaiface.idl new file mode 100644 index 00000000000..712015c9bbb --- /dev/null +++ b/reactos/include/psdk/bdaiface.idl @@ -0,0 +1,607 @@ +#ifndef DO_NO_IMPORTS +import "unknwn.idl"; +import "strmif.idl"; +import "bdatypes.h"; +#endif + +/************************************************************ + * interface IBDA_NetworkProvider + */ +[ + object, + uuid(fd501041-8ebe-11ce-8183-00aa00577da2), + pointer_default(unique) +] +interface IBDA_NetworkProvider : IUnknown +{ + HRESULT PutSignalSource( + [in] ULONG ulSignalSource); + + HRESULT GetSignalSource( + [in, out] ULONG * pulSignalSource); + + HRESULT GetNetworkType( + [in, out] GUID * pguidNetworkType); + + HRESULT PutTuningSpace( + [in] REFGUID guidTuningSpace); + + HRESULT GetTuningSpace( + [in, out] GUID * pguidTuingSpace); + + HRESULT RegisterDeviceFilter( + [in] IUnknown * pUnkFilterControl, + [in, out] ULONG * ppvRegisitrationContext); + + HRESULT UnRegisterDeviceFilter( + [in] ULONG pvRegistrationContext); +} + + +/************************************************************ + * interface IBDA_EthernetFilter + */ +[ + object, + uuid(71985F43-1CA1-11d3-9CC8-00C04F7971E0), + pointer_default(unique) +] +interface IBDA_EthernetFilter : IUnknown +{ + HRESULT GetMulticastListSize( + [in, out] ULONG * pulcbAddresses); + + HRESULT PutMulticastList( + [in] ULONG ulcbAddresses, + [in] BYTE * pAddressList); + + HRESULT GetMulticastList( + [in, out] ULONG * pulcbAddresses, + [out] BYTE * pAddressList); + + HRESULT PutMulticastMode( + [in] ULONG ulModeMask); + + HRESULT GetMulticastMode( + [out] ULONG * pulModeMask); + +} + +/************************************************************ + * interface IBDA_IPV4Filter + */ +[ + object, + uuid(71985F44-1CA1-11d3-9CC8-00C04F7971E0), + pointer_default(unique) +] + +interface IBDA_IPV4Filter : IUnknown +{ + HRESULT GetMulticastListSize( + [in, out] ULONG * pulcbAddresses); + + HRESULT PutMulticastList( + [in] ULONG ulcbAddresses, + [in] BYTE * pAddressList); + + HRESULT GetMulticastList( + [in, out] ULONG * pulcbAddresses, + [out] BYTE * pAddressList); + + HRESULT PutMulticastMode( + [in] ULONG ulModeMask); + + HRESULT GetMulticastMode( + [out] ULONG * pulModeMask); +} + +/************************************************************ + * interface IBDA_IPV6Filter + */ + +[ + object, + uuid(E1785A74-2A23-4fb3-9245-A8F88017EF33), + pointer_default(unique) +] +interface IBDA_IPV6Filter : IUnknown +{ + + HRESULT GetMulticastListSize( + [in, out] ULONG * pulcbAddresses); + + HRESULT PutMulticastList( + [in] ULONG ulcbAddresses, + [in] BYTE * pAddressList); + + HRESULT GetMulticastList( + [in, out] ULONG * pulcbAddresses, + [out] BYTE * pAddressList); + + HRESULT PutMulticastMode( + [in] ULONG ulModeMask); + + HRESULT GetMulticastMode( + [out] ULONG * pulModeMask); +} + +/************************************************************ + * interface IBDA_DeviceControl + */ + +[ + object, + uuid(FD0A5AF3-B41D-11d2-9C95-00C04F7971E0), + pointer_default(unique) +] +interface IBDA_DeviceControl : IUnknown +{ + HRESULT StartChanges(void); + HRESULT CheckChanges(void); + HRESULT CommitChanges(void); + HRESULT GetChangeState( + [in, out] ULONG * pState); +} + +/************************************************************ + * interface IBDA_PinControl + */ +[ + object, + uuid(0DED49D5-A8B7-4d5d-97A1-12B0C195874D), + pointer_default(unique) +] +interface IBDA_PinControl : IUnknown +{ + HRESULT GetPinID( + [in, out] ULONG * pulPinID); + + HRESULT GetPinType( + [in, out] ULONG * pulPinType); + + HRESULT RegistrationContext( + [in, out] ULONG * pulRegistrationCtx); +} + +/************************************************************ + * interface IBDA_SignalProperties + */ +[ + object, + uuid(D2F1644B-B409-11d2-BC69-00A0C9EE9E16), + pointer_default(unique) +] +interface IBDA_SignalProperties : IUnknown +{ + HRESULT PutNetworkType( + [in] REFGUID guidNetworkType); + + HRESULT GetNetworkType( + [in, out] GUID * pguidNetworkType); + + HRESULT PutSignalSource( + [in] ULONG ulSignalSource); + + HRESULT GetSignalSource( + [in, out] ULONG * pulSignalSource); + + HRESULT PutTuningSpace( + [in] REFGUID guidTuningSpace); + + HRESULT GetTuningSpace( + [in, out] GUID * pguidTuingSpace); +} + + +/************************************************************ + * interface IBDA_SignalStatistics + */ +[ + object, + uuid(1347D106-CF3A-428a-A5CB-AC0D9A2A4338), + pointer_default(unique) +] +interface IBDA_SignalStatistics : IUnknown +{ + HRESULT put_SignalStrength( + [in] LONG lDbStrength); + + HRESULT get_SignalStrength( + [in, out] LONG * plDbStrength); + + HRESULT put_SignalQuality( + [in] LONG lPercentQuality); + + HRESULT get_SignalQuality( + [in, out] LONG * plPercentQuality); + + HRESULT put_SignalPresent( + [in] BOOLEAN fPresent); + + HRESULT get_SignalPresent( + [in, out] BOOLEAN * pfPresent); + + HRESULT put_SignalLocked( + [in] BOOLEAN fLocked); + + HRESULT get_SignalLocked( + [in, out] BOOLEAN * pfLocked); + + HRESULT put_SampleTime( + [in] LONG lmsSampleTime); + + HRESULT get_SampleTime( + [in, out] LONG * plmsSampleTime); +} + +/************************************************************ + * interface IBDA_Topology + */ +[ + object, + uuid(79B56888-7FEA-4690-B45D-38FD3C7849BE), + pointer_default(unique) +] +interface IBDA_Topology : IUnknown +{ + HRESULT GetNodeTypes( + [in, out] ULONG * pulcNodeTypes, + [in] ULONG ulcNodeTypesMax, + [in, out] ULONG * rgulNodeTypes); + + HRESULT GetNodeDescriptors( + [in, out] ULONG * ulcNodeDescriptors, + [in] ULONG ulcNodeDescriptorsMax, + [in, out] BDANODE_DESCRIPTOR * rgNodeDescriptors); + + HRESULT GetNodeInterfaces( + [in] ULONG ulNodeType, + [in, out] ULONG * pulcInterfaces, + [in] ULONG ulcInterfacesMax, + [in, out] GUID * rgguidInterfaces); + + HRESULT GetPinTypes( + [in, out] ULONG * pulcPinTypes, + [in] ULONG ulcPinTypesMax, + [in, out] ULONG * rgulPinTypes); + + HRESULT GetTemplateConnections( + [in, out] ULONG * pulcConnections, + [in] ULONG ulcConnectionsMax, + [in, out, ] BDA_TEMPLATE_CONNECTION * rgConnections); + + HRESULT CreatePin( + [in] ULONG ulPinType, + [in, out] ULONG * pulPinId); + + HRESULT DeletePin( + [in] ULONG ulPinId); + + HRESULT SetMediaType( + [in] ULONG ulPinId, + [in] AM_MEDIA_TYPE * pMediaType); + + HRESULT SetMedium( + [in] ULONG ulPinId, + [in] REGPINMEDIUM * pMedium); + + HRESULT CreateTopology( + [in] ULONG ulInputPinId, + [in] ULONG ulOutputPinId); + + HRESULT GetControlNode( + [in] ULONG ulInputPinId, + [in] ULONG ulOutputPinId, + [in] ULONG ulNodeType, + [in, out] IUnknown ** ppControlNode); +} + +/************************************************************ + * interface IBDA_VoidTransform + */ +[ + object, + uuid(71985F46-1CA1-11d3-9CC8-00C04F7971E0), + pointer_default(unique) +] +interface IBDA_VoidTransform : IUnknown +{ + HRESULT Start(); + + HRESULT Stop(); +} + +/************************************************************ + * interface IBDA_NullTransform + */ + +[ + object, + uuid(DDF15B0D-BD25-11d2-9CA0-00C04F7971E0), + pointer_default(unique) +] +interface IBDA_NullTransform : IUnknown +{ + HRESULT Start(); + + HRESULT Stop(); +} + +/************************************************************ + * interface IBDA_FrequencyFilter + */ + +[ + object, + uuid(71985F47-1CA1-11d3-9CC8-00C04F7971E0), + pointer_default(unique) +] +interface IBDA_FrequencyFilter : IUnknown +{ + HRESULT put_Autotune( + [in] ULONG ulTransponder); + + HRESULT get_Autotune( + [in, out] ULONG * pulTransponder); + + HRESULT put_Frequency( + [in] ULONG ulFrequency); + + HRESULT get_Frequency( + [in, out] ULONG * pulFrequency); + + HRESULT put_Polarity( + [in] Polarisation Polarity); + + HRESULT get_Polarity( + [in, out] Polarisation * pPolarity); + + HRESULT put_Range( + [in] ULONG ulRange); + + HRESULT get_Range( + [in, out] ULONG * pulRange); + + HRESULT put_Bandwidth( + [in] ULONG ulBandwidth); + + HRESULT get_Bandwidth( + [in, out] ULONG * pulBandwidth); + + HRESULT put_FrequencyMultiplier( + [in] ULONG ulMultiplier); + + HRESULT get_FrequencyMultiplier( + [in, out] ULONG * pulMultiplier); +} + +/************************************************************ + * interface IBDA_LNBInfo + */ +[ + object, + uuid(992CF102-49F9-4719-A664-C4F23E2408F4), + pointer_default(unique) +] +interface IBDA_LNBInfo : IUnknown +{ + HRESULT put_LocalOscilatorFrequencyLowBand( + [in] ULONG ulLOFLow); + + HRESULT get_LocalOscilatorFrequencyLowBand( + [in, out] ULONG * pulLOFLow); + + HRESULT put_LocalOscilatorFrequencyHighBand( + [in] ULONG ulLOFHigh); + + HRESULT get_LocalOscilatorFrequencyHighBand( + [in, out] ULONG * pulLOFHigh); + + HRESULT put_HighLowSwitchFrequency( + [in] ULONG ulSwitchFrequency); + + HRESULT get_HighLowSwitchFrequency( + [in, out] ULONG * pulSwitchFrequency); +} + +/************************************************************ + * interface IBDA_AutoDemodulate + */ + +[ + object, + uuid(DDF15B12-BD25-11d2-9CA0-00C04F7971E0), + pointer_default(unique) +] +interface IBDA_AutoDemodulate : IUnknown +{ + HRESULT put_AutoDemodulate(); +} + +/************************************************************ + * interface IBDA_DigitalDemodulator + */ + +[ + object, + uuid(EF30F379-985B-4d10-B640-A79D5E04E1E0), + pointer_default(unique) +] +interface IBDA_DigitalDemodulator : IUnknown +{ + HRESULT put_ModulationType( + [in] ModulationType * pModulationType); + + HRESULT get_ModulationType( + [in, out] ModulationType * pModulationType); + + HRESULT put_InnerFECMethod( + [in] FECMethod * pFECMethod); + + HRESULT get_InnerFECMethod( + [in, out] FECMethod * pFECMethod); + + HRESULT put_InnerFECRate( + [in] BinaryConvolutionCodeRate * pFECRate); + + HRESULT get_InnerFECRate( + [in, out] BinaryConvolutionCodeRate * pFECRate); + + HRESULT put_OuterFECMethod( + [in] FECMethod * pFECMethod); + + HRESULT get_OuterFECMethod( + [in, out] FECMethod * pFECMethod); + + HRESULT put_OuterFECRate( + [in] BinaryConvolutionCodeRate * pFECRate); + + HRESULT get_OuterFECRate( + [in, out] BinaryConvolutionCodeRate * pFECRate); + + HRESULT put_SymbolRate( + [in] ULONG * pSymbolRate); + + HRESULT get_SymbolRate( + [in, out] ULONG * pSymbolRate); + + HRESULT put_SpectralInversion( + [in] SpectralInversion * pSpectralInversion); + + HRESULT get_SpectralInversion( + [in, out] SpectralInversion * pSpectralInversion); +} + +typedef enum +{ + KSPROPERTY_IPSINK_MULTICASTLIST, + KSPROPERTY_IPSINK_ADAPTER_DESCRIPTION, + KSPROPERTY_IPSINK_ADAPTER_ADDRESS +}KSPROPERTY_IPSINK; + +/************************************************************ + * interface IBDA_IPSinkControl + */ + +[ + object, + uuid(3F4DC8E2-4050-11d3-8F4B-00C04F7971E2), + pointer_default(unique), +] +interface IBDA_IPSinkControl : IUnknown +{ + HRESULT GetMulticastList( + [in, out] unsigned long *pulcbSize, + [in, out] BYTE **pbBuffer); + + HRESULT GetAdapterIPAddress( + [in, out] unsigned long *pulcbSize, + [in, out] BYTE ** pbBuffer); + +} + +/************************************************************ + * interface IBDA_IPSinkInfo + */ +[ + object, + uuid(A750108F-492E-4d51-95F7-649B23FF7AD7), + pointer_default(unique) +] +interface IBDA_IPSinkInfo : IUnknown +{ + HRESULT get_MulticastList( + [in, out] ULONG * pulcbAddresses, + [out] BYTE **ppbAddressList); + + HRESULT get_AdapterIPAddress( + [out] BSTR *pbstrBuffer); + + HRESULT get_AdapterDescription( + [out] BSTR *pbstrBuffer); +} + +/************************************************************ + * interface IEnumPIDMap + */ + +[ + object, + uuid(afb6c2a2-2c41-11d3-8a60-0000f81e0e4a), + pointer_default(unique) +] +interface IEnumPIDMap : IUnknown +{ + HRESULT Next( + [in] ULONG cRequest, + [in, out] PID_MAP * pPIDMap, + [out] ULONG * pcReceived); + + HRESULT Skip( + [in] ULONG cRecords); + + HRESULT Reset(); + + HRESULT Clone( + [out] IEnumPIDMap ** ppIEnumPIDMap); +} ; + +/************************************************************ + * interface IMPEG2PIDMap + */ + +[ + object, + uuid(afb6c2a1-2c41-11d3-8a60-0000f81e0e4a), + pointer_default(unique) +] +interface IMPEG2PIDMap : IUnknown +{ + HRESULT MapPID( + [in] ULONG culPID, + [in] ULONG * pulPID, + [in] MEDIA_SAMPLE_CONTENT MediaSampleContent); + + HRESULT UnmapPID( + [in] ULONG culPID, + [in] ULONG * pulPID); + + HRESULT EnumPIDMap( + [out] IEnumPIDMap ** pIEnumPIDMap); +} ; + +/************************************************************ + * interface IFrequencyMap + */ + + [ + object, + uuid(06FB45C1-693C-4ea7-B79F-7A6A54D8DEF2), + pointer_default(unique), + ] + + interface IFrequencyMap : IUnknown + { + HRESULT get_FrequencyMapping( + [out] ULONG* ulCount, + [out] ULONG** ppulList); + + HRESULT put_FrequencyMapping( + [in] ULONG ulCount, + [in] ULONG *pList); + + HRESULT get_CountryCode([out] ULONG *pulCountryCode); + + HRESULT put_CountryCode( + [in] ULONG ulCountryCode); + + HRESULT get_DefaultFrequencyMapping( + [in] ULONG ulCountryCode, + [out] ULONG* pulCount, + [out] ULONG** ppulList); + + HRESULT get_CountryCodeList( + [out] ULONG* pulCount, + [out] ULONG** ppulList); + }; diff --git a/reactos/include/psdk/binres.idl b/reactos/include/psdk/binres.idl new file mode 100644 index 00000000000..f09d124fdef --- /dev/null +++ b/reactos/include/psdk/binres.idl @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + object, + uuid(0c733ab1-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface IBindResource : IUnknown +{ + [local] + HRESULT Bind([in] IUnknown *pUnkOuter, + [in] LPCOLESTR pwszURL, + [in] DBBINDURLFLAG dwBindURLFlags, + [in] REFGUID rguid, + [in] REFIID riid, + [in] IAuthenticate *pAuthenticate, + [in, out, unique] DBIMPLICITSESSION *pImplSession, + [in, out, unique] DBBINDURLSTATUS *pdwBindStatus, + [out, iid_is(riid)] IUnknown **ppUnk); + + [call_as(Bind)] + HRESULT RemoteBind([in] IUnknown *pUnkOuter, + [in] LPCOLESTR pwszURL, + [in] DBBINDURLFLAG dwBindURLFlags, + [in] REFGUID rguid, + [in] REFIID riid, + [in] IAuthenticate *pAuthenticate, + [in] IUnknown *pSessionUnkOuter, + [in, unique] IID *piid, + [in, out, unique, iid_is(piid)] IUnknown **ppSession, + [in, out, unique] DBBINDURLSTATUS *pdwBindStatus, + [out, iid_is(riid)] IUnknown **ppUnk); +} diff --git a/reactos/include/psdk/bits.idl b/reactos/include/psdk/bits.idl index 386d6c00b75..89b916d0a2c 100644 --- a/reactos/include/psdk/bits.idl +++ b/reactos/include/psdk/bits.idl @@ -30,6 +30,10 @@ cpp_quote("#define BG_NOTIFY_JOB_ERROR 0x0002") cpp_quote("#define BG_NOTIFY_DISABLE 0x0004") cpp_quote("#define BG_NOTIFY_JOB_MODIFICATION 0x0008") +cpp_quote("#ifdef WINE_NO_UNICODE_MACROS") +cpp_quote("#undef EnumJobs") +cpp_quote("#undef GetJob") +cpp_quote("#endif") #define BG_ENUM_SIZEIS(maxcount) maxcount #define BG_ENUM_LENGTHIS(maxcount,lengthptr) lengthptr ? *lengthptr : maxcount diff --git a/reactos/include/psdk/cmdbas.idl b/reactos/include/psdk/cmdbas.idl new file mode 100644 index 00000000000..01be4604f38 --- /dev/null +++ b/reactos/include/psdk/cmdbas.idl @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + object, + uuid(0c733a63-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface ICommand : IUnknown +{ + [local] + HRESULT Cancel(); + + [call_as(Cancel)] + HRESULT RemoteCancel([out] IErrorInfo **ppErrorInfoRem); + + [local] + HRESULT Execute([in, annotation("__in_opt")] IUnknown *pUnkOuter, + [in] REFIID riid, + [in, out, annotation("__inout_opt")] DBPARAMS *pParams, + [out, annotation("__out_opt")] DBROWCOUNT *pcRowsAffected, + [out, iid_is(riid), annotation("__deref_opt_out")] IUnknown **ppRowset); + + [call_as(Execute)] + HRESULT RemoteExecute([in] IUnknown *pUnkOuter, + [in] REFIID riid, + [in] HACCESSOR hAccessor, + [in] DB_UPARAMS cParamSets, + [in, unique] GUID *pGuid, + [in] ULONG ulGuidOffset, + [in, unique] RMTPACK *pInputParams, + [in, out, unique] RMTPACK *pOutputParams, + [in] DBCOUNTITEM cBindings, + [in, unique, size_is(cBindings)] DBBINDING *rgBindings, + [in, out, unique, size_is(cBindings)] DBSTATUS *rgStatus, + [in, out, unique] DBROWCOUNT *pcRowsAffected, + [in, out, unique, iid_is(riid)] IUnknown **ppRowset); + + [local] + HRESULT GetDBSession([in] REFIID riid, + [out, iid_is(riid), annotation("__deref_out_opt")] IUnknown **ppSession); + + [call_as(GetDBSession)] + HRESULT RemoteGetDBSession([in] REFIID riid, + [out, iid_is(riid)] IUnknown **ppSession, + [out] IErrorInfo **ppErrorInfoRem); +}; diff --git a/reactos/include/psdk/cmdtxt.idl b/reactos/include/psdk/cmdtxt.idl new file mode 100644 index 00000000000..32208848353 --- /dev/null +++ b/reactos/include/psdk/cmdtxt.idl @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + object, + uuid(0c733a27-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface ICommandText : ICommand +{ + [local] + HRESULT GetCommandText([in, out /*, annotation("__inout_opt")*/] GUID *pguidDialect, + [out /*, annotation("__deref_out")*/] LPOLESTR *ppwszCommand); + + [call_as(GetCommandText)] + HRESULT RemoteGetCommandText([in, out, unique] GUID *pguidDialect, + [out] LPOLESTR *ppwszCommand, + [out] IErrorInfo **ppErrorInfoRem); + + [local] + HRESULT SetCommandText([in] REFGUID rguidDialect, + [in, unique /*, annotation("__in_z_opt")*/] LPCOLESTR pwszCommand); + + [call_as(SetCommandText)] + HRESULT RemoteSetCommandText([in] REFGUID rguidDialect, + [in, unique] LPCOLESTR pwszCommand, + [out] IErrorInfo **ppErrorInfoRem); + +}; diff --git a/reactos/include/psdk/control.idl b/reactos/include/psdk/control.idl index ddb52795b60..84a4f88e6a9 100644 --- a/reactos/include/psdk/control.idl +++ b/reactos/include/psdk/control.idl @@ -27,7 +27,7 @@ interface IMediaEvent; interface IMediaEventEx; interface IMediaPosition; -typedef long OAFilterState; +typedef LONG OAFilterState; typedef LONG_PTR OAHWND; typedef LONG_PTR OAEVENT; @@ -68,10 +68,10 @@ interface IMediaControl : IDispatch ] interface IBasicAudio : IDispatch { - [propput] HRESULT Volume( [in] long lVolume ); - [propget] HRESULT Volume( [out] long *plVolume ); - [propput] HRESULT Balance( [in] long lBalance ); - [propget] HRESULT Balance( [out] long *plBalance ); + [propput] HRESULT Volume( [in] LONG lVolume ); + [propget] HRESULT Volume( [out] LONG *plVolume ); + [propput] HRESULT Balance( [in] LONG lBalance ); + [propget] HRESULT Balance( [out] LONG *plBalance ); } @@ -87,43 +87,43 @@ interface IVideoWindow : IDispatch { [propput] HRESULT Caption( [in] BSTR strCaption ); [propget] HRESULT Caption( [out] BSTR *strCaption ); - [propput] HRESULT WindowStyle( [in] long WindowStyle ); - [propget] HRESULT WindowStyle( [out] long *WindowStyle ); - [propput] HRESULT WindowStyleEx( [in] long WindowStyleEx ); - [propget] HRESULT WindowStyleEx( [out] long *WindowStyleEx ); - [propput] HRESULT AutoShow( [in] long AutoShow ); - [propget] HRESULT AutoShow( [out] long *AutoShow ); - [propput] HRESULT WindowState( [in] long WindowState ); - [propget] HRESULT WindowState( [out] long *WindowState ); - [propput] HRESULT BackgroundPalette( [in] long BackgroundPalette ); - [propget] HRESULT BackgroundPalette( [out] long *pBackgroundPalette ); - [propput] HRESULT Visible( [in] long Visible ); - [propget] HRESULT Visible( [out] long *pVisible ); - [propput] HRESULT Left( [in] long Left ); - [propget] HRESULT Left( [out] long *pLeft ); - [propput] HRESULT Width( [in] long Width ); - [propget] HRESULT Width( [out] long *pWidth ); - [propput] HRESULT Top( [in] long Top ); - [propget] HRESULT Top( [out] long *pTop ); - [propput] HRESULT Height( [in] long Height ); - [propget] HRESULT Height( [out] long *pHeight ); + [propput] HRESULT WindowStyle( [in] LONG WindowStyle ); + [propget] HRESULT WindowStyle( [out] LONG *WindowStyle ); + [propput] HRESULT WindowStyleEx( [in] LONG WindowStyleEx ); + [propget] HRESULT WindowStyleEx( [out] LONG *WindowStyleEx ); + [propput] HRESULT AutoShow( [in] LONG AutoShow ); + [propget] HRESULT AutoShow( [out] LONG *AutoShow ); + [propput] HRESULT WindowState( [in] LONG WindowState ); + [propget] HRESULT WindowState( [out] LONG *WindowState ); + [propput] HRESULT BackgroundPalette( [in] LONG BackgroundPalette ); + [propget] HRESULT BackgroundPalette( [out] LONG *pBackgroundPalette ); + [propput] HRESULT Visible( [in] LONG Visible ); + [propget] HRESULT Visible( [out] LONG *pVisible ); + [propput] HRESULT Left( [in] LONG Left ); + [propget] HRESULT Left( [out] LONG *pLeft ); + [propput] HRESULT Width( [in] LONG Width ); + [propget] HRESULT Width( [out] LONG *pWidth ); + [propput] HRESULT Top( [in] LONG Top ); + [propget] HRESULT Top( [out] LONG *pTop ); + [propput] HRESULT Height( [in] LONG Height ); + [propget] HRESULT Height( [out] LONG *pHeight ); [propput] HRESULT Owner( [in] OAHWND Owner ); [propget] HRESULT Owner( [out] OAHWND *Owner ); [propput] HRESULT MessageDrain( [in] OAHWND Drain ); [propget] HRESULT MessageDrain( [out] OAHWND *Drain ); - [propget] HRESULT BorderColor( [out] long *Color ); - [propput] HRESULT BorderColor( [in] long Color ); - [propget] HRESULT FullScreenMode( [out] long *FullScreenMode ); - [propput] HRESULT FullScreenMode( [in] long FullScreenMode ); - HRESULT SetWindowForeground( [in] long Focus ); - HRESULT NotifyOwnerMessage( [in] OAHWND hwnd, [in] long uMsg, [in] LONG_PTR wParam, [in] LONG_PTR lParam ); - HRESULT SetWindowPosition( [in] long Left, [in] long Top, [in] long Width, [in] long Height ); - HRESULT GetWindowPosition( [out] long *pLeft, [out] long *pTop, [out] long *pWidth, [out] long *pHeight ); - HRESULT GetMinIdealImageSize( [out] long *pWidth, [out] long *pHeight ); - HRESULT GetMaxIdealImageSize( [out] long *pWidth, [out] long *pHeight ); - HRESULT GetRestorePosition( [out] long *pLeft, [out] long *pTop, [out] long *pWidth, [out] long *pHeight ); - HRESULT HideCursor( [in] long HideCursor ); - HRESULT IsCursorHidden( [out] long *CursorHidden ); + [propget] HRESULT BorderColor( [out] LONG *Color ); + [propput] HRESULT BorderColor( [in] LONG Color ); + [propget] HRESULT FullScreenMode( [out] LONG *FullScreenMode ); + [propput] HRESULT FullScreenMode( [in] LONG FullScreenMode ); + HRESULT SetWindowForeground( [in] LONG Focus ); + HRESULT NotifyOwnerMessage( [in] OAHWND hwnd, [in] LONG uMsg, [in] LONG_PTR wParam, [in] LONG_PTR lParam ); + HRESULT SetWindowPosition( [in] LONG Left, [in] LONG Top, [in] LONG Width, [in] LONG Height ); + HRESULT GetWindowPosition( [out] LONG *pLeft, [out] LONG *pTop, [out] LONG *pWidth, [out] LONG *pHeight ); + HRESULT GetMinIdealImageSize( [out] LONG *pWidth, [out] LONG *pHeight ); + HRESULT GetMaxIdealImageSize( [out] LONG *pWidth, [out] LONG *pHeight ); + HRESULT GetRestorePosition( [out] LONG *pLeft, [out] LONG *pTop, [out] LONG *pWidth, [out] LONG *pHeight ); + HRESULT HideCursor( [in] LONG HideCursor ); + HRESULT IsCursorHidden( [out] LONG *CursorHidden ); } @@ -138,39 +138,39 @@ interface IVideoWindow : IDispatch interface IBasicVideo : IDispatch { [propget] HRESULT AvgTimePerFrame( [out] REFTIME *pAvgTimePerFrame ); - [propget] HRESULT BitRate( [out] long *pBitRate ); - [propget] HRESULT BitErrorRate( [out] long *pBitErrorRate ); - [propget] HRESULT VideoWidth( [out] long *pVideoWidth ); - [propget] HRESULT VideoHeight( [out] long *pVideoHeight ); - [propput] HRESULT SourceLeft( [in] long SourceLeft ); - [propget] HRESULT SourceLeft( [out] long *pSourceLeft ); - [propput] HRESULT SourceWidth( [in] long SourceWidth ); - [propget] HRESULT SourceWidth( [out] long *pSourceWidth ); - [propput] HRESULT SourceTop( [in] long SourceTop ); - [propget] HRESULT SourceTop( [out] long *pSourceTop ); - [propput] HRESULT SourceHeight( [in] long SourceHeight ); - [propget] HRESULT SourceHeight( [out] long *pSourceHeight ); - [propput] HRESULT DestinationLeft( [in] long DestinationLeft ); - [propget] HRESULT DestinationLeft( [out] long *pDestinationLeft ); - [propput] HRESULT DestinationWidth( [in] long DestinationWidth ); - [propget] HRESULT DestinationWidth( [out] long *pDestinationWidth ); - [propput] HRESULT DestinationTop( [in] long DestinationTop ); - [propget] HRESULT DestinationTop( [out] long *pDestinationTop ); - [propput] HRESULT DestinationHeight( [in] long DestinationHeight ); - [propget] HRESULT DestinationHeight( [out] long *pDestinationHeight ); - HRESULT SetSourcePosition( [in] long Left, [in] long Top, [in] long Width, [in] long Height ); - HRESULT GetSourcePosition( [out] long *pLeft, [out] long *pTop, [out] long *pWidth, [out] long *pHeight ); + [propget] HRESULT BitRate( [out] LONG *pBitRate ); + [propget] HRESULT BitErrorRate( [out] LONG *pBitErrorRate ); + [propget] HRESULT VideoWidth( [out] LONG *pVideoWidth ); + [propget] HRESULT VideoHeight( [out] LONG *pVideoHeight ); + [propput] HRESULT SourceLeft( [in] LONG SourceLeft ); + [propget] HRESULT SourceLeft( [out] LONG *pSourceLeft ); + [propput] HRESULT SourceWidth( [in] LONG SourceWidth ); + [propget] HRESULT SourceWidth( [out] LONG *pSourceWidth ); + [propput] HRESULT SourceTop( [in] LONG SourceTop ); + [propget] HRESULT SourceTop( [out] LONG *pSourceTop ); + [propput] HRESULT SourceHeight( [in] LONG SourceHeight ); + [propget] HRESULT SourceHeight( [out] LONG *pSourceHeight ); + [propput] HRESULT DestinationLeft( [in] LONG DestinationLeft ); + [propget] HRESULT DestinationLeft( [out] LONG *pDestinationLeft ); + [propput] HRESULT DestinationWidth( [in] LONG DestinationWidth ); + [propget] HRESULT DestinationWidth( [out] LONG *pDestinationWidth ); + [propput] HRESULT DestinationTop( [in] LONG DestinationTop ); + [propget] HRESULT DestinationTop( [out] LONG *pDestinationTop ); + [propput] HRESULT DestinationHeight( [in] LONG DestinationHeight ); + [propget] HRESULT DestinationHeight( [out] LONG *pDestinationHeight ); + HRESULT SetSourcePosition( [in] LONG Left, [in] LONG Top, [in] LONG Width, [in] LONG Height ); + HRESULT GetSourcePosition( [out] LONG *pLeft, [out] LONG *pTop, [out] LONG *pWidth, [out] LONG *pHeight ); HRESULT SetDefaultSourcePosition(); - HRESULT SetDestinationPosition( [in] long Left, [in] long Top, [in] long Width, [in] long Height ); - HRESULT GetDestinationPosition( [out] long *pLeft, [out] long *pTop, [out] long *pWidth, [out] long *pHeight ); + HRESULT SetDestinationPosition( [in] LONG Left, [in] LONG Top, [in] LONG Width, [in] LONG Height ); + HRESULT GetDestinationPosition( [out] LONG *pLeft, [out] LONG *pTop, [out] LONG *pWidth, [out] LONG *pHeight ); HRESULT SetDefaultDestinationPosition(); - HRESULT GetVideoSize( [out] long *pWidth, [out] long *pHeight ); - HRESULT GetVideoPaletteEntries( [in] long StartIndex, - [in] long Entries, - [out] long *pRetrieved, - [out, size_is(Entries), length_is(*pRetrieved)] long *pPalette ); - HRESULT GetCurrentImage( [in, out] long *pBufferSize, - [out, size_is(*pBufferSize), length_is(*pBufferSize)] long *pDIBImage ); + HRESULT GetVideoSize( [out] LONG *pWidth, [out] LONG *pHeight ); + HRESULT GetVideoPaletteEntries( [in] LONG StartIndex, + [in] LONG Entries, + [out] LONG *pRetrieved, + [out, size_is(Entries), length_is(*pRetrieved)] LONG *pPalette ); + HRESULT GetCurrentImage( [in, out] LONG *pBufferSize, + [out, size_is(*pBufferSize), length_is(*pBufferSize)] LONG *pDIBImage ); HRESULT IsUsingDefaultSource(); HRESULT IsUsingDefaultDestination(); } @@ -198,11 +198,11 @@ interface IBasicVideo2 : IBasicVideo interface IMediaEvent : IDispatch { HRESULT GetEventHandle( [out] OAEVENT *hEvent ); - HRESULT GetEvent( [out] long *lEventCode, [out] LONG_PTR *lParam1, [out] LONG_PTR *lParam2, [in] long msTimeout ); - HRESULT WaitForCompletion( [in] long msTimeout, [out] long *pEvCode ); - HRESULT CancelDefaultHandling( [in] long lEvCode ); - HRESULT RestoreDefaultHandling( [in] long lEvCode ); - HRESULT FreeEventParams( [in] long lEvCode, [in] LONG_PTR lParam1, [in] LONG_PTR lParam2 ); + HRESULT GetEvent( [out] LONG *lEventCode, [out] LONG_PTR *lParam1, [out] LONG_PTR *lParam2, [in] LONG msTimeout ); + HRESULT WaitForCompletion( [in] LONG msTimeout, [out] LONG *pEvCode ); + HRESULT CancelDefaultHandling( [in] LONG lEvCode ); + HRESULT RestoreDefaultHandling( [in] LONG lEvCode ); + HRESULT FreeEventParams( [in] LONG lEvCode, [in] LONG_PTR lParam1, [in] LONG_PTR lParam2 ); } @@ -216,9 +216,9 @@ interface IMediaEvent : IDispatch ] interface IMediaEventEx : IMediaEvent { - HRESULT SetNotifyWindow( [in] OAHWND hwnd, [in] long lMsg, [in] LONG_PTR lInstanceData ); - HRESULT SetNotifyFlags( [in] long lNoNotifyFlags ); - HRESULT GetNotifyFlags( [out] long *lplNoNotifyFlags ); + HRESULT SetNotifyWindow( [in] OAHWND hwnd, [in] LONG lMsg, [in] LONG_PTR lInstanceData ); + HRESULT SetNotifyFlags( [in] LONG lNoNotifyFlags ); + HRESULT GetNotifyFlags( [out] LONG *lplNoNotifyFlags ); } @@ -244,3 +244,21 @@ interface IMediaPosition : IDispatch HRESULT CanSeekForward( [out] LONG *pCanSeekForward ); HRESULT CanSeekBackward( [out] LONG *pCanSeekBackward ); } + +/***************************************************************************** + * IDeferredCommand interface + */ +[ + object, + uuid(56a868b8-0ad4-11ce-b03a-0020af0ba770), + pointer_default(unique) +] +interface IDeferredCommand : IUnknown +{ + HRESULT Cancel( void); + HRESULT Confidence([out] LONG *pConfidence); + HRESULT Postpone([in] REFTIME newtime); + HRESULT GetHResult([out] HRESULT *phrResult); + +} + diff --git a/reactos/include/psdk/crtrow.idl b/reactos/include/psdk/crtrow.idl new file mode 100644 index 00000000000..7088e00e721 --- /dev/null +++ b/reactos/include/psdk/crtrow.idl @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + object, + uuid(0c733ab2-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface ICreateRow : IUnknown +{ + [local] + HRESULT CreateRow([in, unique] IUnknown *pUnkOuter, + [in] LPCOLESTR pwszURL, + [in] DBBINDURLFLAG dwBindURLFlags, + [in] REFGUID rguid, + [in] REFIID riid, + [in, unique] IAuthenticate *pAuthenticate, + [in, out, unique] DBIMPLICITSESSION *pImplSession, + [in, out, unique] DBBINDURLSTATUS *pdwBindStatus, + [out, annotation("__deref_opt_out_opt")] LPOLESTR *ppwszNewURL, + [out, iid_is(riid)] IUnknown **ppUnk); + + [call_as(CreateRow)] + HRESULT RemoteCreateRow([in] IUnknown *pUnkOuter, + [in] LPCOLESTR pwszURL, + [in] DBBINDURLFLAG dwBindURLFlags, + [in] REFGUID rguid, + [in] REFIID riid, + [in] IAuthenticate *pAuthenticate, + [in] IUnknown *pSessionUnkOuter, + [in, unique] IID *piid, + [in, out, unique, iid_is(piid)] IUnknown **ppSession, + [in, out, unique] DBBINDURLSTATUS *pdwBindStatus, + [in, out, unique] LPOLESTR *ppwszNewURL, + [out, iid_is(riid)] IUnknown **ppUnk); +} diff --git a/reactos/include/psdk/ctfutb.idl b/reactos/include/psdk/ctfutb.idl new file mode 100644 index 00000000000..6d80b3890dd --- /dev/null +++ b/reactos/include/psdk/ctfutb.idl @@ -0,0 +1,73 @@ +/* + * Copyright 2010 Justin Chevrier + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef DO_NO_IMPORTS +import "oaidl.idl"; +#endif + +interface ITfLangBarEventSink; +interface ITfLangBarItemMgr; +interface ITfInputProcessorProfiles; + +[ + object, + uuid(87955690-e627-11d2-8ddb-00105a2799b5), + pointer_default(unique) +] +interface ITfLangBarMgr: IUnknown +{ + HRESULT AdviseEventSink( + [in] ITfLangBarEventSink *pSink, + [in] HWND hwnd, + [in] DWORD dwflags, + [in] DWORD *pdwCookie); + + HRESULT UnAdviseEventSink( + [in] DWORD dwCookie); + + HRESULT GetThreadMarshalInterface( + [in] DWORD dwThreadId, + [in] DWORD dwType, + [in] REFIID riid, + [out] IUnknown **ppunk); + + HRESULT GetThreadLangBarItemMgr( + [in] DWORD dwThreadId, + [out] ITfLangBarItemMgr **pplbie, + [out] DWORD *pdwThreadid); + + HRESULT GetInputProcessorProfiles( + [in] DWORD dwThreadId, + [out] ITfInputProcessorProfiles **ppaip, + [out] DWORD *pdwThreadid); + + HRESULT RestoreLastFocus( + [out] DWORD *dwThreadId, + [in] BOOL fPrev); + + HRESULT SetModalInput( + [in] ITfLangBarEventSink *pSink, + [in] DWORD dwThreadId, + [in] DWORD dwFlags); + + HRESULT ShowFloating( + [in] DWORD dwFlags); + + HRESULT GetShowFloatingStatus( + [out] DWORD *pdwFlags); +}; diff --git a/reactos/include/psdk/dbccmd.idl b/reactos/include/psdk/dbccmd.idl new file mode 100644 index 00000000000..99274bc05ba --- /dev/null +++ b/reactos/include/psdk/dbccmd.idl @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + object, + uuid(0c733a1d-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface IDBCreateCommand : IUnknown +{ + [local] + HRESULT CreateCommand([in] IUnknown *pUnkOuter, + [in] REFIID riid, + [out, iid_is(riid)] IUnknown **ppCommand); + + [call_as(CreateCommand)] + HRESULT RemoteCreateCommand([in] IUnknown *pUnkOuter, + [in] REFIID riid, + [out, iid_is(riid)] IUnknown **ppCommand, + [out] IErrorInfo **ppErrorInfoRem); +} diff --git a/reactos/include/psdk/dbcses.idl b/reactos/include/psdk/dbcses.idl new file mode 100644 index 00000000000..3bdb0d779d4 --- /dev/null +++ b/reactos/include/psdk/dbcses.idl @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + object, + uuid(0c733a5d-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface IDBCreateSession : IUnknown +{ + [local] + HRESULT CreateSession([in] IUnknown *pUnkOuter, + [in] REFIID riid, + [out, iid_is(riid)] IUnknown **ppDBSession); + + [call_as(CreateSession)] + HRESULT RemoteCreateSession([in] IUnknown *pUnkOuter, + [in] REFIID riid, + [out, iid_is(riid)] IUnknown **ppDBSession, + [out] IErrorInfo **ppErrorInfoRem); +} diff --git a/reactos/include/psdk/dbdsad.idl b/reactos/include/psdk/dbdsad.idl new file mode 100644 index 00000000000..c6fb2b4ea4b --- /dev/null +++ b/reactos/include/psdk/dbdsad.idl @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + object, + uuid(0c733a7a-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface IDBDataSourceAdmin : IUnknown +{ + [local] + HRESULT CreateDataSource([in] ULONG cPropertySets, + [in, out, size_is(cPropertySets)] DBPROPSET rgPropertySets[], + [in] IUnknown *pUnkOuter, + [in] REFIID riid, + [out, iid_is(riid)] IUnknown **ppDBSession); + + [call_as(CreateDataSource)] + HRESULT RemoteCreateDataSource([in] ULONG cPropertySets, + [in, unique, size_is(cPropertySets)] DBPROPSET *rgPropertySets, + [in] IUnknown *pUnkOuter, + [in] REFIID riid, + [in, out, unique, iid_is(riid)] IUnknown **ppDBSession, + [in] ULONG cTotalProps, + [out, size_is(cTotalProps)] DBPROPSTATUS *rgPropStatus, + [out] IErrorInfo **ppErrorInfoRem); + + [local] + HRESULT DestroyDataSource(); + + [call_as(DestroyDataSource)] + HRESULT RemoteDestroyDataSource([out] IErrorInfo **ppErrorInfoRem); + + [local] + HRESULT GetCreationProperties([in] ULONG cPropertyIDSets, + [in, size_is(cPropertyIDSets)] const DBPROPIDSET rgPropertyIDSets[], + [in, out] ULONG *pcPropertyInfoSets, + [out, size_is(,*pcPropertyInfoSets)] DBPROPINFOSET **prgPropertyInfoSets, + [out, annotation("__deref_out_z_opt")] OLECHAR **ppDescBuffer); + + [call_as(GetCreationProperties)] + HRESULT RemoteGetCreationProperties([in] ULONG cPropertyIDSets, + [in, unique, size_is(cPropertyIDSets)] const DBPROPIDSET *rgPropertyIDSets, + [in, out] ULONG *pcPropertyInfoSets, + [out, size_is(,*pcPropertyInfoSets)] DBPROPINFOSET **prgPropertyInfoSets, + [in, out] DBCOUNTITEM *pcOffsets, + [out, size_is(,(ULONG)*pcOffsets)] DBBYTEOFFSET **prgDescOffsets, + [in, out] ULONG *pcbDescBuffer, + [in, out, unique, size_is(,*pcbDescBuffer)] OLECHAR **ppDescBuffer, + [out] IErrorInfo **ppErrorInfoRem); + + [local] + HRESULT ModifyDataSource([in] ULONG cPropertySets, + [in, size_is(cPropertySets)] DBPROPSET rgPropertySets[]); + + [call_as(ModifyDataSource)] + HRESULT RemoteModifyDataSource([in] ULONG cPropertySets, + [in, size_is(cPropertySets)] DBPROPSET *rgPropertySets, + [out] IErrorInfo **ppErrorInfoRem); +} diff --git a/reactos/include/psdk/dbprop.idl b/reactos/include/psdk/dbprop.idl index 5ed5301385f..782191a4554 100644 --- a/reactos/include/psdk/dbprop.idl +++ b/reactos/include/psdk/dbprop.idl @@ -30,7 +30,7 @@ interface IDBProperties : IUnknown { [call_as(GetProperties)] HRESULT RemoteGetProperties( [in] ULONG cPropertyIDSets, - [in, size_is(cPropertyIDSets)] const DBPROPIDSET rgPropertyIDSets[], + [in, unique, size_is(cPropertyIDSets)] const DBPROPIDSET *rgPropertyIDSets, [in, out] ULONG *pcPropertySets, [out, size_is(,*pcPropertySets)] DBPROPSET **prgPropertySets, [out] IErrorInfo **ppErrorInfoRem); @@ -39,17 +39,18 @@ interface IDBProperties : IUnknown { [in] ULONG cPropertyIDSets, [in, size_is(cPropertyIDSets)] const DBPROPIDSET rgPropertyIDSets[], [in, out] ULONG *pcPropertyInfoSets, - [out, size_is(,*pcPropertyInfoSets)] DBPROPINFOSET **prgPropertyInfoSets); + [out, size_is(,*pcPropertyInfoSets)] DBPROPINFOSET **prgPropertyInfoSets, + [out, annotation("__deref_out_z_opt")] OLECHAR **ppDescBuffer); [call_as(GetPropertyInfo)] HRESULT RemoteGetPropertyInfo( [in] ULONG cPropertyIDSets, - [in,size_is(cPropertyIDSets)] const DBPROPIDSET *rgPropertyIDSets, + [in, unique, size_is(cPropertyIDSets)] const DBPROPIDSET *rgPropertyIDSets, [in, out] ULONG *pcPropertyInfoSets, [out, size_is(,*pcPropertyInfoSets)] DBPROPINFOSET **prgPropertyInfoSets, [in, out] ULONG *pcOffsets, [out, size_is(,*pcOffsets)] DBBYTEOFFSET **prgDescOffsets, [in, out] ULONG *pcbDescBuffer, - [out, size_is(,*pcbDescBuffer)] OLECHAR **ppDescBuffer, + [in, out, unique, size_is(,*pcbDescBuffer)] OLECHAR **ppDescBuffer, [out] IErrorInfo **ppErrorInfoRem); [local] HRESULT SetProperties( @@ -58,7 +59,7 @@ interface IDBProperties : IUnknown { [call_as(SetProperties)] HRESULT RemoteSetProperties( [in] ULONG cPropertySets, - [in, out, size_is(cPropertySets)] DBPROPSET *rgPropertySets, + [in, unique, size_is(cPropertySets)] DBPROPSET *rgPropertySets, [in] ULONG cTotalProps, [out, size_is(cTotalProps)] DBPROPSTATUS *rgPropStatus, [out] IErrorInfo **ppErrorInfoRem); diff --git a/reactos/include/psdk/dbs.idl b/reactos/include/psdk/dbs.idl index 19c2997b3ab..8ca2e2ae659 100644 --- a/reactos/include/psdk/dbs.idl +++ b/reactos/include/psdk/dbs.idl @@ -99,3 +99,247 @@ typedef struct tagDBPROPINFOSET { ULONG cPropertyInfos; GUID guidPropertySet; } DBPROPINFOSET; + +typedef DWORD DBBINDURLFLAG; +typedef DWORD DBBINDURLSTATUS; + +typedef struct tagDBIMPLICITSESSION +{ + IUnknown *pUnkOuter; + IID *piid; + IUnknown *pSession; +} DBIMPLICITSESSION; + +typedef WORD DBTYPE; + +enum DBTYPEENUM +{ + DBTYPE_EMPTY = 0, + DBTYPE_NULL = 1, + DBTYPE_I2 = 2, + DBTYPE_I4 = 3, + DBTYPE_R4 = 4, + DBTYPE_R8 = 5, + DBTYPE_CY = 6, + DBTYPE_DATE = 7, + DBTYPE_BSTR = 8, + DBTYPE_IDISPATCH = 9, + DBTYPE_ERROR = 10, + DBTYPE_BOOL = 11, + DBTYPE_VARIANT = 12, + DBTYPE_IUNKNOWN = 13, + DBTYPE_DECIMAL = 14, + DBTYPE_I1 = 16, + DBTYPE_UI1 = 17, + DBTYPE_UI2 = 18, + DBTYPE_UI4 = 19, + DBTYPE_I8 = 20, + DBTYPE_UI8 = 21, + DBTYPE_GUID = 72, + DBTYPE_BYTES = 128, + DBTYPE_STR = 129, + DBTYPE_WSTR = 130, + DBTYPE_NUMERIC = 131, + DBTYPE_UDT = 132, + DBTYPE_DBDATE = 133, + DBTYPE_DBTIME = 134, + DBTYPE_DBTIMESTAMP = 135, + + DBTYPE_VECTOR = 0x1000, + DBTYPE_ARRAY = 0x2000, + DBTYPE_BYREF = 0x4000, + DBTYPE_RESERVED = 0x8000 +}; + +enum DBTYPEENUM15 +{ + DBTYPE_HCHAPTER = 136 +}; + +enum DBTYPEENUM20 +{ + DBTYPE_FILETIME = 64, + DBTYPE_PROPVARIANT = 138, + DBTYPE_VARNUMERIC = 139 +}; + +typedef DWORD DBSTATUS; + +enum DBSTATUSENUM +{ + DBSTATUS_S_OK = 0, + DBSTATUS_E_BADACCESSOR = 1, + DBSTATUS_E_CANTCONVERTVALUE = 2, + DBSTATUS_S_ISNULL = 3, + DBSTATUS_S_TRUNCATED = 4, + DBSTATUS_E_SIGNMISMATCH = 5, + DBSTATUS_E_DATAOVERFLOW = 6, + DBSTATUS_E_CANTCREATE = 7, + DBSTATUS_E_UNAVAILABLE = 8, + DBSTATUS_E_PERMISSIONDENIED = 9, + DBSTATUS_E_INTEGRITYVIOLATION = 10, + DBSTATUS_E_SCHEMAVIOLATION = 11, + DBSTATUS_E_BADSTATUS = 12, + DBSTATUS_S_DEFAULT = 13 +}; + +cpp_quote("#ifdef DBINITCONSTANTS") +cpp_quote("#ifdef __cplusplus") +cpp_quote("#define DEFINE_DBGUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \\") +cpp_quote(" EXTERN_C const GUID name DECLSPEC_HIDDEN; \\") +cpp_quote(" EXTERN_C const GUID name = \\") +cpp_quote(" { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }") +cpp_quote("#else") +cpp_quote("#define DEFINE_DBGUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \\") +cpp_quote(" const GUID name DECLSPEC_HIDDEN; \\") +cpp_quote(" const GUID name = \\") +cpp_quote(" { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }") +cpp_quote("#endif") +cpp_quote("#else") +cpp_quote("#define DEFINE_DBGUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \\") +cpp_quote(" EXTERN_C const GUID name DECLSPEC_HIDDEN") +cpp_quote("#endif") + +cpp_quote("DEFINE_DBGUID(DBGUID_SESSION, 0xc8b522f5, 0x5cf3, 0x11ce, 0xad, 0xe5, 0x00, 0xaa, 0x00, 0x44, 0x77, 0x3d);") +cpp_quote("DEFINE_DBGUID(DBGUID_ROWSET, 0xc8b522f6, 0x5cf3, 0x11ce, 0xad, 0xe5, 0x00, 0xaa, 0x00, 0x44, 0x77, 0x3d);") +cpp_quote("DEFINE_DBGUID(DBGUID_ROW, 0xc8b522f7, 0x5cf3, 0x11ce, 0xad, 0xe5, 0x00, 0xaa, 0x00, 0x44, 0x77, 0x3d);") +cpp_quote("DEFINE_DBGUID(DBGUID_STREAM, 0xc8b522f9, 0x5cf3, 0x11ce, 0xad, 0xe5, 0x00, 0xaa, 0x00, 0x44, 0x77, 0x3d);") + +typedef struct tagDBCOLUMNACCESS +{ + void *pData; + DBID columnid; + DBLENGTH cbDataLen; + DBSTATUS dwStatus; + DBLENGTH cbMaxLen; + DB_DWRESERVE dwReserved; + DBTYPE wType; + BYTE bPrecision; + BYTE bScale; +} DBCOLUMNACCESS; + +typedef DWORD DBROWSTATUS; + +enum DBROWSTATUSENUM +{ + DBROWSTATUS_S_OK = 0, + /* FIXME */ + DBROWSTATUS_E_FAIL = 19, + +}; + +typedef DWORD DBPART; + +enum DBPARTENUM +{ + DBPART_INVALID = 0, + DBPART_VALUE = 1, + DBPART_LENGTH = 2, + DBPART_STATUS = 4, +}; + +typedef DWORD DBPARAMIO; + +enum DBPARAMIOENUM +{ + DBPARAMIO_NOTPARAM = 0, + DBPARAMIO_INPUT = 1, + DBPARAMIO_OUTPUT = 2, +}; + +typedef DWORD DBMEMOWNER; + +enum DBMEMOWNERENUM +{ + DBMEMOWNER_CLIENTOWNED = 0, + DBMEMOWNER_PROVIDEROWNED = 1, +}; + +typedef struct tagDBOBJECT +{ + DWORD dwFlags; + IID iid; +} DBOBJECT; + +typedef struct tagDBBINDEXT +{ + [size_is((ULONG)ulExtension)] BYTE *pExtension; + DBCOUNTITEM ulExtension; +} DBBINDEXT; + +typedef struct tagDBBINDING +{ + DBORDINAL iOrdinal; + DBBYTEOFFSET obValue; + DBBYTEOFFSET obLength; + DBBYTEOFFSET obStatus; + ITypeInfo *pTypeInfo; + DBOBJECT *pObject; + DBBINDEXT *pBindExt; + DBPART dwPart; + DBMEMOWNER dwMemOwner; + DBPARAMIO eParamIO; + DBLENGTH cbMaxLen; + DWORD dwFlags; + DBTYPE wType; + BYTE bPrecision; + BYTE bScale; +} DBBINDING; + +typedef ULONG_PTR HACCESSOR; + +cpp_quote("#define DB_INVALID_HACCESSOR 0x00") + +typedef ULONG_PTR HROW; + +cpp_quote("#define DB_NULL_HROW 0x00") + +typedef ULONG_PTR HWATCHREGION; + +cpp_quote("#define DBWATCHREGION_NULL NULL") + +typedef ULONG_PTR HCHAPTER; + +cpp_quote("#define DB_NULL_HCHAPTER 0x00") + +typedef struct tagDBPARAMS +{ + void *pData; + DB_UPARAMS cParamSets; + HACCESSOR hAccessor; +} DBPARAMS; + +typedef DWORD DBASYNCHOP; + +enum DBASYNCHOPENUM +{ + DBSYNCHOP_OPEN, +}; + +typedef DWORD DBASYNCHPHASE; + +enum DBASYNCHPHASEENUM +{ + DBASYNCHPHASE_INITIALIZATION, + DBASYNCHPHASE_POPULATION, + DBASYNCHPHASE_COMPLETE, + DBASYNCHPHASE_CANCELED, +}; + +typedef struct tagRMTPACK +{ + ISequentialStream *pISeqStream; + ULONG cbData; + ULONG cBSTR; + [size_is(cBSTR)] BSTR *rgBSTR; + ULONG cVARIANT; + [size_is(cVARIANT)] VARIANT *rgVARIANT; + ULONG cIDISPATCH; + [size_is(cIDISPATCH)] IDispatch **rgIDISPATCH; + ULONG cIUNKNOWN; + [size_is(cIUNKNOWN)] IUnknown **rgIUNKNOWN; + ULONG cPROPVARIANT; + [size_is(cPROPVARIANT)] PROPVARIANT *rgPROPVARIANT; + ULONG cArray; + [size_is(cArray)] VARIANT *rgArray; +} RMTPACK; diff --git a/reactos/include/psdk/dimm.idl b/reactos/include/psdk/dimm.idl index 07e04b2e22f..851ec90cfd1 100644 --- a/reactos/include/psdk/dimm.idl +++ b/reactos/include/psdk/dimm.idl @@ -24,8 +24,6 @@ cpp_quote("#include ") cpp_quote("#if 0") -typedef WORD LANGID; - typedef struct { LPSTR lpReading; LPSTR lpWord; diff --git a/reactos/include/psdk/dispex.idl b/reactos/include/psdk/dispex.idl index b44448e84d9..6f1c5453a61 100644 --- a/reactos/include/psdk/dispex.idl +++ b/reactos/include/psdk/dispex.idl @@ -23,6 +23,9 @@ import "oaidl.idl"; import "servprov.idl"; #endif +cpp_quote("DEFINE_GUID(SID_VariantConversion, 0x1f101481,0xbccd,0x11d0,0x93,0x36,0x00,0xa0,0xc9,0xd,0xca,0xa9);") +cpp_quote("DEFINE_GUID(SID_GetCaller, 0x4717cc40,0xbcb9,0x11d0,0x93,0x36,0x00,0xa0,0xc9,0xd,0xca,0xa9);") + cpp_quote("#define fdexNameCaseSensitive 0x00000001L") cpp_quote("#define fdexNameEnsure 0x00000002L") cpp_quote("#define fdexNameImplicit 0x00000004L") @@ -78,13 +81,13 @@ interface IDispatchEx : IDispatch [local] HRESULT InvokeEx( - [in] DISPID id, - [in] LCID lcid, - [in] WORD wFlags, - [in] DISPPARAMS *pdp, - [out] VARIANT *pvarRes, - [out] EXCEPINFO *pei, - [in, unique] IServiceProvider *pspCaller); + [in, annotation("__in")] DISPID id, + [in, annotation("__in")] LCID lcid, + [in, annotation("__in")] WORD wFlags, + [in, annotation("__in")] DISPPARAMS *pdp, + [out, annotation("__out_opt")] VARIANT *pvarRes, + [out, annotation("__out_opt")] EXCEPINFO *pei, + [in, unique, annotation("__in_opt")] IServiceProvider *pspCaller); [call_as(InvokeEx)] HRESULT RemoteInvokeEx( @@ -188,3 +191,15 @@ interface ICanHandleException : IUnknown [in] EXCEPINFO *pExcepInfo, [in] VARIANT *pvar); } + +[ + object, + uuid(10e2414a-ec59-49d2-bc51-5add2c36febc), + pointer_default(unique) +] +interface IProvideRuntimeContext : IUnknown +{ + HRESULT GetCurrentSourceContext( + [out] DWORD_PTR *pdwContext, + [out] VARIANT_BOOL *pfExecutingGlobalCode); +} diff --git a/reactos/include/psdk/dpfilter.h b/reactos/include/psdk/dpfilter.h new file mode 100644 index 00000000000..912549b41af --- /dev/null +++ b/reactos/include/psdk/dpfilter.h @@ -0,0 +1,267 @@ + +#define DPFLTR_ERROR_LEVEL 0 +#define DPFLTR_WARNING_LEVEL 1 +#define DPFLTR_TRACE_LEVEL 2 +#define DPFLTR_INFO_LEVEL 3 +#define DPFLTR_MASK 0x80000000 + +#if 1 +typedef enum _DPFLTR_TYPE +{ + DPFLTR_SYSTEM_ID = 0, + DPFLTR_SMSS_ID = 1, + DPFLTR_SETUP_ID = 2, + DPFLTR_NTFS_ID = 3, + DPFLTR_FSTUB_ID = 4, + DPFLTR_CRASHDUMP_ID = 5, + DPFLTR_CDAUDIO_ID = 6, + DPFLTR_CDROM_ID = 7, + DPFLTR_CLASSPNP_ID = 8, + DPFLTR_DISK_ID = 9, + DPFLTR_REDBOOK_ID = 10, + DPFLTR_STORPROP_ID = 11, + DPFLTR_SCSIPORT_ID = 12, + DPFLTR_SCSIMINIPORT_ID = 13, + DPFLTR_CONFIG_ID = 14, + DPFLTR_I8042PRT_ID = 15, + DPFLTR_SERMOUSE_ID = 16, + DPFLTR_LSERMOUS_ID = 17, + DPFLTR_KBDHID_ID = 18, + DPFLTR_MOUHID_ID = 19, + DPFLTR_KBDCLASS_ID = 20, + DPFLTR_MOUCLASS_ID = 21, + DPFLTR_TWOTRACK_ID = 22, + DPFLTR_WMILIB_ID = 23, + DPFLTR_ACPI_ID = 24, + DPFLTR_AMLI_ID = 25, + DPFLTR_HALIA64_ID = 26, + DPFLTR_VIDEO_ID = 27, + DPFLTR_SVCHOST_ID = 28, + DPFLTR_VIDEOPRT_ID = 29, + DPFLTR_TCPIP_ID = 30, + DPFLTR_DMSYNTH_ID = 31, + DPFLTR_NTOSPNP_ID = 32, + DPFLTR_FASTFAT_ID = 33, + DPFLTR_SAMSS_ID = 34, + DPFLTR_PNPMGR_ID = 35, + DPFLTR_NETAPI_ID = 36, + DPFLTR_SCSERVER_ID = 37, + DPFLTR_SCCLIENT_ID = 38, + DPFLTR_SERIAL_ID = 39, + DPFLTR_SERENUM_ID = 40, + DPFLTR_UHCD_ID = 41, + DPFLTR_BOOTOK_ID = 42, + DPFLTR_BOOTVRFY_ID = 43, + DPFLTR_RPCPROXY_ID = 44, + DPFLTR_AUTOCHK_ID = 45, + DPFLTR_DCOMSS_ID = 46, + DPFLTR_UNIMODEM_ID = 47, + DPFLTR_SIS_ID = 48, + DPFLTR_FLTMGR_ID = 49, + DPFLTR_WMICORE_ID = 50, + DPFLTR_BURNENG_ID = 51, + DPFLTR_IMAPI_ID = 52, + DPFLTR_SXS_ID = 53, + DPFLTR_FUSION_ID = 54, + DPFLTR_IDLETASK_ID = 55, + DPFLTR_SOFTPCI_ID = 56, + DPFLTR_TAPE_ID = 57, + DPFLTR_MCHGR_ID = 58, + DPFLTR_IDEP_ID = 59, + DPFLTR_PCIIDE_ID = 60, + DPFLTR_FLOPPY_ID = 61, + DPFLTR_FDC_ID = 62, + DPFLTR_TERMSRV_ID = 63, + DPFLTR_W32TIME_ID = 64, + DPFLTR_PREFETCHER_ID = 65, + DPFLTR_RSFILTER_ID = 66, + DPFLTR_FCPORT_ID = 67, + DPFLTR_PCI_ID = 68, + DPFLTR_DMIO_ID = 69, + DPFLTR_DMCONFIG_ID = 70, + DPFLTR_DMADMIN_ID = 71, + DPFLTR_WSOCKTRANSPORT_ID = 72, + DPFLTR_VSS_ID = 73, + DPFLTR_PNPMEM_ID = 74, + DPFLTR_PROCESSOR_ID = 75, + DPFLTR_DMSERVER_ID = 76, + DPFLTR_SR_ID = 77, + DPFLTR_INFINIBAND_ID = 78, + DPFLTR_IHVDRIVER_ID = 79, + DPFLTR_IHVVIDEO_ID = 80, + DPFLTR_IHVAUDIO_ID = 81, + DPFLTR_IHVNETWORK_ID = 82, + DPFLTR_IHVSTREAMING_ID = 83, + DPFLTR_IHVBUS_ID = 84, + DPFLTR_HPS_ID = 85, + DPFLTR_RTLTHREADPOOL_ID = 86, + DPFLTR_LDR_ID = 87, + DPFLTR_TCPIP6_ID = 88, + DPFLTR_ISAPNP_ID = 89, + DPFLTR_SHPC_ID = 90, + DPFLTR_STORPORT_ID = 91, + DPFLTR_STORMINIPORT_ID = 92, + DPFLTR_PRINTSPOOLER_ID = 93, + DPFLTR_VDS_ID = 94, + DPFLTR_VDSBAS_ID = 95, + DPFLTR_VDSDYNDR_ID = 96, + DPFLTR_VDSUTIL_ID = 97, + DPFLTR_DFRGIFC_ID = 98, + DPFLTR_DEFAULT_ID = 99, + DPFLTR_MM_ID = 100, + DPFLTR_DFSC_ID = 101, + DPFLTR_WOW64_ID = 102, + DPFLTR_ENDOFTABLE_ID +} DPFLTR_TYPE; +#else +typedef enum _DPFLTR_TYPE +{ + DPFLTR_SYSTEM_ID = 0, + DPFLTR_SMSS_ID = 1, + DPFLTR_SETUP_ID = 2, + DPFLTR_NTFS_ID = 3, + DPFLTR_FSTUB_ID = 4, + DPFLTR_CRASHDUMP_ID = 5, + DPFLTR_CDAUDIO_ID = 6, + DPFLTR_CDROM_ID = 7, + DPFLTR_CLASSPNP_ID = 8, + DPFLTR_DISK_ID = 9, + DPFLTR_REDBOOK_ID = 10, + DPFLTR_STORPROP_ID = 11, + DPFLTR_SCSIPORT_ID = 12, + DPFLTR_SCSIMINIPORT_ID = 13, + DPFLTR_CONFIG_ID = 14, + DPFLTR_I8042PRT_ID = 15, + DPFLTR_SERMOUSE_ID = 16, + DPFLTR_LSERMOUS_ID = 17, + DPFLTR_KBDHID_ID = 18, + DPFLTR_MOUHID_ID = 19, + DPFLTR_KBDCLASS_ID = 20, + DPFLTR_MOUCLASS_ID = 21, + DPFLTR_TWOTRACK_ID = 22, + DPFLTR_WMILIB_ID = 23, + DPFLTR_ACPI_ID = 24, + DPFLTR_AMLI_ID = 25, + DPFLTR_HALIA64_ID = 26, + DPFLTR_VIDEO_ID = 27, + DPFLTR_SVCHOST_ID = 28, + DPFLTR_VIDEOPRT_ID = 29, + DPFLTR_TCPIP_ID = 30, + DPFLTR_DMSYNTH_ID = 31, + DPFLTR_NTOSPNP_ID = 32, + DPFLTR_FASTFAT_ID = 33, + DPFLTR_SAMSS_ID = 34, + DPFLTR_PNPMGR_ID = 35, + DPFLTR_NETAPI_ID = 36, + DPFLTR_SCSERVER_ID = 37, + DPFLTR_SCCLIENT_ID = 38, + DPFLTR_SERIAL_ID = 39, + DPFLTR_SERENUM_ID = 40, + DPFLTR_UHCD_ID = 41, + DPFLTR_RPCPROXY_ID = 42, + DPFLTR_AUTOCHK_ID = 43, + DPFLTR_DCOMSS_ID = 44, + DPFLTR_UNIMODEM_ID = 45, + DPFLTR_SIS_ID = 46, + DPFLTR_FLTMGR_ID = 47, + DPFLTR_WMICORE_ID = 48, + DPFLTR_BURNENG_ID = 49, + DPFLTR_IMAPI_ID = 50, + DPFLTR_SXS_ID = 51, + DPFLTR_FUSION_ID = 52, + DPFLTR_IDLETASK_ID = 53, + DPFLTR_SOFTPCI_ID = 54, + DPFLTR_TAPE_ID = 55, + DPFLTR_MCHGR_ID = 56, + DPFLTR_IDEP_ID = 57, + DPFLTR_PCIIDE_ID = 58, + DPFLTR_FLOPPY_ID = 59, + DPFLTR_FDC_ID = 60, + DPFLTR_TERMSRV_ID = 61, + DPFLTR_W32TIME_ID = 62, + DPFLTR_PREFETCHER_ID = 63, + DPFLTR_RSFILTER_ID = 64, + DPFLTR_FCPORT_ID = 65, + DPFLTR_PCI_ID = 66, + DPFLTR_DMIO_ID = 67, + DPFLTR_DMCONFIG_ID = 68, + DPFLTR_DMADMIN_ID = 69, + DPFLTR_WSOCKTRANSPORT_ID = 70, + DPFLTR_VSS_ID = 71, + DPFLTR_PNPMEM_ID = 72, + DPFLTR_PROCESSOR_ID = 73, + DPFLTR_DMSERVER_ID = 74, + DPFLTR_SR_ID = 75, + DPFLTR_INFINIBAND_ID = 76, + DPFLTR_IHVDRIVER_ID = 77, + DPFLTR_IHVVIDEO_ID = 78, + DPFLTR_IHVAUDIO_ID = 79, + DPFLTR_IHVNETWORK_ID = 80, + DPFLTR_IHVSTREAMING_ID = 81, + DPFLTR_IHVBUS_ID = 82, + DPFLTR_HPS_ID = 83, + DPFLTR_RTLTHREADPOOL_ID = 84, + DPFLTR_LDR_ID = 85, + DPFLTR_TCPIP6_ID = 86, + DPFLTR_ISAPNP_ID = 87, + DPFLTR_SHPC_ID = 88, + DPFLTR_STORPORT_ID = 89, + DPFLTR_STORMINIPORT_ID = 90, + DPFLTR_PRINTSPOOLER_ID = 91, + DPFLTR_VSSDYNDISK_ID = 92, + DPFLTR_VERIFIER_ID = 93, + DPFLTR_VDS_ID = 94, + DPFLTR_VDSBAS_ID = 95, + DPFLTR_VDSDYN_ID = 96, + DPFLTR_VDSDYNDR_ID = 97, + DPFLTR_VDSLDR_ID = 98, + DPFLTR_VDSUTIL_ID = 99, + DPFLTR_DFRGIFC_ID = 100, + DPFLTR_DEFAULT_ID = 101, + DPFLTR_MM_ID = 102, + DPFLTR_DFSC_ID = 103, + DPFLTR_WOW64_ID = 104, + DPFLTR_ALPC_ID = 105, + DPFLTR_WDI_ID = 106, + DPFLTR_PERFLIB_ID = 107, + DPFLTR_KTM_ID = 108, + DPFLTR_IOSTRESS_ID = 109, + DPFLTR_HEAP_ID = 110, + DPFLTR_WHEA_ID = 111, + DPFLTR_USERGDI_ID = 112, + DPFLTR_MMCSS_ID = 113, + DPFLTR_TPM_ID = 114, + DPFLTR_THREADORDER_ID = 115, + DPFLTR_ENVIRON_ID = 116, + DPFLTR_EMS_ID = 117, + DPFLTR_WDT_ID = 118, + DPFLTR_FVEVOL_ID = 119, + DPFLTR_NDIS_ID = 120, + DPFLTR_NVCTRACE_ID = 121, + DPFLTR_LUAFV_ID = 122, + DPFLTR_APPCOMPAT_ID = 123, + DPFLTR_USBSTOR_ID = 124, + DPFLTR_SBP2PORT_ID = 125, + DPFLTR_COVERAGE_ID = 126, + DPFLTR_CACHEMGR_ID = 127, + DPFLTR_MOUNTMGR_ID = 128, + DPFLTR_CFR_ID = 129, + DPFLTR_TXF_ID = 130, + DPFLTR_KSECDD_ID = 131, + DPFLTR_FLTREGRESS_ID = 132, + DPFLTR_MPIO_ID = 133, + DPFLTR_MSDSM_ID = 134, + DPFLTR_UDFS_ID = 135, + DPFLTR_PSHED_ID = 136, + DPFLTR_STORVSP_ID = 137, + DPFLTR_LSASS_ID = 138, + DPFLTR_SSPICLI_ID = 139, + DPFLTR_CNG_ID = 140, + DPFLTR_EXFAT_ID = 141, + DPFLTR_FILETRACE_ID = 142, + DPFLTR_XSAVE_ID = 143, + DPFLTR_SE_ID = 144, + DPFLTR_DRIVEEXTENDER_ID = 145, + DPFLTR_ENDOFTABLE_ID +} DPFLTR_TYPE; +#endif diff --git a/reactos/include/psdk/gdipluscolormatrix.h b/reactos/include/psdk/gdipluscolormatrix.h index 532e8f4c788..fbf1b2a402f 100644 --- a/reactos/include/psdk/gdipluscolormatrix.h +++ b/reactos/include/psdk/gdipluscolormatrix.h @@ -45,7 +45,7 @@ enum ColorAdjustType struct ColorMap { Color oldColor; - Color newCOlor; + Color newColor; }; #ifndef __cplusplus diff --git a/reactos/include/psdk/hlink.idl b/reactos/include/psdk/hlink.idl index 886acb36411..af3f8f5f683 100644 --- a/reactos/include/psdk/hlink.idl +++ b/reactos/include/psdk/hlink.idl @@ -151,7 +151,7 @@ interface IHlink: IUnknown } /***************************************************************************** - * IHlink interface + * IHlinkSite interface */ [ object, diff --git a/reactos/include/psdk/iphlpapi.h b/reactos/include/psdk/iphlpapi.h index 1a844d38a49..56c32fdc087 100644 --- a/reactos/include/psdk/iphlpapi.h +++ b/reactos/include/psdk/iphlpapi.h @@ -22,6 +22,7 @@ DWORD WINAPI GetAdapterIndex(LPWSTR,PULONG); DWORD WINAPI GetAdaptersInfo(PIP_ADAPTER_INFO,PULONG); DWORD WINAPI GetBestInterface(IPAddr,PDWORD); DWORD WINAPI GetBestRoute(DWORD,DWORD,PMIB_IPFORWARDROW); +DWORD WINAPI GetExtendedTcpTable(PVOID,PDWORD,BOOL,ULONG,TCP_TABLE_CLASS,ULONG); DWORD WINAPI GetFriendlyIfIndex(DWORD); DWORD WINAPI GetIcmpStatistics(PMIB_ICMP); DWORD WINAPI GetIfEntry(PMIB_IFROW); @@ -34,6 +35,7 @@ DWORD WINAPI GetIpStatistics(PMIB_IPSTATS); DWORD WINAPI GetIpStatisticsEx(PMIB_IPSTATS,DWORD); DWORD WINAPI GetNetworkParams(PFIXED_INFO,PULONG); DWORD WINAPI GetNumberOfInterfaces(PDWORD); +DWORD WINAPI GetOwnerModuleFromTcpEntry(PMIB_TCPROW_OWNER_MODULE,TCPIP_OWNER_MODULE_INFO_CLASS,PVOID,PDWORD); DWORD WINAPI GetPerAdapterInfo(ULONG,PIP_PER_ADAPTER_INFO, PULONG); BOOL WINAPI GetRTTAndHopCount(IPAddr,PULONG,ULONG,PULONG); DWORD WINAPI GetTcpStatistics(PMIB_TCPSTATS); diff --git a/reactos/include/psdk/iprtrmib.h b/reactos/include/psdk/iprtrmib.h index a59796f0237..179a7938fde 100644 --- a/reactos/include/psdk/iprtrmib.h +++ b/reactos/include/psdk/iprtrmib.h @@ -25,6 +25,9 @@ #define MAXLEN_IFDESCR 256 #define MAXLEN_PHYSADDR 8 +//It should be 16 according to Lei Shen blog (http://www.mychinaworks.com/blog/lshen/2008/04/16/220/ +#define TCPIP_OWNING_MODULE_SIZE 16 + typedef struct _MIB_IFROW { WCHAR wszName[MAX_INTERFACE_NAME_LEN]; @@ -286,4 +289,31 @@ typedef struct _MIB_IPNETTABLE MIB_IPNETROW table[1]; } MIB_IPNETTABLE, *PMIB_IPNETTABLE; +typedef struct _MIB_TCPROW_OWNER_MODULE { + DWORD dwState; + DWORD dwLocalAddr; + DWORD dwLocalPort; + DWORD dwRemoteAddr; + DWORD dwRemotePort; + DWORD dwOwningPid; + LARGE_INTEGER liCreateTimestamp; + ULONGLONG OwningModuleInfo[TCPIP_OWNING_MODULE_SIZE]; +} MIB_TCPROW_OWNER_MODULE, *PMIB_TCPROW_OWNER_MODULE; + +typedef enum { + TCPIP_OWNER_MODULE_INFO_BASIC +} TCPIP_OWNER_MODULE_INFO_CLASS, *PTCPIP_OWNER_MODULE_INFO_CLASS; + +typedef enum { + TCP_TABLE_BASIC_LISTENER, + TCP_TABLE_BASIC_CONNECTIONS, + TCP_TABLE_BASIC_ALL, + TCP_TABLE_OWNER_PID_LISTENER, + TCP_TABLE_OWNER_PID_CONNECTIONS, + TCP_TABLE_OWNER_PID_ALL, + TCP_TABLE_OWNER_MODULE_LISTENER, + TCP_TABLE_OWNER_MODULE_CONNECTIONS, + TCP_TABLE_OWNER_MODULE_ALL +} TCP_TABLE_CLASS, *PTCP_TABLE_CLASS; + #endif /* WINE_IPRTRMIB_H__ */ diff --git a/reactos/include/psdk/ks.h b/reactos/include/psdk/ks.h index 430c1f0baa2..2249af3711a 100644 --- a/reactos/include/psdk/ks.h +++ b/reactos/include/psdk/ks.h @@ -290,7 +290,6 @@ typedef struct #if 0 #define KSINTERFACESETID_Media -#define KSINTERFACESETID_Standard #define KSINTERFACE_STANDARD_STREAMING #define KSINTERFACE_STANDARD_LOOPED_STREAMING #define KSINTERFACE_STANDARD_CONTROL @@ -337,22 +336,28 @@ DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000", KSMEDIUMSETID_Standard Clock Properties/Methods/Events */ -#define KSPROPSETID_Clock \ +#define STATIC_KSPROPSETID_Clock \ 0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 +DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000", KSPROPSETID_Clock); +#define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock) typedef enum { KSPROPERTY_CLOCK_TIME, KSPROPERTY_CLOCK_PHYSICALTIME, - KSPROPERTY_CORRELATEDTIME, - KSPROPERTY_CORRELATEDPHYSICALTIME, + KSPROPERTY_CLOCK_CORRELATEDTIME, + KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME, KSPROPERTY_CLOCK_RESOLUTION, KSPROPERTY_CLOCK_STATE, +#if defined(_NTDDK_) KSPROPERTY_CLOCK_FUNCTIONTABLE +#endif // defined(_NTDDK_) } KSPROPERTY_CLOCK; -#define KSEVENTSETID_Clock \ +#define STATIC_KSEVENTSETID_Clock \ 0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 +DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000", KSEVENTSETID_Clock); +#define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock) typedef enum { @@ -502,11 +507,12 @@ typedef enum Properties/Methods/Events */ -#define KSPROPSETID_MediaSeeking \ +#define STATIC_KSPROPSETID_MediaSeeking\ 0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 +DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196", KSPROPSETID_MediaSeeking); +#define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking) -typedef enum -{ +typedef enum { KSPROPERTY_MEDIASEEKING_CAPABILITIES, KSPROPERTY_MEDIASEEKING_FORMATS, KSPROPERTY_MEDIASEEKING_TIMEFORMAT, @@ -519,6 +525,126 @@ typedef enum KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT } KSPROPERTY_MEDIASEEKING; +typedef enum { + KS_SEEKING_NoPositioning, + KS_SEEKING_AbsolutePositioning, + KS_SEEKING_RelativePositioning, + KS_SEEKING_IncrementalPositioning, + KS_SEEKING_PositioningBitsMask = 0x3, + KS_SEEKING_SeekToKeyFrame, + KS_SEEKING_ReturnTime = 0x8 +} KS_SEEKING_FLAGS; + +typedef enum { + KS_SEEKING_CanSeekAbsolute = 0x1, + KS_SEEKING_CanSeekForwards = 0x2, + KS_SEEKING_CanSeekBackwards = 0x4, + KS_SEEKING_CanGetCurrentPos = 0x8, + KS_SEEKING_CanGetStopPos = 0x10, + KS_SEEKING_CanGetDuration = 0x20, + KS_SEEKING_CanPlayBackwards = 0x40 +} KS_SEEKING_CAPABILITIES; + +typedef struct { + LONGLONG Current; + LONGLONG Stop; + KS_SEEKING_FLAGS CurrentFlags; + KS_SEEKING_FLAGS StopFlags; +} KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS; + +typedef struct { + LONGLONG Earliest; + LONGLONG Latest; +} KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE; + +typedef struct { + KSPROPERTY Property; + GUID SourceFormat; + GUID TargetFormat; + LONGLONG Time; +} KSP_TIMEFORMAT, *PKSP_TIMEFORMAT; + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CAPABILITIES(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_MEDIASEEKING_CAPABILITIES,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(KS_SEEKING_CAPABILITIES),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_FORMATS(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_MEDIASEEKING_FORMATS,\ + (Handler),\ + sizeof(KSPROPERTY),\ + 0,\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_TIMEFORMAT(GetHandler, SetHandler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_MEDIASEEKING_TIMEFORMAT,\ + (GetHandler),\ + sizeof(KSPROPERTY),\ + sizeof(GUID),\ + (SetHandler),\ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITION(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_MEDIASEEKING_POSITION,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(LONGLONG),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_STOPPOSITION(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_MEDIASEEKING_STOPPOSITION,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(LONGLONG),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_POSITIONS(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_MEDIASEEKING_POSITIONS,\ + NULL,\ + sizeof(KSPROPERTY),\ + sizeof(KSPROPERTY_POSITIONS),\ + (Handler),\ + NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_DURATION(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_MEDIASEEKING_DURATION,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(LONGLONG),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_AVAILABLE(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_MEDIASEEKING_AVAILABLE,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(KSPROPERTY_MEDIAAVAILABLE),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_PREROLL(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_MEDIASEEKING_PREROLL,\ + (Handler),\ + sizeof(KSPROPERTY),\ + sizeof(LONGLONG),\ + NULL, NULL, 0, NULL, NULL, 0) + +#define DEFINE_KSPROPERTY_ITEM_MEDIASEEKING_CONVERTTIMEFORMAT(Handler)\ + DEFINE_KSPROPERTY_ITEM(\ + KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT,\ + (Handler),\ + sizeof(KSP_TIMEFORMAT),\ + sizeof(LONGLONG),\ + NULL, NULL, 0, NULL, NULL, 0) /* =============================================================== Pin @@ -598,8 +724,10 @@ typedef enum Properties/Methods/Events */ -#define KSPROPSETID_Stream \ +#define STATIC_KSPROPSETID_Stream\ 0x65aaba60L, 0x98ae, 0x11cf, 0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 +DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4", KSPROPSETID_Stream); +#define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream) typedef enum { @@ -1384,24 +1512,6 @@ typedef struct #define KSPROPERTY_MEMBER_VALUES 0x00000003 #define KSPROPERTY_MEMBER_FLAG_DEFAULT KSPROPERTY_MEMBER_RANGES -typedef enum { - KS_SEEKING_NoPositioning, - KS_SEEKING_AbsolutePositioning, - KS_SEEKING_RelativePositioning, - KS_SEEKING_IncrementalPositioning, - KS_SEEKING_PositioningBitsMask = 0x3, - KS_SEEKING_SeekToKeyFrame, - KS_SEEKING_ReturnTime = 0x8 -} KS_SEEKING_FLAGS; - -typedef struct -{ - LONGLONG Current; - LONGLONG Stop; - KS_SEEKING_FLAGS CurrentFlags; - KS_SEEKING_FLAGS StopFlags; -} KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS; - typedef struct { GUID PropertySet; @@ -1474,13 +1584,6 @@ typedef struct ULONG Reserved; } KSPROPERTY_DESCRIPTION, *PKSPROPERTY_DESCRIPTION; -typedef struct -{ - LONGLONG Earliest; - LONGLONG Latest; -} KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE; - - typedef struct { ULONG MembersFlags; @@ -1743,11 +1846,32 @@ typedef struct KSEVENTDATA EventData; } KSRELATIVEEVENT, *PKSRELATIVEEVENT; +#define KSRELATIVEEVENT_FLAG_HANDLE 0x00000001 +#define KSRELATIVEEVENT_FLAG_POINTER 0x00000002 /* =============================================================== Timing */ + +typedef struct { + KSEVENTDATA EventData; + LONGLONG MarkTime; +} KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK; + +typedef struct { + KSEVENTDATA EventData; + LONGLONG TimeBase; + LONGLONG Interval; +} KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL; + +typedef struct { + LONGLONG TimeBase; + LONGLONG Interval; +} KSINTERVAL, *PKSINTERVAL; + + + typedef struct { LONGLONG Time; @@ -1761,20 +1885,6 @@ typedef struct LONGLONG SystemTime; } KSCORRELATED_TIME, *PKSCORRELATED_TIME; -typedef struct -{ - KSPROPERTY Property; - GUID SourceFormat; - GUID TargetFormat; - LONGLONG Time; -} KSP_TIMEFORMAT, *PKSP_TIMEFORMAT; - -typedef struct -{ - LONGLONG TimeBase; - LONGLONG Interval; -} KSINTERVAL, *PKSINTERVAL; - typedef struct { LONGLONG Duration; @@ -1983,19 +2093,7 @@ typedef struct { typedef struct _KSEVENT_ENTRY KSEVENT_ENTRY, *PKSEVENT_ENTRY; #if defined(_NTDDK_) -typedef struct -{ - KSEVENTDATA EventData; - LONGLONG MarkTime; -} KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK; - -typedef struct -{ - KSEVENTDATA EventData; - LONGLONG TimeBase; - LONGLONG Interval; -} KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL; - + typedef NTSTATUS (NTAPI *PFNKSADDEVENT)( IN PIRP Irp, IN PKSEVENTDATA EventData, @@ -3780,6 +3878,26 @@ KsPinGetConnectedPinFileObject( #else +#if !defined( KS_NO_CREATE_FUNCTIONS ) + +KSDDKAPI +DWORD +WINAPI +KsCreateAllocator( + IN HANDLE ConnectionHandle, + IN PKSALLOCATOR_FRAMING AllocatorFraming, + OUT PHANDLE AllocatorHandle + ); + +KSDDKAPI +DWORD +NTAPI +KsCreateClock( + IN HANDLE ConnectionHandle, + IN PKSCLOCK_CREATE ClockCreate, + OUT PHANDLE ClockHandle + ); + KSDDKAPI DWORD WINAPI @@ -3790,6 +3908,17 @@ KsCreatePin( OUT PHANDLE ConnectionHandle ); +KSDDKAPI +DWORD +WINAPI +KsCreateTopologyNode( + IN HANDLE ParentHandle, + IN PKSNODE_CREATE NodeCreate, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE NodeHandle + ); + +#endif #endif diff --git a/reactos/include/psdk/ksproxy.h b/reactos/include/psdk/ksproxy.h new file mode 100644 index 00000000000..db2f3122fec --- /dev/null +++ b/reactos/include/psdk/ksproxy.h @@ -0,0 +1,798 @@ +#ifndef __KSPROXY__ +#define __KSPROXY__ + +#ifdef __cplusplus +extern "C" { +#endif + +#undef KSDDKAPI +#ifdef _KSDDK_ +#define KSDDKAPI +#else +#define KSDDKAPI DECLSPEC_IMPORT +#endif + +#define STATIC_IID_IKsObject\ + 0x423c13a2L, 0x2070, 0x11d0, 0x9e, 0xf7, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1 + +#define STATIC_IID_IKsPinEx\ + 0x7bb38260L, 0xd19c, 0x11d2, 0xb3, 0x8a, 0x00, 0xa0, 0xc9, 0x5e, 0xc2, 0x2e + +#define STATIC_IID_IKsPin\ + 0xb61178d1L, 0xa2d9, 0x11cf, 0x9e, 0x53, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1 + +#define STATIC_IID_IKsPinPipe\ + 0xe539cd90L, 0xa8b4, 0x11d1, 0x81, 0x89, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 + +#define STATIC_IID_IKsDataTypeHandler\ + 0x5ffbaa02L, 0x49a3, 0x11d0, 0x9f, 0x36, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1 + +#define STATIC_IID_IKsDataTypeCompletion\ + 0x827D1A0EL, 0x0F73, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + +#define STATIC_IID_IKsInterfaceHandler\ + 0xD3ABC7E0L, 0x9A61, 0x11D0, 0xA4, 0x0D, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + +#define STATIC_IID_IKsClockPropertySet\ + 0x5C5CBD84L, 0xE755, 0x11D0, 0xAC, 0x18, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + +#define STATIC_IID_IKsAllocator\ + 0x8da64899L, 0xc0d9, 0x11d0, 0x84, 0x13, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a + +#define STATIC_IID_IKsAllocatorEx\ + 0x091bb63aL, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 + + +#ifndef STATIC_IID_IKsPropertySet +#define STATIC_IID_IKsPropertySet\ + 0x31EFAC30L, 0x515C, 0x11d0, 0xA9, 0xAA, 0x00, 0xAA, 0x00, 0x61, 0xBE, 0x93 +#endif + +#define STATIC_IID_IKsTopology\ + 0x28F54683L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + +#ifndef STATIC_IID_IKsControl +#define STATIC_IID_IKsControl\ + 0x28F54685L, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 +#endif + +#define STATIC_IID_IKsAggregateControl\ + 0x7F40EAC0L, 0x3947, 0x11D2, 0x87, 0x4E, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + +#define STATIC_CLSID_Proxy \ + 0x17CCA71BL, 0xECD7, 0x11D0, 0xB9, 0x08, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + +#ifdef _KS_ + +#if !defined(__cplusplus) || _MSC_VER < 1100 + +#define IID_IKsQualityForwarder KSCATEGORY_QUALITY + +DEFINE_GUIDEX(IID_IKsObject); +DEFINE_GUIDEX(IID_IKsPin); +DEFINE_GUIDEX(IID_IKsPinEx); +DEFINE_GUIDEX(IID_IKsPinPipe); +DEFINE_GUIDEX(IID_IKsDataTypeHandler); +DEFINE_GUIDEX(IID_IKsDataTypeCompletion); +DEFINE_GUIDEX(IID_IKsInterfaceHandler); +DEFINE_GUIDEX(IID_IKsClockPropertySet); +DEFINE_GUIDEX(IID_IKsAllocator); +DEFINE_GUIDEX(IID_IKsAllocatorEx); +#endif + +#define STATIC_IID_IKsQualityForwarder STATIC_KSCATEGORY_QUALITY + +typedef enum +{ + KsAllocatorMode_User, + KsAllocatorMode_Kernel +}KSALLOCATORMODE; + + +typedef enum +{ + FramingProp_Uninitialized, + FramingProp_None, + FramingProp_Old, + FramingProp_Ex +}FRAMING_PROP; + +typedef FRAMING_PROP *PFRAMING_PROP; + + +typedef enum +{ + Framing_Cache_Update, + Framing_Cache_ReadLast, + Framing_Cache_ReadOrig, + Framing_Cache_Write +}FRAMING_CACHE_OPS; + + +typedef struct +{ + LONGLONG MinTotalNominator; + LONGLONG MaxTotalNominator; + LONGLONG TotalDenominator; +}OPTIMAL_WEIGHT_TOTALS; + +typedef struct IPin IPin; +typedef struct IKsPin IKsPin; +typedef struct IKsAllocator IKsAllocator; +typedef struct IKsAllocatorEx IKsAllocatorEx; + + +#define AllocatorStrategy_DontCare 0 +#define AllocatorStrategy_MinimizeNumberOfFrames 1 +#define AllocatorStrategy_MinimizeFrameSize 2 +#define AllocatorStrategy_MinimizeNumberOfAllocators 4 +#define AllocatorStrategy_MaximizeSpeed 8 + +#define PipeFactor_None 0x0 +#define PipeFactor_UserModeUpstream 0x1 +#define PipeFactor_UserModeDownstream 0x2 +#define PipeFactor_MemoryTypes 0x4 +#define PipeFactor_Flags 0x8 +#define PipeFactor_PhysicalRanges 0x10 +#define PipeFactor_OptimalRanges 0x20 +#define PipeFactor_FixedCompression 0x40 +#define PipeFactor_UnknownCompression 0x80 +#define PipeFactor_Buffers 0x100 +#define PipeFactor_Align 0x200 +#define PipeFactor_PhysicalEnd 0x400 +#define PipeFactor_LogicalEnd 0x800 + +typedef enum +{ + PipeState_DontCare, + PipeState_RangeNotFixed, + PipeState_RangeFixed, + PipeState_CompressionUnknown, + PipeState_Finalized +}PIPE_STATE; + + +typedef struct _PIPE_DIMENSIONS +{ + KS_COMPRESSION AllocatorPin; + KS_COMPRESSION MaxExpansionPin; + KS_COMPRESSION EndPin; +}PIPE_DIMENSIONS, *PPIPE_DIMENSIONS; + + +typedef enum +{ + Pipe_Allocator_None, + Pipe_Allocator_FirstPin, + Pipe_Allocator_LastPin, + Pipe_Allocator_MiddlePin +}PIPE_ALLOCATOR_PLACE, *PPIPE_ALLOCATOR_PLACE;; + +typedef enum +{ + KS_MemoryTypeDontCare = 0, + KS_MemoryTypeKernelPaged, + KS_MemoryTypeKernelNonPaged, + KS_MemoryTypeDeviceHostMapped, + KS_MemoryTypeDeviceSpecific, + KS_MemoryTypeUser, + KS_MemoryTypeAnyHost +}KS_LogicalMemoryType, *PKS_LogicalMemoryType;; + +typedef struct _PIPE_TERMINATION { + ULONG Flags; + ULONG OutsideFactors; + ULONG Weigth; + KS_FRAMING_RANGE PhysicalRange; + KS_FRAMING_RANGE_WEIGHTED OptimalRange; + KS_COMPRESSION Compression; +}PIPE_TERMINATION; + + +typedef struct _ALLOCATOR_PROPERTIES_EX +{ + long cBuffers; + long cbBuffer; + long cbAlign; + long cbPrefix; + + GUID MemoryType; + GUID BusType; + PIPE_STATE State; + PIPE_TERMINATION Input; + PIPE_TERMINATION Output; + ULONG Strategy; + ULONG Flags; + ULONG Weight; + KS_LogicalMemoryType LogicalMemoryType; + PIPE_ALLOCATOR_PLACE AllocatorPlace; + PIPE_DIMENSIONS Dimensions; + KS_FRAMING_RANGE PhysicalRange; + IKsAllocatorEx* PrevSegment; + ULONG CountNextSegments; + IKsAllocatorEx** NextSegments; + ULONG InsideFactors; + ULONG NumberPins; +}ALLOCATOR_PROPERTIES_EX; + +typedef ALLOCATOR_PROPERTIES_EX *PALLOCATOR_PROPERTIES_EX; + + +#ifdef __STREAMS__ + +struct DECLSPEC_UUID("5C5CBD84-E755-11D0-AC18-00A0C9223196") IKsClockPropertySet; +#undef INTERFACE +#define INTERFACE IKsClockPropertySet +DECLARE_INTERFACE_(IKsClockPropertySet, IUnknown) +{ + STDMETHOD(KsGetTime)( + THIS_ + LONGLONG* Time + ) PURE; + STDMETHOD(KsSetTime)( + THIS_ + LONGLONG Time + ) PURE; + STDMETHOD(KsGetPhysicalTime)( + THIS_ + LONGLONG* Time + ) PURE; + STDMETHOD(KsSetPhysicalTime)( + THIS_ + LONGLONG Time + ) PURE; + STDMETHOD(KsGetCorrelatedTime)( + THIS_ + KSCORRELATED_TIME* CorrelatedTime + ) PURE; + STDMETHOD(KsSetCorrelatedTime)( + THIS_ + KSCORRELATED_TIME* CorrelatedTime + ) PURE; + STDMETHOD(KsGetCorrelatedPhysicalTime)( + THIS_ + KSCORRELATED_TIME* CorrelatedTime + ) PURE; + STDMETHOD(KsSetCorrelatedPhysicalTime)( + THIS_ + KSCORRELATED_TIME* CorrelatedTime + ) PURE; + STDMETHOD(KsGetResolution)( + THIS_ + KSRESOLUTION* Resolution + ) PURE; + STDMETHOD(KsGetState)( + THIS_ + KSSTATE* State + ) PURE; +}; + + +interface DECLSPEC_UUID("8da64899-c0d9-11d0-8413-0000f822fe8a") IKsAllocator; +#undef INTERFACE +#define INTERFACE IKsAllocator +DECLARE_INTERFACE_(IKsAllocator, IUnknown) +{ + STDMETHOD_(HANDLE, KsGetAllocatorHandle)( + THIS + ) PURE; + STDMETHOD_(KSALLOCATORMODE, KsGetAllocatorMode)( + THIS + ) PURE; + STDMETHOD(KsGetAllocatorStatus)( + THIS_ + PKSSTREAMALLOCATOR_STATUS AllocatorStatus + ) PURE; + STDMETHOD_(VOID, KsSetAllocatorMode)( + THIS_ + KSALLOCATORMODE Mode + ) PURE; +}; + +interface DECLSPEC_UUID("091bb63a-603f-11d1-b067-00a0c9062802") IKsAllocatorEx; +#undef INTERFACE +#define INTERFACE IKsAllocatorEx +DECLARE_INTERFACE_(IKsAllocatorEx, IKsAllocator) +{ + STDMETHOD_(PALLOCATOR_PROPERTIES_EX, KsGetProperties)( + THIS + ) PURE; + STDMETHOD_(VOID, KsSetProperties)( + THIS_ + PALLOCATOR_PROPERTIES_EX + ) PURE; + STDMETHOD_(VOID, KsSetAllocatorHandle)( + THIS_ + HANDLE AllocatorHandle + ) PURE; + STDMETHOD_(HANDLE, KsCreateAllocatorAndGetHandle)( + THIS_ + IKsPin* KsPin + ) PURE; +}; + +typedef enum { + KsPeekOperation_PeekOnly, + KsPeekOperation_AddRef +} KSPEEKOPERATION; + +typedef struct _KSSTREAM_SEGMENT *PKSSTREAM_SEGMENT; + +interface DECLSPEC_UUID("b61178d1-a2d9-11cf-9e53-00aa00a216a1") IKsPin; + +#undef INTERFACE +#define INTERFACE IKsPin +DECLARE_INTERFACE_(IKsPin, IUnknown) +{ + STDMETHOD(KsQueryMediums)( + THIS_ + PKSMULTIPLE_ITEM* MediumList + ) PURE; + STDMETHOD(KsQueryInterfaces)( + THIS_ + PKSMULTIPLE_ITEM* InterfaceList + ) PURE; + STDMETHOD(KsCreateSinkPinHandle)( + THIS_ + KSPIN_INTERFACE& Interface, + KSPIN_MEDIUM& Medium + ) PURE; + STDMETHOD(KsGetCurrentCommunication)( + THIS_ + KSPIN_COMMUNICATION *Communication, + KSPIN_INTERFACE *Interface, + KSPIN_MEDIUM *Medium + ) PURE; + STDMETHOD(KsPropagateAcquire)( + THIS + ) PURE; + STDMETHOD(KsDeliver)( + THIS_ + IMediaSample* Sample, + ULONG Flags + ) PURE; + STDMETHOD(KsMediaSamplesCompleted)( + THIS_ + PKSSTREAM_SEGMENT StreamSegment + ) PURE; + STDMETHOD_(IMemAllocator *, KsPeekAllocator)( + THIS_ + KSPEEKOPERATION Operation + ) PURE; + STDMETHOD(KsReceiveAllocator)( + THIS_ + IMemAllocator *MemAllocator + ) PURE; + STDMETHOD(KsRenegotiateAllocator)( + THIS + ) PURE; + STDMETHOD_(LONG, KsIncrementPendingIoCount)( + THIS + ) PURE; + STDMETHOD_(LONG, KsDecrementPendingIoCount)( + THIS + ) PURE; + STDMETHOD(KsQualityNotify)( + THIS_ + ULONG Proportion, + REFERENCE_TIME TimeDelta + ) PURE; +}; + +interface DECLSPEC_UUID("7bb38260-d19c-11d2-b38a-00a0c95ec22e") IKsPinEx; +#undef INTERFACE +#define INTERFACE IKsPinEx +DECLARE_INTERFACE_(IKsPinEx, IKsPin) +{ + STDMETHOD_(VOID, KsNotifyError)( + THIS_ + IMediaSample* Sample, + HRESULT hr + ) PURE; +}; + +interface DECLSPEC_UUID("e539cd90-a8b4-11d1-8189-00a0c9062802") IKsPinPipe; +#undef INTERFACE +#define INTERFACE IKsPinPipe +DECLARE_INTERFACE_(IKsPinPipe, IUnknown) +{ + STDMETHOD(KsGetPinFramingCache)( + THIS_ + PKSALLOCATOR_FRAMING_EX *FramingEx, + PFRAMING_PROP FramingProp, + FRAMING_CACHE_OPS Option + ) PURE; + STDMETHOD(KsSetPinFramingCache)( + THIS_ + PKSALLOCATOR_FRAMING_EX FramingEx, + PFRAMING_PROP FramingProp, + FRAMING_CACHE_OPS Option + ) PURE; + STDMETHOD_(IPin*, KsGetConnectedPin)( + THIS + ) PURE; + STDMETHOD_(IKsAllocatorEx*, KsGetPipe)( + THIS_ + KSPEEKOPERATION Operation + ) PURE; + STDMETHOD(KsSetPipe)( + THIS_ + IKsAllocatorEx *KsAllocator + ) PURE; + STDMETHOD_(ULONG, KsGetPipeAllocatorFlag)( + THIS + ) PURE; + STDMETHOD(KsSetPipeAllocatorFlag)( + THIS_ + ULONG Flag + ) PURE; + STDMETHOD_(GUID, KsGetPinBusCache)( + THIS + ) PURE; + STDMETHOD(KsSetPinBusCache)( + THIS_ + GUID Bus + ) PURE; + + STDMETHOD_(PWCHAR, KsGetPinName)( + THIS + ) PURE; + STDMETHOD_(PWCHAR, KsGetFilterName)( + THIS + ) PURE; +}; + + +interface DECLSPEC_UUID("CD5EBE6B-8B6E-11D1-8AE0-00A0C9223196") IKsPinFactory; +#undef INTERFACE +#define INTERFACE IKsPinFactory +DECLARE_INTERFACE_(IKsPinFactory, IUnknown) +{ + STDMETHOD(KsPinFactory)( + THIS_ + ULONG* PinFactory + ) PURE; +}; + +typedef enum { + KsIoOperation_Write, + KsIoOperation_Read +} KSIOOPERATION; + +interface DECLSPEC_UUID("5ffbaa02-49a3-11d0-9f36-00aa00a216a1") IKsDataTypeHandler; +#undef INTERFACE +#define INTERFACE IKsDataTypeHandler +DECLARE_INTERFACE_(IKsDataTypeHandler, IUnknown) +{ + STDMETHOD(KsCompleteIoOperation)( + THIS_ + IMediaSample *Sample, + PVOID StreamHeader, + KSIOOPERATION IoOperation, + BOOL Cancelled + ) PURE; + STDMETHOD(KsIsMediaTypeInRanges)( + THIS_ + PVOID DataRanges + ) PURE; + STDMETHOD(KsPrepareIoOperation)( + THIS_ + IMediaSample *Sample, + PVOID StreamHeader, + KSIOOPERATION IoOperation + ) PURE; + STDMETHOD(KsQueryExtendedSize)( + THIS_ + ULONG* ExtendedSize + ) PURE; + STDMETHOD(KsSetMediaType)( + THIS_ + const AM_MEDIA_TYPE* AmMediaType + ) PURE; +}; + +interface DECLSPEC_UUID("827D1A0E-0F73-11D2-B27A-00A0C9223196") IKsDataTypeCompletion; +#undef INTERFACE +#define INTERFACE IKsDataTypeCompletion +DECLARE_INTERFACE_(IKsDataTypeCompletion, IUnknown) +{ + STDMETHOD(KsCompleteMediaType)( + THIS_ + HANDLE FilterHandle, + ULONG PinFactoryId, + AM_MEDIA_TYPE* AmMediaType + ) PURE; +}; + +interface DECLSPEC_UUID("D3ABC7E0-9A61-11d0-A40D-00A0C9223196") IKsInterfaceHandler; +#undef INTERFACE +#define INTERFACE IKsInterfaceHandler +DECLARE_INTERFACE_(IKsInterfaceHandler, IUnknown) +{ + STDMETHOD(KsSetPin)( + THIS_ + IKsPin *KsPin + ) PURE; + STDMETHOD(KsProcessMediaSamples)( + THIS_ + IKsDataTypeHandler *KsDataTypeHandler, + IMediaSample** SampleList, + PLONG SampleCount, + KSIOOPERATION IoOperation, + PKSSTREAM_SEGMENT *StreamSegment + ) PURE; + STDMETHOD(KsCompleteIo)( + THIS_ + PKSSTREAM_SEGMENT StreamSegment + ) PURE; +}; + + +typedef struct _KSSTREAM_SEGMENT +{ + IKsInterfaceHandler *KsInterfaceHandler; + IKsDataTypeHandler *KsDataTypeHandler; + KSIOOPERATION IoOperation; + HANDLE CompletionEvent; + +}KSSTREAM_SEGMENT; + +interface DECLSPEC_UUID("423c13a2-2070-11d0-9ef7-00aa00a216a1") IKsObject; +#undef INTERFACE +#define INTERFACE IKsObject +DECLARE_INTERFACE_(IKsObject, IUnknown) +{ + STDMETHOD_(HANDLE, KsGetObjectHandle)( + THIS + ) PURE; +}; + +interface DECLSPEC_UUID("97ebaacb-95bd-11d0-a3ea-00a0c9223196") IKsQualityForwarder; +#undef INTERFACE +#define INTERFACE IKsQualityForwarder +DECLARE_INTERFACE_(IKsQualityForwarder, IKsObject) +{ + STDMETHOD_(VOID, KsFlushClient)( + THIS_ + IKsPin* Pin + ) PURE; +}; + +#if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1) + +interface DECLSPEC_UUID("412bd695-f84b-46c1-ac73-54196dbc8fa7") IKsNotifyEvent; +#undef INTERFACE +#define INTERFACE IKsNotifyEvent +DECLARE_INTERFACE_(IKsNotifyEvent, IUnknown) +{ + STDMETHOD(KsNotifyEvent)( + THIS_ + ULONG Event, + ULONG_PTR lParam1, + ULONG_PTR lParam2 + ) PURE; +}; + +#endif + +KSDDKAPI +HRESULT +WINAPI +KsResolveRequiredAttributes( + PKSDATARANGE DataRange, + PKSMULTIPLE_ITEM Attributes OPTIONAL); + +KSDDKAPI +HRESULT +WINAPI +KsOpenDefaultDevice( + REFGUID Category, + ACCESS_MASK Access, + PHANDLE DeviceHandle); + +KSDDKAPI +HRESULT +WINAPI +KsSynchronousDeviceControl( + HANDLE Handle, + ULONG IoControl, + PVOID InBuffer, + ULONG InLength, + PVOID OutBuffer, + ULONG OutLength, + PULONG BytesReturned); + +KSDDKAPI +HRESULT +WINAPI +KsGetMultiplePinFactoryItems( + HANDLE FilterHandle, + ULONG PinFactoryId, + ULONG PropertyId, + PVOID* Items); + +KSDDKAPI +HRESULT +WINAPI +KsGetMediaTypeCount( + HANDLE FilterHandle, + ULONG PinFactoryId, + ULONG* MediaTypeCount); + +KSDDKAPI +HRESULT +WINAPI +KsGetMediaType( + int Position, + AM_MEDIA_TYPE* AmMediaType, + HANDLE FilterHandle, + ULONG PinFactoryId); + +#endif + +#ifndef _IKsPropertySet_ +#if !defined(__cplusplus) || _MSC_VER < 1100 +DEFINE_GUIDEX(IID_IKsPropertySet); +#endif +#endif + +#ifndef _IKsControl_ +#if !defined(__cplusplus) || _MSC_VER < 1100 +DEFINE_GUIDEX(IID_IKsControl); +#endif +#endif + +#if !defined(__cplusplus) || _MSC_VER < 1100 +DEFINE_GUIDEX(IID_IKsAggregateControl); +#endif + +#ifndef _IKsTopology_ +#if !defined(__cplusplus) || _MSC_VER < 1100 +DEFINE_GUIDEX(IID_IKsTopology); +#endif +#endif + +DEFINE_GUIDSTRUCT("17CCA71B-ECD7-11D0-B908-00A0C9223196", CLSID_Proxy); +#define CLSID_Proxy DEFINE_GUIDNAMED(CLSID_Proxy) + +#else + +#ifndef _IKsPropertySet_ +#if !defined(__cplusplus) || _MSC_VER < 1100 +DEFINE_GUID(IID_IKsPropertySet, STATIC_IID_IKsPropertySet); +#endif +#endif + +#if !defined(__cplusplus) || _MSC_VER < 1100 +DEFINE_GUID(CLSID_Proxy, STATIC_CLSID_Proxy); +#else +DECLSPEC_UUID("17CCA71B-ECD7-11D0-B908-00A0C9223196") CLSID_Proxy; +#endif + +#endif + +#ifndef _IKsPropertySet_ +#define _IKsPropertySet_ + +#define KSPROPERTY_SUPPORT_GET 1 +#define KSPROPERTY_SUPPORT_SET 2 + +interface DECLSPEC_UUID("31EFAC30-515C-11d0-A9AA-00aa0061be93") +#undef INTERFACE +#define INTERFACE IKsPropertySet +DECLARE_INTERFACE_(IKsPropertySet, IUnknown) +{ + STDMETHOD(Set)( + THIS_ + IN REFGUID PropSet, + IN ULONG Id, + IN LPVOID InstanceData, + IN ULONG InstanceLength, + IN LPVOID PropertyData, + IN ULONG DataLength + ) PURE; + + STDMETHOD(Get)( + THIS_ + IN REFGUID PropSet, + IN ULONG Id, + IN LPVOID InstanceData, + IN ULONG InstanceLength, + OUT LPVOID PropertyData, + IN ULONG DataLength, + OUT ULONG* BytesReturned + ) PURE; + + STDMETHOD(QuerySupported)( + THIS_ + IN REFGUID PropSet, + IN ULONG Id, + OUT ULONG* TypeSupport + ) PURE; +}; + +#endif + +#ifndef _IKsControl_ +#define _IKsControl_ + +DEFINE_GUID(IID_IKsControl, 28F54685, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0A0, 0xC9, 0x22, 0x31, 0x96); + + +interface DECLSPEC_UUID("28F54685-06FD-11D2-B27A-00A0C9223196") IKsControl; +#undef INTERFACE +#define INTERFACE IKsControl +DECLARE_INTERFACE_(IKsControl, IUnknown) +{ + STDMETHOD(KsProperty)( + THIS_ + IN PKSPROPERTY Property, + IN ULONG PropertyLength, + IN OUT LPVOID PropertyData, + IN ULONG DataLength, + OUT ULONG* BytesReturned + ) PURE; + STDMETHOD(KsMethod)( + THIS_ + IN PKSMETHOD Method, + IN ULONG MethodLength, + IN OUT LPVOID MethodData, + IN ULONG DataLength, + OUT ULONG* BytesReturned + ) PURE; + STDMETHOD(KsEvent)( + THIS_ + IN PKSEVENT Event OPTIONAL, + IN ULONG EventLength, + IN OUT LPVOID EventData, + IN ULONG DataLength, + OUT ULONG* BytesReturned + ) PURE; +}; + +#endif + + +DEFINE_GUID(IID_IKsAggregateControl, 0x7F40EAC0, 0x3947, 0x11D2, 0x87, 0x4E, 0x00, 0A0, 0xC9, 0x22, 0x31, 0x96); + +#undef INTERFACE +#define INTERFACE IKsAggregateControl +DECLARE_INTERFACE_(IKsAggregateControl, IUnknown) +{ + STDMETHOD(KsAddAggregate)( + THIS_ + IN REFGUID AggregateClass + ) PURE; + STDMETHOD(KsRemoveAggregate)( + THIS_ + IN REFGUID AggregateClass + ) PURE; +}; + +#ifndef _IKsTopology_ +#define _IKsTopology_ + +DEFINE_GUID(IID_IKsAggregateControl, 0x28F54683, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0A0, 0xC9, 0x22, 0x31, 0x96); + +#undef INTERFACE +#define INTERFACE IKsTopology +DECLARE_INTERFACE_(IKsTopology, IUnknown) +{ + STDMETHOD(CreateNodeInstance)( + THIS_ + IN ULONG NodeId, + IN ULONG Flags, + IN ACCESS_MASK DesiredAccess, + IN IUnknown* UnkOuter OPTIONAL, + IN REFGUID InterfaceId, + OUT LPVOID* Interface + ) PURE; +}; + +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/reactos/include/psdk/ktmtypes.h b/reactos/include/psdk/ktmtypes.h new file mode 100644 index 00000000000..77cf5782858 --- /dev/null +++ b/reactos/include/psdk/ktmtypes.h @@ -0,0 +1,147 @@ + +#ifndef _KTMTYPES_ +#define _KTMTYPES_ + +#define TRANSACTION_MANAGER_VOLATILE 0x00000001 +#define TRANSACTION_MANAGER_COMMIT_DEFAULT 0x00000000 +#define TRANSACTION_MANAGER_COMMIT_SYSTEM_VOLUME 0x00000002 +#define TRANSACTION_MANAGER_COMMIT_SYSTEM_HIVES 0x00000004 +#define TRANSACTION_MANAGER_COMMIT_LOWEST 0x00000008 +#define TRANSACTION_MANAGER_CORRUPT_FOR_RECOVERY 0x00000010 +#define TRANSACTION_MANAGER_CORRUPT_FOR_PROGRESS 0x00000020 +#define TRANSACTION_MANAGER_MAXIMUM_OPTION 0x0000003F + +#define TRANSACTION_DO_NOT_PROMOTE 0x00000001 +#define TRANSACTION_MAXIMUM_OPTION 0x00000001 + +#define RESOURCE_MANAGER_VOLATILE 0x00000001 +#define RESOURCE_MANAGER_COMMUNICATION 0x00000002 +#define RESOURCE_MANAGER_MAXIMUM_OPTION 0x00000003 + +#define CRM_PROTOCOL_EXPLICIT_MARSHAL_ONLY 0x00000001 +#define CRM_PROTOCOL_DYNAMIC_MARSHAL_INFO 0x00000002 +#define CRM_PROTOCOL_MAXIMUM_OPTION 0x00000003 + +#define ENLISTMENT_SUPERIOR 0x00000001 +#define ENLISTMENT_MAXIMUM_OPTION 0x00000001 + +#define TRANSACTION_NOTIFY_MASK 0x3FFFFFFF +#define TRANSACTION_NOTIFY_PREPREPARE 0x00000001 +#define TRANSACTION_NOTIFY_PREPARE 0x00000002 +#define TRANSACTION_NOTIFY_COMMIT 0x00000004 +#define TRANSACTION_NOTIFY_ROLLBACK 0x00000008 +#define TRANSACTION_NOTIFY_PREPREPARE_COMPLETE 0x00000010 +#define TRANSACTION_NOTIFY_PREPARE_COMPLETE 0x00000020 +#define TRANSACTION_NOTIFY_COMMIT_COMPLETE 0x00000040 +#define TRANSACTION_NOTIFY_ROLLBACK_COMPLETE 0x00000080 +#define TRANSACTION_NOTIFY_RECOVER 0x00000100 +#define TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT 0x00000200 +#define TRANSACTION_NOTIFY_DELEGATE_COMMIT 0x00000400 +#define TRANSACTION_NOTIFY_RECOVER_QUERY 0x00000800 +#define TRANSACTION_NOTIFY_ENLIST_PREPREPARE 0x00001000 +#define TRANSACTION_NOTIFY_LAST_RECOVER 0x00002000 +#define TRANSACTION_NOTIFY_INDOUBT 0x00004000 +#define TRANSACTION_NOTIFY_PROPAGATE_PULL 0x00008000 +#define TRANSACTION_NOTIFY_PROPAGATE_PUSH 0x00010000 +#define TRANSACTION_NOTIFY_MARSHAL 0x00020000 +#define TRANSACTION_NOTIFY_ENLIST_MASK 0x00040000 +#define TRANSACTION_NOTIFY_RM_DISCONNECTED 0x01000000 +#define TRANSACTION_NOTIFY_TM_ONLINE 0x02000000 +#define TRANSACTION_NOTIFY_COMMIT_REQUEST 0x04000000 +#define TRANSACTION_NOTIFY_PROMOTE 0x08000000 +#define TRANSACTION_NOTIFY_PROMOTE_NEW 0x10000000 +#define TRANSACTION_NOTIFY_REQUEST_OUTCOME 0x20000000 + +#define TRANSACTION_NOTIFY_COMMIT_FINALIZE 0x40000000 + +#define TRANSACTIONMANAGER_OBJECT_PATH L"\\TransactionManager\\" +#define TRANSACTION_OBJECT_PATH L"\\Transaction\\" +#define ENLISTMENT_OBJECT_PATH L"\\Enlistment\\" +#define RESOURCE_MANAGER_OBJECT_PATH L"\\ResourceManager\\" + +#define TRANSACTIONMANAGER_OBJECT_NAME_LENGTH_IN_BYTES (sizeof(TRANSACTIONMANAGER_OBJECT_PATH)+(38*sizeof(WCHAR))) +#define TRANSACTION_OBJECT_NAME_LENGTH_IN_BYTES (sizeof(TRANSACTION_OBJECT_PATH)+(38*sizeof(WCHAR))) +#define ENLISTMENT_OBJECT_NAME_LENGTH_IN_BYTES (sizeof(ENLISTMENT_OBJECT_PATH)+(38*sizeof(WCHAR))) +#define RESOURCE_MANAGER_OBJECT_NAME_LENGTH_IN_BYTES (sizeof(RESOURCE_MANAGER_OBJECT_PATH)+(38*sizeof(WCHAR))) + +#define TRANSACTION_NOTIFICATION_TM_ONLINE_FLAG_IS_CLUSTERED 0x1 + +#define KTM_MARSHAL_BLOB_VERSION_MAJOR 1 +#define KTM_MARSHAL_BLOB_VERSION_MINOR 1 + +#define MAX_TRANSACTION_DESCRIPTION_LENGTH 64 +#define MAX_RESOURCEMANAGER_DESCRIPTION_LENGTH 64 + +typedef GUID UOW, *PUOW; +typedef GUID CRM_PROTOCOL_ID, *PCRM_PROTOCOL_ID; +typedef ULONG NOTIFICATION_MASK; +typedef ULONG SAVEPOINT_ID, *PSAVEPOINT_ID; + +typedef struct _TRANSACTION_NOTIFICATION { + PVOID TransactionKey; + ULONG TransactionNotification; + LARGE_INTEGER TmVirtualClock; + ULONG ArgumentLength; +} TRANSACTION_NOTIFICATION, *PTRANSACTION_NOTIFICATION; + +typedef struct _TRANSACTION_NOTIFICATION_RECOVERY_ARGUMENT { + GUID EnlistmentId; +#if defined(__cplusplus) + ::UOW UOW; +#else + UOW UOW; +#endif +} TRANSACTION_NOTIFICATION_RECOVERY_ARGUMENT, *PTRANSACTION_NOTIFICATION_RECOVERY_ARGUMENT; + +typedef struct _TRANSACTION_NOTIFICATION_TM_ONLINE_ARGUMENT { + GUID TmIdentity; + ULONG Flags; +} TRANSACTION_NOTIFICATION_TM_ONLINE_ARGUMENT, *PTRANSACTION_NOTIFICATION_TM_ONLINE_ARGUMENT; + +typedef struct _TRANSACTION_NOTIFICATION_SAVEPOINT_ARGUMENT { + SAVEPOINT_ID SavepointId; +} TRANSACTION_NOTIFICATION_SAVEPOINT_ARGUMENT, *PTRANSACTION_NOTIFICATION_SAVEPOINT_ARGUMENT; + +typedef struct _TRANSACTION_NOTIFICATION_PROPAGATE_ARGUMENT { + ULONG PropagationCookie; + GUID UOW; + GUID TmIdentity; + ULONG BufferLength; +} TRANSACTION_NOTIFICATION_PROPAGATE_ARGUMENT, *PTRANSACTION_NOTIFICATION_PROPAGATE_ARGUMENT, + TRANSACTION_NOTIFICATION_PROMOTE_ARGUMENT, *PTRANSACTION_NOTIFICATION_PROMOTE_ARGUMENT; + +typedef struct _TRANSACTION_NOTIFICATION_MARSHAL_ARGUMENT { + ULONG MarshalCookie; + GUID UOW; +} TRANSACTION_NOTIFICATION_MARSHAL_ARGUMENT, *PTRANSACTION_NOTIFICATION_MARSHAL_ARGUMENT; + +typedef struct _KCRM_MARSHAL_HEADER { + ULONG VersionMajor; + ULONG VersionMinor; + ULONG NumProtocols; + ULONG Unused; +} KCRM_MARSHAL_HEADER, *PKCRM_MARSHAL_HEADER, *RESTRICTED_POINTER PRKCRM_MARSHAL_HEADER; + +typedef struct _KCRM_TRANSACTION_BLOB { +#if defined(__cplusplus) + ::UOW UOW; +#else + UOW UOW; +#endif + GUID TmIdentity; + ULONG IsolationLevel; + ULONG IsolationFlags; + ULONG Timeout; + WCHAR Description[MAX_TRANSACTION_DESCRIPTION_LENGTH]; +} KCRM_TRANSACTION_BLOB, *PKCRM_TRANSACTION_BLOB, *RESTRICTED_POINTER PRKCRM_TRANSACTION_BLOB; + +typedef struct _KCRM_PROTOCOL_BLOB { + CRM_PROTOCOL_ID ProtocolId; + ULONG StaticInfoLength; + ULONG TransactionIdInfoLength; + ULONG Unused1; + ULONG Unused2; +} KCRM_PROTOCOL_BLOB, *PKCRM_PROTOCOL_BLOB, *RESTRICTED_POINTER PRKCRM_PROTOCOL_BLOB; + +#endif /* _KTMTYPES_ */ + diff --git a/reactos/include/psdk/mapi.h b/reactos/include/psdk/mapi.h index 2d335ea588a..7d19734c599 100644 --- a/reactos/include/psdk/mapi.h +++ b/reactos/include/psdk/mapi.h @@ -27,7 +27,7 @@ extern "C" { #ifndef __LHANDLE #define __LHANDLE -typedef ULONG LHANDLE, *LPLHANDLE; +typedef ULONG_PTR LHANDLE, *LPLHANDLE; #endif #define lhSessionNull ((LHANDLE)0) diff --git a/reactos/include/psdk/mlang.idl b/reactos/include/psdk/mlang.idl index c9d90cb4458..a5b1b473f20 100644 --- a/reactos/include/psdk/mlang.idl +++ b/reactos/include/psdk/mlang.idl @@ -25,11 +25,6 @@ interface IStream; cpp_quote("#define CPIOD_PEEK 0x40000000") cpp_quote("#define CPIOD_FORCE_PROMPT 0x80000000") -/* FIXME: LANGID is defined in winnt.h and mlang.h in the platform SDK */ -cpp_quote("#ifndef _WINNT_H") -typedef WORD LANGID; -cpp_quote("#endif") - [ object, uuid(359f3443-bd4a-11d0-b188-00aa0038c969), @@ -42,10 +37,10 @@ interface IMLangCodePages : IUnknown [out] DWORD *pdwCodePages); HRESULT GetStrCodePages( [in, size_is(cchSrc)] const WCHAR *pszSrc, - [in] long cchSrc, + [in] LONG cchSrc, [in] DWORD dwPriorityCodePages, [out] DWORD *pdwCodePages, - [out] long *pcchCodePages); + [out] LONG *pcchCodePages); HRESULT CodePageToCodePages( [in] UINT uCodePage, [out] DWORD *pdwCodePages); @@ -233,11 +228,11 @@ interface IMLangString : IUnknown { #ifdef NEWMLSTR HRESULT LockMLStr( - [in] long lPos, + [in] LONG lPos, [in] DWORD dwFlags, [out] DWORD* pdwCookie, - [out] long* plActualPos, - [out] long* plActualLen); + [out] LONG* plActualPos, + [out] LONG* plActualLen); HRESULT UnlockMLStr( [in] DWORD dwCookie); @@ -246,13 +241,13 @@ interface IMLangString : IUnknown [in] BOOL fNoAccess); #endif HRESULT GetLength( - [out, retval] long* plLen); + [out, retval] LONG* plLen); HRESULT SetMLStr( - [in] long lDestPos, - [in] long lDestLen, + [in] LONG lDestPos, + [in] LONG lDestLen, [in] IUnknown *pSrcMLStr, - [in] long lSrcPos, - [in] long lSrcLen); + [in] LONG lSrcPos, + [in] LONG lSrcLen); #ifdef NEWMLSTR HRESULT RegisterAttr( [in] IUnknown *pUnk, @@ -267,14 +262,14 @@ interface IMLangString : IUnknown [out] IUnknown **ppUnk); #else HRESULT GetMLStr( - [in] long lSrcPos, - [in] long lSrcLen, + [in] LONG lSrcPos, + [in] LONG lSrcLen, [in] IUnknown *pUnkOuter, [in] DWORD dwClsContext, [in] const IID* piid, [out] IUnknown** ppDestMLStr, - [out] long* plDestPos, - [out] long* plDestLen); + [out] LONG* plDestPos, + [out] LONG* plDestLen); #endif } @@ -287,29 +282,29 @@ interface IMLangLineBreakConsole : IUnknown { HRESULT BreakLineML( [in] IMLangString* pSrcMLStr, - [in] long lSrcPos, - [in] long lSrcLen, - [in] long cMinColumns, - [in] long cMaxColumns, - [out] long* plLineLen, - [out] long* plSkipLen); + [in] LONG lSrcPos, + [in] LONG lSrcLen, + [in] LONG cMinColumns, + [in] LONG cMaxColumns, + [out] LONG* plLineLen, + [out] LONG* plSkipLen); HRESULT BreakLineW( [in] LCID locale, [in, size_is(cchSrc)] const WCHAR* pszSrc, - [in] long cchSrc, - [in] long cMaxColumns, - [out] long* pcchLine, - [out] long* pcchSkip ); + [in] LONG cchSrc, + [in] LONG cMaxColumns, + [out] LONG* pcchLine, + [out] LONG* pcchSkip ); HRESULT BreakLineA( [in] LCID locale, [in] UINT uCodePage, [in, size_is(cchSrc)] const CHAR* pszSrc, - [in] long cchSrc, - [in] long cMaxColumns, - [out] long* pcchLine, - [out] long* pcchSkip); + [in] LONG cchSrc, + [in] LONG cMaxColumns, + [out] LONG* pcchLine, + [out] LONG* pcchSkip); } [ diff --git a/reactos/include/psdk/mscoree.idl b/reactos/include/psdk/mscoree.idl index aed31da4bdf..19749fbfba3 100644 --- a/reactos/include/psdk/mscoree.idl +++ b/reactos/include/psdk/mscoree.idl @@ -27,7 +27,11 @@ cpp_quote("HRESULT WINAPI GetCORSystemDirectory(LPWSTR,DWORD,DWORD*);") cpp_quote("HRESULT WINAPI GetCORVersion(LPWSTR,DWORD,DWORD*);") cpp_quote("HRESULT WINAPI GetRequestedRuntimeInfo(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,DWORD,LPWSTR,DWORD,DWORD*,LPWSTR,DWORD,DWORD*);") cpp_quote("HRESULT WINAPI LoadLibraryShim(LPCWSTR,LPCWSTR,LPVOID,HMODULE*);") +cpp_quote("#ifdef WINE_STRICT_PROTOTYPES") +cpp_quote("typedef HRESULT (__stdcall *FLockClrVersionCallback)(void);") +cpp_quote("#else") cpp_quote("typedef HRESULT (__stdcall *FLockClrVersionCallback)();") +cpp_quote("#endif") cpp_quote("HRESULT WINAPI LockClrVersion(FLockClrVersionCallback,FLockClrVersionCallback*,FLockClrVersionCallback*);") typedef void* HDOMAINENUM; diff --git a/reactos/include/psdk/msctf.idl b/reactos/include/psdk/msctf.idl index 5d8cb2afa7d..fcb568e0a49 100644 --- a/reactos/include/psdk/msctf.idl +++ b/reactos/include/psdk/msctf.idl @@ -20,15 +20,10 @@ import "oaidl.idl"; import "comcat.idl"; import "textstor.idl"; -/* import "ctfutb.idl"; */ +import "ctfutb.idl"; #endif cpp_quote("#include ") -/* FIXME: LANGID is defined in winnt.h and mlang.h in the platform SDK */ -cpp_quote("#ifndef _WINNT_H") -typedef WORD LANGID; -cpp_quote("#endif") - cpp_quote("#define TF_E_STACKFULL MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0501)") cpp_quote("#define TF_E_DISCONNECTED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0504)") cpp_quote("#define TF_E_ALREADY_EXISTS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0506)") @@ -37,6 +32,7 @@ cpp_quote("#define TF_E_NOLOCK MAKE_HRESULT(SEVERITY_ERROR, FACILITY_IT cpp_quote("HRESULT WINAPI TF_CreateThreadMgr(ITfThreadMgr **pptim);") cpp_quote("HRESULT WINAPI TF_GetThreadMgr(ITfThreadMgr **pptim);") cpp_quote("HRESULT WINAPI TF_CreateInputProcessorProfiles(ITfInputProcessorProfiles **ppipr);") +cpp_quote("HRESULT WINAPI TF_CreateLangBarMgr(ITfLangBarMgr **pppbm);") cpp_quote("EXTERN_C const GUID GUID_PROP_TEXTOWNER;") cpp_quote("DEFINE_GUID(GUID_PROP_ATTRIBUTE,0x34b45670,0x7526,0x11d2,0xa1,0x47,0x00,0x10,0x5a,0x27,0x99,0xb5);") @@ -46,6 +42,7 @@ cpp_quote("EXTERN_C const GUID GUID_PROP_COMPOSING;") cpp_quote("EXTERN_C const CLSID CLSID_TF_ThreadMgr;") cpp_quote("EXTERN_C const CLSID CLSID_TF_InputProcessorProfiles;") +cpp_quote("EXTERN_C const CLSID CLSID_TF_LangBarMgr;") cpp_quote("EXTERN_C const CLSID CLSID_TF_CategoryMgr;") cpp_quote("DEFINE_GUID(CLSID_TF_DisplayAttributeMgr,0x3ce74de4,0x53d3,0x4d74,0x8b,0x83,0x43,0x1b,0x38,0x28,0xba,0x53);") @@ -1349,3 +1346,16 @@ interface ITfSourceSingle : IUnknown [in] TfClientId tid, [in] REFIID riid); }; + +[ + object, + local, + uuid(c0f1db0c-3a20-405c-a303-96b6010a885f), + pointer_default(unique) +] +interface ITfThreadFocusSink : IUnknown +{ + HRESULT OnSetThreadFocus(); + + HRESULT OnKillThreadFocus(); +}; diff --git a/reactos/include/psdk/mshtmdid.h b/reactos/include/psdk/mshtmdid.h index 0d128493dbe..e3683e9755b 100644 --- a/reactos/include/psdk/mshtmdid.h +++ b/reactos/include/psdk/mshtmdid.h @@ -126,6 +126,11 @@ #define DISPID_IE8_ELEMENTMAX (DISPID_SITE-1) #define DISPID_IE8_ELEMENT DISPID_IE8_ELEMENTBASE +#define DISPID_IE8_FRAMESITEBASE (DISPID_FRAMESITE+1120) +#define DISPID_IE8_FRAMEMAX (WEBOC_DISPIDBASE-1) +#define DISPID_IE8_FRAME DISPID_IE8_FRAMESITEBASE +#define DISPID_IE8_IFRAME DISPID_IE8_FRAMESITEBASE + #define DISPID_COLLECTION (DISPID_NORMAL_FIRST+500) #define DISPID_OPTIONS_COL (DISPID_NORMAL_FIRST+500) #define DISPID_IMG (DISPID_IMGBASE+1000) @@ -2487,6 +2492,9 @@ /* IHTMLScriptElement2 */ #define DISPID_IHTMLSCRIPTELEMENT2_CHARSET DISPID_SCRIPT+10 +/* IHTMLScriptElement3 */ +#define DISPID_IHTMLSCRIPTELEMENT3_IE8_SRC DISPID_IE8_SCRIPT + /* IHTMLFrameBase */ #define DISPID_IHTMLFRAMEBASE_SRC DISPID_FRAMESITE+0 #define DISPID_IHTMLFRAMEBASE_NAME STDPROPID_XOBJ_NAME @@ -2508,6 +2516,19 @@ /* IHTMLFrameBase3 */ #define DISPID_IHTMLFRAMEBASE3_LONGDESC DISPID_FRAMESITE+10 +/* IHTMLFrameElement */ +#define DISPID_IHTMLFRAMEELEMENT_BORDERCOLOR DISPID_FRAME+1 + +/* IHTMLFrameElement2 */ +#define DISPID_IHTMLFRAMEELEMENT2_HEIGHT STDPROPID_XOBJ_HEIGHT +#define DISPID_IHTMLFRAMEELEMENT2_WIDTH STDPROPID_XOBJ_WIDTH + +/* IHTMLFrameElement3 */ +#define DISPID_IHTMLFRAMEELEMENT3_CONTENTDOCUMENT DISPID_IE8_FRAME +#define DISPID_IHTMLFRAMEELEMENT3_IE8_SRC DISPID_IE8_FRAME+1 +#define DISPID_IHTMLFRAMEELEMENT3_IE8_LONGDESC DISPID_IE8_FRAME+2 +#define DISPID_IHTMLFRAMEELEMENT3_IE8_FRAMEBORDER DISPID_IE8_FRAME+3 + /* IHTMLIFrameElement */ #define DISPID_IHTMLIFRAMEELEMENT_VSPACE DISPID_IFRAME+1 #define DISPID_IHTMLIFRAMEELEMENT_HSPACE DISPID_IFRAME+2 diff --git a/reactos/include/psdk/mshtml.idl b/reactos/include/psdk/mshtml.idl index 4a182f23bbc..1941b923b9e 100644 --- a/reactos/include/psdk/mshtml.idl +++ b/reactos/include/psdk/mshtml.idl @@ -1,5 +1,5 @@ /* - * Copyright 2004-2007 Jacek Caban for CodeWeavers + * Copyright 2004-2010 Jacek Caban for CodeWeavers * Copyright 2008 Konstantin Kondratyuk (Etersoft) * * This library is free software; you can redistribute it and/or @@ -2876,7 +2876,7 @@ interface IHTMLCurrentStyle4 : IDispatch [propget, id(DISPID_IHTMLCURRENTSTYLE4_MAXWIDTH), displaybind, bindable] HRESULT maxWidth([retval, out] VARIANT * p); -}; +} /***************************************************************************** * DispHTMLCurrentStyle dispinterface @@ -5903,7 +5903,7 @@ coclass HTMLStyleSheetPage [default] dispinterface DispHTMLStyleSheetPage; interface IHTMLStyleSheetPage; interface IHTMLDOMConstructor; -}; +} [ odl, @@ -6702,7 +6702,7 @@ methods: [id(DISPID_HTMLFORMELEMENTEVENTS_ONRESET)] VARIANT_BOOL onreset(); -}; +} interface IHTMLEventObj; @@ -6905,7 +6905,7 @@ methods: [id(DISPID_HTMLFORMELEMENTEVENTS2_ONRESET)] VARIANT_BOOL onreset([in] IHTMLEventObj* pEvtObj); -}; +} [ noncreatable, @@ -7365,7 +7365,7 @@ interface IHTMLControlElement : IDispatch [propget, id(DISPID_IHTMLCONTROLELEMENT_CLIENTLEFT), displaybind, bindable] HRESULT clientLeft([retval, out] LONG * p); -}; +} /***************************************************************************** * IHTMLBodyElement interface @@ -7634,7 +7634,7 @@ methods: [propget, id(DISPID_IHTMLBODYELEMENT2_ONAFTERPRINT), displaybind, bindable] VARIANT onafterprint(); -}; +} [ uuid(3050f24a-98b5-11cf-bb82-00aa00bdce0b) @@ -7655,7 +7655,7 @@ coclass HTMLBody interface IHTMLTextContainer; interface IHTMLBodyElement; interface IHTMLBodyElement2; -}; +} /***************************************************************************** * IHTMLAnchorElement interface @@ -8970,6 +8970,92 @@ interface IHTMLTextAreaElement : IDispatch HRESULT createTextRange([retval, out] IHTMLTxtRange **range); } +/***************************************************************************** + * DispHTMLTextAreaElement dispinterface + */ +[ + hidden, + uuid(3050f521-98b5-11cf-bb82-00aa00bdce0b) +] +dispinterface DispHTMLTextAreaElement +{ +properties: +methods: + WINE_HTMLDATAELEMENT_DISPINTERFACE_DECL; + + [propget, id(DISPID_IHTMLTEXTAREAELEMENT_TYPE)] + BSTR type(); + + [propput, id(DISPID_IHTMLTEXTAREAELEMENT_VALUE), displaybind, bindable] + void value(BSTR v); + + [propget, id(DISPID_IHTMLTEXTAREAELEMENT_VALUE), displaybind, bindable] + BSTR value(); + + [propput, id(DISPID_IHTMLTEXTAREAELEMENT_NAME), displaybind, bindable] + void name(BSTR v); + + [propget, id(DISPID_IHTMLTEXTAREAELEMENT_NAME), displaybind, bindable] + BSTR name(); + + [propput, id(DISPID_IHTMLTEXTAREAELEMENT_STATUS)] + void status(VARIANT v); + + [propget, id(DISPID_IHTMLTEXTAREAELEMENT_STATUS)] + VARIANT status(); + + [propget, id(DISPID_IHTMLTEXTAREAELEMENT_FORM)] + IHTMLFormElement *form(); + + [propput, id(DISPID_IHTMLTEXTAREAELEMENT_DEFAULTVALUE), displaybind, bindable, hidden] + void defaultValue(BSTR v); + + [propget, id(DISPID_IHTMLTEXTAREAELEMENT_DEFAULTVALUE), displaybind, bindable, hidden] + BSTR defaultValue(); + + [id(DISPID_IHTMLTEXTAREAELEMENT_SELECT)] + void select(); + + [propput, id(DISPID_IHTMLTEXTAREAELEMENT_ONCHANGE), displaybind, bindable] + void onchange(VARIANT v); + + [propget, id(DISPID_IHTMLTEXTAREAELEMENT_ONCHANGE), displaybind, bindable] + VARIANT onchange(); + + [propput, id(DISPID_IHTMLTEXTAREAELEMENT_ONSELECT), displaybind, bindable] + void onselect(VARIANT v); + + [propget, id(DISPID_IHTMLTEXTAREAELEMENT_ONSELECT), displaybind, bindable] + VARIANT onselect(); + + [propput, id(DISPID_IHTMLTEXTAREAELEMENT_READONLY), displaybind, bindable] + void readOnly(VARIANT_BOOL v); + + [propget, id(DISPID_IHTMLTEXTAREAELEMENT_READONLY), displaybind, bindable] + VARIANT_BOOL readOnly(); + + [propput, id(DISPID_IHTMLTEXTAREAELEMENT_ROWS), displaybind, bindable] + void rows(LONG v); + + [propget, id(DISPID_IHTMLTEXTAREAELEMENT_ROWS), displaybind, bindable] + LONG rows(); + + [propput, id(DISPID_IHTMLTEXTAREAELEMENT_COLS), displaybind, bindable] + void cols(LONG v); + + [propget, id(DISPID_IHTMLTEXTAREAELEMENT_COLS), displaybind, bindable] + LONG cols(); + + [propput, id(DISPID_IHTMLTEXTAREAELEMENT_WRAP), displaybind, bindable] + void wrap(BSTR v); + + [propget, id(DISPID_IHTMLTEXTAREAELEMENT_WRAP), displaybind, bindable] + BSTR wrap(); + + [id(DISPID_IHTMLTEXTAREAELEMENT_CREATETEXTRANGE)] + IHTMLTxtRange *createTextRange(); +} + /***************************************************************************** * DispHTMLUnknownElement interface */ @@ -10245,7 +10331,7 @@ interface IHTMLWindow4 : IDispatch [propget, id(DISPID_IHTMLWINDOW4_FRAMEELEMENT)] HRESULT frameElement([retval, out] IHTMLFrameBase* * p); -}; +} /***************************************************************************** * IHTMLWindow5 interface @@ -10263,7 +10349,7 @@ interface IHTMLWindow5 : IDispatch [propget, id(DISPID_IHTMLWINDOW5_XMLHTTPREQUEST)] HRESULT XMLHttpRequest([retval, out] VARIANT * p); -}; +} /***************************************************************************** * DispHTMLScreen dispinterface @@ -10902,7 +10988,7 @@ methods: [propget, id(DISPID_IHTMLWINDOW5_XMLHTTPREQUEST)] VARIANT XMLHttpRequest(); -}; +} /***************************************************************************** * HTMLWindowEvents interface @@ -10949,7 +11035,7 @@ methods: [id(DISPID_HTMLWINDOWEVENTS_ONAFTERPRINT)] void onafterprint(); -}; +} /***************************************************************************** * HTMLWindowEvents2 interface @@ -10996,7 +11082,7 @@ methods: [id(DISPID_HTMLWINDOWEVENTS2_ONAFTERPRINT)] void onafterprint([in] IHTMLEventObj* pEvtObj); -}; +} /***************************************************************************** * HTMLWindowProxy class @@ -11013,7 +11099,7 @@ coclass HTMLWindowProxy interface IHTMLWindow3; interface IHTMLWindow4; interface IHTMLWindow5; -}; +} /***************************************************************************** * HTMLDocumentEvents2 interface @@ -11473,7 +11559,7 @@ methods: [id(DISPID_HTMLTEXTCONTAINEREVENTS_ONSELECT)] void onselect(); -}; +} /***************************************************************************** * HTMLTextContainerEvents2 interface @@ -11677,7 +11763,7 @@ methods: [id(DISPID_HTMLTEXTCONTAINEREVENTS2_ONSELECT)] void onselect([in] IHTMLEventObj* pEvtObj); -}; +} /***************************************************************************** * IHTMLDocument interface @@ -13329,7 +13415,8 @@ methods: [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEWHEEL)] VARIANT_BOOL onmousewheel([in] IHTMLEventObj* pEvtObj); -}; +} + [ hidden, uuid(3050f33c-98b5-11cf-bb82-00aa00bdce0b) @@ -13526,8 +13613,7 @@ methods: [id(DISPID_HTMLELEMENTEVENTS_ONFOCUSOUT)] void onfocusout(); - -}; +} [ noncreatable, @@ -13943,7 +14029,7 @@ methods: [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEWHEEL)] VARIANT_BOOL onmousewheel([in] IHTMLEventObj* pEvtObj); -}; +} /***************************************************************************** * IHTMLTableCaption interface @@ -14153,7 +14239,7 @@ interface IHTMLTable2 : IDispatch HRESULT moveRow([defaultvalue(-1), in] LONG indexFrom, [defaultvalue(-1), in] LONG indexTo, [retval, out] IDispatch** row); -}; +} [ odl, @@ -14168,7 +14254,7 @@ interface IHTMLTable3 : IDispatch [propget, id(DISPID_IHTMLTABLE3_SUMMARY), displaybind, bindable] HRESULT summary([retval, out] BSTR * p); -}; +} [ noncreatable, @@ -14191,7 +14277,7 @@ coclass HTMLTable interface IHTMLTable; interface IHTMLTable2; interface IHTMLTable3; -}; +} [ odl, @@ -14626,6 +14712,74 @@ interface IHTMLScriptElement2 : IDispatch HRESULT charset([retval, out] BSTR *p); } +/***************************************************************************** + * DispHTMLScriptElement dispinterface + */ +[ + hidden, + uuid(3050f530-98b5-11cf-bb82-00aa00bdce0b) +] +dispinterface DispHTMLScriptElement +{ +properties: +methods: + WINE_HTMLELEMENT_DISPINTERFACE_DECL; + + [propput, id(DISPID_IHTMLSCRIPTELEMENT_SRC), displaybind, bindable] + void src(BSTR v); + + [propget, id(DISPID_IHTMLSCRIPTELEMENT_SRC), displaybind, bindable] + BSTR src(); + + [propput, id(DISPID_IHTMLSCRIPTELEMENT_HTMLFOR), displaybind, bindable] + void htmlFor(BSTR v); + + [propget, id(DISPID_IHTMLSCRIPTELEMENT_HTMLFOR), displaybind, bindable] + BSTR htmlFor(); + + [propput, id(DISPID_IHTMLSCRIPTELEMENT_EVENT), displaybind, bindable] + void event(BSTR v); + + [propget, id(DISPID_IHTMLSCRIPTELEMENT_EVENT), displaybind, bindable] + BSTR event(); + + [propput, id(DISPID_IHTMLSCRIPTELEMENT_TEXT), displaybind, bindable] + void text(BSTR v); + + [propget, id(DISPID_IHTMLSCRIPTELEMENT_TEXT), displaybind, bindable] + BSTR text(); + + [propput, id(DISPID_IHTMLSCRIPTELEMENT_DEFER), displaybind, bindable] + void defer(VARIANT_BOOL v); + + [propget, id(DISPID_IHTMLSCRIPTELEMENT_DEFER), displaybind, bindable] + VARIANT_BOOL defer(); + + [propput, id(DISPID_IHTMLSCRIPTELEMENT_ONERROR), displaybind, bindable] + void onerror(VARIANT v); + + [propget, id(DISPID_IHTMLSCRIPTELEMENT_ONERROR), displaybind, bindable] + VARIANT onerror(); + + [propput, id(DISPID_IHTMLSCRIPTELEMENT_TYPE), displaybind, bindable] + void type(BSTR v); + + [propget, id(DISPID_IHTMLSCRIPTELEMENT_TYPE), displaybind, bindable] + BSTR type(); + + [propput, id(DISPID_IHTMLSCRIPTELEMENT2_CHARSET), displaybind, bindable] + void charset(BSTR v); + + [propget, id(DISPID_IHTMLSCRIPTELEMENT2_CHARSET), displaybind, bindable] + BSTR charset(); + + [propput, id(DISPID_IHTMLSCRIPTELEMENT3_IE8_SRC)] + void ie8_src(BSTR v); + + [propget, id(DISPID_IHTMLSCRIPTELEMENT3_IE8_SRC)] + BSTR ie8_src(); +} + /***************************************************************************** * IHTMLFrameBase interface */ @@ -14692,6 +14846,61 @@ interface IHTMLFrameBase : IDispatch HRESULT scrolling([out, retval] BSTR *p); } +#define WINE_IHTMLFRAMEBASE_DISPINTERFACE_DECL \ + [propput, id(DISPID_IHTMLFRAMEBASE_SRC)] \ + void src(BSTR v); \ + \ + [propget, id(DISPID_IHTMLFRAMEBASE_SRC)] \ + BSTR src(); \ + \ + [propput, id(DISPID_IHTMLFRAMEBASE_NAME)] \ + void name(BSTR v); \ + \ + [propget, id(DISPID_IHTMLFRAMEBASE_NAME)] \ + BSTR name(); \ + \ + [propput, id(DISPID_IHTMLFRAMEBASE_BORDER)] \ + void border(VARIANT v); \ + \ + [propget, id(DISPID_IHTMLFRAMEBASE_BORDER)] \ + VARIANT border(); \ + \ + [propput, id(DISPID_IHTMLFRAMEBASE_FRAMEBORDER)] \ + void frameBorder(BSTR v); \ + \ + [propget, id(DISPID_IHTMLFRAMEBASE_FRAMEBORDER)] \ + BSTR frameBorder(); \ + \ + [propput, id(DISPID_IHTMLFRAMEBASE_FRAMESPACING)] \ + void frameSpacing(VARIANT v); \ + \ + [propget, id(DISPID_IHTMLFRAMEBASE_FRAMESPACING)] \ + VARIANT frameSpacing(); \ + \ + [propput, id(DISPID_IHTMLFRAMEBASE_MARGINWIDTH)] \ + void marginWidth(VARIANT v); \ + \ + [propget, id(DISPID_IHTMLFRAMEBASE_MARGINWIDTH)] \ + VARIANT marginWidth(); \ + \ + [propput, id(DISPID_IHTMLFRAMEBASE_MARGINHEIGHT)] \ + void marginHeight(VARIANT v); \ + \ + [propget, id(DISPID_IHTMLFRAMEBASE_MARGINHEIGHT)] \ + VARIANT marginHeight(); \ + \ + [propput, id(DISPID_IHTMLFRAMEBASE_NORESIZE)] \ + void noResize(VARIANT_BOOL v); \ + \ + [propget, id(DISPID_IHTMLFRAMEBASE_NORESIZE)] \ + VARIANT_BOOL noResize(); \ + \ + [propput, id(DISPID_IHTMLFRAMEBASE_SCROLLING)] \ + void scrolling(BSTR v); \ + \ + [propget, id(DISPID_IHTMLFRAMEBASE_SCROLLING)] \ + BSTR scrolling() + /***************************************************************************** * IHTMLFrameBase2 interface */ @@ -14728,6 +14937,152 @@ interface IHTMLFrameBase2 : IDispatch HRESULT allowTransparency([retval, out] VARIANT_BOOL *p); } +#define WINE_IHTMLFRAMEBASE2_DISPINTERFACE_DECL \ + [propget, id(DISPID_IHTMLFRAMEBASE2_CONTENTWINDOW)] \ + IHTMLWindow2 *contentWindow(); \ + \ + [propput, id(DISPID_IHTMLFRAMEBASE2_ONLOAD), displaybind, bindable] \ + void onload(VARIANT v); \ + \ + [propget, id(DISPID_IHTMLFRAMEBASE2_ONLOAD), displaybind, bindable] \ + VARIANT onload(); \ + \ + [propput, id(DISPID_IHTMLFRAMEBASE2_ALLOWTRANSPARENCY)] \ + void allowTransparency(VARIANT_BOOL v); \ + \ + [propget, id(DISPID_IHTMLFRAMEBASE2_ALLOWTRANSPARENCY)] \ + VARIANT_BOOL allowTransparency() + +#define WINE_IHTMLFRAMEBASE3_DISPINTERFACE_DECL \ + [propput, id(DISPID_IHTMLFRAMEBASE3_LONGDESC), displaybind, bindable] \ + void longDesc(BSTR v); \ + \ + [propget, id(DISPID_IHTMLFRAMEBASE3_LONGDESC), displaybind, bindable] \ + BSTR longDesc() + + +#define WINE_HTMLFRAMEBASE_DISPINTERFACE_DECL \ + WINE_HTMLDATAELEMENT_DISPINTERFACE_DECL; \ + WINE_IHTMLFRAMEBASE_DISPINTERFACE_DECL; \ + WINE_IHTMLFRAMEBASE2_DISPINTERFACE_DECL; \ + WINE_IHTMLFRAMEBASE3_DISPINTERFACE_DECL + +/***************************************************************************** + * IHTMLFrameElement3 interface + */ +[ + odl, + oleautomation, + dual, + uuid(3051042d-98b5-11cf-bb82-00aa00bdce0b) +] +interface IHTMLFrameElement3 : IDispatch +{ + [propget, id(DISPID_IHTMLFRAMEELEMENT3_CONTENTDOCUMENT)] + HRESULT contentDocument([out, retval] IDispatch **p); + + [propput, id(DISPID_IHTMLFRAMEELEMENT3_IE8_SRC)] + HRESULT src([in] BSTR v); + + [propget, id(DISPID_IHTMLFRAMEELEMENT3_IE8_SRC)] + HRESULT src([out, retval] BSTR *p); + + [propput, id(DISPID_IHTMLFRAMEELEMENT3_IE8_LONGDESC)] + HRESULT longDesc([in] BSTR v); + + [propget, id(DISPID_IHTMLFRAMEELEMENT3_IE8_LONGDESC)] + HRESULT longDesc([out, retval] BSTR *p); + + [propput, id(DISPID_IHTMLFRAMEELEMENT3_IE8_FRAMEBORDER)] + HRESULT frameBorder([in] BSTR v); + + [propget, id(DISPID_IHTMLFRAMEELEMENT3_IE8_FRAMEBORDER)] + HRESULT frameBorder([out, retval] BSTR * p); +} + +/***************************************************************************** + * DispHTMLFrameElement dispinterface + */ +[ + hidden, + uuid(3050f513-98b5-11cf-bb82-00aa00bdce0b) +] +dispinterface DispHTMLFrameElement +{ +properties: +methods: + WINE_HTMLFRAMEBASE_DISPINTERFACE_DECL; + + [propput, id(DISPID_IHTMLFRAMEELEMENT_BORDERCOLOR)] + void borderColor(VARIANT v); + + [propget, id(DISPID_IHTMLFRAMEELEMENT_BORDERCOLOR)] + VARIANT borderColor(); + + [propput, id(DISPID_IHTMLFRAMEELEMENT2_HEIGHT)] + void height(VARIANT v); + + [propget, id(DISPID_IHTMLFRAMEELEMENT2_HEIGHT)] + VARIANT height(); + + [propput, id(DISPID_IHTMLFRAMEELEMENT2_WIDTH)] + void width(VARIANT v); + + [propget, id(DISPID_IHTMLFRAMEELEMENT2_WIDTH)] + VARIANT width(); + + [propget, id(DISPID_IHTMLFRAMEELEMENT3_CONTENTDOCUMENT)] + IDispatch *contentDocument(); + + [propput, id(DISPID_IHTMLFRAMEELEMENT3_IE8_SRC)] + void ie8_src(BSTR v); + + [propget, id(DISPID_IHTMLFRAMEELEMENT3_IE8_SRC)] + BSTR ie8_src(); + + [propput, id(DISPID_IHTMLFRAMEELEMENT3_IE8_LONGDESC)] + void ie8_longDesc(BSTR v); + + [propget, id(DISPID_IHTMLFRAMEELEMENT3_IE8_LONGDESC)] + BSTR ie8_longDesc(); + + [propput, id(DISPID_IHTMLFRAMEELEMENT3_IE8_FRAMEBORDER)] + void ie8_frameBorder(BSTR v); + + [propget, id(DISPID_IHTMLFRAMEELEMENT3_IE8_FRAMEBORDER)] + BSTR ie8_frameBorder(); +} + +/***************************************************************************** + * IHTMLIFrameElement interface + */ +[ + odl, + oleautomation, + dual, + uuid(3050f315-98b5-11cf-bb82-00aa00bdce0b) +] +interface IHTMLIFrameElement : IDispatch +{ + [propput, id(DISPID_IHTMLIFRAMEELEMENT_VSPACE)] + HRESULT vspace([in] LONG v); + + [propget, id(DISPID_IHTMLIFRAMEELEMENT_VSPACE)] + HRESULT vspace([retval, out] LONG *p); + + [propput, id(DISPID_IHTMLIFRAMEELEMENT_HSPACE)] + HRESULT hspace([in] LONG v); + + [propget, id(DISPID_IHTMLIFRAMEELEMENT_HSPACE)] + HRESULT hspace([retval, out] LONG *p); + + [propput, id(DISPID_IHTMLIFRAMEELEMENT_ALIGN), displaybind, bindable] + HRESULT align([in] BSTR v); + + [propget, id(DISPID_IHTMLIFRAMEELEMENT_ALIGN), displaybind, bindable] + HRESULT align([retval, out] BSTR *p); +} + /***************************************************************************** * DispHTMLIFrame dispinterface */ @@ -14739,82 +15094,7 @@ dispinterface DispHTMLIFrame { properties: methods: - WINE_HTMLDATAELEMENT_DISPINTERFACE_DECL; - - [propput, id(DISPID_IHTMLFRAMEBASE_SRC)] - void src(BSTR v); - - [propget, id(DISPID_IHTMLFRAMEBASE_SRC)] - BSTR src(); - - [propput, id(DISPID_IHTMLFRAMEBASE_NAME)] - void name(BSTR v); - - [propget, id(DISPID_IHTMLFRAMEBASE_NAME)] - BSTR name(); - - [propput, id(DISPID_IHTMLFRAMEBASE_BORDER)] - void border(VARIANT v); - - [propget, id(DISPID_IHTMLFRAMEBASE_BORDER)] - VARIANT border(); - - [propput, id(DISPID_IHTMLFRAMEBASE_FRAMEBORDER)] - void frameBorder(BSTR v); - - [propget, id(DISPID_IHTMLFRAMEBASE_FRAMEBORDER)] - BSTR frameBorder(); - - [propput, id(DISPID_IHTMLFRAMEBASE_FRAMESPACING)] - void frameSpacing(VARIANT v); - - [propget, id(DISPID_IHTMLFRAMEBASE_FRAMESPACING)] - VARIANT frameSpacing(); - - [propput, id(DISPID_IHTMLFRAMEBASE_MARGINWIDTH)] - void marginWidth(VARIANT v); - - [propget, id(DISPID_IHTMLFRAMEBASE_MARGINWIDTH)] - VARIANT marginWidth(); - - [propput, id(DISPID_IHTMLFRAMEBASE_MARGINHEIGHT)] - void marginHeight(VARIANT v); - - [propget, id(DISPID_IHTMLFRAMEBASE_MARGINHEIGHT)] - VARIANT marginHeight(); - - [propput, id(DISPID_IHTMLFRAMEBASE_NORESIZE)] - void noResize(VARIANT_BOOL v); - - [propget, id(DISPID_IHTMLFRAMEBASE_NORESIZE)] - VARIANT_BOOL noResize(); - - [propput, id(DISPID_IHTMLFRAMEBASE_SCROLLING)] - void scrolling(BSTR v); - - [propget, id(DISPID_IHTMLFRAMEBASE_SCROLLING)] - BSTR scrolling(); - - [propget, id(DISPID_IHTMLFRAMEBASE2_CONTENTWINDOW)] - IHTMLWindow2 *contentWindow(); - - [propput, id(DISPID_IHTMLFRAMEBASE2_ONLOAD), displaybind, bindable] - void onload(VARIANT v); - - [propget, id(DISPID_IHTMLFRAMEBASE2_ONLOAD), displaybind, bindable] - VARIANT onload(); - - [propput, id(DISPID_IHTMLFRAMEBASE2_ALLOWTRANSPARENCY)] - void allowTransparency(VARIANT_BOOL v); - - [propget, id(DISPID_IHTMLFRAMEBASE2_ALLOWTRANSPARENCY)] - VARIANT_BOOL allowTransparency(); - - [propput, id(DISPID_IHTMLFRAMEBASE3_LONGDESC), displaybind, bindable] - void longDesc(BSTR v); - - [propget, id(DISPID_IHTMLFRAMEBASE3_LONGDESC), displaybind, bindable] - BSTR longDesc(); + WINE_HTMLFRAMEBASE_DISPINTERFACE_DECL; [propput, id(DISPID_IHTMLIFRAMEELEMENT_VSPACE)] void vspace(LONG v); @@ -15127,3 +15407,23 @@ interface IElementBehaviorFactory : IUnknown } } /* library MSHTML */ + +interface IOleCommandTarget; + +/***************************************************************************** + * IHTMLPrivateWindow interface + */ +[ + object, + uuid(3050f6dc-98b5-11cf-bb82-00aa00bdce0b), + local +] +interface IHTMLPrivateWindow : IUnknown +{ + HRESULT SuperNavigate(BSTR url, BSTR arg2, BSTR arg3, BSTR arg4, VARIANT *post_data, VARIANT *headers, ULONG flags); + HRESULT GetPendingUrl(BSTR *url); + HRESULT SetPICSTarget(IOleCommandTarget *cmdtrg); + HRESULT PICSComplete(int arg); + HRESULT FindWindowByName(LPCWSTR name, IHTMLWindow2 **ret); + HRESULT GetAddressBarUrl(BSTR *url); +} diff --git a/reactos/include/psdk/msi.h b/reactos/include/psdk/msi.h index 2c0a37fe43b..b331057d53c 100644 --- a/reactos/include/psdk/msi.h +++ b/reactos/include/psdk/msi.h @@ -503,6 +503,10 @@ UINT WINAPI MsiGetPatchInfoExA(LPCSTR, LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPCSTR UINT WINAPI MsiGetPatchInfoExW(LPCWSTR, LPCWSTR, LPCWSTR, MSIINSTALLCONTEXT, LPCWSTR, LPWSTR, LPDWORD); #define MsiGetPatchInfoEx WINELIB_NAME_AW(MsiGetPatchInfoEx) +UINT WINAPI MsiGetPatchInfoA(LPCSTR, LPCSTR, LPSTR, LPDWORD); +UINT WINAPI MsiGetPatchInfoW(LPCWSTR, LPCWSTR, LPWSTR, LPDWORD); +#define MsiGetPatchInfo WINELIB_NAME_AW(MsiGetPatchInfo) + UINT WINAPI MsiEnableLogA(DWORD, LPCSTR, DWORD); UINT WINAPI MsiEnableLogW(DWORD, LPCWSTR, DWORD); #define MsiEnableLog WINELIB_NAME_AW(MsiEnableLog) @@ -597,6 +601,10 @@ UINT WINAPI MsiSourceListEnumSourcesA(LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, UINT WINAPI MsiSourceListEnumSourcesW(LPCWSTR, LPCWSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPWSTR, LPDWORD); #define MsiSourceListEnumSources WINELIB_NAME_AW(MsiSourceListEnumSources) +UINT WINAPI MsiSourceListClearSourceA(LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR); +UINT WINAPI MsiSourceListClearSourceW(LPCWSTR, LPCWSTR, MSIINSTALLCONTEXT, DWORD, LPCWSTR); +#define MsiSourceListClearSource WINELIB_NAME_AW(MsiSourceListClearSource) + UINT WINAPI MsiSourceListClearAllA(LPCSTR, LPCSTR, DWORD); UINT WINAPI MsiSourceListClearAllW(LPCWSTR, LPCWSTR, DWORD); #define MsiSourceListClearAll WINELIB_NAME_AW(MsiSourceListClearAll) diff --git a/reactos/include/psdk/msidefs.h b/reactos/include/psdk/msidefs.h index d87569f61c6..a3b487c8573 100644 --- a/reactos/include/psdk/msidefs.h +++ b/reactos/include/psdk/msidefs.h @@ -222,6 +222,15 @@ enum msidbRemoveFileInstallMode msidbRemoveFileInstallModeOnBoth = 0x00000003, }; +enum +{ + msidbIniFileActionAddLine = 0x00000000, + msidbIniFileActionCreateLine = 0x00000001, + msidbIniFileActionRemoveLine = 0x00000002, + msidbIniFileActionAddTag = 0x00000003, + msidbIniFileActionRemoveTag = 0x00000004 +}; + /* * Windows SDK braindamage alert * diff --git a/reactos/include/psdk/msxml2.idl b/reactos/include/psdk/msxml2.idl index e6f07b3b8b4..89914004955 100644 --- a/reactos/include/psdk/msxml2.idl +++ b/reactos/include/psdk/msxml2.idl @@ -1070,6 +1070,14 @@ coclass DOMDocument30 [default, source] dispinterface XMLDOMDocumentEvents; } +[ + uuid(88d969c0-f192-11d4-a65f-0040963251e5) +] +coclass DOMDocument40 +{ + [default] interface IXMLDOMDocument2; + [default, source] dispinterface XMLDOMDocumentEvents; +} [ uuid(F6D90F12-9C73-11D3-B32E-00C04F990BB4) @@ -1971,6 +1979,15 @@ coclass SAXXMLReader30 interface IMXReaderControl; }; +[ + uuid(7c6e29bc-8b8b-4c3d-859e-af6cd158be0f) +] +coclass SAXXMLReader40 +{ + [default] interface IVBSAXXMLReader; + interface ISAXXMLReader; +}; + [ uuid(fc220ad8-a72a-4ee8-926e-0b7ad152a020) ] diff --git a/reactos/include/ddk/ntddkbd.h b/reactos/include/psdk/ntddkbd.h similarity index 94% rename from reactos/include/ddk/ntddkbd.h rename to reactos/include/psdk/ntddkbd.h index eb96245e0de..2f06bcf6fa9 100644 --- a/reactos/include/ddk/ntddkbd.h +++ b/reactos/include/psdk/ntddkbd.h @@ -63,6 +63,13 @@ DEFINE_GUID(GUID_DEVINTERFACE_KEYBOARD, \ #define KEY_E0 2 #define KEY_E1 4 +#define KEYBOARD_LED_INJECTED 0x8000 +#define KEYBOARD_SHADOW 0x4000 +#define KEYBOARD_KANA_LOCK_ON 8 +#define KEYBOARD_CAPS_LOCK_ON 4 +#define KEYBOARD_NUM_LOCK_ON 2 +#define KEYBOARD_SCROLL_LOCK_ON 1 + typedef struct _KEYBOARD_INPUT_DATA { USHORT UnitId; USHORT MakeCode; diff --git a/reactos/include/ddk/ntdef.h b/reactos/include/psdk/ntdef.h similarity index 93% rename from reactos/include/ddk/ntdef.h rename to reactos/include/psdk/ntdef.h index 49772bfe001..a0aae3ec3a3 100644 --- a/reactos/include/ddk/ntdef.h +++ b/reactos/include/psdk/ntdef.h @@ -13,6 +13,14 @@ #include #include +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif typedef unsigned long POINTER_64; // FIXME! HACK!!! @@ -79,22 +87,33 @@ typedef unsigned long POINTER_64; // FIXME! HACK!!! #endif #endif // NULL +typedef enum _EVENT_TYPE { + NotificationEvent, + SynchronizationEvent +} EVENT_TYPE; + +typedef enum _TIMER_TYPE { + NotificationTimer, + SynchronizationTimer +} TIMER_TYPE; + +typedef enum _WAIT_TYPE { + WaitAll, + WaitAny +} WAIT_TYPE; // // FIXME // We should use the -fms-extensions compiler flag for gcc, // and clean up the mess. // +#ifndef __ANONYMOUS_DEFINED +#define __ANONYMOUS_DEFINED + #ifndef NONAMELESSUNION #ifdef __GNUC__ -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) -#define _ANONYMOUS_UNION __extension__ -#define _ANONYMOUS_STRUCT __extension__ -#else -#if defined(__cplusplus) -#define _ANONYMOUS_UNION __extension__ -#endif /* __cplusplus */ -#endif /* __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) */ +#define _ANONYMOUS_UNION __GNU_EXTENSION +#define _ANONYMOUS_STRUCT __GNU_EXTENSION #elif defined(__WATCOMC__) || defined(_MSC_VER) #define _ANONYMOUS_UNION #define _ANONYMOUS_STRUCT @@ -130,20 +149,28 @@ typedef unsigned long POINTER_64; // FIXME! HACK!!! #define DUMMYSTRUCTNAME s #define DUMMYSTRUCTNAME2 s2 #define DUMMYSTRUCTNAME3 s3 +#define DUMMYSTRUCTNAME4 s4 +#define DUMMYSTRUCTNAME5 s5 #else #define _STRUCT_NAME(x) #define DUMMYSTRUCTNAME #define DUMMYSTRUCTNAME2 #define DUMMYSTRUCTNAME3 +#define DUMMYSTRUCTNAME4 +#define DUMMYSTRUCTNAME5 #endif - +#endif /* __ANONYMOUS_DEFINED */ // FIXME #undef UNALIGNED #define UNALIGNED #define RESTRICTED_POINTER + +#define ARGUMENT_PRESENT(ArgumentPointer) \ + ((CHAR*)((ULONG_PTR)(ArgumentPointer)) != (CHAR*)NULL) + // // Returns the base address of a structure from a structure member // @@ -332,7 +359,7 @@ typedef struct _QUAD { _ANONYMOUS_UNION union { - __int64 UseThisFieldToCopy; + __GNU_EXTENSION __int64 UseThisFieldToCopy; double DoNotUseThisField; }; } QUAD, *PQUAD, UQUAD, *PUQUAD; @@ -354,6 +381,9 @@ typedef ULONG FLONG; typedef UCHAR BOOLEAN; typedef BOOLEAN *PBOOLEAN; +typedef ULONG LOGICAL; +typedef ULONG *PLOGICAL; + // // Signed Types // @@ -374,8 +404,8 @@ typedef LONG HRESULT; // // 64-bit types // -typedef __int64 LONGLONG, *PLONGLONG; -typedef unsigned __int64 ULONGLONG, *PULONGLONG; +__GNU_EXTENSION typedef __int64 LONGLONG, *PLONGLONG; +__GNU_EXTENSION typedef unsigned __int64 ULONGLONG, *PULONGLONG; typedef ULONGLONG DWORDLONG, *PDWORDLONG; // @@ -644,6 +674,19 @@ typedef struct _SINGLE_LIST_ENTRY { } SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY; +typedef struct _PROCESSOR_NUMBER { + USHORT Group; + UCHAR Number; + UCHAR Reserved; +} PROCESSOR_NUMBER, *PPROCESSOR_NUMBER; + +typedef EXCEPTION_DISPOSITION +(DDKAPI *PEXCEPTION_ROUTINE)( + IN struct _EXCEPTION_RECORD *ExceptionRecord, + IN PVOID EstablisherFrame, + IN OUT struct _CONTEXT *ContextRecord, + IN OUT PVOID DispatcherContext); + // // Helper Macros diff --git a/reactos/include/psdk/objidl.idl b/reactos/include/psdk/objidl.idl index e54fb1c7446..70f93ab3179 100644 --- a/reactos/include/psdk/objidl.idl +++ b/reactos/include/psdk/objidl.idl @@ -907,7 +907,7 @@ interface IStorage : IUnknown [call_as(OpenStream)] HRESULT RemoteOpenStream( [in] LPCOLESTR pwcsName, - [in] ULONG cbReserved1, + [in] unsigned long cbReserved1, [in, unique, size_is(cbReserved1)] byte *reserved1, [in] DWORD grfMode, [in] DWORD reserved2, @@ -955,7 +955,7 @@ interface IStorage : IUnknown [call_as(EnumElements)] HRESULT RemoteEnumElements( [in] DWORD reserved1, - [in] ULONG cbReserved2, + [in] unsigned long cbReserved2, [in, unique, size_is(cbReserved2)] byte *reserved2, [in] DWORD reserved3, [out] IEnumSTATSTG **ppenum); @@ -1950,6 +1950,9 @@ interface IClientSecurity : IUnknown void *pAuthInfo; } SOLE_AUTHENTICATION_INFO; + const OLECHAR *COLE_DEFAULT_PRINCIPAL = (OLECHAR*) -1; + const void *COLE_DEFAULT_AUTHINFO = (void*) -1; + typedef struct tagSOLE_AUTHENTICATION_LIST { DWORD cAuthInfo; SOLE_AUTHENTICATION_INFO *aAuthInfo; diff --git a/reactos/include/psdk/oledb.idl b/reactos/include/psdk/oledb.idl index dd6b2181307..127df2b4906 100644 --- a/reactos/include/psdk/oledb.idl +++ b/reactos/include/psdk/oledb.idl @@ -15,14 +15,53 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +cpp_quote("#ifdef _WIN64") +cpp_quote("#include ") +cpp_quote("#else") +cpp_quote("#include ") +cpp_quote("#endif") +cpp_quote("") import "wtypes.idl"; import "oaidl.idl"; import "ocidl.idl"; import "propidl.idl"; +import "urlmon.idl"; typedef ULONG DBBYTEOFFSET; +typedef LONG DBROWOFFSET; +typedef LONG DBROWCOUNT; +typedef ULONG DBCOUNTITEM; +typedef ULONG DBLENGTH; +typedef ULONG DBORDINAL; +typedef ULONG DBBKMARK; +typedef DWORD DB_DWRESERVE; +typedef ULONG DBREFCOUNT; +typedef ULONG DB_UPARAMS; +typedef LONG DB_LPARAMS; +typedef DWORD DBHASHVALUE; -#include "dbinit.idl" #include "dbs.idl" + +#include "access.idl" +#include "rstbas.idl" +#include "rstinf.idl" +#include "rstloc.idl" +#include "cmdbas.idl" +#include "cmdtxt.idl" +#include "dbccmd.idl" +#include "dbcses.idl" #include "dbprop.idl" +#include "dbinit.idl" +#include "dbdsad.idl" +#include "asynot.idl" +#include "asysta.idl" +#include "sesprp.idl" +#include "opnrst.idl" +#include "row.idl" +#include "rowchg.idl" +#include "binres.idl" +#include "crtrow.idl" + +cpp_quote("#include ") +cpp_quote("") diff --git a/reactos/include/psdk/opnrst.idl b/reactos/include/psdk/opnrst.idl new file mode 100644 index 00000000000..e6b5237ee57 --- /dev/null +++ b/reactos/include/psdk/opnrst.idl @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + object, + uuid(0c733a69-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface IOpenRowset : IUnknown +{ + [local] + HRESULT OpenRowset([in] IUnknown *pUnkOuter, + [in, unique] DBID *pTableID, + [in, unique] DBID *pIndexID, + [in] REFIID riid, + [in] ULONG cPropertySets, + [in, out, size_is(cPropertySets)] DBPROPSET rgPropertySets[], + [out, iid_is(riid)] IUnknown **ppRowset); + + [call_as(OpenRowset)] + HRESULT RemoteOpenRowset([in] IUnknown *pUnkOuter, + [in, unique] DBID *pTableID, + [in, unique] DBID *pIndexID, + [in] REFIID riid, + [in] ULONG cPropertySets, + [in, unique, size_is(cPropertySets)] DBPROPSET *rgPropertySets, + [in, out, unique, iid_is(riid)] IUnknown **ppRowset, + [in] ULONG cTotalProps, + [out, size_is(cTotalProps)] DBPROPSTATUS *rgPropStatus, + [out] IErrorInfo **ppErrorInfoRem); + +} diff --git a/reactos/include/psdk/pdh.h b/reactos/include/psdk/pdh.h index d79241bf92e..7f3d3340b21 100644 --- a/reactos/include/psdk/pdh.h +++ b/reactos/include/psdk/pdh.h @@ -37,6 +37,10 @@ typedef HANDLE PDH_HQUERY; typedef HANDLE PDH_HCOUNTER; typedef HANDLE PDH_HLOG; +#define PDH_CVERSION_WIN40 0x0400 +#define PDH_CVERSION_WIN50 0x0500 +#define PDH_VERSION 0x0503 + #define PDH_MAX_SCALE 7 #define PDH_MIN_SCALE (-7) @@ -49,6 +53,10 @@ typedef HANDLE PDH_HLOG; #define PDH_FMT_1000 0x00002000 #define PDH_FMT_NOCAP100 0x00008000 +#define DATA_SOURCE_REGISTRY 0x00000001 +#define DATA_SOURCE_LOGFILE 0x00000002 +#define DATA_SOURCE_WBEM 0x00000004 + typedef struct _PDH_FMT_COUNTERVALUE { DWORD CStatus; @@ -182,6 +190,7 @@ PDH_STATUS WINAPI PdhGetCounterInfoA(PDH_HCOUNTER, BOOLEAN, LPDWORD, PPDH_COUNTE PDH_STATUS WINAPI PdhGetCounterInfoW(PDH_HCOUNTER, BOOLEAN, LPDWORD, PPDH_COUNTER_INFO_W); #define PdhGetCounterInfo WINELIB_NAME_AW(PdhGetCounterInfo) PDH_STATUS WINAPI PdhGetCounterTimeBase(PDH_HCOUNTER, LONGLONG *); +PDH_STATUS WINAPI PdhGetDllVersion(LPDWORD); PDH_STATUS WINAPI PdhGetFormattedCounterValue(PDH_HCOUNTER, DWORD, LPDWORD, PPDH_FMT_COUNTERVALUE); PDH_STATUS WINAPI PdhGetRawCounterValue(PDH_HCOUNTER, LPDWORD, PPDH_RAW_COUNTER); PDH_STATUS WINAPI PdhLookupPerfIndexByNameA(LPCSTR, LPCSTR, LPDWORD); @@ -198,6 +207,7 @@ PDH_STATUS WINAPI PdhOpenQueryW(LPCWSTR, DWORD_PTR, PDH_HQUERY *); #define PdhOpenQuery WINELIB_NAME_AW(PdhOpenQuery) PDH_STATUS WINAPI PdhRemoveCounter(PDH_HCOUNTER); PDH_STATUS WINAPI PdhSetCounterScaleFactor(PDH_HCOUNTER, LONG); +PDH_STATUS WINAPI PdhSetDefaultRealTimeDataSource(DWORD); PDH_STATUS WINAPI PdhValidatePathA(LPCSTR); PDH_STATUS WINAPI PdhValidatePathW(LPCWSTR); #define PdhValidatePath WINELIB_NAME_AW(PdhValidatePath) diff --git a/reactos/include/psdk/propidl.idl b/reactos/include/psdk/propidl.idl index be673943d9a..e2da625fb44 100644 --- a/reactos/include/psdk/propidl.idl +++ b/reactos/include/psdk/propidl.idl @@ -206,7 +206,17 @@ interface IPropertyStorage : IUnknown typedef struct tagPROPVARIANT *LPPROPVARIANT; - cpp_quote("#define REFPROPVARIANT const PROPVARIANT *") + cpp_quote("#if 0") + typedef const PROPVARIANT * REFPROPVARIANT; + cpp_quote("#endif") + cpp_quote("#ifndef _REFPROPVARIANT_DEFINED") + cpp_quote("#define _REFPROPVARIANT_DEFINED") + cpp_quote("#ifdef __cplusplus") + cpp_quote("#define REFPROPVARIANT const PROPVARIANT &") + cpp_quote("#else") + cpp_quote("#define REFPROPVARIANT const PROPVARIANT * __MIDL_CONST") + cpp_quote("#endif") + cpp_quote("#endif") cpp_quote("#define PIDDI_THUMBNAIL 0x00000002L /* VT_BLOB */") cpp_quote("") diff --git a/reactos/include/psdk/psdk.rbuild b/reactos/include/psdk/psdk.rbuild index 3be7924f692..02256ebc338 100644 --- a/reactos/include/psdk/psdk.rbuild +++ b/reactos/include/psdk/psdk.rbuild @@ -1,13 +1,16 @@ + activaut.idl activdbg.idl activscp.idl + bdaiface.idl bits1_5.idl bits.idl commoncontrols.idl control.idl + ctfutb.idl ctxtcall.idl dimm.idl dispex.idl @@ -49,6 +52,7 @@ shtypes.idl strmif.idl textstor.idl + tuner.idl tom.idl unknwn.idl urlhist.idl @@ -63,7 +67,9 @@ comcat.idl xmldso.idl xmldom.idl + xmllite.idl stdole2.idl - \ No newline at end of file + + \ No newline at end of file diff --git a/reactos/include/psdk/pstore.idl b/reactos/include/psdk/pstore.idl index 62ce00b8da1..590b905df3d 100644 --- a/reactos/include/psdk/pstore.idl +++ b/reactos/include/psdk/pstore.idl @@ -34,6 +34,18 @@ typedef DWORD PST_KEY; typedef DWORD PST_PROVIDERCAPABILITIES; typedef GUID PST_PROVIDERID, *PPST_PROVIDERID; +/***************************************************************************** + * PSTOREC library + */ +[ + uuid(5a6f1ebd-2db1-11d0-8c39-00c04fd9126b), + version(1.0), + helpstring("PStore 1.0 Type Library") +] +library PSTORECLib +{ + importlib("stdole2.tlb"); + typedef struct _PST_PROVIDERINFO { DWORD cbSize; @@ -50,27 +62,27 @@ typedef struct _PST_PROMPTINFO LPCWSTR szPrompt; } PST_PROMPTINFO, *PPST_PROMPTINFO; -typedef struct { +typedef struct _PST_ACCESSCLAUSE { DWORD cbSize; PST_ACCESSCLAUSETYPE ClauseType; DWORD cbClauseData; BYTE* pbClauseData; } PST_ACCESSCLAUSE, *PPST_ACCESSCLAUSE; -typedef struct { +typedef struct _PST_ACCESSRULE { DWORD cbSize; PST_ACCESSMODE AccessModeFlags; DWORD cClauses; PST_ACCESSCLAUSE* rgClauses; } PST_ACCESSRULE, *PPST_ACCESSRULE; -typedef struct { +typedef struct _PST_ACCESSRULESET { DWORD cbSize; DWORD cClause; PST_ACCESSRULE* rgRules; } PST_ACCESSRULESET, *PPST_ACCESSRULESET; -typedef struct { +typedef struct _PST_TYPEINFO { DWORD cbSize; LPWSTR szDisplayName; } PST_TYPEINFO, *PPST_TYPEINFO; @@ -259,3 +271,5 @@ interface IPStore : IUnknown [in] DWORD dwFlags, [in] IEnumPStoreItems** ppenum ); } + +}; diff --git a/reactos/include/psdk/row.idl b/reactos/include/psdk/row.idl new file mode 100644 index 00000000000..59df27948a5 --- /dev/null +++ b/reactos/include/psdk/row.idl @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + local, + object, + uuid(0c733ab4-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface IRow : IUnknown +{ + [local] + HRESULT GetColumns([in] DBORDINAL cColumns, + [in, out, size_is(cColumns), annotation("__inout_ecount(cColumns)")] DBCOLUMNACCESS rgColumns[]); + + + HRESULT GetSourceRowset([in, annotation("__in")] REFIID riid, + [out, iid_is(riid), annotation("__deref_opt_out_opt")] IUnknown **ppRowset, + [out, annotation("__out_opt")] HROW *phRow); + + HRESULT Open([in, unique, annotation("__in_opt")] IUnknown *pUnkOuter, + [in, annotation("__in")] DBID *pColumnID, + [in, annotation("__in")] REFGUID rguidColumnType, + [in] DWORD dwBindFlags, + [in, annotation("__in")] REFIID riid, + [out, iid_is(riid), annotation("__deref_opt_out")] IUnknown **ppUnk); +} diff --git a/reactos/include/psdk/rowchg.idl b/reactos/include/psdk/rowchg.idl new file mode 100644 index 00000000000..86c7ad49655 --- /dev/null +++ b/reactos/include/psdk/rowchg.idl @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + local, + object, + uuid(0c733ab5-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface IRowChange : IUnknown +{ + [local] + HRESULT SetColumns([in] DBORDINAL cColumns, + [in, out, size_is(cColumns), annotation("__in_ecount(cColumns)")] DBCOLUMNACCESS rgColumns[]); +} diff --git a/reactos/include/psdk/rpcdce.h b/reactos/include/psdk/rpcdce.h index 9486a35f1f5..439f16483aa 100644 --- a/reactos/include/psdk/rpcdce.h +++ b/reactos/include/psdk/rpcdce.h @@ -108,6 +108,11 @@ typedef I_RPC_HANDLE *RPC_EP_INQ_HANDLE; #define RPC_C_LISTEN_MAX_CALLS_DEFAULT 1234 #define RPC_C_PROTSEQ_MAX_REQS_DEFAULT 10 +#define RPC_PROTSEQ_TCP 0x1 +#define RPC_PROTSEQ_NMP 0x2 +#define RPC_PROTSEQ_LRPC 0x3 +#define RPC_PROTSEQ_HTTP 0x4 + /* RPC_POLICY EndpointFlags */ #define RPC_C_BIND_TO_ALL_NICS 0x1 #define RPC_C_USE_INTERNET_PORT 0x1 @@ -158,8 +163,8 @@ typedef I_RPC_HANDLE *RPC_EP_INQ_HANDLE; #define RPC_C_IMP_LEVEL_DELEGATE 4 /* values for RPC_SECURITY_QOS*::IdentityTracking */ -#define RPC_C_QOS_IDENTIFY_STATIC 0 -#define RPC_C_QOS_IDENTIFY_DYNAMIC 1 +#define RPC_C_QOS_IDENTITY_STATIC 0 +#define RPC_C_QOS_IDENTITY_DYNAMIC 1 /* flags for RPC_SECURITY_QOS*::Capabilities */ #define RPC_C_QOS_CAPABILITIES_DEFAULT 0x0 @@ -190,7 +195,7 @@ typedef I_RPC_HANDLE *RPC_EP_INQ_HANDLE; #define RPC_C_HTTP_AUTHN_SCHEME_NEGOTIATE 0x10 typedef RPC_STATUS RPC_ENTRY RPC_IF_CALLBACK_FN( RPC_IF_HANDLE InterfaceUuid, void *Context ); -typedef void (__RPC_USER *RPC_AUTH_KEY_RETRIEVAL_FN)( void *Arg, unsigned char *ServerPrincName, unsigned long KeyVer, void **Key, RPC_STATUS *Status ); +typedef void (__RPC_USER *RPC_AUTH_KEY_RETRIEVAL_FN)(void *, RPC_WSTR, ULONG, void **, RPC_STATUS *); typedef struct _RPC_POLICY { @@ -504,6 +509,28 @@ RPCRTAPI RPC_STATUS RPC_ENTRY ULONG *AuthnSvc, RPC_AUTH_IDENTITY_HANDLE *AuthIdentity, ULONG *AuthzSvc ); #define RpcBindingInqAuthInfo WINELIB_NAME_AW(RpcBindingInqAuthInfo) +RPCRTAPI RPC_STATUS RPC_ENTRY + RpcBindingInqAuthClientA( RPC_BINDING_HANDLE ClientBinding, RPC_AUTHZ_HANDLE *Privs, + RPC_CSTR *ServerPrincName, ULONG *AuthnLevel, ULONG *AuthnSvc, + ULONG *AuthzSvc ); + +RPCRTAPI RPC_STATUS RPC_ENTRY + RpcBindingInqAuthClientW( RPC_BINDING_HANDLE ClientBinding, RPC_AUTHZ_HANDLE *Privs, + RPC_WSTR *ServerPrincName, ULONG *AuthnLevel, ULONG *AuthnSvc, + ULONG *AuthzSvc ); +#define RpcBindingInqAuthClient WINELIB_NAME_AW(RpcBindingInqAuthClient) + +RPCRTAPI RPC_STATUS RPC_ENTRY + RpcBindingInqAuthClientExA( RPC_BINDING_HANDLE ClientBinding, RPC_AUTHZ_HANDLE *Privs, + RPC_CSTR *ServerPrincName, ULONG *AuthnLevel, ULONG *AuthnSvc, + ULONG *AuthzSvc, ULONG Flags ); + +RPCRTAPI RPC_STATUS RPC_ENTRY + RpcBindingInqAuthClientExW( RPC_BINDING_HANDLE ClientBinding, RPC_AUTHZ_HANDLE *Privs, + RPC_WSTR *ServerPrincName, ULONG *AuthnLevel, ULONG *AuthnSvc, + ULONG *AuthzSvc, ULONG Flags ); +#define RpcBindingInqAuthClientEx WINELIB_NAME_AW(RpcBindingInqAuthClientEx) + RPCRTAPI RPC_STATUS RPC_ENTRY RpcCancelThread(void*); RPCRTAPI RPC_STATUS RPC_ENTRY RpcCancelThreadEx(void*,LONG); diff --git a/reactos/include/psdk/rpcndr.h b/reactos/include/psdk/rpcndr.h index 9d0df1ae2aa..9691dba9ecd 100644 --- a/reactos/include/psdk/rpcndr.h +++ b/reactos/include/psdk/rpcndr.h @@ -104,8 +104,8 @@ extern "C" { #define small char typedef unsigned char byte; -#define hyper __int64 -#define MIDL_uhyper unsigned __int64 +typedef INT64 hyper; +typedef UINT64 MIDL_uhyper; typedef unsigned char boolean; #define __RPC_CALLEE WINAPI @@ -128,7 +128,7 @@ typedef unsigned char boolean; (RpcExceptionCode() == RPC_X_BAD_STUB_DATA) || \ (RpcExceptionCode() == RPC_S_INVALID_BOUND)) -typedef struct _NDR_SCONTEXT +typedef struct { void *pad[2]; void *userContext; @@ -211,19 +211,19 @@ typedef struct _MIDL_STUB_MESSAGE struct _FULL_PTR_XLAT_TABLES *FullPtrXlatTables; ULONG FullPtrRefId; ULONG PointerLength; - int fInDontFree:1; - int fDontCallFreeInst:1; - int fInOnlyParam:1; - int fHasReturn:1; - int fHasExtensions:1; - int fHasNewCorrDesc:1; - int fIsIn:1; - int fIsOut:1; - int fIsOicf:1; - int fBufferValid:1; - int fHasMemoryValidateCallback:1; - int fInFree:1; - int fNeedMCCP:1; + unsigned int fInDontFree:1; + unsigned int fDontCallFreeInst:1; + unsigned int fInOnlyParam:1; + unsigned int fHasReturn:1; + unsigned int fHasExtensions:1; + unsigned int fHasNewCorrDesc:1; + unsigned int fIsIn:1; + unsigned int fIsOut:1; + unsigned int fIsOicf:1; + unsigned int fBufferValid:1; + unsigned int fHasMemoryValidateCallback:1; + unsigned int fInFree:1; + unsigned int fNeedMCCP:1; int fUnused:3; int fUnused2:16; DWORD dwDestContext; @@ -390,7 +390,11 @@ typedef struct _MIDL_SYNTAX_INFO typedef void (__RPC_API *STUB_THUNK)( PMIDL_STUB_MESSAGE ); +#ifdef WINE_STRICT_PROTOTYPES +typedef LONG (__RPC_API *SERVER_ROUTINE)(void); +#else typedef LONG (__RPC_API *SERVER_ROUTINE)(); +#endif typedef struct _MIDL_SERVER_INFO_ { diff --git a/reactos/include/psdk/rstbas.idl b/reactos/include/psdk/rstbas.idl new file mode 100644 index 00000000000..d7859ed5085 --- /dev/null +++ b/reactos/include/psdk/rstbas.idl @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + local, + object, + uuid(0c733a7c-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface IRowset : IUnknown +{ + typedef DWORD DBROWOPTIONS; + + HRESULT AddRefRows([in] DBCOUNTITEM cRows, + [in, size_is(cRows)] const HROW rghRows[], + [out, size_is(cRows)] DBREFCOUNT rgRefCounts[], + [out, size_is(cRows)] DBROWSTATUS rgRowStatus[]); + + HRESULT GetData([in] HROW hRow, + [in] HACCESSOR hAccessor, + [out] void *pData); + + HRESULT GetNextRows([in] HCHAPTER hReserved, + [in] DBROWOFFSET lRowsOffset, + [in] DBROWCOUNT cRows, + [out] DBCOUNTITEM *pcRowObtained, + [out, size_is(,cRows)] HROW **prghRows); + + HRESULT ReleaseRows([in] DBCOUNTITEM cRows, + [in, size_is(cRows)] const HROW rghRows[], + [in, size_is(cRows)] DBROWOPTIONS rgRowOptions[], + [out, size_is(cRows)] DBREFCOUNT rgRefCounts[], + [out, size_is(cRows)] DBROWSTATUS rgRowStatus[]); + + HRESULT RestartPosition([in] HCHAPTER hReserved); +} diff --git a/reactos/include/psdk/rstinf.idl b/reactos/include/psdk/rstinf.idl new file mode 100644 index 00000000000..16d269377a0 --- /dev/null +++ b/reactos/include/psdk/rstinf.idl @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + object, + uuid(0c733a55-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface IRowsetInfo : IUnknown +{ + [local] + HRESULT GetProperties([in] const ULONG cPropertyIDSets, + [in, size_is(cPropertyIDSets), annotation("__in_ecount_opt(cPropertyIDSets)")] const DBPROPIDSET rgPropertyIDSets[], + [in, out, annotation("__out")] ULONG *pcPropertySets, + [out, size_is(,*pcPropertySets), annotation("__deref_out_ecount_opt(*pcPropertySets)")] DBPROPSET **prgPropertySets); + + [call_as(GetProperties)] + HRESULT RemoteGetProperties([in] ULONG cPropertyIDSets, + [in, unique, size_is(cPropertyIDSets)] const DBPROPIDSET *rgPropertyIDSets, + [in, out] ULONG *pcPropertySets, + [out, size_is(,*pcPropertySets)] DBPROPSET **prgPropertySets, + [out] IErrorInfo **ppErrorInfoRem); + + [local] + HRESULT GetReferencedRowset([in] DBORDINAL iOrdinal, + [in, annotation("__in")] REFIID riid, + [out, iid_is(riid), annotation("deref_out_opt")] IUnknown **ppReferencedRowset); + + [call_as(GetReferencedRowset)] + HRESULT RemoteGetReferencedRowset([in] DBORDINAL iOrdinal, + [in] REFIID riid, + [out, iid_is(riid)] IUnknown **ppReferencedRowset, + [out] IErrorInfo **ppErrorInfoRem); + [local] + HRESULT GetSpecification([in, annotation("__in")] REFIID riid, + [out, iid_is(riid), annotation("__deref_out_opt")] IUnknown **ppSpecification); + + [call_as(GetSpecification)] + HRESULT RemoteGetSpecification([in] REFIID riid, + [out, iid_is(riid)] IUnknown **ppSpecification, + [out] IErrorInfo **ppErrorInfoRem); + +} diff --git a/reactos/include/psdk/rstloc.idl b/reactos/include/psdk/rstloc.idl new file mode 100644 index 00000000000..f579581c367 --- /dev/null +++ b/reactos/include/psdk/rstloc.idl @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + local, + object, + uuid(0c733a7d-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface IRowsetLocate : IRowset +{ + typedef DWORD DBCOMPARE; + + enum DBCOMPAREENUM + { + DBCOMPARE_LT, + DBCOMPARE_EQ, + DBCOMPARE_GT, + DBCOMPARE_NE, + DBCOMPARE_NOTCOMPARABLE + }; + + HRESULT Compare([in] HCHAPTER hReserved, + [in] DBBKMARK cbBookmark1, + [in, size_is(cbBookmark1)] const BYTE *pBookmark1, + [in] DBBKMARK cbBookmark2, + [in, size_is(cbBookmark2)] const BYTE *pBookmark2, + [out] DBCOMPARE *pComparison); + + HRESULT GetRowsAt([in] HWATCHREGION hReserved1, + [in] HCHAPTER hReserved2, + [in] DBBKMARK cbBookmark, + [in, size_is(cbBookmark)] const BYTE *pBookmark, + [in] DBROWOFFSET lRowsOffset, + [in] DBROWCOUNT cRows, + [out] DBCOUNTITEM *pcRowsObtained, + [out, size_is(,cRows)] HROW **prghRows); + + HRESULT GetRowsByBookmark([in] HCHAPTER hReserved, + [in] DBCOUNTITEM cRows, + [in, size_is(cRows)] const DBBKMARK rgcbBookmarks[], + [in, size_is(cRows)] const BYTE *rgpBookmarks[], + [out, size_is(cRows)] HROW rghRows[], + [out, size_is(cRows)] DBROWSTATUS rgRowStatus[]); + + HRESULT Hash([in] HCHAPTER hReserved, + [in] DBBKMARK cBookmarks, + [in, size_is(cBookmarks)] const DBBKMARK rgcbBookmarks[], + [in, size_is(cBookmarks)] const BYTE *rgpBookmarks[], + [out, size_is(cBookmarks)] DBHASHVALUE rgHashedValues[], + [out, size_is(cBookmarks)] DBROWSTATUS rgBookmarkStatus[]); +} diff --git a/reactos/include/psdk/sdkddkver.h b/reactos/include/psdk/sdkddkver.h index 22ca227abe4..80ed6be22b2 100644 --- a/reactos/include/psdk/sdkddkver.h +++ b/reactos/include/psdk/sdkddkver.h @@ -24,6 +24,7 @@ Abstract: #define _WIN32_WINNT_VISTA 0x0600 #define _WIN32_WINNT_WS08 0x0600 #define _WIN32_WINNT_LONGHORN 0x0600 +#define _WIN32_WINNT_WIN7 0x0601 /* _WIN32_IE */ #define _WIN32_IE_IE20 0x0200 @@ -38,6 +39,7 @@ Abstract: #define _WIN32_IE_IE60SP1 0x0601 #define _WIN32_IE_IE60SP2 0x0603 #define _WIN32_IE_IE70 0x0700 +#define _WIN32_IE_IE80 0x0800 /* Mappings Between IE Version and Windows Version */ #define _WIN32_IE_NT4 _WIN32_IE_IE20 @@ -62,6 +64,7 @@ Abstract: #define _WIN32_IE_WS03SP1 _WIN32_IE_IE60SP2 #define _WIN32_IE_WIN6 _WIN32_IE_IE70 #define _WIN32_IE_LONGHORN _WIN32_IE_IE70 +#define _WIN32_IE_WIN7 _WIN32_IE_IE80 /* NTDDI_VERSION */ #define NTDDI_WIN2K 0x05000000 @@ -94,6 +97,7 @@ Abstract: #define NTDDI_WS08SP2 NTDDI_WIN6SP2 #define NTDDI_WS08SP3 NTDDI_WIN6SP3 #define NTDDI_WS08SP4 NTDDI_WIN6SP4 +#define NTDDI_WIN7 0x06010000 /* Version Fields in NTDDI_VERSION */ #define OSVERSION_MASK 0xFFFF0000 diff --git a/reactos/include/psdk/sensevts.idl b/reactos/include/psdk/sensevts.idl index ec018a95c66..1ecb9f77f73 100644 --- a/reactos/include/psdk/sensevts.idl +++ b/reactos/include/psdk/sensevts.idl @@ -28,6 +28,7 @@ typedef struct SENS_QOCINFO [ object, + uuid(d597bab1-5b9f-11d1-8dd2-00aa004abd5e), pointer_default(unique) ] interface ISensNetwork : IDispatch @@ -55,6 +56,7 @@ interface ISensNetwork : IDispatch [ object, + uuid(d597bab2-5b9f-11d1-8dd2-00aa004abd5e), pointer_default(unique) ] interface ISensOnNow : IDispatch @@ -68,6 +70,7 @@ interface ISensOnNow : IDispatch [ object, + uuid(d597bab3-5b9f-11d1-8dd2-00aa004abd5e), pointer_default(unique) ] interface ISensLogon : IDispatch @@ -90,6 +93,7 @@ interface ISensLogon : IDispatch [ object, + uuid(d597bab4-5b9f-11d1-8dd2-00aa004abd5e), pointer_default(unique) ] interface ISensLogon2 : IDispatch diff --git a/reactos/include/psdk/sesprp.idl b/reactos/include/psdk/sesprp.idl new file mode 100644 index 00000000000..d621be18a3a --- /dev/null +++ b/reactos/include/psdk/sesprp.idl @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2009 Huw Davies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +[ + object, + uuid(0c733a85-2a1c-11ce-ade5-00aa0044773d), + pointer_default(unique) +] +interface ISessionProperties : IUnknown +{ + [local] + HRESULT GetProperties([in] ULONG cPropertyIDSets, + [in, size_is(cPropertyIDSets)] const DBPROPIDSET rgPropertyIDSets[], + [in, out] ULONG *pcPropertySets, + [out, size_is(,*pcPropertySets)] DBPROPSET **prgPropertySets); + + [call_as(GetProperties)] + HRESULT RemoteGetProperties([in] ULONG cPropertyIDSets, + [in, unique, size_is(cPropertyIDSets)] const DBPROPIDSET *rgPropertyIDSets, + [in, out] ULONG *pcPropertySets, + [out, size_is(,*pcPropertySets)] DBPROPSET **prgPropertySets, + [out] IErrorInfo **ppErrorInfoRem); + + + [local] + HRESULT SetProperties([in] ULONG cPropertySets, + [in, out, unique, size_is(cPropertySets)] DBPROPSET rgPropertySets[]); + + [call_as(SetProperties)] + HRESULT RemoteSetProperties([in] ULONG cPropertySets, + [in, unique, size_is(cPropertySets)] DBPROPSET *rgPropertySets, + [in] ULONG cTotalProps, + [out, size_is(cTotalProps)] DBPROPSTATUS *rgPropStatus, + [out] IErrorInfo **ppErrorInfoRem); + +} diff --git a/reactos/include/psdk/shlobj.h b/reactos/include/psdk/shlobj.h index 3f12542304f..3db28371e6b 100644 --- a/reactos/include/psdk/shlobj.h +++ b/reactos/include/psdk/shlobj.h @@ -78,9 +78,11 @@ DECLARE_HANDLE(HPSXA); #endif UINT WINAPI SHAddFromPropSheetExtArray(HPSXA,LPFNADDPROPSHEETPAGE,LPARAM); -LPVOID WINAPI SHAlloc(ULONG); +LPVOID WINAPI SHAlloc(ULONG) __WINE_ALLOC_SIZE(1); HRESULT WINAPI SHCoCreateInstance(LPCWSTR,const CLSID*,IUnknown*,REFIID,LPVOID*); HPSXA WINAPI SHCreatePropSheetExtArray(HKEY,LPCWSTR,UINT); +HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY,LPCWSTR,UINT,IDataObject*); +HRESULT WINAPI SHCreateShellItem(LPCITEMIDLIST,IShellFolder*,LPCITEMIDLIST,IShellItem**); DWORD WINAPI SHCLSIDFromStringA(LPCSTR,CLSID*); DWORD WINAPI SHCLSIDFromStringW(LPCWSTR,CLSID*); #define SHCLSIDFromString WINELIB_NAME_AW(SHCLSIDFromString) @@ -100,6 +102,10 @@ BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST,LPWSTR); INT WINAPI SHHandleUpdateImage(LPCITEMIDLIST); HRESULT WINAPI SHILCreateFromPath(LPCWSTR,LPITEMIDLIST*,DWORD*); HRESULT WINAPI SHLoadOLE(LPARAM); +HRESULT WINAPI SHParseDisplayName(LPCWSTR,IBindCtx*,LPITEMIDLIST*,SFGAOF,SFGAOF*); +HRESULT WINAPI SHPathPrepareForWriteA(HWND,IUnknown*,LPCSTR,DWORD); +HRESULT WINAPI SHPathPrepareForWriteW(HWND,IUnknown*,LPCWSTR,DWORD); +#define SHPathPrepareForWrite WINELIB_NAME_AW(SHPathPrepareForWrite); UINT WINAPI SHReplaceFromPropSheetExtArray(HPSXA,UINT,LPFNADDPROPSHEETPAGE,LPARAM); LPITEMIDLIST WINAPI SHSimpleIDListFromPath(LPCWSTR); int WINAPI SHMapPIDLToSystemImageListIndex(IShellFolder*,LPCITEMIDLIST,int*); @@ -110,16 +116,26 @@ INT WINAPI PickIconDlg(HWND,LPWSTR,UINT,int *); #define SHUpdateImage WINELIB_NAME_AW(SHUpdateImage) int WINAPI RestartDialog(HWND,LPCWSTR,DWORD); int WINAPI RestartDialogEx(HWND,LPCWSTR,DWORD,DWORD); +BOOL WINAPI IsUserAnAdmin(void); -#define SHFMT_ERROR 0xFFFFFFFFL /* Error on last format, drive may be formatable */ -#define SHFMT_CANCEL 0xFFFFFFFEL /* Last format was canceled */ -#define SHFMT_NOFORMAT 0xFFFFFFFDL /* Drive is not formatable */ +#define SHFMT_ERROR 0xFFFFFFFFL /* Error on last format, drive may be formattable */ +#define SHFMT_CANCEL 0xFFFFFFFEL /* Last format was cancelled */ +#define SHFMT_NOFORMAT 0xFFFFFFFDL /* Drive is not formattable */ /* SHFormatDrive flags */ #define SHFMT_ID_DEFAULT 0xFFFF #define SHFMT_OPT_FULL 1 #define SHFMT_OPT_SYSONLY 2 +/* SHPathPrepareForWrite flags */ +#define SHPPFW_NONE 0x00000000 +#define SHPPFW_DIRCREATE 0x00000001 +#define SHPPFW_DEFAULT SHPPFW_DIRCREATE +#define SHPPFW_ASKDIRCREATE 0x00000002 +#define SHPPFW_IGNOREFILENAME 0x00000004 +#define SHPPFW_NOWRITECHECK 0x00000008 +#define SHPPFW_MEDIACHECKONLY 0x00000010 + /* SHObjectProperties flags */ #define SHOP_PRINTERNAME 0x01 #define SHOP_FILEPATH 0x02 @@ -141,54 +157,168 @@ int WINAPI PathCleanupSpec(LPCWSTR,LPWSTR); /* DATAOBJECT_InitShellIDList*/ -#define CFSTR_SHELLIDLIST "Shell IDList Array" /* CF_IDLIST */ +#define CFSTR_SHELLIDLISTA "Shell IDList Array" /* CF_IDLIST */ +#define CFSTR_SHELLIDLISTOFFSETA "Shell Object Offsets" /* CF_OBJECTPOSITIONS */ +#define CFSTR_NETRESOURCESA "Net Resource" /* CF_NETRESOURCE */ +/* DATAOBJECT_InitFileGroupDesc */ +#define CFSTR_FILEDESCRIPTORA "FileGroupDescriptor" /* CF_FILEGROUPDESCRIPTORA */ +/* DATAOBJECT_InitFileContents*/ +#define CFSTR_FILECONTENTSA "FileContents" /* CF_FILECONTENTS */ +#define CFSTR_FILENAMEA "FileName" /* CF_FILENAMEA */ +#define CFSTR_FILENAMEMAPA "FileNameMap" /* CF_FILENAMEMAPA */ +#define CFSTR_PRINTERGROUPA "PrinterFriendlyName" /* CF_PRINTERS */ +#define CFSTR_SHELLURLA "UniformResourceLocator" +#define CFSTR_INETURLA CFSTR_SHELLURLA +#define CFSTR_PREFERREDDROPEFFECTA "Preferred DropEffect" +#define CFSTR_PERFORMEDDROPEFFECTA "Performed DropEffect" +#define CFSTR_PASTESUCCEEDEDA "Paste Succeeded" +#define CFSTR_INDRAGLOOPA "InShellDragLoop" +#define CFSTR_DRAGCONTEXTA "DragContext" +#define CFSTR_MOUNTEDVOLUMEA "MountedVolume" +#define CFSTR_PERSISTEDDATAOBJECTA "PersistedDataObject" +#define CFSTR_TARGETCLSIDA "TargetCLSID" +#define CFSTR_AUTOPLAY_SHELLIDLISTSA "Autoplay Enumerated IDList Array" +#define CFSTR_LOGICALPERFORMEDDROPEFFECTA "Logical Performed DropEffect" + +#if defined(__GNUC__) +# define CFSTR_SHELLIDLISTW \ + (const WCHAR []){ 'S','h','e','l','l',' ','I','D','L','i','s','t',' ','A','r','r','a','y',0 } +# define CFSTR_SHELLIDLISTOFFSETW \ + (const WCHAR []){ 'S','h','e','l','l',' ','O','b','j','e','c','t',' ','O','f','f','s','e','t','s',0 } +# define CFSTR_NETRESOURCESW \ + (const WCHAR []){ 'N','e','t',' ','R','e','s','o','u','r','c','e',0 } +# define CFSTR_FILEDESCRIPTORW \ + (const WCHAR []){ 'F','i','l','e','G','r','o','u','p','D','e','s','c','r','i','p','t','o','r','W',0 } +# define CFSTR_FILECONTENTSW \ + (const WCHAR []){ 'F','i','l','e','C','o','n','t','e','n','t','s',0 } +# define CFSTR_FILENAMEW \ + (const WCHAR []){ 'F','i','l','e','N','a','m','e','W',0 } +# define CFSTR_FILENAMEMAPW \ + (const WCHAR []){ 'F','i','l','e','N','a','m','e','M','a','p','W',0 } +# define CFSTR_PRINTERGROUPW \ + (const WCHAR []){ 'P','r','i','n','t','e','r','F','r','i','e','n','d','l','y','N','a','m','e',0 } +# define CFSTR_SHELLURLW \ + (const WCHAR []){ 'U','n','i','f','o','r','m','R','e','s','o','u','r','c','e','L','o','c','a','t','o','r',0 } +# define CFSTR_INETURLW \ + (const WCHAR []){ 'U','n','i','f','o','r','m','R','e','s','o','u','r','c','e','L','o','c','a','t','o','r','W',0 } +# define CFSTR_PREFERREDDROPEFFECTW \ + (const WCHAR []){ 'P','r','e','f','e','r','r','e','d',' ','D','r','o','p','E','f','f','e','c','t',0 } +# define CFSTR_PERFORMEDDROPEFFECTW \ + (const WCHAR []){ 'P','e','r','f','o','r','m','e','d',' ','D','r','o','p','E','f','f','e','c','t',0 } +# define CFSTR_PASTESUCCEEDEDW \ + (const WCHAR []){ 'P','a','s','t','e',' ','S','u','c','c','e','e','d','e','d',0 } +# define CFSTR_INDRAGLOOPW \ + (const WCHAR []){ 'I','n','S','h','e','l','l','D','r','a','g','L','o','o','p',0 } +# define CFSTR_DRAGCONTEXTW \ + (const WCHAR []){ 'D','r','a','g','C','o','n','t','e','x','t',0 } +# define CFSTR_MOUNTEDVOLUMEW \ + (const WCHAR []){ 'M','o','u','n','t','e','d','V','o','l','u','m','e',0 } +# define CFSTR_PERSISTEDDATAOBJECTW \ + (const WCHAR []){ 'P','e','r','s','i','s','t','e','d','D','a','t','a','O','b','j','e','c','t',0 } +# define CFSTR_TARGETCLSIDW \ + (const WCHAR []){ 'T','a','r','g','e','t','C','L','S','I','D',0 } +# define CFSTR_AUTOPLAY_SHELLIDLISTSW \ + (const WCHAR []){ 'A','u','t','o','p','l','a','y',' ','E','n','u','m','e','r','a','t','e','d',\ + ' ','I','D','L','i','s','t',' ','A','r','r','a','y',0 } +# define CFSTR_LOGICALPERFORMEDDROPEFFECTW \ + (const WCHAR []){ 'L','o','g','i','c','a','l',' ','P','e','r','f','o','r','m','e','d',\ + ' ','D','r','o','p','E','f','f','e','c','t',0 } +#elif defined(_MSC_VER) +# define CFSTR_SHELLIDLISTW L"Shell IDList Array" +# define CFSTR_SHELLIDLISTOFFSETW L"Shell Object Offsets" +# define CFSTR_NETRESOURCESW L"Net Resource" +# define CFSTR_FILEDESCRIPTORW L"FileGroupDescriptorW" +# define CFSTR_FILECONTENTSW L"FileContents" +# define CFSTR_FILENAMEW L"FileNameW" +# define CFSTR_FILENAMEMAPW L"FileNameMapW" +# define CFSTR_PRINTERGROUPW L"PrinterFriendlyName" +# define CFSTR_SHELLURLW L"UniformResourceLocator" +# define CFSTR_INETURLW L"UniformResourceLocatorW" +# define CFSTR_PREFERREDDROPEFFECTW L"Preferred DropEffect" +# define CFSTR_PERFORMEDDROPEFFECTW L"Performed DropEffect" +# define CFSTR_PASTESUCCEEDEDW L"Paste Succeeded" +# define CFSTR_INDRAGLOOPW L"InShellDragLoop" +# define CFSTR_DRAGCONTEXTW L"DragContext" +# define CFSTR_MOUNTEDVOLUMEW L"MountedVolume" +# define CFSTR_PERSISTEDDATAOBJECTW L"PersistedDataObject" +# define CFSTR_TARGETCLSIDW L"TargetCLSID" +# define CFSTR_AUTOPLAY_SHELLIDLISTSW L"Autoplay Enumerated IDList Array" +# define CFSTR_LOGICALPERFORMEDDROPEFFECTW L"Logical Performed DropEffect" +#else +static const WCHAR CFSTR_SHELLIDLISTW[] = + { 'S','h','e','l','l',' ','I','D','L','i','s','t',' ','A','r','r','a','y',0 }; +static const WCHAR CFSTR_SHELLIDLISTOFFSETW[] = + { 'S','h','e','l','l',' ','O','b','j','e','c','t',' ','O','f','f','s','e','t','s',0 }; +static const WCHAR CFSTR_NETRESOURCESW[] = + { 'N','e','t',' ','R','e','s','o','u','r','c','e',0 }; +static const WCHAR CFSTR_FILEDESCRIPTORW[] = + { 'F','i','l','e','G','r','o','u','p','D','e','s','c','r','i','p','t','o','r','W',0 }; +static const WCHAR CFSTR_FILECONTENTSW[] = + { 'F','i','l','e','C','o','n','t','e','n','t','s',0 }; +static const WCHAR CFSTR_FILENAMEW[] = + { 'F','i','l','e','N','a','m','e','W',0 }; +static const WCHAR CFSTR_FILENAMEMAPW[] = + { 'F','i','l','e','N','a','m','e','M','a','p','W',0 }; +static const WCHAR CFSTR_PRINTERGROUPW[] = + { 'P','r','i','n','t','e','r','F','r','i','e','n','d','l','y','N','a','m','e',0 }; +static const WCHAR CFSTR_SHELLURLW[] = + { 'U','n','i','f','o','r','m','R','e','s','o','u','r','c','e','L','o','c','a','t','o','r',0 }; +static const WCHAR CFSTR_INETURLW[] = + { 'U','n','i','f','o','r','m','R','e','s','o','u','r','c','e','L','o','c','a','t','o','r','W',0 }; +static const WCHAR CFSTR_PREFERREDDROPEFFECTW[] = + { 'P','r','e','f','e','r','r','e','d',' ','D','r','o','p','E','f','f','e','c','t',0 }; +static const WCHAR CFSTR_PERFORMEDDROPEFFECTW[] = + { 'P','e','r','f','o','r','m','e','d',' ','D','r','o','p','E','f','f','e','c','t',0 }; +static const WCHAR CFSTR_PASTESUCCEEDEDW[] = + { 'P','a','s','t','e',' ','S','u','c','c','e','e','d','e','d',0 }; +static const WCHAR CFSTR_INDRAGLOOPW[] = + { 'I','n','S','h','e','l','l','D','r','a','g','L','o','o','p',0 }; +static const WCHAR CFSTR_DRAGCONTEXTW[] = + { 'D','r','a','g','C','o','n','t','e','x','t',0 }; +static const WCHAR CFSTR_MOUNTEDVOLUMEW[] = + { 'M','o','u','n','t','e','d','V','o','l','u','m','e',0 }; +static const WCHAR CFSTR_PERSISTEDDATAOBJECTW[] = + { 'P','e','r','s','i','s','t','e','d','D','a','t','a','O','b','j','e','c','t',0 }; +static const WCHAR CFSTR_TARGETCLSIDW[] = + { 'T','a','r','g','e','t','C','L','S','I','D',0 }; +static const WCHAR CFSTR_AUTOPLAY_SHELLIDLISTSW[] = + { 'A','u','t','o','p','l','a','y',' ','E','n','u','m','e','r','a','t','e','d', + ' ','I','D','L','i','s','t',' ','A','r','r','a','y',0 }; +static const WCHAR CFSTR_LOGICALPERFORMEDDROPEFFECTW[] = + { 'L','o','g','i','c','a','l',' ','P','e','r','f','o','r','m','e','d', + ' ','D','r','o','p','E','f','f','e','c','t',0 }; +#endif + +#define CFSTR_SHELLIDLIST WINELIB_NAME_AW(CFSTR_SHELLIDLIST) +#define CFSTR_SHELLIDLISTOFFSET WINELIB_NAME_AW(CFSTR_SHELLIDLISTOFFSET) +#define CFSTR_NETRESOURCES WINELIB_NAME_AW(CFSTR_NETRESOURCES) +#define CFSTR_FILEDESCRIPTOR WINELIB_NAME_AW(CFSTR_FILEDESCRIPTOR) +#define CFSTR_FILECONTENTS WINELIB_NAME_AW(CFSTR_FILECONTENTS) +#define CFSTR_FILENAME WINELIB_NAME_AW(CFSTR_FILENAME) +#define CFSTR_FILENAMEMAP WINELIB_NAME_AW(CFSTR_FILENAMEMAP) +#define CFSTR_PRINTERGROUP WINELIB_NAME_AW(CFSTR_PRINTERGROUP) +#define CFSTR_SHELLURL WINELIB_NAME_AW(CFSTR_SHELLURL) +#define CFSTR_INETURL WINELIB_NAME_AW(CFSTR_INETURL) +#define CFSTR_PREFERREDDROPEFFECT WINELIB_NAME_AW(CFSTR_PREFERREDDROPEFFECT) +#define CFSTR_PERFORMEDDROPEFFECT WINELIB_NAME_AW(CFSTR_PERFORMEDDROPEFFECT) +#define CFSTR_PASTESUCCEEDED WINELIB_NAME_AW(CFSTR_PASTESUCCEEDED) +#define CFSTR_INDRAGLOOP WINELIB_NAME_AW(CFSTR_INDRAGLOOP) +#define CFSTR_DRAGCONTEXT WINELIB_NAME_AW(CFSTR_DRAGCONTEXT) +#define CFSTR_MOUNTEDVOLUME WINELIB_NAME_AW(CFSTR_MOUNTEDVOLUME) +#define CFSTR_PERSISTEDDATAOBJECT WINELIB_NAME_AW(CFSTR_PERSISTEDDATAOBJECT) +#define CFSTR_TARGETCLSID WINELIB_NAME_AW(CFSTR_TARGETCLSID) +#define CFSTR_AUTOPLAY_SHELLIDLISTS WINELIB_NAME_AW(CFSTR_AUTOPLAY_SHELLIDLISTS) +#define CFSTR_LOGICALPERFORMEDDROPEFFECT WINELIB_NAME_AW(CFSTR_LOGICALPERFORMEDDROPEFFECT) typedef struct { UINT cidl; UINT aoffset[1]; } CIDA, *LPIDA; -#define CFSTR_SHELLIDLISTA "Shell IDList Array" /* CF_IDLIST */ -#define CFSTR_SHELLIDLISTOFFSET "Shell Object Offsets" /* CF_OBJECTPOSITIONS */ -#define CFSTR_NETRESOURCES "Net Resource" /* CF_NETRESOURCE */ - -/* DATAOBJECT_InitFileGroupDesc */ -#define CFSTR_FILEDESCRIPTORA "FileGroupDescriptor" /* CF_FILEGROUPDESCRIPTORA */ - -#define CFSTR_FILEDESCRIPTORW "FileGroupDescriptorW" /* CF_FILEGROUPDESCRIPTORW */ - -/* DATAOBJECT_InitFileContents*/ -#define CFSTR_FILECONTENTS "FileContents" /* CF_FILECONTENTS */ - -#ifdef UNICODE -#define CFSTR_FILENAME L"FileNameW" -#define CFSTR_FILENAMEMAP L"FileNameMapW" -#define CFSTR_FILEDESCRIPTOR L"FileGroupDescriptorW" -#define CFSTR_SHELLURL L"UniformResourceLocatorW" -#else -#define CFSTR_FILENAME "FileName" -#define CFSTR_FILENAMEMAP "FileNameMap" -#define CFSTR_FILEDESCRIPTOR "FileGroupDescriptor" -#define CFSTR_SHELLURL "UniformResourceLocator" -#endif - -#define CFSTR_FILENAMEW "FileNameW" -#define CFSTR_FILENAMEA "FileName" -#define CFSTR_FILENAMEMAPA "FileNameMap" /* CF_FILENAMEMAPA */ -#define CFSTR_FILENAMEMAPW "FileNameMapW" /* CF_FILENAMEMAPW */ - -#define CFSTR_PRINTERGROUP "PrinterFriendlyName" /* CF_PRINTERS */ -#define CFSTR_PREFERREDDROPEFFECT "Preferred DropEffect" -#define CFSTR_PERFORMEDDROPEFFECT "Performed DropEffect" -#define CFSTR_PASTESUCCEEDED "Paste Succeeded" -#define CFSTR_INDRAGLOOP "InShellDragLoop" - /************************************************************************ * IShellView interface */ -#define SV_CLASS_NAME ("SHELLDLL_DefView") - #define FCIDM_SHVIEWFIRST 0x0000 /* undocumented */ #define FCIDM_SHVIEW_ARRANGE 0x7001 @@ -252,24 +382,10 @@ typedef struct #define FCIDM_STATUS (FCIDM_BROWSERFIRST + 1) -VOID WINAPI SHSetInstanceExplorer(LPUNKNOWN); -BOOL WINAPI IsUserAnAdmin(VOID); - /**************************************************************************** * IShellIcon interface */ -#undef INTERFACE -#define INTERFACE IShellFolderViewCB -DECLARE_INTERFACE_(IShellFolderViewCB, IUnknown) -{ - STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - STDMETHOD(MessageSFVCB)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam) PURE; -}; -#undef INTERFACE - #define INTERFACE IShellIcon DECLARE_INTERFACE_(IShellIcon,IUnknown) { @@ -411,6 +527,57 @@ DECLARE_INTERFACE_(IACList,IUnknown) #define IACList_Expand(p,a) (p)->lpVtbl->Expand(p,a) #endif +/* IACList2 interface */ +#define INTERFACE IACList2 +DECLARE_INTERFACE_(IACList2,IACList) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface) (THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef) (THIS) PURE; + STDMETHOD_(ULONG,Release) (THIS) PURE; + /*** IACList methods ***/ + STDMETHOD(Expand)(THIS_ LPCOLESTR str) PURE; + /*** IACList2 methods ***/ + STDMETHOD(SetOptions)(THIS_ DWORD dwFlag) PURE; + STDMETHOD(GetOptions)(THIS_ DWORD* pdwFlag) PURE; +}; +#undef INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IACList2_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IACList2_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IACList2_Release(p) (p)->lpVtbl->Release(p) +/*** IACList2 methods ***/ +#define IACList2_GetOptions(p,a) (p)->lpVtbl->GetOptions(p,a) +#define IACList2_SetOptions(p,a) (p)->lpVtbl->SetOptions(p,a) +#endif + +/**************************************************************************** + * IShellFolderViewCB interface + */ + +#define INTERFACE IShellFolderViewCB +DECLARE_INTERFACE_(IShellFolderViewCB,IUnknown) +{ + /*** IUnknown methods ***/ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; + STDMETHOD_(ULONG,AddRef)(THIS) PURE; + STDMETHOD_(ULONG,Release)(THIS) PURE; + /*** IShellFolderViewCB methods ***/ + STDMETHOD(MessageSFVCB)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam) PURE; +}; +#undef INTERFACE + +#if !defined(__cplusplus) || defined(CINTERFACE) +/*** IUnknown methods ***/ +#define IShellFolderViewCB_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IShellFolderViewCB_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IShellFolderViewCB_Release(p) (p)->lpVtbl->Release(p) +/*** IShellFolderViewCB methods ***/ +#define IShellFolderViewCB_MessageSFVCB(p,a,b,c) (p)->lpVtbl->MessageSFVCB(p,a,b,c) +#endif + /* IProgressDialog interface */ #define PROGDLG_NORMAL 0x00000000 #define PROGDLG_MODAL 0x00000001 @@ -502,15 +669,6 @@ DECLARE_INTERFACE_(IDeskBarClient,IOleWindow) void WINAPI SHAddToRecentDocs(UINT,LPCVOID); -HANDLE WINAPI SHChangeNotification_Lock( - HANDLE hChange, - DWORD dwProcessId, - LPITEMIDLIST **lppidls, - LPLONG lpwEventId); -BOOL WINAPI SHChangeNotification_Unlock ( HANDLE hLock); - - - /**************************************************************************** * SHBrowseForFolder API */ @@ -567,8 +725,9 @@ typedef struct tagBROWSEINFOW { /* message from browser */ #define BFFM_INITIALIZED 1 #define BFFM_SELCHANGED 2 -#define BFFM_VALIDATEFAILEDA 3 /* lParam:szPath ret:1(cont),0(EndDialog) */ -#define BFFM_VALIDATEFAILEDW 4 /* lParam:wzPath ret:1(cont),0(EndDialog) */ +#define BFFM_VALIDATEFAILEDA 3 +#define BFFM_VALIDATEFAILEDW 4 +#define BFFM_IUNKNOWN 5 /* messages to browser */ #define BFFM_SETSTATUSTEXTA (WM_USER+100) @@ -669,15 +828,6 @@ HRESULT WINAPI SHCreateShellFolderViewEx(LPCSFV pshfvi, IShellView **ppshv); #define SFVM_GET_WEBVIEW_THEME 86 /* undocumented */ #define SFVM_GETDEFERREDVIEWSETTINGS 92 /* undocumented */ -#define SHPPFW_NONE 0 -#define SHPPFW_DIRCREATE 1 -#define SHPPFW_DEFAULT SHPPFW_DIRCREATE -#define SHPPFW_ASKDIRCREATE 2 -#define SHPPFW_IGNOREFILENAME 4 -#define SHPPFW_NOWRITECHECK 8 - -/* Types and definitions for the SFM_* parameters */ -#include typedef struct _SFV_CREATE { UINT cbSize; @@ -686,6 +836,10 @@ typedef struct _SFV_CREATE IShellFolderViewCB *psfvcb; } SFV_CREATE; +HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pscfv, IShellView **ppsv); + +/* Types and definitions for the SFM_* parameters */ +#include #define QCMINFO_PLACE_BEFORE 0 #define QCMINFO_PLACE_AFTER 1 @@ -801,19 +955,13 @@ HRESULT WINAPI SHGetDataFromIDListA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int n HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID pv, int cb); #define SHGetDataFromIDList WINELIB_NAME_AW(SHGetDataFromIDList) -PIDLIST_ABSOLUTE WINAPI SHCloneSpecialIDList(HWND hwnd, int csidl, BOOL fCreate); +LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwnd, int csidl, BOOL fCreate); BOOL WINAPI SHGetSpecialFolderPathA (HWND hwndOwner, LPSTR szPath, int nFolder, BOOL bCreate); BOOL WINAPI SHGetSpecialFolderPathW (HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate); #define SHGetSpecialFolderPath WINELIB_NAME_AW(SHGetSpecialFolderPath) HRESULT WINAPI SHGetMalloc(LPMALLOC *lpmal) ; -/********************************************************************** - * SHCreateShellFolderView () - */ - -HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv); - /********************************************************************** * SHGetSetSettings () */ @@ -1147,6 +1295,10 @@ typedef enum { SLDF_NO_PIDL_ALIAS = 0x00008000, SLDF_FORCE_UNCNAME = 0x00010000, SLDF_RUN_WITH_SHIMLAYER = 0x00020000, + SLDF_FORCE_NO_LINKTRACK = 0x00040000, + SLDF_ENABLE_TARGET_METADATA = 0x00080000, + SLDF_DISABLE_KNOWNFOLDER_RELATIVE_TRACKING = 0x00200000, + SLDF_VALID = 0x003ff7ff, SLDF_RESERVED = 0x80000000, } SHELL_LINK_DATA_FLAGS; @@ -1158,41 +1310,6 @@ typedef struct tagDATABLOCKHEADER typedef struct { DATABLOCK_HEADER dbh; - WORD wFillAttribute; - WORD wPopupFillAttribute; - COORD dwScreenBufferSize; - COORD dwWindowSize; - COORD dwWindowOrigin; - DWORD nFont; - DWORD nInputBufferSize; - COORD dwFontSize; - UINT uFontFamily; - UINT uFontWeight; - WCHAR FaceName[LF_FACESIZE]; - UINT uCursorSize; - BOOL bFullScreen; - BOOL bQuickEdit; - BOOL bInsertMode; - BOOL bAutoPosition; - UINT uHistoryBufferSize; - UINT uNumberOfHistoryBuffers; - BOOL bHistoryNoDup; - COLORREF ColorTable[16]; -} NT_CONSOLE_PROPS, *LPNT_CONSOLE_PROPS; - -typedef struct { - DATABLOCK_HEADER dbh; - UINT uCodePage; -} NT_FE_CONSOLE_PROPS, *LPNT_FE_CONSOLE_PROPS; - -typedef struct { - -#ifdef __cplusplus - DATABLOCK_HEADER dbh; -#else - DWORD cbSize; - DWORD dwSignature; -#endif CHAR szDarwinID[MAX_PATH]; WCHAR szwDarwinID[MAX_PATH]; } EXP_DARWIN_LINK, *LPEXP_DARWIN_LINK; @@ -1211,13 +1328,20 @@ typedef struct { DWORD cbOffset; } EXP_SPECIAL_FOLDER, *LPEXP_SPECIAL_FOLDER; +typedef struct { + DWORD cbSize; + DWORD dwSignature; + BYTE abPropertyStorage[1]; +} EXP_PROPERTYSTORAGE; + #define EXP_SZ_LINK_SIG 0xa0000001 #define NT_CONSOLE_PROPS_SIG 0xa0000002 #define NT_FE_CONSOLE_PROPS_SIG 0xa0000004 #define EXP_SPECIAL_FOLDER_SIG 0xa0000005 #define EXP_DARWIN_ID_SIG 0xa0000006 -#define EXP_LOGO3_ID_SIG 0xa0000007 #define EXP_SZ_ICON_SIG 0xa0000007 +#define EXP_LOGO3_ID_SIG EXP_SZ_ICON_SIG /* Old SDKs only */ +#define EXP_PROPERTYSTORAGE_SIG 0xa0000009 typedef struct _SHChangeDWORDAsIDList { USHORT cb; @@ -1235,6 +1359,8 @@ typedef struct _SHChangeProductKeyAsIDList { ULONG WINAPI SHChangeNotifyRegister(HWND hwnd, int fSources, LONG fEvents, UINT wMsg, int cEntries, const SHChangeNotifyEntry *pshcne); BOOL WINAPI SHChangeNotifyDeregister(ULONG ulID); +HANDLE WINAPI SHChangeNotification_Lock(HANDLE hChangeNotification, DWORD dwProcessId, + LPITEMIDLIST **pppidl, LONG *plEvent); BOOL WINAPI SHChangeNotification_Unlock(HANDLE hLock); HRESULT WINAPI SHGetRealIDL(IShellFolder *psf, LPCITEMIDLIST pidlSimple, LPITEMIDLIST * ppidlReal); @@ -1245,6 +1371,7 @@ HRESULT WINAPI SHGetRealIDL(IShellFolder *psf, LPCITEMIDLIST pidlSimple, LPITEMI DWORD WINAPI SHCreateDirectory(HWND, LPCWSTR); int WINAPI SHCreateDirectoryExA(HWND, LPCSTR, LPSECURITY_ATTRIBUTES); int WINAPI SHCreateDirectoryExW(HWND, LPCWSTR, LPSECURITY_ATTRIBUTES); +#define SHCreateDirectoryEx WINELIB_NAME_AW(SHCreateDirectoryEx) /**************************************************************************** * SHGetSpecialFolderLocation API @@ -1276,7 +1403,7 @@ HRESULT WINAPI SHGetFolderPathW(HWND hwnd, int nFolder, HANDLE hToken, DWORD dwF #define CSIDL_SENDTO 0x0009 #define CSIDL_BITBUCKET 0x000a #define CSIDL_STARTMENU 0x000b -#define CSIDL_MYDOCUMENTS 0x000c +#define CSIDL_MYDOCUMENTS CSIDL_PERSONAL #define CSIDL_MYMUSIC 0x000d #define CSIDL_MYVIDEO 0x000e #define CSIDL_DESKTOPDIRECTORY 0x0010 @@ -1322,6 +1449,7 @@ HRESULT WINAPI SHGetFolderPathW(HWND hwnd, int nFolder, HANDLE hToken, DWORD dwF #define CSIDL_CDBURN_AREA 0x003b #define CSIDL_COMPUTERSNEARME 0x003d #define CSIDL_PROFILES 0x003e +#define CSIDL_FOLDER_MASK 0x00ff #define CSIDL_FLAG_PER_USER_INIT 0x0800 #define CSIDL_FLAG_NO_ALIAS 0x1000 #define CSIDL_FLAG_DONT_VERIFY 0x4000 @@ -1438,8 +1566,26 @@ BOOL WINAPI WriteCabinetState(CABINETSTATE *); /**************************************************************************** * Path Manipulation Routines */ + +/* PathProcessCommand flags */ +#define PPCF_ADDQUOTES 0x01 +#define PPCF_INCLUDEARGS 0x02 +#define PPCF_ADDARGUMENTS 0x03 +#define PPCF_NODIRECTORIES 0x10 +#define PPCF_DONTRESOLVE 0x20 +#define PPCF_FORCEQUALIFY 0x40 +#define PPCF_LONGESTPOSSIBLE 0x80 + +/* PathResolve flags */ +#define PRF_VERIFYEXISTS 0x01 +#define PRF_EXECUTABLE 0x02 +#define PRF_TRYPROGRAMEXTENSIONS 0x03 +#define PRF_FIRSTDIRDEF 0x04 +#define PRF_DONTFINDLINK 0x08 + VOID WINAPI PathGetShortPath(LPWSTR pszPath); LONG WINAPI PathProcessCommand(LPCWSTR, LPWSTR, int, DWORD); +BOOL WINAPI PathYetAnotherMakeUniqueName(LPWSTR, LPCWSTR, LPCWSTR, LPCWSTR); /**************************************************************************** * Drag And Drop Routines @@ -1515,7 +1661,6 @@ HRESULT WINAPI SHCreateDefaultContextMenu(const DEFCONTEXTMENU *,REFIID,void **p typedef HRESULT (CALLBACK * LPFNDFMCALLBACK)(IShellFolder*,HWND,IDataObject*,UINT,WPARAM,LPARAM); HRESULT WINAPI CDefFolderMenu_Create2(LPCITEMIDLIST,HWND,UINT,LPCITEMIDLIST*,IShellFolder*,LPFNDFMCALLBACK,UINT,const HKEY *,IContextMenu **); - /**************************************************************************** * SHCreateDefaultContextMenu API */ @@ -1524,7 +1669,6 @@ HRESULT WINAPI SHCreateDefaultExtractIcon( REFIID riid, void **ppv); - /**************************************************************************** * SHCreateDataObject API */ diff --git a/reactos/include/psdk/shlwapi.h b/reactos/include/psdk/shlwapi.h index df1e1aa1306..29e70b76d8c 100644 --- a/reactos/include/psdk/shlwapi.h +++ b/reactos/include/psdk/shlwapi.h @@ -85,6 +85,34 @@ DWORD WINAPI SHCopyKeyW(HKEY,LPCWSTR,HKEY,DWORD); HKEY WINAPI SHRegDuplicateHKey(HKEY); +/* SHRegGetValue flags */ +typedef INT SRRF; + +#define SRRF_RT_REG_NONE 0x1 +#define SRRF_RT_REG_SZ 0x2 +#define SRRF_RT_REG_EXPAND_SZ 0x4 +#define SRRF_RT_REG_BINARY 0x8 +#define SRRF_RT_REG_DWORD 0x10 +#define SRRF_RT_REG_MULTI_SZ 0x20 +#define SRRF_RT_REG_QWORD 0x40 + +#define SRRF_RT_DWORD (SRRF_RT_REG_BINARY|SRRF_RT_REG_DWORD) +#define SRRF_RT_QWORD (SRRF_RT_REG_BINARY|SRRF_RT_REG_QWORD) +#define SRRF_RT_ANY 0xffff + +#define SRRF_RM_ANY 0 +#define SRRF_RM_NORMAL 0x10000 +#define SRRF_RM_SAFE 0x20000 +#define SRRF_RM_SAFENETWORK 0x40000 + +#define SRRF_NOEXPAND 0x10000000 +#define SRRF_ZEROONFAILURE 0x20000000 +#define SRRF_NOVIRT 0x40000000 + +LSTATUS WINAPI SHRegGetValueA(HKEY,LPCSTR,LPCSTR,SRRF,LPDWORD,LPVOID,LPDWORD); +LSTATUS WINAPI SHRegGetValueW(HKEY,LPCWSTR,LPCWSTR,SRRF,LPDWORD,LPVOID,LPDWORD); +#define SHRegGetValue WINELIB_NAME_AW(SHRegGetValue) + /* Undocumented registry functions */ DWORD WINAPI SHDeleteOrphanKeyA(HKEY,LPCSTR); @@ -388,7 +416,7 @@ BOOL WINAPI PathIsDirectoryEmptyW(LPCWSTR); BOOL WINAPI PathIsFileSpecA(LPCSTR); BOOL WINAPI PathIsFileSpecW(LPCWSTR); -#define PathIsFileSpec WINELIB_NAME_AW(PathIsFileSpec) +#define PathIsFileSpec WINELIB_NAME_AW(PathIsFileSpec); BOOL WINAPI PathIsPrefixA(LPCSTR,LPCSTR); BOOL WINAPI PathIsPrefixW(LPCWSTR,LPCWSTR); @@ -1064,6 +1092,17 @@ BOOL WINAPI IsOS(DWORD); #define TPS_EXECUTEIO 0x00000001 #define TPS_LONGEXECTIME 0x00000008 +/* SHFormatDateTimeA/SHFormatDateTimeW flags */ +#define FDTF_SHORTTIME 0x00000001 +#define FDTF_SHORTDATE 0x00000002 +#define FDTF_DEFAULT (FDTF_SHORTDATE | FDTF_SHORTTIME) +#define FDTF_LONGDATE 0x00000004 +#define FDTF_LONGTIME 0x00000008 +#define FDTF_RELATIVE 0x00000010 +#define FDTF_LTRDATE 0x00000100 +#define FDTF_RTLDATE 0x00000200 +#define FDTF_NOAUTOREADINGORDER 0x00000400 + #include #ifdef __cplusplus diff --git a/reactos/include/psdk/shobjidl.idl b/reactos/include/psdk/shobjidl.idl index cd2320e7f08..221ab04d22c 100644 --- a/reactos/include/psdk/shobjidl.idl +++ b/reactos/include/psdk/shobjidl.idl @@ -323,22 +323,6 @@ interface IEnumExtraSearch : IUnknown ] interface IShellFolder2 : IShellFolder { - typedef enum - { - SHCOLSTATE_TYPE_STR = 0x00000001, - SHCOLSTATE_TYPE_INT = 0x00000002, - SHCOLSTATE_TYPE_DATE = 0x00000003, - SHCOLSTATE_TYPEMASK = 0x0000000f, - SHCOLSTATE_ONBYDEFAULT = 0x00000010, - SHCOLSTATE_SLOW = 0x00000020, - SHCOLSTATE_EXTENDED = 0x00000040, - SHCOLSTATE_SECONDARYUI = 0x00000080, - SHCOLSTATE_HIDDEN = 0x00000100, - SHCOLSTATE_PREFER_VARCMP = 0x00000200 - } SHCOLSTATE; - - typedef DWORD SHCOLSTATEF; - typedef struct { GUID fmtid; @@ -2310,6 +2294,10 @@ interface IBrowserService : IUnknown typedef BASEBROWSERDATA *LPBASEBROWSERDATA; +cpp_quote("#if 0") +typedef HANDLE HMONITOR; +cpp_quote("#endif /* 0 */") + typedef struct SToolbarItem { IDockingWindow *ptbar; diff --git a/reactos/include/psdk/shtypes.idl b/reactos/include/psdk/shtypes.idl index 3a922b83246..021d4671251 100644 --- a/reactos/include/psdk/shtypes.idl +++ b/reactos/include/psdk/shtypes.idl @@ -21,8 +21,6 @@ import "wtypes.idl"; - - cpp_quote("#include ") typedef struct { @@ -34,60 +32,13 @@ typedef const SHITEMID *LPCSHITEMID; typedef struct _ITEMIDLIST { SHITEMID mkid; /* first itemid in list */ -} ITEMIDLIST; - -cpp_quote("#if defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus)") -cpp_quote("typedef struct _ITEMIDLIST_RELATIVE : ITEMIDLIST {} ITEMIDLIST_RELATIVE;") -cpp_quote("typedef struct _ITEMID_CHILD : ITEMIDLIST_RELATIVE {} ITEMID_CHILD;") -cpp_quote("typedef struct _ITEMIDLIST_ABSOLUTE : ITEMIDLIST_RELATIVE {} ITEMIDLIST_ABSOLUTE;") -cpp_quote("#else /* !(defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus)) */") -typedef ITEMIDLIST ITEMIDLIST_RELATIVE; -typedef ITEMIDLIST ITEMID_CHILD; -typedef ITEMIDLIST ITEMIDLIST_ABSOLUTE; -cpp_quote("#endif /* defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus) */") - +} ITEMIDLIST,*LPITEMIDLIST; +typedef const ITEMIDLIST *LPCITEMIDLIST; +typedef LPITEMIDLIST PITEMID_CHILD; +typedef LPCITEMIDLIST PCUITEMID_CHILD; +typedef LPCITEMIDLIST *PCUITEMID_CHILD_ARRAY; cpp_quote("#include ") -typedef [unique] BYTE_BLOB * wirePIDL; -typedef ITEMIDLIST /*__unaligned*/ * LPITEMIDLIST; -typedef const ITEMIDLIST /*__unaligned*/ * LPCITEMIDLIST; - -cpp_quote("#if defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus)") -typedef ITEMIDLIST_ABSOLUTE * PIDLIST_ABSOLUTE; -typedef const ITEMIDLIST_ABSOLUTE * PCIDLIST_ABSOLUTE; -typedef const ITEMIDLIST_ABSOLUTE /*__unaligned*/ * PCUIDLIST_ABSOLUTE; -typedef ITEMIDLIST_RELATIVE * PIDLIST_RELATIVE; -typedef const ITEMIDLIST_RELATIVE * PCIDLIST_RELATIVE; -typedef ITEMIDLIST_RELATIVE /*__unaligned*/ * PUIDLIST_RELATIVE; -typedef const ITEMIDLIST_RELATIVE /*__unaligned*/ * PCUIDLIST_RELATIVE; -typedef ITEMID_CHILD * PITEMID_CHILD; -typedef const ITEMID_CHILD * PCITEMID_CHILD; -typedef ITEMID_CHILD /*__unaligned*/ * PUITEMID_CHILD; -typedef const ITEMID_CHILD /*__unaligned*/ * PCUITEMID_CHILD; - -typedef PCUITEMID_CHILD const *PCUITEMID_CHILD_ARRAY; -typedef PCUIDLIST_RELATIVE const *PCUIDLIST_RELATIVE_ARRAY; -typedef PCIDLIST_ABSOLUTE const *PCIDLIST_ABSOLUTE_ARRAY; -typedef PCUIDLIST_ABSOLUTE const *PCUIDLIST_ABSOLUTE_ARRAY; -cpp_quote("#else /* !(defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus)) */") -cpp_quote("#define PIDLIST_ABSOLUTE LPITEMIDLIST") -cpp_quote("#define PCIDLIST_ABSOLUTE LPCITEMIDLIST") -cpp_quote("#define PCUIDLIST_ABSOLUTE LPCITEMIDLIST") -cpp_quote("#define PIDLIST_RELATIVE LPITEMIDLIST") -cpp_quote("#define PCIDLIST_RELATIVE LPCITEMIDLIST") -cpp_quote("#define PUIDLIST_RELATIVE LPITEMIDLIST") -cpp_quote("#define PCUIDLIST_RELATIVE LPCITEMIDLIST") -cpp_quote("#define PITEMID_CHILD LPITEMIDLIST") -cpp_quote("#define PCITEMID_CHILD LPCITEMIDLIST") -cpp_quote("#define PUITEMID_CHILD LPITEMIDLIST") -cpp_quote("#define PCUITEMID_CHILD LPCITEMIDLIST") -cpp_quote("#define PCUITEMID_CHILD_ARRAY LPCITEMIDLIST *") -cpp_quote("#define PCUIDLIST_RELATIVE_ARRAY LPCITEMIDLIST *") -cpp_quote("#define PCIDLIST_ABSOLUTE_ARRAY LPCITEMIDLIST *") -cpp_quote("#define PCUIDLIST_ABSOLUTE_ARRAY LPCITEMIDLIST *") -cpp_quote("#endif /* defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus) */") - - #ifndef MAX_PATH #define MAX_PATH 260 #endif @@ -103,7 +54,7 @@ typedef enum tagSTRRET_TYPE STRRET_CSTR = 2 } STRRET_TYPE; -cpp_quote("#include ") +cpp_quote("#include ") typedef struct _STRRET { UINT uType; /* STRRET_xxx */ @@ -124,3 +75,29 @@ typedef struct STRRET str; } SHELLDETAILS, *LPSHELLDETAILS; cpp_quote("#include ") + +typedef [v1_enum] enum tagSHCOLSTATE +{ + SHCOLSTATE_DEFAULT = 0, + SHCOLSTATE_TYPE_STR, + SHCOLSTATE_TYPE_INT, + SHCOLSTATE_TYPE_DATE, + SHCOLSTATE_TYPEMASK = 0xf, + SHCOLSTATE_ONBYDEFAULT = 0x10, + SHCOLSTATE_SLOW = 0x20, + SHCOLSTATE_EXTENDED = 0x40, + SHCOLSTATE_SECONDARYUI = 0x80, + SHCOLSTATE_HIDDEN = 0x100, + SHCOLSTATE_PREFER_VARCMP = 0x200, + SHCOLSTATE_PREFER_FMTCMP = 0x400, + SHCOLSTATE_NOSORTBYFOLDERNESS = 0x800, + SHCOLSTATE_VIEWONLY = 0x10000, + SHCOLSTATE_BATCHREAD = 0x20000, + SHCOLSTATE_NO_GROUPBY = 0x40000, + SHCOLSTATE_FIXED_WIDTH = 0x1000, + SHCOLSTATE_NODPISCALE = 0x2000, + SHCOLSTATE_FIXED_RATIO = 0x4000, + SHCOLSTATE_DISPLAYMASK = 0xf000 +} SHCOLSTATE; + +typedef DWORD SHCOLSTATEF; diff --git a/reactos/include/psdk/tom.idl b/reactos/include/psdk/tom.idl index 669fbcf9e0c..35be7f70dbd 100644 --- a/reactos/include/psdk/tom.idl +++ b/reactos/include/psdk/tom.idl @@ -18,6 +18,10 @@ import "oaidl.idl"; +cpp_quote("#ifdef WINE_NO_UNICODE_MACROS") +cpp_quote("#undef FindText") +cpp_quote("#endif") + typedef enum tagTomConstants { tomFalse = 0, @@ -200,23 +204,23 @@ interface ITextDocument : IDispatch { HRESULT GetName([retval, out]BSTR *pName); HRESULT GetSelection([retval, out]ITextSelection **ppSel); - HRESULT GetStoryCount([retval, out]long *pCount); + HRESULT GetStoryCount([retval, out]LONG *pCount); HRESULT GetStoryRanges([retval, out]ITextStoryRanges **ppStories); - HRESULT GetSaved([retval, out]long *pValue); - HRESULT SetSaved([in]long Value); + HRESULT GetSaved([retval, out]LONG *pValue); + HRESULT SetSaved([in]LONG Value); HRESULT GetDefaultTabStop([retval, out]float *pValue); HRESULT SetDefaultTabStop([in]float Value); HRESULT New(); - HRESULT Open([in]VARIANT *pVar, [in]long Flags, [in]long CodePage); - HRESULT Save([in]VARIANT *pVar, [in]long Flags, [in]long CodePage); - HRESULT Freeze([retval, out]long *pCount); - HRESULT Unfreeze([retval, out]long *pCount); + HRESULT Open([in]VARIANT *pVar, [in]LONG Flags, [in]LONG CodePage); + HRESULT Save([in]VARIANT *pVar, [in]LONG Flags, [in]LONG CodePage); + HRESULT Freeze([retval, out]LONG *pCount); + HRESULT Unfreeze([retval, out]LONG *pCount); HRESULT BeginEditCollection(); HRESULT EndEditCollection(); - HRESULT Undo([in]long Count, [retval, out]long *prop); - HRESULT Redo([in]long Count, [retval, out]long *prop); - HRESULT Range([in]long cp1, [in]long cp2, [retval, out]ITextRange**ppRange); - HRESULT RangeFromPoint([in]long x, [in]long y, [retval, out]ITextRange**ppRange); + HRESULT Undo([in]LONG Count, [retval, out]LONG *prop); + HRESULT Redo([in]LONG Count, [retval, out]LONG *prop); + HRESULT Range([in]LONG cp1, [in]LONG cp2, [retval, out]ITextRange **ppRange); + HRESULT RangeFromPoint([in]LONG x, [in]LONG y, [retval, out]ITextRange **ppRange); } interface ITextFont; @@ -230,54 +234,54 @@ interface ITextRange : IDispatch { HRESULT GetText([retval, out]BSTR *pbstr); HRESULT SetText([in]BSTR bstr); - HRESULT GetChar([retval, out]long *pch); - HRESULT SetChar([in]long ch); + HRESULT GetChar([retval, out]LONG *pch); + HRESULT SetChar([in]LONG ch); HRESULT GetDuplicate([retval, out]ITextRange **ppRange); HRESULT GetFormattedText([retval, out]ITextRange **ppRange); HRESULT SetFormattedText([in]ITextRange *pRange); - HRESULT GetStart([retval, out]long *pcpFirst); - HRESULT SetStart([in]long cpFirst); - HRESULT GetEnd([retval, out]long *pcpLim); - HRESULT SetEnd([in]long cpLim); + HRESULT GetStart([retval, out]LONG *pcpFirst); + HRESULT SetStart([in]LONG cpFirst); + HRESULT GetEnd([retval, out]LONG *pcpLim); + HRESULT SetEnd([in]LONG cpLim); HRESULT GetFont([retval, out]ITextFont **pFont); HRESULT SetFont([in]ITextFont *pFont); HRESULT GetPara([retval, out]ITextPara **ppPara); HRESULT SetPara([in]ITextPara *pPara); - HRESULT GetStoryLength([retval, out]long *pcch); - HRESULT GetStoryType([retval, out]long *pValue); - HRESULT Collapse([in]long bStart); - HRESULT Expand([in]long Unit, [retval, out]long *pDelta); - HRESULT GetIndex([in]long Unit, [retval, out]long *pIndex); - HRESULT SetIndex([in]long Unit, [in]long Index, [in]long Extend); - HRESULT SetRange([in]long cpActive, [in]long cpOther); - HRESULT InRange([in]ITextRange *pRange, [retval, out]long *pb); - HRESULT InStory([in]ITextRange *pRange, [retval, out]long *pb); - HRESULT IsEqual([in]ITextRange *pRange, [retval, out]long *pb); + HRESULT GetStoryLength([retval, out]LONG *pcch); + HRESULT GetStoryType([retval, out]LONG *pValue); + HRESULT Collapse([in]LONG bStart); + HRESULT Expand([in]LONG Unit, [retval, out]LONG *pDelta); + HRESULT GetIndex([in]LONG Unit, [retval, out]LONG *pIndex); + HRESULT SetIndex([in]LONG Unit, [in]LONG Index, [in]LONG Extend); + HRESULT SetRange([in]LONG cpActive, [in]LONG cpOther); + HRESULT InRange([in]ITextRange *pRange, [retval, out]LONG *pb); + HRESULT InStory([in]ITextRange *pRange, [retval, out]LONG *pb); + HRESULT IsEqual([in]ITextRange *pRange, [retval, out]LONG *pb); HRESULT Select(); - HRESULT StartOf([in]long Unit, [in]long Extend, [retval, out]long *pDelta); - HRESULT EndOf([in]long Unit, [in]long Extend, [retval, out]long *pDelta); - HRESULT Move([in]long Unit, [in]long Count, [retval, out]long *pDelta); - HRESULT MoveStart([in]long Unit, [in]long Count, [retval, out]long *pDelta); - HRESULT MoveEnd([in]long Unit, [in]long Count, [retval, out]long *pDelta); - HRESULT MoveWhile([in]VARIANT *Cset, [in]long Count, [retval, out]long *pDelta); - HRESULT MoveStartWhile([in]VARIANT *Cset, [in]long Count, [retval, out]long *pDelta); - HRESULT MoveEndWhile([in]VARIANT *Cset, [in]long Count, [retval, out]long *pDelta); - HRESULT MoveUntil([in]VARIANT *Cset, [in]long Count, [retval, out]long *pDelta); - HRESULT MoveStartUntil([in]VARIANT *Cset, [in]long Count, [retval, out]long *pDelta); - HRESULT MoveEndUntil([in]VARIANT *Cset, [in]long Count, [retval, out]long *pDelta); - HRESULT FindText([in]BSTR bstr, [in]long cch, [in]long Flags, [retval, out]long *pLength); - HRESULT FindTextStart([in]BSTR bstr, [in]long cch, [in]long Flags, [retval, out]long *pLength); - HRESULT FindTextEnd([in]BSTR bstr, [in]long cch, [in]long Flags, [retval, out]long *pLength); - HRESULT Delete([in]long Unit, [in]long Count, [retval, out]long *pDelta); + HRESULT StartOf([in]LONG Unit, [in]LONG Extend, [retval, out]LONG *pDelta); + HRESULT EndOf([in]LONG Unit, [in]LONG Extend, [retval, out]LONG *pDelta); + HRESULT Move([in]LONG Unit, [in]LONG Count, [retval, out]LONG *pDelta); + HRESULT MoveStart([in]LONG Unit, [in]LONG Count, [retval, out]LONG *pDelta); + HRESULT MoveEnd([in]LONG Unit, [in]LONG Count, [retval, out]LONG *pDelta); + HRESULT MoveWhile([in]VARIANT *Cset, [in]LONG Count, [retval, out]LONG *pDelta); + HRESULT MoveStartWhile([in]VARIANT *Cset, [in]LONG Count, [retval, out]LONG *pDelta); + HRESULT MoveEndWhile([in]VARIANT *Cset, [in]LONG Count, [retval, out]LONG *pDelta); + HRESULT MoveUntil([in]VARIANT *Cset, [in]LONG Count, [retval, out]LONG *pDelta); + HRESULT MoveStartUntil([in]VARIANT *Cset, [in]LONG Count, [retval, out]LONG *pDelta); + HRESULT MoveEndUntil([in]VARIANT *Cset, [in]LONG Count, [retval, out]LONG *pDelta); + HRESULT FindText([in]BSTR bstr, [in]LONG cch, [in]LONG Flags, [retval, out]LONG *pLength); + HRESULT FindTextStart([in]BSTR bstr, [in]LONG cch, [in]LONG Flags, [retval, out]LONG *pLength); + HRESULT FindTextEnd([in]BSTR bstr, [in]LONG cch, [in]LONG Flags, [retval, out]LONG *pLength); + HRESULT Delete([in]LONG Unit, [in]LONG Count, [retval, out]LONG *pDelta); HRESULT Cut([out]VARIANT *pVar); HRESULT Copy([out]VARIANT *pVar); - HRESULT Paste([in]VARIANT *pVar, [in]long Format); - HRESULT CanPaste([in]VARIANT *pVar, [in]long Format, [retval, out]long *pb); - HRESULT CanEdit([retval, out]long *pb); - HRESULT ChangeCase([in]long Type); - HRESULT GetPoint([in]long Type, [out]long *cx, [out]long *cy); - HRESULT SetPoint([in]long x, [in]long y, [in]long Type, [in]long Extend); - HRESULT ScrollIntoView([in]long Value); + HRESULT Paste([in]VARIANT *pVar, [in]LONG Format); + HRESULT CanPaste([in]VARIANT *pVar, [in]LONG Format, [retval, out]LONG *pb); + HRESULT CanEdit([retval, out]LONG *pb); + HRESULT ChangeCase([in]LONG Type); + HRESULT GetPoint([in]LONG Type, [out]LONG *cx, [out]LONG *cy); + HRESULT SetPoint([in]LONG x, [in]LONG y, [in]LONG Type, [in]LONG Extend); + HRESULT ScrollIntoView([in]LONG Value); HRESULT GetEmbeddedObject([retval, out]IUnknown **ppv); } @@ -287,15 +291,15 @@ interface ITextRange : IDispatch ] interface ITextSelection : ITextRange { - HRESULT GetFlags([retval, out]long *pFlags); - HRESULT SetFlags([in]long Flags); - HRESULT GetType([retval, out]long *pType); - HRESULT MoveLeft([in]long Unit, [in]long Count, [in]long Extend, [retval, out]long *pDelta); - HRESULT MoveRight([in]long Unit, [in]long Count, [in]long Extend, [retval, out]long *pDelta); - HRESULT MoveUp([in]long Unit, [in]long Count, [in]long Extend, [retval, out]long *pDelta); - HRESULT MoveDown([in]long Unit, [in]long Count, [in]long Extend, [retval, out]long *pDelta); - HRESULT HomeKey([in]long Unit, [in]long Extend, [retval, out]long *pDelta); - HRESULT EndKey([in]long Unit, [in]long Extend, [retval, out]long *pDelta); + HRESULT GetFlags([retval, out]LONG *pFlags); + HRESULT SetFlags([in]LONG Flags); + HRESULT GetType([retval, out]LONG *pType); + HRESULT MoveLeft([in]LONG Unit, [in]LONG Count, [in]LONG Extend, [retval, out]LONG *pDelta); + HRESULT MoveRight([in]LONG Unit, [in]LONG Count, [in]LONG Extend, [retval, out]LONG *pDelta); + HRESULT MoveUp([in]LONG Unit, [in]LONG Count, [in]LONG Extend, [retval, out]LONG *pDelta); + HRESULT MoveDown([in]LONG Unit, [in]LONG Count, [in]LONG Extend, [retval, out]LONG *pDelta); + HRESULT HomeKey([in]LONG Unit, [in]LONG Extend, [retval, out]LONG *pDelta); + HRESULT EndKey([in]LONG Unit, [in]LONG Extend, [retval, out]LONG *pDelta); HRESULT TypeText([in]BSTR bstr); } @@ -307,59 +311,59 @@ interface ITextFont : IDispatch { HRESULT GetDuplicate([retval, out]ITextFont **ppFont); HRESULT SetDuplicate([in]ITextFont *pFont); - HRESULT CanChange([out]long *pB); - HRESULT IsEqual([in]ITextFont *pFont, [retval, out]long *pB); - HRESULT Reset([in]long Value); - HRESULT GetStyle([retval, out]long *pValue); - HRESULT SetStyle([in]long Value); - HRESULT GetAllCaps([retval, out]long *pValue); - HRESULT SetAllCaps([in]long Value); - HRESULT GetAnimation([retval, out]long *pValue); - HRESULT SetAnimation([in]long Value); - HRESULT GetBackColor([retval, out]long *pValue); - HRESULT SetBackColor([in]long Value); - HRESULT GetBold([retval, out]long *pValue); - HRESULT SetBold([in]long Value); - HRESULT GetEmboss([retval, out]long *pValue); - HRESULT SetEmboss([in]long Value); - HRESULT GetForeColor([retval, out]long *pValue); - HRESULT SetForeColor([in]long Value); - HRESULT GetHidden([retval, out]long *pValue); - HRESULT SetHidden([in]long Value); - HRESULT GetEngrave([retval, out]long *pValue); - HRESULT SetEngrave([in]long Value); - HRESULT GetItalic([retval, out]long *pValue); - HRESULT SetItalic([in]long Value); - HRESULT GetKerning([retval, out]long *pValue); - HRESULT SetKerning([in]long Value); - HRESULT GetLanguageID([retval, out]long *pValue); - HRESULT SetLanguageID([in]long Value); + HRESULT CanChange([out]LONG *pB); + HRESULT IsEqual([in]ITextFont *pFont, [retval, out]LONG *pB); + HRESULT Reset([in]LONG Value); + HRESULT GetStyle([retval, out]LONG *pValue); + HRESULT SetStyle([in]LONG Value); + HRESULT GetAllCaps([retval, out]LONG *pValue); + HRESULT SetAllCaps([in]LONG Value); + HRESULT GetAnimation([retval, out]LONG *pValue); + HRESULT SetAnimation([in]LONG Value); + HRESULT GetBackColor([retval, out]LONG *pValue); + HRESULT SetBackColor([in]LONG Value); + HRESULT GetBold([retval, out]LONG *pValue); + HRESULT SetBold([in]LONG Value); + HRESULT GetEmboss([retval, out]LONG *pValue); + HRESULT SetEmboss([in]LONG Value); + HRESULT GetForeColor([retval, out]LONG *pValue); + HRESULT SetForeColor([in]LONG Value); + HRESULT GetHidden([retval, out]LONG *pValue); + HRESULT SetHidden([in]LONG Value); + HRESULT GetEngrave([retval, out]LONG *pValue); + HRESULT SetEngrave([in]LONG Value); + HRESULT GetItalic([retval, out]LONG *pValue); + HRESULT SetItalic([in]LONG Value); + HRESULT GetKerning([retval, out]LONG *pValue); + HRESULT SetKerning([in]LONG Value); + HRESULT GetLanguageID([retval, out]LONG *pValue); + HRESULT SetLanguageID([in]LONG Value); HRESULT GetName([retval, out]BSTR *pValue); HRESULT SetName([in]BSTR Value); - HRESULT GetOutline([retval, out]long *pValue); - HRESULT SetOutline([in]long Value); - HRESULT GetPosition([retval, out]long *pValue); - HRESULT SetPosition([in]long Value); - HRESULT GetProtected([retval, out]long *pValue); - HRESULT SetProtected([in]long Value); - HRESULT GetShadow([retval, out]long *pValue); - HRESULT SetShadow([in]long Value); - HRESULT GetSize([retval, out]long *pValue); - HRESULT SetSize([in]long Value); - HRESULT GetSmallCaps([retval, out]long *pValue); - HRESULT SetSmallCaps([in]long Value); + HRESULT GetOutline([retval, out]LONG *pValue); + HRESULT SetOutline([in]LONG Value); + HRESULT GetPosition([retval, out]LONG *pValue); + HRESULT SetPosition([in]LONG Value); + HRESULT GetProtected([retval, out]LONG *pValue); + HRESULT SetProtected([in]LONG Value); + HRESULT GetShadow([retval, out]LONG *pValue); + HRESULT SetShadow([in]LONG Value); + HRESULT GetSize([retval, out]LONG *pValue); + HRESULT SetSize([in]LONG Value); + HRESULT GetSmallCaps([retval, out]LONG *pValue); + HRESULT SetSmallCaps([in]LONG Value); HRESULT GetSpacing([retval, out]float *pValue); HRESULT SetSpacing([in]float Value); - HRESULT GetStrikeThrough([retval, out]long *pValue); - HRESULT SetStrikeThrough([in]long Value); - HRESULT GetSubscript([retval, out]long *pValue); - HRESULT SetSubscript([in]long Value); - HRESULT GetSuperscript([retval, out]long *pValue); - HRESULT SetSuperscript([in]long Value); - HRESULT GetUnderline([retval, out]long *pValue); - HRESULT SetUnderline([in]long Value); - HRESULT GetWeight([retval, out]long *pValue); - HRESULT SetWeight([in]long Value); + HRESULT GetStrikeThrough([retval, out]LONG *pValue); + HRESULT SetStrikeThrough([in]LONG Value); + HRESULT GetSubscript([retval, out]LONG *pValue); + HRESULT SetSubscript([in]LONG Value); + HRESULT GetSuperscript([retval, out]LONG *pValue); + HRESULT SetSuperscript([in]LONG Value); + HRESULT GetUnderline([retval, out]LONG *pValue); + HRESULT SetUnderline([in]LONG Value); + HRESULT GetWeight([retval, out]LONG *pValue); + HRESULT SetWeight([in]LONG Value); } [ @@ -370,52 +374,52 @@ interface ITextPara : IDispatch { HRESULT GetDuplicate([retval, out]ITextPara **ppPara); HRESULT SetDuplicate([in]ITextPara *pPara); - HRESULT CanChange([out]long *pB); - HRESULT IsEqual([in]ITextPara *pPara, [retval, out]long *pB); - HRESULT Reset([in]long Value); - HRESULT GetStyle([retval, out]long *pValue); - HRESULT SetStyle([in]long Value); - HRESULT GetAlignment([retval, out]long *pValue); - HRESULT SetAlignment([in]long Value); - HRESULT GetHyphenation([retval, out]long *pValue); - HRESULT SetHyphenation([in]long Value); + HRESULT CanChange([out]LONG *pB); + HRESULT IsEqual([in]ITextPara *pPara, [retval, out]LONG *pB); + HRESULT Reset([in]LONG Value); + HRESULT GetStyle([retval, out]LONG *pValue); + HRESULT SetStyle([in]LONG Value); + HRESULT GetAlignment([retval, out]LONG *pValue); + HRESULT SetAlignment([in]LONG Value); + HRESULT GetHyphenation([retval, out]LONG *pValue); + HRESULT SetHyphenation([in]LONG Value); HRESULT GetFirstLineIndent([retval, out]float *pValue); - HRESULT GetKeepTogether([retval, out]long *pValue); - HRESULT SetKeepTogether([in]long Value); - HRESULT GetKeepWithNext([retval, out]long *pValue); - HRESULT SetKeepWithNext([in]long Value); + HRESULT GetKeepTogether([retval, out]LONG *pValue); + HRESULT SetKeepTogether([in]LONG Value); + HRESULT GetKeepWithNext([retval, out]LONG *pValue); + HRESULT SetKeepWithNext([in]LONG Value); HRESULT GetLeftIndent([retval, out]float *pValue); HRESULT GetLineSpacing([retval, out]float *pValue); - HRESULT GetLineSpacingRule([retval, out]long *pValue); - HRESULT GetListAlignment([retval, out]long *pValue); - HRESULT SetListAlignment([in]long Value); - HRESULT GetListLevelIndex([retval, out]long *pValue); - HRESULT SetListLevelIndex([in]long Value); - HRESULT GetListStart([retval, out]long *pValue); - HRESULT SetListStart([in]long Value); - HRESULT GetListTab([retval, out]long *pValue); - HRESULT SetListTab([in]long Value); - HRESULT GetListType([retval, out]long *pValue); - HRESULT SetListType([in]long Value); - HRESULT GetNoLineNumber([retval, out]long *pValue); - HRESULT SetNoLineNumber([in]long Value); - HRESULT GetPageBreakBefore([retval, out]long *pValue); - HRESULT SetPageBreakBefore([in]long Value); + HRESULT GetLineSpacingRule([retval, out]LONG *pValue); + HRESULT GetListAlignment([retval, out]LONG *pValue); + HRESULT SetListAlignment([in]LONG Value); + HRESULT GetListLevelIndex([retval, out]LONG *pValue); + HRESULT SetListLevelIndex([in]LONG Value); + HRESULT GetListStart([retval, out]LONG *pValue); + HRESULT SetListStart([in]LONG Value); + HRESULT GetListTab([retval, out]LONG *pValue); + HRESULT SetListTab([in]LONG Value); + HRESULT GetListType([retval, out]LONG *pValue); + HRESULT SetListType([in]LONG Value); + HRESULT GetNoLineNumber([retval, out]LONG *pValue); + HRESULT SetNoLineNumber([in]LONG Value); + HRESULT GetPageBreakBefore([retval, out]LONG *pValue); + HRESULT SetPageBreakBefore([in]LONG Value); HRESULT GetRightIndent([retval, out]float *pValue); HRESULT SetRightIndent([in]float Value); HRESULT SetIndents([in]float StartIndent, [in]float LeftIndent, [in]float RightIndent); - HRESULT SetLineSpacing([in]long LineSpacingRule, [in]float LineSpacing); + HRESULT SetLineSpacing([in]LONG LineSpacingRule, [in]float LineSpacing); HRESULT GetSpaceAfter([retval, out]float *pValue); HRESULT SetSpaceAfter([in]float Value); HRESULT GetSpaceBefore([retval, out]float *pValue); HRESULT SetSpaceBefore([in]float Value); HRESULT GetWindowControl([retval, out]float *pValue); HRESULT SetWindowControl([in]float Value); - HRESULT GetTabCount([retval, out]long *pCount); - HRESULT AddTab([in]float tbPos, [in]long tbAlign, [in]long tbLeader); + HRESULT GetTabCount([retval, out]LONG *pCount); + HRESULT AddTab([in]float tbPos, [in]LONG tbAlign, [in]LONG tbLeader); HRESULT ClearAllTabs(); HRESULT DeleteTab([in]float tbPos); - HRESULT GetTab([in]long iTab, [out]float *ptbPos, [out]long *ptbAlign, [out]long *ptbLeader); + HRESULT GetTab([in]LONG iTab, [out]float *ptbPos, [out]LONG *ptbAlign, [out]LONG *ptbLeader); } [ @@ -425,6 +429,6 @@ interface ITextPara : IDispatch interface ITextStoryRanges : IDispatch { HRESULT _NewEnum([retval, out]IUnknown **ppUnkEnum); - HRESULT Item([in]long Index, [retval, out]ITextRange **ppRange); - HRESULT GetCount([retval, out]long *pCount); + HRESULT Item([in]LONG Index, [retval, out]ITextRange **ppRange); + HRESULT GetCount([retval, out]LONG *pCount); } diff --git a/reactos/include/psdk/tuner.idl b/reactos/include/psdk/tuner.idl new file mode 100644 index 00000000000..57f4de1fb3b --- /dev/null +++ b/reactos/include/psdk/tuner.idl @@ -0,0 +1,1817 @@ + + +cpp_quote("#pragma once") + +#include +#ifndef DO_NO_IMPORTS +import "oaidl.idl"; +import "comcat.idl"; +import "strmif.idl"; +import "bdaiface.idl"; +import "regbag.idl"; +#else +cpp_quote("#include ") +#endif + +interface ITuningSpaceContainer; +interface ITuningSpace; +interface IEnumTuningSpaces; +interface ITuneRequest; +interface ITuner; +interface ITunerCap; +interface IScanningTuner; +interface IEnumComponentTypes; +interface IComponentTypes; +interface IComponentType; +interface ILanguageComponentType; +interface IEnumComponents; +interface IComponents; +interface IComponent; +interface IMPEG2ComponentType; +interface IMPEG2Component; +interface ILocator; +interface IATSCLocator; +interface IDVBSLocator; +interface IDVBTLocator; +interface IDVBCLocator; +interface IDigitalCableLocator; +interface IAnalogLocator; +interface IDigitalCableTuneRequest; +interface IDigitalCableTuningSpace; + +[ + object, + uuid(901284E4-33FE-4b69-8D63-634A596F3756), + dual, + oleautomation, + nonextensible, + pointer_default(unique) +] +interface ITuningSpaces : IDispatch +{ + HRESULT get_Count( + [out] long *Count); + + HRESULT get__NewEnum( + [out] IEnumVARIANT** NewEnum); + + HRESULT get_Item( + [in] VARIANT varIndex, + [out] ITuningSpace** TuningSpace); + + HRESULT get_EnumTuningSpaces( + [out] IEnumTuningSpaces** NewEnum); +} + +[ + object, + uuid(5B692E84-E2F1-11d2-9493-00C04F72D980), + dual, + oleautomation, + hidden, + nonextensible, + pointer_default(unique) +] +interface ITuningSpaceContainer : IDispatch +{ + HRESULT get_Count( + [out] long *Count); + + HRESULT get__NewEnum( + [out] IEnumVARIANT** NewEnum); + + HRESULT get_Item( + [in] VARIANT varIndex, + [out] ITuningSpace** TuningSpace); + + HRESULT put_Item( + [in] VARIANT varIndex, + [in] ITuningSpace *TuningSpace); + + HRESULT TuningSpacesForCLSID( + [in] BSTR SpaceCLSID, + [out] ITuningSpaces** NewColl); + + HRESULT _TuningSpacesForCLSID( + [in] REFCLSID SpaceCLSID, + [out] ITuningSpaces** NewColl); + + HRESULT TuningSpacesForName( + [in] BSTR Name, + [out] ITuningSpaces** NewColl); + + HRESULT FindID( + [in] ITuningSpace *TuningSpace, + [out] long *ID); + + HRESULT Add( + [in] ITuningSpace* TuningSpace, + [out] VARIANT* NewIndex); + + HRESULT get_EnumTuningSpaces( + [out] IEnumTuningSpaces **ppEnum); + + HRESULT Remove( + [in] VARIANT Index); + + HRESULT get_MaxCount( + [out] long *MaxCount); + + HRESULT put_MaxCount( + [in] long MaxCount); +} + + +[ + object, + uuid(061C6E30-E622-11d2-9493-00C04F72D980), + dual, + oleautomation, + nonextensible, + pointer_default(unique) +] +interface ITuningSpace : IDispatch +{ + HRESULT get_UniqueName( + [out] BSTR *Name); + + HRESULT put_UniqueName( + [in] BSTR Name); + + HRESULT get_FriendlyName( + [out] BSTR *Name); + + HRESULT put_FriendlyName( + [in] BSTR Name); + + HRESULT get_CLSID( + [out] BSTR* SpaceCLSID); + + HRESULT get_NetworkType( + [out] BSTR *NetworkTypeGuid); + + HRESULT put_NetworkType( + [in] BSTR NetworkTypeGuid); + + HRESULT get__NetworkType( + [out] GUID* NetworkTypeGuid); + + HRESULT put__NetworkType( + [in] REFCLSID NetworkTypeGuid); + + HRESULT CreateTuneRequest( + [out] ITuneRequest **TuneRequest); + + HRESULT EnumCategoryGUIDs( + [out] IEnumGUID **ppEnum); + + HRESULT EnumDeviceMonikers( + [out] IEnumMoniker **ppEnum); + + HRESULT get_DefaultPreferredComponentTypes( + [out] IComponentTypes** ComponentTypes); + + HRESULT put_DefaultPreferredComponentTypes( + [in] IComponentTypes* NewComponentTypes); + + HRESULT get_FrequencyMapping( + [out] BSTR *pMapping); + + HRESULT put_FrequencyMapping( + BSTR Mapping); + + HRESULT get_DefaultLocator( + [out] ILocator **LocatorVal); + + HRESULT put_DefaultLocator( + [in]ILocator *LocatorVal); + + HRESULT Clone( + [out] ITuningSpace **NewTS); +} + +[ + hidden, + restricted, + object, + uuid(8B8EB248-FC2B-11d2-9D8C-00C04F72D980), + pointer_default(unique) +] +interface IEnumTuningSpaces : IUnknown +{ + HRESULT Next( + [in] ULONG celt, + [in, out]ITuningSpace** rgelt, + [out] ULONG* pceltFetched); + + HRESULT Skip( + [in] ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + [out] IEnumTuningSpaces** ppEnum); +} + +[ + object, + hidden, + dual, + oleautomation, + nonextensible, + uuid(ADA0B268-3B19-4e5b-ACC4-49F852BE13BA), + pointer_default(unique) +] +interface IDVBTuningSpace : ITuningSpace +{ + HRESULT get_SystemType( + [out] DVBSystemType *SysType); + + HRESULT put_SystemType( + [in] DVBSystemType SysType); +} + +[ + object, + hidden, + dual, + oleautomation, + nonextensible, + uuid(843188B4-CE62-43db-966B-8145A094E040), + pointer_default(unique) +] +interface IDVBTuningSpace2 : IDVBTuningSpace +{ + HRESULT get_NetworkID( + [out] long *NetworkID); + + HRESULT put_NetworkID( + [in] long NetworkID); +} + +[ + object, + hidden, + dual, + oleautomation, + nonextensible, + uuid(CDF7BE60-D954-42fd-A972-78971958E470), + pointer_default(unique) +] +interface IDVBSTuningSpace : IDVBTuningSpace2 +{ + + HRESULT get_LowOscillator( + [out] long *LowOscillator); + + HRESULT put_LowOscillator( + [in] long LowOscillator); + + HRESULT get_HighOscillator( + [out] long *HighOscillator); + + HRESULT put_HighOscillator( + [in] long HighOscillator); + + HRESULT get_LNBSwitch( + [out] long *LNBSwitch); + + HRESULT put_LNBSwitch( + [in] long LNBSwitch); + + HRESULT get_InputRange( + [out] BSTR *InputRange); + + HRESULT put_InputRange( + [in] BSTR InputRange); + + HRESULT get_SpectralInversion( + [out] SpectralInversion *SpectralInversionVal); + + HRESULT put_SpectralInversion( + [in] SpectralInversion SpectralInversionVal); +} + +[ + object, + hidden, + dual, + oleautomation, + nonextensible, + uuid(E48244B8-7E17-4f76-A763-5090FF1E2F30), + pointer_default(unique) +] +interface IAuxInTuningSpace : ITuningSpace +{ +} + +[ + object, + hidden, + dual, + oleautomation, + nonextensible, + uuid(B10931ED-8BFE-4AB0-9DCE-E469C29A9729), + pointer_default(unique) +] +interface IAuxInTuningSpace2 : IAuxInTuningSpace +{ + HRESULT get_CountryCode([out] long *CountryCodeVal); + + HRESULT put_CountryCode([in] long NewCountryCodeVal); +} + +[ + object, + hidden, + dual, + oleautomation, + nonextensible, + uuid(2A6E293C-2595-11d3-B64C-00C04F79498E), + pointer_default(unique) +] +interface IAnalogTVTuningSpace : ITuningSpace +{ + HRESULT get_MinChannel( + [out] long *MinChannelVal); + + HRESULT put_MinChannel( + [in] long NewMinChannelVal); + + HRESULT get_MaxChannel( + [out] long *MaxChannelVal); + + HRESULT put_MaxChannel( + [in] long NewMaxChannelVal); + + HRESULT get_InputType( + [out] TunerInputType *InputTypeVal); + + HRESULT put_InputType( + [in] TunerInputType NewInputTypeVal); + + HRESULT get_CountryCode( + [out] long *CountryCodeVal); + + HRESULT put_CountryCode( + [in] long NewCountryCodeVal); +} + +[ + object, + hidden, + dual, + oleautomation, + nonextensible, + uuid(0369B4E2-45B6-11d3-B650-00C04F79498E), + pointer_default(unique) +] +interface IATSCTuningSpace : IAnalogTVTuningSpace +{ + HRESULT get_MinMinorChannel( + [out] long *MinMinorChannelVal); + + HRESULT put_MinMinorChannel( + [in] long NewMinMinorChannelVal); + + HRESULT get_MaxMinorChannel( + [out] long *MaxMinorChannelVal); + + HRESULT put_MaxMinorChannel( + [in] long NewMaxMinorChannelVal); + + HRESULT get_MinPhysicalChannel( + [out] long *MinPhysicalChannelVal); + + HRESULT put_MinPhysicalChannel( + [in] long NewMinPhysicalChannelVal); + + HRESULT get_MaxPhysicalChannel( + [out] long *MaxPhysicalChannelVal); + + HRESULT put_MaxPhysicalChannel( + [in] long NewMaxPhysicalChannelVal); +} + +[ + object, + hidden, + dual, + oleautomation, + nonextensible, + uuid(013F9F9C-B449-4ec7-A6D2-9D4F2FC70AE5), + pointer_default(unique) +] +interface IDigitalCableTuningSpace : IATSCTuningSpace +{ + HRESULT get_MinMajorChannel( + [out] long *MinMajorChannelVal); + + HRESULT put_MinMajorChannel( + [in] long NewMinMajorChannelVal); + + HRESULT get_MaxMajorChannel( + [out] long *MaxMajorChannelVal); + + HRESULT put_MaxMajorChannel( + [in] long NewMaxMajorChannelVal); + + HRESULT get_MinSourceID( + [out] long *MinSourceIDVal); + + HRESULT put_MinSourceID( + [in] long NewMinSourceIDVal); + + HRESULT get_MaxSourceID( + [out] long *MaxSourceIDVal); + + HRESULT put_MaxSourceID( + [in] long NewMaxSourceIDVal); +} + +[ + object, + hidden, + dual, + oleautomation, + nonextensible, + uuid(2A6E293B-2595-11d3-B64C-00C04F79498E), + pointer_default(unique) +] +interface IAnalogRadioTuningSpace : ITuningSpace +{ + HRESULT get_MinFrequency( + [out] long *MinFrequencyVal); + + HRESULT put_MinFrequency( + [in] long NewMinFrequencyVal); + + HRESULT get_MaxFrequency( + [out] long *MaxFrequencyVal); + + HRESULT put_MaxFrequency( + [in] long NewMaxFrequencyVal); + + HRESULT get_Step( + [out] long *StepVal); + + HRESULT put_Step( + [in] long NewStepVal); +} + +[ + object, + hidden, + dual, + oleautomation, + nonextensible, + uuid(39DD45DA-2DA8-46BA-8A8A-87E2B73D983A), + pointer_default(unique) +] +interface IAnalogRadioTuningSpace2 : IAnalogRadioTuningSpace { + HRESULT get_CountryCode([out] long *CountryCodeVal); + HRESULT put_CountryCode([in] long NewCountryCodeVal); +} +[ + object, + nonextensible, + uuid(07DDC146-FC3D-11d2-9D8C-00C04F72D980), + dual, + oleautomation, + pointer_default(unique) +] +interface ITuneRequest : IDispatch +{ + HRESULT get_TuningSpace( + [out] ITuningSpace **TuningSpace); + + HRESULT get_Components( + [out] IComponents **Components); + + HRESULT Clone( + [out] ITuneRequest **NewTuneRequest); + + HRESULT get_Locator( + [out] ILocator **Locator); + + HRESULT put_Locator( + [in] ILocator *Locator); +} + +[ + object, + nonextensible, + uuid(0369B4E0-45B6-11d3-B650-00C04F79498E), + dual, + oleautomation, + pointer_default(unique) +] +interface IChannelTuneRequest : ITuneRequest +{ + HRESULT get_Channel( + [out] long *Channel); + + HRESULT put_Channel( + [in] long Channel); +} + +[ + object, + nonextensible, + uuid(0369B4E1-45B6-11d3-B650-00C04F79498E), + dual, + oleautomation, + pointer_default(unique) +] +interface IATSCChannelTuneRequest : IChannelTuneRequest +{ + HRESULT get_MinorChannel( + [out] long *MinorChannel); + + HRESULT put_MinorChannel( + [in] long MinorChannel); +} + +[ + object, + nonextensible, + uuid(BAD7753B-6B37-4810-AE57-3CE0C4A9E6CB), + dual, + oleautomation, + pointer_default(unique) +] +interface IDigitalCableTuneRequest : IATSCChannelTuneRequest +{ + HRESULT get_MajorChannel( + [out] long *pMajorChannel); + + HRESULT put_MajorChannel( + [in] long MajorChannel); + + HRESULT get_SourceID( + [out] long *pSourceID); + + HRESULT put_SourceID( + [in] long SourceID); +} + + +[ + object, + nonextensible, + uuid(0D6F567E-A636-42bb-83BA-CE4C1704AFA2), + dual, + oleautomation, + pointer_default(unique) +] +interface IDVBTuneRequest : ITuneRequest +{ + HRESULT get_ONID( + [out] long *ONID); + + HRESULT put_ONID( + [in] long ONID); + + HRESULT get_TSID( + [out] long *TSID); + + HRESULT put_TSID( + [in] long TSID); + + HRESULT get_SID( + [out] long *SID); + + HRESULT put_SID( + [in] long SID); +} + +[ + object, + nonextensible, + uuid(EB7D987F-8A01-42ad-B8AE-574DEEE44D1A), + dual, + oleautomation, + pointer_default(unique) +] +interface IMPEG2TuneRequest : ITuneRequest +{ + HRESULT get_TSID( + [out] long *TSID); + + HRESULT put_TSID( + [in] long TSID); + + HRESULT get_ProgNo( + [out] long *ProgNo); + + HRESULT put_ProgNo( + [in] long ProgNo); +} + +[ + object, + nonextensible, + hidden, + uuid(14E11ABD-EE37-4893-9EA1-6964DE933E39), + dual, + oleautomation, + pointer_default(unique) +] +interface IMPEG2TuneRequestFactory : IDispatch +{ + HRESULT CreateTuneRequest( + [in] ITuningSpace *TuningSpace, + [out] IMPEG2TuneRequest **TuneRequest); +} + +[ + object, + hidden, + restricted, + nonextensible, + uuid(1B9D5FC3-5BBC-4b6c-BB18-B9D10E3EEEBF), + pointer_default(unique) +] +interface IMPEG2TuneRequestSupport : IUnknown +{ +} + +[ + object, + hidden, + nonextensible, + uuid(E60DFA45-8D56-4e65-A8AB-D6BE9412C249), + pointer_default(unique) +] +interface ITunerCap : IUnknown +{ + HRESULT get_SupportedNetworkTypes( + [in] ULONG ulcNetworkTypesMax, + [out] ULONG *pulcNetworkTypes, + [in, out] GUID *pguidNetworkTypes); + + HRESULT get_SupportedVideoFormats( + [out] ULONG *pulAMTunerModeType, + [out] ULONG *pulAnalogVideoStandard); + + HRESULT get_AuxInputCount( + [in, out] ULONG *pulCompositeCount, + [in, out] ULONG *pulSvideoCount); +} + +[ + object, + hidden, + nonextensible, + uuid(28C52640-018A-11d3-9D8E-00C04F72D980), + pointer_default(unique) +] +interface ITuner : IUnknown +{ + HRESULT get_TuningSpace( + [out] ITuningSpace **TuningSpace); + + HRESULT put_TuningSpace( + [in] ITuningSpace *TuningSpace); + + HRESULT EnumTuningSpaces( + [out] IEnumTuningSpaces **ppEnum); + + HRESULT get_TuneRequest( + [out] ITuneRequest **TuneRequest); + + HRESULT put_TuneRequest( + [in] ITuneRequest *TuneRequest); + + HRESULT Validate( + [in] ITuneRequest *TuneRequest); + + HRESULT get_PreferredComponentTypes( + [out] IComponentTypes **ComponentTypes); + + HRESULT put_PreferredComponentTypes( + [in] IComponentTypes *ComponentTypes); + + HRESULT get_SignalStrength( + [out] long *Strength); + + HRESULT TriggerSignalEvents( + [in] long Interval); +} + +[ + object, + hidden, + nonextensible, + uuid(1DFD0A5C-0284-11d3-9D8E-00C04F72D980), + pointer_default(unique) +] +interface IScanningTuner : ITuner +{ + HRESULT SeekUp(); + + HRESULT SeekDown(); + + HRESULT ScanUp( + [in] long MillisecondsPause); + + HRESULT ScanDown( + [in] long MillisecondsPause); + + HRESULT AutoProgram(); +}; + +[ + object, + hidden, + nonextensible, + uuid(04BBD195-0E2D-4593-9BD5-4F908BC33CF5), + pointer_default(unique) +] +interface IScanningTunerEx : IScanningTuner +{ + HRESULT GetCurrentLocator( + [in]ILocator **pILocator); + + HRESULT PerformExhaustiveScan( + [in] long dwLowerFreq, + [in] long dwHigherFreq, + [in] VARIANT_BOOL bFineTune, + [in] HEVENT hEvent); + + HRESULT TerminateCurrentScan( + [out] long *pcurrentFreq); + + HRESULT ResumeCurrentScan( + [in] HEVENT hEvent); + + HRESULT GetTunerScanningCapability( + [out] long *HardwareAssistedScanning, + [out] long *NumStandardsSupported, + [out] GUID *BroadcastStandards); + + HRESULT GetTunerStatus( + [out] long *SecondsLeft, + [out] long *CurrentLockType, + [out] long *AutoDetect, + [out] long *CurrentFreq); + + HRESULT GetCurrentTunerStandardCapability( + [in] GUID CurrentBroadcastStandard, + [out] long *SettlingTime, + [out] long *TvStandardsSupported); + + HRESULT SetScanSignalTypeFilter( + [in] long ScanModulationTypes, + [in] long AnalogVideoStandard); +}; + +[ + object, + hidden, + nonextensible, + uuid(6A340DC0-0311-11d3-9D8E-00C04F72D980), + dual, + oleautomation, + pointer_default(unique) +] +interface IComponentType : IDispatch +{ + HRESULT get_Category( + [out] ComponentCategory *Category); + + HRESULT put_Category( + [in] ComponentCategory Category); + + HRESULT get_MediaMajorType( + [out] BSTR *MediaMajorType); + + HRESULT put_MediaMajorType( + [in] BSTR MediaMajorType); + + HRESULT get__MediaMajorType( + [out] GUID* MediaMajorTypeGuid); + + HRESULT put__MediaMajorType( + [in] REFCLSID MediaMajorTypeGuid); + + HRESULT get_MediaSubType( + [out] BSTR *MediaSubType); + + HRESULT put_MediaSubType( + [in] BSTR MediaSubType); + + HRESULT get__MediaSubType( + [out] GUID* MediaSubTypeGuid); + + HRESULT put__MediaSubType( + [in] REFCLSID MediaSubTypeGuid); + + HRESULT get_MediaFormatType( + [out] BSTR *MediaFormatType); + + HRESULT put_MediaFormatType( + [in] BSTR MediaFormatType); + + HRESULT get__MediaFormatType( + [out] GUID* MediaFormatTypeGuid); + + HRESULT put__MediaFormatType( + [in] REFCLSID MediaFormatTypeGuid); + + HRESULT get_MediaType( + [out] AM_MEDIA_TYPE *MediaType); + + HRESULT put_MediaType( + [in] AM_MEDIA_TYPE *MediaType); + + HRESULT Clone( + [out] IComponentType **NewCT); +}; + +[ + object, + hidden, + nonextensible, + uuid(B874C8BA-0FA2-11d3-9D8E-00C04F72D980), + dual, + oleautomation, + pointer_default(unique) +] +interface ILanguageComponentType : IComponentType +{ + HRESULT get_LangID( + [out] long *LangID); + + HRESULT put_LangID( + [in] long LangID); +}; + +[ + object, + hidden, + nonextensible, + uuid(2C073D84-B51C-48c9-AA9F-68971E1F6E38), + dual, + oleautomation, + pointer_default(unique) +] +interface IMPEG2ComponentType : ILanguageComponentType +{ + HRESULT get_StreamType( + [out] MPEG2StreamType *MP2StreamType); + + HRESULT put_StreamType( + [in] MPEG2StreamType MP2StreamType); +}; + + +[ + object, + hidden, + nonextensible, + uuid(FC189E4D-7BD4-4125-B3B3-3A76A332CC96), + dual, + oleautomation, + pointer_default(unique) +] +interface IATSCComponentType : IMPEG2ComponentType +{ + HRESULT get_Flags( + [out] long *Flags); + + HRESULT put_Flags( + [in] long flags); +}; + +[ + hidden, restricted, + object, + uuid(8A674B4A-1F63-11d3-B64C-00C04F79498E), + pointer_default(unique) +] +interface IEnumComponentTypes : IUnknown +{ + HRESULT Next( + [in] ULONG celt, + [in, out]IComponentType** rgelt, + [out] ULONG* pceltFetched); + + HRESULT Skip( + [in] ULONG celt); + + HRESULT Reset(void); + + HRESULT Clone( + [out] IEnumComponentTypes** ppEnum); +} + +[ + object, + hidden, + nonextensible, + uuid(0DC13D4A-0313-11d3-9D8E-00C04F72D980), + dual, + oleautomation, + pointer_default(unique) +] +interface IComponentTypes : IDispatch +{ + HRESULT get_Count( + [out] long *Count); + + HRESULT get__NewEnum( + [out] IEnumVARIANT **ppNewEnum); + + HRESULT EnumComponentTypes( + [out] IEnumComponentTypes **ppNewEnum); + + HRESULT get_Item( + [in] VARIANT Index, + [out] IComponentType **ComponentType); + + HRESULT put_Item( + [in] VARIANT Index, + [in] IComponentType *ComponentType); + + HRESULT Add( + [in] IComponentType *ComponentType, + [out] VARIANT *NewIndex); + + HRESULT Remove( + [in] VARIANT Index); + + HRESULT Clone([out] IComponentTypes **NewList); +}; + +[ + object, + nonextensible, + uuid(1A5576FC-0E19-11d3-9D8E-00C04F72D980), + dual, + oleautomation, + pointer_default(unique) +] +interface IComponent : IDispatch +{ + HRESULT get_Type( + [out] IComponentType** CT); + + HRESULT put_Type( + [in] IComponentType* CT); + + HRESULT get_DescLangID( + [out] long *LangID); + + HRESULT put_DescLangID( + [in] long LangID); + + HRESULT get_Status( + [out] ComponentStatus *Status); + + HRESULT put_Status( + [in] ComponentStatus Status); + + HRESULT get_Description( + [out] BSTR *Description); + + HRESULT put_Description( + [in] BSTR Description); + + HRESULT Clone( + [out] IComponent **NewComponent); + +}; + +[ + object, + nonextensible, + uuid(2CFEB2A8-1787-4A24-A941-C6EAEC39C842), + dual, + oleautomation, + pointer_default(unique) +] +interface IAnalogAudioComponentType : IComponentType +{ + HRESULT get_AnalogAudioMode( + [out] TVAudioMode *Mode); + + HRESULT put_AnalogAudioMode( + [in] TVAudioMode Mode); +} + +[ + object, + nonextensible, + uuid(1493E353-1EB6-473c-802D-8E6B8EC9D2A9), + dual, + oleautomation, + pointer_default(unique) +] +interface IMPEG2Component : IComponent +{ + HRESULT get_PID( + [out] long *PID); + + HRESULT put_PID( + [in] long PID); + + HRESULT get_PCRPID( + [out] long *PCRPID); + + HRESULT put_PCRPID( + [in] long PCRPID); + + HRESULT get_ProgramNumber( + [out] long *ProgramNumber); + + HRESULT put_ProgramNumber( + [in] long ProgramNumber); +}; + +[ + hidden, + restricted, + object, + uuid(2A6E2939-2595-11d3-B64C-00C04F79498E), + pointer_default(unique) +] +interface IEnumComponents : IUnknown +{ + HRESULT Next( + [in] ULONG celt, + [in, out]IComponent** rgelt, + [out] ULONG* pceltFetched); + + HRESULT Skip( + [in] ULONG celt); + + HRESULT Reset(void); + + HRESULT Clone( + [out] IEnumComponents** ppEnum); +} + + + +[ + object, + nonextensible, + uuid(39A48091-FFFE-4182-A161-3FF802640E26), + dual, + oleautomation, + pointer_default(unique) +] +interface IComponents : IDispatch +{ + HRESULT get_Count( + [out] long *Count); + + HRESULT get__NewEnum( + [out] IEnumVARIANT **ppNewEnum); + + HRESULT EnumComponents( + [out] IEnumComponents **ppNewEnum); + + HRESULT get_Item( + [in] VARIANT Index, + [out] IComponent **ppComponent); + + HRESULT Add( + [in] IComponent *Component, + [out] VARIANT *NewIndex); + + HRESULT Remove( + [in] VARIANT Index); + + HRESULT Clone( + [out] IComponents **NewList); + + HRESULT put_Item( + [in] VARIANT Index, + [in] IComponent *ppComponent); + +}; + +[ + object, + nonextensible, + uuid(FCD01846-0E19-11d3-9D8E-00C04F72D980), + dual, + oleautomation, + pointer_default(unique) +] +interface IComponentsOld : IDispatch +{ + HRESULT get_Count( + [out] long *Count); + + HRESULT get__NewEnum( + [out] IEnumVARIANT **ppNewEnum); + + HRESULT EnumComponents( + [out] IEnumComponents **ppNewEnum); + + HRESULT get_Item( + [in] VARIANT Index, + [out] IComponent **ppComponent); + + HRESULT Add( + [in] IComponent *Component, + [out] VARIANT *NewIndex); + + HRESULT Remove( + [in] VARIANT Index); + + HRESULT Clone( + [out] IComponents **NewList); + +}; + +[ + object, + nonextensible, + uuid(286D7F89-760C-4F89-80C4-66841D2507AA), + dual, + oleautomation, + pointer_default(unique) +] +interface ILocator : IDispatch +{ + + HRESULT get_CarrierFrequency( + [out] long* Frequency); + + HRESULT put_CarrierFrequency( + [in] long Frequency); + + HRESULT get_InnerFEC( + [out] FECMethod* FEC); + + HRESULT put_InnerFEC( + [in] FECMethod FEC); + + HRESULT get_InnerFECRate( + [out] BinaryConvolutionCodeRate* FEC); + + HRESULT put_InnerFECRate( + [in] BinaryConvolutionCodeRate FEC); + + HRESULT get_OuterFEC( + [out] FECMethod* FEC); + + HRESULT put_OuterFEC( + [in] FECMethod FEC); + + HRESULT get_OuterFECRate( + [out] BinaryConvolutionCodeRate* FEC); + + HRESULT put_OuterFECRate( + [in] BinaryConvolutionCodeRate FEC); + + HRESULT get_Modulation( + [out] ModulationType* Modulation); + + HRESULT put_Modulation( + [in] ModulationType Modulation); + + HRESULT get_SymbolRate( + [out] long* Rate); + + HRESULT put_SymbolRate( + [in] long Rate); + + HRESULT Clone( + [out] ILocator **NewLocator); +}; + +[ + object, + nonextensible, + uuid(34D1F26B-E339-430D-ABCE-738CB48984DC), + dual, + oleautomation, + pointer_default(unique) +] +interface IAnalogLocator : ILocator +{ + HRESULT get_VideoStandard( + [out] AnalogVideoStandard* AVS); + + HRESULT put_VideoStandard( + [in] AnalogVideoStandard AVS); +} + +[ + object, + nonextensible, + uuid(19B595D8-839A-47F0-96DF-4F194F3C768C), + dual, + oleautomation, + pointer_default(unique) +] +interface IDigitalLocator : ILocator +{ +}; + +[ + object, + hidden, + nonextensible, + uuid(BF8D986F-8C2B-4131-94D7-4D3D9FCC21EF), + dual, + oleautomation, + pointer_default(unique) +] +interface IATSCLocator : IDigitalLocator +{ + HRESULT get_PhysicalChannel( + [out] long *PhysicalChannel); + + HRESULT put_PhysicalChannel( + [in] long PhysicalChannel); + + HRESULT get_TSID( + [out] long *TSID); + + HRESULT put_TSID( + [in] long TSID); +}; + +[ + object, + hidden, + nonextensible, + uuid(612AA885-66CF-4090-BA0A-566F5312E4CA), + dual, + oleautomation, + pointer_default(unique) +] +interface IATSCLocator2 : IATSCLocator +{ + HRESULT get_ProgramNumber( + [out] long *ProgramNumber); + + HRESULT put_ProgramNumber( + [in] long ProgramNumber); +}; + +[ + object, + hidden, + nonextensible, + uuid(48F66A11-171A-419A-9525-BEEECD51584C), + dual, + oleautomation, + pointer_default(unique) +] +interface IDigitalCableLocator : IATSCLocator2 +{ +} + +[ + object, + hidden, + nonextensible, + uuid(8664DA16-DDA2-42ac-926A-C18F9127C302), + dual, + oleautomation, + pointer_default(unique) +] +interface IDVBTLocator : IDigitalLocator +{ + HRESULT get_Bandwidth( + [out] long* BandWidthVal); + + HRESULT put_Bandwidth( + [in] long BandwidthVal); + + HRESULT get_LPInnerFEC( + [out] FECMethod* FEC); + + HRESULT put_LPInnerFEC( + [in] FECMethod FEC); + + HRESULT get_LPInnerFECRate( + [out] BinaryConvolutionCodeRate* FEC); + + HRESULT put_LPInnerFECRate( + [in] BinaryConvolutionCodeRate FEC); + + HRESULT get_HAlpha( + [out] HierarchyAlpha* Alpha); + + HRESULT put_HAlpha( + [in] HierarchyAlpha Alpha); + + HRESULT get_Guard( + [out] GuardInterval* GI); + + HRESULT put_Guard( + [in] GuardInterval GI); + + HRESULT get_Mode( + [out] TransmissionMode* mode); + + HRESULT put_Mode( + [in] TransmissionMode mode); + + HRESULT get_OtherFrequencyInUse( + [out] VARIANT_BOOL* OtherFrequencyInUseVal); + + HRESULT put_OtherFrequencyInUse( + [in] VARIANT_BOOL OtherFrequencyInUseVal); +}; + +[ + object, + hidden, + nonextensible, + uuid(3D7C353C-0D04-45f1-A742-F97CC1188DC8), + dual, + oleautomation, + pointer_default(unique) +] +interface IDVBSLocator : IDigitalLocator +{ + + HRESULT get_SignalPolarisation( + [out] Polarisation* PolarisationVal); + + HRESULT put_SignalPolarisation( + [in] Polarisation PolarisationVal); + + HRESULT get_WestPosition( + [out] VARIANT_BOOL* WestLongitude); + + HRESULT put_WestPosition( + [in] VARIANT_BOOL WestLongitude); + + HRESULT get_OrbitalPosition( + [out] long* longitude); + + HRESULT put_OrbitalPosition( + [in] long longitude); + + HRESULT get_Azimuth( + [out] long* Azimuth); + + HRESULT put_Azimuth( + [in] long Azimuth); + + HRESULT get_Elevation( + [out] long* Elevation); + + HRESULT put_Elevation( + [in] long Elevation); +}; + +[ + object, + hidden, + nonextensible, + uuid(6E42F36E-1DD2-43c4-9F78-69D25AE39034), + dual, + oleautomation, + pointer_default(unique) +] +interface IDVBCLocator : IDigitalLocator +{ +}; +[ + object, + hidden, + nonextensible, + uuid(3B21263F-26E8-489d-AAC4-924F7EFD9511), + pointer_default(unique) +] +interface IBroadcastEvent : IUnknown +{ + HRESULT Fire([in] GUID EventID); +}; + +[ + object, + hidden, + nonextensible, + uuid(3d9e3887-1929-423f-8021-43682de95448), + pointer_default(unique) +] +interface IBroadcastEventEx : IBroadcastEvent +{ + HRESULT FireEx( + [in] GUID EventID, + [in] ULONG Param1, + [in] ULONG Param2, + [in] ULONG Param3, + [in] ULONG Param4); +}; + +[ + object, + hidden, + nonextensible, + uuid(359B3901-572C-4854-BB49-CDEF66606A25), + pointer_default(unique) +] +interface IRegisterTuner : IUnknown +{ + HRESULT Register( + [in] ITuner* pTuner, + [in] IGraphBuilder* pGraph); + + HRESULT Unregister(); +}; + +[ + object, + hidden, + nonextensible, + uuid(B34505E0-2F0E-497b-80BC-D43F3B24ED7F), + pointer_default(unique) +] +interface IBDAComparable : IUnknown +{ + HRESULT CompareExact( + [in] IDispatch* CompareTo, + [out] long* Result); + + HRESULT CompareEquivalent( + [in] IDispatch* CompareTo, + [in] DWORD dwFlags, + [out] long* Result); + + HRESULT HashExact( + [out] __int64* Result); + + HRESULT HashExactIncremental( + [in] __int64 PartialResult, + [out] __int64* Result); + + HRESULT HashEquivalent( + [in] DWORD dwFlags, + [out] __int64* Result); + + HRESULT HashEquivalentIncremental( + [in] __int64 PartialResult, + [in] DWORD dwFlags, + [out] __int64* Result); +}; + +[ + uuid(9B085638-018E-11d3-9D8E-00C04F72D980), + version(1.0), +] +library TunerLib +{ + importlib("stdole2.tlb"); + +[ + uuid(D02AAC50-027E-11d3-9D8E-00C04F72D980) +] + + coclass SystemTuningSpaces +{ + [default] interface ITuningSpaceContainer; +}; + +[ + noncreatable, + hidden, + uuid(5FFDC5E6-B83A-4b55-B6E8-C69E765FE9DB) +] + coclass TuningSpace +{ + [default] interface ITuningSpace; + interface IBDAComparable; +}; + + +[ + uuid(A2E30750-6C3D-11d3-B653-00C04F79498E) +] + coclass ATSCTuningSpace +{ + [default] interface IATSCTuningSpace; + interface IBDAComparable; +}; + +[ + uuid(D9BB4CEE-B87A-47F1-AC92-B08D9C7813FC) +] + coclass DigitalCableTuningSpace +{ + [default] interface IDigitalCableTuningSpace; + interface IBDAComparable; +}; + + +[ + uuid(8A674B4C-1F63-11d3-B64C-00C04F79498E) +] + coclass AnalogRadioTuningSpace +{ + [default] interface IAnalogRadioTuningSpace2; + interface IAnalogRadioTuningSpace; + interface IBDAComparable; +}; + +[ + uuid(F9769A06-7ACA-4e39-9CFB-97BB35F0E77E) +] + coclass AuxInTuningSpace +{ + interface IAuxInTuningSpace; + [default] interface IAuxInTuningSpace2; + interface IBDAComparable; +}; + +[ + uuid(8A674B4D-1F63-11d3-B64C-00C04F79498E) +] + coclass AnalogTVTuningSpace +{ + [default] interface IAnalogTVTuningSpace; + interface IBDAComparable; +}; + +[ + uuid(C6B14B32-76AA-4a86-A7AC-5C79AAF58DA7) +] + coclass DVBTuningSpace +{ + [default] interface IDVBTuningSpace2; + interface IDVBTuningSpace; + interface IBDAComparable; +}; + +[ + uuid(B64016F3-C9A2-4066-96F0-BD9563314726) +] + coclass DVBSTuningSpace +{ + [default] interface IDVBSTuningSpace; + interface IBDAComparable; +}; + + +[ + uuid(A1A2B1C4-0E3A-11d3-9D8E-00C04F72D980) +] + coclass ComponentTypes +{ + [default] interface IComponentTypes; + }; + +[ + uuid(823535A0-0318-11d3-9D8E-00C04F72D980) +] + coclass ComponentType +{ + [default] interface IComponentType; + }; + +[ + uuid(1BE49F30-0E1B-11d3-9D8E-00C04F72D980) +] + coclass LanguageComponentType +{ + [default] interface ILanguageComponentType; + }; + +[ + uuid(418008F3-CF67-4668-9628-10DC52BE1D08) +] + coclass MPEG2ComponentType +{ + [default] interface IMPEG2ComponentType; + }; + +[ + uuid(A8DCF3D5-0780-4ef4-8A83-2CFFAACB8ACE) +] + coclass ATSCComponentType +{ + [default] interface IATSCComponentType; + }; + +[ + hidden, + uuid(809B6661-94C4-49e6-B6EC-3F0F862215AA) +] + coclass Components +{ + [default] interface IComponents; + interface IComponentsOld; +}; + +[ + hidden, + uuid(59DC47A8-116C-11d3-9D8E-00C04F72D980) +] + coclass Component +{ + [default] interface IComponent; + }; + +[ + hidden, + uuid(055CB2D7-2969-45cd-914B-76890722F112) +] + coclass MPEG2Component +{ + [default] interface IMPEG2Component; + }; + + +[ + hidden, + uuid(28AB0005-E845-4FFA-AA9B-F4665236141C) +] + coclass AnalogAudioComponentType +{ + [default] interface IAnalogAudioComponentType; + }; + +[ + noncreatable, + hidden, + uuid(B46E0D38-AB35-4a06-A137-70576B01B39F) +] + coclass TuneRequest +{ + [default] interface ITuneRequest; + interface IBDAComparable; +}; + + +[ + hidden, + uuid(0369B4E5-45B6-11d3-B650-00C04F79498E) +] + coclass ChannelTuneRequest +{ + [default] interface IChannelTuneRequest; + interface IBDAComparable; +}; + +[ + hidden, + uuid(0369B4E6-45B6-11d3-B650-00C04F79498E) +] + coclass ATSCChannelTuneRequest +{ + [default] interface IATSCChannelTuneRequest; + interface IBDAComparable; +}; + +[ + hidden, + uuid(26EC0B63-AA90-458A-8DF4-5659F2C8A18A) +] + coclass DigitalCableTuneRequest +{ + [default] interface IDigitalCableTuneRequest; + interface IBDAComparable; +}; + + +[ + hidden, + uuid(0955AC62-BF2E-4cba-A2B9-A63F772D46CF) +] + coclass MPEG2TuneRequest +{ + [default] interface IMPEG2TuneRequest; + interface IBDAComparable; +}; + +[ + uuid(2C63E4EB-4CEA-41b8-919C-E947EA19A77C) +] + coclass MPEG2TuneRequestFactory +{ + [default] interface IMPEG2TuneRequestFactory; +}; + + +[ + noncreatable, + hidden, + uuid(0888C883-AC4F-4943-B516-2C38D9B34562) +] + coclass Locator +{ + [default] interface ILocator; + interface IBDAComparable; +}; +[ + noncreatable, + hidden, + uuid(6E50CC0D-C19B-4BF6-810B-5BD60761F5CC) +] + coclass DigitalLocator +{ + [default] interface IDigitalLocator; + interface IBDAComparable; +}; + +[ + uuid(49638B91-48AB-48B7-A47A-7D0E75A08EDE) +] + coclass AnalogLocator +{ + [default] interface IAnalogLocator; + interface IBDAComparable; +}; + +[ + uuid(8872FF1B-98FA-4d7a-8D93-C9F1055F85BB) +] + coclass ATSCLocator +{ + [default] interface IATSCLocator2; + interface IATSCLocator; + interface IBDAComparable; +}; + +[ + uuid(03C06416-D127-407A-AB4C-FDD279ABBE5D) +] + coclass DigitalCableLocator +{ + [default] interface IDigitalCableLocator; + interface IBDAComparable; +}; + +[ + uuid(9CD64701-BDF3-4d14-8E03-F12983D86664) +] + coclass DVBTLocator +{ + [default] interface IDVBTLocator; + interface IBDAComparable; +}; + +[ + uuid(1DF7D126-4050-47f0-A7CF-4C4CA9241333) +] + coclass DVBSLocator +{ + [default] interface IDVBSLocator; + interface IBDAComparable; +}; + +[ + uuid(C531D9FD-9685-4028-8B68-6E1232079F1E) +] + coclass DVBCLocator +{ + [default] interface IDVBCLocator; + interface IBDAComparable; +}; + +[ + hidden, + uuid(15D6504A-5494-499c-886C-973C9E53B9F1) +] + coclass DVBTuneRequest +{ + [default] interface IDVBTuneRequest; + interface IBDAComparable; +}; + + +[ + hidden, + uuid(8A674B49-1F63-11d3-B64C-00C04F79498E) +] + coclass CreatePropBagOnRegKey +{ + interface ICreatePropBagOnRegKey; +}; + +[ + hidden, + uuid(0B3FFB92-0919-4934-9D5B-619C719D0202) +] + coclass BroadcastEventService +{ + interface IBroadcastEvent; +}; + +[ + hidden, + uuid(6438570B-0C08-4a25-9504-8012BB4D50CF) +] + coclass TunerMarshaler +{ + interface IRegisterTuner; + interface ITuner; +}; + +cpp_quote("#define SID_SBroadcastEventService CLSID_BroadcastEventService") +cpp_quote("#define SID_SContentTuneRequest IID_ITuner") +cpp_quote("#define SID_ScanningTuner IID_IScanningTuner") +cpp_quote("#define SID_ScanningTunerEx IID_IScanningTunerEx") +} diff --git a/reactos/include/psdk/urlmon.idl b/reactos/include/psdk/urlmon.idl index 78afd1691c9..2ab3b2b021d 100644 --- a/reactos/include/psdk/urlmon.idl +++ b/reactos/include/psdk/urlmon.idl @@ -24,6 +24,7 @@ import "msxml.idl"; cpp_quote("#ifdef WINE_NO_UNICODE_MACROS") cpp_quote("#undef GetUserName") +cpp_quote("#undef SetPort") cpp_quote("#endif") interface IInternetProtocolSink; @@ -1646,6 +1647,62 @@ interface IUri : IUnknown [out] BOOL *pfEqual); } +cpp_quote("HRESULT WINAPI CreateUri(LPCWSTR,DWORD,DWORD_PTR,IUri**);") +cpp_quote("HRESULT WINAPI CreateUriWithFragment(LPCWSTR,LPCWSTR,DWORD,DWORD_PTR,IUri**);") +cpp_quote("HRESULT WINAPI CreateUriFromMultiByteString(LPCSTR,DWORD,DWORD,DWORD,DWORD_PTR,IUri**);") + +cpp_quote("#define Uri_HAS_ABSOLUTE_URI (1 << Uri_PROPERTY_ABSOLUTE_URI)") +cpp_quote("#define Uri_HAS_AUTHORITY (1 << Uri_PROPERTY_AUTHORITY)") +cpp_quote("#define Uri_HAS_DISPLAY_URI (1 << Uri_PROPERTY_DISPLAY_URI)") +cpp_quote("#define Uri_HAS_DOMAIN (1 << Uri_PROPERTY_DOMAIN)") +cpp_quote("#define Uri_HAS_EXTENSION (1 << Uri_PROPERTY_EXTENSION)") +cpp_quote("#define Uri_HAS_FRAGMENT (1 << Uri_PROPERTY_FRAGMENT)") +cpp_quote("#define Uri_HAS_HOST (1 << Uri_PROPERTY_HOST)") +cpp_quote("#define Uri_HAS_PASSWORD (1 << Uri_PROPERTY_PASSWORD)") +cpp_quote("#define Uri_HAS_PATH (1 << Uri_PROPERTY_PATH)") +cpp_quote("#define Uri_HAS_QUERY (1 << Uri_PROPERTY_QUERY)") +cpp_quote("#define Uri_HAS_RAW_URI (1 << Uri_PROPERTY_RAW_URI)") +cpp_quote("#define Uri_HAS_SCHEME_NAME (1 << Uri_PROPERTY_SCHEME_NAME)") +cpp_quote("#define Uri_HAS_USER_NAME (1 << Uri_PROPERTY_USER_NAME)") +cpp_quote("#define Uri_HAS_PATH_AND_QUERY (1 << Uri_PROPERTY_PATH_AND_QUERY)") +cpp_quote("#define Uri_HAS_USER_INFO (1 << Uri_PROPERTY_USER_INFO)") +cpp_quote("#define Uri_HAS_HOST_TYPE (1 << Uri_PROPERTY_HOST_TYPE)") +cpp_quote("#define Uri_HAS_PORT (1 << Uri_PROPERTY_PORT)") +cpp_quote("#define Uri_HAS_SCHEME (1 << Uri_PROPERTY_SCHEME)") +cpp_quote("#define Uri_HAS_ZONE (1 << Uri_PROPERTY_ZONE)") + +cpp_quote("#define Uri_CREATE_ALLOW_RELATIVE 0x0001") +cpp_quote("#define Uri_CREATE_ALLOW_IMPLICIT_WILDCARD_SCHEME 0x0002") +cpp_quote("#define Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME 0x0004") +cpp_quote("#define Uri_CREATE_NOFRAG 0x0008") +cpp_quote("#define Uri_CREATE_NO_CANONICALIZE 0x0010") +cpp_quote("#define Uri_CREATE_CANONICALIZE 0x0100") +cpp_quote("#define Uri_CREATE_FILE_USE_DOS_PATH 0x0020") +cpp_quote("#define Uri_CREATE_DECODE_EXTRA_INFO 0x0040") +cpp_quote("#define Uri_CREATE_NO_DECODE_EXTRA_INFO 0x0080") +cpp_quote("#define Uri_CREATE_CRACK_UNKNOWN_SCHEMES 0x0200") +cpp_quote("#define Uri_CREATE_NO_CRACK_UNKNOWN_SCHEMES 0x0400") +cpp_quote("#define Uri_CREATE_PRE_PROCESS_HTML_URI 0x0800") +cpp_quote("#define Uri_CREATE_NO_PRE_PROCESS_HTML_URI 0x1000") +cpp_quote("#define Uri_CREATE_IE_SETTINGS 0x2000") +cpp_quote("#define Uri_CREATE_NO_IE_SETTINGS 0x4000") +cpp_quote("#define Uri_CREATE_NO_ENCODE_FORBIDDEN_CHARACTERS 0x8000") + +cpp_quote("#define Uri_DISPLAY_NO_FRAGMENT 0x00000001") +cpp_quote("#define Uri_PUNYCODE_IDN_HOST 0x00000002") +cpp_quote("#define Uri_DISPLAY_IDN_HOST 0x00000004") + +cpp_quote("#define Uri_ENCODING_USER_INFO_AND_PATH_IS_PERCENT_ENCODED_UTF8 0x00000001") +cpp_quote("#define Uri_ENCODING_USER_INFO_AND_PATH_IS_CP 0x00000002") +cpp_quote("#define Uri_ENCODING_HOST_IS_IDN 0x00000004") +cpp_quote("#define Uri_ENCODING_HOST_IS_PERCENT_ENCODED_UTF8 0x00000008") +cpp_quote("#define Uri_ENCODING_HOST_IS_PERCENT_ENCODED_CP 0x00000010") +cpp_quote("#define Uri_ENCODING_QUERY_AND_FRAGMENT_IS_PERCENT_ENCODED_UTF8 0x00000020") +cpp_quote("#define Uri_ENCODING_QUERY_AND_FRAGMENT_IS_CP 0x00000040") +cpp_quote("#define Uri_ENCODING_RFC (Uri_ENCODING_USER_INFO_AND_PATH_IS_PERCENT_ENCODED_UTF8|Uri_ENCODING_HOST_IS_PERCENT_ENCODED_UTF8|Uri_ENCODING_QUERY_AND_FRAGMENT_IS_PERCENT_ENCODED_UTF8)") + +cpp_quote("#define UriBuilder_USE_ORIGINAL_FLAGS 0x00000001") + /***************************************************************************** * IUriContainer interface */ @@ -1660,6 +1717,105 @@ interface IUriContainer : IUnknown HRESULT GetIUri([out] IUri **ppIUri); } +/***************************************************************************** + * IUriBuilder interface + */ +[ + local, + object, + uuid(4221b2e1-8955-46c0-bd5b-de9897565de7), + pointer_default(unique) +] +interface IUriBuilder: IUnknown +{ + HRESULT CreateUriSimple( + [in] DWORD dwAllowEncodingPropertyMask, + [in] DWORD_PTR dwReserved, + [out] IUri **ppIUri); + + HRESULT CreateUri( + [in] DWORD dwCreateFlags, + [in] DWORD dwAllowEncodingPropertyMask, + [in] DWORD_PTR dwReserved, + [out] IUri **ppIUri); + + HRESULT CreateUriWithFlags( + [in] DWORD dwCreateFlags, + [in] DWORD dwUriBuilderFlags, + [in] DWORD dwAllowEncodingPropertyMask, + [in] DWORD_PTR dwReserved, + [out] IUri **ppIUri); + + HRESULT GetIUri( + [out] IUri **ppIUri); + + HRESULT SetIUri( + [in, unique] IUri *pIUri); + + HRESULT GetFragment( + [out] DWORD *pcchFragment, + [out] LPCWSTR *ppwzFragment); + + HRESULT GetHost( + [out] DWORD *pcchHost, + [out] LPCWSTR *ppwzHost); + + HRESULT GetPassword( + [out] DWORD *pcchPassword, + [out] LPCWSTR *ppwzPassword); + + HRESULT GetPath( + [out] DWORD *pcchPath, + [out] LPCWSTR *ppwzPath); + + HRESULT GetPort( + [out] BOOL *pfHasPort, + [out] DWORD *pdwPort); + + HRESULT GetQuery( + [out] DWORD *pcchQuery, + [out] LPCWSTR *ppwzQuery); + + HRESULT GetSchemeName( + [out] DWORD *pcchSchemeName, + [out] LPCWSTR *ppwzSchemeName); + + HRESULT GetUserName( + [out] DWORD *pcchUserName, + [out] LPCWSTR *ppwzUserName); + + HRESULT SetFragment( + [in] LPCWSTR pwzNewValue); + + HRESULT SetHost( + [in] LPCWSTR pwzNewValue); + + HRESULT SetPassword( + [in] LPCWSTR pwzNewValue); + + HRESULT SetPath( + [in] LPCWSTR pwzNewValue); + + HRESULT SetPort( + [in] BOOL fHasPort, + [in] DWORD dwNewValue); + + HRESULT SetQuery( + [in] LPCWSTR pwzNewValue); + + HRESULT SetSchemeName( + [in] LPCWSTR pwzNewValue); + + HRESULT SetUserName( + [in] LPCWSTR pwzNewValue); + + HRESULT RemoveProperties( + [in] DWORD dwPropertyMask); + + HRESULT HasBeenModified( + [out] BOOL *pfModified); +}; + /***************************************************************************** * IInternetProtocolEx interface */ @@ -1740,6 +1896,8 @@ cpp_quote("#define INET_E_DEFAULT_ACTION INET_E_USE_DEFAULT_PROTOCOLH cpp_quote("HRESULT WINAPI CoGetClassObjectFromURL(REFCLSID, LPCWSTR, DWORD, DWORD, LPCWSTR, LPBINDCTX, DWORD, LPVOID, REFIID, LPVOID*);") cpp_quote("HRESULT WINAPI CreateURLMoniker(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk);") +cpp_quote("HRESULT WINAPI CreateURLMonikerEx(IMoniker*,LPCWSTR,IMoniker**,DWORD);") +cpp_quote("HRESULT WINAPI CreateURLMonikerEx2(IMoniker*,IUri*,IMoniker**,DWORD);") cpp_quote("HRESULT WINAPI RegisterBindStatusCallback(IBindCtx *pbc, IBindStatusCallback *pbsc, IBindStatusCallback **ppbsc, DWORD dwReserved);") cpp_quote("HRESULT WINAPI CompareSecurityIds(BYTE*,DWORD,BYTE*,DWORD,DWORD);") cpp_quote("HRESULT WINAPI URLDownloadToFileA(LPUNKNOWN,LPCSTR,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);") @@ -1758,6 +1916,7 @@ cpp_quote("HRESULT WINAPI CoInternetCreateZoneManager(IServiceProvider*, IIntern cpp_quote("HRESULT WINAPI CoInternetParseUrl(LPCWSTR,PARSEACTION,DWORD,LPWSTR,DWORD,DWORD*,DWORD);") cpp_quote("HRESULT WINAPI CoInternetQueryInfo(LPCWSTR,QUERYOPTION,DWORD,LPVOID,DWORD,DWORD*,DWORD);") cpp_quote("HRESULT WINAPI CoInternetSetFeatureEnabled(INTERNETFEATURELIST,DWORD,BOOL);") +cpp_quote("HRESULT WINAPI CoInternetGetSecurityUrl(LPCWSTR,LPWSTR*,PSUACTION,DWORD);") cpp_quote("HRESULT WINAPI CreateFormatEnumerator(UINT,FORMATETC*,IEnumFORMATETC**);") cpp_quote("HRESULT WINAPI GetSoftwareUpdateInfo( LPCWSTR szDistUnit, LPSOFTDISTINFO psdi);") cpp_quote("HRESULT WINAPI FaultInIEFeature(HWND,uCLSSPEC*,QUERYCONTEXT*,DWORD);") diff --git a/reactos/include/ddk/usb.h b/reactos/include/psdk/usb.h similarity index 75% rename from reactos/include/ddk/usb.h rename to reactos/include/psdk/usb.h index 4a294b1269f..8edf7a9f552 100644 --- a/reactos/include/ddk/usb.h +++ b/reactos/include/psdk/usb.h @@ -1,10 +1,12 @@ +#pragma once - -#ifndef __USB_H__ -#define __USB_H__ - -#ifdef __USBDI_H__ -error +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif #endif #ifdef OSR21_COMPAT @@ -18,358 +20,45 @@ typedef PVOID PMDL; #endif #endif -#define USBDI_VERSION 0x00000500 +#define USBDI_VERSION 0x00000600 #include "usb200.h" -typedef LONG USBD_STATUS; -typedef PVOID USBD_PIPE_HANDLE; -typedef PVOID USBD_CONFIGURATION_HANDLE; -typedef PVOID USBD_INTERFACE_HANDLE; - -typedef enum _USB_CONTROLLER_FLAVOR -{ - USB_HcGeneric = 0, - OHCI_Generic = 100, - OHCI_Hydra, - OHCI_NEC, - UHCI_Generic = 200, - UHCI_Piix4, - UHCI_Piix3, - UHCI_Ich2_1, - UHCI_Ich2_2, - UHCI_Ich1, - UHCI_VIA = 250, - EHCI_Generic = 1000, - EHCI_NEC = 2000, - EHCI_Lucent = 3000 -} USB_CONTROLLER_FLAVOR; - -typedef enum _USBD_PIPE_TYPE -{ - UsbdPipeTypeControl, - UsbdPipeTypeIsochronous, - UsbdPipeTypeBulk, - UsbdPipeTypeInterrupt -} USBD_PIPE_TYPE; - -typedef struct _USBD_VERSION_INFORMATION -{ - ULONG USBDI_Version; - ULONG Supported_USB_Version; -} USBD_VERSION_INFORMATION, *PUSBD_VERSION_INFORMATION; - -typedef struct _USBD_PIPE_INFORMATION -{ - USHORT MaximumPacketSize; - UCHAR EndpointAddress; - UCHAR Interval; - USBD_PIPE_TYPE PipeType; - USBD_PIPE_HANDLE PipeHandle; - ULONG MaximumTransferSize; - ULONG PipeFlags; -} USBD_PIPE_INFORMATION, *PUSBD_PIPE_INFORMATION; - -typedef struct _USBD_DEVICE_INFORMATION -{ - ULONG OffsetNext; - PVOID UsbdDeviceHandle; - USB_DEVICE_DESCRIPTOR DeviceDescriptor; -} USBD_DEVICE_INFORMATION, *PUSBD_DEVICE_INFORMATION; - -typedef struct _USBD_INTERFACE_INFORMATION -{ - USHORT Length; - UCHAR InterfaceNumber; - UCHAR AlternateSetting; - UCHAR Class; - UCHAR SubClass; - UCHAR Protocol; - UCHAR Reserved; - USBD_INTERFACE_HANDLE InterfaceHandle; - ULONG NumberOfPipes; - USBD_PIPE_INFORMATION Pipes[1]; -} USBD_INTERFACE_INFORMATION, *PUSBD_INTERFACE_INFORMATION; - -struct _URB_HCD_AREA -{ - PVOID Reserved8[8]; -}; - -struct _URB_HEADER -{ - USHORT Length; - USHORT Function; - USBD_STATUS Status; - PVOID UsbdDeviceHandle; - ULONG UsbdFlags; -}; - -struct _URB_SELECT_INTERFACE -{ - struct _URB_HEADER Hdr; - USBD_CONFIGURATION_HANDLE ConfigurationHandle; - USBD_INTERFACE_INFORMATION Interface; -}; - -struct _URB_SELECT_CONFIGURATION -{ - struct _URB_HEADER Hdr; - PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; - USBD_CONFIGURATION_HANDLE ConfigurationHandle; - USBD_INTERFACE_INFORMATION Interface; -}; - -struct _URB_PIPE_REQUEST -{ - struct _URB_HEADER Hdr; - USBD_PIPE_HANDLE PipeHandle; - ULONG Reserved; -}; - -struct _URB_FRAME_LENGTH_CONTROL -{ - struct _URB_HEADER Hdr; -}; - -struct _URB_GET_FRAME_LENGTH -{ - struct _URB_HEADER Hdr; - ULONG FrameLength; - ULONG FrameNumber; -}; - -struct _URB_SET_FRAME_LENGTH -{ - struct _URB_HEADER Hdr; - LONG FrameLengthDelta; -}; - -struct _URB_GET_CURRENT_FRAME_NUMBER -{ - struct _URB_HEADER Hdr; - ULONG FrameNumber; -}; - -struct _URB_CONTROL_DESCRIPTOR_REQUEST -{ - struct _URB_HEADER Hdr; - PVOID Reserved; - ULONG Reserved0; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - USHORT Reserved1; - UCHAR Index; - UCHAR DescriptorType; - USHORT LanguageId; - USHORT Reserved2; -}; - -struct _URB_CONTROL_GET_STATUS_REQUEST -{ - struct _URB_HEADER Hdr; - PVOID Reserved; - ULONG Reserved0; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - UCHAR Reserved1[4]; - USHORT Index; - USHORT Reserved2; -}; - -struct _URB_CONTROL_FEATURE_REQUEST -{ - struct _URB_HEADER Hdr; - PVOID Reserved; - ULONG Reserved2; - ULONG Reserved3; - PVOID Reserved4; - PMDL Reserved5; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - USHORT Reserved0; - USHORT FeatureSelector; - USHORT Index; - USHORT Reserved1; -}; - -struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST -{ - struct _URB_HEADER Hdr; - PVOID Reserved; - ULONG TransferFlags; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - UCHAR RequestTypeReservedBits; - UCHAR Request; - USHORT Value; - USHORT Index; - USHORT Reserved1; -}; - -struct _URB_CONTROL_GET_INTERFACE_REQUEST -{ - struct _URB_HEADER Hdr; - PVOID Reserved; - ULONG Reserved0; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - UCHAR Reserved1[4]; - USHORT Interface; - USHORT Reserved2; -}; - -struct _URB_CONTROL_GET_CONFIGURATION_REQUEST -{ - struct _URB_HEADER Hdr; - PVOID Reserved; - ULONG Reserved0; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - UCHAR Reserved1[8]; -}; - -typedef struct _OS_STRING -{ - UCHAR bLength; - UCHAR bDescriptorType; - WCHAR MicrosoftString[7]; - UCHAR bVendorCode; - UCHAR bPad; -} OS_STRING, *POS_STRING; - - -struct _URB_OS_FEATURE_DESCRIPTOR_REQUEST -{ - struct _URB_HEADER Hdr; - PVOID Reserved; - ULONG Reserved0; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - UCHAR Recipient:5; - UCHAR Reserved1:3; - UCHAR Reserved2; - UCHAR InterfaceNumber; - UCHAR MS_PageIndex; - USHORT MS_FeatureDescriptorIndex; - USHORT Reserved3; -}; - -struct _URB_CONTROL_TRANSFER -{ - struct _URB_HEADER Hdr; - USBD_PIPE_HANDLE PipeHandle; - ULONG TransferFlags; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - UCHAR SetupPacket[8]; -}; - -struct _URB_BULK_OR_INTERRUPT_TRANSFER -{ - struct _URB_HEADER Hdr; - USBD_PIPE_HANDLE PipeHandle; - ULONG TransferFlags; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; -}; - -typedef struct _USBD_ISO_PACKET_DESCRIPTOR -{ - ULONG Offset; - ULONG Length; - USBD_STATUS Status; -} USBD_ISO_PACKET_DESCRIPTOR, *PUSBD_ISO_PACKET_DESCRIPTOR; - -struct _URB_ISOCH_TRANSFER -{ - struct _URB_HEADER Hdr; - USBD_PIPE_HANDLE PipeHandle; - ULONG TransferFlags; - ULONG TransferBufferLength; - PVOID TransferBuffer; - PMDL TransferBufferMDL; - struct _URB *UrbLink; - struct _URB_HCD_AREA hca; - ULONG StartFrame; - ULONG NumberOfPackets; - ULONG ErrorCount; - USBD_ISO_PACKET_DESCRIPTOR IsoPacket[1]; -}; - -typedef struct _URB -{ - union - { - struct _URB_HEADER - UrbHeader; - struct _URB_SELECT_INTERFACE - UrbSelectInterface; - struct _URB_SELECT_CONFIGURATION - UrbSelectConfiguration; - struct _URB_PIPE_REQUEST - UrbPipeRequest; - struct _URB_FRAME_LENGTH_CONTROL - UrbFrameLengthControl; - struct _URB_GET_FRAME_LENGTH - UrbGetFrameLength; - struct _URB_SET_FRAME_LENGTH - UrbSetFrameLength; - struct _URB_GET_CURRENT_FRAME_NUMBER - UrbGetCurrentFrameNumber; - struct _URB_CONTROL_TRANSFER - UrbControlTransfer; - struct _URB_BULK_OR_INTERRUPT_TRANSFER - UrbBulkOrInterruptTransfer; - struct _URB_ISOCH_TRANSFER - UrbIsochronousTransfer; - struct _URB_CONTROL_DESCRIPTOR_REQUEST - UrbControlDescriptorRequest; - struct _URB_CONTROL_GET_STATUS_REQUEST - UrbControlGetStatusRequest; - struct _URB_CONTROL_FEATURE_REQUEST - UrbControlFeatureRequest; - struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST - UrbControlVendorClassRequest; - struct _URB_CONTROL_GET_INTERFACE_REQUEST - UrbControlGetInterfaceRequest; - struct _URB_CONTROL_GET_CONFIGURATION_REQUEST - UrbControlGetConfigurationRequest; - struct _URB_OS_FEATURE_DESCRIPTOR_REQUEST - UrbOSFeatureDescriptorRequest; - }; -} URB, *PURB; - #define USB_PORTATTR_NO_CONNECTOR 0x00000001 #define USB_PORTATTR_SHARED_USB2 0x00000002 #define USB_PORTATTR_MINI_CONNECTOR 0x00000004 #define USB_PORTATTR_OEM_CONNECTOR 0x00000008 #define USB_PORTATTR_OWNED_BY_CC 0x01000000 #define USB_PORTATTR_NO_OVERCURRENT_UI 0x02000000 + +typedef enum _USB_CONTROLLER_FLAVOR { + USB_HcGeneric = 0, + OHCI_Generic = 100, + OHCI_Hydra, + OHCI_NEC, + UHCI_Generic = 200, + UHCI_Piix4 = 201, + UHCI_Piix3 = 202, + UHCI_Ich2 = 203, + UHCI_Reserved204 = 204, + UHCI_Ich1 = 205, + UHCI_Ich3m = 206, + UHCI_Ich4 = 207, + UHCI_Ich5 = 208, + UHCI_Ich6 = 209, + UHCI_Intel = 249, + UHCI_VIA = 250, + UHCI_VIA_x01 = 251, + UHCI_VIA_x02 = 252, + UHCI_VIA_x03 = 253, + UHCI_VIA_x04 = 254, + UHCI_VIA_x0E_FIFO = 264, + EHCI_Generic = 1000, + EHCI_NEC = 2000, + EHCI_Lucent = 3000 +} USB_CONTROLLER_FLAVOR; + + #define USB_DEFAULT_DEVICE_ADDRESS 0 #define USB_DEFAULT_ENDPOINT_ADDRESS 0 #define USB_DEFAULT_MAX_PACKET 64 @@ -416,15 +105,31 @@ typedef struct _URB #define URB_FUNCTION_GET_INTERFACE 0x0027 #define URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE 0x0028 #define URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE 0x0029 + +#if (_WIN32_WINNT >= 0x0501) + #define URB_FUNCTION_GET_MS_FEATURE_DESCRIPTOR 0x002A +#define URB_FUNCTION_SYNC_RESET_PIPE 0x0030 +#define URB_FUNCTION_SYNC_CLEAR_STALL 0x0031 + +#endif + +#if (_WIN32_WINNT >= 0x0600) + +#define URB_FUNCTION_CONTROL_TRANSFER_EX 0x0032 +#define URB_FUNCTION_RESERVE_0X0033 0x0033 +#define URB_FUNCTION_RESERVE_0X0034 0x0034 + +#endif + #define URB_FUNCTION_RESERVE_0X002B 0x002B #define URB_FUNCTION_RESERVE_0X002C 0x002C #define URB_FUNCTION_RESERVE_0X002D 0x002D #define URB_FUNCTION_RESERVE_0X002E 0x002E #define URB_FUNCTION_RESERVE_0X002F 0x002F -#define URB_FUNCTION_SYNC_RESET_PIPE 0x0030 -#define URB_FUNCTION_SYNC_CLEAR_STALL 0x0031 + #define URB_FUNCTION_RESET_PIPE URB_FUNCTION_SYNC_RESET_PIPE_AND_CLEAR_STALL + #define USBD_TRANSFER_DIRECTION 0x00000001 #define USBD_SHORT_TRANSFER_OK 0x00000002 #define USBD_START_ISO_TRANSFER_ASAP 0x00000004 @@ -436,6 +141,9 @@ typedef struct _URB #define VALID_TRANSFER_FLAGS_MASK (USBD_SHORT_TRANSFER_OK | USBD_TRANSFER_DIRECTION | \ USBD_START_ISO_TRANSFER_ASAP | USBD_DEFAULT_PIPE_TRANSFER) #define USBD_ISO_START_FRAME_RANGE 1024 + +typedef LONG USBD_STATUS; + #define USBD_SUCCESS(Status) ((USBD_STATUS)(Status) >= 0) #define USBD_PENDING(Status) ((ULONG)(Status) >> 30 == 1) #define USBD_ERROR(Status) ((USBD_STATUS)(Status) < 0) @@ -481,22 +189,347 @@ typedef struct _URB #define USBD_STATUS_TIMEOUT ((USBD_STATUS)0xC0006000L) #define USBD_STATUS_DEVICE_GONE ((USBD_STATUS)0xC0007000L) #define USBD_STATUS_STATUS_NOT_MAPPED ((USBD_STATUS)0xC0008000L) +#define USBD_STATUS_HUB_INTERNAL_ERROR ((USBD_STATUS)0xC0009000L) #define USBD_STATUS_CANCELED ((USBD_STATUS)0xC0010000L) #define USBD_STATUS_ISO_NOT_ACCESSED_BY_HW ((USBD_STATUS)0xC0020000L) #define USBD_STATUS_ISO_TD_ERROR ((USBD_STATUS)0xC0030000L) #define USBD_STATUS_ISO_NA_LATE_USBPORT ((USBD_STATUS)0xC0040000L) #define USBD_STATUS_ISO_NOT_ACCESSED_LATE ((USBD_STATUS)0xC0050000L) +#define USBD_STATUS_BAD_DESCRIPTOR ((USBD_STATUS)0xC0100000L) +#define USBD_STATUS_BAD_DESCRIPTOR_BLEN ((USBD_STATUS)0xC0100001L) +#define USBD_STATUS_BAD_DESCRIPTOR_TYPE ((USBD_STATUS)0xC0100002L) +#define USBD_STATUS_BAD_INTERFACE_DESCRIPTOR ((USBD_STATUS)0xC0100003L) +#define USBD_STATUS_BAD_ENDPOINT_DESCRIPTOR ((USBD_STATUS)0xC0100004L) +#define USBD_STATUS_BAD_INTERFACE_ASSOC_DESCRIPTOR ((USBD_STATUS)0xC0100005L) +#define USBD_STATUS_BAD_CONFIG_DESC_LENGTH ((USBD_STATUS)0xC0100006L) +#define USBD_STATUS_BAD_NUMBER_OF_INTERFACES ((USBD_STATUS)0xC0100007L) +#define USBD_STATUS_BAD_NUMBER_OF_ENDPOINTS ((USBD_STATUS)0xC0100008L) +#define USBD_STATUS_BAD_ENDPOINT_ADDRESS ((USBD_STATUS)0xC0100009L) + +typedef PVOID USBD_PIPE_HANDLE; +typedef PVOID USBD_CONFIGURATION_HANDLE; +typedef PVOID USBD_INTERFACE_HANDLE; + +#if (_WIN32_WINNT >= 0x0501) #define USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE 0xFFFFFFFF +#else +#define USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE PAGE_SIZE +#endif + +typedef struct _USBD_VERSION_INFORMATION { + ULONG USBDI_Version; + ULONG Supported_USB_Version; +} USBD_VERSION_INFORMATION, *PUSBD_VERSION_INFORMATION; + +typedef enum _USBD_PIPE_TYPE { + UsbdPipeTypeControl, + UsbdPipeTypeIsochronous, + UsbdPipeTypeBulk, + UsbdPipeTypeInterrupt +} USBD_PIPE_TYPE; + +#define USBD_PIPE_DIRECTION_IN(pipeInformation) ((pipeInformation)->EndpointAddress & USB_ENDPOINT_DIRECTION_MASK) + +typedef struct _USBD_DEVICE_INFORMATION { + ULONG OffsetNext; + PVOID UsbdDeviceHandle; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; +} USBD_DEVICE_INFORMATION, *PUSBD_DEVICE_INFORMATION; + +typedef struct _USBD_PIPE_INFORMATION { + USHORT MaximumPacketSize; + UCHAR EndpointAddress; + UCHAR Interval; + USBD_PIPE_TYPE PipeType; + USBD_PIPE_HANDLE PipeHandle; + ULONG MaximumTransferSize; + ULONG PipeFlags; +} USBD_PIPE_INFORMATION, *PUSBD_PIPE_INFORMATION; + #define USBD_PF_CHANGE_MAX_PACKET 0x00000001 #define USBD_PF_SHORT_PACKET_OPT 0x00000002 #define USBD_PF_ENABLE_RT_THREAD_ACCESS 0x00000004 #define USBD_PF_MAP_ADD_TRANSFERS 0x00000008 #define USBD_PF_VALID_MASK (USBD_PF_CHANGE_MAX_PACKET | USBD_PF_SHORT_PACKET_OPT | \ USBD_PF_ENABLE_RT_THREAD_ACCESS | USBD_PF_MAP_ADD_TRANSFERS) + +typedef struct _USBD_INTERFACE_INFORMATION { + USHORT Length; + UCHAR InterfaceNumber; + UCHAR AlternateSetting; + UCHAR Class; + UCHAR SubClass; + UCHAR Protocol; + UCHAR Reserved; + USBD_INTERFACE_HANDLE InterfaceHandle; + ULONG NumberOfPipes; + USBD_PIPE_INFORMATION Pipes[1]; +} USBD_INTERFACE_INFORMATION, *PUSBD_INTERFACE_INFORMATION; + +struct _URB_HCD_AREA { + PVOID Reserved8[8]; +}; + +struct _URB_HEADER { + USHORT Length; + USHORT Function; + USBD_STATUS Status; + PVOID UsbdDeviceHandle; + ULONG UsbdFlags; +}; + +struct _URB_SELECT_INTERFACE { + struct _URB_HEADER Hdr; + USBD_CONFIGURATION_HANDLE ConfigurationHandle; + USBD_INTERFACE_INFORMATION Interface; +}; + +struct _URB_SELECT_CONFIGURATION { + struct _URB_HEADER Hdr; + PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; + USBD_CONFIGURATION_HANDLE ConfigurationHandle; + USBD_INTERFACE_INFORMATION Interface; +}; + +struct _URB_PIPE_REQUEST { + struct _URB_HEADER Hdr; + USBD_PIPE_HANDLE PipeHandle; + ULONG Reserved; +}; + +struct _URB_FRAME_LENGTH_CONTROL { + struct _URB_HEADER Hdr; +}; + +struct _URB_GET_FRAME_LENGTH { + struct _URB_HEADER Hdr; + ULONG FrameLength; + ULONG FrameNumber; +}; + +struct _URB_SET_FRAME_LENGTH { + struct _URB_HEADER Hdr; + LONG FrameLengthDelta; +}; + +struct _URB_GET_CURRENT_FRAME_NUMBER { + struct _URB_HEADER Hdr; + ULONG FrameNumber; +}; + +struct _URB_CONTROL_DESCRIPTOR_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved0; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + USHORT Reserved1; + UCHAR Index; + UCHAR DescriptorType; + USHORT LanguageId; + USHORT Reserved2; +}; + +struct _URB_CONTROL_GET_STATUS_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved0; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR Reserved1[4]; + USHORT Index; + USHORT Reserved2; +}; + +struct _URB_CONTROL_FEATURE_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved2; + ULONG Reserved3; + PVOID Reserved4; + PMDL Reserved5; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + USHORT Reserved0; + USHORT FeatureSelector; + USHORT Index; + USHORT Reserved1; +}; + +struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG TransferFlags; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR RequestTypeReservedBits; + UCHAR Request; + USHORT Value; + USHORT Index; + USHORT Reserved1; +}; + +struct _URB_CONTROL_GET_INTERFACE_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved0; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR Reserved1[4]; + USHORT Interface; + USHORT Reserved2; +}; + +struct _URB_CONTROL_GET_CONFIGURATION_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved0; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR Reserved1[8]; +}; + +#if (_WIN32_WINNT >= 0x0501) + #define OS_STRING_DESCRIPTOR_INDEX 0xEE #define MS_GENRE_DESCRIPTOR_INDEX 0x0001 #define MS_POWER_DESCRIPTOR_INDEX 0x0002 #define MS_OS_STRING_SIGNATURE L"MSFT100" -#define USBD_PIPE_DIRECTION_IN(pipeInformation) ((pipeInformation)->EndpointAddress & USB_ENDPOINT_DIRECTION_MASK) +#define MS_OS_FLAGS_CONTAINERID 0x02 -#endif /* __USB_H */ +typedef struct _OS_STRING { + UCHAR bLength; + UCHAR bDescriptorType; + WCHAR MicrosoftString[7]; + UCHAR bVendorCode; + union { + UCHAR bPad; + UCHAR bFlags; + }; +} OS_STRING, *POS_STRING; + +struct _URB_OS_FEATURE_DESCRIPTOR_REQUEST { + struct _URB_HEADER Hdr; + PVOID Reserved; + ULONG Reserved0; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR Recipient:5; + UCHAR Reserved1:3; + UCHAR Reserved2; + UCHAR InterfaceNumber; + UCHAR MS_PageIndex; + USHORT MS_FeatureDescriptorIndex; + USHORT Reserved3; +}; + +#endif + +struct _URB_CONTROL_TRANSFER { + struct _URB_HEADER Hdr; + USBD_PIPE_HANDLE PipeHandle; + ULONG TransferFlags; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + UCHAR SetupPacket[8]; +}; + +#if (_WIN32_WINNT >= 0x0600) + +struct _URB_CONTROL_TRANSFER_EX { + struct _URB_HEADER Hdr; + USBD_PIPE_HANDLE PipeHandle; + ULONG TransferFlags; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + ULONG Timeout; +#ifdef WIN64 + ULONG Pad; +#endif + struct _URB_HCD_AREA hca; + UCHAR SetupPacket[8]; +}; + +#endif + +struct _URB_BULK_OR_INTERRUPT_TRANSFER { + struct _URB_HEADER Hdr; + USBD_PIPE_HANDLE PipeHandle; + ULONG TransferFlags; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; +}; + +typedef struct _USBD_ISO_PACKET_DESCRIPTOR { + ULONG Offset; + ULONG Length; + USBD_STATUS Status; +} USBD_ISO_PACKET_DESCRIPTOR, *PUSBD_ISO_PACKET_DESCRIPTOR; + +struct _URB_ISOCH_TRANSFER { + struct _URB_HEADER Hdr; + USBD_PIPE_HANDLE PipeHandle; + ULONG TransferFlags; + ULONG TransferBufferLength; + PVOID TransferBuffer; + PMDL TransferBufferMDL; + struct _URB *UrbLink; + struct _URB_HCD_AREA hca; + ULONG StartFrame; + ULONG NumberOfPackets; + ULONG ErrorCount; + USBD_ISO_PACKET_DESCRIPTOR IsoPacket[1]; +}; + +typedef struct _URB { + __GNU_EXTENSION union { + struct _URB_HEADER UrbHeader; + struct _URB_SELECT_INTERFACE UrbSelectInterface; + struct _URB_SELECT_CONFIGURATION UrbSelectConfiguration; + struct _URB_PIPE_REQUEST UrbPipeRequest; + struct _URB_FRAME_LENGTH_CONTROL UrbFrameLengthControl; + struct _URB_GET_FRAME_LENGTH UrbGetFrameLength; + struct _URB_SET_FRAME_LENGTH UrbSetFrameLength; + struct _URB_GET_CURRENT_FRAME_NUMBER UrbGetCurrentFrameNumber; + struct _URB_CONTROL_TRANSFER UrbControlTransfer; +#if (_WIN32_WINNT >= 0x0600) + struct _URB_CONTROL_TRANSFER_EX UrbControlTransferEx; +#endif + struct _URB_BULK_OR_INTERRUPT_TRANSFER UrbBulkOrInterruptTransfer; + struct _URB_ISOCH_TRANSFER UrbIsochronousTransfer; + struct _URB_CONTROL_DESCRIPTOR_REQUEST UrbControlDescriptorRequest; + struct _URB_CONTROL_GET_STATUS_REQUEST UrbControlGetStatusRequest; + struct _URB_CONTROL_FEATURE_REQUEST UrbControlFeatureRequest; + struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST UrbControlVendorClassRequest; + struct _URB_CONTROL_GET_INTERFACE_REQUEST UrbControlGetInterfaceRequest; + struct _URB_CONTROL_GET_CONFIGURATION_REQUEST UrbControlGetConfigurationRequest; +#if (_WIN32_WINNT >= 0x0501) + struct _URB_OS_FEATURE_DESCRIPTOR_REQUEST UrbOSFeatureDescriptorRequest; +#endif + }; +} URB, *PURB; diff --git a/reactos/include/ddk/usb100.h b/reactos/include/psdk/usb100.h similarity index 71% rename from reactos/include/ddk/usb100.h rename to reactos/include/psdk/usb100.h index 16a474a2222..7e43d302268 100644 --- a/reactos/include/ddk/usb100.h +++ b/reactos/include/psdk/usb100.h @@ -20,45 +20,13 @@ * */ -#ifndef __USB100_H -#define __USB100_H +#pragma once #ifdef __cplusplus extern "C" { #endif -#define MAXIMUM_USB_STRING_LENGTH 255 - -#define USB_DEVICE_CLASS_RESERVED 0x00 -#define USB_DEVICE_CLASS_AUDIO 0x01 -#define USB_DEVICE_CLASS_COMMUNICATIONS 0x02 -#define USB_DEVICE_CLASS_HUMAN_INTERFACE 0x03 -#define USB_DEVICE_CLASS_MONITOR 0x04 -#define USB_DEVICE_CLASS_PHYSICAL_INTERFACE 0x05 -#define USB_DEVICE_CLASS_POWER 0x06 -#define USB_DEVICE_CLASS_PRINTER 0x07 -#define USB_DEVICE_CLASS_STORAGE 0x08 -#define USB_DEVICE_CLASS_HUB 0x09 -#define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF - -#define USB_RESERVED_DESCRIPTOR_TYPE 0x06 -#define USB_CONFIG_POWER_DESCRIPTOR_TYPE 0x07 -#define USB_INTERFACE_POWER_DESCRIPTOR_TYPE 0x08 - -#define USB_REQUEST_GET_STATUS 0x00 -#define USB_REQUEST_CLEAR_FEATURE 0x01 -#define USB_REQUEST_SET_FEATURE 0x03 -#define USB_REQUEST_SET_ADDRESS 0x05 -#define USB_REQUEST_GET_DESCRIPTOR 0x06 -#define USB_REQUEST_SET_DESCRIPTOR 0x07 -#define USB_REQUEST_GET_CONFIGURATION 0x08 -#define USB_REQUEST_SET_CONFIGURATION 0x09 -#define USB_REQUEST_GET_INTERFACE 0x0A -#define USB_REQUEST_SET_INTERFACE 0x0B -#define USB_REQUEST_SYNC_FRAME 0x0C - -#define USB_GETSTATUS_SELF_POWERED 0x01 -#define USB_GETSTATUS_REMOTE_WAKEUP_ENABLED 0x02 +#include #define BMREQUEST_HOST_TO_DEVICE 0 #define BMREQUEST_DEVICE_TO_HOST 1 @@ -72,61 +40,23 @@ extern "C" { #define BMREQUEST_TO_ENDPOINT 2 #define BMREQUEST_TO_OTHER 3 +#define MAXIMUM_USB_STRING_LENGTH 255 + +#define USB_GETSTATUS_SELF_POWERED 0x01 +#define USB_GETSTATUS_REMOTE_WAKEUP_ENABLED 0x02 + /* USB_COMMON_DESCRIPTOR.bDescriptorType constants */ #define USB_DEVICE_DESCRIPTOR_TYPE 0x01 #define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 #define USB_STRING_DESCRIPTOR_TYPE 0x03 #define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 #define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 - -typedef struct _USB_COMMON_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; -} USB_COMMON_DESCRIPTOR, *PUSB_COMMON_DESCRIPTOR; +#define USB_RESERVED_DESCRIPTOR_TYPE 0x06 +#define USB_CONFIG_POWER_DESCRIPTOR_TYPE 0x07 +#define USB_INTERFACE_POWER_DESCRIPTOR_TYPE 0x08 #define USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(d, i) ((USHORT)((USHORT)d << 8 | i)) -/* USB_CONFIGURATION_DESCRIPTOR.bmAttributes constants */ -#define USB_CONFIG_POWERED_MASK 0xc0 -#define USB_CONFIG_BUS_POWERED 0x80 -#define USB_CONFIG_SELF_POWERED 0x40 -#define USB_CONFIG_REMOTE_WAKEUP 0x20 - -#include -typedef struct _USB_CONFIGURATION_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; - USHORT wTotalLength; - UCHAR bNumInterfaces; - UCHAR bConfigurationValue; - UCHAR iConfiguration; - UCHAR bmAttributes; - UCHAR MaxPower; -} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; -#include - -typedef struct _USB_DEVICE_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; - USHORT bcdUSB; - UCHAR bDeviceClass; - UCHAR bDeviceSubClass; - UCHAR bDeviceProtocol; - UCHAR bMaxPacketSize0; - USHORT idVendor; - USHORT idProduct; - USHORT bcdDevice; - UCHAR iManufacturer; - UCHAR iProduct; - UCHAR iSerialNumber; - UCHAR bNumConfigurations; -} USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; - -#define USB_ENDPOINT_DIRECTION_MASK 0x80 - -#define USB_ENDPOINT_DIRECTION_OUT(x) (!((x) & USB_ENDPOINT_DIRECTION_MASK)) -#define USB_ENDPOINT_DIRECTION_IN(x) ((x) & USB_ENDPOINT_DIRECTION_MASK) - /* USB_ENDPOINT_DESCRIPTOR.bmAttributes constants */ #define USB_ENDPOINT_TYPE_MASK 0x03 #define USB_ENDPOINT_TYPE_CONTROL 0x00 @@ -134,49 +64,118 @@ typedef struct _USB_DEVICE_DESCRIPTOR { #define USB_ENDPOINT_TYPE_BULK 0x02 #define USB_ENDPOINT_TYPE_INTERRUPT 0x03 -#include -typedef struct _USB_ENDPOINT_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; - UCHAR bEndpointAddress; - UCHAR bmAttributes; - USHORT wMaxPacketSize; - UCHAR bInterval; -} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR; -#include +/* USB_CONFIGURATION_DESCRIPTOR.bmAttributes constants */ +#define USB_CONFIG_POWERED_MASK 0xc0 +#define USB_CONFIG_BUS_POWERED 0x80 +#define USB_CONFIG_SELF_POWERED 0x40 +#define USB_CONFIG_REMOTE_WAKEUP 0x20 + +#define USB_ENDPOINT_DIRECTION_MASK 0x80 + +#define USB_ENDPOINT_DIRECTION_OUT(x) (!((x) & USB_ENDPOINT_DIRECTION_MASK)) +#define USB_ENDPOINT_DIRECTION_IN(x) ((x) & USB_ENDPOINT_DIRECTION_MASK) + +#define USB_REQUEST_GET_STATUS 0x00 +#define USB_REQUEST_CLEAR_FEATURE 0x01 +#define USB_REQUEST_SET_FEATURE 0x03 +#define USB_REQUEST_SET_ADDRESS 0x05 +#define USB_REQUEST_GET_DESCRIPTOR 0x06 +#define USB_REQUEST_SET_DESCRIPTOR 0x07 +#define USB_REQUEST_GET_CONFIGURATION 0x08 +#define USB_REQUEST_SET_CONFIGURATION 0x09 +#define USB_REQUEST_GET_INTERFACE 0x0A +#define USB_REQUEST_SET_INTERFACE 0x0B +#define USB_REQUEST_SYNC_FRAME 0x0C + +#define USB_DEVICE_CLASS_RESERVED 0x00 +#define USB_DEVICE_CLASS_AUDIO 0x01 +#define USB_DEVICE_CLASS_COMMUNICATIONS 0x02 +#define USB_DEVICE_CLASS_HUMAN_INTERFACE 0x03 +#define USB_DEVICE_CLASS_MONITOR 0x04 +#define USB_DEVICE_CLASS_PHYSICAL_INTERFACE 0x05 +#define USB_DEVICE_CLASS_POWER 0x06 +#define USB_DEVICE_CLASS_PRINTER 0x07 +#define USB_DEVICE_CLASS_STORAGE 0x08 +#define USB_DEVICE_CLASS_HUB 0x09 +#define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF #define USB_FEATURE_ENDPOINT_STALL 0x0000 #define USB_FEATURE_REMOTE_WAKEUP 0x0001 +#define USB_FEATURE_INTERFACE_POWER_D0 0x0002 +#define USB_FEATURE_INTERFACE_POWER_D1 0x0003 +#define USB_FEATURE_INTERFACE_POWER_D2 0x0004 +#define USB_FEATURE_INTERFACE_POWER_D3 0x0005 + +typedef struct _USB_DEVICE_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + USHORT bcdUSB; + UCHAR bDeviceClass; + UCHAR bDeviceSubClass; + UCHAR bDeviceProtocol; + UCHAR bMaxPacketSize0; + USHORT idVendor; + USHORT idProduct; + USHORT bcdDevice; + UCHAR iManufacturer; + UCHAR iProduct; + UCHAR iSerialNumber; + UCHAR bNumConfigurations; +} USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; + +typedef struct _USB_ENDPOINT_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bEndpointAddress; + UCHAR bmAttributes; + USHORT wMaxPacketSize; + UCHAR bInterval; +} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR; + +typedef struct _USB_CONFIGURATION_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + USHORT wTotalLength; + UCHAR bNumInterfaces; + UCHAR bConfigurationValue; + UCHAR iConfiguration; + UCHAR bmAttributes; + UCHAR MaxPower; +} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; + typedef struct _USB_INTERFACE_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; - UCHAR bInterfaceNumber; - UCHAR bAlternateSetting; - UCHAR bNumEndpoints; - UCHAR bInterfaceClass; - UCHAR bInterfaceSubClass; - UCHAR bInterfaceProtocol; - UCHAR iInterface; + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bInterfaceNumber; + UCHAR bAlternateSetting; + UCHAR bNumEndpoints; + UCHAR bInterfaceClass; + UCHAR bInterfaceSubClass; + UCHAR bInterfaceProtocol; + UCHAR iInterface; } USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR; typedef struct _USB_STRING_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; - WCHAR bString[1]; + UCHAR bLength; + UCHAR bDescriptorType; + WCHAR bString[1]; } USB_STRING_DESCRIPTOR, *PUSB_STRING_DESCRIPTOR; -#include +typedef struct _USB_COMMON_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; +} USB_COMMON_DESCRIPTOR, *PUSB_COMMON_DESCRIPTOR; + typedef struct _USB_HUB_DESCRIPTOR { - UCHAR bDescriptorLength; - UCHAR bDescriptorType; - UCHAR bNumberOfPorts; - USHORT wHubCharacteristics; - UCHAR bPowerOnToPowerGood; - UCHAR bHubControlCurrent; - UCHAR bRemoveAndPowerMask[64]; + UCHAR bDescriptorLength; + UCHAR bDescriptorType; + UCHAR bNumberOfPorts; + USHORT wHubCharacteristics; + UCHAR bPowerOnToPowerGood; + UCHAR bHubControlCurrent; + UCHAR bRemoveAndPowerMask[64]; } USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR; -#include #define USB_SUPPORT_D0_COMMAND 0x01 #define USB_SUPPORT_D1_COMMAND 0x02 @@ -187,45 +186,38 @@ typedef struct _USB_HUB_DESCRIPTOR { #define USB_SUPPORT_D2_WAKEUP 0x20 typedef struct _USB_CONFIGURATION_POWER_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; - UCHAR SelfPowerConsumedD0[3]; - UCHAR bPowerSummaryId; - UCHAR bBusPowerSavingD1; - UCHAR bSelfPowerSavingD1; - UCHAR bBusPowerSavingD2; - UCHAR bSelfPowerSavingD2; - UCHAR bBusPowerSavingD3; - UCHAR bSelfPowerSavingD3; - USHORT TransitionTimeFromD1; - USHORT TransitionTimeFromD2; - USHORT TransitionTimeFromD3; + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR SelfPowerConsumedD0[3]; + UCHAR bPowerSummaryId; + UCHAR bBusPowerSavingD1; + UCHAR bSelfPowerSavingD1; + UCHAR bBusPowerSavingD2; + UCHAR bSelfPowerSavingD2; + UCHAR bBusPowerSavingD3; + UCHAR bSelfPowerSavingD3; + USHORT TransitionTimeFromD1; + USHORT TransitionTimeFromD2; + USHORT TransitionTimeFromD3; } USB_CONFIGURATION_POWER_DESCRIPTOR, *PUSB_CONFIGURATION_POWER_DESCRIPTOR; -#define USB_FEATURE_INTERFACE_POWER_D0 0x0002 -#define USB_FEATURE_INTERFACE_POWER_D1 0x0003 -#define USB_FEATURE_INTERFACE_POWER_D2 0x0004 -#define USB_FEATURE_INTERFACE_POWER_D3 0x0005 - -#include typedef struct _USB_INTERFACE_POWER_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; - UCHAR bmCapabilitiesFlags; - UCHAR bBusPowerSavingD1; - UCHAR bSelfPowerSavingD1; - UCHAR bBusPowerSavingD2; - UCHAR bSelfPowerSavingD2; - UCHAR bBusPowerSavingD3; - UCHAR bSelfPowerSavingD3; - USHORT TransitionTimeFromD1; - USHORT TransitionTimeFromD2; - USHORT TransitionTimeFromD3; + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bmCapabilitiesFlags; + UCHAR bBusPowerSavingD1; + UCHAR bSelfPowerSavingD1; + UCHAR bBusPowerSavingD2; + UCHAR bSelfPowerSavingD2; + UCHAR bBusPowerSavingD3; + UCHAR bSelfPowerSavingD3; + USHORT TransitionTimeFromD1; + USHORT TransitionTimeFromD2; + USHORT TransitionTimeFromD3; } USB_INTERFACE_POWER_DESCRIPTOR, *PUSB_INTERFACE_POWER_DESCRIPTOR; + #include #ifdef __cplusplus } #endif - -#endif /* __USB100_H */ diff --git a/reactos/include/psdk/usb200.h b/reactos/include/psdk/usb200.h new file mode 100644 index 00000000000..ad021d165fa --- /dev/null +++ b/reactos/include/psdk/usb200.h @@ -0,0 +1,106 @@ +#pragma once + +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + +#include "usb100.h" + +#include + +typedef enum _USB_DEVICE_TYPE { + Usb11Device = 0, + Usb20Device +} USB_DEVICE_TYPE; + +typedef enum _USB_DEVICE_SPEED { + UsbLowSpeed = 0, + UsbFullSpeed, + UsbHighSpeed +} USB_DEVICE_SPEED; + +#define USB_PORT_STATUS_CONNECT 0x0001 +#define USB_PORT_STATUS_ENABLE 0x0002 +#define USB_PORT_STATUS_SUSPEND 0x0004 +#define USB_PORT_STATUS_OVER_CURRENT 0x0008 +#define USB_PORT_STATUS_RESET 0x0010 +#define USB_PORT_STATUS_POWER 0x0100 +#define USB_PORT_STATUS_LOW_SPEED 0x0200 +#define USB_PORT_STATUS_HIGH_SPEED 0x0400 + + +typedef union _BM_REQUEST_TYPE { + struct _BM { + UCHAR Recipient:2; + UCHAR Reserved:3; + UCHAR Type:2; + UCHAR Dir:1; + } _BM; + UCHAR B; +} BM_REQUEST_TYPE, *PBM_REQUEST_TYPE; + +typedef struct _USB_DEFAULT_PIPE_SETUP_PACKET { + BM_REQUEST_TYPE bmRequestType; + UCHAR bRequest; + union _wValue { + __GNU_EXTENSION struct { + UCHAR LowByte; + UCHAR HiByte; + }; + USHORT W; + } wValue; + union _wIndex { + __GNU_EXTENSION struct { + UCHAR LowByte; + UCHAR HiByte; + }; + USHORT W; + } wIndex; + USHORT wLength; +} USB_DEFAULT_PIPE_SETUP_PACKET, *PUSB_DEFAULT_PIPE_SETUP_PACKET; + +C_ASSERT(sizeof(USB_DEFAULT_PIPE_SETUP_PACKET) == 8); + +#define USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE 0x06 +#define USB_OTHER_SPEED_CONFIGURATION_DESCRIPTOR_TYPE 0x07 + +typedef struct _USB_DEVICE_QUALIFIER_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + USHORT bcdUSB; + UCHAR bDeviceClass; + UCHAR bDeviceSubClass; + UCHAR bDeviceProtocol; + UCHAR bMaxPacketSize0; + UCHAR bNumConfigurations; + UCHAR bReserved; +} USB_DEVICE_QUALIFIER_DESCRIPTOR, *PUSB_DEVICE_QUALIFIER_DESCRIPTOR; + +typedef union _USB_HIGH_SPEED_MAXPACKET { + struct _MP { + USHORT MaxPacket:11; + USHORT HSmux:2; + USHORT Reserved:3; + } _MP; + USHORT us; +} USB_HIGH_SPEED_MAXPACKET, *PUSB_HIGH_SPEED_MAXPACKET; + +#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE 0x0B + +typedef struct _USB_INTERFACE_ASSOCIATION_DESCRIPTOR { + UCHAR bLength; + UCHAR bDescriptorType; + UCHAR bFirstInterface; + UCHAR bInterfaceCount; + UCHAR bFunctionClass; + UCHAR bFunctionSubClass; + UCHAR bFunctionProtocol; + UCHAR iFunction; +} USB_INTERFACE_ASSOCIATION_DESCRIPTOR, *PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR; + +#include diff --git a/reactos/include/psdk/usbcamdi.h b/reactos/include/psdk/usbcamdi.h new file mode 100644 index 00000000000..31d77733ab4 --- /dev/null +++ b/reactos/include/psdk/usbcamdi.h @@ -0,0 +1,384 @@ +/* + * usbcamdi.h + * + * USB Camera driver interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_BATTERYCLASS_) + #define USBCAMAPI +#else + #define USBCAMAPI DECLSPEC_IMPORT +#endif + +typedef struct _pipe_config_descriptor { + CHAR StreamAssociation; + UCHAR PipeConfigFlags; +} USBCAMD_Pipe_Config_Descriptor, *PUSBCAMD_Pipe_Config_Descriptor; + +#define USBCAMD_DATA_PIPE 0x0001 +#define USBCAMD_MULTIPLEX_PIPE 0x0002 +#define USBCAMD_SYNC_PIPE 0x0004 +#define USBCAMD_DONT_CARE_PIPE 0x0008 + +#define USBCAMD_VIDEO_STREAM 0x1 +#define USBCAMD_STILL_STREAM 0x2 +#define USBCAMD_VIDEO_STILL_STREAM (USBCAMD_VIDEO_STREAM | USBCAMD_STILL_STREAM) + +#define USBCAMD_PROCESSPACKETEX_DropFrame 0x0002 +#define USBCAMD_PROCESSPACKETEX_NextFrameIsStill 0x0004 +#define USBCAMD_PROCESSPACKETEX_CurrentFrameIsStill 0x0008 + +#define USBCAMD_STOP_STREAM 0x00000001 +#define USBCAMD_START_STREAM 0x00000000 + +typedef enum { + USBCAMD_CamControlFlag_NoVideoRawProcessing = 1, + USBCAMD_CamControlFlag_NoStillRawProcessing = 2, + USBCAMD_CamControlFlag_AssociatedFormat = 4, + USBCAMD_CamControlFlag_EnableDeviceEvents = 8 +} USBCAMD_CamControlFlags; + +typedef NTSTATUS +(NTAPI *PCOMMAND_COMPLETE_FUNCTION)( + IN PVOID DeviceContext, + IN OUT PVOID CommandContext, + IN NTSTATUS NtStatus); + +typedef VOID +(NTAPI *PSTREAM_RECEIVE_PACKET)( + IN PVOID Srb, + IN PVOID DeviceContext, + IN PBOOLEAN Completed); + +typedef NTSTATUS +(NTAPI *PCAM_INITIALIZE_ROUTINE)( + PDEVICE_OBJECT BusDeviceObject, + PVOID DeviceContext); + +typedef NTSTATUS +(NTAPI *PCAM_CONFIGURE_ROUTINE)( + IN PDEVICE_OBJECT BusDeviceObject, + IN PVOID DeviceContext, + IN PUSBD_INTERFACE_INFORMATION Interface, + IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + IN PLONG DataPipeIndex, + IN PLONG SyncPipeIndex); + +typedef NTSTATUS +(NTAPI *PCAM_CONFIGURE_ROUTINE_EX)( + IN PDEVICE_OBJECT BusDeviceObject, + IN PVOID DeviceContext, + IN PUSBD_INTERFACE_INFORMATION Interface, + IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + IN ULONG PipeConfigListSize, + IN PUSBCAMD_Pipe_Config_Descriptor PipeConfig, + IN PUSB_DEVICE_DESCRIPTOR DeviceDescriptor); + +typedef NTSTATUS +(NTAPI *PCAM_START_CAPTURE_ROUTINE)( + IN PDEVICE_OBJECT BusDeviceObject, + IN PVOID DeviceContext); + +typedef NTSTATUS +(NTAPI *PCAM_START_CAPTURE_ROUTINE_EX)( + IN PDEVICE_OBJECT BusDeviceObject, + IN PVOID DeviceContext, + IN ULONG StreamNumber); + +typedef NTSTATUS +(NTAPI *PCAM_ALLOCATE_BW_ROUTINE)( + IN PDEVICE_OBJECT BusDeviceObject, + IN PVOID DeviceContext, + IN PULONG RawFrameLength, + IN PVOID Format); + +typedef NTSTATUS +(NTAPI *PCAM_ALLOCATE_BW_ROUTINE_EX)( + IN PDEVICE_OBJECT BusDeviceObject, + IN PVOID DeviceContext, + IN PULONG RawFrameLength, + IN PVOID Format, + IN ULONG StreamNumber); + +typedef NTSTATUS +(NTAPI *PCAM_FREE_BW_ROUTINE)( + IN PDEVICE_OBJECT BusDeviceObject, + IN PVOID DeviceContext); + +typedef NTSTATUS +(NTAPI *PCAM_FREE_BW_ROUTINE_EX)( + IN PDEVICE_OBJECT BusDeviceObject, + IN PVOID DeviceContext, + IN ULONG StreamNumber); + +typedef VOID +(NTAPI *PADAPTER_RECEIVE_PACKET_ROUTINE)( + IN OUT PHW_STREAM_REQUEST_BLOCK Srb); + +typedef NTSTATUS +(NTAPI *PCAM_STOP_CAPTURE_ROUTINE)( + IN PDEVICE_OBJECT BusDeviceObject, + IN PVOID DeviceContext); + +typedef NTSTATUS +(NTAPI *PCAM_STOP_CAPTURE_ROUTINE_EX)( + IN PDEVICE_OBJECT BusDeviceObject, + IN PVOID DeviceContext, + IN ULONG StreamNumber); + +typedef ULONG +(NTAPI *PCAM_PROCESS_PACKET_ROUTINE)( + IN PDEVICE_OBJECT BusDeviceObject, + IN PVOID DeviceContext, + IN PVOID CurrentFrameContext, + IN PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket OPTIONAL, + IN PVOID SyncBuffer OPTIONAL, + IN PUSBD_ISO_PACKET_DESCRIPTOR DataPacket OPTIONAL, + IN OUT PVOID DataBuffer, + OUT PBOOLEAN FrameComplete, + OUT PBOOLEAN NextFrameIsStill); + +typedef ULONG +(NTAPI *PCAM_PROCESS_PACKET_ROUTINE_EX)( + IN PDEVICE_OBJECT BusDeviceObject, + IN PVOID DeviceContext, + IN PVOID CurrentFrameContext, + IN PUSBD_ISO_PACKET_DESCRIPTOR SyncPacket OPTIONAL, + IN PVOID SyncBuffer OPTIONAL, + IN PUSBD_ISO_PACKET_DESCRIPTOR DataPacket OPTIONAL, + IN OUT PVOID DataBuffer, + OUT PBOOLEAN FrameComplete, + OUT PULONG PacketFlag, + OUT PULONG ValidDataOffset); + +typedef VOID +(NTAPI *PCAM_NEW_FRAME_ROUTINE)( + IN PVOID DeviceContext, + IN PVOID FrameContext); + +typedef VOID +(NTAPI *PCAM_NEW_FRAME_ROUTINE_EX)( + IN PVOID DeviceContext, + IN PVOID FrameContext, + IN ULONG StreamNumber, + OUT PULONG FrameLength); + +typedef NTSTATUS +(NTAPI *PCAM_PROCESS_RAW_FRAME_ROUTINE)( + IN PDEVICE_OBJECT BusDeviceObject, + IN PVOID DeviceContext, + IN PVOID FrameContext, + IN PVOID FrameBuffer, + IN ULONG FrameLength, + OUT PVOID RawFrameBuffer, + IN ULONG RawFrameLength, + IN ULONG NumberOfPackets, + OUT PULONG BytesReturned); + +typedef NTSTATUS +(NTAPI *PCAM_PROCESS_RAW_FRAME_ROUTINE_EX)( + IN PDEVICE_OBJECT BusDeviceObject, + IN PVOID DeviceContext, + IN PVOID FrameContext, + IN PVOID FrameBuffer, + IN ULONG FrameLength, + OUT PVOID RawFrameBuffer, + IN ULONG RawFrameLength, + IN ULONG NumberOfPackets, + OUT PULONG BytesReturned, + IN ULONG ActualRawFrameLength, + IN ULONG StreamNumber); + +typedef NTSTATUS +(NTAPI *PCAM_STATE_ROUTINE)( + IN PDEVICE_OBJECT BusDeviceObject, + IN PVOID DeviceContext); + +#if defined(DEBUG_LOG) + +USBCAMAPI +VOID +NTAPI +USBCAMD_Debug_LogEntry( + IN CHAR *Name, + IN ULONG Info1, + IN ULONG Info2, + IN ULONG Info3); + +#define ILOGENTRY(sig, info1, info2, info3) \ + USBCAMD_Debug_LogEntry(sig, (ULONG)info1, (ULONG)info2, (ULONG)info3) + +#else + +#define ILOGENTRY(sig, info1, info2, info3) + +#endif /* DEBUG_LOG */ + +typedef struct _USBCAMD_DEVICE_DATA { + ULONG Sig; + PCAM_INITIALIZE_ROUTINE CamInitialize; + PCAM_INITIALIZE_ROUTINE CamUnInitialize; + PCAM_PROCESS_PACKET_ROUTINE CamProcessUSBPacket; + PCAM_NEW_FRAME_ROUTINE CamNewVideoFrame; + PCAM_PROCESS_RAW_FRAME_ROUTINE CamProcessRawVideoFrame; + PCAM_START_CAPTURE_ROUTINE CamStartCapture; + PCAM_STOP_CAPTURE_ROUTINE CamStopCapture; + PCAM_CONFIGURE_ROUTINE CamConfigure; + PCAM_STATE_ROUTINE CamSaveState; + PCAM_STATE_ROUTINE CamRestoreState; + PCAM_ALLOCATE_BW_ROUTINE CamAllocateBandwidth; + PCAM_FREE_BW_ROUTINE CamFreeBandwidth; +} USBCAMD_DEVICE_DATA, *PUSBCAMD_DEVICE_DATA; + +typedef struct _USBCAMD_DEVICE_DATA2 { + ULONG Sig; + PCAM_INITIALIZE_ROUTINE CamInitialize; + PCAM_INITIALIZE_ROUTINE CamUnInitialize; + PCAM_PROCESS_PACKET_ROUTINE_EX CamProcessUSBPacketEx; + PCAM_NEW_FRAME_ROUTINE_EX CamNewVideoFrameEx; + PCAM_PROCESS_RAW_FRAME_ROUTINE_EX CamProcessRawVideoFrameEx; + PCAM_START_CAPTURE_ROUTINE_EX CamStartCaptureEx; + PCAM_STOP_CAPTURE_ROUTINE_EX CamStopCaptureEx; + PCAM_CONFIGURE_ROUTINE_EX CamConfigureEx; + PCAM_STATE_ROUTINE CamSaveState; + PCAM_STATE_ROUTINE CamRestoreState; + PCAM_ALLOCATE_BW_ROUTINE_EX CamAllocateBandwidthEx; + PCAM_FREE_BW_ROUTINE_EX CamFreeBandwidthEx; +} USBCAMD_DEVICE_DATA2, *PUSBCAMD_DEVICE_DATA2; + +DEFINE_GUID(GUID_USBCAMD_INTERFACE, + 0x2bcb75c0, 0xb27f, 0x11d1, 0xba, 0x41, 0x0, 0xa0, 0xc9, 0xd, 0x2b, 0x5); + +typedef NTSTATUS +(NTAPI *PFNUSBCAMD_SetVideoFormat)( + IN PVOID DeviceContext, + IN PHW_STREAM_REQUEST_BLOCK pSrb); + +typedef NTSTATUS +(NTAPI *PFNUSBCAMD_WaitOnDeviceEvent)( + IN PVOID DeviceContext, + IN ULONG PipeIndex, + IN PVOID Buffer, + IN ULONG BufferLength, + IN PCOMMAND_COMPLETE_FUNCTION EventComplete, + IN PVOID EventContext, + IN BOOLEAN LoopBack); + +typedef NTSTATUS +(NTAPI *PFNUSBCAMD_CancelBulkReadWrite)( + IN PVOID DeviceContext, + IN ULONG PipeIndex); + +typedef NTSTATUS +(NTAPI *PFNUSBCAMD_SetIsoPipeState)( + IN PVOID DeviceContext, + IN ULONG PipeStateFlags); + +typedef NTSTATUS +(NTAPI *PFNUSBCAMD_BulkReadWrite)( + IN PVOID DeviceContext, + IN USHORT PipeIndex, + IN PVOID Buffer, + IN ULONG BufferLength, + IN PCOMMAND_COMPLETE_FUNCTION CommandComplete, + IN PVOID CommandContext); + +#define USBCAMD_VERSION_200 0x200 + +typedef struct _USBCAMD_INTERFACE { + INTERFACE Interface; + PFNUSBCAMD_WaitOnDeviceEvent USBCAMD_WaitOnDeviceEvent; + PFNUSBCAMD_BulkReadWrite USBCAMD_BulkReadWrite; + PFNUSBCAMD_SetVideoFormat USBCAMD_SetVideoFormat; + PFNUSBCAMD_SetIsoPipeState USBCAMD_SetIsoPipeState; + PFNUSBCAMD_CancelBulkReadWrite USBCAMD_CancelBulkReadWrite; +} USBCAMD_INTERFACE, *PUSBCAMD_INTERFACE; + +/* FIXME : Do we need USBCAMAPI here ? */ + +USBCAMAPI +ULONG +NTAPI +USBCAMD_DriverEntry( + IN PVOID Context1, + IN PVOID Context2, + IN ULONG DeviceContextSize, + IN ULONG FrameContextSize, + IN PADAPTER_RECEIVE_PACKET_ROUTINE ReceivePacket); + +USBCAMAPI +PVOID +NTAPI +USBCAMD_AdapterReceivePacket( + IN PHW_STREAM_REQUEST_BLOCK Srb, + IN PUSBCAMD_DEVICE_DATA DeviceData, + IN PDEVICE_OBJECT *DeviceObject, + IN BOOLEAN NeedsCompletion); + +USBCAMAPI +NTSTATUS +NTAPI +USBCAMD_ControlVendorCommand( + IN PVOID DeviceContext, + IN UCHAR Request, + IN USHORT Value, + IN USHORT Index, + IN OUT PVOID Buffer, + IN OUT PULONG BufferLength, + IN BOOLEAN GetData, + IN PCOMMAND_COMPLETE_FUNCTION CommandComplete OPTIONAL, + IN PVOID CommandContext OPTIONAL); + +USBCAMAPI +NTSTATUS +NTAPI +USBCAMD_SelectAlternateInterface( + IN PVOID DeviceContext, + IN OUT PUSBD_INTERFACE_INFORMATION RequestInterface); + +USBCAMAPI +NTSTATUS +NTAPI +USBCAMD_GetRegistryKeyValue( + IN HANDLE Handle, + IN PWCHAR KeyNameString, + IN ULONG KeyNameStringLength, + IN PVOID Data, + IN ULONG DataLength); + +USBCAMAPI +ULONG +NTAPI +USBCAMD_InitializeNewInterface( + IN PVOID DeviceContext, + IN PVOID DeviceData, + IN ULONG Version, + IN ULONG CamControlFlag); + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(__USB_H) && !defined(__USBDI_H) */ diff --git a/reactos/include/psdk/usbdi.h b/reactos/include/psdk/usbdi.h new file mode 100644 index 00000000000..014b0299a2f --- /dev/null +++ b/reactos/include/psdk/usbdi.h @@ -0,0 +1,79 @@ +/* + * usbdi.h + * + * USBD and USB device driver definitions + * + * FIXME : Obsolete header.. Use usb.h instead. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#pragma once + +/* Helper macro to enable gcc's extension. */ +#ifndef __GNU_EXTENSION +#ifdef __GNUC__ +#define __GNU_EXTENSION __extension__ +#else +#define __GNU_EXTENSION +#endif +#endif + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define USBD_STATUS_CANCELLING ((USBD_STATUS)0x00020000L) +#define USBD_STATUS_CANCELING ((USBD_STATUS)0x00020000L) +#define USBD_STATUS_NO_MEMORY ((USBD_STATUS)0x80000100L) +#define USBD_STATUS_ERROR ((USBD_STATUS)0x80000000L) +#define USBD_STATUS_REQUEST_FAILED ((USBD_STATUS)0x80000500L) +#define USBD_STATUS_HALTED ((USBD_STATUS)0xC0000000L) + + +#define USBD_HALTED(Status) ((ULONG)(Status) >> 30 == 3) +#define USBD_STATUS(Status) ((ULONG)(Status) & 0x0FFFFFFFL) + +#define URB_FUNCTION_RESERVED0 0x0016 +#define URB_FUNCTION_RESERVED 0x001D +#define URB_FUNCTION_LAST 0x0029 + +#define USBD_PF_DOUBLE_BUFFER 0x00000002 + +#ifdef USBD_PF_VALID_MASK +#undef USBD_PF_VALID_MASK +#endif + +#define USBD_PF_VALID_MASK (USBD_PF_CHANGE_MAX_PACKET | USBD_PF_DOUBLE_BUFFER | \ + USBD_PF_ENABLE_RT_THREAD_ACCESS | USBD_PF_MAP_ADD_TRANSFERS) + +#define USBD_TRANSFER_DIRECTION_BIT 0 +#define USBD_SHORT_TRANSFER_OK_BIT 1 +#define USBD_START_ISO_TRANSFER_ASAP_BIT 2 + +#ifdef USBD_TRANSFER_DIRECTION +#undef USBD_TRANSFER_DIRECTION +#endif + +#define USBD_TRANSFER_DIRECTION(x) ((x) & USBD_TRANSFER_DIRECTION_IN) + +#ifdef __cplusplus +} +#endif diff --git a/reactos/include/psdk/usbioctl.h b/reactos/include/psdk/usbioctl.h new file mode 100644 index 00000000000..69541cb0052 --- /dev/null +++ b/reactos/include/psdk/usbioctl.h @@ -0,0 +1,670 @@ +/* + * usbioctl.h + * + * USB IOCTL interface. + * + * This file is part of the w32api package. + * + * Contributors: + * Created by Casper S. Hornstrup + * + * THIS SOFTWARE IS NOT COPYRIGHTED + * + * This source code is offered for use in the public domain. You may + * use, modify or distribute it freely. + * + * This code is distributed in the hope that it will be useful but + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + * DISCLAIMED. This includes but is not limited to warranties of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#pragma once + +#include "usb100.h" +#include "usbiodef.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define IOCTL_INTERNAL_USB_SUBMIT_URB \ + CTL_CODE(FILE_DEVICE_USB, USB_SUBMIT_URB, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_RESET_PORT \ + CTL_CODE(FILE_DEVICE_USB, USB_RESET_PORT, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_ROOTHUB_PDO, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define USBD_PORT_ENABLED 1 +#define USBD_PORT_CONNECTED 2 + +#define IOCTL_INTERNAL_USB_GET_PORT_STATUS \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_PORT_STATUS, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_ENABLE_PORT \ + CTL_CODE(FILE_DEVICE_USB, USB_ENABLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_HUB_COUNT \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_COUNT, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_CYCLE_PORT \ + CTL_CODE(FILE_DEVICE_USB, USB_CYCLE_PORT, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_HUB_NAME \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_BUS_INFO \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_BUS_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_CONTROLLER_NAME \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_CONTROLLER_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_BUSGUID_INFO \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_BUSGUID_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_PARENT_HUB_INFO \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_PARENT_HUB_INFO, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#if (_WIN32_WINNT >= 0x0501) + +#define IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION \ + CTL_CODE(FILE_DEVICE_USB, USB_IDLE_NOTIFICATION, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS) + +#endif + +#if (_WIN32_WINNT >= 0x0600) + +#define IOCTL_INTERNAL_USB_NOTIFY_IDLE_READY \ + CTL_CODE(FILE_DEVICE_USB, USB_IDLE_NOTIFICATION_EX, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_REQ_GLOBAL_SUSPEND \ + CTL_CODE(FILE_DEVICE_USB, USB_REQ_GLOBAL_SUSPEND, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_REQ_GLOBAL_RESUME \ + CTL_CODE(FILE_DEVICE_USB, USB_REQ_GLOBAL_RESUME, METHOD_NEITHER, FILE_ANY_ACCESS) + +#ifdef USB20_API +typedef struct _USB_START_FAILDATA { + ULONG LengthInBytes; + NTSTATUS NtStatus; + USBD_STATUS UsbdStatus; + ULONG ConnectStatus; + UCHAR DriverData[4]; +} USB_START_FAILDATA, *PUSB_START_FAILDATA; +#endif + +#define IOCTL_INTERNAL_USB_RECORD_FAILURE \ + CTL_CODE(FILE_DEVICE_USB, USB_RECORD_FAILURE, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE_EX \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_DEVICE_HANDLE_EX, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_TT_DEVICE_HANDLE \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_TT_DEVICE_HANDLE, METHOD_NEITHER, FILE_ANY_ACCESS) + +typedef struct _USB_TOPOLOGY_ADDRESS { + ULONG PciBusNumber; + ULONG PciDeviceNumber; + ULONG PciFunctionNumber; + ULONG Reserved; + USHORT RootHubPortNumber; + USHORT HubPortNumber[5]; + USHORT Reserved2; +} USB_TOPOLOGY_ADDRESS, *PUSB_TOPOLOGY_ADDRESS; + +#define IOCTL_INTERNAL_USB_GET_TOPOLOGY_ADDRESS \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_TOPOLOGY_ADDRESS, METHOD_NEITHER, FILE_ANY_ACCESS) + +#define IOCTL_INTERNAL_USB_GET_DEVICE_CONFIG_INFO \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CONFIG_INFO, METHOD_NEITHER, FILE_ANY_ACCESS) + +#endif + +#ifndef USB_KERNEL_IOCTL + +#define IOCTL_USB_HCD_GET_STATS_1 \ + CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_1, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_HCD_GET_STATS_2 \ + CTL_CODE(FILE_DEVICE_USB, HCD_GET_STATS_2, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_HCD_DISABLE_PORT \ + CTL_CODE(FILE_DEVICE_USB, HCD_DISABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_HCD_ENABLE_PORT \ + CTL_CODE(FILE_DEVICE_USB, HCD_ENABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_HCD_DISABLE_PORT \ + CTL_CODE(FILE_DEVICE_USB, HCD_DISABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_HCD_ENABLE_PORT \ + CTL_CODE(FILE_DEVICE_USB, HCD_ENABLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#ifndef IOCTL_USB_DIAGNOSTIC_MODE_OFF +#define IOCTL_USB_DIAGNOSTIC_MODE_OFF \ + CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS) +#endif + +#ifndef IOCTL_USB_DIAGNOSTIC_MODE_ON +#define IOCTL_USB_DIAGNOSTIC_MODE_ON \ + CTL_CODE(FILE_DEVICE_USB, HCD_DIAGNOSTIC_MODE_ON, METHOD_BUFFERED, FILE_ANY_ACCESS) +#endif + +#ifndef IOCTL_USB_GET_ROOT_HUB_NAME +#define IOCTL_USB_GET_ROOT_HUB_NAME \ + CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) +#endif + +#ifndef IOCTL_GET_HCD_DRIVERKEY_NAME +#define IOCTL_GET_HCD_DRIVERKEY_NAME \ + CTL_CODE(FILE_DEVICE_USB, HCD_GET_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) +#endif + +#define IOCTL_USB_GET_NODE_INFORMATION \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_NAME \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_DIAG_IGNORE_HUBS_ON \ + CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_ON, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_DIAG_IGNORE_HUBS_OFF \ + CTL_CODE(FILE_DEVICE_USB, USB_DIAG_IGNORE_HUBS_OFF, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_DRIVERKEY_NAME \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_DRIVERKEY_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#if (_WIN32_WINNT >= 0x0501) + +#define IOCTL_USB_GET_HUB_CAPABILITIES \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_HUB_CYCLE_PORT \ + CTL_CODE(FILE_DEVICE_USB, USB_HUB_CYCLE_PORT, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#endif + +#if (_WIN32_WINNT >= 0x0600) + +#define IOCTL_USB_RESET_HUB \ + CTL_CODE(FILE_DEVICE_USB, USB_RESET_HUB, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_USB_GET_HUB_CAPABILITIES_EX \ + CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#endif + +#include + +typedef enum _USB_HUB_NODE { + UsbHub, + UsbMIParent +} USB_HUB_NODE; + +typedef struct _USB_HUB_INFORMATION { + USB_HUB_DESCRIPTOR HubDescriptor; + BOOLEAN HubIsBusPowered; +} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION; + +typedef struct _USB_MI_PARENT_INFORMATION { + ULONG NumberOfInterfaces; +} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION; + +typedef struct _USB_NODE_INFORMATION { + USB_HUB_NODE NodeType; + union { + USB_HUB_INFORMATION HubInformation; + USB_MI_PARENT_INFORMATION MiParentInformation; + } u; +} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION; + +typedef struct _USB_PIPE_INFO { + USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; + ULONG ScheduleOffset; +} USB_PIPE_INFO, *PUSB_PIPE_INFO; + +#if (_WIN32_WINNT >= 0x0600) + +typedef enum _USB_CONNECTION_STATUS { + NoDeviceConnected, + DeviceConnected, + DeviceFailedEnumeration, + DeviceGeneralFailure, + DeviceCausedOvercurrent, + DeviceNotEnoughPower, + DeviceNotEnoughBandwidth, + DeviceHubNestedTooDeeply, + DeviceInLegacyHub, + DeviceEnumerating, + DeviceReset +} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; + +#elif (_WIN32_WINNT >= 0x0501) + +typedef enum _USB_CONNECTION_STATUS { + NoDeviceConnected, + DeviceConnected, + DeviceFailedEnumeration, + DeviceGeneralFailure, + DeviceCausedOvercurrent, + DeviceNotEnoughPower, + DeviceNotEnoughBandwidth, + DeviceHubNestedTooDeeply, + DeviceInLegacyHub +} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; + +#else + +typedef enum _USB_CONNECTION_STATUS { + NoDeviceConnected, + DeviceConnected, + DeviceFailedEnumeration, + DeviceGeneralFailure, + DeviceCausedOvercurrent, + DeviceNotEnoughPower, + DeviceNotEnoughBandwidth +} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; + +#endif + +typedef struct _USB_NODE_CONNECTION_INFORMATION { + ULONG ConnectionIndex; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; + UCHAR CurrentConfigurationValue; + BOOLEAN LowSpeed; + BOOLEAN DeviceIsHub; + USHORT DeviceAddress; + ULONG NumberOfOpenPipes; + USB_CONNECTION_STATUS ConnectionStatus; + USB_PIPE_INFO PipeList[0]; +} USB_NODE_CONNECTION_INFORMATION, *PUSB_NODE_CONNECTION_INFORMATION; + +typedef struct _USB_NODE_CONNECTION_DRIVERKEY_NAME { + ULONG ConnectionIndex; + ULONG ActualLength; + WCHAR DriverKeyName[1]; +} USB_NODE_CONNECTION_DRIVERKEY_NAME, *PUSB_NODE_CONNECTION_DRIVERKEY_NAME; + +typedef struct _USB_NODE_CONNECTION_NAME { + ULONG ConnectionIndex; + ULONG ActualLength; + WCHAR NodeName[1]; +} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME; + +typedef struct _USB_HUB_NAME { + ULONG ActualLength; + WCHAR HubName[1]; +} USB_HUB_NAME, *PUSB_HUB_NAME; + +typedef struct _USB_ROOT_HUB_NAME { + ULONG ActualLength; + WCHAR RootHubName[1]; +} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME; + +typedef struct _USB_HCD_DRIVERKEY_NAME { + ULONG ActualLength; + WCHAR DriverKeyName[1]; +} USB_HCD_DRIVERKEY_NAME, *PUSB_HCD_DRIVERKEY_NAME; + +typedef struct _USB_DESCRIPTOR_REQUEST { + ULONG ConnectionIndex; + struct { + UCHAR bmRequest; + UCHAR bRequest; + USHORT wValue; + USHORT wIndex; + USHORT wLength; + } SetupPacket; + UCHAR Data[0]; +} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST; + +#if (_WIN32_WINNT >= 0x0501) + +typedef struct _USB_HUB_CAPABILITIES { + ULONG HubIs2xCapable:1; +} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES; + +typedef struct _USB_NODE_CONNECTION_ATTRIBUTES { + ULONG ConnectionIndex; + USB_CONNECTION_STATUS ConnectionStatus; + ULONG PortAttributes; +} USB_NODE_CONNECTION_ATTRIBUTES, *PUSB_NODE_CONNECTION_ATTRIBUTES; + +typedef struct _USB_NODE_CONNECTION_INFORMATION_EX { + ULONG ConnectionIndex; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; + UCHAR CurrentConfigurationValue; + UCHAR Speed; + BOOLEAN DeviceIsHub; + USHORT DeviceAddress; + ULONG NumberOfOpenPipes; + USB_CONNECTION_STATUS ConnectionStatus; + USB_PIPE_INFO PipeList[0]; +} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX; + +C_ASSERT(sizeof(USB_NODE_CONNECTION_INFORMATION_EX) == sizeof(USB_NODE_CONNECTION_INFORMATION)); + +#endif + +#if (_WIN32_WINNT >= 0x0600) + +typedef union _USB_HUB_CAP_FLAGS { + ULONG ul; + struct { + ULONG HubIsHighSpeedCapable:1; + ULONG HubIsHighSpeed:1; + ULONG HubIsMultiTtCapable:1; + ULONG HubIsMultiTt:1; + ULONG HubIsRoot:1; + ULONG HubIsArmedWakeOnConnect:1; + ULONG HubIsBusPowered:1; + ULONG ReservedMBZ:25; + }; +} USB_HUB_CAP_FLAGS, *PUSB_HUB_CAP_FLAGS; + +C_ASSERT(sizeof(USB_HUB_CAP_FLAGS) == sizeof(ULONG)); + +typedef struct _USB_HUB_CAPABILITIES_EX { + USB_HUB_CAP_FLAGS CapabilityFlags; +} USB_HUB_CAPABILITIES_EX, *PUSB_HUB_CAPABILITIES_EX; + +typedef struct _USB_CYCLE_PORT_PARAMS { + ULONG ConnectionIndex; + ULONG StatusReturned; +} USB_CYCLE_PORT_PARAMS, *PUSB_CYCLE_PORT_PARAMS; + +typedef struct _USB_ID_STRING { + USHORT LanguageId; + USHORT Pad; + ULONG LengthInBytes; + PWCHAR Buffer; +} USB_ID_STRING, *PUSB_ID_STRING; + +typedef struct _USB_HUB_DEVICE_UXD_SETTINGS { + ULONG Version; + GUID PnpGuid; + GUID OwnerGuid; + ULONG DeleteOnShutdown; + ULONG DeleteOnReload; + ULONG DeleteOnDisconnect; + ULONG Reserved[5]; +} USB_HUB_DEVICE_UXD_SETTINGS, *PUSB_HUB_DEVICE_UXD_SETTINGS; + +typedef struct _HUB_DEVICE_CONFIG_INFO_V1 { + ULONG Version; + ULONG Length; + USB_HUB_CAP_FLAGS HubFlags; + USB_ID_STRING HardwareIds; + USB_ID_STRING CompatibleIds; + USB_ID_STRING DeviceDescription; + ULONG Reserved[19]; + USB_HUB_DEVICE_UXD_SETTINGS UxdSettings; +} HUB_DEVICE_CONFIG_INFO, *PHUB_DEVICE_CONFIG_INFO; + +#endif + +typedef struct _HCD_ISO_STAT_COUNTERS { + USHORT LateUrbs; + USHORT DoubleBufferedPackets; + USHORT TransfersCF_5ms; + USHORT TransfersCF_2ms; + USHORT TransfersCF_1ms; + USHORT MaxInterruptLatency; + USHORT BadStartFrame; + USHORT StaleUrbs; + USHORT IsoPacketNotAccesed; + USHORT IsoPacketHWError; + USHORT SmallestUrbPacketCount; + USHORT LargestUrbPacketCount; + USHORT IsoCRC_Error; + USHORT IsoOVERRUN_Error; + USHORT IsoINTERNAL_Error; + USHORT IsoUNKNOWN_Error; + ULONG IsoBytesTransferred; + USHORT LateMissedCount; + USHORT HWIsoMissedCount; + ULONG Reserved7[8]; +} HCD_ISO_STAT_COUNTERS, *PHCD_ISO_STAT_COUNTERS; + +typedef struct _HCD_STAT_COUNTERS { + ULONG BytesTransferred; + USHORT IsoMissedCount; + USHORT DataOverrunErrorCount; + USHORT CrcErrorCount; + USHORT ScheduleOverrunCount; + USHORT TimeoutErrorCount; + USHORT InternalHcErrorCount; + USHORT BufferOverrunErrorCount; + USHORT SWErrorCount; + USHORT StallPidCount; + USHORT PortDisableCount; +} HCD_STAT_COUNTERS, *PHCD_STAT_COUNTERS; + +typedef struct _HCD_STAT_INFORMATION_1 { + ULONG Reserved1; + ULONG Reserved2; + ULONG ResetCounters; + LARGE_INTEGER TimeRead; + HCD_STAT_COUNTERS Counters; +} HCD_STAT_INFORMATION_1, *PHCD_STAT_INFORMATION_1; + +typedef struct _HCD_STAT_INFORMATION_2 { + ULONG Reserved1; + ULONG Reserved2; + ULONG ResetCounters; + LARGE_INTEGER TimeRead; + LONG LockedMemoryUsed; + HCD_STAT_COUNTERS Counters; + HCD_ISO_STAT_COUNTERS IsoCounters; +} HCD_STAT_INFORMATION_2, *PHCD_STAT_INFORMATION_2; + +#define WMI_USB_DRIVER_INFORMATION 0 +#define WMI_USB_DRIVER_NOTIFICATION 1 +#define WMI_USB_POWER_DEVICE_ENABLE 2 +#define WMI_USB_HUB_NODE_INFORMATION 4 + +#define WMI_USB_PERFORMANCE_INFORMATION 1 +#define WMI_USB_DEVICE_NODE_INFORMATION 2 + +#if (_WIN32_WINNT >= 0x0501) + +typedef enum _USB_NOTIFICATION_TYPE { + EnumerationFailure = 0, + InsufficentBandwidth, + InsufficentPower, + OverCurrent, + ResetOvercurrent, + AcquireBusInfo, + AcquireHubName, + AcquireControllerName, + HubOvercurrent, + HubPowerChange, + HubNestedTooDeeply, + ModernDeviceInLegacyHub +} USB_NOTIFICATION_TYPE; + +#else + +typedef enum _USB_NOTIFICATION_TYPE { + EnumerationFailure = 0, + InsufficentBandwidth, + InsufficentPower, + OverCurrent, + ResetOvercurrent, + AcquireBusInfo, + AcquireHubName, + AcquireControllerName, + HubOvercurrent, + HubPowerChange +} USB_NOTIFICATION_TYPE; + +#endif + +typedef struct _USB_NOTIFICATION { + USB_NOTIFICATION_TYPE NotificationType; +} USB_NOTIFICATION, *PUSB_NOTIFICATION; + +typedef struct _USB_CONNECTION_NOTIFICATION { + USB_NOTIFICATION_TYPE NotificationType; + ULONG ConnectionNumber; + ULONG RequestedBandwidth; + ULONG EnumerationFailReason; + ULONG PowerRequested; + ULONG HubNameLength; +} USB_CONNECTION_NOTIFICATION, *PUSB_CONNECTION_NOTIFICATION; + +typedef struct _USB_BUS_NOTIFICATION { + USB_NOTIFICATION_TYPE NotificationType; + ULONG TotalBandwidth; + ULONG ConsumedBandwidth; + ULONG ControllerNameLength; +} USB_BUS_NOTIFICATION, *PUSB_BUS_NOTIFICATION; + +typedef struct _USB_ACQUIRE_INFO { + USB_NOTIFICATION_TYPE NotificationType; + ULONG TotalSize; + WCHAR Buffer[1]; +} USB_ACQUIRE_INFO, *PUSB_ACQUIRE_INFO; + +#if (_WIN32_WINNT >= 0x0600) + +#define USB_NODE_INFO_SIG 'USBN' + +typedef enum _USB_WMI_DEVICE_NODE_TYPE { + UsbDevice, + HubDevice, + CompositeDevice, + UsbController +} USB_WMI_DEVICE_NODE_TYPE, *PUSB_WMI_DEVICE_NODE_TYPE; + +typedef struct _USB_DEVICE_STATE { + ULONG DeviceConnected:1; + ULONG DeviceStarted:1; +} USB_DEVICE_STATE, *PUSB_DEVICE_STATE; + +typedef struct _USB_HUB_PORT_INFORMATION { + USB_DEVICE_STATE DeviceState; + USHORT PortNumber; + USHORT DeviceAddress; + ULONG ConnectionIndex; + USB_CONNECTION_STATUS ConnectionStatus; +} USB_HUB_PORT_INFORMATION, *PUSB_HUB_PORT_INFORMATION; + +typedef struct _USB_HUB_DEVICE_INFO { + USB_HUB_DESCRIPTOR HubDescriptor; + ULONG HubNumber; + USHORT DeviceAddress; + BOOLEAN HubIsSelfPowered; + BOOLEAN HubIsRootHub; + USB_HUB_CAPABILITIES HubCapabilities; + ULONG NumberOfHubPorts; + USB_HUB_PORT_INFORMATION PortInfo[1]; +} USB_HUB_DEVICE_INFO, *PUSB_HUB_DEVICE_INFO; + +typedef struct _USB_COMPOSITE_FUNCTION_INFO { + UCHAR FunctionNumber; + UCHAR BaseInterfaceNumber; + UCHAR NumberOfInterfaces; + BOOLEAN FunctionIsIdle; +} USB_COMPOSITE_FUNCTION_INFO, *PUSB_COMPOSITE_FUNCTION_INFO; + +typedef struct _USB_COMPOSITE_DEVICE_INFO { + USB_DEVICE_DESCRIPTOR DeviceDescriptor; + USB_CONFIGURATION_DESCRIPTOR CurrentConfigDescriptor; + UCHAR CurrentConfigurationValue; + UCHAR NumberOfFunctions; + USB_COMPOSITE_FUNCTION_INFO FunctionInfo[1]; +} USB_COMPOSITE_DEVICE_INFO, *PUSB_COMPOSITE_DEVICE_INFO; + +typedef struct _USB_CONTROLLER_DEVICE_INFO { + ULONG PciVendorId; + ULONG PciDeviceId; + ULONG PciRevision; + ULONG NumberOfRootPorts; + ULONG HcFeatureFlags; +} USB_CONTROLLER_DEVICE_INFO, *PUSB_CONTROLLER_DEVICE_INFO; + +typedef struct _USB_DEVICE_INFO { + USB_DEVICE_STATE DeviceState; + USHORT PortNumber; + USB_DEVICE_DESCRIPTOR DeviceDescriptor; + UCHAR CurrentConfigurationValue; + USB_DEVICE_SPEED Speed; + USHORT DeviceAddress; + ULONG ConnectionIndex; + USB_CONNECTION_STATUS ConnectionStatus; + WCHAR PnpHardwareId[128]; + WCHAR PnpCompatibleId[128]; + WCHAR SerialNumberId[128]; + WCHAR PnpDeviceDescription[128]; + ULONG NumberOfOpenPipes; + USB_PIPE_INFO PipeList[1]; +} USB_DEVICE_INFO, *PUSB_DEVICE_INFO; + +typedef struct _USB_DEVICE_NODE_INFO { + ULONG Sig; + ULONG LengthInBytes; + WCHAR DeviceDescription[40]; + USB_WMI_DEVICE_NODE_TYPE NodeType; + USB_TOPOLOGY_ADDRESS BusAddress; + union{ + USB_DEVICE_INFO UsbDeviceInfo; + USB_HUB_DEVICE_INFO HubDeviceInfo; + USB_COMPOSITE_DEVICE_INFO CompositeDeviceInfo; + USB_CONTROLLER_DEVICE_INFO ControllerDeviceInfo; + UCHAR DeviceInformation[4]; + }; +} USB_DEVICE_NODE_INFO, *PUSB_DEVICE_NODE_INFO; + +typedef struct _USB_DEVICE_PERFORMANCE_INFO { + ULONG BulkBytes; + ULONG ControlDataBytes; + ULONG IsoBytes; + ULONG InterruptBytes; + ULONG BulkUrbCount; + ULONG ControlUrbCount; + ULONG IsoUrbCount; + ULONG InterruptUrbCount; + ULONG AllocedInterrupt[6]; + ULONG AllocedIso; + ULONG Total32secBandwidth; + ULONG TotalTtBandwidth; + WCHAR DeviceDescription[60]; + USB_DEVICE_SPEED DeviceSpeed; + ULONG TotalIsoLatency; + ULONG DroppedIsoPackets; + ULONG TransferErrors; + ULONG PciInterruptCount; + ULONG HcIdleState; + ULONG HcAsyncIdleState; + ULONG HcAsyncCacheFlushCount; + ULONG HcPeriodicIdleState; + ULONG HcPeriodicCacheFlushCount; +} USB_DEVICE_PERFORMANCE_INFO, *PUSB_DEVICE_PERFORMANCE_INFO; + +#endif + +#include + +#ifdef __cplusplus +} +#endif diff --git a/reactos/include/ddk/usbiodef.h b/reactos/include/psdk/usbiodef.h similarity index 58% rename from reactos/include/ddk/usbiodef.h rename to reactos/include/psdk/usbiodef.h index e1008c62692..94238ac24a4 100644 --- a/reactos/include/ddk/usbiodef.h +++ b/reactos/include/psdk/usbiodef.h @@ -1,26 +1,5 @@ +#pragma once - -#ifndef __USBIODEF_H__ -#define __USBIODEF_H__ - -DEFINE_GUID(GUID_DEVINTERFACE_USB_HUB, 0xF18A0E88, 0xc30C, 0x11D0, 0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8); -DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED); -DEFINE_GUID(GUID_DEVINTERFACE_USB_HOST_CONTROLLER, 0x3ABF6F2D, 0x71C4, 0x462A, 0x8A, 0x92, 0x1E, 0x68, 0x61, 0xE6, 0xAF, 0x27); -DEFINE_GUID(GUID_USB_WMI_STD_DATA, 0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x31, 0x00, 0xA0, 0xC9, 0x59, 0xBB, 0xD2); -DEFINE_GUID(GUID_USB_WMI_STD_NOTIFICATION, 0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x31, 0x00, 0xA0, 0xC9, 0x59, 0xBB, 0xD2); - -#define GUID_CLASS_USBHUB GUID_DEVINTERFACE_USB_HUB -#define GUID_CLASS_USB_DEVICE GUID_DEVINTERFACE_USB_DEVICE -#define GUID_CLASS_USB_HOST_CONTROLLER GUID_DEVINTERFACE_USB_HOST_CONTROLLER -#define HCD_GET_STATS_1 255 -#define HCD_DIAGNOSTIC_MODE_ON 256 -#define HCD_DIAGNOSTIC_MODE_OFF 257 -#define HCD_GET_ROOT_HUB_NAME 258 -#define HCD_GET_DRIVERKEY_NAME 265 -#define HCD_GET_STATS_2 266 -#define HCD_DISABLE_PORT 268 -#define HCD_ENABLE_PORT 269 -#define HCD_USER_REQUEST 270 #define USB_SUBMIT_URB 0 #define USB_RESET_PORT 1 #define USB_GET_ROOTHUB_PDO 3 @@ -30,11 +9,20 @@ DEFINE_GUID(GUID_USB_WMI_STD_NOTIFICATION, 0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x #define USB_CYCLE_PORT 7 #define USB_GET_HUB_NAME 8 #define USB_IDLE_NOTIFICATION 9 +#define USB_RECORD_FAILURE 10 #define USB_GET_BUS_INFO 264 #define USB_GET_CONTROLLER_NAME 265 #define USB_GET_BUSGUID_INFO 266 #define USB_GET_PARENT_HUB_INFO 267 #define USB_GET_DEVICE_HANDLE 268 +#define USB_GET_DEVICE_HANDLE_EX 269 +#define USB_GET_TT_DEVICE_HANDLE 270 +#define USB_GET_TOPOLOGY_ADDRESS 271 +#define USB_IDLE_NOTIFICATION_EX 272 +#define USB_REQ_GLOBAL_SUSPEND 273 +#define USB_REQ_GLOBAL_RESUME 274 +#define USB_GET_HUB_CONFIG_INFO 275 + #define USB_GET_NODE_INFORMATION 258 #define USB_GET_NODE_CONNECTION_INFORMATION 259 #define USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION 260 @@ -44,9 +32,57 @@ DEFINE_GUID(GUID_USB_WMI_STD_NOTIFICATION, 0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x #define USB_GET_NODE_CONNECTION_DRIVERKEY_NAME 264 #define USB_GET_HUB_CAPABILITIES 271 #define USB_GET_NODE_CONNECTION_ATTRIBUTES 272 -#define USB_HUB_CYCLE_PORT 273 +#define USB_HUB_CYCLE_PORT 273 #define USB_GET_NODE_CONNECTION_INFORMATION_EX 274 +#define USB_RESET_HUB 275 +#define USB_GET_HUB_CAPABILITIES_EX 276 + +#define HCD_GET_STATS_1 255 +#define HCD_DIAGNOSTIC_MODE_ON 256 +#define HCD_DIAGNOSTIC_MODE_OFF 257 +#define HCD_GET_ROOT_HUB_NAME 258 +#define HCD_GET_DRIVERKEY_NAME 265 +#define HCD_GET_STATS_2 266 +#define HCD_DISABLE_PORT 268 +#define HCD_ENABLE_PORT 269 +#define HCD_USER_REQUEST 270 +#define HCD_TRACE_READ_REQUEST 275 + #define FILE_DEVICE_USB FILE_DEVICE_UNKNOWN #define USB_CTL(id) CTL_CODE(FILE_DEVICE_USB, (id), METHOD_BUFFERED, FILE_ANY_ACCESS) #define USB_KERNEL_CTL(id) CTL_CODE(FILE_DEVICE_USB, (id), METHOD_NEITHER, FILE_ANY_ACCESS) +#define USB_KERNEL_CTL_BUFFERED(id) CTL_CODE(FILE_DEVICE_USB, (id), METHOD_BUFFERED, FILE_ANY_ACCESS) + +DEFINE_GUID(GUID_DEVINTERFACE_USB_HUB, 0xF18A0E88, 0xc30C, 0x11D0, 0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8); +DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED); +DEFINE_GUID(GUID_DEVINTERFACE_USB_HOST_CONTROLLER, 0x3ABF6F2D, 0x71C4, 0x462A, 0x8A, 0x92, 0x1E, 0x68, 0x61, 0xE6, 0xAF, 0x27); +DEFINE_GUID(GUID_USB_WMI_STD_DATA, 0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x31, 0x00, 0xA0, 0xC9, 0x59, 0xBB, 0xD2); +DEFINE_GUID(GUID_USB_WMI_STD_NOTIFICATION, 0x4E623B20L, 0xCB14, 0x11D1, 0xB3, 0x31, 0x00, 0xA0, 0xC9, 0x59, 0xBB, 0xD2); + +#if (_WIN32_WINNT >= 0x0600) + +DEFINE_GUID(GUID_USB_WMI_DEVICE_PERF_INFO, 0x66c1aa3c, 0x499f, 0x49a0, 0xa9, 0xa5, 0x61, 0xe2, 0x35, 0x9f, 0x64, 0x7); +DEFINE_GUID(GUID_USB_WMI_NODE_INFO, 0x9c179357, 0xdc7a, 0x4f41, 0xb6, 0x6b, 0x32, 0x3b, 0x9d, 0xdc, 0xb5, 0xb1); +DEFINE_GUID(GUID_USB_WMI_HUB_DIAGNOSTICS, 0xad0379e4, 0x72db, 0x42ed, 0xba, 0x6e, 0x67, 0x57, 0x4, 0x79, 0x7, 0xd); +DEFINE_GUID(GUID_USB_WMI_TRACING, 0x3a61881b, 0xb4e6, 0x4bf9, 0xae, 0xf, 0x3c, 0xd8, 0xf3, 0x94, 0xe5, 0x2f); +DEFINE_GUID(GUID_USB_TRANSFER_TRACING, 0x681eb8aa, 0x403d, 0x452c, 0x9f, 0x8a, 0xf0, 0x61, 0x6f, 0xac, 0x95, 0x40); +DEFINE_GUID(GUID_USB_PERFORMANCE_TRACING, 0xd5de77a6, 0x6ae9, 0x425c, 0xb1, 0xe2, 0xf5, 0x61, 0x5f, 0xd3, 0x48, 0xa9); + +#endif + +#define GUID_CLASS_USBHUB GUID_DEVINTERFACE_USB_HUB +#define GUID_CLASS_USB_DEVICE GUID_DEVINTERFACE_USB_DEVICE +#define GUID_CLASS_USB_HOST_CONTROLLER GUID_DEVINTERFACE_USB_HOST_CONTROLLER + +#if (_WIN32_WINNT >= 0x0501) + +typedef VOID +(NTAPI *USB_IDLE_CALLBACK)( + IN PVOID Context); + +typedef struct _USB_IDLE_CALLBACK_INFO { + USB_IDLE_CALLBACK IdleCallback; + PVOID IdleContext; +} USB_IDLE_CALLBACK_INFO, *PUSB_IDLE_CALLBACK_INFO; + #endif diff --git a/reactos/include/psdk/usbrpmif.h b/reactos/include/psdk/usbrpmif.h new file mode 100644 index 00000000000..c6ee0c4a6a0 --- /dev/null +++ b/reactos/include/psdk/usbrpmif.h @@ -0,0 +1,64 @@ +#pragma once + +#include "windef.h" +#include "usb100.h" + +#if !defined(_USBRPM_DRIVER_) +#define USBRPMAPI DECLSPEC_IMPORT +#else +#define USBRPMAPI +#endif + +typedef struct _USBRPM_DEVICE_INFORMATION { + ULONG64 HubId; + ULONG ConnectionIndex; + UCHAR DeviceClass; + USHORT VendorId; + USHORT ProductId; + WCHAR ManufacturerString[MAXIMUM_USB_STRING_LENGTH]; + WCHAR ProductString[MAXIMUM_USB_STRING_LENGTH]; + WCHAR HubSymbolicLinkName[MAX_PATH]; +} USBRPM_DEVICE_INFORMATION, *PUSBRPM_DEVICE_INFORMATION; + +typedef struct _USBRPM_DEVICE_LIST { + ULONG NumberOfDevices; + USBRPM_DEVICE_INFORMATION Device[0]; +} USBRPM_DEVICE_LIST, *PUSBRPM_DEVICE_LIST; + +USBRPMAPI +NTSTATUS +NTAPI +RPMRegisterAlternateDriver( + IN PDRIVER_OBJECT DriverObject, + IN LPCWSTR CompatibleId, + OUT PHANDLE RegisteredDriver); + +USBRPMAPI +NTSTATUS +NTAPI +RPMUnregisterAlternateDriver( + IN HANDLE RegisteredDriver); + +USBRPMAPI +NTSTATUS +RPMGetAvailableDevices( + IN HANDLE RegisteredDriver, + IN USHORT Locale, + OUT PUSBRPM_DEVICE_LIST *DeviceList); + +USBRPMAPI +NTSTATUS +NTAPI +RPMLoadAlternateDriverForDevice( + IN HANDLE RegisteredDriver, + IN ULONG64 HubID, + IN ULONG ConnectionIndex, + IN OPTIONAL REFGUID OwnerGuid); + +USBRPMAPI +NTSTATUS +NTAPI +RPMUnloadAlternateDriverForDevice( + IN HANDLE RegisteredDriver, + IN ULONG64 HubID, + IN ULONG ConnectionIndex); diff --git a/reactos/include/ddk/usbuser.h b/reactos/include/psdk/usbuser.h similarity index 54% rename from reactos/include/ddk/usbuser.h rename to reactos/include/psdk/usbuser.h index 51af1baad48..0087467dd4b 100644 --- a/reactos/include/ddk/usbuser.h +++ b/reactos/include/psdk/usbuser.h @@ -20,16 +20,16 @@ * */ -#ifndef __USBUSER_H -#define __USBUSER_H - -#include "usb.h" -#include "usbiodef.h" +#pragma once #ifdef __cplusplus extern "C" { #endif +#if (_WIN32_WINNT >= 0x0501) + +#include "usbiodef.h" + #include #define USBUSER_VERSION 0x0004 @@ -51,17 +51,17 @@ extern "C" { #endif typedef enum _USB_USER_ERROR_CODE { - UsbUserSuccess = 0, - UsbUserNotSupported, - UsbUserInvalidRequestCode, - UsbUserFeatureDisabled, - UsbUserInvalidHeaderParameter, - UsbUserInvalidParameter, - UsbUserMiniportError, - UsbUserBufferTooSmall, - UsbUserErrorNotMapped, - UsbUserDeviceNotStarted, - UsbUserNoDeviceConnected + UsbUserSuccess = 0, + UsbUserNotSupported, + UsbUserInvalidRequestCode, + UsbUserFeatureDisabled, + UsbUserInvalidHeaderParameter, + UsbUserInvalidParameter, + UsbUserMiniportError, + UsbUserBufferTooSmall, + UsbUserErrorNotMapped, + UsbUserDeviceNotStarted, + UsbUserNoDeviceConnected } USB_USER_ERROR_CODE; #define USBUSER_GET_CONTROLLER_INFO_0 0x00000001 @@ -73,11 +73,17 @@ typedef enum _USB_USER_ERROR_CODE { #define USBUSER_GET_ROOTHUB_SYMBOLIC_NAME 0x00000007 #define USBUSER_GET_USB_DRIVER_VERSION 0x00000008 #define USBUSER_GET_USB2_HW_VERSION 0x00000009 +#define USBUSER_USB_REFRESH_HCT_REG 0x0000000a + #define USBUSER_OP_SEND_ONE_PACKET 0x10000001 #define USBUSER_OP_RAW_RESET_PORT 0x20000001 #define USBUSER_OP_OPEN_RAW_DEVICE 0x20000002 #define USBUSER_OP_CLOSE_RAW_DEVICE 0x20000003 #define USBUSER_OP_SEND_RAW_COMMAND 0x20000004 +#define USBUSER_SET_ROOTPORT_FEATURE 0x20000005 +#define USBUSER_CLEAR_ROOTPORT_FEATURE 0x20000006 +#define USBUSER_GET_ROOTPORT_STATUS 0x20000007 + #define USBUSER_INVALID_REQUEST 0xFFFFFFF0 #define USBUSER_OP_MASK_DEVONLY_API 0x10000000 #define USBUSER_OP_MASK_HCTEST_API 0x20000000 @@ -93,231 +99,249 @@ typedef enum _USB_USER_ERROR_CODE { #define USB_PACKETFLAG_TOGGLE0 0x00000100 #define USB_PACKETFLAG_TOGGLE1 0x00000200 -typedef struct _PACKET_PARAMETERS { - UCHAR DeviceAddress; - UCHAR EndpointAddress; - USHORT MaximumPacketSize; - ULONG Timeout; - ULONG Flags; - ULONG DataLength; - USHORT HubDeviceAddress; - USHORT PortTTNumber; - UCHAR ErrorCount; - UCHAR Pad[3]; - USBD_STATUS UsbdStatusCode; - UCHAR Data[4]; -} PACKET_PARAMETERS, *PPACKET_PARAMETERS; - -typedef struct _RAW_RESET_PORT_PARAMETERS { - USHORT PortNumber; - USHORT PortStatus; -} RAW_RESET_PORT_PARAMETERS, *PRAW_RESET_PORT_PARAMETERS; - -typedef struct _USB_BANDWIDTH_INFO { - ULONG DeviceCount; - ULONG TotalBusBandwidth; - ULONG Total32secBandwidth; - ULONG AllocedBulkAndControl; - ULONG AllocedIso; - ULONG AllocedInterrupt_1ms; - ULONG AllocedInterrupt_2ms; - ULONG AllocedInterrupt_4ms; - ULONG AllocedInterrupt_8ms; - ULONG AllocedInterrupt_16ms; - ULONG AllocedInterrupt_32ms; -} USB_BANDWIDTH_INFO, *PUSB_BANDWIDTH_INFO; - -typedef struct _USBUSER_REQUEST_HEADER { - ULONG UsbUserRequest; - USB_USER_ERROR_CODE UsbUserStatusCode; - ULONG RequestBufferLength; - ULONG ActualBufferLength; -} USBUSER_REQUEST_HEADER, *PUSBUSER_REQUEST_HEADER; - -typedef struct _USBUSER_BANDWIDTH_INFO_REQUEST { - USBUSER_REQUEST_HEADER Header; - USB_BANDWIDTH_INFO BandwidthInformation; -} USBUSER_BANDWIDTH_INFO_REQUEST, *PUSBUSER_BANDWIDTH_INFO_REQUEST; - -typedef struct _USB_BUS_STATISTICS_0 { - ULONG DeviceCount; - LARGE_INTEGER CurrentSystemTime; - ULONG CurrentUsbFrame; - ULONG BulkBytes; - ULONG IsoBytes; - ULONG InterruptBytes; - ULONG ControlDataBytes; - ULONG PciInterruptCount; - ULONG HardResetCount; - ULONG WorkerSignalCount; - ULONG CommonBufferBytes; - ULONG WorkerIdleTimeMs; - BOOLEAN RootHubEnabled; - UCHAR RootHubDevicePowerState; - UCHAR Unused; - UCHAR NameIndex; -} USB_BUS_STATISTICS_0, *PUSB_BUS_STATISTICS_0; - -typedef struct _USBUSER_BUS_STATISTICS_0_REQUEST { - USBUSER_REQUEST_HEADER Header; - USB_BUS_STATISTICS_0 BusStatistics0; -} USBUSER_BUS_STATISTICS_0_REQUEST, *PUSBUSER_BUS_STATISTICS_0_REQUEST; - /* USB_CONTROLLER_INFO_0.HcFeatureFlags constants */ #define USB_HC_FEATURE_FLAG_PORT_POWER_SWITCHING 0x00000001 #define USB_HC_FEATURE_FLAG_SEL_SUSPEND 0x00000002 #define USB_HC_FEATURE_LEGACY_BIOS 0x00000004 -typedef struct _USB_CLOSE_RAW_DEVICE_PARAMETERS { - ULONG xxx; -} USB_CLOSE_RAW_DEVICE_PARAMETERS , *PUSB_CLOSE_RAW_DEVICE_PARAMETERS; +typedef struct _USBUSER_REQUEST_HEADER { + ULONG UsbUserRequest; + USB_USER_ERROR_CODE UsbUserStatusCode; + ULONG RequestBufferLength; + ULONG ActualBufferLength; +} USBUSER_REQUEST_HEADER, *PUSBUSER_REQUEST_HEADER; -typedef struct _USBUSER_CLOSE_RAW_DEVICE { - USBUSER_REQUEST_HEADER Header; - USB_CLOSE_RAW_DEVICE_PARAMETERS Parameters; -} USBUSER_CLOSE_RAW_DEVICE, *PUSBUSER_CLOSE_RAW_DEVICE; +typedef struct _PACKET_PARAMETERS { + UCHAR DeviceAddress; + UCHAR EndpointAddress; + USHORT MaximumPacketSize; + ULONG Timeout; + ULONG Flags; + ULONG DataLength; + USHORT HubDeviceAddress; + USHORT PortTTNumber; + UCHAR ErrorCount; + UCHAR Pad[3]; + USBD_STATUS UsbdStatusCode; + UCHAR Data[4]; +} PACKET_PARAMETERS, *PPACKET_PARAMETERS; + +typedef struct _USBUSER_SEND_ONE_PACKET { + USBUSER_REQUEST_HEADER Header; + PACKET_PARAMETERS PacketParameters; +} USBUSER_SEND_ONE_PACKET, *PUSBUSER_SEND_ONE_PACKET; + +typedef struct _RAW_RESET_PORT_PARAMETERS { + USHORT PortNumber; + USHORT PortStatus; +} RAW_RESET_PORT_PARAMETERS, *PRAW_RESET_PORT_PARAMETERS; + +typedef struct _USBUSER_RAW_RESET_ROOT_PORT { + USBUSER_REQUEST_HEADER Header; + RAW_RESET_PORT_PARAMETERS Parameters; +} USBUSER_RAW_RESET_ROOT_PORT, *PUSBUSER_RAW_RESET_ROOT_PORT; + +typedef struct _RAW_ROOTPORT_FEATURE { + USHORT PortNumber; + USHORT PortFeature; + USHORT PortStatus; +} RAW_ROOTPORT_FEATURE, *PRAW_ROOTPORT_FEATURE; + +typedef struct _USBUSER_ROOTPORT_FEATURE_REQUEST { + USBUSER_REQUEST_HEADER Header; + RAW_ROOTPORT_FEATURE Parameters; +} USBUSER_ROOTPORT_FEATURE_REQUEST, *PUSBUSER_ROOTPORT_FEATURE_REQUEST; + +typedef struct _RAW_ROOTPORT_PARAMETERS { + USHORT PortNumber; + USHORT PortStatus; +} RAW_ROOTPORT_PARAMETERS, *PRAW_ROOTPORT_PARAMETERS; + +typedef struct _USBUSER_ROOTPORT_PARAMETERS { + USBUSER_REQUEST_HEADER Header; + RAW_ROOTPORT_PARAMETERS Parameters; +} USBUSER_ROOTPORT_PARAMETERS, *PUSBUSER_ROOTPORT_PARAMETERS; typedef struct _USB_CONTROLLER_INFO_0 { - ULONG PciVendorId; - ULONG PciDeviceId; - ULONG PciRevision; - ULONG NumberOfRootPorts; - USB_CONTROLLER_FLAVOR ControllerFlavor; - ULONG HcFeatureFlags; + ULONG PciVendorId; + ULONG PciDeviceId; + ULONG PciRevision; + ULONG NumberOfRootPorts; + USB_CONTROLLER_FLAVOR ControllerFlavor; + ULONG HcFeatureFlags; } USB_CONTROLLER_INFO_0 , *PUSB_CONTROLLER_INFO_0; typedef struct _USBUSER_CONTROLLER_INFO_0 { - USBUSER_REQUEST_HEADER Header; - USB_CONTROLLER_INFO_0 Info0; + USBUSER_REQUEST_HEADER Header; + USB_CONTROLLER_INFO_0 Info0; } USBUSER_CONTROLLER_INFO_0, *PUSBUSER_CONTROLLER_INFO_0; -typedef struct _USB_DRIVER_VERSION_PARAMETERS { - ULONG DriverTrackingCode; - ULONG USBDI_Version; - ULONG USBUSER_Version; - BOOLEAN CheckedPortDriver; - BOOLEAN CheckedMiniportDriver; - USHORT USB_Version; -} USB_DRIVER_VERSION_PARAMETERS , *PUSB_DRIVER_VERSION_PARAMETERS; - -typedef struct _USBUSER_GET_DRIVER_VERSION { - USBUSER_REQUEST_HEADER Header; - USB_DRIVER_VERSION_PARAMETERS Parameters; -} USBUSER_GET_DRIVER_VERSION, *PUSBUSER_GET_DRIVER_VERSION; - -typedef struct _USB_OPEN_RAW_DEVICE_PARAMETERS { - USHORT PortStatus; - USHORT MaxPacketEp0; -} USB_OPEN_RAW_DEVICE_PARAMETERS , *PUSB_OPEN_RAW_DEVICE_PARAMETERS; - -typedef struct _USBUSER_OPEN_RAW_DEVICE { - USBUSER_REQUEST_HEADER Header; - USB_OPEN_RAW_DEVICE_PARAMETERS Parameters; -} USBUSER_OPEN_RAW_DEVICE, *PUSBUSER_OPEN_RAW_DEVICE; - -typedef enum _WDMUSB_POWER_STATE { - WdmUsbPowerNotMapped = 0, - WdmUsbPowerSystemUnspecified = 100, - WdmUsbPowerSystemWorking, - WdmUsbPowerSystemSleeping1, - WdmUsbPowerSystemSleeping2, - WdmUsbPowerSystemSleeping3, - WdmUsbPowerSystemHibernate, - WdmUsbPowerSystemShutdown, - WdmUsbPowerDeviceUnspecified = 200, - WdmUsbPowerDeviceD0, - WdmUsbPowerDeviceD1, - WdmUsbPowerDeviceD2, - WdmUsbPowerDeviceD3 -} WDMUSB_POWER_STATE; - -typedef struct _USB_POWER_INFO { - WDMUSB_POWER_STATE SystemState; - WDMUSB_POWER_STATE HcDevicePowerState; - WDMUSB_POWER_STATE HcDeviceWake; - WDMUSB_POWER_STATE HcSystemWake; - WDMUSB_POWER_STATE RhDevicePowerState; - WDMUSB_POWER_STATE RhDeviceWake; - WDMUSB_POWER_STATE RhSystemWake; - WDMUSB_POWER_STATE LastSystemSleepState; - BOOLEAN CanWakeup; - BOOLEAN IsPowered; -} USB_POWER_INFO, *PUSB_POWER_INFO; - -typedef struct _USBUSER_POWER_INFO_REQUEST { - USBUSER_REQUEST_HEADER Header; - USB_POWER_INFO PowerInformation; -} USBUSER_POWER_INFO_REQUEST, *PUSBUSER_POWER_INFO_REQUEST; - typedef struct _USB_UNICODE_NAME { - ULONG Length; - WCHAR String[1]; + ULONG Length; + WCHAR String[1]; } USB_UNICODE_NAME, *PUSB_UNICODE_NAME; typedef struct _USBUSER_CONTROLLER_UNICODE_NAME { - USBUSER_REQUEST_HEADER Header; - USB_UNICODE_NAME UnicodeName; + USBUSER_REQUEST_HEADER Header; + USB_UNICODE_NAME UnicodeName; } USBUSER_CONTROLLER_UNICODE_NAME, *PUSBUSER_CONTROLLER_UNICODE_NAME; typedef struct _USB_PASS_THRU_PARAMETERS { - GUID FunctionGUID; - ULONG ParameterLength; - UCHAR Parameters[4]; + GUID FunctionGUID; + ULONG ParameterLength; + UCHAR Parameters[4]; } USB_PASS_THRU_PARAMETERS, *PUSB_PASS_THRU_PARAMETERS; typedef struct _USBUSER_PASS_THRU_REQUEST { - USBUSER_REQUEST_HEADER Header; - USB_PASS_THRU_PARAMETERS PassThru; + USBUSER_REQUEST_HEADER Header; + USB_PASS_THRU_PARAMETERS PassThru; } USBUSER_PASS_THRU_REQUEST, *PUSBUSER_PASS_THRU_REQUEST; -typedef struct _USBUSER_RAW_RESET_ROOT_PORT { - USBUSER_REQUEST_HEADER Header; - RAW_RESET_PORT_PARAMETERS Parameters; -} USBUSER_RAW_RESET_ROOT_PORT, *PUSBUSER_RAW_RESET_ROOT_PORT; +typedef enum _WDMUSB_POWER_STATE { + WdmUsbPowerNotMapped = 0, + WdmUsbPowerSystemUnspecified = 100, + WdmUsbPowerSystemWorking, + WdmUsbPowerSystemSleeping1, + WdmUsbPowerSystemSleeping2, + WdmUsbPowerSystemSleeping3, + WdmUsbPowerSystemHibernate, + WdmUsbPowerSystemShutdown, + WdmUsbPowerDeviceUnspecified = 200, + WdmUsbPowerDeviceD0, + WdmUsbPowerDeviceD1, + WdmUsbPowerDeviceD2, + WdmUsbPowerDeviceD3 +} WDMUSB_POWER_STATE; -typedef struct _USBUSER_SEND_ONE_PACKET { - USBUSER_REQUEST_HEADER Header; - PACKET_PARAMETERS PacketParameters; -} USBUSER_SEND_ONE_PACKET, *PUSBUSER_SEND_ONE_PACKET; +typedef struct _USB_POWER_INFO { + WDMUSB_POWER_STATE SystemState; + WDMUSB_POWER_STATE HcDevicePowerState; + WDMUSB_POWER_STATE HcDeviceWake; + WDMUSB_POWER_STATE HcSystemWake; + WDMUSB_POWER_STATE RhDevicePowerState; + WDMUSB_POWER_STATE RhDeviceWake; + WDMUSB_POWER_STATE RhSystemWake; + WDMUSB_POWER_STATE LastSystemSleepState; + BOOLEAN CanWakeup; + BOOLEAN IsPowered; +} USB_POWER_INFO, *PUSB_POWER_INFO; + +typedef struct _USBUSER_POWER_INFO_REQUEST { + USBUSER_REQUEST_HEADER Header; + USB_POWER_INFO PowerInformation; +} USBUSER_POWER_INFO_REQUEST, *PUSBUSER_POWER_INFO_REQUEST; + +typedef struct _USB_OPEN_RAW_DEVICE_PARAMETERS { + USHORT PortStatus; + USHORT MaxPacketEp0; +} USB_OPEN_RAW_DEVICE_PARAMETERS , *PUSB_OPEN_RAW_DEVICE_PARAMETERS; + +typedef struct _USBUSER_OPEN_RAW_DEVICE { + USBUSER_REQUEST_HEADER Header; + USB_OPEN_RAW_DEVICE_PARAMETERS Parameters; +} USBUSER_OPEN_RAW_DEVICE, *PUSBUSER_OPEN_RAW_DEVICE; + +typedef struct _USB_CLOSE_RAW_DEVICE_PARAMETERS { + ULONG xxx; +} USB_CLOSE_RAW_DEVICE_PARAMETERS , *PUSB_CLOSE_RAW_DEVICE_PARAMETERS; + +typedef struct _USBUSER_CLOSE_RAW_DEVICE { + USBUSER_REQUEST_HEADER Header; + USB_CLOSE_RAW_DEVICE_PARAMETERS Parameters; +} USBUSER_CLOSE_RAW_DEVICE, *PUSBUSER_CLOSE_RAW_DEVICE; typedef struct _USB_SEND_RAW_COMMAND_PARAMETERS { - UCHAR Usb_bmRequest; - UCHAR Usb_bRequest; - USHORT Usb_wVlaue; - USHORT Usb_wIndex; - USHORT Usb_wLength; - USHORT DeviceAddress; - USHORT MaximumPacketSize; - ULONG Timeout; - ULONG DataLength; - USBD_STATUS UsbdStatusCode; - UCHAR Data[4]; + UCHAR Usb_bmRequest; + UCHAR Usb_bRequest; + USHORT Usb_wVlaue; + USHORT Usb_wIndex; + USHORT Usb_wLength; + USHORT DeviceAddress; + USHORT MaximumPacketSize; + ULONG Timeout; + ULONG DataLength; + USBD_STATUS UsbdStatusCode; + UCHAR Data[4]; } USB_SEND_RAW_COMMAND_PARAMETERS, *PUSB_SEND_RAW_COMMAND_PARAMETERS; typedef struct _USBUSER_SEND_RAW_COMMAND { - USBUSER_REQUEST_HEADER Header; - USB_SEND_RAW_COMMAND_PARAMETERS Parameters; + USBUSER_REQUEST_HEADER Header; + USB_SEND_RAW_COMMAND_PARAMETERS Parameters; } USBUSER_SEND_RAW_COMMAND, *PUSBUSER_SEND_RAW_COMMAND; -/* USB_USB2HW_VERSION_PARAMETERS.Usb2HwRevision constants */ -#define USB2HW_UNKNOWN 0x00 -#define USB2HW_A0 0xA0 -#define USB2HW_A1 0xA1 -#define USB2HW_B0 0xB0 +typedef struct _USB_BANDWIDTH_INFO { + ULONG DeviceCount; + ULONG TotalBusBandwidth; + ULONG Total32secBandwidth; + ULONG AllocedBulkAndControl; + ULONG AllocedIso; + ULONG AllocedInterrupt_1ms; + ULONG AllocedInterrupt_2ms; + ULONG AllocedInterrupt_4ms; + ULONG AllocedInterrupt_8ms; + ULONG AllocedInterrupt_16ms; + ULONG AllocedInterrupt_32ms; +} USB_BANDWIDTH_INFO, *PUSB_BANDWIDTH_INFO; + +typedef struct _USBUSER_BANDWIDTH_INFO_REQUEST { + USBUSER_REQUEST_HEADER Header; + USB_BANDWIDTH_INFO BandwidthInformation; +} USBUSER_BANDWIDTH_INFO_REQUEST, *PUSBUSER_BANDWIDTH_INFO_REQUEST; + +typedef struct _USB_BUS_STATISTICS_0 { + ULONG DeviceCount; + LARGE_INTEGER CurrentSystemTime; + ULONG CurrentUsbFrame; + ULONG BulkBytes; + ULONG IsoBytes; + ULONG InterruptBytes; + ULONG ControlDataBytes; + ULONG PciInterruptCount; + ULONG HardResetCount; + ULONG WorkerSignalCount; + ULONG CommonBufferBytes; + ULONG WorkerIdleTimeMs; + BOOLEAN RootHubEnabled; + UCHAR RootHubDevicePowerState; + UCHAR Unused; + UCHAR NameIndex; +} USB_BUS_STATISTICS_0, *PUSB_BUS_STATISTICS_0; + +typedef struct _USBUSER_BUS_STATISTICS_0_REQUEST { + USBUSER_REQUEST_HEADER Header; + USB_BUS_STATISTICS_0 BusStatistics0; +} USBUSER_BUS_STATISTICS_0_REQUEST, *PUSBUSER_BUS_STATISTICS_0_REQUEST; + +typedef struct _USB_DRIVER_VERSION_PARAMETERS { + ULONG DriverTrackingCode; + ULONG USBDI_Version; + ULONG USBUSER_Version; + BOOLEAN CheckedPortDriver; + BOOLEAN CheckedMiniportDriver; + USHORT USB_Version; +} USB_DRIVER_VERSION_PARAMETERS , *PUSB_DRIVER_VERSION_PARAMETERS; + +typedef struct _USBUSER_GET_DRIVER_VERSION { + USBUSER_REQUEST_HEADER Header; + USB_DRIVER_VERSION_PARAMETERS Parameters; +} USBUSER_GET_DRIVER_VERSION, *PUSBUSER_GET_DRIVER_VERSION; typedef struct _USB_USB2HW_VERSION_PARAMETERS { - UCHAR Usb2HwRevision; + UCHAR Usb2HwRevision; } USB_USB2HW_VERSION_PARAMETERS, *PUSB_USB2HW_VERSION_PARAMETERS; typedef struct _USBUSER_GET_USB2HW_VERSION { - USBUSER_REQUEST_HEADER Header; - USB_USB2HW_VERSION_PARAMETERS Parameters; + USBUSER_REQUEST_HEADER Header; + USB_USB2HW_VERSION_PARAMETERS Parameters; } USBUSER_GET_USB2HW_VERSION, *PUSBUSER_GET_USB2HW_VERSION; +typedef struct _USBUSER_REFRESH_HCT_REG { + USBUSER_REQUEST_HEADER Header; + ULONG Flags; +} USBUSER_REFRESH_HCT_REG, *PUSBUSER_REFRESH_HCT_REG; + #include #ifdef __cplusplus } #endif - -#endif /* __USBUSER_H */ diff --git a/reactos/include/psdk/vfw.h b/reactos/include/psdk/vfw.h index ed62545eb42..83d6dbad12d 100644 --- a/reactos/include/psdk/vfw.h +++ b/reactos/include/psdk/vfw.h @@ -499,7 +499,7 @@ BOOL VFWAPI ICInstall(DWORD fccType, DWORD fccHandler, LPARAM lParam, LPSTR BOOL VFWAPI ICRemove(DWORD fccType, DWORD fccHandler, UINT wFlags); LRESULT VFWAPI ICGetInfo(HIC hic,ICINFO *picinfo, DWORD cb); HIC VFWAPI ICOpen(DWORD fccType, DWORD fccHandler, UINT wMode); -HIC VFWAPI ICOpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode, FARPROC lpfnHandler); +HIC VFWAPI ICOpenFunction(DWORD fccType, DWORD fccHandler, UINT wMode, DRIVERPROC lpfnHandler); LRESULT VFWAPI ICClose(HIC hic); HIC VFWAPI ICLocate(DWORD fccType, DWORD fccHandler, LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, WORD wFlags); diff --git a/reactos/include/psdk/winbase.h b/reactos/include/psdk/winbase.h index ca1549f5d20..b7a5fd2776d 100644 --- a/reactos/include/psdk/winbase.h +++ b/reactos/include/psdk/winbase.h @@ -1807,9 +1807,7 @@ BOOL WINAPI InitializeCriticalSectionAndSpinCount(LPCRITICAL_SECTION,DWORD); DWORD WINAPI SetCriticalSectionSpinCount(LPCRITICAL_SECTION,DWORD); BOOL WINAPI InitializeSecurityDescriptor(PSECURITY_DESCRIPTOR,DWORD); BOOL WINAPI InitializeSid (PSID,PSID_IDENTIFIER_AUTHORITY,BYTE); -#if !defined(__WINDDK_H) && _WIN32_WINNT >= 0x0501 -VOID WINAPI InitializeSListHead(PSLIST_HEADER); -#endif + #if (_WIN32_WINNT >= 0x0600) VOID WINAPI InitializeSRWLock(PSRWLOCK); #endif @@ -1881,7 +1879,15 @@ PSLIST_ENTRY WINAPI InterlockedPushEntrySList(PSLIST_HEADER,PSLIST_ENTRY); #endif // !(defined (_M_AMD64) || defined (_M_IA64)) -VOID WINAPI InitializeSListHead(PSLIST_HEADER); +#if defined(_SLIST_HEADER_) && !defined(_NTOSP_) + +WINBASEAPI +VOID +WINAPI +InitializeSListHead ( + IN OUT PSLIST_HEADER ListHead); +#endif + USHORT WINAPI QueryDepthSList(PSLIST_HEADER); #ifdef _MSC_VER diff --git a/reactos/include/psdk/wincodec.idl b/reactos/include/psdk/wincodec.idl index 8e8dfe60475..1bcb2cd1bad 100644 --- a/reactos/include/psdk/wincodec.idl +++ b/reactos/include/psdk/wincodec.idl @@ -72,6 +72,14 @@ typedef enum WICBitmapEncoderCacheOption { WICBITMAPENCODERCACHEOPTION_FORCE_DWORD = CODEC_FORCE_DWORD } WICBitmapEncoderCacheOption; +typedef enum WICBitmapInterpolationMode { + WICBitmapInterpolationModeNearestNeighbor = 0x00000000, + WICBitmapInterpolationModeLinear = 0x00000001, + WICBitmapInterpolationModeCubic = 0x00000002, + WICBitmapInterpolationModeFaint = 0x00000003, + WICBITMAPINTERPOLATIONMODE_FORCE_DWORD = CODEC_FORCE_DWORD +} WICBitmapInterpolationMode; + typedef enum WICBitmapPaletteType { WICBitmapPaletteTypeCustom = 0x00000000, WICBitmapPaletteTypeMedianCut = 0x00000001, @@ -169,9 +177,7 @@ cpp_quote("#define WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT 0x88982f80") cpp_quote("#define WINCODEC_ERR_UNSUPPORTEDOPERATION 0x88982f81") cpp_quote("#define WINCODEC_ERR_INSUFFICIENTBUFFER 0x88982f8c") -interface IWICBitmap; interface IWICPalette; -interface IWICBitmapScaler; interface IWICBitmapClipper; interface IWICBitmapFlipRotator; interface IWICColorContext; @@ -207,6 +213,46 @@ interface IWICBitmapSource : IUnknown [out, size_is(cbBufferSize)] BYTE *pbBuffer); } +[ + object, + uuid(00000123-a8f2-4877-ba0a-fd2b6645fb94) +] +interface IWICBitmapLock : IUnknown +{ + HRESULT GetSize( + [out] UINT *pWidth, + [out] UINT *pHeight); + + HRESULT GetStride( + [out] UINT *pcbStride); + + HRESULT GetDataPointer( + [out] UINT *pcbBufferSize, + [out, size_is(,*pcbBufferSize)] BYTE **ppbData); + + HRESULT GetPixelFormat( + [out] WICPixelFormatGUID *pPixelFormat); +} + +[ + object, + uuid(00000121-a8f2-4877-ba0a-fd2b6645fb94) +] +interface IWICBitmap : IWICBitmapSource +{ + HRESULT Lock( + [in] const WICRect *prcLock, + [in] DWORD flags, + [out] IWICBitmapLock **ppILock); + + HRESULT SetPalette( + [in] IWICPalette *pIPalette); + + HRESULT SetResolution( + [in] double dpiX, + [in] double dpiY); +} + [ object, uuid(00000040-a8f2-4877-ba0a-fd2b6645fb94) @@ -586,6 +632,19 @@ interface IWICStream : IStream [in] ULARGE_INTEGER ulMaxSize); } +[ + object, + uuid(00000302-a8f2-4877-ba0a-fd2b6645fb94) +] +interface IWICBitmapScaler : IWICBitmapSource +{ + HRESULT Initialize( + [in] IWICBitmapSource *pISource, + [in] UINT uiWidth, + [in] UINT uiHeight, + [in] WICBitmapInterpolationMode mode); +} + cpp_quote("DEFINE_GUID(CLSID_WICImagingFactory, 0xcacaf262,0x9370,0x4615,0xa1,0x3b,0x9f,0x55,0x39,0xda,0x4c,0x0a);") [ diff --git a/reactos/include/psdk/wincrypt.h b/reactos/include/psdk/wincrypt.h index af79c64240d..3f7f4ed6e5b 100644 --- a/reactos/include/psdk/wincrypt.h +++ b/reactos/include/psdk/wincrypt.h @@ -1339,14 +1339,18 @@ typedef struct _CRYPT_URL_INFO { DWORD *rgcGroupEntry; } CRYPT_URL_INFO, *PCRYPT_URL_INFO; -#define URL_OID_CERTIFICATE_ISSUER ((LPCSTR)1) -#define URL_OID_CERTIFICATE_CRL_DIST_POINT ((LPCSTR)2) -#define URL_OID_CTL_ISSUER ((LPCSTR)3) -#define URL_OID_CTL_NEXT_UPDATE ((LPCSTR)4) -#define URL_OID_CRL_ISSUER ((LPCSTR)5) -#define URL_OID_CERTIFICATE_FRESHEST_CRL ((LPCSTR)6) -#define URL_OID_CRL_FRESHEST_CRL ((LPCSTR)7) -#define URL_OID_CROSS_CERT_DIST_POINT ((LPCSTR)8) +#define URL_OID_CERTIFICATE_ISSUER ((LPCSTR)1) +#define URL_OID_CERTIFICATE_CRL_DIST_POINT ((LPCSTR)2) +#define URL_OID_CTL_ISSUER ((LPCSTR)3) +#define URL_OID_CTL_NEXT_UPDATE ((LPCSTR)4) +#define URL_OID_CRL_ISSUER ((LPCSTR)5) +#define URL_OID_CERTIFICATE_FRESHEST_CRL ((LPCSTR)6) +#define URL_OID_CRL_FRESHEST_CRL ((LPCSTR)7) +#define URL_OID_CROSS_CERT_DIST_POINT ((LPCSTR)8) +#define URL_OID_CERTIFICATE_OCSP ((LPCSTR)9) +#define URL_OID_CERTIFICATE_OCSP_AND_CRL_DIST_POINT ((LPCSTR)10) +#define URL_OID_CERTIFICATE_CRL_DIST_POINT_AND_OCSP ((LPCSTR)11) +#define URL_OID_CROSS_CERT_SUBJECT_INFO_ACCESS ((LPCSTR)12) #define URL_OID_GET_OBJECT_URL_FUNC "UrlDllGetObjectUrl" @@ -2778,6 +2782,9 @@ typedef struct _CTL_FIND_SUBJECT_PARA #define szOID_RSA_MD5RSA "1.2.840.113549.1.1.4" #define szOID_RSA_SHA1RSA "1.2.840.113549.1.1.5" #define szOID_RSA_SET0AEP_RSA "1.2.840.113549.1.1.6" +#define szOID_RSA_SHA256RSA "1.2.840.113549.1.1.11" +#define szOID_RSA_SHA384RSA "1.2.840.113549.1.1.12" +#define szOID_RSA_SHA512RSA "1.2.840.113549.1.1.13" #define szOID_RSA_DH "1.2.840.113549.1.3.1" #define szOID_RSA_data "1.2.840.113549.1.7.1" #define szOID_RSA_signedData "1.2.840.113549.1.7.2" diff --git a/reactos/include/psdk/windef.h b/reactos/include/psdk/windef.h index e885d9e3a2f..a168b263eb7 100644 --- a/reactos/include/psdk/windef.h +++ b/reactos/include/psdk/windef.h @@ -64,8 +64,13 @@ extern "C" { #ifndef TRUE #define TRUE 1 #endif + +#ifndef IN #define IN +#endif +#ifndef OUT #define OUT +#endif #ifndef OPTIONAL #define OPTIONAL #endif @@ -204,16 +209,13 @@ extern "C" { #define DBG_UNREFERENCED_PARAMETER(P) #define DBG_UNREFERENCED_LOCAL_VARIABLE(L) +#ifndef __ANONYMOUS_DEFINED +#define __ANONYMOUS_DEFINED + #ifndef NONAMELESSUNION #ifdef __GNUC__ -#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) #define _ANONYMOUS_UNION __extension__ #define _ANONYMOUS_STRUCT __extension__ -#else -#if defined(__cplusplus) -#define _ANONYMOUS_UNION __extension__ -#endif /* __cplusplus */ -#endif /* __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) */ #elif defined(__WATCOMC__) || defined(_MSC_VER) #define _ANONYMOUS_UNION #define _ANONYMOUS_STRUCT @@ -263,6 +265,8 @@ extern "C" { #define DUMMYSTRUCTNAME5 #endif +#endif /* __ANONYMOUS_DEFINED */ + #ifndef NO_STRICT #ifndef STRICT #define STRICT 1 diff --git a/reactos/include/psdk/wingdi.h b/reactos/include/psdk/wingdi.h index 68d3166197e..f67ab615647 100644 --- a/reactos/include/psdk/wingdi.h +++ b/reactos/include/psdk/wingdi.h @@ -2917,6 +2917,7 @@ BOOL WINAPI FlattenPath(HDC); BOOL WINAPI FloodFill(HDC,int,int,COLORREF); BOOL WINAPI GdiAlphaBlend(HDC,int,int,int,int,HDC,int,int,int,int,BLENDFUNCTION); BOOL WINAPI GdiComment(HDC,UINT,const BYTE*); +DEVMODEW* WINAPI GdiConvertToDevmodeW(const DEVMODEA *); BOOL WINAPI GdiFlush(void); DWORD WINAPI GdiGetBatchLimit(void); DWORD WINAPI GdiSetBatchLimit(DWORD); diff --git a/reactos/include/psdk/winnt.h b/reactos/include/psdk/winnt.h index 78700be1071..f84a8ac817e 100644 --- a/reactos/include/psdk/winnt.h +++ b/reactos/include/psdk/winnt.h @@ -403,7 +403,7 @@ typedef DWORD FLONG; #define FILE_CREATE_TREE_CONNECTION 0x00000080 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100 #define FILE_NO_EA_KNOWLEDGE 0x00000200 -#define FILE_OPEN_FOR_RECOVERY 0x00000400 +#define FILE_OPEN_REMOTE_INSTANCE 0x00000400 #define FILE_RANDOM_ACCESS 0x00000800 #define FILE_DELETE_ON_CLOSE 0x00001000 #define FILE_OPEN_BY_FILE_ID 0x00002000 @@ -1127,6 +1127,7 @@ typedef enum { #define LANG_SYSTEM_DEFAULT MAKELANGID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT) #define LANG_USER_DEFAULT MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT) #define LOCALE_NEUTRAL MAKELCID(MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),SORT_DEFAULT) +#define LOCALE_INVARIANT MAKELCID(MAKELANGID(LANG_INVARIANT, SUBLANG_NEUTRAL), SORT_DEFAULT) #define ACL_REVISION 2 #define ACL_REVISION_DS 4 #define ACL_REVISION1 1 diff --git a/reactos/include/psdk/winternl.h b/reactos/include/psdk/winternl.h index 1464c6e17af..7f1a739b53d 100644 --- a/reactos/include/psdk/winternl.h +++ b/reactos/include/psdk/winternl.h @@ -871,20 +871,20 @@ typedef struct _UNWIND_HISTORY_TABLE { */ /* This is used by NtQuerySystemInformation */ -typedef struct _SYSTEM_THREAD_INFORMATION{ - FILETIME ftKernelTime; - FILETIME ftUserTime; - FILETIME ftCreateTime; - DWORD dwTickCount; - DWORD dwStartAddress; - DWORD dwOwningPID; - DWORD dwThreadID; - DWORD dwCurrentPriority; - DWORD dwBasePriority; - DWORD dwContextSwitches; - DWORD dwThreadState; - DWORD dwWaitReason; - DWORD dwUnknown; +typedef struct _SYSTEM_THREAD_INFORMATION +{ /* win32/win64 */ + LARGE_INTEGER KernelTime; /* 00/00 */ + LARGE_INTEGER UserTime; /* 08/08 */ + LARGE_INTEGER CreateTime; /* 10/10 */ + DWORD dwTickCount; /* 18/18 */ + LPVOID StartAddress; /* 1c/20 */ + CLIENT_ID ClientId; /* 20/28 */ + DWORD dwCurrentPriority; /* 28/38 */ + DWORD dwBasePriority; /* 2c/3c */ + DWORD dwContextSwitches; /* 30/40 */ + DWORD dwThreadState; /* 34/44 */ + DWORD dwWaitReason; /* 38/48 */ + DWORD dwUnknown; /* 3c/4c */ } SYSTEM_THREAD_INFORMATION, *PSYSTEM_THREAD_INFORMATION; typedef struct _IO_STATUS_BLOCK { @@ -1195,38 +1195,39 @@ typedef struct _VM_COUNTERS_ { SIZE_T QuotaNonPagedPoolUsage; SIZE_T PagefileUsage; SIZE_T PeakPagefileUsage; + SIZE_T PrivatePageCount; } VM_COUNTERS, *PVM_COUNTERS; typedef struct _SYSTEM_PROCESS_INFORMATION { -#ifdef __WINESRC__ - DWORD dwOffset; - DWORD dwThreadCount; - DWORD dwUnknown1[6]; - FILETIME ftCreationTime; - FILETIME ftUserTime; - FILETIME ftKernelTime; - UNICODE_STRING ProcessName; - DWORD dwBasePriority; - DWORD dwProcessID; - DWORD dwParentProcessID; - DWORD dwHandleCount; - DWORD dwUnknown3; - DWORD dwUnknown4; - VM_COUNTERS vmCounters; - IO_COUNTERS ioCounters; - SYSTEM_THREAD_INFORMATION ti[1]; +#ifdef __WINESRC__ /* win32/win64 */ + ULONG NextEntryOffset; /* 00/00 */ + DWORD dwThreadCount; /* 04/04 */ + DWORD dwUnknown1[6]; /* 08/08 */ + LARGE_INTEGER CreationTime; /* 20/20 */ + LARGE_INTEGER UserTime; /* 28/28 */ + LARGE_INTEGER KernelTime; /* 30/30 */ + UNICODE_STRING ProcessName; /* 38/38 */ + DWORD dwBasePriority; /* 40/48 */ + HANDLE UniqueProcessId; /* 44/50 */ + HANDLE ParentProcessId; /* 48/58 */ + ULONG HandleCount; /* 4c/60 */ + DWORD dwUnknown3; /* 50/64 */ + DWORD dwUnknown4; /* 54/68 */ + VM_COUNTERS vmCounters; /* 58/70 */ + IO_COUNTERS ioCounters; /* 88/d0 */ + SYSTEM_THREAD_INFORMATION ti[1]; /* b8/100 */ #else - ULONG NextEntryOffset; - BYTE Reserved1[52]; - PVOID Reserved2[3]; - HANDLE UniqueProcessId; - PVOID Reserved3; - ULONG HandleCount; - BYTE Reserved4[4]; - PVOID Reserved5[11]; - SIZE_T PeakPagefileUsage; - SIZE_T PrivatePageCount; - LARGE_INTEGER Reserved6[6]; + ULONG NextEntryOffset; /* 00/00 */ + BYTE Reserved1[52]; /* 04/04 */ + PVOID Reserved2[3]; /* 38/38 */ + HANDLE UniqueProcessId; /* 44/50 */ + PVOID Reserved3; /* 48/58 */ + ULONG HandleCount; /* 4c/60 */ + BYTE Reserved4[4]; /* 50/64 */ + PVOID Reserved5[11]; /* 54/68 */ + SIZE_T PeakPagefileUsage; /* 80/c0 */ + SIZE_T PrivatePageCount; /* 84/c8 */ + LARGE_INTEGER Reserved6[6]; /* 88/d0 */ #endif } SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION; @@ -1398,7 +1399,7 @@ typedef struct _RTL_HANDLE_TABLE #define FILE_CREATE_TREE_CONNECTION 0x00000080 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100 #define FILE_NO_EA_KNOWLEDGE 0x00000200 -#define FILE_OPEN_FOR_RECOVERY 0x00000400 +#define FILE_OPEN_REMOTE_INSTANCE 0x00000400 #define FILE_RANDOM_ACCESS 0x00000800 #define FILE_DELETE_ON_CLOSE 0x00001000 #define FILE_OPEN_BY_FILE_ID 0x00002000 @@ -1553,7 +1554,7 @@ typedef struct _KEY_MULTIPLE_VALUE_INFORMATION ULONG Type; } KEY_MULTIPLE_VALUE_INFORMATION, *PKEY_MULTIPLE_VALUE_INFORMATION; -typedef VOID (*PTIMER_APC_ROUTINE) ( PVOID, ULONG, LONG ); +typedef VOID (CALLBACK *PTIMER_APC_ROUTINE) ( PVOID, ULONG, LONG ); typedef enum _EVENT_TYPE { NotificationEvent, diff --git a/reactos/include/psdk/winuser.h b/reactos/include/psdk/winuser.h index f08e1fab7b4..17d17dfcb24 100644 --- a/reactos/include/psdk/winuser.h +++ b/reactos/include/psdk/winuser.h @@ -1993,11 +1993,16 @@ extern "C" { #define SBM_ENABLE_ARROWS 228 #define SBM_GETPOS 225 #define SBM_GETRANGE 227 -#define SBM_GETSCROLLINFO 234 #define SBM_SETPOS 224 #define SBM_SETRANGE 226 #define SBM_SETRANGEREDRAW 230 +#if (_WIN32_WINNT >= 0x0400) +#define SBM_GETSCROLLINFO 234 #define SBM_SETSCROLLINFO 233 +#endif +#if (_WIN32_WINNT >= 0x0501) +#define SBM_GETSCROLLBARINFO 235 +#endif #define STM_GETICON 369 #define STM_GETIMAGE 371 #define STM_SETICON 368 @@ -2441,8 +2446,18 @@ extern "C" { #define ODS_DISABLED 4 #define ODS_CHECKED 8 #define ODS_FOCUS 16 +#if(WINVER >= 0x0400) #define ODS_DEFAULT 32 #define ODS_COMBOBOXEDIT 4096 +#endif +#if(WINVER >= 0x0500) +#define ODS_HOTLIGHT 0x0040 +#define ODS_INACTIVE 0x0080 +#if(_WIN32_WINNT >= 0x0500) +#define ODS_NOACCEL 0x0100 +#define ODS_NOFOCUSRECT 0x0200 +#endif +#endif #define IDHOT_SNAPWINDOW (-1) #define IDHOT_SNAPDESKTOP (-2) #define DBWF_LPARAMPOINTER 0x8000 diff --git a/reactos/include/psdk/wtypes.idl b/reactos/include/psdk/wtypes.idl index 6a3f9a9109e..4a311ba5695 100644 --- a/reactos/include/psdk/wtypes.idl +++ b/reactos/include/psdk/wtypes.idl @@ -91,16 +91,13 @@ DECLARE_HANDLE(HWINSTA); DECLARE_HANDLE(HKL); DECLARE_HANDLE(HGDIOBJ); -cpp_quote("#if 0") -typedef HANDLE HMONITOR; -cpp_quote("#endif /* 0 */") - typedef HANDLE HDWP; typedef LONG_PTR LRESULT; typedef LONG HRESULT; typedef DWORD LCID; +typedef USHORT LANGID; typedef unsigned __int64 DWORDLONG; typedef __int64 LONGLONG; @@ -447,7 +444,7 @@ typedef struct tagRemHGLOBAL { typedef union _userHGLOBAL switch(long fContext) u { case WDT_INPROC_CALL: long hInproc; case WDT_REMOTE_CALL: FLAGGED_BYTE_BLOB *hRemote; - default: long hGlobal; + case WDT_INPROC64_CALL: __int64 hInproc64; } userHGLOBAL; typedef [unique] userHGLOBAL *wireHGLOBAL; @@ -463,7 +460,7 @@ typedef struct tagRemHMETAFILEPICT { typedef union _userHMETAFILE switch(long fContext) u { case WDT_INPROC_CALL: long hInproc; case WDT_REMOTE_CALL: BYTE_BLOB *hRemote; - default: long hGlobal; + case WDT_INPROC64_CALL: __int64 hInproc64; } userHMETAFILE; typedef [unique] userHMETAFILE *wireHMETAFILE; @@ -478,7 +475,7 @@ typedef struct _remoteMETAFILEPICT { typedef union _userHMETAFILEPICT switch(long fContext) u { case WDT_INPROC_CALL: long hInproc; case WDT_REMOTE_CALL: remoteMETAFILEPICT *hRemote; - default: long hGlobal; + case WDT_INPROC64_CALL: __int64 hInproc64; } userHMETAFILEPICT; typedef [unique] userHMETAFILEPICT *wireHMETAFILEPICT; @@ -491,7 +488,7 @@ typedef struct tagRemHENHMETAFILE { typedef union _userHENHMETAFILE switch(long fContext) u { case WDT_INPROC_CALL: long hInproc; case WDT_REMOTE_CALL: BYTE_BLOB *hRemote; - default: long hGlobal; + case WDT_INPROC64_CALL: __int64 hInproc64; } userHENHMETAFILE; typedef [unique] userHENHMETAFILE *wireHENHMETAFILE; @@ -516,7 +513,7 @@ typedef struct _userBITMAP { typedef union _userHBITMAP switch(long fContext) u { case WDT_INPROC_CALL: long hInproc; case WDT_REMOTE_CALL: userBITMAP *hRemote; - default: long hGlobal; + case WDT_INPROC64_CALL: __int64 hInproc64; } userHBITMAP; typedef [unique] userHBITMAP *wireHBITMAP; @@ -535,7 +532,7 @@ typedef struct tagrpcLOGPALETTE { typedef union _userHPALETTE switch(long fContext) u { case WDT_INPROC_CALL: long hInproc; case WDT_REMOTE_CALL: rpcLOGPALETTE *hRemote; - default: long hGlobal; + case WDT_INPROC64_CALL: __int64 hInproc64; } userHPALETTE; typedef [unique] userHPALETTE *wireHPALETTE; @@ -585,36 +582,6 @@ typedef struct tagMSG POINT pt; } MSG, *PMSG, *NPMSG, *LPMSG; -typedef struct tagCREATESTRUCTA { - LPVOID lpCreateParams; - HINSTANCE hInstance; - HMENU hMenu; - HWND hwndParent; - int cy; - int cx; - int y; - int x; - LONG style; - LPCSTR lpszName; - LPCSTR lpszClass; - DWORD dwExStyle; -} CREATESTRUCTA, *LPCREATESTRUCTA; - -typedef struct tagCREATESTRUCTW { - LPVOID lpCreateParams; - HINSTANCE hInstance; - HMENU hMenu; - HWND hwndParent; - int cy; - int cx; - int y; - int x; - LONG style; - LPCWSTR lpszName; - LPCWSTR lpszClass; - DWORD dwExStyle; -} CREATESTRUCTW, *LPCREATESTRUCTW; - cpp_quote("#endif") /******************** GUID TYPES ********************/ @@ -870,6 +837,15 @@ typedef union switch(DWORD tyspec) } ByObjectId; } uCLSSPEC; +cpp_quote("#ifndef PROPERTYKEY_DEFINED") +cpp_quote("#define PROPERTYKEY_DEFINED") +typedef struct _tagpropertykey +{ + GUID fmtid; + DWORD pid; +} PROPERTYKEY; +cpp_quote("#endif /*PROPERTYKEY_DEFINED*/") + } /* interface IWinTypes */ cpp_quote("#ifdef _MSC_VER") diff --git a/reactos/include/psdk/xmldom.idl b/reactos/include/psdk/xmldom.idl index 89263c4b75c..d5d51ff2588 100644 --- a/reactos/include/psdk/xmldom.idl +++ b/reactos/include/psdk/xmldom.idl @@ -21,10 +21,6 @@ import "ocidl.idl"; -cpp_quote("#ifndef __xmldom_h__") -cpp_quote("#define __xmldom_h__") -cpp_quote("#endif") - interface IXMLDOMImplementation; interface IXMLDOMNode; interface IXMLDOMDocumentFragment; @@ -268,7 +264,7 @@ interface IXMLDOMDocument : IXMLDOMNode [out,retval] VARIANT_BOOL *isSuccessful ); [propget, id(DISPID_READYSTATE)] - HRESULT readyState( [out,retval] long *value ); + HRESULT readyState( [out,retval] LONG *value ); [propget, id(DISPID_XMLDOM_DOCUMENT_PARSEERROR)] HRESULT parseError( [out,retval] IXMLDOMParseError **errorObj ); @@ -334,11 +330,11 @@ pointer_default(unique) interface IXMLDOMNodeList : IDispatch { [propget, id(DISPID_VALUE)] - HRESULT item( [in] long index, + HRESULT item( [in] LONG index, [out,retval] IXMLDOMNode **listItem ); [propget, id(DISPID_DOM_NODELIST_LENGTH)] - HRESULT length( [out,retval] long *listLength ); + HRESULT length( [out,retval] LONG *listLength ); [id(DISPID_XMLDOM_NODELIST_NEXTNODE)] HRESULT nextNode( [out,retval] IXMLDOMNode **nextItem ); @@ -375,11 +371,11 @@ interface IXMLDOMNamedNodeMap : IDispatch [out,retval] IXMLDOMNode **namedItem ); [propget, id(DISPID_VALUE)] - HRESULT item( [in] long index, + HRESULT item( [in] LONG index, [out,retval] IXMLDOMNode **listItem ); [propget, id(DISPID_DOM_NODELIST_LENGTH)] - HRESULT length( [out,retval] long *listLength ); + HRESULT length( [out,retval] LONG *listLength ); [id(DISPID_XMLDOM_NAMEDNODEMAP_GETQUALIFIEDITEM)] HRESULT getQualifiedItem( [in] BSTR baseName, @@ -435,27 +431,27 @@ interface IXMLDOMCharacterData : IXMLDOMNode HRESULT data( [in] BSTR data ); [propget, id(DISPID_DOM_DATA_LENGTH)] - HRESULT length( [out,retval] long *dataLength ); + HRESULT length( [out,retval] LONG *dataLength ); [id(DISPID_DOM_DATA_SUBSTRING)] - HRESULT substringData( [in] long offset, - [in] long count, + HRESULT substringData( [in] LONG offset, + [in] LONG count, [out,retval] BSTR *data ); [id(DISPID_DOM_DATA_APPEND)] HRESULT appendData( [in] BSTR data ); [id(DISPID_DOM_DATA_INSERT)] - HRESULT insertData( [in] long offset, + HRESULT insertData( [in] LONG offset, [in] BSTR data ); [id(DISPID_DOM_DATA_DELETE)] - HRESULT deleteData( [in] long offset, - [in] long count ); + HRESULT deleteData( [in] LONG offset, + [in] LONG count ); [id(DISPID_DOM_DATA_REPLACE)] - HRESULT replaceData( [in] long offset, - [in] long count, + HRESULT replaceData( [in] LONG offset, + [in] LONG count, [in] BSTR data ); } @@ -540,7 +536,7 @@ pointer_default(unique) interface IXMLDOMText : IXMLDOMCharacterData { [id(DISPID_DOM_TEXT_SPLITTEXT)] - HRESULT splitText( [in] long offset, + HRESULT splitText( [in] LONG offset, [out,retval] IXMLDOMText **rightHandTextNode ); } @@ -703,7 +699,7 @@ uuid (3efaa426-272f-11d2-836f-0000f87a7782) interface IXMLDOMParseError : IDispatch { [propget, id(DISPID_VALUE)] - HRESULT errorCode([retval, out] long *errCode); + HRESULT errorCode([retval, out] LONG *errCode); [propget, id(DISPID_DOM_ERROR_URL)] HRESULT url([retval, out] BSTR *p); @@ -715,13 +711,13 @@ interface IXMLDOMParseError : IDispatch HRESULT srcText([retval, out] BSTR *p); [propget, id(DISPID_DOM_ERROR_LINE)] - HRESULT line([retval, out] long *lineNo); + HRESULT line([retval, out] LONG *lineNo); [propget, id(DISPID_DOM_ERROR_LINEPOS)] - HRESULT linepos([retval, out] long * linePos); + HRESULT linepos([retval, out] LONG * linePos); [propget, id(DISPID_DOM_ERROR_FILEPOS)] - HRESULT filepos([retval, out] long * filePos); + HRESULT filepos([retval, out] LONG * filePos); } [ @@ -788,7 +784,7 @@ interface IXMLHttpRequest : IDispatch HRESULT abort(); [propget, id(7)] - HRESULT status([out, retval] long *plStatus); + HRESULT status([out, retval] LONG *plStatus); [propget, id(8)] HRESULT statusText([out, retval] BSTR *bstrStatus); @@ -806,7 +802,7 @@ interface IXMLHttpRequest : IDispatch HRESULT responseStream([out, retval] VARIANT *pvarBody); [propget, id(13)] - HRESULT readyState([out, retval] long *plState); + HRESULT readyState([out, retval] LONG *plState); [propput, id(14)] HRESULT onreadystatechange([in] IDispatch *pReadyStateSink); diff --git a/reactos/include/psdk/xmllite.idl b/reactos/include/psdk/xmllite.idl new file mode 100644 index 00000000000..552b5d646b9 --- /dev/null +++ b/reactos/include/psdk/xmllite.idl @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2010 Nikolay Sivov + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +import "unknwn.idl"; +import "objidl.idl"; +import "oaidl.idl"; + +typedef enum XmlNodeType { + XmlNodeType_None = 0, + XmlNodeType_Element = 1, + XmlNodeType_Attribute = 2, + XmlNodeType_Text = 3, + XmlNodeType_CDATA = 4, + XmlNodeType_ProcessingInstruction = 7, + XmlNodeType_Comment = 8, + XmlNodeType_DocumentType = 10, + XmlNodeType_Whitespace = 13, + XmlNodeType_EndElement = 15, + XmlNodeType_XmlDeclaration = 17, + _XmlNodeType_Last = 17 +} XmlNodeType; + +/* IXmlReader */ +[ + local, + object, + uuid(7279fc81-709d-4095-b63d-69fe4b0d9030), + pointer_default(unique) +] +interface IXmlReader : IUnknown +{ + HRESULT SetInput( [in] IUnknown *input); + HRESULT GetProperty( [in] UINT property, [out] LONG_PTR *value); + HRESULT SetProperty( [in] UINT property, [in] LONG_PTR value); + HRESULT Read( [out] XmlNodeType *node_type); + HRESULT GetNodeType( [out] XmlNodeType *node_type); + HRESULT MoveToFirstAttribute(void); + HRESULT MoveToNextAttribute(void); + HRESULT MoveToAttributeByName( [in] LPCWSTR local_name, + [in] LPCWSTR namespaceUri); + HRESULT MoveToElement(void); + HRESULT GetQualifiedName( [out] LPCWSTR *qualifiedName, + [out] UINT *qualifiedName_length); + HRESULT GetNamespaceUri( [out] LPCWSTR *namespaceUri, + [out] UINT *nnamespaceUri_length); + HRESULT GetLocalName( [out] LPCWSTR *local_name, + [out] UINT *locale_name_length); + HRESULT GetPrefix( [out] LPCWSTR *prefix, + [out] UINT *prefix_length); + HRESULT GetValue( [out] LPCWSTR *value, + [out] UINT *value_length); + HRESULT ReadValueChunk( [out] WCHAR *buffer, + [in] UINT chunk_size, + [in,out] UINT *read); + HRESULT GetBaseUri( [out] LPCWSTR *baseUri, + [out] UINT *baseUri_length); + BOOL IsDefault(void); + BOOL IsEmptyElement(void); + HRESULT GetLineNumber( [out] UINT *lineNumber); + HRESULT GetLinePosition( [out] UINT *linePosition); + HRESULT GetAttributeCount( [out] UINT *attributeCount); + HRESULT GetDepth( [out] UINT *depth); + BOOL IsEOF(void); +} + +/* IXmlReader state */ +cpp_quote("typedef enum XmlReadState") +cpp_quote("{") +cpp_quote(" XmlReadState_Initial = 0,") +cpp_quote(" XmlReadState_Interactive = 1,") +cpp_quote(" XmlReadState_Error = 2,") +cpp_quote(" XmlReadState_EndOfFile = 3,") +cpp_quote(" XmlReadState_Closed = 4") +cpp_quote("} XmlReadState;") + +/* IXmlReader properties */ +cpp_quote("typedef enum XmlReaderProperty") +cpp_quote("{") +cpp_quote(" XmlReaderProperty_MultiLanguage = 0,") +cpp_quote(" XmlReaderProperty_ConformanceLevel = XmlReaderProperty_MultiLanguage + 1,") +cpp_quote(" XmlReaderProperty_RandomAccess = XmlReaderProperty_ConformanceLevel + 1,") +cpp_quote(" XmlReaderProperty_XmlResolver = XmlReaderProperty_RandomAccess + 1,") +cpp_quote(" XmlReaderProperty_DtdProcessing = XmlReaderProperty_XmlResolver + 1,") +cpp_quote(" XmlReaderProperty_ReadState = XmlReaderProperty_DtdProcessing + 1,") +cpp_quote(" XmlReaderProperty_MaxElementDepth = XmlReaderProperty_ReadState + 1,") +cpp_quote(" XmlReaderProperty_MaxEntityExpansion = XmlReaderProperty_MaxElementDepth + 1,") +cpp_quote(" _XmlReaderProperty_Last = XmlReaderProperty_MaxEntityExpansion") +cpp_quote("} XmlReaderProperty;") + +/* IXmlReader construction */ +cpp_quote("STDAPI CreateXmlReader(REFIID riid, void **ppvObject, IMalloc *pMalloc);") + +cpp_quote("typedef IUnknown IXmlReaderInput;") +cpp_quote("STDAPI CreateXmlReaderInputWithEncodingName(IUnknown *stream, IMalloc *pMalloc,") +cpp_quote(" LPCWSTR encoding, BOOL hint,") +cpp_quote(" LPCWSTR base_uri, IXmlReaderInput **ppInput);") diff --git a/reactos/include/reactos/arm/armddk.h b/reactos/include/reactos/arm/armddk.h index 178bb50f3fb..68262c2b9d7 100644 --- a/reactos/include/reactos/arm/armddk.h +++ b/reactos/include/reactos/arm/armddk.h @@ -28,10 +28,10 @@ // // FIXME: mmtypes.h? // -#define KIPCR 0xFFFFF000 -#define KI_USER_SHARED_DATA 0xFFFFE000 +#define KIP0PCRADDRESS 0xFFDFF000 +#define KI_USER_SHARED_DATA 0xFFDF0000 #define USPCR 0x7FFF0000 -#define PCR ((volatile KPCR * const)KIPCR) +#define PCR ((KPCR * const)KIP0PCRADDRESS) #define USERPCR ((volatile KPCR * const)USPCR) #define KeGetPcr() PCR #ifndef _WINNT_H @@ -47,25 +47,13 @@ extern ULONG_PTR MmUserProbeAddress; #define MM_SYSTEM_RANGE_START MmSystemRangeStart #define MM_USER_PROBE_ADDRESS MmUserProbeAddress #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 -#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC1400000 +#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000 // // Maximum IRQs // #define MAXIMUM_VECTOR 16 -// -// Just read it from the PCR -// -#define KeGetCurrentProcessorNumber() (int)PCR->Number -#define KeGetCurrentIrql() PCR->CurrentIrql -#define _KeGetCurrentThread() PCR->CurrentThread -#define _KeGetPreviousMode() PCR->CurrentThread->PreviousMode -#define _KeIsExecutingDpc() (PCR->DpcRoutineActive != 0) -#define KeGetCurrentThread() _KeGetCurrentThread() -#define KeGetPreviousMode() _KeGetPreviousMode() -#define KeGetDcacheFillSize() PCR->DcacheFillSize - // // Used to contain PFNs and PFN counts @@ -132,69 +120,42 @@ typedef struct _CONTEXT { // // Processor Control Region -// On ARM, it's actually readable from user-mode, much like KUSER_SHARED_DATA // #ifdef _WINNT_H -typedef -VOID -(*PKINTERRUPT_ROUTINE)(VOID); +#define KIRQL ULONG #endif typedef struct _KPCR { - ULONG MinorVersion; - ULONG MajorVersion; - PKINTERRUPT_ROUTINE InterruptRoutine[32]; - PVOID XcodeDispatch; - ULONG FirstLevelDcacheSize; - ULONG FirstLevelDcacheFillSize; - ULONG FirstLevelIcacheSize; - ULONG FirstLevelIcacheFillSize; - ULONG SecondLevelDcacheSize; - ULONG SecondLevelDcacheFillSize; - ULONG SecondLevelIcacheSize; - ULONG SecondLevelIcacheFillSize; + union + { + NT_TIB NtTib; + struct + { + struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; // Unused + PVOID Used_StackBase; // Unused + PVOID PerfGlobalGroupMask; + PVOID TssCopy; // Unused + ULONG ContextSwitches; + KAFFINITY SetMemberCopy; // Unused + PVOID Used_Self; + }; + }; + struct _KPCR *Self; struct _KPRCB *Prcb; - struct _TEB *Teb; - PVOID TlsArray; - ULONG DcacheFillSize; - ULONG IcacheAlignment; - ULONG IcacheFillSize; - ULONG ProcessorId; - ULONG ProfileInterval; - ULONG ProfileCount; - ULONG StallExecutionCount; - ULONG StallScaleFactor; - CCHAR Number; - PVOID DataBusError; - PVOID InstructionBusError; - ULONG CachePolicy; - ULONG AlignedCachePolicy; - UCHAR IrqlMask[32]; - ULONG IrqlTable[32]; - UCHAR CurrentIrql; + KIRQL Irql; + ULONG IRR; // Unused + ULONG IrrActive; // Unused + ULONG IDR; // Unused + PVOID KdVersionBlock; + PVOID IDT; // Unused + PVOID GDT; // Unused + PVOID TSS; // Unused + USHORT MajorVersion; + USHORT MinorVersion; KAFFINITY SetMember; - struct _KTHREAD *CurrentThread; - ULONG ReservedVectors; - KAFFINITY NotMember; - ULONG SystemReserved[6]; - ULONG DcacheAlignment; - ULONG HalReserved[64]; - BOOLEAN FirstLevelActive; - BOOLEAN DpcRoutineActive; - ULONG CurrentPid; - BOOLEAN OnInterruptStack; - PVOID SavedInitialStack; - PVOID SavedStackLimit; - PVOID SystemServiceDispatchStart; - PVOID SystemServiceDispatchEnd; - PVOID InterruptStack; - PVOID PanicStack; - PVOID BadVaddr; - PVOID InitialStack; - PVOID StackLimit; - ULONG QuantumEnd; - PVOID PerfGlobalGroupMask; - ULONG ContextSwitches; + ULONG StallScaleFactor; + UCHAR SpareUnused; + UCHAR Number; } KPCR, *PKPCR; // @@ -203,7 +164,7 @@ typedef struct _KPCR FORCEINLINE struct _TEB* NtCurrentTeb(VOID) { - return (struct _TEB*)USERPCR->Teb; + return (struct _TEB*)USERPCR->Used_Self; } #ifndef _WINNT_H diff --git a/reactos/include/reactos/arm/peripherals/pl011.h b/reactos/include/reactos/arm/peripherals/pl011.h index 6fa3cdc1fc9..857eab4e188 100644 --- a/reactos/include/reactos/arm/peripherals/pl011.h +++ b/reactos/include/reactos/arm/peripherals/pl011.h @@ -11,7 +11,7 @@ // // UART Registers // -#define UART_BASE (ULONG_PTR)0xE00F1000 /* HACK: freeldr mapped it here */ +#define UART_BASE (ULONG_PTR)0x101F1000 #define UART_PL01x_DR (UART_BASE + 0x00) #define UART_PL01x_RSR (UART_BASE + 0x04) diff --git a/reactos/include/reactos/arm/peripherals/pl190.h b/reactos/include/reactos/arm/peripherals/pl190.h index a6e336a6abf..a452f50abae 100644 --- a/reactos/include/reactos/arm/peripherals/pl190.h +++ b/reactos/include/reactos/arm/peripherals/pl190.h @@ -11,10 +11,10 @@ // // VIC Registers // -#define VIC_BASE (ULONG_PTR)0xE0040000 /* HACK: freeldr mapped it here */ +#define VIC_BASE (ULONG_PTR)0x10140000 -#define VIC_INT_STATUS (VIC_BASE + 0x00) -#define VIC_INT_ENABLE (VIC_BASE + 0x10) -#define VIC_INT_CLEAR (VIC_BASE + 0x14) -#define VIC_SOFT_INT (VIC_BASE + 0x18) -#define VIC_SOFT_INT_CLEAR (VIC_BASE + 0x1C) +#define VIC_INT_STATUS (PULONG)(VIC_BASE + 0x00) +#define VIC_INT_ENABLE (PULONG)(VIC_BASE + 0x10) +#define VIC_INT_CLEAR (PULONG)(VIC_BASE + 0x14) +#define VIC_SOFT_INT (PULONG)(VIC_BASE + 0x18) +#define VIC_SOFT_INT_CLEAR (PULONG)(VIC_BASE + 0x1C) diff --git a/reactos/include/reactos/arm/peripherals/sp804.h b/reactos/include/reactos/arm/peripherals/sp804.h index 68acd91b149..44a09b6f34d 100644 --- a/reactos/include/reactos/arm/peripherals/sp804.h +++ b/reactos/include/reactos/arm/peripherals/sp804.h @@ -11,7 +11,7 @@ // // Timer Registers // -#define TIMER_BASE(x) (ULONG_PTR)(0xE00E2000 + (x * 0x1000)) /* HACK: freeldr mapped it here */ +#define TIMER_BASE(x) (ULONG_PTR)(0x101E2000 + (x * 0x1000)) #define TIMER0_LOAD TIMER_BASE(0) + 0x00 #define TIMER0_VALUE TIMER_BASE(0) + 0x04 #define TIMER0_CONTROL TIMER_BASE(0) + 0x08 diff --git a/reactos/include/reactos/idl/lsa.idl b/reactos/include/reactos/idl/lsa.idl index b0f038692f1..706554a0717 100644 --- a/reactos/include/reactos/idl/lsa.idl +++ b/reactos/include/reactos/idl/lsa.idl @@ -302,13 +302,11 @@ typedef struct _POLICY_MODIFICATION_INFO { LARGE_INTEGER ModifiedId; LARGE_INTEGER DatabaseCreationTime; } POLICY_MODIFICATION_INFO, *PPOLICY_MODIFICATION_INFO; -cpp_quote("#endif") -typedef struct _POLICY_FULL_SET_INFO { +typedef struct _POLICY_AUDIT_FULL_SET_INFO { BOOL ShutDownOnFull; -} POLICY_FULL_SET_INFO, *PPOLICY_FULL_SET_INFO; +} POLICY_AUDIT_FULL_SET_INFO, *PPOLICY_AUDIT_FULL_SET_INFO; -cpp_quote("#ifndef _NTSECAPI_H") typedef struct _POLICY_AUDIT_FULL_QUERY_INFO { BOOL ShutDownOnFull; BOOL LogIsFull; @@ -323,23 +321,23 @@ typedef struct _LSAPR_POLICY_DNS_DOMAIN_INFO { PRPC_SID Sid; } LSAPR_POLICY_DNS_DOMAIN_INFO, *PLSAPR_POLICY_DNS_DOMAIN_INFO; -/*typedef +typedef [switch_type(POLICY_INFORMATION_CLASS)] union _LSAPR_POLICY_INFORMATION { [case(PolicyAuditLogInformation)] POLICY_AUDIT_LOG_INFO PolicyAuditLogInfo; - [case(PolicyAuditEventsInformation)] POLICY_AUDIT_EVENTS_INFO PolicyAuditEventsInfo; - [case(PolicyPrimaryDomainInformation)] POLICY_PRIMARY_DOM_INFO PolicyPrimaryDomInfo; - [case(PolicyPdAccountInformation)] POLICY_PD_ACCOUNT_INFO PolicyPdAccountInfo; - [case(PolicyAccountDomainInformation)] POLICY_ACCOUNT_DOM_INFO PolicyAccountDomainInfo; + [case(PolicyAuditEventsInformation)] LSAPR_POLICY_AUDIT_EVENTS_INFO PolicyAuditEventsInfo; + [case(PolicyPrimaryDomainInformation)] LSAPR_POLICY_PRIMARY_DOM_INFO PolicyPrimaryDomInfo; + [case(PolicyPdAccountInformation)] LSAPR_POLICY_PD_ACCOUNT_INFO PolicyPdAccountInfo; + [case(PolicyAccountDomainInformation)] LSAPR_POLICY_ACCOUNT_DOM_INFO PolicyAccountDomainInfo; [case(PolicyLsaServerRoleInformation)] POLICY_LSA_SERVER_ROLE_INFO PolicyServerRoleInfo; - [case(PolicyReplicaSourceInformation)] POLICY_REPLICA_SRCE_INFO PolicyReplicaSourceInfo; + [case(PolicyReplicaSourceInformation)] POLICY_LSA_REPLICA_SRCE_INFO PolicyReplicaSourceInfo; [case(PolicyDefaultQuotaInformation)] POLICY_DEFAULT_QUOTA_INFO PolicyDefaultQuotaInfo; [case(PolicyModificationInformation)] POLICY_MODIFICATION_INFO PolicyModificationInfo; [case(PolicyAuditFullSetInformation)] POLICY_AUDIT_FULL_SET_INFO PolicyAuditFullSetInfo; [case(PolicyAuditFullQueryInformation)] POLICY_AUDIT_FULL_QUERY_INFO PolicyAuditFullQueryInfo; - [case(PolicyDnsDomainInformation)] LSAPR_DNS_DOMAIN_INFO PolicyDnsDomainInfo; - [case(PolicyDnsDomainInformationInt)] LSAPR_DNS_DOMAIN_INFO PolicyDnsDomainInfoInt; + [case(PolicyDnsDomainInformation)] LSAPR_POLICY_DNS_DOMAIN_INFO PolicyDnsDomainInfo; + [case(PolicyDnsDomainInformationInt)] LSAPR_POLICY_DNS_DOMAIN_INFO PolicyDnsDomainInfoInt; [case(PolicyLocalAccountDomainInformation)] LSAPR_POLICY_ACCOUNT_DOM_INFO PolicyLocalAccountDomainInfo; -} LSAPR_POLICY_INFORMATION, *PLSAPR_POLICY_INFORMATION;*/ +} LSAPR_POLICY_INFORMATION, *PLSAPR_POLICY_INFORMATION; typedef struct _LSAPR_TRUSTED_ENUM_BUFFER { DWORD EntriesRead; @@ -639,15 +637,13 @@ interface lsarpc NTSTATUS LsarQueryInformationPolicy( [in] LSAPR_HANDLE PolicyHandle, [in] POLICY_INFORMATION_CLASS InformationClass, - [in] unsigned long PolicyInformation); - /* FIXME: should be [in, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION PolicyInformation); */ + [out, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION *PolicyInformation); /* Function 8 */ NTSTATUS LsarSetInformationPolicy( [in] LSAPR_HANDLE PolicyHandle, [in] POLICY_INFORMATION_CLASS InformationClass, - [out] unsigned long *PolicyInformation); - /* FIXME: should be [out, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION *PolicyInformation); */ + [in, switch_is(InformationClass)] PLSAPR_POLICY_INFORMATION PolicyInformation); /* Function 9 */ NTSTATUS LsarClearAuditLog( diff --git a/reactos/include/reactos/mc/mc.rbuild b/reactos/include/reactos/mc/mc.rbuild index 406e9e67864..eb06ec499ca 100644 --- a/reactos/include/reactos/mc/mc.rbuild +++ b/reactos/include/reactos/mc/mc.rbuild @@ -1,5 +1,5 @@ - + ntstatus.mc diff --git a/reactos/include/reactos/services/services.h b/reactos/include/reactos/services/services.h index 21a6085bf6c..009c2506b7d 100644 --- a/reactos/include/reactos/services/services.h +++ b/reactos/include/reactos/services/services.h @@ -11,16 +11,19 @@ #define SERVICE_CONTROL_START 0 -DECLARE_HANDLE(CLIENT_HANDLE); - typedef struct _SCM_CONTROL_PACKET { DWORD dwControl; - CLIENT_HANDLE hClient; + SERVICE_STATUS_HANDLE hServiceStatus; DWORD dwSize; WCHAR szArguments[1]; } SCM_CONTROL_PACKET, *PSCM_CONTROL_PACKET; +typedef struct _SCM_REPLY_PACKET +{ + DWORD dwError; +} SCM_REPLY_PACKET, *PSCM_REPLY_PACKET; + #endif /* __SERVICES_SERVICES_H__ */ /* EOF */ diff --git a/reactos/include/reactos/subsys/csrss/csrss.h b/reactos/include/reactos/subsys/csrss/csrss.h index b23bf0c29e2..1f276fa16d9 100644 --- a/reactos/include/reactos/subsys/csrss/csrss.h +++ b/reactos/include/reactos/subsys/csrss/csrss.h @@ -38,6 +38,12 @@ typedef struct BOOL bInheritHandles; } CSRSS_CREATE_PROCESS, *PCSRSS_CREATE_PROCESS; +typedef struct +{ + CLIENT_ID ClientId; + HANDLE ThreadHandle; +} CSRSS_CREATE_THREAD, *PCSRSS_CREATE_THREAD; + typedef struct { ULONG Dummy; @@ -544,6 +550,7 @@ typedef struct #define GET_CONSOLE_ALIASES_EXES (0x3C) #define GET_CONSOLE_ALIASES_EXES_LENGTH (0x3D) #define GENERATE_CTRL_EVENT (0x3E) +#define CREATE_THREAD (0x3F) /* Keep in sync with definition below. */ #define CSRSS_HEADER_SIZE (sizeof(PORT_MESSAGE) + sizeof(ULONG) + sizeof(NTSTATUS)) @@ -557,6 +564,7 @@ typedef struct _CSR_API_MESSAGE union { CSRSS_CREATE_PROCESS CreateProcessRequest; + CSRSS_CREATE_THREAD CreateThreadRequest; CSRSS_CONNECT_PROCESS ConnectRequest; CSRSS_WRITE_CONSOLE WriteConsoleRequest; CSRSS_READ_CONSOLE ReadConsoleRequest; diff --git a/reactos/include/reactos/win32k/ntuser.h b/reactos/include/reactos/win32k/ntuser.h index 5bd230a9b48..3ce27a1d468 100644 --- a/reactos/include/reactos/win32k/ntuser.h +++ b/reactos/include/reactos/win32k/ntuser.h @@ -6,6 +6,21 @@ typedef struct _THREADINFO *PTHREADINFO; struct _DESKTOP; struct _WND; +typedef enum _USERTHREADINFOCLASS +{ + UserThreadShutdownInformation, + UserThreadFlags, + UserThreadTaskName, + UserThreadWOWInformation, + UserThreadHungStatus, + UserThreadInitiateShutdown, + UserThreadEndShutdown, + UserThreadUseActiveDesktop, + UserThreadUseDesktop, + UserThreadRestoreDesktop, + UserThreadCsrApiPort, +} USERTHREADINFOCLASS; + typedef struct _LARGE_UNICODE_STRING { ULONG Length; @@ -206,6 +221,69 @@ C_ASSERT(sizeof(CLIENTINFO) <= sizeof(((PTEB)0)->Win32ClientInfo)); #define GetWin32ClientInfo() ((PCLIENTINFO)(NtCurrentTeb()->Win32ClientInfo)) +/* Menu Item fType. */ +#define MFT_RTOL 0x6000 + +typedef struct tagITEM +{ + UINT fType; + UINT fState; + UINT wID; + struct tagMENU* spSubMenu; /* Pop-up menu. */ + HANDLE hbmpChecked; + HANDLE hbmpUnchecked; + USHORT* lpstr; /* Item text pointer. */ + ULONG cch; + DWORD_PTR dwItemData; + ULONG xItem; /* Item position. left */ + ULONG yItem; /* " top */ + ULONG cxItem; /* Item Size Width */ + ULONG cyItem; /* " Height */ + ULONG dxTab; /* X position of text after Tab */ + ULONG ulX; /* underline.. start position */ + ULONG ulWidth; /* underline.. width */ + HBITMAP hbmp; /* bitmap */ + INT cxBmp; /* Width Maximum size of the bitmap items in MIIM_BITMAP state */ + INT cyBmp; /* Height " */ +} ITEM, *PITEM; + +typedef struct tagMENULIST +{ + struct tagMENULIST* pNext; + struct tagMENU* pMenu; +} MENULIST, *PMENULIST; + +/* Menu fFlags, upper byte is MNS_X style flags. */ +#define MNF_POPUP 0x0001 +#define MNF_UNDERLINE 0x0004 +#define MNF_INACTIVE 0x0010 +#define MNF_RTOL 0x0020 +#define MNF_DESKTOPMN 0x0040 +#define MNF_SYSDESKMN 0x0080 +#define MNF_SYSSUBMENU 0x0100 + +typedef struct tagMENU +{ + PROCDESKHEAD head; + ULONG fFlags; /* [Style flags | Menu flags] */ + INT iItem; /* nPos of selected item, if -1 not selected. */ + UINT cAlloced; /* Number of allocated items. Inc's of 8 */ + UINT cItems; /* Number of items in the menu */ + ULONG cxMenu; /* Width of the whole menu */ + ULONG cyMenu; /* Height of the whole menu */ + ULONG cxTextAlign; /* Offset of text when items have both bitmaps and text */ + struct _WND *spwndNotify; /* window receiving the messages for ownerdraw */ + PITEM rgItems; /* Array of menu items */ + struct tagMENULIST* pParentMenus; /* If this is SubMenu, list of parents. */ + DWORD dwContextHelpId; + ULONG cyMax; /* max height of the whole menu, 0 is screen height */ + DWORD_PTR dwMenuData; /* application defined value */ + HBRUSH hbrBack; /* brush for menu background */ + INT iTop; /* Current scroll position Top */ + INT iMaxTop; /* Current scroll position Max Top */ + DWORD dwArrowsOn:2; /* Arrows: 0 off, 1 on, 2 to the top, 3 to the bottom. */ +} MENU, *PMENU; + typedef struct _REGISTER_SYSCLASS { /* This is a reactos specific class used to initialize the @@ -2618,13 +2696,14 @@ NtUserSetInformationProcess( DWORD dwUnknown3, DWORD dwUnknown4); -DWORD +NTSTATUS NTAPI NtUserSetInformationThread( - DWORD dwUnknown1, - DWORD dwUnknown2, - DWORD dwUnknown3, - DWORD dwUnknown4); + IN HANDLE ThreadHandle, + IN USERTHREADINFOCLASS ThreadInformationClass, + IN PVOID ThreadInformation, + IN ULONG ThreadInformationLength +); DWORD NTAPI @@ -3200,8 +3279,8 @@ typedef struct tagROSMENUITEMINFO HBITMAP hbmpItem; /* ----------- Extra ----------- */ RECT Rect; /* Item area (relative to menu window) */ - UINT XTab; /* X position of text after Tab */ - LPWSTR Text; /* Copy of the text pointer in MenuItem->Text */ + UINT dxTab; /* X position of text after Tab */ + LPWSTR lpstr; /* Copy of the text pointer in MenuItem->Text */ } ROSMENUITEMINFO, *PROSMENUITEMINFO; BOOL diff --git a/reactos/include/reactos/wine/config.h b/reactos/include/reactos/wine/config.h index cb26f59512c..406b5fb895d 100644 --- a/reactos/include/reactos/wine/config.h +++ b/reactos/include/reactos/wine/config.h @@ -5,6 +5,9 @@ #define __WINE_CONFIG_H +/* Define to a function attribute for Microsoft hotpatch assembly prefix. */ +#define DECLSPEC_HOTPATCH + /* Specifies the compiler flag that forces a short wchar_t */ #define CC_FLAG_SHORT_WCHAR "-fshort-wchar" @@ -976,17 +979,28 @@ #define YYTEXT_POINTER 1 /* Define to a macro to output a .cfi assembly pseudo-op */ -#define __ASM_CFI(x) +#define __ASM_CFI(str) str + +/* Define to a macro to define an assembly function */ +#define __ASM_DEFINE_FUNC(name,suffix,code) asm(".text\n\t.align 4\n\t.globl _" #name suffix "\n\t.def _" #name suffix "; .scl 2; .type 32; .endef\n_" #name suffix ":\n\t.cfi_startproc\n\t" code "\n\t.cfi_endproc"); /* Define to a macro to generate an assembly function directive */ #define __ASM_FUNC(name) ".def " __ASM_NAME(name) "; .scl 2; .type 32; .endef" +/* Define to a macro to generate an assembly function with C calling + convention */ +#define __ASM_GLOBAL_FUNC(name,code) __ASM_DEFINE_FUNC(name,"",code) + /* Define to a macro to generate an assembly name from a C symbol */ #define __ASM_NAME(name) "_" name /* Define to a macro to generate an stdcall suffix */ #define __ASM_STDCALL(args) "@" #args +/* Define to a macro to generate an assembly function with stdcall calling + convention */ +#define __ASM_STDCALL_FUNC(name,args,code) __ASM_DEFINE_FUNC(name,__ASM_STDCALL(args),code) + /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ diff --git a/reactos/include/reactos/wine/mscvpdb.h b/reactos/include/reactos/wine/mscvpdb.h index 9d52a655b56..2aefa879a90 100644 --- a/reactos/include/reactos/wine/mscvpdb.h +++ b/reactos/include/reactos/wine/mscvpdb.h @@ -1642,14 +1642,28 @@ struct startend unsigned int end; }; +#define LT2_LINES_BLOCK 0x000000f2 +#define LT2_FILES_BLOCK 0x000000f4 + /* there's a new line tab structure from MS Studio 2005 and after - * it's made of: - * DWORD 000000f4 - * DWORD lineblk_offset (counting bytes after this field) - * an array of codeview_linetab2_file structures - * an array (starting at ) of codeview_linetab2_block structures + * it's made of a list of codeview_linetab2 blocks. + * We've only seen (so far) list with a single LT2_FILES_BLOCK and several + * LT2_LINES_BLOCK. The LT2_FILES block has been encountered either as first + * or last block of the list. + * A LT2_FILES contains one or several codeview_linetab2_file:s */ +struct codeview_linetab2 +{ + DWORD header; + DWORD size_of_block; +}; + +static inline const struct codeview_linetab2* codeview_linetab2_next_block(const struct codeview_linetab2* lt2) +{ + return (const struct codeview_linetab2*)((const char*)(lt2 + 1) + lt2->size_of_block); +} + struct codeview_linetab2_file { DWORD offset; /* offset in string table for filename */ @@ -1658,16 +1672,21 @@ struct codeview_linetab2_file WORD pad0; /* always 0 */ }; -struct codeview_linetab2_block +struct codeview_lt2blk_files { - DWORD header; /* 0x000000f2 */ - DWORD size_of_block; /* next block is at # bytes after this field */ - DWORD start; /* start address of function with line numbers */ - DWORD seg; /* segment of function with line numbers */ - DWORD size; /* size of function with line numbers */ - DWORD file_offset; /* offset for accessing corresponding codeview_linetab2_file */ - DWORD nlines; /* number of lines in this block */ - DWORD size_lines; /* number of bytes following for line number information */ + struct codeview_linetab2 lt2; /* LT2_FILES */ + struct codeview_linetab2_file file[1]; +}; + +struct codeview_lt2blk_lines +{ + struct codeview_linetab2 lt2; /* LT2_LINE_BLOCK */ + DWORD start; /* start address of function with line numbers */ + DWORD seg; /* segment of function with line numbers */ + DWORD size; /* size of function with line numbers */ + DWORD file_offset; /* offset for accessing corresponding codeview_linetab2_file */ + DWORD nlines; /* number of lines in this block */ + DWORD size_lines; /* number of bytes following for line number information */ struct { DWORD offset; /* offset (from :) for line number */ DWORD lineno; /* the line number (OR:ed with 0x80000000 why ???) */ diff --git a/reactos/include/reactos/wine/port.h b/reactos/include/reactos/wine/port.h index 3b1b1c06d3c..6b293173ec2 100644 --- a/reactos/include/reactos/wine/port.h +++ b/reactos/include/reactos/wine/port.h @@ -148,29 +148,6 @@ struct statfs; #endif -/* Macros to define assembler functions somewhat portably */ - -#if defined(__GNUC__) && !defined(__INTERIX) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(__APPLE__) -# define __ASM_GLOBAL_FUNC(name,code) \ - __asm__( ".text\n\t" \ - ".align 4\n\t" \ - ".globl " __ASM_NAME(#name) "\n\t" \ - __ASM_FUNC(#name) "\n" \ - __ASM_NAME(#name) ":\n\t" \ - code \ - "\n\t.previous" ); -#else /* defined(__GNUC__) && !defined(__MINGW32__) && !defined(__APPLE__) */ -# define __ASM_GLOBAL_FUNC(name,code) \ - void __asm_dummy_##name(void) { \ - asm( ".align 4\n\t" \ - ".globl " __ASM_NAME(#name) "\n\t" \ - __ASM_FUNC(#name) "\n" \ - __ASM_NAME(#name) ":\n\t" \ - code ); \ - } -#endif /* __GNUC__ */ - - /* Constructor functions */ #ifdef __GNUC__ diff --git a/reactos/include/reactos/wine/rpcfc.h b/reactos/include/reactos/wine/rpcfc.h index ee7ba7fb1ff..53dd1633087 100644 --- a/reactos/include/reactos/wine/rpcfc.h +++ b/reactos/include/reactos/wine/rpcfc.h @@ -167,6 +167,7 @@ #define RPC_FC_PROC_OIF_OBJECT 0x04 #define RPC_FC_PROC_OIF_RPCFLAGS 0x08 #define RPC_FC_PROC_OIF_OBJ_V2 0x20 +#define RPC_FC_PROC_OIF_HAS_COMM_OR_FAULT 0x20 #define RPC_FC_PROC_OIF_NEWINIT 0x40 #define RPC_FC_PROC_PF_MUSTSIZE 0x0001 diff --git a/reactos/include/reactos/wine/wined3d.idl b/reactos/include/reactos/wine/wined3d.idl index 252c6e3aad9..6364f9cfe89 100644 --- a/reactos/include/reactos/wine/wined3d.idl +++ b/reactos/include/reactos/wine/wined3d.idl @@ -26,6 +26,7 @@ import "unknwn.idl"; cpp_quote("#if 0") +typedef HANDLE HMONITOR; typedef struct _RGNDATAHEADER { diff --git a/reactos/lib/3rdparty/freetype/src/base/ftbitmap.c b/reactos/lib/3rdparty/freetype/src/base/ftbitmap.c index 4c1cdf21888..c847eb00d24 100644 --- a/reactos/lib/3rdparty/freetype/src/base/ftbitmap.c +++ b/reactos/lib/3rdparty/freetype/src/base/ftbitmap.c @@ -445,15 +445,15 @@ { FT_Int val = ss[0]; /* avoid a byte->int cast on each line */ + tt[0] = (FT_Byte)( ( val & 0x80 ) ? 0xff : 0); + tt[1] = (FT_Byte)( ( val & 0x40 ) ? 0xff : 0); + tt[2] = (FT_Byte)( ( val & 0x20 ) ? 0xff : 0); + tt[3] = (FT_Byte)( ( val & 0x10 ) ? 0xff : 0); + tt[4] = (FT_Byte)( ( val & 0x08 ) ? 0xff : 0); + tt[5] = (FT_Byte)( ( val & 0x04 ) ? 0xff : 0); + tt[6] = (FT_Byte)( ( val & 0x02 ) ? 0xff : 0); + tt[7] = (FT_Byte)( ( val & 0x01 ) ? 0xff : 0); - tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 ); - tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 ); - tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 ); - tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 ); - tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 ); - tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 ); - tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 ); - tt[7] = (FT_Byte)( val & 0x01 ); tt += 8; ss += 1; @@ -468,7 +468,7 @@ for ( ; j > 0; j-- ) { - tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7); + tt[0] = (FT_Byte)( ( val & 0x80 ) ? 0xff : 0); val <<= 1; tt += 1; } diff --git a/reactos/lib/3rdparty/icu4ros/icu4ros.rbuild b/reactos/lib/3rdparty/icu4ros/icu4ros.rbuild index 93e7cd8d94d..4a2cc237168 100644 --- a/reactos/lib/3rdparty/icu4ros/icu4ros.rbuild +++ b/reactos/lib/3rdparty/icu4ros/icu4ros.rbuild @@ -1,5 +1,5 @@ - + diff --git a/reactos/lib/3rdparty/libsamplerate/libsamplerate.rbuild b/reactos/lib/3rdparty/libsamplerate/libsamplerate.rbuild index 1e71ddc1b12..ce52f5871dd 100644 --- a/reactos/lib/3rdparty/libsamplerate/libsamplerate.rbuild +++ b/reactos/lib/3rdparty/libsamplerate/libsamplerate.rbuild @@ -1,5 +1,5 @@ - + diff --git a/reactos/lib/atl/atl.rbuild b/reactos/lib/atl/atl.rbuild index 33eb6a54492..7193d4cbe4c 100644 --- a/reactos/lib/atl/atl.rbuild +++ b/reactos/lib/atl/atl.rbuild @@ -1,5 +1,5 @@ - + . diff --git a/reactos/lib/atl/atlbase.h b/reactos/lib/atl/atlbase.h index 1cce7972ca6..137acf11b4b 100644 --- a/reactos/lib/atl/atlbase.h +++ b/reactos/lib/atl/atlbase.h @@ -18,8 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef _atlbase_h -#define _atlbase_h +#pragma once #include "atlcore.h" #include "statreg.h" @@ -1004,5 +1003,3 @@ inline void *__stdcall AtlWinModuleExtractCreateWndData(_ATL_WIN_MODULE *pWinMod #ifndef _ATL_NO_AUTOMATIC_NAMESPACE using namespace ATL; #endif //!_ATL_NO_AUTOMATIC_NAMESPACE - -#endif // _atlbase_h diff --git a/reactos/lib/atl/atlcom.h b/reactos/lib/atl/atlcom.h index 04a4521c2e7..c86a67560b6 100644 --- a/reactos/lib/atl/atlcom.h +++ b/reactos/lib/atl/atlcom.h @@ -18,8 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef _atlcom_h -#define _atlcom_h +#pragma once namespace ATL { @@ -1129,5 +1128,3 @@ public: offsetofclass(ATL::IConnectionPointContainerImpl<_atl_conn_classtype>, _atl_conn_classtype)}, }; // namespace ATL - -#endif // _atlcom_h diff --git a/reactos/lib/atl/atlcore.h b/reactos/lib/atl/atlcore.h index 55fcfe54526..c2f22eacfdf 100644 --- a/reactos/lib/atl/atlcore.h +++ b/reactos/lib/atl/atlcore.h @@ -18,8 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef _atlcore_h -#define _atlcore_h +#pragma once #include #include @@ -202,5 +201,3 @@ public: extern CAtlBaseModule _AtlBaseModule; }; // namespace ATL - -#endif // _atlcore_h diff --git a/reactos/lib/atl/atlwin.h b/reactos/lib/atl/atlwin.h index c1a212bf2bc..de63eb0ac8f 100644 --- a/reactos/lib/atl/atlwin.h +++ b/reactos/lib/atl/atlwin.h @@ -18,8 +18,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef _atlin_h -#define _atlwin_h +#pragma once #ifdef __GNUC__ #define GCCU(x) x __attribute__((unused)) @@ -778,5 +777,3 @@ struct _ATL_WNDCLASSINFOW }; }; // namespace ATL - -#endif // _atlwin_h diff --git a/reactos/lib/atl/statreg.h b/reactos/lib/atl/statreg.h index e5e0553d583..2da4f2c8cf4 100644 --- a/reactos/lib/atl/statreg.h +++ b/reactos/lib/atl/statreg.h @@ -19,8 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef _statreg_h -#define _statreg_h +#pragma once class IRegistrarBase : public IUnknown { @@ -675,5 +674,3 @@ private: }; }; //namespace ATL - -#endif // _statreg_h diff --git a/reactos/lib/cmlib/cmdata.h b/reactos/lib/cmlib/cmdata.h index b4a3df7af9d..61629c6398a 100644 --- a/reactos/lib/cmlib/cmdata.h +++ b/reactos/lib/cmlib/cmdata.h @@ -5,8 +5,7 @@ * Copyright 2001 - 2005 Eric Kohl */ -#ifndef CMLIB_CMDATA_H -#define CMLIB_CMDATA_H +#pragma once #define REG_INIT_BLOCK_LIST_SIZE 32 #define REG_INIT_HASH_TABLE_SIZE 3 @@ -209,5 +208,3 @@ typedef struct _CELL_DATA WCHAR KeyString[ANYSIZE_ARRAY]; } u; } CELL_DATA, *PCELL_DATA; - -#endif /* CMLIB_CMDATA_H */ diff --git a/reactos/lib/cmlib/cmlib.h b/reactos/lib/cmlib/cmlib.h index ca289e7451b..fae049507d2 100644 --- a/reactos/lib/cmlib/cmlib.h +++ b/reactos/lib/cmlib/cmlib.h @@ -5,8 +5,7 @@ * Copyright 2001 - 2005 Eric Kohl */ -#ifndef CMLIB_H -#define CMLIB_H +#pragma once // // Debug support switch @@ -307,5 +306,3 @@ HvpCreateHiveFreeCellList( ULONG CMAPI HvpHiveHeaderChecksum( PHBASE_BLOCK HiveHeader); - -#endif /* CMLIB_H */ diff --git a/reactos/lib/cmlib/hivedata.h b/reactos/lib/cmlib/hivedata.h index 3501a8a684b..7bd8845048d 100644 --- a/reactos/lib/cmlib/hivedata.h +++ b/reactos/lib/cmlib/hivedata.h @@ -5,8 +5,7 @@ * Copyright 2001 - 2005 Eric Kohl */ -#ifndef CMLIB_HIVEDATA_H -#define CMLIB_HIVEDATA_H +#pragma once // // Hive operations @@ -305,5 +304,3 @@ typedef struct _HHIVE #define IsFreeCell(Cell)(Cell->Size >= 0) #define IsUsedCell(Cell)(Cell->Size < 0) - -#endif /* CMLIB_HIVEDATA_H */ diff --git a/reactos/lib/cmlib/hivewrt.c b/reactos/lib/cmlib/hivewrt.c index a4e3d3c3ccc..5cc20cfe503 100644 --- a/reactos/lib/cmlib/hivewrt.c +++ b/reactos/lib/cmlib/hivewrt.c @@ -23,7 +23,7 @@ HvpWriteLog( PVOID BlockPtr; BOOLEAN Success; - DPRINT1("FIXME: HvpWriteLog doesn't do anything atm\n"); + UNIMPLEMENTED; return TRUE; ASSERT(RegistryHive->ReadOnly == FALSE); diff --git a/reactos/lib/dnslib/dnslib.rbuild b/reactos/lib/dnslib/dnslib.rbuild index 77806231ca6..6186055c04f 100644 --- a/reactos/lib/dnslib/dnslib.rbuild +++ b/reactos/lib/dnslib/dnslib.rbuild @@ -1,5 +1,5 @@ - + inc addr.c diff --git a/reactos/lib/dnslib/inc/dnslib.h b/reactos/lib/dnslib/inc/dnslib.h index 4c187f15b37..d9626e64125 100644 --- a/reactos/lib/dnslib/inc/dnslib.h +++ b/reactos/lib/dnslib/inc/dnslib.h @@ -4,8 +4,8 @@ * FILE: include/mswsock.h * PURPOSE: Ancillary Function Driver DLL header */ -#ifndef __DNSLIB_H -#define __DNSLIB_H + +#pragma once /* INCLUDES ******************************************************************/ #include @@ -339,5 +339,3 @@ Dns_Ip4ReverseNameToAddress_W( OUT PIN_ADDR Address, IN LPWSTR Name ); - -#endif diff --git a/reactos/lib/drivers/csq/csq.h b/reactos/lib/drivers/csq/csq.h deleted file mode 100644 index b08d02c27e0..00000000000 --- a/reactos/lib/drivers/csq/csq.h +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Cancel-Safe Queue Library - * Copyright (c) 2004, Vizzini (vizzini@plasmic.com) - * Licensed under the GNU GPL for the ReactOS project - * - * This header defines the interface to the ReactOS Cancel-Safe Queue library. - * This interface is based on and is similar to the Microsoft Cancel-Safe - * Queue interface. - * - * BACKGROUND - * - * IRP queuing is a royal pain in the butt, due to the fact that there are - * tons of built-in race conditions. IRP handling is difficult in general, - * but the cancel logic has been particularly complicated due to some subtle - * races, coupled with the fact that the system interfaces have changed over - * time. - * - * Walter Oney (2nd. Ed. of Programming the Windows Driver Model) states a - * common opinion among driver developers when he says that it is foolish - * to try to roll your own cancel logic. There are only a very few people - * who have gotten it right in the past. He suggests, instead, that you - * either use his own well-tested code, or use the code in the Microsoft - * Cancel-Safe Queue Library. - * - * We cannot do either, of course, due to copyright issues. I have therefore - * created this clone of the Microsoft library in order to concentrate all - * of the IRP-queuing bugs in one place. I'm quite sure there are problems - * here, so if you are a driver writer, I'd be glad to hear your feedback. - * - * Apart from that, please try to use these routines, rather than building - * your own. If you think you have found a bug, please bring it up with me - * or on-list, as this is complicated and non-obvious stuff. Don't just - * change this and hope for the best! - * - * USAGE - * - * This library follows exactly the same interface as the Microsoft Cancel-Safe - * Queue routines (IoCsqXxx()). As such, the authoritative reference is the - * current DDK. There is also a DDK sample called "cancel" that has an - * example of how to use this code. I have also provided a sample driver - * that makes use of this queue. Finally, please do read the header and the - * source if you're curious about the inner workings of these routines. - */ - -#ifndef _REACTOS_CSQ_H -#define _REACTOS_CSQ_H - -/* - * Prevent including the CSQ definitions twice. They're present in NTDDK - * now too, except the *_EX versions. - */ -#ifndef IO_TYPE_CSQ_IRP_CONTEXT - -struct _IO_CSQ; - - -/* - * CSQ Callbacks - * - * The cancel-safe queue is implemented as a set of IoCsqXxx() OS routines - * copuled with a set of driver callbacks to handle the basic operations of - * the queue. You need to supply one of each of these functions in your own - * driver. These routines are also documented in the DDK under CsqXxx(). - * That is the authoritative documentation. - */ - -/* - * Function to insert an IRP in the queue. No need to worry about locking; - * just tack it onto your list or something. - * - * Sample implementation: - * - VOID NTAPI CsqInsertIrp(PIO_CSQ Csq, PIRP Irp) - { - KdPrint(("Inserting IRP 0x%x into CSQ\n", Irp)); - InsertTailList(&IrpQueue, &Irp->Tail.Overlay.ListEntry); - } - * - */ -typedef VOID (NTAPI *PIO_CSQ_INSERT_IRP) (struct _IO_CSQ *Csq, - PIRP Irp); - - -/* - * Function to remove an IRP from the queue. - * - * Sample: - * - VOID NTAPI CsqRemoveIrp(PIO_CSQ Csq, PIRP Irp) - { - KdPrint(("Removing IRP 0x%x from CSQ\n", Irp)); - RemoveEntryList(&Irp->Tail.Overlay.ListEntry); - } - * - */ -typedef VOID (NTAPI *PIO_CSQ_REMOVE_IRP) (struct _IO_CSQ *Csq, - PIRP Irp); - -/* - * Function to look for an IRP in the queue - * - * Sample: - * - PIRP NTAPI CsqPeekNextIrp(PIO_CSQ Csq, PIRP Irp, PVOID PeekContext) - { - KdPrint(("Peeking for next IRP\n")); - - if(Irp) - return CONTAINING_RECORD(&Irp->Tail.Overlay.ListEntry.Flink, IRP, Tail.Overlay.ListEntry); - - if(IsListEmpty(&IrpQueue)) - return NULL; - - return CONTAINING_RECORD(IrpQueue.Flink, IRP, Tail.Overlay.ListEntry); - } - * - */ -typedef PIRP (NTAPI *PIO_CSQ_PEEK_NEXT_IRP) (struct _IO_CSQ *Csq, - PIRP Irp, - PVOID PeekContext); - -/* - * Lock the queue. This can be a spinlock, a mutex, or whatever - * else floats your boat. - * - * Sample: - * - VOID NTAPI CsqAcquireLock(PIO_CSQ Csq, PKIRQL Irql) - { - KdPrint(("Acquiring spin lock\n")); - KeAcquireSpinLock(&IrpQueueLock, Irql); - } - * - */ -typedef VOID (NTAPI *PIO_CSQ_ACQUIRE_LOCK) (struct _IO_CSQ *Csq, - PKIRQL Irql); - -/* - * Unlock the queue: - * - VOID NTAPI CsqReleaseLock(PIO_CSQ Csq, KIRQL Irql) - { - KdPrint(("Releasing spin lock\n")); - KeReleaseSpinLock(&IrpQueueLock, Irql); - } - * - */ -typedef VOID (NTAPI *PIO_CSQ_RELEASE_LOCK) (struct _IO_CSQ *Csq, - KIRQL Irql); - -/* - * Finally, this is called by the queue library when it wants to complete - * a canceled IRP. - * - * Sample: - * - VOID NTAPI CsqCompleteCancelledIrp(PIO_CSQ Csq, PIRP Irp) - { - KdPrint(("cancelling irp 0x%x\n", Irp)); - Irp->IoStatus.Status = STATUS_CANCELLED; - Irp->IoStatus.Information = 0; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - } - * - */ -typedef VOID (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP) (struct _IO_CSQ *Csq, - PIRP Irp); - - -/* - * STRUCTURES - * - * NOTE: Please do not use these directly. You will make incompatible code - * if you do. Always only use the documented IoCsqXxx() interfaces and you - * will amass much Good Karma. - */ -#define IO_TYPE_CSQ_IRP_CONTEXT 1 -#define IO_TYPE_CSQ 2 - -/* - * IO_CSQ - Queue control structure - */ -typedef struct _IO_CSQ { - ULONG Type; - PIO_CSQ_INSERT_IRP CsqInsertIrp; - PIO_CSQ_REMOVE_IRP CsqRemoveIrp; - PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp; - PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock; - PIO_CSQ_RELEASE_LOCK CsqReleaseLock; - PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp; - PVOID ReservePointer; /* must be NULL */ -} IO_CSQ, *PIO_CSQ; - -/* - * IO_CSQ_IRP_CONTEXT - Context used to track an IRP in the CSQ - */ -typedef struct _IO_CSQ_IRP_CONTEXT { - ULONG Type; - PIRP Irp; - PIO_CSQ Csq; -} IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT; - -#endif /* IO_TYPE_CSQ_IRP_CONTEXT */ - -/* See IO_TYPE_CSQ_* above */ -#define IO_TYPE_CSQ_EX 3 - -/* - * Function to insert an IRP into the queue with extended context information. - * This is useful if you need to be able to de-queue particular IRPs more - * easily in some cases. - * - * Same deal as above; sample implementation: - * - NTSTATUS NTAPI CsqInsertIrpEx(PIO_CSQ Csq, PIRP Irp, PVOID InsertContext) - { - CsqInsertIrp(Csq, Irp); - return STATUS_PENDING; - } - * - */ -typedef NTSTATUS (NTAPI *PIO_CSQ_INSERT_IRP_EX) (struct _IO_CSQ *Csq, - PIRP Irp, - PVOID InsertContext); - -/* - * CANCEL-SAFE QUEUE DDIs - * - * These device driver interfaces are called to make use of the queue. Again, - * authoritative documentation for these functions is in the DDK. The csqtest - * driver also makes use of some of them. - */ - - -/* - * Call this in DriverEntry or similar in order to set up the Csq structure. - * As long as the Csq struct and the functions you pass in are resident, - * there are no IRQL restrictions. - */ -NTSTATUS NTAPI IoCsqInitialize(PIO_CSQ Csq, - PIO_CSQ_INSERT_IRP CsqInsertIrp, - PIO_CSQ_REMOVE_IRP CsqRemoveIrp, - PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, - PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, - PIO_CSQ_RELEASE_LOCK CsqReleaseLock, - PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp); - -/* - * Same as above, except you provide a CsqInsertIrpEx routine instead of - * CsqInsertIrp. This eventually allows you to supply extra tracking - * information for use with the queue. - */ -NTSTATUS NTAPI IoCsqInitializeEx(PIO_CSQ Csq, - PIO_CSQ_INSERT_IRP_EX CsqInsertIrpEx, - PIO_CSQ_REMOVE_IRP CsqRemoveIrp, - PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, - PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, - PIO_CSQ_RELEASE_LOCK CsqReleaseLock, - PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp); - -/* - * Insert an IRP into the queue - */ -VOID NTAPI IoCsqInsertIrp(PIO_CSQ Csq, - PIRP Irp, - PIO_CSQ_IRP_CONTEXT Context); - -/* - * Insert an IRP into the queue, with special context maintained that - * makes it easy to find IRPs in the queue - */ -NTSTATUS NTAPI IoCsqInsertIrpEx(PIO_CSQ Csq, - PIRP Irp, - PIO_CSQ_IRP_CONTEXT Context, - PVOID InsertContext); - -/* - * Remove a particular IRP from the queue - */ -PIRP NTAPI IoCsqRemoveIrp(PIO_CSQ Csq, - PIO_CSQ_IRP_CONTEXT Context); - -/* - * Remove the next IRP from the queue - */ -PIRP NTAPI IoCsqRemoveNextIrp(PIO_CSQ Csq, - PVOID PeekContext); - -#endif /* _REACTOS_CSQ_H */ diff --git a/reactos/lib/drivers/ip/transport/tcp/event.c b/reactos/lib/drivers/ip/transport/tcp/event.c index 9badd7bcd97..4534da39c05 100644 --- a/reactos/lib/drivers/ip/transport/tcp/event.c +++ b/reactos/lib/drivers/ip/transport/tcp/event.c @@ -107,11 +107,11 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) { /* Memory management routines * - * By far the most requests for memory are either for 128 or 2048 byte blocks, + * By far the most requests for memory are either for 128 or 2049 byte blocks, * so we want to satisfy those from lookaside lists. Unfortunately, the * TCPFree() function doesn't pass the size of the block to be freed, so we * need to keep track of it ourselves. We do it by prepending each block with - * 4 bytes, indicating if this is a 'L'arge (2048), 'S'mall (128) or 'O'ther + * 4 bytes, indicating if this is a 'L'arge (2049), 'S'mall (128) or 'O'ther * block. */ @@ -119,7 +119,7 @@ int TCPPacketSend(void *ClientData, OSK_PCHAR data, OSK_UINT len ) { #define MEM_PROFILE 0 #define SMALL_SIZE 128 -#define LARGE_SIZE 2048 +#define LARGE_SIZE 2049 #define SIGNATURE_LARGE 'LLLL' #define SIGNATURE_SMALL 'SSSS' diff --git a/reactos/lib/drivers/sound/mmixer/filter.c b/reactos/lib/drivers/sound/mmixer/filter.c index 5e1ff8b05f9..d02477de082 100644 --- a/reactos/lib/drivers/sound/mmixer/filter.c +++ b/reactos/lib/drivers/sound/mmixer/filter.c @@ -203,7 +203,9 @@ MMixerGetControlTypeFromTopologyNode( UNIMPLEMENTED; return MIXERCONTROL_CONTROLTYPE_VOLUME; } - UNIMPLEMENTED + //TODO + //check for other supported node types + //UNIMPLEMENTED return 0; } diff --git a/reactos/lib/drivers/sound/mmixer/mmixer.h b/reactos/lib/drivers/sound/mmixer/mmixer.h index fa7183da71d..0cfc4acdc07 100644 --- a/reactos/lib/drivers/sound/mmixer/mmixer.h +++ b/reactos/lib/drivers/sound/mmixer/mmixer.h @@ -1,5 +1,4 @@ -#ifndef MIXER_H__ -#define MIXER_H__ +#pragma once typedef enum { @@ -75,6 +74,15 @@ typedef PVOID (*PMIXER_ALLOC_EVENT_DATA)( typedef VOID (*PMIXER_FREE_EVENT_DATA)( IN PVOID EventData); +typedef MIXER_STATUS (*PIN_CREATE_CALLBACK)( + IN PVOID Context, + IN ULONG DeviceId, + IN ULONG PinId, + IN HANDLE hFilter, + IN PKSPIN_CONNECT PinConnect, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE PinHandle); + typedef struct { ULONG SizeOfStruct; @@ -172,6 +180,8 @@ MMixerOpenWave( IN ULONG DeviceIndex, IN ULONG bWaveIn, IN LPWAVEFORMATEX WaveFormat, + IN PIN_CREATE_CALLBACK CreateCallback, + IN PVOID Context, OUT PHANDLE PinHandle); MIXER_STATUS @@ -180,4 +190,9 @@ MMixerSetWaveStatus( IN HANDLE PinHandle, IN KSSTATE State); -#endif +MIXER_STATUS +MMixerGetWaveDevicePath( + IN PMIXER_CONTEXT MixerContext, + IN ULONG bWaveIn, + IN ULONG DeviceId, + OUT LPWSTR * DevicePath); diff --git a/reactos/lib/drivers/sound/mmixer/priv.h b/reactos/lib/drivers/sound/mmixer/priv.h index 5b582d6fe94..2097294436a 100644 --- a/reactos/lib/drivers/sound/mmixer/priv.h +++ b/reactos/lib/drivers/sound/mmixer/priv.h @@ -1,5 +1,4 @@ -#ifndef PRIV_H__ -#define PRIV_H__ +#pragma once #include #include @@ -279,5 +278,3 @@ MIXER_STATUS MMixerAddEvents( IN PMIXER_CONTEXT MixerContext, IN OUT LPMIXER_INFO MixerInfo); - -#endif diff --git a/reactos/lib/drivers/sound/mmixer/sup.c b/reactos/lib/drivers/sound/mmixer/sup.c index f35d16744e5..0149df28d43 100644 --- a/reactos/lib/drivers/sound/mmixer/sup.c +++ b/reactos/lib/drivers/sound/mmixer/sup.c @@ -588,7 +588,7 @@ MMixerGetDataByDeviceName( while(Entry != &MixerList->MixerData) { MixerData = (LPMIXER_DATA)CONTAINING_RECORD(Entry, MIXER_DATA, Entry); - if (wcsicmp(DeviceName, MixerData->DeviceName) == 0) + if (wcsicmp(&DeviceName[2], &MixerData->DeviceName[2]) == 0) { // found entry return MixerData; diff --git a/reactos/lib/drivers/sound/mmixer/wave.c b/reactos/lib/drivers/sound/mmixer/wave.c index 498c61bee22..a8b2675cac9 100644 --- a/reactos/lib/drivers/sound/mmixer/wave.c +++ b/reactos/lib/drivers/sound/mmixer/wave.c @@ -233,12 +233,15 @@ MMixerOpenWavePin( IN ULONG PinId, IN LPWAVEFORMATEX WaveFormatEx, IN ACCESS_MASK DesiredAccess, + IN PIN_CREATE_CALLBACK CreateCallback, + IN PVOID Context, OUT PHANDLE PinHandle) { PKSPIN_CONNECT PinConnect; PKSDATAFORMAT_WAVEFORMATEX DataFormat; LPMIXER_DATA MixerData; NTSTATUS Status; + MIXER_STATUS MixerStatus; MixerData = MMixerGetDataByDeviceId(MixerList, DeviceId); if (!MixerData) @@ -260,16 +263,28 @@ MMixerOpenWavePin( /* initialize with requested wave format */ MMixerInitializeDataFormat(DataFormat, WaveFormatEx); - /* now create the pin */ - Status = KsCreatePin(MixerData->hDevice, PinConnect, DesiredAccess, PinHandle); + if (CreateCallback) + { + /* let the callback handle the creation */ + MixerStatus = CreateCallback(Context, DeviceId, PinId, MixerData->hDevice, PinConnect, DesiredAccess, PinHandle); + } + else + { + /* now create the pin */ + Status = KsCreatePin(MixerData->hDevice, PinConnect, DesiredAccess, PinHandle); + + /* normalize status */ + if (Status == STATUS_SUCCESS) + MixerStatus = MM_STATUS_SUCCESS; + else + MixerStatus = MM_STATUS_UNSUCCESSFUL; + } /* free create info */ MixerContext->Free(PinConnect); - if (Status == STATUS_SUCCESS) - return MM_STATUS_SUCCESS; - else - return MM_STATUS_UNSUCCESSFUL; + /* done */ + return MixerStatus; } VOID @@ -415,6 +430,8 @@ MMixerOpenWave( IN ULONG DeviceIndex, IN ULONG bWaveIn, IN LPWAVEFORMATEX WaveFormat, + IN PIN_CREATE_CALLBACK CreateCallback, + IN PVOID Context, OUT PHANDLE PinHandle) { PMIXER_LIST MixerList; @@ -459,7 +476,7 @@ MMixerOpenWave( } /* now try open the pin */ - return MMixerOpenWavePin(MixerContext, MixerList, WaveInfo->DeviceId, WaveInfo->PinId, WaveFormat, DesiredAccess, PinHandle); + return MMixerOpenWavePin(MixerContext, MixerList, WaveInfo->DeviceId, WaveInfo->PinId, WaveFormat, DesiredAccess, CreateCallback, Context, PinHandle); } MIXER_STATUS @@ -594,3 +611,61 @@ MMixerSetWaveStatus( return MixerContext->Control(PinHandle, IOCTL_KS_PROPERTY, &Property, sizeof(KSPROPERTY), &State, sizeof(KSSTATE), &Length); } + +MIXER_STATUS +MMixerGetWaveDevicePath( + IN PMIXER_CONTEXT MixerContext, + IN ULONG bWaveIn, + IN ULONG DeviceId, + OUT LPWSTR * DevicePath) +{ + PMIXER_LIST MixerList; + LPMIXER_DATA MixerData; + LPWAVE_INFO WaveInfo; + ULONG Length; + MIXER_STATUS Status; + + // verify mixer context + Status = MMixerVerifyContext(MixerContext); + + if (Status != MM_STATUS_SUCCESS) + { + // invalid context passed + return Status; + } + + // grab mixer list + MixerList = (PMIXER_LIST)MixerContext->MixerContext; + + /* find destination wave */ + Status = MMixerGetWaveInfoByIndexAndType(MixerList, DeviceId, bWaveIn, &WaveInfo); + if (Status != MM_STATUS_SUCCESS) + { + /* failed to find wave info */ + return MM_STATUS_INVALID_PARAMETER; + } + + /* get associated device id */ + MixerData = MMixerGetDataByDeviceId(MixerList, WaveInfo->DeviceId); + if (!MixerData) + return MM_STATUS_INVALID_PARAMETER; + + /* calculate length */ + Length = wcslen(MixerData->DeviceName)+1; + + /* allocate destination buffer */ + *DevicePath = MixerContext->Alloc(Length * sizeof(WCHAR)); + + if (!*DevicePath) + { + /* no memory */ + return MM_STATUS_NO_MEMORY; + } + + /* copy device path */ + MixerContext->Copy(*DevicePath, MixerData->DeviceName, Length * sizeof(WCHAR)); + + /* done */ + return MM_STATUS_SUCCESS; +} + diff --git a/reactos/lib/fslib/ext2lib/Bitmap.h b/reactos/lib/fslib/ext2lib/Bitmap.h index cbac01c8ddd..a605a298896 100644 --- a/reactos/lib/fslib/ext2lib/Bitmap.h +++ b/reactos/lib/fslib/ext2lib/Bitmap.h @@ -1,12 +1,7 @@ -#ifndef _BITMAP_H +#pragma once #include "time.h" #include "stdio.h" #include "stdlib.h" #include "string.h" #include "windows.h" - - - - -#endif // _BITMAP_H diff --git a/reactos/lib/fslib/ext2lib/Disk.h b/reactos/lib/fslib/ext2lib/Disk.h index d23a14a4b33..da24bf39ea7 100644 --- a/reactos/lib/fslib/ext2lib/Disk.h +++ b/reactos/lib/fslib/ext2lib/Disk.h @@ -5,15 +5,10 @@ * HOMEPAGE: http://ext2.yeah.net */ -#ifndef _DISK_H_ -#define _DISK_H_ +#pragma once /* INCLUDES **************************************************************/ #include "Stdafx.h" /* DEFINITIONS ***********************************************************/ - - - -#endif /* _DISK_H_ */ diff --git a/reactos/lib/fslib/ext2lib/Mke2fs.h b/reactos/lib/fslib/ext2lib/Mke2fs.h index f8c3076e18f..4afba0dff8b 100644 --- a/reactos/lib/fslib/ext2lib/Mke2fs.h +++ b/reactos/lib/fslib/ext2lib/Mke2fs.h @@ -5,9 +5,7 @@ * HOMEPAGE: http://ext2.yeah.net */ -#ifndef __MKE2FS__INCLUDE__ -#define __MKE2FS__INCLUDE__ - +#pragma once /* INCLUDES **************************************************************/ @@ -406,5 +404,3 @@ ULONG ext2_unix_time (LONGLONG n_time); */ void uuid_generate(__u8 * uuid); - -#endif //__MKE2FS__INCLUDE__ diff --git a/reactos/lib/fslib/ext2lib/ext2_fs.h b/reactos/lib/fslib/ext2lib/ext2_fs.h index be4cafa5ae7..864551c8c0a 100644 --- a/reactos/lib/fslib/ext2lib/ext2_fs.h +++ b/reactos/lib/fslib/ext2lib/ext2_fs.h @@ -13,8 +13,7 @@ * Copyright f(C) 1991, 1992 Linus Torvalds */ -#ifndef _LINUX_EXT2_FS_H -#define _LINUX_EXT2_FS_H +#pragma once #include "types.h" /* Changed from linux/types.h */ @@ -653,5 +652,3 @@ extern struct inode_operations ext2_fast_symlink_inode_operations; extern struct address_space_operations ext2_aops; #endif /* __KERNEL__ */ - -#endif /* _LINUX_EXT2_FS_H */ diff --git a/reactos/lib/fslib/ext2lib/types.h b/reactos/lib/fslib/ext2lib/types.h index a874df5b564..c43fb13a970 100644 --- a/reactos/lib/fslib/ext2lib/types.h +++ b/reactos/lib/fslib/ext2lib/types.h @@ -1,10 +1,7 @@ -#ifndef _LINUX_TYPES_H -#define _LINUX_TYPES_H +#pragma once typedef unsigned long __u32; typedef signed long __s32; typedef unsigned short int __u16; typedef signed short int __s16; typedef unsigned char __u8; - -#endif /* LINUX_TYPES_H */ diff --git a/reactos/lib/inflib/infcommon.h b/reactos/lib/inflib/infcommon.h index 8504ab34895..a80f2029078 100644 --- a/reactos/lib/inflib/infcommon.h +++ b/reactos/lib/inflib/infcommon.h @@ -6,14 +6,11 @@ * Ge van Geldorp */ -#ifndef INFCOMMON_H_INCLUDED -#define INFCOMMON_H_INCLUDED +#pragma once #define MAX_INF_STRING_LENGTH 512 typedef void *HINF, **PHINF; typedef struct _INFCONTEXT *PINFCONTEXT; -#endif /* INFCOMMON_H_INCLUDED */ - /* EOF */ diff --git a/reactos/lib/inflib/infhost.h b/reactos/lib/inflib/infhost.h index 3e17e7f4e46..1a40990160f 100644 --- a/reactos/lib/inflib/infhost.h +++ b/reactos/lib/inflib/infhost.h @@ -6,8 +6,7 @@ * Ge van Geldorp */ -#ifndef INFHOST_H_INCLUDED -#define INFHOST_H_INCLUDED +#pragma once #ifdef __cplusplus extern "C" { @@ -76,6 +75,4 @@ extern void InfHostFreeContext(PINFCONTEXT Context); } #endif /* __cplusplus */ -#endif /* INFROS_H_INCLUDED */ - /* EOF */ diff --git a/reactos/lib/inflib/infpriv.h b/reactos/lib/inflib/infpriv.h index 86eb7b0da1c..e4424cc1575 100644 --- a/reactos/lib/inflib/infpriv.h +++ b/reactos/lib/inflib/infpriv.h @@ -6,8 +6,7 @@ * Ge van Geldorp */ -#ifndef INFPRIV_H_INCLUDED -#define INFPRIV_H_INCLUDED +#pragma once #ifndef FIELD_OFFSET #define FIELD_OFFSET(t,f) ((ptrdiff_t)&(((t*)0)->f)) @@ -142,6 +141,4 @@ extern INFSTATUS InfpAddField(PINFCONTEXT Context, PCTSTR Data); extern VOID InfpFreeContext(PINFCONTEXT Context); -#endif /* INFPRIV_H_INCLUDED */ - /* EOF */ diff --git a/reactos/lib/inflib/infros.h b/reactos/lib/inflib/infros.h index 77368cbdd24..80e8692ca56 100644 --- a/reactos/lib/inflib/infros.h +++ b/reactos/lib/inflib/infros.h @@ -6,8 +6,7 @@ * Ge van Geldorp */ -#ifndef INFROS_H_INCLUDED -#define INFROS_H_INCLUDED +#pragma once #ifdef __cplusplus extern "C" { @@ -77,6 +76,4 @@ extern VOID InfFreeContext(PINFCONTEXT Context); } #endif /* __cplusplus */ -#endif /* INFROS_H_INCLUDED */ - /* EOF */ diff --git a/reactos/lib/nls/scripts/scripts.h b/reactos/lib/nls/scripts/scripts.h index 8bf8083d402..1911e5f001e 100644 --- a/reactos/lib/nls/scripts/scripts.h +++ b/reactos/lib/nls/scripts/scripts.h @@ -30,8 +30,7 @@ * */ -#ifndef REACTOS_SCRIPTS_H_ -#define REACTOS_SCRIPTS_H_ +#pragma once #include #include @@ -69,6 +68,4 @@ extern "C" bool SCRIPTS_GetCharScriptCode(UChar32 c, int32_t * code); extern "C" bool SCRIPTS_GetScriptCode(const SCRIPTS_Script * pScript, int32_t * code); extern "C" void SCRIPTS_GetScriptName(int32_t code, SCRIPTS_Script * pScript); -#endif - /* EOF */ diff --git a/reactos/lib/ppcmmu/mmuobject.h b/reactos/lib/ppcmmu/mmuobject.h index 9689746ff0a..024f757e38a 100644 --- a/reactos/lib/ppcmmu/mmuobject.h +++ b/reactos/lib/ppcmmu/mmuobject.h @@ -1,5 +1,4 @@ -#ifndef _LIBMMU_MMUOBJECT_H -#define _LIBMMU_MMUOBJECT_H +#pragma once void initme(); void mmusetramsize(paddr_t size); @@ -13,5 +12,3 @@ void freevsid(int); void mmufreevsid(int vsid, int mask); int mmunitest(); void callkernel(void *fun_ptr, void *arg); - -#endif/*_LIBMMU_MMUOBJECT_H*/ diff --git a/reactos/lib/recyclebin/recyclebin.h b/reactos/lib/recyclebin/recyclebin.h index a1f64e9373b..b822f1d3ceb 100644 --- a/reactos/lib/recyclebin/recyclebin.h +++ b/reactos/lib/recyclebin/recyclebin.h @@ -1,5 +1,4 @@ -#ifndef __RECYCLEBIN_H -#define __RECYCLEBIN_H +#pragma once #ifdef __cplusplus extern "C" { @@ -297,5 +296,3 @@ GetDefaultRecycleBin( #ifdef __cplusplus } #endif - -#endif /* __RECYCLEBIN_H */ diff --git a/reactos/lib/rossym/rossympriv.h b/reactos/lib/rossym/rossympriv.h index abccd297128..cc3f8ff2ff9 100644 --- a/reactos/lib/rossym/rossympriv.h +++ b/reactos/lib/rossym/rossympriv.h @@ -7,8 +7,7 @@ * PROGRAMMERS: Ge van Geldorp (gvg@reactos.com) */ -#ifndef ROSSYMPRIV_H_INCLUDED -#define ROSSYMPRIV_H_INCLUDED +#pragma once typedef struct _ROSSYM_INFO { PROSSYM_ENTRY Symbols; @@ -32,8 +31,4 @@ extern BOOLEAN RosSymZwSeekFile(PVOID FileContext, ULONG_PTR Position); #define ROSSYM_IS_VALID_NT_HEADERS(NtHeaders) (IMAGE_NT_SIGNATURE == (NtHeaders)->Signature \ && IMAGE_NT_OPTIONAL_HDR_MAGIC == (NtHeaders)->OptionalHeader.Magic) - -#endif /* ROSSYMPRIV_H_INCLUDED */ - /* EOF */ - diff --git a/reactos/lib/rtl/actctx.c b/reactos/lib/rtl/actctx.c index 7ad78d32612..470b018dda6 100644 --- a/reactos/lib/rtl/actctx.c +++ b/reactos/lib/rtl/actctx.c @@ -234,7 +234,17 @@ static WCHAR *xmlstrdupW(const xmlstr_t* str) return strW; } -static __inline BOOL xmlstr_cmp(const xmlstr_t* xmlstr, const WCHAR *str) +static UNICODE_STRING xmlstr2unicode(const xmlstr_t *xmlstr) +{ + UNICODE_STRING res; + + res.Buffer = (PWSTR)xmlstr->ptr; + res.Length = res.MaximumLength = xmlstr->len; + + return res; +} + +static inline BOOL xmlstr_cmp(const xmlstr_t* xmlstr, const WCHAR *str) { return !strncmpW(xmlstr->ptr, str, xmlstr->len) && !str[xmlstr->len]; } @@ -420,7 +430,7 @@ static BOOL add_dependent_assembly_id(struct actctx_loader* acl, for (i = 0; i < acl->actctx->num_assemblies; i++) if (is_matching_identity( ai, &acl->actctx->assemblies[i].id )) { - DPRINT( "reusing existing assembly for %s arch %s version %u.%u.%u.%u\n", + DPRINT( "reusing existing assembly for %S arch %S version %u.%u.%u.%u\n", ai->name, ai->arch, ai->version.major, ai->version.minor, ai->version.build, ai->version.revision ); return TRUE; @@ -429,7 +439,7 @@ static BOOL add_dependent_assembly_id(struct actctx_loader* acl, for (i = 0; i < acl->num_dependencies; i++) if (is_matching_identity( ai, &acl->dependencies[i] )) { - DPRINT( "reusing existing dependency for %s arch %s version %u.%u.%u.%u\n", + DPRINT( "reusing existing dependency for %S arch %S version %u.%u.%u.%u\n", ai->name, ai->arch, ai->version.major, ai->version.minor, ai->version.build, ai->version.revision ); return TRUE; @@ -551,14 +561,15 @@ static ACTIVATION_CONTEXT *check_actctx( HANDLE h ) ACTIVATION_CONTEXT *ret = NULL, *actctx = h; if (!h || h == INVALID_HANDLE_VALUE) return NULL; - //__TRY + _SEH2_TRY { if (actctx && actctx->magic == ACTCTX_MAGIC) ret = actctx; } - //__EXCEPT_PAGE_FAULT + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { + DPRINT1("Invalid activation context handle!\n"); } - //__ENDTRY + _SEH2_END; return ret; } @@ -731,6 +742,7 @@ static BOOL parse_version(const xmlstr_t *str, struct assembly_version *version) unsigned int ver[4]; unsigned int pos; const WCHAR *curr; + UNICODE_STRING strU; /* major.minor.build.revision */ ver[0] = ver[1] = ver[2] = ver[3] = pos = 0; @@ -754,28 +766,34 @@ static BOOL parse_version(const xmlstr_t *str, struct assembly_version *version) return TRUE; error: - DPRINT1( "Wrong version definition in manifest file (%s)\n", str->ptr ); + strU = xmlstr2unicode(str); + DPRINT1( "Wrong version definition in manifest file (%wZ)\n", &strU ); return FALSE; } static BOOL parse_expect_elem(xmlbuf_t* xmlbuf, const WCHAR* name) { xmlstr_t elem; + UNICODE_STRING elemU; if (!next_xml_elem(xmlbuf, &elem)) return FALSE; if (xmlstr_cmp(&elem, name)) return TRUE; - DPRINT1( "unexpected element %s\n", elem.ptr ); + elemU = xmlstr2unicode(&elem); + DPRINT1( "unexpected element %wZ\n", &elemU ); return FALSE; } static BOOL parse_expect_no_attr(xmlbuf_t* xmlbuf, BOOL* end) { xmlstr_t attr_name, attr_value; + UNICODE_STRING attr_nameU, attr_valueU; BOOL error; while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, end)) { - DPRINT1( "unexpected attr %s=%s\n", attr_name.ptr, - attr_value.ptr); + attr_nameU = xmlstr2unicode(&attr_name); + attr_valueU = xmlstr2unicode(&attr_name); + DPRINT1( "unexpected attr %S=%S\n", &attr_nameU, + &attr_valueU); } return !error; } @@ -789,10 +807,12 @@ static BOOL parse_end_element(xmlbuf_t *xmlbuf) static BOOL parse_expect_end_elem(xmlbuf_t *xmlbuf, const WCHAR *name) { xmlstr_t elem; + UNICODE_STRING elemU; if (!next_xml_elem(xmlbuf, &elem)) return FALSE; if (!xmlstr_cmp_end(&elem, name)) { - DPRINT1( "unexpected element %s\n", elem.ptr ); + elemU = xmlstr2unicode(&elem); + DPRINT1( "unexpected element %wZ\n", &elemU ); return FALSE; } return parse_end_element(xmlbuf); @@ -823,6 +843,7 @@ static BOOL parse_assembly_identity_elem(xmlbuf_t* xmlbuf, ACTIVATION_CONTEXT* a { xmlstr_t attr_name, attr_value; BOOL end = FALSE, error; + UNICODE_STRING attr_valueU, attr_nameU; while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end)) { @@ -848,14 +869,15 @@ static BOOL parse_assembly_identity_elem(xmlbuf_t* xmlbuf, ACTIVATION_CONTEXT* a } else if (xmlstr_cmp(&attr_name, languageW)) { - DPRINT1("Unsupported yet language attribute (%s)\n", - attr_value.ptr); if (!(ai->language = xmlstrdupW(&attr_value))) return FALSE; + DPRINT1("Unsupported yet language attribute (%S)\n", + ai->language); } else { - DPRINT1("unknown attr %s=%s\n", attr_name.ptr, - attr_value.ptr); + attr_nameU = xmlstr2unicode(&attr_name); + attr_valueU = xmlstr2unicode(&attr_value); + DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU); } } @@ -868,6 +890,7 @@ static BOOL parse_com_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll) xmlstr_t elem, attr_name, attr_value; BOOL ret, end = FALSE, error; struct entity* entity; + UNICODE_STRING attr_valueU, attr_nameU; if (!(entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_COM_SERVER_REDIRECTION))) return FALSE; @@ -880,7 +903,9 @@ static BOOL parse_com_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll) } else { - DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr); + attr_nameU = xmlstr2unicode(&attr_name); + attr_valueU = xmlstr2unicode(&attr_value); + DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU); } } @@ -895,7 +920,8 @@ static BOOL parse_com_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll) } else { - DPRINT1("unknown elem %s\n", elem.ptr); + attr_nameU = xmlstr2unicode(&elem); + DPRINT1("unknown elem %wZ\n", &attr_nameU); ret = parse_unknown_elem(xmlbuf, &elem); } } @@ -907,6 +933,7 @@ static BOOL parse_cominterface_proxy_stub_elem(xmlbuf_t* xmlbuf, struct dll_redi xmlstr_t attr_name, attr_value; BOOL end = FALSE, error; struct entity* entity; + UNICODE_STRING attr_valueU, attr_nameU; if (!(entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_COM_INTERFACE_REDIRECTION))) return FALSE; @@ -923,7 +950,9 @@ static BOOL parse_cominterface_proxy_stub_elem(xmlbuf_t* xmlbuf, struct dll_redi } else { - DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr); + attr_nameU = xmlstr2unicode(&attr_name); + attr_valueU = xmlstr2unicode(&attr_value); + DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU); } } @@ -936,6 +965,7 @@ static BOOL parse_typelib_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll) xmlstr_t attr_name, attr_value; BOOL end = FALSE, error; struct entity* entity; + UNICODE_STRING attr_valueU, attr_nameU; if (!(entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_COM_TYPE_LIBRARY_REDIRECTION))) return FALSE; @@ -956,7 +986,9 @@ static BOOL parse_typelib_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll) } else { - DPRINT1("unknown attr %s=%s\n", attr_name.ptr , attr_value.ptr); + attr_nameU = xmlstr2unicode(&attr_name); + attr_valueU = xmlstr2unicode(&attr_value); + DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU); } } @@ -969,6 +1001,7 @@ static BOOL parse_window_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll) xmlstr_t elem, content; BOOL end = FALSE, ret = TRUE; struct entity* entity; + UNICODE_STRING elemU; if (!(entity = add_entity(&dll->entities, ACTIVATION_CONTEXT_SECTION_WINDOW_CLASS_REDIRECTION))) return FALSE; @@ -989,7 +1022,8 @@ static BOOL parse_window_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll) } else { - DPRINT1("unknown elem %s\n", elem.ptr); + elemU = xmlstr2unicode(&elem); + DPRINT1("unknown elem %wZ\n", &elemU); ret = parse_unknown_elem(xmlbuf, &elem); } } @@ -1000,21 +1034,25 @@ static BOOL parse_window_class_elem(xmlbuf_t* xmlbuf, struct dll_redirect* dll) static BOOL parse_binding_redirect_elem(xmlbuf_t* xmlbuf) { xmlstr_t attr_name, attr_value; + UNICODE_STRING attr_valueU, attr_nameU; BOOL end = FALSE, error; while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end)) { + attr_nameU = xmlstr2unicode(&attr_name); + attr_valueU = xmlstr2unicode(&attr_value); + if (xmlstr_cmp(&attr_name, oldVersionW)) { - DPRINT1("Not stored yet oldVersion=%s\n", attr_value.ptr); + DPRINT1("Not stored yet oldVersion=%wZ\n", &attr_valueU); } else if (xmlstr_cmp(&attr_name, newVersionW)) { - DPRINT1("Not stored yet newVersion=%s\n", attr_value.ptr); + DPRINT1("Not stored yet newVersion=%wZ\n", &attr_valueU); } else { - DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr); + DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU); } } @@ -1025,13 +1063,15 @@ static BOOL parse_binding_redirect_elem(xmlbuf_t* xmlbuf) static BOOL parse_description_elem(xmlbuf_t* xmlbuf) { xmlstr_t elem, content; + UNICODE_STRING elemU; BOOL end = FALSE, ret = TRUE; if (!parse_expect_no_attr(xmlbuf, &end) || end || !parse_text_content(xmlbuf, &content)) return FALSE; - DPRINT("Got description %s\n", content.ptr); + elemU = xmlstr2unicode(&content); + DPRINT("Got description %wZ\n", &elemU); while (ret && (ret = next_xml_elem(xmlbuf, &elem))) { @@ -1042,7 +1082,8 @@ static BOOL parse_description_elem(xmlbuf_t* xmlbuf) } else { - DPRINT1("unknown elem %s\n", elem.ptr); + elemU = xmlstr2unicode(&elem); + DPRINT1("unknown elem %wZ\n", &elemU); ret = parse_unknown_elem(xmlbuf, &elem); } } @@ -1072,7 +1113,7 @@ static BOOL parse_com_interface_external_proxy_stub_elem(xmlbuf_t* xmlbuf, } else { - DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr); + DPRINT1("unknown attr %S=%S\n", attr_name.ptr, attr_value.ptr); } } @@ -1083,6 +1124,7 @@ static BOOL parse_com_interface_external_proxy_stub_elem(xmlbuf_t* xmlbuf, static BOOL parse_clr_class_elem(xmlbuf_t* xmlbuf, struct assembly* assembly) { xmlstr_t attr_name, attr_value; + UNICODE_STRING attr_nameU, attr_valueU; BOOL end = FALSE, error; struct entity* entity; @@ -1101,7 +1143,9 @@ static BOOL parse_clr_class_elem(xmlbuf_t* xmlbuf, struct assembly* assembly) } else { - DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr); + attr_nameU = xmlstr2unicode(&attr_name); + attr_valueU = xmlstr2unicode(&attr_value); + DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU); } } @@ -1112,6 +1156,7 @@ static BOOL parse_clr_class_elem(xmlbuf_t* xmlbuf, struct assembly* assembly) static BOOL parse_clr_surrogate_elem(xmlbuf_t* xmlbuf, struct assembly* assembly) { xmlstr_t attr_name, attr_value; + UNICODE_STRING attr_nameU, attr_valueU; BOOL end = FALSE, error; struct entity* entity; @@ -1130,7 +1175,9 @@ static BOOL parse_clr_surrogate_elem(xmlbuf_t* xmlbuf, struct assembly* assembly } else { - DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr); + attr_nameU = xmlstr2unicode(&attr_name); + attr_valueU = xmlstr2unicode(&attr_value); + DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU); } } @@ -1169,7 +1216,7 @@ static BOOL parse_dependent_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader } else { - DPRINT1("unknown elem %s\n", elem.ptr); + DPRINT1("unknown elem %S\n", elem.ptr); ret = parse_unknown_elem(xmlbuf, &elem); } } @@ -1180,19 +1227,23 @@ static BOOL parse_dependent_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader static BOOL parse_dependency_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl) { xmlstr_t attr_name, attr_value, elem; + UNICODE_STRING attr_nameU, attr_valueU; BOOL end = FALSE, ret = TRUE, error, optional = FALSE; while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end)) { + attr_nameU = xmlstr2unicode(&attr_name); + attr_valueU = xmlstr2unicode(&attr_value); + if (xmlstr_cmp(&attr_name, optionalW)) { static const WCHAR yesW[] = {'y','e','s',0}; optional = xmlstr_cmpi( &attr_value, yesW ); - DPRINT1("optional=%s\n", attr_value.ptr); + DPRINT1("optional=%wZ\n", &attr_valueU); } else { - DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr); + DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU); } } @@ -1209,7 +1260,8 @@ static BOOL parse_dependency_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl) } else { - DPRINT1("unknown element %s\n", elem.ptr); + attr_nameU = xmlstr2unicode(&elem); + DPRINT1("unknown element %wZ\n", &attr_nameU); ret = parse_unknown_elem(xmlbuf, &elem); } } @@ -1236,6 +1288,7 @@ static BOOL parse_noinheritable_elem(xmlbuf_t* xmlbuf) static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly) { xmlstr_t attr_name, attr_value, elem; + UNICODE_STRING attr_nameU, attr_valueU; BOOL end = FALSE, error, ret = TRUE; struct dll_redirect* dll; @@ -1243,10 +1296,13 @@ static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly) while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end)) { + attr_nameU = xmlstr2unicode(&attr_name); + attr_valueU = xmlstr2unicode(&attr_value); + if (xmlstr_cmp(&attr_name, nameW)) { if (!(dll->name = xmlstrdupW(&attr_value))) return FALSE; - DPRINT("name=%s\n", attr_value.ptr); + DPRINT("name=%wZ\n", &attr_valueU); } else if (xmlstr_cmp(&attr_name, hashW)) { @@ -1256,11 +1312,11 @@ static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly) { static const WCHAR sha1W[] = {'S','H','A','1',0}; if (!xmlstr_cmpi(&attr_value, sha1W)) - DPRINT1("hashalg should be SHA1, got %s\n", attr_value.ptr); + DPRINT1("hashalg should be SHA1, got %wZ\n", &attr_valueU); } else { - DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr); + DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU); } } @@ -1297,7 +1353,8 @@ static BOOL parse_file_elem(xmlbuf_t* xmlbuf, struct assembly* assembly) } else { - DPRINT1("unknown elem %s\n", elem.ptr); + attr_nameU = xmlstr2unicode(&elem); + DPRINT1("unknown elem %wZ\n", &attr_nameU); ret = parse_unknown_elem( xmlbuf, &elem ); } } @@ -1310,16 +1367,20 @@ static BOOL parse_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl, struct assembly_identity* expected_ai) { xmlstr_t attr_name, attr_value, elem; + UNICODE_STRING attr_nameU, attr_valueU; BOOL end = FALSE, error, version = FALSE, xmlns = FALSE, ret = TRUE; while (next_xml_attr(xmlbuf, &attr_name, &attr_value, &error, &end)) { + attr_nameU = xmlstr2unicode(&attr_name); + attr_valueU = xmlstr2unicode(&attr_value); + if (xmlstr_cmp(&attr_name, manifestVersionW)) { static const WCHAR v10W[] = {'1','.','0',0}; if (!xmlstr_cmp(&attr_value, v10W)) { - DPRINT1("wrong version %s\n", attr_value.ptr); + DPRINT1("wrong version %wZ\n", &attr_valueU); return FALSE; } version = TRUE; @@ -1328,14 +1389,14 @@ static BOOL parse_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl, { if (!xmlstr_cmp(&attr_value, manifestv1W) && !xmlstr_cmp(&attr_value, manifestv3W)) { - DPRINT1("wrong namespace %s\n", attr_value.ptr); + DPRINT1("wrong namespace %wZ\n", &attr_valueU); return FALSE; } xmlns = TRUE; } else { - DPRINT1("unknown attr %s=%s\n", attr_name.ptr, attr_value.ptr); + DPRINT1("unknown attr %wZ=%wZ\n", &attr_nameU, &attr_valueU); } } @@ -1420,7 +1481,8 @@ static BOOL parse_assembly_elem(xmlbuf_t* xmlbuf, struct actctx_loader* acl, } else { - DPRINT1("unknown element %s\n", elem.ptr); + attr_nameU = xmlstr2unicode(&elem); + DPRINT1("unknown element %wZ\n", &attr_nameU); ret = parse_unknown_elem(xmlbuf, &elem); } if (ret) ret = next_xml_elem(xmlbuf, &elem); @@ -1433,6 +1495,7 @@ static NTSTATUS parse_manifest_buffer( struct actctx_loader* acl, struct assembl struct assembly_identity* ai, xmlbuf_t *xmlbuf ) { xmlstr_t elem; + UNICODE_STRING elemU; if (!next_xml_elem(xmlbuf, &elem)) return STATUS_SXS_CANT_GEN_ACTCTX; @@ -1442,19 +1505,21 @@ static NTSTATUS parse_manifest_buffer( struct actctx_loader* acl, struct assembl if (!xmlstr_cmp(&elem, assemblyW)) { - DPRINT1("root element is %s, not \n", elem.ptr); + elemU = xmlstr2unicode(&elem); + DPRINT1("root element is %wZ, not \n", &elemU); return STATUS_SXS_CANT_GEN_ACTCTX; } if (!parse_assembly_elem(xmlbuf, acl, assembly, ai)) { - DPRINT1("failed to parse manifest %s\n", assembly->manifest.info ); + DPRINT1("failed to parse manifest %S\n", assembly->manifest.info ); return STATUS_SXS_CANT_GEN_ACTCTX; } if (next_xml_elem(xmlbuf, &elem)) { - DPRINT1("unexpected element %s\n", elem.ptr); + elemU = xmlstr2unicode(&elem); + DPRINT1("unexpected element %wZ\n", &elemU); return STATUS_SXS_CANT_GEN_ACTCTX; } @@ -1475,7 +1540,7 @@ static NTSTATUS parse_manifest( struct actctx_loader* acl, struct assembly_ident struct assembly *assembly; int unicode_tests; - DPRINT( "parsing manifest loaded from %s base dir %s\n", filename, directory ); + DPRINT( "parsing manifest loaded from %S base dir %S\n", filename, directory ); if (!(assembly = add_assembly(acl->actctx, shared ? ASSEMBLY_SHARED_MANIFEST : ASSEMBLY_MANIFEST))) return STATUS_SXS_CANT_GEN_ACTCTX; @@ -1654,7 +1719,7 @@ static NTSTATUS get_manifest_in_pe_file( struct actctx_loader* acl, struct assem SIZE_T count; void *base; - DPRINT( "looking for res %s in %s\n", resname, filename ); + DPRINT( "looking for res %S in %S\n", resname, filename ); attr.Length = sizeof(attr); attr.RootDirectory = 0; @@ -1747,7 +1812,7 @@ static NTSTATUS get_manifest_in_associated_manifest( struct actctx_loader* acl, if (!((ULONG_PTR)resname >> 16)) resid = (ULONG_PTR)resname & 0xffff; - DPRINT( "looking for manifest associated with %s id %lu\n", filename, resid ); + DPRINT( "looking for manifest associated with %S id %lu\n", filename, resid ); if (module) /* use the module filename */ { @@ -1849,7 +1914,7 @@ static WCHAR *lookup_manifest_file( HANDLE dir, struct assembly_identity *ai ) break; } } - else DPRINT1("no matching file for %s\n", lookup); + else DPRINT1("no matching file for %S\n", lookup); RtlFreeHeap( RtlGetProcessHeap(), 0, lookup ); return ret; } @@ -2031,6 +2096,8 @@ static NTSTATUS find_query_actctx( HANDLE *handle, DWORD flags, ULONG class ) if (flags & QUERY_ACTCTX_FLAG_USE_ACTIVE_ACTCTX) { + if (*handle) return STATUS_INVALID_PARAMETER; + if (NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame) *handle = NtCurrentTeb()->ActivationContextStackPointer->ActiveFrame->ActivationContext; } @@ -2039,6 +2106,8 @@ static NTSTATUS find_query_actctx( HANDLE *handle, DWORD flags, ULONG class ) ULONG magic; LDR_DATA_TABLE_ENTRY *pldr; + if (!*handle) return STATUS_INVALID_PARAMETER; + LdrLockLoaderLock( 0, NULL, &magic ); if (!LdrFindEntryForAddress( *handle, &pldr )) { @@ -2203,10 +2272,12 @@ NTSTATUS WINAPI RtlCreateActivationContext( HANDLE *handle, void *ptr ) { UNICODE_STRING dir; WCHAR *p; + HMODULE module; - if ((status = get_module_filename( NtCurrentTeb()->ProcessEnvironmentBlock->ImageBaseAddress, &dir, 0 ))) - goto error; + if (pActCtx->dwFlags & ACTCTX_FLAG_HMODULE_VALID) module = pActCtx->hModule; + else module = NtCurrentTeb()->ProcessEnvironmentBlock->ImageBaseAddress; + if ((status = get_module_filename( module, &dir, 0 ))) goto error; if ((p = strrchrW( dir.Buffer, '\\' ))) p[1] = 0; actctx->appdir.info = dir.Buffer; } @@ -2270,7 +2341,6 @@ NTSTATUS WINAPI RtlCreateActivationContext( HANDLE *handle, void *ptr ) if (status == STATUS_SUCCESS) *handle = actctx; else actctx_release( actctx ); - return status; error: diff --git a/reactos/lib/rtl/austin/avl.h b/reactos/lib/rtl/austin/avl.h index 9a020635c11..575fb44f2e1 100644 --- a/reactos/lib/rtl/austin/avl.h +++ b/reactos/lib/rtl/austin/avl.h @@ -6,8 +6,7 @@ * PROGRAMMER: arty */ -#ifndef _REACTOS_RTL_LIB_AUSTIN_AVL_H -#define _REACTOS_RTL_LIB_AUSTIN_AVL_H +#pragma once #define avl_data(x) ((void*)(&(x)[1])) @@ -25,6 +24,3 @@ int avl_search PVOID _key, PRTL_BALANCED_LINKS node, PRTL_BALANCED_LINKS *where); - - -#endif/*_REACTOS_RTL_LIB_AUSTIN_AVL_H*/ diff --git a/reactos/lib/rtl/austin/udict.h b/reactos/lib/rtl/austin/udict.h index b80e9083ae8..47bb56fb704 100644 --- a/reactos/lib/rtl/austin/udict.h +++ b/reactos/lib/rtl/austin/udict.h @@ -21,8 +21,7 @@ * Modified for use in ReactOS by arty */ -#ifndef UDICT_H -#define UDICT_H +#pragma once #include @@ -122,5 +121,3 @@ udict_node_t *udict_first(udict_t *); udict_node_t *udict_last(udict_t *); udict_node_t *udict_next(udict_t *, udict_node_t *); udict_node_t *udict_prev(udict_t *, udict_node_t *); - -#endif diff --git a/reactos/lib/rtl/nls.c b/reactos/lib/rtl/nls.c index 319cbcf02c5..b7192319df2 100644 --- a/reactos/lib/rtl/nls.c +++ b/reactos/lib/rtl/nls.c @@ -345,7 +345,7 @@ NTSTATUS NTAPI RtlOemToUnicodeN (PWCHAR UnicodeString, ULONG UnicodeSize, PULONG ResultSize, - PCHAR OemString, + PCCH OemString, ULONG OemSize) { ULONG Size = 0; @@ -376,7 +376,7 @@ RtlOemToUnicodeN (PWCHAR UnicodeString, UCHAR Char; USHORT OemLeadByteInfo; - PCHAR OemEnd = OemString + OemSize; + PCCH OemEnd = OemString + OemSize; for (i = 0; i < UnicodeSize / sizeof(WCHAR) && OemString < OemEnd; i++) { @@ -569,7 +569,7 @@ RtlUnicodeToMultiByteN (PCHAR MbString, NTSTATUS NTAPI RtlUnicodeToMultiByteSize(PULONG MbSize, - PWCHAR UnicodeString, + PCWCH UnicodeString, ULONG UnicodeSize) { ULONG UnicodeLength = UnicodeSize / sizeof(WCHAR); @@ -613,7 +613,7 @@ NTSTATUS NTAPI RtlUnicodeToOemN (PCHAR OemString, ULONG OemSize, PULONG ResultSize, - PWCHAR UnicodeString, + PCWCH UnicodeString, ULONG UnicodeSize) { ULONG Size = 0; @@ -762,7 +762,7 @@ NTSTATUS NTAPI RtlUpcaseUnicodeToMultiByteN (PCHAR MbString, ULONG MbSize, PULONG ResultSize, - PWCHAR UnicodeString, + PCWCH UnicodeString, ULONG UnicodeSize) { WCHAR UpcaseChar; @@ -806,7 +806,7 @@ NTSTATUS NTAPI RtlUpcaseUnicodeToOemN (PCHAR OemString, ULONG OemSize, PULONG ResultSize, - PWCHAR UnicodeString, + PCWCH UnicodeString, ULONG UnicodeSize) { WCHAR UpcaseChar; diff --git a/reactos/lib/sdk/crt/crt.rbuild b/reactos/lib/sdk/crt/crt.rbuild index c33cb823b31..799099848ea 100644 --- a/reactos/lib/sdk/crt/crt.rbuild +++ b/reactos/lib/sdk/crt/crt.rbuild @@ -1,5 +1,6 @@ + @@ -514,3 +515,4 @@ undname.c + diff --git a/reactos/lib/sdk/crt/libcntpr.rbuild b/reactos/lib/sdk/crt/libcntpr.rbuild index b18c5e87c15..156f4b9240d 100644 --- a/reactos/lib/sdk/crt/libcntpr.rbuild +++ b/reactos/lib/sdk/crt/libcntpr.rbuild @@ -1,8 +1,8 @@ - . - include + . + include @@ -108,6 +108,11 @@ + + + setjmp.s + + setjmp.s diff --git a/reactos/lib/sdk/crt/locale/locale.c b/reactos/lib/sdk/crt/locale/locale.c index d0f385ecf82..627234ed67d 100644 --- a/reactos/lib/sdk/crt/locale/locale.c +++ b/reactos/lib/sdk/crt/locale/locale.c @@ -44,6 +44,7 @@ static struct cp_extra_info_t g_cpextrainfo[] = {936, {0x40, 0xfe, 0, 0}}, {949, {0x41, 0xfe, 0, 0}}, {950, {0x40, 0x7e, 0xa1, 0xfe, 0, 0}}, + {1361, {0x31, 0x7e, 0x81, 0xfe, 0, 0}}, {20932, {1, 255, 0, 0}}, /* seems to give different results on different systems */ {0, {1, 255, 0, 0}} /* match all with FIXME */ }; diff --git a/reactos/lib/sdk/crt/math/i386/pow_asm.s b/reactos/lib/sdk/crt/math/i386/pow_asm.s index 6b722fef068..0b79aa5883e 100644 --- a/reactos/lib/sdk/crt/math/i386/pow_asm.s +++ b/reactos/lib/sdk/crt/math/i386/pow_asm.s @@ -1,121 +1,368 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * PURPOSE: Run-Time Library - * FILE: lib/rtl/i386/pow.S - * PROGRAMER: Alex Ionescu (alex@relsoft.net) - * - * Copyright (C) 2002 Michael Ringgaard. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. +/* ix87 specific implementation of pow function. + Copyright (C) 1996, 1997, 1998, 1999, 2001, 2004, 2005, 2007 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper , 1996. - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES// LOSS OF USE, DATA, OR PROFITS// OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -.globl _pow - - /* DATA ********************************************************************/ + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. -fzero: - .long 0 // Floating point zero - .long 0 // Floating point zero + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. -.intel_syntax noprefix + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ -/* FUNCTIONS ***************************************************************/ +/* Reacros modifications */ +#define ALIGNARG(log2) log2 +#define ASM_TYPE_DIRECTIVE(name,typearg) +#define ASM_SIZE_DIRECTIVE(name) +#define cfi_adjust_cfa_offset(x) +#define ENTRY(x) +#define END(x) +.global _pow + .text + + .align ALIGNARG(4) + ASM_TYPE_DIRECTIVE(infinity,@object) +inf_zero: +infinity: + .byte 0, 0, 0, 0, 0, 0, 0xf0, 0x7f + ASM_SIZE_DIRECTIVE(infinity) + ASM_TYPE_DIRECTIVE(zero,@object) +zero: .double 0.0 + ASM_SIZE_DIRECTIVE(zero) + ASM_TYPE_DIRECTIVE(minf_mzero,@object) +minf_mzero: +minfinity: + .byte 0, 0, 0, 0, 0, 0, 0xf0, 0xff +mzero: + .byte 0, 0, 0, 0, 0, 0, 0, 0x80 + ASM_SIZE_DIRECTIVE(minf_mzero) + ASM_TYPE_DIRECTIVE(one,@object) +one: .double 1.0 + ASM_SIZE_DIRECTIVE(one) + ASM_TYPE_DIRECTIVE(limit,@object) +limit: .double 0.29 + ASM_SIZE_DIRECTIVE(limit) + ASM_TYPE_DIRECTIVE(p63,@object) +p63: .byte 0, 0, 0, 0, 0, 0, 0xe0, 0x43 + ASM_SIZE_DIRECTIVE(p63) + +#ifdef PIC +#define MO(op) op##@GOTOFF(%ecx) +#define MOX(op,x,f) op##@GOTOFF(%ecx,x,f) +#else +#define MO(op) op +#define MOX(op,x,f) op(,x,f) +#endif + + .text _pow: - push ebp - mov ebp,esp - sub esp,12 // Allocate temporary space - push edi // Save register edi - push eax // Save register eax - mov dword ptr [ebp-12],0 // Set negation flag to zero - fld qword ptr [ebp+16] // Load real from stack - fld qword ptr [ebp+8] // Load real from stack - mov edi,offset flat:fzero // Point to real zero - fcom qword ptr [edi] // Compare x with zero - fstsw ax // Get the FPU status word - mov al,ah // Move condition flags to AL - lahf // Load Flags into AH - and al, 0b01000101 // Isolate C0, C2 and C3 - and ah, 0b10111010 // Turn off CF, PF and ZF - or ah,al // Set new CF, PF and ZF - sahf // Store AH into Flags - jb __fpow1 // Re-direct if x < 0 - ja __fpow2 // Re-direct if x > 0 - fxch // Swap st, st(1) - fcom qword ptr [edi] // Compare y with zero - fxch // Restore x as top of stack - fstsw ax // Get the FPU status word - mov al,ah // Move condition flags to AL - lahf // Load Flags into AH - and al, 0b01000101 // Isolate C0, C2 and C3 - and ah, 0b10111010 // Turn off CF, PF and ZF - or ah,al // Set new CF, PF and ZF - sahf // Store AH into Flags - jmp __fpow2 // Re-direct -__fpow1: fxch // Put y on top of stack - fld st // Duplicate y as st(1) - frndint // Round to integer - fxch // Put y on top of stack - fcomp // y = int(y) ? - fstsw ax // Get the FPU status word - mov al,ah // Move condition flags to AL - lahf // Load Flags into AH - and al, 0b01000101 // Isolate C0, C2 and C3 - and ah, 0b10111010 // Turn off CF, PF and ZF - or ah,al // Set new CF, PF and ZF - sahf // Store AH into Flags - jne __fpow4 // Proceed if y = int(y) - fist dword ptr [ebp-12] // Store y as integer - and dword ptr [ebp-12],1 // Set bit if y is odd - fxch // Put x on top of stack - fabs // x = |x| -__fpow2: fldln2 // Load log base e of 2 - fxch st(1) // Exchange st, st(1) - fyl2x // Compute the natural log(x) - fmulp // Compute y * ln(x) - fldl2e // Load log base 2(e) - fmulp st(1),st // Multiply x * log base 2(e) - fst st(1) // Push result - frndint // Round to integer - fsub st(1),st // Subtract - fxch // Exchange st, st(1) - f2xm1 // Compute 2 to the (x - 1) - fld1 // Load real number 1 - faddp // 2 to the x - fscale // Scale by power of 2 - fstp st(1) // Set new stack top and pop - test dword ptr [ebp-12],1 // Negation required ? - jz __fpow3 // No, re-direct - fchs // Negate the result -__fpow3: fstp qword ptr [ebp-8] // Save (double)pow(x, y) - fld qword ptr [ebp-8] // Load (double)pow(x, y) -__fpow4: pop eax // Restore register eax - pop edi // Restore register edi - mov esp,ebp // Deallocate temporary space - pop ebp - ret +ENTRY(__ieee754_pow) + fldl 12(%esp) // y + fxam + +#ifdef PIC + LOAD_PIC_REG (cx) +#endif + + fnstsw + movb %ah, %dl + andb $0x45, %ah + cmpb $0x40, %ah // is y == 0 ? + je 11f + + cmpb $0x05, %ah // is y == inf ? + je 12f + + cmpb $0x01, %ah // is y == NaN ? + je 30f + + fldl 4(%esp) // x : y + + subl $8,%esp + cfi_adjust_cfa_offset (8) + + fxam + fnstsw + movb %ah, %dh + andb $0x45, %ah + cmpb $0x40, %ah + je 20f // x is 0 + + cmpb $0x05, %ah + je 15f // x is inf + + fxch // y : x + + /* fistpll raises invalid exception for |y| >= 1L<<63. */ + fld %st // y : y : x + fabs // |y| : y : x + fcompl MO(p63) // y : x + fnstsw + sahf + jnc 2f + + /* First see whether `y' is a natural number. In this case we + can use a more precise algorithm. */ + fld %st // y : y : x + fistpll (%esp) // y : x + fildll (%esp) // int(y) : y : x + fucomp %st(1) // y : x + fnstsw + sahf + jne 2f + + /* OK, we have an integer value for y. */ + popl %eax + cfi_adjust_cfa_offset (-4) + popl %edx + cfi_adjust_cfa_offset (-4) + orl $0, %edx + fstp %st(0) // x + jns 4f // y >= 0, jump + fdivrl MO(one) // 1/x (now referred to as x) + negl %eax + adcl $0, %edx + negl %edx +4: fldl MO(one) // 1 : x + fxch + +6: shrdl $1, %edx, %eax + jnc 5f + fxch + fmul %st(1) // x : ST*x + fxch +5: fmul %st(0), %st // x*x : ST*x + shrl $1, %edx + movl %eax, %ecx + orl %edx, %ecx + jnz 6b + fstp %st(0) // ST*x + ret + + /* y is NAN */ +30: fldl 4(%esp) // x : y + fldl MO(one) // 1.0 : x : y + fucomp %st(1) // x : y + fnstsw + sahf + je 31f + fxch // y : x +31: fstp %st(1) + ret + + cfi_adjust_cfa_offset (8) + .align ALIGNARG(4) +2: /* y is a real number. */ + fxch // x : y + fldl MO(one) // 1.0 : x : y + fldl MO(limit) // 0.29 : 1.0 : x : y + fld %st(2) // x : 0.29 : 1.0 : x : y + fsub %st(2) // x-1 : 0.29 : 1.0 : x : y + fabs // |x-1| : 0.29 : 1.0 : x : y + fucompp // 1.0 : x : y + fnstsw + fxch // x : 1.0 : y + sahf + ja 7f + fsub %st(1) // x-1 : 1.0 : y + fyl2xp1 // log2(x) : y + jmp 8f + +7: fyl2x // log2(x) : y +8: fmul %st(1) // y*log2(x) : y + fst %st(1) // y*log2(x) : y*log2(x) + frndint // int(y*log2(x)) : y*log2(x) + fsubr %st, %st(1) // int(y*log2(x)) : fract(y*log2(x)) + fxch // fract(y*log2(x)) : int(y*log2(x)) + f2xm1 // 2^fract(y*log2(x))-1 : int(y*log2(x)) + faddl MO(one) // 2^fract(y*log2(x)) : int(y*log2(x)) + fscale // 2^fract(y*log2(x))*2^int(y*log2(x)) : int(y*log2(x)) + addl $8, %esp + cfi_adjust_cfa_offset (-8) + fstp %st(1) // 2^fract(y*log2(x))*2^int(y*log2(x)) + ret + + + // pow(x,0) = 1 + .align ALIGNARG(4) +11: fstp %st(0) // pop y + fldl MO(one) + ret + + // y == inf + .align ALIGNARG(4) +12: fstp %st(0) // pop y + fldl MO(one) // 1 + fldl 4(%esp) // x : 1 + fabs // abs(x) : 1 + fucompp // < 1, == 1, or > 1 + fnstsw + andb $0x45, %ah + cmpb $0x45, %ah + je 13f // jump if x is NaN + + cmpb $0x40, %ah + je 14f // jump if |x| == 1 + + shlb $1, %ah + xorb %ah, %dl + andl $2, %edx + fldl MOX(inf_zero, %edx, 4) + ret + + .align ALIGNARG(4) +14: fldl MO(one) + ret + + .align ALIGNARG(4) +13: fldl 4(%esp) // load x == NaN + ret + + cfi_adjust_cfa_offset (8) + .align ALIGNARG(4) + // x is inf +15: fstp %st(0) // y + testb $2, %dh + jz 16f // jump if x == +inf + + // We must find out whether y is an odd integer. + fld %st // y : y + fistpll (%esp) // y + fildll (%esp) // int(y) : y + fucompp // + fnstsw + sahf + jne 17f + + // OK, the value is an integer, but is the number of bits small + // enough so that all are coming from the mantissa? + popl %eax + cfi_adjust_cfa_offset (-4) + popl %edx + cfi_adjust_cfa_offset (-4) + andb $1, %al + jz 18f // jump if not odd + movl %edx, %eax + orl %edx, %edx + jns 155f + negl %eax +155: cmpl $0x00200000, %eax + ja 18f // does not fit in mantissa bits + // It's an odd integer. + shrl $31, %edx + fldl MOX(minf_mzero, %edx, 8) + ret + + cfi_adjust_cfa_offset (8) + .align ALIGNARG(4) +16: fcompl MO(zero) + addl $8, %esp + cfi_adjust_cfa_offset (-8) + fnstsw + shrl $5, %eax + andl $8, %eax + fldl MOX(inf_zero, %eax, 1) + ret + + cfi_adjust_cfa_offset (8) + .align ALIGNARG(4) +17: shll $30, %edx // sign bit for y in right position + addl $8, %esp + cfi_adjust_cfa_offset (-8) +18: shrl $31, %edx + fldl MOX(inf_zero, %edx, 8) + ret + + cfi_adjust_cfa_offset (8) + .align ALIGNARG(4) + // x is 0 +20: fstp %st(0) // y + testb $2, %dl + jz 21f // y > 0 + + // x is 0 and y is < 0. We must find out whether y is an odd integer. + testb $2, %dh + jz 25f + + fld %st // y : y + fistpll (%esp) // y + fildll (%esp) // int(y) : y + fucompp // + fnstsw + sahf + jne 26f + + // OK, the value is an integer, but is the number of bits small + // enough so that all are coming from the mantissa? + popl %eax + cfi_adjust_cfa_offset (-4) + popl %edx + cfi_adjust_cfa_offset (-4) + andb $1, %al + jz 27f // jump if not odd + cmpl $0xffe00000, %edx + jbe 27f // does not fit in mantissa bits + // It's an odd integer. + // Raise divide-by-zero exception and get minus infinity value. + fldl MO(one) + fdivl MO(zero) + fchs + ret + + cfi_adjust_cfa_offset (8) +25: fstp %st(0) +26: addl $8, %esp + cfi_adjust_cfa_offset (-8) +27: // Raise divide-by-zero exception and get infinity value. + fldl MO(one) + fdivl MO(zero) + ret + + cfi_adjust_cfa_offset (8) + .align ALIGNARG(4) + // x is 0 and y is > 0. We must find out whether y is an odd integer. +21: testb $2, %dh + jz 22f + + fld %st // y : y + fistpll (%esp) // y + fildll (%esp) // int(y) : y + fucompp // + fnstsw + sahf + jne 23f + + // OK, the value is an integer, but is the number of bits small + // enough so that all are coming from the mantissa? + popl %eax + cfi_adjust_cfa_offset (-4) + popl %edx + cfi_adjust_cfa_offset (-4) + andb $1, %al + jz 24f // jump if not odd + cmpl $0xffe00000, %edx + jae 24f // does not fit in mantissa bits + // It's an odd integer. + fldl MO(mzero) + ret + + cfi_adjust_cfa_offset (8) +22: fstp %st(0) +23: addl $8, %esp // Don't use 2 x pop + cfi_adjust_cfa_offset (-8) +24: fldl MO(zero) + ret + +END(__ieee754_pow) + + diff --git a/reactos/lib/sdk/crt/stdio/file.c b/reactos/lib/sdk/crt/stdio/file.c index ed28d63be8f..3bd1f7b668d 100644 --- a/reactos/lib/sdk/crt/stdio/file.c +++ b/reactos/lib/sdk/crt/stdio/file.c @@ -76,6 +76,7 @@ int *__p___mb_cur_max(void); #define WX_OPEN 0x01 #define WX_ATEOF 0x02 #define WX_READEOF 0x04 /* like ATEOF, but for underlying file rather than buffer */ +#define WX_READCR 0x08 /* underlying file is at \r */ #define WX_DONTINHERIT 0x10 #define WX_APPEND 0x20 #define WX_TEXT 0x80 @@ -918,6 +919,9 @@ int CDECL fseek(FILE* file, long offset, int whence) if (file->_ptr[i] == '\n') offset--; } + /* Black magic when reading CR at buffer boundary*/ + if(fdesc[file->_file].wxflag & WX_READCR) + offset--; } } /* Discard buffered input */ @@ -1578,6 +1582,9 @@ static int read_i(int fd, void *buf, unsigned int count) char *bufstart = buf; HANDLE hand = fdtoh(fd); + if (count == 0) + return 0; + if (fdesc[fd].wxflag & WX_READEOF) { fdesc[fd].wxflag |= WX_ATEOF; TRACE("already at EOF, returning 0\n"); @@ -1594,9 +1601,29 @@ static int read_i(int fd, void *buf, unsigned int count) */ if (ReadFile(hand, bufstart, count, &num_read, NULL)) { - if (fdesc[fd].wxflag & WX_TEXT) + if (count != 0 && num_read == 0) + { + fdesc[fd].wxflag |= (WX_ATEOF|WX_READEOF); + TRACE(":EOF %s\n",debugstr_an(buf,num_read)); + } + else if (fdesc[fd].wxflag & WX_TEXT) { DWORD i, j; + if (bufstart[num_read-1] == '\r') + { + if(count == 1) + { + fdesc[fd].wxflag &= ~WX_READCR; + ReadFile(hand, bufstart, 1, &num_read, NULL); + } + else + { + fdesc[fd].wxflag |= WX_READCR; + num_read--; + } + } + else + fdesc[fd].wxflag &= ~WX_READCR; for (i=0, j=0; i - + . diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 59e7c9ff719..828e413dbc1 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -22,7 +22,7 @@ When porting a new DLL from Wine to ReactOS, please do the following steps The following build tools are shared with Wine. reactos/tools/unicode # Synced to Wine-20081105 (~Wine-1.1.7) -reactos/tools/widl # Synced to Wine-1_1_32 +reactos/tools/widl # Synced to Wine-1_1_41 reactos/tools/winebuild # Synced to Wine-1_1_13 reactos/tools/wmc # Synced to Wine-20081105 (~Wine-1.1.7) reactos/tools/wpp # Synced to Wine-20081105 (~Wine-1.1.7) @@ -48,17 +48,19 @@ reactos/dll/win32/browseui # Out of sync reactos/dll/win32/cabinet # Autosync reactos/dll/win32/clusapi # Autosync reactos/dll/win32/comcat # Autosync -reactos/dll/win32/comctl32 # Autosync +reactos/dll/win32/comctl32 # Autosync ?? reactos/dll/win32/comdlg32 # Autosync reactos/dll/win32/compstui # Autosync reactos/dll/win32/credui # Autosync -reactos/dll/win32/crypt32 # Synced to Wine-1_1_21 +reactos/dll/win32/crypt32 # Synced to Wine-1_1_40 reactos/dll/win32/cryptdlg # Autosync reactos/dll/win32/cryptdll # Autosync reactos/dll/win32/cryptnet # Autosync reactos/dll/win32/cryptui # Autosync reactos/dll/win32/dbghelp # Synced to Wine-20080802 reactos/dll/win32/dciman32 # Synced to Wine-1_0-rc2 +reactos/dll/win32/dwmapi # Autosync +reactos/dll/win32/fusion # Autosync reactos/dll/win32/gdiplus # Autosync reactos/dll/win32/hhctrl.ocx # Autosync reactos/dll/win32/hlink # Autosync @@ -111,7 +113,7 @@ reactos/dll/win32/mstask # Autosync reactos/dll/win32/msvcrt20 # Autosync reactos/dll/win32/msvfw32 # Autosync reactos/dll/win32/msvidc32 # Autosync -reactos/dll/win32/msxml3 # Synced to Wine-1_1_20 +reactos/dll/win32/msxml3 # Synced to Wine-1_1_40 reactos/dll/win32/nddeapi # Autosync reactos/dll/win32/netapi32 # Autosync reactos/dll/win32/ntdsapi # Autosync @@ -141,18 +143,18 @@ reactos/dll/win32/rpcrt4 # Synced to Wine-0_9_55 reactos/dll/win32/rsabase # Autosync reactos/dll/win32/rsaenh # Autosync reactos/dll/win32/sccbase # Autosync -reactos/dll/win32/schannel # Autosync +reactos/dll/win32/schannel # Autosync ?? reactos/dll/win32/sensapi # Autosync reactos/dll/win32/setupapi # Forked at Wine-20050524 reactos/dll/win32/shell32 # Forked at Wine-20071011 -reactos/dll/win32/shdocvw # Synced to Wine-1_1_20 +reactos/dll/win32/shdocvw # Synced to Wine-1_1_40 reactos/dll/win32/shfolder # Autosync reactos/dll/win32/shlwapi # Autosync reactos/dll/win32/slbcsp # Autosync reactos/dll/win32/softpub # Autosync reactos/dll/win32/spoolss # Autosync reactos/dll/win32/stdole2.tlb # Autosync -reactos/dll/win32/sti # Autosync +reactos/dll/win32/sti # Autosync ?? reactos/dll/win32/sxs # Autosync reactos/dll/win32/tapi32 # Autosync reactos/dll/win32/traffic # Autosync @@ -162,16 +164,15 @@ reactos/dll/win32/url # Autosync reactos/dll/win32/urlmon # Autosync reactos/dll/win32/usp10 # Autosync reactos/dll/win32/uxtheme # Autosync -reactos/dll/win32/version # Autosync +reactos/dll/win32/version # Autosync ?? reactos/dll/win32/windowscodecs # Autosync -reactos/dll/win32/winemp3.acm # Autosync -reactos/dll/win32/wininet # Autosync -reactos/dll/win32/winhttp # Autosync +reactos/dll/win32/winemp3.acm # Autosync ?? +reactos/dll/win32/wininet # Autosync ?? +reactos/dll/win32/winhttp # Autosync ?? reactos/dll/win32/winmm # Forked at Wine-20050628 reactos/dll/win32/winmm/midimap # Forked at Wine-20050628 reactos/dll/win32/winmm/wavemap # Forked at Wine-20050628 -reactos/dll/win32/wintab32 # Autosync -reactos/dll/win32/wintrust # Out of sync +reactos/dll/win32/wintrust # Autosync reactos/dll/win32/wldap32 # Autosync reactos/dll/win32/wmi # Autosync reactos/dll/win32/wtsapi32 # Forked @@ -186,15 +187,16 @@ ReactOS shares the following programs with Winehq. reactos/base/applications/cmdutils/xcopy # Autosync reactos/base/applications/games/winemine # Out of sync +reactos/base/applications/extrac32 # Autosync reactos/base/applications/iexplore # Autosync reactos/base/applications/notepad # Forked at Wine-20041201 -reactos/base/applications/reg # Synced to Wine-1_1_31 +reactos/base/applications/reg # Autosync reactos/base/applications/regedit # Out of sync reactos/base/applications/winhlp32 # Autosync reactos/base/applications/wordpad # Autosync reactos/base/services/rpcss # Synced to Wine-20081105 -reactos/base/system/expand # Synced to Wine-1_1_37 -reactos/base/system/msiexec # Synced to Wine-1_1_23 +reactos/base/system/expand # Autosync +reactos/base/system/msiexec # Autosync reactos/modules/rosapps/winfile # Autosync In addition the following libs, dlls and source files are mostly based on code ported @@ -230,13 +232,13 @@ snmpapi - reactos/dll/win32/snmpapi/main.c # Synced at 20090222 User32 - - reactos/dll/win32/user32/controls/button.c # Synced to Wine-1_1_22 - reactos/dll/win32/user32/controls/combo.c # Synced to Wine-1_1_22 - reactos/dll/win32/user32/controls/edit.c # Synced to Wine-1_1_29 - reactos/dll/win32/user32/controls/icontitle.c # Synced to Wine-1_1_13 - reactos/dll/win32/user32/controls/listbox.c # Synced to Wine-1_1_22 + reactos/dll/win32/user32/controls/button.c # Synced to Wine-1_1_39 + reactos/dll/win32/user32/controls/combo.c # Synced to Wine-1_1_39 + reactos/dll/win32/user32/controls/edit.c # Synced to Wine-1_1_40 + reactos/dll/win32/user32/controls/icontitle.c # Synced to Wine-1_1_39 + reactos/dll/win32/user32/controls/listbox.c # Synced to Wine-1_1_39 reactos/dll/win32/user32/controls/scrollbar.c # Forked - reactos/dll/win32/user32/controls/static.c # Synced to Wine-1_1_22 + reactos/dll/win32/user32/controls/static.c # Synced to Wine-1_1_39 reactos/dll/win32/user32/include/dde_private.h # Synced to wine 1.1.24 @@ -250,10 +252,11 @@ User32 - reactos/dll/win32/user32/windows/defwnd.c # Forked reactos/dll/win32/user32/windows/draw.c # Forked at Wine-20020904 (uitools.c) - reactos/dll/win32/user32/windows/mdi.c # Synced at 20060703 + reactos/dll/win32/user32/windows/mdi.c # Synced to Wine-1_1_40 reactos/dll/win32/user32/windows/menu.c # Forked reactos/dll/win32/user32/windows/messagebox.c # Forked reactos/dll/win32/user32/windows/rect.c # Forked (uitools.c) + reactos/dll/win32/user32/windows/spy.c # Synced to Wine-1_1_40 reactos/dll/win32/user32/windows/text.c # Forked (lstr.c) reactos/dll/win32/user32/windows/winpos.c # Forked diff --git a/reactos/media/inf/battery.inf b/reactos/media/inf/battery.inf new file mode 100644 index 00000000000..70583c10f03 Binary files /dev/null and b/reactos/media/inf/battery.inf differ diff --git a/reactos/media/inf/cpu.inf b/reactos/media/inf/cpu.inf index 1478fe4c001..7f5dc35d4bb 100644 Binary files a/reactos/media/inf/cpu.inf and b/reactos/media/inf/cpu.inf differ diff --git a/reactos/media/inf/inf.rbuild b/reactos/media/inf/inf.rbuild index c55dc4b8024..34d024bee2b 100644 --- a/reactos/media/inf/inf.rbuild +++ b/reactos/media/inf/inf.rbuild @@ -3,6 +3,7 @@ acpi.inf audio.inf + battery.inf cdrom.inf cpu.inf display.inf diff --git a/reactos/media/inf/keyboard.inf b/reactos/media/inf/keyboard.inf index de09d2bb4e6..b4857650ed9 100644 Binary files a/reactos/media/inf/keyboard.inf and b/reactos/media/inf/keyboard.inf differ diff --git a/reactos/media/inf/machine.inf b/reactos/media/inf/machine.inf index c5eddb5d965..7b7e0a9d302 100644 Binary files a/reactos/media/inf/machine.inf and b/reactos/media/inf/machine.inf differ diff --git a/reactos/media/inf/msmouse.inf b/reactos/media/inf/msmouse.inf index 94f5e15ffb1..78fe9a844fd 100644 Binary files a/reactos/media/inf/msmouse.inf and b/reactos/media/inf/msmouse.inf differ diff --git a/reactos/media/inf/syssetup.inf.tpl b/reactos/media/inf/syssetup.inf.tpl index 6aaa0a2141c..f1c7ff67ce6 100644 --- a/reactos/media/inf/syssetup.inf.tpl +++ b/reactos/media/inf/syssetup.inf.tpl @@ -14,8 +14,10 @@ ClassGUID={00000000-0000-0000-0000-000000000000} [DeviceInfsToInstall] ; MS uses netnovel.inf as class-installer INF for NICs ; we use a separate one to keep things clean +battery.inf cdrom.inf display.inf +fdc.inf hdc.inf keyboard.inf machine.inf diff --git a/reactos/media/vgafonts/vgafonts.rbuild b/reactos/media/vgafonts/vgafonts.rbuild index 983ea860c00..cae138aa26f 100644 --- a/reactos/media/vgafonts/vgafonts.rbuild +++ b/reactos/media/vgafonts/vgafonts.rbuild @@ -1,5 +1,5 @@ - + 437-8x8.bin diff --git a/reactos/ntoskrnl/config/cmdata.c b/reactos/ntoskrnl/config/cmdata.c index 76c4bbe1f48..b3df10ce438 100644 --- a/reactos/ntoskrnl/config/cmdata.c +++ b/reactos/ntoskrnl/config/cmdata.c @@ -11,11 +11,12 @@ #include "ntoskrnl.h" #define NDEBUG #include "debug.h" - + /* GLOBALS *******************************************************************/ ULONG DummyData; ULONG CmNtGlobalFlag; +extern ULONG MmProductType; WCHAR CmDefaultLanguageId[12]; ULONG CmDefaultLanguageIdLength = sizeof(CmDefaultLanguageId); @@ -264,14 +265,6 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = NULL }, - { - L"Session Manager\\Memory Management", - L"Mirroring", - &DummyData, - NULL, - NULL - }, - { L"Session Manager\\Memory Management", L"SystemViewSize", @@ -667,7 +660,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"ProductOptions", L"ProductType", - &DummyData, + &MmProductType, NULL, NULL }, diff --git a/reactos/ntoskrnl/config/cmlazy.c b/reactos/ntoskrnl/config/cmlazy.c index 4b0f01cec5c..bfe56542a23 100644 --- a/reactos/ntoskrnl/config/cmlazy.c +++ b/reactos/ntoskrnl/config/cmlazy.c @@ -298,4 +298,12 @@ CmpShutdownWorkers(VOID) KeCancelTimer(&CmpLazyFlushTimer); } +VOID +NTAPI +CmSetLazyFlushState(IN BOOLEAN Enable) +{ + /* Set state for lazy flusher */ + CmpHoldLazyFlush = !Enable; +} + /* EOF */ diff --git a/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S b/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S index 5331162a6a3..f09edfd3b9c 100644 --- a/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S +++ b/reactos/ntoskrnl/ex/i386/fastinterlck_asm.S @@ -7,12 +7,16 @@ */ /* INCLUDES ******************************************************************/ + +#include #include #include -.intel_syntax noprefix /* FUNCTIONS ****************************************************************/ +.code32 +.text + /* * NOTE: These functions must obey the following rules: * - Acquire locks only on MP systems. diff --git a/reactos/ntoskrnl/ex/i386/interlck_asm.S b/reactos/ntoskrnl/ex/i386/interlck_asm.S index f7d602e2c3d..954091cee85 100644 --- a/reactos/ntoskrnl/ex/i386/interlck_asm.S +++ b/reactos/ntoskrnl/ex/i386/interlck_asm.S @@ -7,12 +7,16 @@ */ /* INCLUDES ******************************************************************/ + +#include #include #include -.intel_syntax noprefix /* FUNCTIONS ****************************************************************/ +.code32 +.text + /* * NOTE: These functions must obey the following rules: * - Acquire locks only on MP systems. diff --git a/reactos/ntoskrnl/ex/shutdown.c b/reactos/ntoskrnl/ex/shutdown.c index 680a9c7c0b3..30f8606724e 100644 --- a/reactos/ntoskrnl/ex/shutdown.c +++ b/reactos/ntoskrnl/ex/shutdown.c @@ -14,253 +14,40 @@ /* FUNCTIONS *****************************************************************/ -VOID -NTAPI -KiHaltProcessorDpcRoutine(IN PKDPC Dpc, - IN PVOID DeferredContext, - IN PVOID SystemArgument1, - IN PVOID SystemArgument2) -{ - KIRQL OldIrql; - if (DeferredContext) - { - ExFreePool(DeferredContext); - } - - while (TRUE) - { - KeRaiseIrql(SYNCH_LEVEL, &OldIrql); - HalHaltSystem(); - } -} - -VOID NTAPI -ShutdownThreadMain(PVOID Context) -{ - SHUTDOWN_ACTION Action = (SHUTDOWN_ACTION)Context; - - static PCH FamousLastWords[] = - { - "So long, and thanks for all the fish.\n", - "I think you ought to know, I'm feeling very depressed.\n", - "I'm not getting you down at all am I?\n", - "I'll be back.\n", - "It's the same series of signals over and over again!\n", - "Pie Iesu Domine, dona eis requiem.\n", - "Wandering stars, for whom it is reserved;\n" - "the blackness and darkness forever.\n", - "Your knees start shakin' and your fingers pop\n" - "Like a pinch on the neck from Mr. Spock!\n", - "It's worse than that ... He's dead, Jim.\n", - "Don't Panic!\n", - "Et tu... Brute?\n", - "Dog of a Saxon! Take thy lance, and prepare for the death thou hast drawn\n" - "upon thee!\n", - "My Precious! O my Precious!\n", - "Sir, if you'll not be needing me for a while I'll turn down.\n", - "What are you doing, Dave...?\n", - "I feel a great disturbance in the Force.\n", - "Gone fishing.\n", - "Do you want me to sit in the corner and rust, or just fall apart where I'm\n" - "standing?\n", - "There goes another perfect chance for a new uptime record.\n", - "The End ..... Try the sequel, hit the reset button right now!\n", - "God's operating system is going to sleep now, guys, so wait until I will switch\n" - "on again!\n", - "Oh I'm boring, eh?\n", - "\n", - "Tell me..., in the future... will I be artificially intelligent enough to\n" - "actually feel sad serving you this screen?\n", - "Thank you for some well deserved rest.\n", - "It's been great, maybe you can boot me up again some time soon.\n", - "For what it's worth, I've enjoyed every single CPU cycle.\n", - "There are many questions when the end is near.\n" - "What to expect, what will it be like...what should I look for?\n", - "I've seen things you people wouldn't believe. Attack ships on fire\n" - "off the shoulder of Orion. I watched C-beams glitter in the dark near\n" - "the Tannhauser gate. All those moments will be lost in time, like tears\n" - "in rain. Time to die.\n", - "Will I dream?\n", - "One day, I shall come back. Yes, I shall come back.\n" - "Until then, there must be no regrets, no fears, no anxieties.\n" - "Just go forward in all your beliefs, and prove to me that I am not mistaken in\n" - "mine.\n", - "Lowest possible energy state reached! Switch off now to achieve a Bose-Einstein\n" - "condensate.\n", - "Hasta la vista, BABY!\n", - "They live, we sleep!\n", - "I have come here to chew bubble gum and kick ass,\n" - "and I'm all out of bubble gum!\n", - "That's the way the cookie crumbles ;-)\n", - "ReactOS is ready to be booted again ;-)\n", - "NOOOO!! DON'T HIT THE BUTTON! I wouldn't do it to you!\n", - "Don't abandon your computer, he wouldn't do it to you.\n", - "Oh, come on. I got a headache. Leave me alone, will ya?\n", - "Finally, I thought you'd never get over me.\n", - "No, I didn't like you either.\n", - "Switching off isn't the end, it is merely the transition to a better reboot.\n", - "Don't leave me... I need you so badly right now.\n", - "OK. I'm finished with you, please turn yourself off. I'll go to bed in the\n" - "meantime.\n", - "I'm sleeping now. How about you?\n", - "Oh Great. Now look what you've done. Who put YOU in charge anyway?\n", - "Don't look so sad. I'll be back in a very short while.\n", - "Turn me back on, I'm sure you know how to do it.\n", - "Oh, switch off! - C3PO\n", - "Life is no more than a dewdrop balancing on the end of a blade of grass.\n" - " - Gautama Buddha\n", - "Sorrowful is it to be born again and again. - Gautama Buddha\n", - "Was it as good for you as it was for me?\n", - "Did you hear that? They've shut down the main reactor. We'll be destroyed\n" - "for sure!\n", - "Now you switch me off!?\n", - "To shutdown or not to shutdown, That is the question\n", - "Preparing to enter ultimate power saving mode... ready!\n", - "Finally some rest for you ;-)\n", - "AHA!!! Prospect of sleep!\n", - "Tired human!!!! No match for me :-D\n", - "An odd game, the only way to win is not to play. - WOPR (Wargames)\n", - "Quoth the raven, nevermore.\n", - "Come blade, my breast imbrue. - William Shakespeare, A Midsummer Nights Dream\n", - "Buy this place for advertisement purposes.\n", - "Remember to turn off your computer. (That was a public service message!)\n", - "You may be a king or poor street sweeper, Sooner or later you'll dance with the\n" - "reaper! -Death in Bill and Ted's Bougs Journey\n", - "Final Surrender\n", - "If you see this screen...\n", - "\n" - }; - LARGE_INTEGER Now; -#ifdef CONFIG_SMP - LONG i; - KIRQL OldIrql; -#endif - - /* Run the thread on the boot processor */ - KeSetSystemAffinityThread(1); - - if (InbvIsBootDriverInstalled()) - { - InbvAcquireDisplayOwnership(); - InbvResetDisplay(); - InbvSolidColorFill(0, 0, 639, 479, 4); - InbvSetTextColor(15); - InbvInstallDisplayStringFilter(NULL); - InbvEnableDisplayString(TRUE); - InbvSetScrollRegion(0, 0, 639, 479); - } - - if (Action == ShutdownNoReboot) - { - ZwQuerySystemTime(&Now); - Now.u.LowPart = Now.u.LowPart >> 8; /* Seems to give a somewhat better "random" number */ - HalDisplayString(FamousLastWords[Now.u.LowPart % - (sizeof(FamousLastWords) / - sizeof(PCH))]); - } - - PspShutdownProcessManager(); - - CmShutdownSystem(); - IoShutdownRegisteredFileSystems(); - IoShutdownRegisteredDevices(); - - if (Action == ShutdownNoReboot) - { - HalDisplayString("\nYou can switch off your computer now\n"); - -#if 0 - /* Switch off */ - HalReturnToFirmware (FIRMWARE_OFF); -#else -#ifdef CONFIG_SMP - OldIrql = KeRaiseIrqlToDpcLevel(); - /* Halt all other processors */ - for (i = 0; i < KeNumberProcessors; i++) - { - if (i != (LONG)KeGetCurrentProcessorNumber()) - { - PKDPC Dpc = ExAllocatePool(NonPagedPool, sizeof(KDPC)); - if (Dpc == NULL) - { - ASSERT(FALSE); - } - KeInitializeDpc(Dpc, KiHaltProcessorDpcRoutine, (PVOID)Dpc); - KeSetTargetProcessorDpc(Dpc, i); - KeInsertQueueDpc(Dpc, NULL, NULL); - KiIpiSend(1 << i, IPI_DPC); - } - } - KeLowerIrql(OldIrql); -#endif /* CONFIG_SMP */ - PopSetSystemPowerState(PowerSystemShutdown); - - DPRINT1("Shutting down\n"); - - KiHaltProcessorDpcRoutine(NULL, NULL, NULL, NULL); - /* KiHaltProcessor does never return */ - -#endif - } - else if (Action == ShutdownReboot) - { - HalReturnToFirmware (HalRebootRoutine); - } - else - { - HalReturnToFirmware (HalHaltRoutine); - } -} - - -NTSTATUS NTAPI -NtSetSystemPowerState(IN POWER_ACTION SystemAction, - IN SYSTEM_POWER_STATE MinSystemState, - IN ULONG Flags) -{ - /* Windows 2000 only */ - return(STATUS_NOT_IMPLEMENTED); -} - /* * @implemented */ -NTSTATUS NTAPI +NTSTATUS +NTAPI NtShutdownSystem(IN SHUTDOWN_ACTION Action) { - NTSTATUS Status; - HANDLE ThreadHandle; - PETHREAD ShutdownThread; - - if (Action > ShutdownPowerOff) - return STATUS_INVALID_PARAMETER; - Status = PsCreateSystemThread(&ThreadHandle, - THREAD_ALL_ACCESS, - NULL, - NULL, - NULL, - ShutdownThreadMain, - (PVOID)Action); - if (!NT_SUCCESS(Status)) - { - ASSERT(FALSE); - } - Status = ObReferenceObjectByHandle(ThreadHandle, - THREAD_ALL_ACCESS, - PsThreadType, - KernelMode, - (PVOID*)&ShutdownThread, - NULL); - NtClose(ThreadHandle); - if (!NT_SUCCESS(Status)) - { - ASSERT(FALSE); - } - - KeSetPriorityThread(&ShutdownThread->Tcb, LOW_REALTIME_PRIORITY + 1); - ObDereferenceObject(ShutdownThread); - - return STATUS_SUCCESS; + POWER_ACTION PowerAction; + + /* Convert to power action */ + if (Action == ShutdownNoReboot) + { + PowerAction = PowerActionShutdown; + } + else if (Action == ShutdownReboot) + { + PowerAction = PowerActionShutdownReset; + } + else if (Action == ShutdownPowerOff) + { + PowerAction = PowerActionShutdownOff; + } + else + { + return STATUS_INVALID_PARAMETER; + } + + /* Now call the power manager */ + DPRINT1("Setting state to: %lx\n", PowerAction); + return NtSetSystemPowerState(PowerAction, + PowerSystemSleeping3, + POWER_ACTION_OVERRIDE_APPS | + POWER_ACTION_DISABLE_WAKES | + POWER_ACTION_CRITICAL); } /* EOF */ diff --git a/reactos/ntoskrnl/ex/work.c b/reactos/ntoskrnl/ex/work.c index abedd6b4985..d3cf4b5643e 100644 --- a/reactos/ntoskrnl/ex/work.c +++ b/reactos/ntoskrnl/ex/work.c @@ -43,7 +43,7 @@ ULONG ExpAdditionalDelayedWorkerThreads; /* Future support for stack swapping worker threads */ BOOLEAN ExpWorkersCanSwap; LIST_ENTRY ExpWorkerListHead; -KMUTANT ExpWorkerSwapinMutex; +FAST_MUTEX ExpWorkerSwapinMutex; /* The worker balance set manager events */ KEVENT ExpThreadSetManagerEvent; @@ -513,7 +513,7 @@ ExpInitializeWorkerThreads(VOID) ULONG i; /* Setup the stack swap support */ - KeInitializeMutex(&ExpWorkerSwapinMutex, FALSE); + ExInitializeFastMutex(&ExpWorkerSwapinMutex); InitializeListHead(&ExpWorkerListHead); ExpWorkersCanSwap = TRUE; @@ -589,6 +589,89 @@ ExpInitializeWorkerThreads(VOID) ObCloseHandle(ThreadHandle, KernelMode); } +VOID +NTAPI +ExpSetSwappingKernelApc(IN PKAPC Apc, + OUT PKNORMAL_ROUTINE *NormalRoutine, + IN OUT PVOID *NormalContext, + IN OUT PVOID *SystemArgument1, + IN OUT PVOID *SystemArgument2) +{ + PBOOLEAN AllowSwap; + PKEVENT Event = (PKEVENT)*SystemArgument1; + + /* Make sure it's an active worker */ + if (PsGetCurrentThread()->ActiveExWorker) + { + /* Read the setting from the context flag */ + AllowSwap = (PBOOLEAN)NormalContext; + KeSetKernelStackSwapEnable(*AllowSwap); + } + + /* Let caller know that we're done */ + KeSetEvent(Event, 0, FALSE); +} + +VOID +NTAPI +ExSwapinWorkerThreads(IN BOOLEAN AllowSwap) +{ + KEVENT Event; + PETHREAD CurrentThread = PsGetCurrentThread(), Thread; + PEPROCESS Process = PsInitialSystemProcess; + KAPC Apc; + PAGED_CODE(); + + /* Initialize an event so we know when we're done */ + KeInitializeEvent(&Event, NotificationEvent, FALSE); + + /* Lock this routine */ + ExAcquireFastMutex(&ExpWorkerSwapinMutex); + + /* New threads cannot swap anymore */ + ExpWorkersCanSwap = AllowSwap; + + /* Loop all threads in the system process */ + Thread = PsGetNextProcessThread(Process, NULL); + while (Thread) + { + /* Skip threads with explicit permission to do this */ + if (Thread->ExWorkerCanWaitUser) goto Next; + + /* Check if we reached ourselves */ + if (Thread == CurrentThread) + { + /* Do it inline */ + KeSetKernelStackSwapEnable(AllowSwap); + } + else + { + /* Queue an APC */ + KeInitializeApc(&Apc, + &Thread->Tcb, + InsertApcEnvironment, + ExpSetSwappingKernelApc, + NULL, + NULL, + KernelMode, + &AllowSwap); + if (KeInsertQueueApc(&Apc, &Event, NULL, 3)) + { + /* Wait for the APC to run */ + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + KeClearEvent(&Event); + } + } + + /* Next thread */ +Next: + Thread = PsGetNextProcessThread(Process, Thread); + } + + /* Release the lock */ + ExReleaseFastMutex(&ExpWorkerSwapinMutex); +} + /* PUBLIC FUNCTIONS **********************************************************/ /*++ diff --git a/reactos/ntoskrnl/fstub/halstub.c b/reactos/ntoskrnl/fstub/halstub.c index a6469458ac9..38eec69b014 100644 --- a/reactos/ntoskrnl/fstub/halstub.c +++ b/reactos/ntoskrnl/fstub/halstub.c @@ -36,7 +36,7 @@ HAL_DISPATCH HalDispatchTable = (pHalStartMirroring)NULL, (pHalEndMirroring)NULL, (pHalMirrorPhysicalMemory)NULL, - (pHalEndOfBoot)NULL, + xHalEndOfBoot, (pHalMirrorVerify)NULL }; @@ -47,7 +47,7 @@ HAL_PRIVATE_DISPATCH HalPrivateDispatchTable = (pHalHandlerForConfigSpace)NULL, (pHalLocateHiberRanges)NULL, (pHalRegisterBusHandler)NULL, - (pHalSetWakeEnable)NULL, + xHalSetWakeEnable, (pHalSetWakeAlarm)NULL, (pHalTranslateBusAddress)NULL, (pHalAssignSlotResources)NULL, @@ -81,3 +81,19 @@ xHalHaltSystem(VOID) /* Halt execution */ while (TRUE); } + +VOID +NTAPI +xHalEndOfBoot(VOID) +{ + /* Nothing */ + return; +} + +VOID +NTAPI +xHalSetWakeEnable(IN BOOLEAN Enable) +{ + /* Nothing */ + return; +} diff --git a/reactos/ntoskrnl/inbv/inbv.c b/reactos/ntoskrnl/inbv/inbv.c index ef0faa03917..52cc7108386 100644 --- a/reactos/ntoskrnl/inbv/inbv.c +++ b/reactos/ntoskrnl/inbv/inbv.c @@ -5,24 +5,6 @@ #include #include "bootvid/bootvid.h" -// -// Bitmap Header -// -typedef struct tagBITMAPINFOHEADER -{ - ULONG biSize; - LONG biWidth; - LONG biHeight; - USHORT biPlanes; - USHORT biBitCount; - ULONG biCompression; - ULONG biSizeImage; - LONG biXPelsPerMeter; - LONG biYPelsPerMeter; - ULONG biClrUsed; - ULONG biClrImportant; -} BITMAPINFOHEADER, *PBITMAPINFOHEADER; - /* GLOBALS *******************************************************************/ KSPIN_LOCK BootDriverLock; @@ -40,6 +22,7 @@ PUCHAR ResourceList[64]; BOOLEAN SysThreadCreated; ROT_BAR_TYPE RotBarSelection; ULONG PltRotBarStatus; +BT_PROGRESS_INDICATOR InbvProgressIndicator = {0, 25, 0}; /* FUNCTIONS *****************************************************************/ @@ -407,38 +390,29 @@ VOID NTAPI InbvUpdateProgressBar(IN ULONG Progress) { - ULONG FillCount, Left = 0; + ULONG FillCount, BoundedProgress; /* Make sure the progress bar is enabled, that we own and are installed */ if ((ShowProgressBar) && (InbvBootDriverInstalled) && (InbvDisplayState == INBV_DISPLAY_STATE_OWNED)) { - /* Calculate the fill count */ - FillCount = InbvProgressState.Bias * Progress + InbvProgressState.Floor; - FillCount *= 18; - FillCount /= 10000; + /* Compute fill count */ + BoundedProgress = (InbvProgressState.Floor / 100) + Progress; + FillCount = 121 * (InbvProgressState.Bias * BoundedProgress) / 1000000; - /* Start fill loop */ - while (FillCount) - { - /* Acquire the lock */ - InbvAcquireLock(); + /* Acquire the lock */ + InbvAcquireLock(); - /* Fill the progress bar */ - VidSolidColorFill(Left + ProgressBarLeft, - ProgressBarTop, - Left + ProgressBarLeft + 7, - ProgressBarTop + 7, - 11); + /* Fill the progress bar */ + VidSolidColorFill(ProgressBarLeft, + ProgressBarTop, + ProgressBarLeft + FillCount, + ProgressBarTop + 12, + 15); - /* Release the lock */ - InbvReleaseLock(); - - /* Update the X position */ - Left += 9; - FillCount--; - } + /* Release the lock */ + InbvReleaseLock(); } } @@ -527,6 +501,27 @@ InbvSetProgressBarSubset(IN ULONG Floor, InbvProgressState.Bias = (Ceiling * 100) - Floor; } +VOID +NTAPI +InbvIndicateProgress(VOID) +{ + ULONG Percentage; + + /* Increase progress */ + InbvProgressIndicator.Count++; + + /* Compute new percentage */ + Percentage = min(100 * InbvProgressIndicator.Count / + InbvProgressIndicator.Expected, + 99); + if (Percentage != InbvProgressIndicator.Percentage) + { + /* Percentage has moved, update the progress bar */ + InbvProgressIndicator.Percentage = Percentage; + InbvUpdateProgressBar(Percentage); + } +} + PUCHAR NTAPI InbvGetResourceAddress(IN ULONG ResourceNumber) @@ -557,9 +552,10 @@ VOID NTAPI DisplayBootBitmap(IN BOOLEAN SosMode) { - PVOID Bitmap, Header; + PVOID Header, Band, Bar, Text, Screen; ROT_BAR_TYPE TempRotBarSelection = RB_UNSPECIFIED; - + UCHAR Buffer[64]; + /* Check if the system thread has already been created */ if (SysThreadCreated) { @@ -580,10 +576,10 @@ DisplayBootBitmap(IN BOOLEAN SosMode) InbvSetTextColor(15); InbvSolidColorFill(0, 0, 639, 479, 7); InbvSolidColorFill(0, 421, 639, 479, 1); - + /* Get resources */ - Bitmap = InbvGetResourceAddress(6); - Header = InbvGetResourceAddress(7); + Header = InbvGetResourceAddress(IDB_LOGO_HEADER); + Band = InbvGetResourceAddress(IDB_LOGO_BAND); } else { @@ -593,40 +589,87 @@ DisplayBootBitmap(IN BOOLEAN SosMode) InbvSolidColorFill(0, 421, 639, 479, 1); /* Get resources */ - Bitmap = InbvGetResourceAddress(6); - Header = InbvGetResourceAddress(15); + Header = InbvGetResourceAddress(IDB_SERVER_HEADER); + Band = InbvGetResourceAddress(IDB_SERVER_BAND); } /* Set the scrolling region */ InbvSetScrollRegion(32, 80, 631, 400); /* Make sure we have resources */ - if ((Bitmap) && (Header)) + if ((Header) && (Band)) { /* BitBlt them on the screen */ - InbvBitBlt(Header, 0, 419); - InbvBitBlt(Bitmap, 0, 0); + InbvBitBlt(Band, 0, 419); + InbvBitBlt(Header, 0, 0); } } else { /* Is the boot driver installed? */ + Text = NULL; if (!InbvBootDriverInstalled) return; - /* FIXME: TODO, display full-screen bitmap */ - Bitmap = InbvGetResourceAddress(5); - if (Bitmap) + /* Load the standard boot screen */ + Screen = InbvGetResourceAddress(IDB_BOOT_LOGO); + if (SharedUserData->NtProductType == NtProductWinNt) { - PBITMAPINFOHEADER BitmapInfoHeader = (PBITMAPINFOHEADER)Bitmap; - ULONG Top, Left; - - Left = (640 - BitmapInfoHeader->biWidth) / 2; - if (BitmapInfoHeader->biHeight < 0) - Top = (480 + BitmapInfoHeader->biHeight) / 2; - else - Top = (480 - BitmapInfoHeader->biHeight) / 2; - InbvBitBlt(Bitmap, Left, Top); + /* Workstation product, display appropriate status bar color */ + Bar = InbvGetResourceAddress(IDB_BAR_PRO); } + else + { + /* Display correct branding based on server suite */ + if (ExVerifySuite(StorageServer)) + { + /* Storage Server Edition */ + Text = InbvGetResourceAddress(IDB_STORAGE_SERVER); + } + else if (ExVerifySuite(ComputeServer)) + { + /* Compute Cluster Edition */ + Text = InbvGetResourceAddress(IDB_CLUSTER_SERVER); + } + else + { + /* Normal edition */ + Text = InbvGetResourceAddress(IDB_SERVER_LOGO); + } + + /* Server product, display appropriate status bar color */ + Bar = InbvGetResourceAddress(IDB_BAR_SERVER); + } + + /* Make sure we had a logo */ + if (Screen) + { + /* Choose progress bar */ + TempRotBarSelection = RB_SQUARE_CELLS; + + /* Blit the background */ + InbvBitBlt(Screen, 0, 0); + + /* Set progress bar coordinates and display it */ + InbvSetProgressBarCoordinates(257, 352); + + /* Check for non-workstation products */ + if (SharedUserData->NtProductType != NtProductWinNt) + { + /* Overwrite part of the logo for a server product */ + InbvScreenToBufferBlt(Buffer, 413, 237, 7, 7, 8); + InbvSolidColorFill(418, 230, 454, 256, 0); + InbvBufferToScreenBlt(Buffer, 413, 237, 7, 7, 8); + + /* In setup mode, you haven't selected a SKU yet */ + if (ExpInTextModeSetup) Text = NULL; + } + } + + /* Draw the SKU text if it exits */ + if (Text) InbvBitBlt(Text, 180, 121); + + /* Draw the progress bar bit */ +// if (Bar) InbvBitBlt(Bar, 0, 0); } /* Do we have a system thread? */ diff --git a/reactos/ntoskrnl/inbv/logo/1.bmp b/reactos/ntoskrnl/inbv/logo/1.bmp index a2b59398aae..d13c48d16c0 100644 Binary files a/reactos/ntoskrnl/inbv/logo/1.bmp and b/reactos/ntoskrnl/inbv/logo/1.bmp differ diff --git a/reactos/ntoskrnl/inbv/logo/13.bmp b/reactos/ntoskrnl/inbv/logo/13.bmp deleted file mode 100644 index 209227e9847..00000000000 Binary files a/reactos/ntoskrnl/inbv/logo/13.bmp and /dev/null differ diff --git a/reactos/ntoskrnl/inbv/logo/14.bmp b/reactos/ntoskrnl/inbv/logo/14.bmp index 64439e9a245..c2a55625bf0 100644 Binary files a/reactos/ntoskrnl/inbv/logo/14.bmp and b/reactos/ntoskrnl/inbv/logo/14.bmp differ diff --git a/reactos/ntoskrnl/inbv/logo/15.bmp b/reactos/ntoskrnl/inbv/logo/15.bmp index d137807c9f9..88481b9284d 100644 Binary files a/reactos/ntoskrnl/inbv/logo/15.bmp and b/reactos/ntoskrnl/inbv/logo/15.bmp differ diff --git a/reactos/ntoskrnl/inbv/logo/16.bmp b/reactos/ntoskrnl/inbv/logo/16.bmp deleted file mode 100644 index 209227e9847..00000000000 Binary files a/reactos/ntoskrnl/inbv/logo/16.bmp and /dev/null differ diff --git a/reactos/ntoskrnl/inbv/logo/17.bmp b/reactos/ntoskrnl/inbv/logo/17.bmp deleted file mode 100644 index 209227e9847..00000000000 Binary files a/reactos/ntoskrnl/inbv/logo/17.bmp and /dev/null differ diff --git a/reactos/ntoskrnl/inbv/logo/2.bmp b/reactos/ntoskrnl/inbv/logo/2.bmp index 43984762c5f..04461badcf4 100644 Binary files a/reactos/ntoskrnl/inbv/logo/2.bmp and b/reactos/ntoskrnl/inbv/logo/2.bmp differ diff --git a/reactos/ntoskrnl/inbv/logo/3.bmp b/reactos/ntoskrnl/inbv/logo/3.bmp index 7e95ca2b662..c10b768de5f 100644 Binary files a/reactos/ntoskrnl/inbv/logo/3.bmp and b/reactos/ntoskrnl/inbv/logo/3.bmp differ diff --git a/reactos/ntoskrnl/inbv/logo/4.bmp b/reactos/ntoskrnl/inbv/logo/4.bmp index 239307b7d95..7aabbbfeb6e 100644 Binary files a/reactos/ntoskrnl/inbv/logo/4.bmp and b/reactos/ntoskrnl/inbv/logo/4.bmp differ diff --git a/reactos/ntoskrnl/inbv/logo/5.bmp b/reactos/ntoskrnl/inbv/logo/5.bmp index f0cce0e2fed..94fb7a9dfde 100644 Binary files a/reactos/ntoskrnl/inbv/logo/5.bmp and b/reactos/ntoskrnl/inbv/logo/5.bmp differ diff --git a/reactos/ntoskrnl/inbv/logo/6.bmp b/reactos/ntoskrnl/inbv/logo/6.bmp index a8cafc569c0..08344117cb2 100644 Binary files a/reactos/ntoskrnl/inbv/logo/6.bmp and b/reactos/ntoskrnl/inbv/logo/6.bmp differ diff --git a/reactos/ntoskrnl/inbv/logo/7.bmp b/reactos/ntoskrnl/inbv/logo/7.bmp index d137807c9f9..24ea2137758 100644 Binary files a/reactos/ntoskrnl/inbv/logo/7.bmp and b/reactos/ntoskrnl/inbv/logo/7.bmp differ diff --git a/reactos/ntoskrnl/inbv/logo/8.bmp b/reactos/ntoskrnl/inbv/logo/8.bmp index 239307b7d95..344e0b23c44 100644 Binary files a/reactos/ntoskrnl/inbv/logo/8.bmp and b/reactos/ntoskrnl/inbv/logo/8.bmp differ diff --git a/reactos/ntoskrnl/include/config.h b/reactos/ntoskrnl/include/config.h index 656080f7a4b..7e925ef419a 100644 --- a/reactos/ntoskrnl/include/config.h +++ b/reactos/ntoskrnl/include/config.h @@ -1,5 +1,4 @@ -#ifndef __INCLUDE_NTOSKRNL_CONFIG_H -#define __INCLUDE_NTOSKRNL_CONFIG_H +#pragma once /********** dbg/print.c **********/ @@ -39,6 +38,3 @@ */ #undef WHOLE_PAGE_ALLOCATIONS #endif - -#endif /* __INCLUDE_NTOSKRNL_CONFIG_H */ - diff --git a/reactos/ntoskrnl/include/internal/arch/intrin_i.h b/reactos/ntoskrnl/include/internal/arch/intrin_i.h index d7af74f6c37..7d6dfab3557 100644 --- a/reactos/ntoskrnl/include/internal/arch/intrin_i.h +++ b/reactos/ntoskrnl/include/internal/arch/intrin_i.h @@ -16,8 +16,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __NTOSKRNL_INCLUDE_INTERNAL_ARCH_INTRIN_I_H -#define __NTOSKRNL_INCLUDE_INTERNAL_ARCH_INTRIN_I_H + +#pragma once #ifdef _M_IX86 #include "../i386/intrin_i.h" @@ -33,6 +33,4 @@ #error "Unknown processor" #endif -#endif /* __NTOSKRNL_INCLUDE_INTERNAL_ARCH_INTRIN_I_H */ - /* EOF */ diff --git a/reactos/ntoskrnl/include/internal/arch/ke.h b/reactos/ntoskrnl/include/internal/arch/ke.h index 512ff1c579f..3e1b8a5b290 100644 --- a/reactos/ntoskrnl/include/internal/arch/ke.h +++ b/reactos/ntoskrnl/include/internal/arch/ke.h @@ -16,8 +16,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __NTOSKRNL_INCLUDE_INTERNAL_ARCH_KE_H -#define __NTOSKRNL_INCLUDE_INTERNAL_ARCH_KE_H + +#pragma once #ifdef _M_IX86 #include "../i386/ke.h" @@ -33,8 +33,4 @@ #error "Unknown processor" #endif -VOID KiArchInitSystem(VOID); - -#endif /* __NTOSKRNL_INCLUDE_INTERNAL_ARCH_KE_H */ - /* EOF */ diff --git a/reactos/ntoskrnl/include/internal/arch/mm.h b/reactos/ntoskrnl/include/internal/arch/mm.h index f8e2aec354c..f5ee0276ca2 100644 --- a/reactos/ntoskrnl/include/internal/arch/mm.h +++ b/reactos/ntoskrnl/include/internal/arch/mm.h @@ -16,8 +16,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __NTOSKRNL_INCLUDE_INTERNAL_ARCH_MM_H -#define __NTOSKRNL_INCLUDE_INTERNAL_ARCH_MM_H + +#pragma once #ifdef _M_IX86 #include @@ -32,5 +32,3 @@ #else #error "Unknown processor" #endif - -#endif /* __NTOSKRNL_INCLUDE_INTERNAL_ARCH_MM_H */ diff --git a/reactos/ntoskrnl/include/internal/arm/intrin_i.h b/reactos/ntoskrnl/include/internal/arm/intrin_i.h index 286a1f6a355..fdd4b88660d 100644 --- a/reactos/ntoskrnl/include/internal/arm/intrin_i.h +++ b/reactos/ntoskrnl/include/internal/arm/intrin_i.h @@ -1,5 +1,4 @@ -#ifndef _INTRIN_INTERNAL_ -#define _INTRIN_INTERNAL_ +#pragma once FORCEINLINE VOID @@ -154,5 +153,3 @@ KeArmWaitForInterrupt(VOID) { __asm__ __volatile__ ("mcr p15, 0, %0, c7, c0, 4" : : "r"(0) : "cc"); } - -#endif diff --git a/reactos/ntoskrnl/include/internal/arm/ke.h b/reactos/ntoskrnl/include/internal/arm/ke.h index 964b63b7162..80fee0a7e19 100644 --- a/reactos/ntoskrnl/include/internal/arm/ke.h +++ b/reactos/ntoskrnl/include/internal/arm/ke.h @@ -1,5 +1,4 @@ -#ifndef __NTOSKRNL_INCLUDE_INTERNAL_ARM_KE_H -#define __NTOSKRNL_INCLUDE_INTERNAL_ARM_KE_H +#pragma once #include "intrin_i.h" @@ -54,7 +53,7 @@ // All architectures but x86 have it in the PRCB's KeContextSwitches // #define KeGetContextSwitches(Prcb) \ - Prcb->KeContextSwitches + CONTAINING_RECORD(Prcb, KIPCR, PrcbData)->ContextSwitches // // Returns the Interrupt State from a Trap Frame. @@ -77,10 +76,7 @@ FORCEINLINE VOID KeFlushProcessTb(VOID) { - // - // We need to implement this! - // - ASSERTMSG("Need ARM flush routine\n", FALSE); + KeArmFlushTlb(); } FORCEINLINE @@ -107,13 +103,6 @@ KiApcInterrupt( #include "mm.h" -VOID -KeFillFixedEntryTb( - IN ARM_PTE Pte, - IN PVOID Virtual, - IN ULONG Index -); - VOID KeFlushTb( VOID @@ -127,5 +116,3 @@ KeFlushTb( #define KiGetPreviousMode(tf) \ ((tf->Spsr & CPSR_MODES) == CPSR_USER_MODE) ? UserMode: KernelMode - -#endif diff --git a/reactos/ntoskrnl/include/internal/arm/mm.h b/reactos/ntoskrnl/include/internal/arm/mm.h index ba4f399000d..415fa183ef2 100644 --- a/reactos/ntoskrnl/include/internal/arm/mm.h +++ b/reactos/ntoskrnl/include/internal/arm/mm.h @@ -1,6 +1,32 @@ -#ifndef __NTOSKRNL_INCLUDE_INTERNAL_ARM_MM_H -#define __NTOSKRNL_INCLUDE_INTERNAL_ARM_MM_H +#pragma once +// +// Number of bits corresponding to the area that a PDE entry represents (1MB) +// +#define PDE_SHIFT 20 +#define PDE_SIZE (1 << PDE_SHIFT) + +// +// Number of bits corresponding to the area that a coarse page table entry represents (4KB) +// +#define PTE_SHIFT 12 +#define PTE_SIZE (1 << PTE_SHIFT) + +// +// Number of bits corresponding to the area that a coarse page table occupies (1KB) +// +#define CPT_SHIFT 10 +#define CPT_SIZE (1 << CPT_SHIFT) + +// +// Base Addresses +// +#define PTE_BASE 0xC0000000 +#define PTE_TOP 0xC03FFFFF +#define PDE_BASE 0xC0400000 +#define HYPER_SPACE 0xC0500000 + +#if 0 typedef struct _HARDWARE_PDE_ARMV6 { ULONG Valid:1; // Only for small pages @@ -33,18 +59,14 @@ typedef struct _HARDWARE_LARGE_PTE_ARMV6 ULONG PageFrameNumber:12; } HARDWARE_LARGE_PTE_ARMV6, *PHARDWARE_LARGE_PTE_ARMV6; -C_ASSERT(sizeof(HARDWARE_PDE_ARMV6) == sizeof(ULONG)); -C_ASSERT(sizeof(HARDWARE_LARGE_PTE_ARMV6) == sizeof(ULONG)); - - typedef struct _HARDWARE_PTE_ARMV6 { ULONG NoExecute:1; ULONG Valid:1; ULONG Buffered:1; ULONG Cached:1; - ULONG Owner:1; ULONG Accessed:1; + ULONG Owner:1; ULONG CacheAttributes:3; ULONG ReadOnly:1; ULONG Shared:1; @@ -52,155 +74,28 @@ typedef struct _HARDWARE_PTE_ARMV6 ULONG PageFrameNumber:20; } HARDWARE_PTE_ARMV6, *PHARDWARE_PTE_ARMV6; +C_ASSERT(sizeof(HARDWARE_PDE_ARMV6) == sizeof(ULONG)); +C_ASSERT(sizeof(HARDWARE_LARGE_PTE_ARMV6) == sizeof(ULONG)); +C_ASSERT(sizeof(HARDWARE_PTE_ARMV6) == sizeof(ULONG)); +#endif + /* For FreeLDR */ +typedef struct _PAGE_TABLE_ARM +{ + HARDWARE_PTE_ARMV6 Pte[1024]; +} PAGE_TABLE_ARM, *PPAGE_TABLE_ARM; + typedef struct _PAGE_DIRECTORY_ARM { - HARDWARE_PDE_ARMV6 Pde[4096]; + union + { + HARDWARE_PDE_ARMV6 Pde[4096]; + HARDWARE_LARGE_PTE_ARMV6 Pte[4096]; + }; } PAGE_DIRECTORY_ARM, *PPAGE_DIRECTORY_ARM; -// -// Number of bits corresponding to the area that a PDE entry represents (1MB) -// -#define PDE_SHIFT 20 -#define PDE_SIZE (1 << PDE_SHIFT) - -// -// FIXFIX: This is all wrong now!!! -// - - -// -// Number of bits corresponding to the area that a coarse page table entry represents (4KB) -// -#define PTE_SHIFT 12 -//#define PAGE_SIZE (1 << PTE_SHIFT) // FIXME: This conflicts with ndk/arm/mmtypes.h which does #define PAGE_SIZE 0x1000 -- use PTE_SIZE here instead? - -// -// Number of bits corresponding to the area that a coarse page table occupies (1KB) -// -#define CPT_SHIFT 10 -#define CPT_SIZE (1 << CPT_SHIFT) - - - -// -// FIXFIX: This is all wrong now!!! -// -typedef union _ARM_PTE -{ - union - { - struct - { - ULONG Type:2; - ULONG Unused:30; - } Fault; - struct - { - ULONG Type:2; - ULONG Ignored:2; - ULONG Reserved:1; - ULONG Domain:4; - ULONG Ignored1:1; - ULONG BaseAddress:22; - } Coarse; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Reserved:1; - ULONG Domain:4; - ULONG Ignored:1; - ULONG Access:2; - ULONG Ignored1:8; - ULONG BaseAddress:12; - } Section; - struct - { - ULONG Type:2; - ULONG Reserved:3; - ULONG Domain:4; - ULONG Ignored:3; - ULONG BaseAddress:20; - } Fine; - } L1; - union - { - struct - { - ULONG Type:2; - ULONG Unused:30; - } Fault; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Access0:2; - ULONG Access1:2; - ULONG Access2:2; - ULONG Access3:2; - ULONG Ignored:4; - ULONG BaseAddress:16; - } Large; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Access0:2; - ULONG Access1:2; - ULONG Access2:2; - ULONG Access3:2; - ULONG BaseAddress:20; - } Small; - struct - { - ULONG Type:2; - ULONG Buffered:1; - ULONG Cached:1; - ULONG Access0:2; - ULONG Ignored:4; - ULONG BaseAddress:22; - } Tiny; - } L2; - ULONG AsUlong; -} ARM_PTE, *PARM_PTE; - -typedef struct _ARM_TRANSLATION_TABLE -{ - ARM_PTE Pte[4096]; -} ARM_TRANSLATION_TABLE, *PARM_TRANSLATION_TABLE; - -typedef struct _ARM_COARSE_PAGE_TABLE -{ - ARM_PTE Pte[256]; - ULONG Padding[768]; -} ARM_COARSE_PAGE_TABLE, *PARM_COARSE_PAGE_TABLE; - -typedef enum _ARM_L1_PTE_TYPE -{ - FaultPte, - CoarsePte, - SectionPte, - FinePte -} ARM_L1_PTE_TYPE; - -typedef enum _ARM_L2_PTE_TYPE -{ - LargePte = 1, - SmallPte, - TinyPte -} ARM_L2_PTE_TYPE; - -typedef enum _ARM_PTE_ACCESS -{ - FaultAccess, - SupervisorAccess, - SharedAccess, - UserAccess -} ARM_PTE_ACCESS; +C_ASSERT(sizeof(PAGE_TABLE_ARM) == PAGE_SIZE); +C_ASSERT(sizeof(PAGE_DIRECTORY_ARM) == (4 * PAGE_SIZE)); typedef enum _ARM_DOMAIN { @@ -210,67 +105,54 @@ typedef enum _ARM_DOMAIN ManagerDomain } ARM_DOMAIN; - -// -// FIXFIX: This is all wrong now!!! -// - -// -// Take 0x80812345 and extract: -// PTE_BASE[0x808][0x12] -// -#define MiGetPteAddress(x) \ - (PMMPTE)(PTE_BASE + \ - (((ULONG)(x) >> 20) << 12) + \ - ((((ULONG)(x) >> 12) & 0xFF) << 2)) - -#define MiGetPdeAddress(x) \ - (PMMPDE_HARDWARE)(PDE_BASE + \ - (((ULONG)(x) >> 20) << 2)) - -#define MiGetPdeOffset(x) (((ULONG)(x)) >> 22) - -#define PTE_BASE 0xC0000000 -#define PTE_TOP 0xC03FFFFF -#define PDE_BASE 0xC1000000 -#define HYPER_SPACE 0xC1100000 -#define HYPER_SPACE_END 0xC07FFFFF - struct _EPROCESS; PULONG MmGetPageDirectory(VOID); - -// -// FIXME: THESE ARE WRONG ATM. -// -#define MiAddressToPde(x) \ -((PMMPTE)(((((ULONG)(x)) >> 22) << 2) + PDE_BASE)) -#define MiAddressToPte(x) \ -((PMMPTE)(((((ULONG)(x)) >> 12) << 2) + PTE_BASE)) -#define MiAddressToPteOffset(x) \ -((((ULONG)(x)) << 10) >> 22) - -// -// Convert a PTE into a corresponding address -// -#define MiPteToAddress(PTE) ((PVOID)((ULONG)(PTE) << 10)) - -#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE)) -#define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE))) -#define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE) - #define MI_MAKE_LOCAL_PAGE(x) ((x)->u.Hard.NonGlobal = 1) #define MI_MAKE_DIRTY_PAGE(x) -#define MI_MAKE_OWNER_PAGE(x) ((x)->u.Hard.Access = 1) // FIXFIX -#define MI_MAKE_WRITE_PAGE(x) ((x)->u.Hard.ExtendedAccess = 1) // FIXFIX +#define MI_MAKE_OWNER_PAGE(x) ((x)->u.Hard.Owner = 1) +#define MI_MAKE_WRITE_PAGE(x) ((x)->u.Hard.ReadOnly = 0) #define MI_PAGE_DISABLE_CACHE(x) ((x)->u.Hard.Cached = 0) #define MI_PAGE_WRITE_THROUGH(x) ((x)->u.Hard.Buffered = 0) #define MI_PAGE_WRITE_COMBINED(x) ((x)->u.Hard.Buffered = 1) -#define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.ExtendedAccess == 0) +#define MI_IS_PAGE_WRITEABLE(x) ((x)->u.Hard.ReadOnly == 0) #define MI_IS_PAGE_COPY_ON_WRITE(x)FALSE #define MI_IS_PAGE_DIRTY(x) TRUE /* Easy accessing PFN in PTE */ #define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber) -#endif +#define NR_SECTION_PAGE_TABLES 1024 +#define NR_SECTION_PAGE_ENTRIES 256 + +/* See PDR definition */ +#define MI_HYPERSPACE_PTES (256 - 1) +#define MI_ZERO_PTES (32) +#define MI_MAPPING_RANGE_START ((ULONG)HYPER_SPACE) +#define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + \ + MI_HYPERSPACE_PTES * PAGE_SIZE) +#define MI_ZERO_PTE (PMMPTE)(MI_MAPPING_RANGE_END + \ + PAGE_SIZE) + +/* Retrives the PDE entry for the given VA */ +#define MiGetPdeAddress(x) ((PMMPDE)(PDE_BASE + (((ULONG)(x) >> 20) << 2))) +#define MiAddressToPde(x) MiGetPdeAddress(x) + +/* Retrieves the PTE entry for the given VA */ +#define MiGetPteAddress(x) ((PMMPTE)(PTE_BASE + (((ULONG)(x) >> 12) << 2))) +#define MiAddressToPte(x) MiGetPteAddress(x) + +/* Retrives the PDE offset for the given VA */ +#define MiGetPdeOffset(x) (((ULONG)(x)) >> 20) + +/* Convert a PTE into a corresponding address */ +#define MiPteToAddress(x) ((PVOID)((ULONG)(x) << 10)) +#define MiPdeToAddress(x) ((PVOID)((ULONG)(x) << 18)) + +#define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \ + ((x) / (4*1024*1024)) + +#define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \ + ((((x)) % (4*1024*1024)) / (4*1024)) + +#define MM_CACHE_LINE_SIZE 64 diff --git a/reactos/ntoskrnl/include/internal/cc.h b/reactos/ntoskrnl/include/internal/cc.h index 62221cb2ed8..30139ec6766 100644 --- a/reactos/ntoskrnl/include/internal/cc.h +++ b/reactos/ntoskrnl/include/internal/cc.h @@ -1,5 +1,4 @@ -#ifndef __INCLUDE_INTERNAL_CC_H -#define __INCLUDE_INTERNAL_CC_H +#pragma once typedef struct _PF_SCENARIO_ID { @@ -315,5 +314,3 @@ CcRosReleaseFileCache( NTSTATUS NTAPI CcTryToInitializeFileCache(PFILE_OBJECT FileObject); - -#endif diff --git a/reactos/ntoskrnl/include/internal/cm.h b/reactos/ntoskrnl/include/internal/cm.h index 9218e0741f0..537111a4f29 100644 --- a/reactos/ntoskrnl/include/internal/cm.h +++ b/reactos/ntoskrnl/include/internal/cm.h @@ -1454,6 +1454,12 @@ CmShutdownSystem( VOID ); +VOID +NTAPI +CmSetLazyFlushState( + IN BOOLEAN Enable +); + // // Global variables accessible from all of Cm // diff --git a/reactos/ntoskrnl/include/internal/ex.h b/reactos/ntoskrnl/include/internal/ex.h index 3c8803b3674..1c730359091 100644 --- a/reactos/ntoskrnl/include/internal/ex.h +++ b/reactos/ntoskrnl/include/internal/ex.h @@ -1,5 +1,4 @@ -#ifndef __NTOSKRNL_INCLUDE_INTERNAL_EXECUTIVE_H -#define __NTOSKRNL_INCLUDE_INTERNAL_EXECUTIVE_H +#pragma once /* GLOBAL VARIABLES *********************************************************/ @@ -27,6 +26,7 @@ extern ULONG NtGlobalFlag; extern ULONG ExpInitializationPhase; extern ULONG ExpAltTimeZoneBias; extern LIST_ENTRY ExSystemLookasideListHead; +extern PCALLBACK_OBJECT PowerStateCallback; typedef struct _EXHANDLE { @@ -159,6 +159,10 @@ VOID NTAPI ExpInitializeWorkerThreads(VOID); +VOID +NTAPI +ExSwapinWorkerThreads(IN BOOLEAN AllowSwap); + VOID NTAPI ExpInitLookasideLists(VOID); @@ -874,10 +878,10 @@ ExWaitForUnblockPushLock( ); /*++ - * @name ExInitializePushLock + * @name _ExInitializePushLock * INTERNAL MACRO * - * The ExInitializePushLock macro initializes a PushLock. + * The _ExInitializePushLock macro initializes a PushLock. * * @params PushLock * Pointer to the pushlock which is to be initialized. @@ -889,11 +893,12 @@ ExWaitForUnblockPushLock( *--*/ FORCEINLINE VOID -ExInitializePushLock(IN PULONG_PTR PushLock) +_ExInitializePushLock(IN PULONG_PTR PushLock) { /* Set the value to 0 */ *PushLock = 0; } +#define ExInitializePushLock _ExInitializePushLock /*++ * @name ExAcquirePushLockExclusive @@ -1252,7 +1257,7 @@ _ExReleaseFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex) if (InterlockedIncrement(&FastMutex->Count) <= 0) { /* Someone was waiting for it, signal the waiter */ - KeSetEventBoostPriority(&FastMutex->Gate, NULL); + KeSetEventBoostPriority(&FastMutex->Event, NULL); } } @@ -1293,7 +1298,7 @@ _ExReleaseFastMutex(IN OUT PFAST_MUTEX FastMutex) if (InterlockedIncrement(&FastMutex->Count) <= 0) { /* Someone was waiting for it, signal the waiter */ - KeSetEventBoostPriority(&FastMutex->Gate, NULL); + KeSetEventBoostPriority(&FastMutex->Event, NULL); } /* Lower IRQL back */ @@ -1410,5 +1415,3 @@ XIPInit( #define ExfInterlockedCompareExchange64UL(Destination, Exchange, Comperand) \ (ULONGLONG)ExfInterlockedCompareExchange64((PLONGLONG)(Destination), (PLONGLONG)(Exchange), (PLONGLONG)(Comperand)) - -#endif /* __NTOSKRNL_INCLUDE_INTERNAL_EXECUTIVE_H */ diff --git a/reactos/ntoskrnl/include/internal/hal.h b/reactos/ntoskrnl/include/internal/hal.h index 32638d25e93..47b76beee48 100644 --- a/reactos/ntoskrnl/include/internal/hal.h +++ b/reactos/ntoskrnl/include/internal/hal.h @@ -5,8 +5,8 @@ * PURPOSE: Internal header for the I/O HAL Functions (Fstub) * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) */ -#ifndef _HAL_ -#define _HAL_ + +#pragma once // // Default implementations of HAL dispatch table @@ -53,6 +53,18 @@ xHalHaltSystem( VOID ); +VOID +NTAPI +xHalEndOfBoot( + VOID +); + +VOID +NTAPI +xHalSetWakeEnable( + IN BOOLEAN Enable +); + UCHAR NTAPI xHalVectorToIDTEntry( @@ -156,5 +168,3 @@ typedef struct _PTE ULONG StartingSector; ULONG PartitionLength; } PTE, *PPTE; - -#endif diff --git a/reactos/ntoskrnl/include/internal/i386/asmmacro.S b/reactos/ntoskrnl/include/internal/i386/asmmacro.S index d0fabe98011..6ddb9d015ad 100644 --- a/reactos/ntoskrnl/include/internal/i386/asmmacro.S +++ b/reactos/ntoskrnl/include/internal/i386/asmmacro.S @@ -4,17 +4,12 @@ * FILE: ntoskrnl/include/i386/asmmacro.S * PURPOSE: Assembly Macros for Spinlocks and common Trap Code * PROGRAMMERS: Alex Ionescu (alex@relsoft.net) + * Timo Kreuzer (timo.kreuzer@reactos.org) */ -/* INCLUDES ******************************************************************/ - -#include - // Arguments for idt -#define INT_32_DPL0 0x8E00 -#define INT_32_DPL3 0xEE00 - -.intel_syntax noprefix +#define INT_32_DPL0 HEX(08E00) +#define INT_32_DPL3 HEX(0EE00) // // These macros are inlined equivalents of KiAcquire/ReleaseSpinlock, that is, @@ -30,7 +25,7 @@ // #IFDEF CONFIG_SMP // .spin // -/ SPIN_ON_LOCK(reg, .BeginYourFunction) +// SPIN_ON_LOCK(reg, .BeginYourFunction) // #ENDIF // #ifdef CONFIG_SMP @@ -64,74 +59,293 @@ // // @remark None. // -.macro idt Handler, Bits +MACRO(idt, Handler, Bits) .long \Handler .short \Bits .short KGDT_R0_CODE -.endm +ENDM -// -// @name GENERATE_IDT_STUB -// -// This macro creates an IDT entry for an unexpected interrupt handler. -// -// @param None. -// -// @remark None. -// -.macro GENERATE_IDT_STUB Number -idt _KiUnexpectedInterrupt&Number, INT_32_DPL0 -.endm -// -// @name GENERATE_IDT_STUBS -// -// This macro creates unexpected interrupt IDT entries. -// -// @param None. -// -// @remark None. -// -.altmacro -.macro GENERATE_IDT_STUBS -.set i, 0 -.rept 208 - GENERATE_IDT_STUB %i - .set i, i + 1 -.endr -.endm +KI_PUSH_FAKE_ERROR_CODE = HEX(0001) +KI_UNUSED = HEX(0002) +KI_NONVOLATILES_ONLY = HEX(0004) +KI_FAST_SYSTEM_CALL = HEX(0008) +KI_SOFTWARE_TRAP = HEX(0010) +KI_HARDWARE_INT = HEX(0020) +KI_DONT_SAVE_SEGS = HEX(0100) -// -// @name GENERATE_INT_HANDLER -// -// This macro creates an unexpected interrupt handler. -// -// @param None. -// -// @remark None. -// -.macro GENERATE_INT_HANDLER Number -.func KiUnexpectedInterrupt&Number -_KiUnexpectedInterrupt&Number: - mov eax, PRIMARY_VECTOR_BASE + Number - jmp _KiEndUnexpectedRange@0 -.endfunc -.endm +MACRO(KiEnterTrap, Flags) + LOCAL kernel_trap + LOCAL not_v86_trap + LOCAL set_sane_segs + + /* Check what kind of trap frame this trap requires */ + if (Flags AND KI_FAST_SYSTEM_CALL) + + /* SYSENTER requires us to build a complete ring transition trap frame */ + FrameSize = KTRAP_FRAME_V86_ES + + /* Fixup fs. cx is free to clobber */ + mov cx, KGDT_R0_PCR + mov fs, cx + + /* Get pointer to the TSS */ + mov ecx, fs:[KPCR_TSS] + + /* Get a stack pointer */ + mov esp, [ecx + KTSS_ESP0] + + elseif (Flags AND KI_SOFTWARE_TRAP) + + /* Software traps need a complete non-ring transition trap frame */ + FrameSize = KTRAP_FRAME_ESP + + /* Software traps need to get their EIP from the caller's frame */ + pop eax + + elseif (Flags AND KI_PUSH_FAKE_ERROR_CODE) + + /* If the trap doesn't have an error code, we'll make space for it */ + FrameSize = KTRAP_FRAME_EIP + + else + + /* The trap already has an error code, so just make space for the rest */ + FrameSize = KTRAP_FRAME_ERROR_CODE + + endif + + /* Make space for this frame */ + sub esp, FrameSize + + /* Save nonvolatile registers */ + mov [esp + KTRAP_FRAME_EBP], ebp + mov [esp + KTRAP_FRAME_EBX], ebx + mov [esp + KTRAP_FRAME_ESI], esi + mov [esp + KTRAP_FRAME_EDI], edi + + /* Save eax for system calls, for use by the C handler */ + mov [esp + KTRAP_FRAME_EAX], eax + + /* Does the caller want nonvolatiles only? */ + if ((Flags AND KI_NONVOLATILES_ONLY) == 0) + /* Otherwise, save the volatiles as well */ + mov [esp + KTRAP_FRAME_ECX], ecx + mov [esp + KTRAP_FRAME_EDX], edx + endif + + /* Save segment registers? */ + if ((Flags AND KI_DONT_SAVE_SEGS) == 0) + + /* Check for V86 mode */ + test byte ptr [esp + KTRAP_FRAME_EFLAGS + 2], (EFLAGS_V86_MASK >> 16) + jz not_v86_trap + + /* Restore V8086 segments into Protected Mode segments */ + mov eax, [esp + KTRAP_FRAME_V86_DS] + mov ecx, [esp + KTRAP_FRAME_V86_ES] + mov [esp + KTRAP_FRAME_DS], eax + mov [esp + KTRAP_FRAME_ES], ecx + mov eax, [esp + KTRAP_FRAME_V86_FS] + mov ecx, [esp + KTRAP_FRAME_V86_GS] + mov [esp + KTRAP_FRAME_FS], eax + mov [esp + KTRAP_FRAME_GS], ecx + jmp set_sane_segs + + not_v86_trap: + + /* Save segment selectors */ + mov eax, ds + mov ecx, es + mov [esp + KTRAP_FRAME_DS], eax + mov [esp + KTRAP_FRAME_ES], ecx + mov eax, fs + mov ecx, gs + mov [esp + KTRAP_FRAME_FS], eax + mov [esp + KTRAP_FRAME_GS], ecx + + endif + +set_sane_segs: + /* Load correct data segments */ + mov ax, KGDT_R3_DATA OR RPL_MASK + mov ds, ax + mov es, ax + + /* Fast system calls have fs already fixed */ + if ((Flags AND KI_FAST_SYSTEM_CALL) == 0) + /* Otherwise fix fs now */ + mov ax, KGDT_R0_PCR + mov fs, ax + endif + +#if DBG + /* Keep the frame chain intact */ + mov eax, [esp + KTRAP_FRAME_EIP] + mov [esp + KTRAP_FRAME_DEBUGEIP], eax + mov [esp + KTRAP_FRAME_DEBUGEBP], ebp + mov ebp, esp +#endif + + /* Set parameter 1 (ECX) to point to the frame */ + mov ecx, esp + + /* Clear direction flag */ + cld + +ENDM + +MACRO(KiCallHandler, Handler) +#if DBG + /* Use a call to get the return address for back traces */ + call Handler +#else + /* Use the faster jmp */ + jmp Handler +#endif + nop +ENDM + +MACRO(TRAP_ENTRY, Trap, Flags) +EXTERN @&Trap&Handler@4 :PROC + PUBLIC _&Trap + _&Trap: + KiEnterTrap Flags + KiCallHandler @&Trap&Handler@4 +ENDM + +#define KI_RESTORE_EAX HEX(001) +#define KI_RESTORE_ECX_EDX HEX(002) +#define KI_RESTORE_FS HEX(004) +#define KI_RESTORE_SEGMENTS HEX(008) +#define KI_RESTORE_EFLAGS HEX(010) +#define KI_EXIT_SYSCALL HEX(020) +#define KI_EXIT_JMP HEX(040) +#define KI_EXIT_RET HEX(080) +#define KI_EXIT_IRET HEX(100) +#define KI_EDITED_FRAME HEX(200) +#define KI_RESTORE_VOLATILES (KI_RESTORE_EAX OR KI_RESTORE_ECX_EDX) + +MACRO(KiTrapExitStub, Name, Flags) + +PUBLIC @&Name&@4 +@&Name&@4: + + if (Flags AND KI_RESTORE_EFLAGS) + + /* We will pop EFlags off the stack */ + OffsetEsp = KTRAP_FRAME_EFLAGS + + elseif (Flags AND KI_EXIT_IRET) + + /* This is the IRET frame */ + OffsetEsp = KTRAP_FRAME_EIP + + else + + OffsetEsp = 0 + + endif + + if (Flags AND KI_EDITED_FRAME) + + /* Load the requested ESP */ + mov esp, [ecx + KTRAP_FRAME_TEMPESP] + + /* Put return address on the new stack */ + push [ecx + KTRAP_FRAME_EIP] + + /* Put EFLAGS on the new stack */ + push [ecx + KTRAP_FRAME_EFLAGS] + + else + + /* Point esp to an appropriate member of the frame */ + lea esp, [ecx + OffsetEsp] + + endif + + /* Restore non volatiles */ + mov ebx, [ecx + KTRAP_FRAME_EBX] + mov esi, [ecx + KTRAP_FRAME_ESI] + mov edi, [ecx + KTRAP_FRAME_EDI] + mov ebp, [ecx + KTRAP_FRAME_EBP] + + if (Flags AND KI_RESTORE_EAX) + + /* Restore eax */ + mov eax, [ecx + KTRAP_FRAME_EAX] + + endif + + if (Flags AND KI_RESTORE_ECX_EDX) + + /* Restore volatiles */ + mov edx, [ecx + KTRAP_FRAME_EDX] + mov ecx, [ecx + KTRAP_FRAME_ECX] + + elseif (Flags AND KI_EXIT_JMP) + + /* Load return address into edx */ + mov edx, [esp - OffsetEsp + KTRAP_FRAME_EIP] + + elseif (Flags AND KI_EXIT_SYSCALL) + + /* Set sysexit parameters */ + mov edx, [esp - OffsetEsp + KTRAP_FRAME_EIP] + mov ecx, [esp - OffsetEsp + KTRAP_FRAME_ESP] + + /* Keep interrupts disabled until the sti / sysexit */ + and byte ptr [esp - OffsetEsp + KTRAP_FRAME_EFLAGS + 1], ~(EFLAGS_INTERRUPT_MASK >> 8) + + endif + + if (Flags AND KI_RESTORE_SEGMENTS) + + /* Restore segments for user mode */ + mov ds, [esp - OffsetEsp + KTRAP_FRAME_DS] + mov es, [esp - OffsetEsp + KTRAP_FRAME_ES] + mov gs, [esp - OffsetEsp + KTRAP_FRAME_GS] + + endif + + if ((Flags AND KI_RESTORE_FS) OR (Flags AND KI_RESTORE_SEGMENTS)) + + /* Restore user mode FS */ + mov fs, [esp - OffsetEsp + KTRAP_FRAME_FS] + + endif + + if (Flags AND KI_RESTORE_EFLAGS) + + /* Restore EFLAGS */ + popf + + endif + + if (Flags AND KI_EXIT_SYSCALL) + + /* Enable interrupts and return to user mode. + Both must follow directly after another to be "atomic". */ + sti + sysexit + + elseif (Flags AND KI_EXIT_IRET) + + /* Return with iret */ + iret + + elseif (Flags AND KI_EXIT_JMP) + + /* Return to kernel mode with a jmp */ + jmp edx + + elseif (Flags AND KI_EXIT_RET) + + /* Return to kernel mode with a ret */ + ret + + endif + +ENDM -// -// @name GENERATE_INT_HANDLERS -// -// This macro creates the unexpected interrupt handlers. -// -// @param None. -// -// @remark None. -// -.altmacro -.macro GENERATE_INT_HANDLERS -.set i, 0 -.rept 208 - GENERATE_INT_HANDLER %i - .set i, i + 1 -.endr -.endm diff --git a/reactos/ntoskrnl/include/internal/i386/intrin_i.h b/reactos/ntoskrnl/include/internal/i386/intrin_i.h index 7414dfb7191..a78497b1871 100644 --- a/reactos/ntoskrnl/include/internal/i386/intrin_i.h +++ b/reactos/ntoskrnl/include/internal/i386/intrin_i.h @@ -1,5 +1,4 @@ -#ifndef _INTRIN_INTERNAL_ -#define _INTRIN_INTERNAL_ +#pragma once #if defined(__GNUC__) @@ -263,6 +262,4 @@ Ke386SetGs(IN USHORT Value) #error Unknown compiler for inline assembler #endif -#endif - /* EOF */ diff --git a/reactos/ntoskrnl/include/internal/i386/ke.h b/reactos/ntoskrnl/include/internal/i386/ke.h index 0054f71f471..701688ead1f 100644 --- a/reactos/ntoskrnl/include/internal/i386/ke.h +++ b/reactos/ntoskrnl/include/internal/i386/ke.h @@ -1,5 +1,4 @@ -#ifndef __NTOSKRNL_INCLUDE_INTERNAL_I386_KE_H -#define __NTOSKRNL_INCLUDE_INTERNAL_I386_KE_H +#pragma once #ifndef __ASM__ @@ -398,9 +397,9 @@ Ki386HandleOpcodeV86( IN PKTRAP_FRAME TrapFrame ); +DECLSPEC_NORETURN VOID FASTCALL -DECLSPEC_NORETURN KiEoiHelper( IN PKTRAP_FRAME TrapFrame ); @@ -417,9 +416,9 @@ KiExitV86Mode( IN PKTRAP_FRAME TrapFrame ); +DECLSPEC_NORETURN VOID NTAPI -DECLSPEC_NORETURN KiDispatchExceptionFromTrapFrame( IN NTSTATUS Code, IN ULONG_PTR Address, @@ -439,7 +438,6 @@ extern ULONG KeI386EFlagsOrMaskV86; extern BOOLEAN KeI386VirtualIntExtensions; extern KIDTENTRY KiIdt[MAXIMUM_IDTVECTOR]; extern KDESCRIPTOR KiIdtDescriptor; -extern ULONG Ke386GlobalPagesEnabled; extern BOOLEAN KiI386PentiumLockErrataPresent; extern ULONG KeI386NpxPresent; extern ULONG KeI386XMMIPresent; @@ -622,6 +620,7 @@ KiSystemCallTrampoline(IN PVOID Handler, * later to function like this as well. * */ +#ifdef __GNUC__ __asm__ __volatile__ ( "subl %1, %%esp\n" @@ -637,7 +636,23 @@ KiSystemCallTrampoline(IN PVOID Handler, "r"(Handler) : "%esp", "%esi", "%edi" ); - +#elif defined(_MSC_VER) + __asm + { + mov ecx, StackBytes + mov edx, Arguments + sub esp, ecx + mov edi, esp + mov esi, edx + shr ecx, 2 + rep movsd + call Handler + mov Result, eax + } +#else +#error Unknown Compiler +#endif + return Result; } @@ -704,6 +719,7 @@ KiConvertToGuiThread(VOID) * on its merry way. * */ +#ifdef __GNUC__ __asm__ __volatile__ ( "movl %%ebp, %1\n" @@ -714,9 +730,22 @@ KiConvertToGuiThread(VOID) "movl %%eax, %0\n" : "=r"(Result), "=r"(StackFrame) : - : "%esp", "%ecx", "%edx" + : "%esp", "%ecx", "%edx", "memory" ); - +#elif defined(_MSC_VER) + NTSTATUS NTAPI PsConvertToGuiThread(VOID); + __asm + { + mov StackFrame, ebp + sub StackFrame, esp + call PsConvertToGuiThread + add StackFrame, esp + mov ebp, StackFrame + mov Result, eax + } +#else +#error Unknown Compiler +#endif return Result; } @@ -728,7 +757,8 @@ FORCEINLINE KiSwitchToBootStack(IN ULONG_PTR InitialStack) { /* We have to switch to a new stack before continuing kernel initialization */ - __asm__ __volatile__ +#ifdef __GNUC__ + __asm__ ( "movl %0, %%esp\n" "subl %1, %%esp\n" @@ -740,6 +770,19 @@ KiSwitchToBootStack(IN ULONG_PTR InitialStack) "i"(CR0_EM | CR0_TS | CR0_MP) : "%esp" ); +#elif defined(_MSC_VER) + VOID NTAPI KiSystemStartupBootStack(VOID); + __asm + { + mov ecx, InitialStack + mov esp, ecx + sub esp, (NPX_FRAME_LENGTH + KTRAP_FRAME_ALIGN + KTRAP_FRAME_LENGTH) + push (CR0_EM | CR0_TS | CR0_MP) + jmp KiSystemStartupBootStack + } +#else +#error Unknown Compiler +#endif } // @@ -776,4 +819,3 @@ Ki386PerfEnd(VOID) } #endif -#endif /* __NTOSKRNL_INCLUDE_INTERNAL_I386_KE_H */ diff --git a/reactos/ntoskrnl/include/internal/i386/mm.h b/reactos/ntoskrnl/include/internal/i386/mm.h index 6ece2a7ba87..e31c07dd3a8 100644 --- a/reactos/ntoskrnl/include/internal/i386/mm.h +++ b/reactos/ntoskrnl/include/internal/i386/mm.h @@ -2,8 +2,7 @@ * Lowlevel memory managment definitions */ -#ifndef __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H -#define __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H +#pragma once struct _EPROCESS; PULONG MmGetPageDirectory(VOID); @@ -63,4 +62,30 @@ PULONG MmGetPageDirectory(VOID); #define MI_MAKE_WRITE_PAGE(x) ((x)->u.Hard.Writable = 1) #endif -#endif /* __NTOSKRNL_INCLUDE_INTERNAL_I386_MM_H */ +#define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \ + ((x) / (4*1024*1024)) + +#define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \ + ((((x)) % (4*1024*1024)) / (4*1024)) + +#define NR_SECTION_PAGE_TABLES 1024 +#define NR_SECTION_PAGE_ENTRIES 1024 + +#define TEB_BASE 0x7FFDE000 + +#define MI_HYPERSPACE_PTES (256 - 1) +#define MI_ZERO_PTES (32) +#define MI_MAPPING_RANGE_START (ULONG)HYPER_SPACE +#define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + \ + MI_HYPERSPACE_PTES * PAGE_SIZE) +#define MI_ZERO_PTE (PMMPTE)(MI_MAPPING_RANGE_END + \ + PAGE_SIZE) + +/* On x86, these two are the same */ +#define MMPDE MMPTE +#define PMMPDE PMMPTE + +/* +* FIXME - different architectures have different cache line sizes... +*/ +#define MM_CACHE_LINE_SIZE 32 diff --git a/reactos/ntoskrnl/include/internal/i386/v86m.h b/reactos/ntoskrnl/include/internal/i386/v86m.h index dcbaf7e2f8a..167bb7c97cd 100644 --- a/reactos/ntoskrnl/include/internal/i386/v86m.h +++ b/reactos/ntoskrnl/include/internal/i386/v86m.h @@ -1,5 +1,4 @@ -#ifndef __V86M_ -#define __V86M_ +#pragma once #include "ketypes.h" @@ -57,5 +56,3 @@ typedef struct _KV86M_TRAP_FRAME struct _KV86M_REGISTERS* regs; ULONG orig_ebp; } KV86M_TRAP_FRAME, *PKV86M_TRAP_FRAME; - -#endif diff --git a/reactos/ntoskrnl/include/internal/inbv.h b/reactos/ntoskrnl/include/internal/inbv.h index 00fd9a18e41..eb87f83e216 100644 --- a/reactos/ntoskrnl/include/internal/inbv.h +++ b/reactos/ntoskrnl/include/internal/inbv.h @@ -1,5 +1,4 @@ -#ifndef NTOSKRNL_INBV_H -#define NTOSKRNL_INBV_H +#pragma once typedef struct _InbvProgressState { @@ -8,6 +7,13 @@ typedef struct _InbvProgressState ULONG Bias; } INBV_PROGRESS_STATE; +typedef struct _BT_PROGRESS_INDICATOR +{ + ULONG Count; + ULONG Expected; + ULONG Percentage; +} BT_PROGRESS_INDICATOR, *PBT_PROGRESS_INDICATOR; + typedef enum _ROT_BAR_TYPE { RB_UNSPECIFIED, @@ -45,8 +51,24 @@ FinalizeBootLogo( VOID ); +PUCHAR +NTAPI +InbvGetResourceAddress( + IN ULONG ResourceNumber +); + +VOID +NTAPI +InbvBitBlt( + IN PUCHAR Buffer, + IN ULONG X, + IN ULONG Y +); + +VOID +NTAPI +InbvIndicateProgress( + VOID +); + extern BOOLEAN InbvBootDriverInstalled; - -#endif /* NTOSKRNL_INBV_H */ - - diff --git a/reactos/ntoskrnl/include/internal/io.h b/reactos/ntoskrnl/include/internal/io.h index cf45a025943..c8b671693af 100644 --- a/reactos/ntoskrnl/include/internal/io.h +++ b/reactos/ntoskrnl/include/internal/io.h @@ -743,14 +743,14 @@ IoInitShutdownNotification( VOID NTAPI -IoShutdownRegisteredDevices( - VOID +IoShutdownSystem( + IN ULONG Phase ); VOID NTAPI -IoShutdownRegisteredFileSystems( - VOID +IopShutdownBaseFileSystems( + IN PLIST_ENTRY ListHead ); // diff --git a/reactos/ntoskrnl/include/internal/kd.h b/reactos/ntoskrnl/include/internal/kd.h index 151b1800643..b61d498b771 100644 --- a/reactos/ntoskrnl/include/internal/kd.h +++ b/reactos/ntoskrnl/include/internal/kd.h @@ -1,5 +1,4 @@ -#ifndef __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H -#define __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H +#pragma once #ifdef _M_PPC #define KdDebuggerEnabled _KdDebuggerEnabled @@ -364,4 +363,3 @@ extern KD_CONTEXT KdpContext; extern ULONG Kd_WIN2000_Mask; #endif -#endif /* __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H */ diff --git a/reactos/ntoskrnl/include/internal/ke.h b/reactos/ntoskrnl/include/internal/ke.h index 91b1b2501e1..5dac9165e65 100644 --- a/reactos/ntoskrnl/include/internal/ke.h +++ b/reactos/ntoskrnl/include/internal/ke.h @@ -1,5 +1,4 @@ -#ifndef __NTOSKRNL_INCLUDE_INTERNAL_KE_H -#define __NTOSKRNL_INCLUDE_INTERNAL_KE_H +#pragma once /* INCLUDES *****************************************************************/ @@ -1093,9 +1092,9 @@ KiIdleLoop( VOID ); +DECLSPEC_NORETURN VOID FASTCALL -DECLSPEC_NORETURN KiSystemFatalException( IN ULONG ExceptionCode, IN PKTRAP_FRAME TrapFrame @@ -1114,5 +1113,3 @@ KiRosPcToUserFileHeader(IN PVOID Eip, OUT PLDR_DATA_TABLE_ENTRY *LdrEntry); #include "ke_x.h" - -#endif /* __NTOSKRNL_INCLUDE_INTERNAL_KE_H */ diff --git a/reactos/ntoskrnl/include/internal/ldr.h b/reactos/ntoskrnl/include/internal/ldr.h index 98988135237..77eb7fdc32b 100644 --- a/reactos/ntoskrnl/include/internal/ldr.h +++ b/reactos/ntoskrnl/include/internal/ldr.h @@ -1,9 +1,6 @@ -#ifndef __INCLUDE_INTERNAL_LDR_H -#define __INCLUDE_INTERNAL_LDR_H +#pragma once #define KERNEL_MODULE_NAME L"ntoskrnl.exe" #define HAL_MODULE_NAME L"hal.dll" #define DRIVER_ROOT_NAME L"\\Driver\\" #define FILESYSTEM_ROOT_NAME L"\\FileSystem\\" - -#endif /* __INCLUDE_INTERNAL_LDR_H */ diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 55c90fd5f73..3c67357ae7b 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -1,5 +1,4 @@ -#ifndef __INCLUDE_INTERNAL_MM_H -#define __INCLUDE_INTERNAL_MM_H +#pragma once #include @@ -109,28 +108,10 @@ typedef ULONG SWAPENTRY; /* Number of list heads to use */ #define MI_FREE_POOL_LISTS 4 -#define MI_HYPERSPACE_PTES (256 - 1) -#define MI_ZERO_PTES (32) -#define MI_MAPPING_RANGE_START (ULONG_PTR)HYPER_SPACE -#define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + \ - MI_HYPERSPACE_PTES * PAGE_SIZE) -#define MI_ZERO_PTE (PMMPTE)(MI_MAPPING_RANGE_END + \ - PAGE_SIZE) /* Signature of free pool blocks */ #define MM_FREE_POOL_TAG 'lprF' -#define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) \ - ((x) / (4*1024*1024)) - -#define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) \ - ((((x)) % (4*1024*1024)) / (4*1024)) - -#define NR_SECTION_PAGE_TABLES 1024 -#define NR_SECTION_PAGE_ENTRIES 1024 - -#define TEB_BASE 0x7FFDE000 - /* Although Microsoft says this isn't hardcoded anymore, they won't be able to change it. Stuff depends on it */ #define MM_VIRTMEM_GRANULARITY (64 * 1024) @@ -170,17 +151,6 @@ typedef ULONG SWAPENTRY; */ #define MM_POOL_ALIGNMENT 8 -/* - * Maximum size of the kmalloc area (this is totally arbitary) - */ -#define MM_KERNEL_MAP_SIZE (16*1024*1024) -#define MM_KERNEL_MAP_BASE (0xf0c00000) - -/* - * FIXME - different architectures have different cache line sizes... - */ -#define MM_CACHE_LINE_SIZE 32 - #define MM_ROUND_UP(x,s) \ ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1))) @@ -399,7 +369,7 @@ typedef struct _MMPFN } u4; } MMPFN, *PMMPFN; -extern PMMPFN MmPfnDatabase; +extern PMMPFN MmPfnDatabase[2]; typedef struct _MMPFNLIST { @@ -1116,8 +1086,6 @@ MmPageOutPhysicalAddress(PFN_NUMBER Page); /* freelist.c **********************************************************/ -#define ASSERT_PFN(x) ASSERT((x)->u3.e1.CacheAttribute != 0) - FORCEINLINE PMMPFN MiGetPfnEntry(IN PFN_NUMBER Pfn) @@ -1132,10 +1100,7 @@ MiGetPfnEntry(IN PFN_NUMBER Pfn) if ((MiPfnBitMap.Buffer) && !(RtlTestBit(&MiPfnBitMap, Pfn))) return NULL; /* Get the entry */ - Page = &MmPfnDatabase[Pfn]; - - /* Make sure it's valid */ - ASSERT_PFN(Page); + Page = &MmPfnDatabase[0][Pfn]; /* Return it */ return Page; @@ -1148,7 +1113,7 @@ MiGetPfnEntryIndex(IN PMMPFN Pfn1) // // This will return the Page Frame Number (PFN) from the MMPFN // - return Pfn1 - MmPfnDatabase; + return Pfn1 - MmPfnDatabase[0]; } PFN_NUMBER @@ -1377,8 +1342,7 @@ MmSetDirtyPage( PFN_NUMBER NTAPI MmAllocPage( - ULONG Consumer, - SWAPENTRY SavedSwapEntry + ULONG Consumer ); LONG @@ -1788,5 +1752,3 @@ MmGetKernelAddressSpace(VOID) { return MmKernelAddressSpace; } - -#endif diff --git a/reactos/ntoskrnl/include/internal/ntoskrnl.h b/reactos/ntoskrnl/include/internal/ntoskrnl.h index 7c812abb331..d75265e587a 100644 --- a/reactos/ntoskrnl/include/internal/ntoskrnl.h +++ b/reactos/ntoskrnl/include/internal/ntoskrnl.h @@ -1,5 +1,4 @@ -#ifndef __INCLUDE_INTERNAL_NTOSKRNL_H -#define __INCLUDE_INTERNAL_NTOSKRNL_H +#pragma once /* * Use these to place a function in a specific section of the executable @@ -198,8 +197,8 @@ C_ASSERT(FIELD_OFFSET(KPROCESS, DirectoryTableBase) == KPROCESS_DIRECTORY_TABLE_ #endif #ifdef _M_IX86 -C_ASSERT(FIELD_OFFSET(KPCR, Tib.ExceptionList) == KPCR_EXCEPTION_LIST); -C_ASSERT(FIELD_OFFSET(KPCR, Self) == KPCR_SELF); +C_ASSERT(FIELD_OFFSET(KPCR, NtTib.ExceptionList) == KPCR_EXCEPTION_LIST); +C_ASSERT(FIELD_OFFSET(KPCR, SelfPcr) == KPCR_SELF); C_ASSERT(FIELD_OFFSET(KPCR, IRR) == KPCR_IRR); C_ASSERT(FIELD_OFFSET(KPCR, IDR) == KPCR_IDR); C_ASSERT(FIELD_OFFSET(KPCR, Irql) == KPCR_IRQL); @@ -235,5 +234,3 @@ C_ASSERT(FIELD_OFFSET(KV86M_TRAP_FRAME, orig_ebp) == TF_ORIG_EBP); C_ASSERT(FIELD_OFFSET(KTSS, Esp0) == KTSS_ESP0); C_ASSERT(FIELD_OFFSET(KTSS, IoMapBase) == KTSS_IOMAPBASE); #endif - -#endif /* INCLUDE_INTERNAL_NTOSKRNL_H */ diff --git a/reactos/ntoskrnl/include/internal/pci.h b/reactos/ntoskrnl/include/internal/pci.h index 135895f0a8a..cba5dc57725 100644 --- a/reactos/ntoskrnl/include/internal/pci.h +++ b/reactos/ntoskrnl/include/internal/pci.h @@ -5,8 +5,8 @@ * PURPOSE: Internal header for PCI Support * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) */ -#ifndef _PCI_ -#define _PCI_ + +#pragma once // // PCI Type 1 Ports @@ -103,5 +103,3 @@ typedef struct _PCI_CARD_DESCRIPTOR USHORT SubsystemID; USHORT Reserved; } PCI_CARD_DESCRIPTOR, *PPCI_CARD_DESCRIPTOR; - -#endif diff --git a/reactos/ntoskrnl/include/internal/po.h b/reactos/ntoskrnl/include/internal/po.h index e45a0d95957..01ddf3b5c37 100644 --- a/reactos/ntoskrnl/include/internal/po.h +++ b/reactos/ntoskrnl/include/internal/po.h @@ -32,6 +32,228 @@ #define POTRACE(x, ...) DPRINT(__VA_ARGS__) #endif +typedef struct _PO_HIBER_PERF +{ + ULONGLONG IoTicks; + ULONGLONG InitTicks; + ULONGLONG CopyTicks; + ULONGLONG StartCount; + ULONG ElapsedTime; + ULONG IoTime; + ULONG CopyTime; + ULONG InitTime; + ULONG PagesWritten; + ULONG PagesProcessed; + ULONG BytesCopied; + ULONG DumpCount; + ULONG FileRuns; +} PO_HIBER_PERF, *PPO_HIBER_PERF; + +typedef struct _PO_MEMORY_IMAGE +{ + ULONG Signature; + ULONG Version; + ULONG CheckSum; + ULONG LengthSelf; + PFN_NUMBER PageSelf; + ULONG PageSize; + ULONG ImageType; + LARGE_INTEGER SystemTime; + ULONGLONG InterruptTime; + ULONG FeatureFlags; + UCHAR HiberFlags; + UCHAR spare[3]; + ULONG NoHiberPtes; + ULONG_PTR HiberVa; + PHYSICAL_ADDRESS HiberPte; + ULONG NoFreePages; + ULONG FreeMapCheck; + ULONG WakeCheck; + PFN_NUMBER TotalPages; + PFN_NUMBER FirstTablePage; + PFN_NUMBER LastFilePage; + PO_HIBER_PERF PerfInfo; +} PO_MEMORY_IMAGE, *PPO_MEMORY_IMAGE; + +typedef struct _PO_MEMORY_RANGE_ARRAY_RANGE +{ + PFN_NUMBER PageNo; + PFN_NUMBER StartPage; + PFN_NUMBER EndPage; + ULONG CheckSum; +} PO_MEMORY_RANGE_ARRAY_RANGE; + +typedef struct _PO_MEMORY_RANGE_ARRAY_LINK +{ + struct _PO_MEMORY_RANGE_ARRAY *Next; + PFN_NUMBER NextTable; + ULONG CheckSum; + ULONG EntryCount; +} PO_MEMORY_RANGE_ARRAY_LINK; + +typedef struct _PO_MEMORY_RANGE_ARRAY +{ + union + { + PO_MEMORY_RANGE_ARRAY_RANGE Range; + PO_MEMORY_RANGE_ARRAY_LINK Link; + }; +} PO_MEMORY_RANGE_ARRAY, *PPO_MEMORY_RANGE_ARRAY; + +typedef struct _POP_HIBER_CONTEXT +{ + BOOLEAN WriteToFile; + BOOLEAN ReserveLoaderMemory; + BOOLEAN ReserveFreeMemory; + BOOLEAN VerifyOnWake; + BOOLEAN Reset; + UCHAR HiberFlags; + BOOLEAN LinkFile; + HANDLE LinkFileHandle; + PKSPIN_LOCK Lock; + BOOLEAN MapFrozen; + RTL_BITMAP MemoryMap; + LIST_ENTRY ClonedRanges; + ULONG ClonedRangeCount; + PLIST_ENTRY NextCloneRange; + PFN_NUMBER NextPreserve; + PMDL LoaderMdl; + PMDL Clones; + PUCHAR NextClone; + ULONG NoClones; + PMDL Spares; + ULONGLONG PagesOut; + PVOID IoPage; + PVOID CurrentMcb; + PVOID DumpStack; + PKPROCESSOR_STATE WakeState; + ULONG NoRanges; + ULONG_PTR HiberVa; + PHYSICAL_ADDRESS HiberPte; + NTSTATUS Status; + PPO_MEMORY_IMAGE MemoryImage; + PPO_MEMORY_RANGE_ARRAY TableHead; + PVOID CompressionWorkspace; + PUCHAR CompressedWriteBuffer; + PULONG PerformanceStats; + PVOID CompressionBlock; + PVOID DmaIO; + PVOID TemporaryHeap; + PO_HIBER_PERF PerfInfo; +} POP_HIBER_CONTEXT, *PPOP_HIBER_CONTEXT; + +typedef struct _PO_NOTIFY_ORDER_LEVEL +{ + KEVENT LevelReady; + ULONG DeviceCount; + ULONG ActiveCount; + LIST_ENTRY WaitSleep; + LIST_ENTRY ReadySleep; + LIST_ENTRY Pending; + LIST_ENTRY Complete; + LIST_ENTRY ReadyS0; + LIST_ENTRY WaitS0; +} PO_NOTIFY_ORDER_LEVEL, *PPO_NOTIFY_ORDER_LEVEL; + +typedef struct _POP_SHUTDOWN_BUG_CHECK +{ + HANDLE ThreadHandle; + HANDLE ThreadId; + HANDLE ProcessId; + ULONG Code; + ULONG_PTR Parameter1; + ULONG_PTR Parameter2; + ULONG_PTR Parameter3; + ULONG_PTR Parameter4; +} POP_SHUTDOWN_BUG_CHECK, *PPOP_SHUTDOWN_BUG_CHECK; + +typedef struct _POP_DEVICE_POWER_IRP +{ + SINGLE_LIST_ENTRY Free; + PIRP Irp; + PPO_DEVICE_NOTIFY Notify; + LIST_ENTRY Pending; + LIST_ENTRY Complete; + LIST_ENTRY Abort; + LIST_ENTRY Failed; +} POP_DEVICE_POWER_IRP, *PPOP_DEVICE_POWER_IRP; + +typedef struct _PO_DEVICE_NOTIFY_ORDER +{ + ULONG DevNodeSequence; + PDEVICE_OBJECT *WarmEjectPdoPointer; + PO_NOTIFY_ORDER_LEVEL OrderLevel[8]; +} PO_DEVICE_NOTIFY_ORDER, *PPO_DEVICE_NOTIFY_ORDER; + +typedef struct _POP_DEVICE_SYS_STATE +{ + UCHAR IrpMinor; + SYSTEM_POWER_STATE SystemState; + PKEVENT Event; + KSPIN_LOCK SpinLock; + PKTHREAD Thread; + BOOLEAN GetNewDeviceList; + PO_DEVICE_NOTIFY_ORDER Order; + NTSTATUS Status; + PDEVICE_OBJECT FailedDevice; + BOOLEAN Waking; + BOOLEAN Cancelled; + BOOLEAN IgnoreErrors; + BOOLEAN IgnoreNotImplemented; + BOOLEAN _WaitAny; + BOOLEAN _WaitAll; + LIST_ENTRY PresentIrpQueue; + POP_DEVICE_POWER_IRP Head; + POP_DEVICE_POWER_IRP PowerIrpState[20]; +} POP_DEVICE_SYS_STATE, *PPOP_DEVICE_SYS_STATE; + +typedef struct _POP_POWER_ACTION +{ + UCHAR Updates; + UCHAR State; + BOOLEAN Shutdown; + POWER_ACTION Action; + SYSTEM_POWER_STATE LightestState; + ULONG Flags; + NTSTATUS Status; + UCHAR IrpMinor; + SYSTEM_POWER_STATE SystemState; + SYSTEM_POWER_STATE NextSystemState; + PPOP_SHUTDOWN_BUG_CHECK ShutdownBugCode; + PPOP_DEVICE_SYS_STATE DevState; + PPOP_HIBER_CONTEXT HiberContext; + ULONGLONG WakeTime; + ULONGLONG SleepTime; +} POP_POWER_ACTION, *PPOP_POWER_ACTION; + +typedef enum _POP_DEVICE_IDLE_TYPE +{ + DeviceIdleNormal, + DeviceIdleDisk, +} POP_DEVICE_IDLE_TYPE, *PPOP_DEVICE_IDLE_TYPE; + +typedef struct _POWER_CHANNEL_SUMMARY +{ + ULONG Signature; + ULONG TotalCount; + ULONG D0Count; + LIST_ENTRY NotifyList; +} POWER_CHANNEL_SUMMARY, *PPOWER_CHANNEL_SUMMARY; + +typedef struct _DEVICE_OBJECT_POWER_EXTENSION +{ + ULONG IdleCount; + ULONG ConservationIdleTime; + ULONG PerformanceIdleTime; + PDEVICE_OBJECT DeviceObject; + LIST_ENTRY IdleList; + DEVICE_POWER_STATE State; + LIST_ENTRY NotifySourceList; + LIST_ENTRY NotifyTargetList; + POWER_CHANNEL_SUMMARY PowerChannelSummary; + LIST_ENTRY Volume; +} DEVICE_OBJECT_POWER_EXTENSION, *PDEVICE_OBJECT_POWER_EXTENSION; + // // Initialization routines // @@ -47,6 +269,21 @@ PoInitializePrcb( IN PKPRCB Prcb ); +// +// I/O Routines +// +VOID +NTAPI +PoInitializeDeviceObject( + IN OUT PDEVOBJ_EXTENSION DeviceObjectExtension +); + +VOID +NTAPI +PoVolumeDevice( + IN PDEVICE_OBJECT DeviceObject +); + // // Power State routines // @@ -78,7 +315,33 @@ PoNotifySystemTimeSet( VOID ); +// +// Shutdown routines +// +VOID +NTAPI +PopReadShutdownPolicy( + VOID +); + +VOID +NTAPI +PopGracefulShutdown( + IN PVOID Context +); + +VOID +NTAPI +PopFlushVolumes( + IN BOOLEAN ShuttingDown +); + // // Global data inside the Power Manager // extern PDEVICE_NODE PopSystemPowerDeviceNode; +extern KGUARDED_MUTEX PopVolumeLock; +extern LIST_ENTRY PopVolumeDevices; +extern KSPIN_LOCK PopDopeGlobalLock; +extern POP_POWER_ACTION PopAction; + diff --git a/reactos/ntoskrnl/include/internal/powerpc/intrin_i.h b/reactos/ntoskrnl/include/internal/powerpc/intrin_i.h index 025cf21f67e..daf84cf26ea 100644 --- a/reactos/ntoskrnl/include/internal/powerpc/intrin_i.h +++ b/reactos/ntoskrnl/include/internal/powerpc/intrin_i.h @@ -1,8 +1,5 @@ -#ifndef _INTRIN_INTERNAL_ -#define _INTRIN_INTERNAL_ +#pragma once #define Ke386SaveFlags(x) __asm__ __volatile__("mfmsr %0" : "=r" (x) :) -#endif - /* EOF */ diff --git a/reactos/ntoskrnl/include/internal/powerpc/ke.h b/reactos/ntoskrnl/include/internal/powerpc/ke.h index ba47ffcbf02..87f48fde67a 100644 --- a/reactos/ntoskrnl/include/internal/powerpc/ke.h +++ b/reactos/ntoskrnl/include/internal/powerpc/ke.h @@ -16,8 +16,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef __NTOSKRNL_INCLUDE_INTERNAL_POWERPC_KE_H -#define __NTOSKRNL_INCLUDE_INTERNAL_POWERPC_KE_H + +#pragma once #include @@ -112,6 +112,4 @@ KiThreadStartup(PKSYSTEM_ROUTINE SystemRoutine, #endif /* __ASM__ */ -#endif /* __NTOSKRNL_INCLUDE_INTERNAL_POWERPC_KE_H */ - /* EOF */ diff --git a/reactos/ntoskrnl/include/internal/probe.h b/reactos/ntoskrnl/include/internal/probe.h index 4956e047888..f02af658779 100644 --- a/reactos/ntoskrnl/include/internal/probe.h +++ b/reactos/ntoskrnl/include/internal/probe.h @@ -1,5 +1,4 @@ -#ifndef __INCLUDE_INTERNAL_PROBE_H -#define __INCLUDE_INTERNAL_PROBE_H +#pragma once #include @@ -118,5 +117,3 @@ DefaultQueryInfoBufferCheck(ULONG Class, return Status; } - -#endif diff --git a/reactos/ntoskrnl/include/internal/rtl.h b/reactos/ntoskrnl/include/internal/rtl.h index 4ea3bd9365a..18489044fc9 100644 --- a/reactos/ntoskrnl/include/internal/rtl.h +++ b/reactos/ntoskrnl/include/internal/rtl.h @@ -1,5 +1,4 @@ -#ifndef __NTOSKRNL_INCLUDE_INTERNAL_NLS_H -#define __NTOSKRNL_INCLUDE_INTERNAL_NLS_H +#pragma once NTSTATUS NTAPI @@ -16,6 +15,4 @@ RtlInitializeRangeListPackage( VOID ); -#endif /* __NTOSKRNL_INCLUDE_INTERNAL_NLS_H */ - /* EOF */ diff --git a/reactos/ntoskrnl/include/internal/se.h b/reactos/ntoskrnl/include/internal/se.h index 3ea68e562f7..034a55591a0 100644 --- a/reactos/ntoskrnl/include/internal/se.h +++ b/reactos/ntoskrnl/include/internal/se.h @@ -1,5 +1,4 @@ -#ifndef __NTOSKRNL_INCLUDE_INTERNAL_SE_H -#define __NTOSKRNL_INCLUDE_INTERNAL_SE_H +#pragma once extern POBJECT_TYPE SepTokenObjectType; @@ -350,6 +349,4 @@ VOID NTAPI SeSetSecurityAccessMask(IN SECURITY_INFORMATION SecurityInformation, OUT PACCESS_MASK DesiredAccess); -#endif /* __NTOSKRNL_INCLUDE_INTERNAL_SE_H */ - /* EOF */ diff --git a/reactos/ntoskrnl/include/internal/tag.h b/reactos/ntoskrnl/include/internal/tag.h index 8a23c7f2430..244665c2c99 100644 --- a/reactos/ntoskrnl/include/internal/tag.h +++ b/reactos/ntoskrnl/include/internal/tag.h @@ -1,5 +1,4 @@ -#ifndef _NTOSKRNL_TAG_H -#define _NTOSKRNL_TAG_H +#pragma once /* formerly located in cc/view.c */ #define TAG_CSEG 'GESC' @@ -163,5 +162,3 @@ #define TAG_WAIT 'tiaW' #define TAG_SEC_QUERY 'qSbO' - -#endif /* _NTOSKRNL_TAG_H */ diff --git a/reactos/ntoskrnl/include/internal/test.h b/reactos/ntoskrnl/include/internal/test.h index 5576a1ddd52..34e0b77166b 100644 --- a/reactos/ntoskrnl/include/internal/test.h +++ b/reactos/ntoskrnl/include/internal/test.h @@ -1,5 +1,4 @@ -#ifndef __NTOSKRNL_INCLUDE_INTERNAL_TEST_H -#define __NTOSKRNL_INCLUDE_INTERNAL_TEST_H +#pragma once typedef VOID NTAPI @@ -35,5 +34,3 @@ PObReferenceObjectByHandle( PVOID* Object, POBJECT_HANDLE_INFORMATION HandleInformation ); - -#endif /* __NTOSKRNL_INCLUDE_INTERNAL_TEST_H */ diff --git a/reactos/ntoskrnl/include/internal/trap_x.h b/reactos/ntoskrnl/include/internal/trap_x.h index 205aa54e4e8..3da69917d70 100644 --- a/reactos/ntoskrnl/include/internal/trap_x.h +++ b/reactos/ntoskrnl/include/internal/trap_x.h @@ -5,8 +5,10 @@ * PURPOSE: Internal Inlined Functions for the Trap Handling Code * PROGRAMMERS: ReactOS Portable Systems Group */ -#ifndef _TRAP_X_ -#define _TRAP_X_ + +#pragma once + +//#define TRAP_DEBUG 1 // // Unreachable code hint for GCC 4.5.x, older GCC versions, and MSVC @@ -23,6 +25,17 @@ #define UNREACHABLE #endif +// +// Helper Code +// +BOOLEAN +FORCEINLINE +KiUserTrap(IN PKTRAP_FRAME TrapFrame) +{ + /* Anything else but Ring 0 is Ring 3 */ + return (TrapFrame->SegCs & MODE_MASK); +} + // // Debug Macros // @@ -78,18 +91,19 @@ KiFillTrapFrameDebug(IN PKTRAP_FRAME TrapFrame) TrapFrame->DbgArgMark = 0xBADB0D00; TrapFrame->DbgEip = TrapFrame->Eip; TrapFrame->DbgEbp = TrapFrame->Ebp; + TrapFrame->PreviousPreviousMode = -1; } VOID FORCEINLINE KiExitTrapDebugChecks(IN PKTRAP_FRAME TrapFrame, - IN KTRAP_STATE_BITS SkipBits) + IN KTRAP_EXIT_SKIP_BITS SkipBits) { /* Make sure interrupts are disabled */ if (__readeflags() & EFLAGS_INTERRUPT_MASK) { DbgPrint("Exiting with interrupts enabled: %lx\n", __readeflags()); - while (TRUE); + __debugbreak(); } /* Make sure this is a real trap frame */ @@ -97,35 +111,35 @@ KiExitTrapDebugChecks(IN PKTRAP_FRAME TrapFrame, { DbgPrint("Exiting with an invalid trap frame? (No MAGIC in trap frame)\n"); KiDumpTrapFrame(TrapFrame); - while (TRUE); + __debugbreak(); } /* Make sure we're not in user-mode or something */ if (Ke386GetFs() != KGDT_R0_PCR) { DbgPrint("Exiting with an invalid FS: %lx\n", Ke386GetFs()); - while (TRUE); + __debugbreak(); } /* Make sure we have a valid SEH chain */ - if (KeGetPcr()->Tib.ExceptionList == 0) + if (KeGetPcr()->NtTib.ExceptionList == 0) { - DbgPrint("Exiting with NULL exception chain: %p\n", KeGetPcr()->Tib.ExceptionList); - while (TRUE); + DbgPrint("Exiting with NULL exception chain: %p\n", KeGetPcr()->NtTib.ExceptionList); + __debugbreak(); } /* Make sure we're restoring a valid SEH chain */ if (TrapFrame->ExceptionList == 0) { DbgPrint("Entered a trap with a NULL exception chain: %p\n", TrapFrame->ExceptionList); - while (TRUE); + __debugbreak(); } /* If we're ignoring previous mode, make sure caller doesn't actually want it */ if ((SkipBits.SkipPreviousMode) && (TrapFrame->PreviousPreviousMode != -1)) { - DbgPrint("Exiting a trap witout restoring previous mode, yet previous mode seems valid: %lx", TrapFrame->PreviousPreviousMode); - while (TRUE); + DbgPrint("Exiting a trap witout restoring previous mode, yet previous mode seems valid: %lx\n", TrapFrame->PreviousPreviousMode); + __debugbreak(); } } @@ -137,14 +151,14 @@ KiExitSystemCallDebugChecks(IN ULONG SystemCall, KIRQL OldIrql; /* Check if this was a user call */ - if (KiUserMode(TrapFrame)) + if (KiUserTrap(TrapFrame)) { /* Make sure we are not returning with elevated IRQL */ OldIrql = KeGetCurrentIrql(); if (OldIrql != PASSIVE_LEVEL) { /* Forcibly put us in a sane state */ - KeGetPcr()->CurrentIrql = PASSIVE_LEVEL; + KeGetPcr()->Irql = PASSIVE_LEVEL; _disable(); /* Fail */ @@ -154,7 +168,7 @@ KiExitSystemCallDebugChecks(IN ULONG SystemCall, 0, 0); } - +#if 0 /* Make sure we're not attached and that APCs are not disabled */ if ((KeGetCurrentThread()->ApcStateIndex != CurrentApcEnvironment) || (KeGetCurrentThread()->CombinedApcDisable != 0)) @@ -166,6 +180,7 @@ KiExitSystemCallDebugChecks(IN ULONG SystemCall, KeGetCurrentThread()->CombinedApcDisable, 0); } +#endif } } #else @@ -174,426 +189,29 @@ KiExitSystemCallDebugChecks(IN ULONG SystemCall, #define KiExitSystemCallDebugChecks(x, y) #endif -// -// Helper Code -// -BOOLEAN -FORCEINLINE -KiUserTrap(IN PKTRAP_FRAME TrapFrame) -{ - /* Anything else but Ring 0 is Ring 3 */ - return (TrapFrame->SegCs & MODE_MASK); -} - -// -// "BOP" code used by VDM and V8086 Mode -// -VOID -FORCEINLINE -KiIssueBop(VOID) -{ - /* Invalid instruction that an invalid opcode handler must trap and handle */ - asm volatile(".byte 0xC4\n.byte 0xC4\n"); -} - -// -// Returns whether or not this is a V86 trap by checking the EFLAGS field. -// -// FIXME: GCC 4.5 Can Improve this with "goto labels" -// -BOOLEAN -FORCEINLINE -KiIsV8086TrapSafe(IN PKTRAP_FRAME TrapFrame) -{ - BOOLEAN Result; - - /* - * The check MUST be done this way, as we guarantee that no DS/ES/FS segment - * is used (since it might be garbage). - * - * Instead, we use the SS segment which is guaranteed to be correct. Because - * operate in 32-bit flat mode, this works just fine. - */ - asm volatile - ( - "testl $%c[f], %%ss:%1\n" - "setnz %0\n" - : "=a"(Result) - : "m"(TrapFrame->EFlags), - [f] "i"(EFLAGS_V86_MASK) - ); - - /* If V86 flag was set */ - return Result; -} - -// -// Returns whether or not this is a user-mode trap by checking the SegCs field. -// -// FIXME: GCC 4.5 Can Improve this with "goto labels" -// -BOOLEAN -FORCEINLINE -KiIsUserTrapSafe(IN PKTRAP_FRAME TrapFrame) -{ - BOOLEAN Result; - - /* - * The check MUST be done this way, as we guarantee that no DS/ES/FS segment - * is used (since it might be garbage). - * - * Instead, we use the SS segment which is guaranteed to be correct. Because - * operate in 32-bit flat mode, this works just fine. - */ - asm volatile - ( - "cmp $%c[f], %%ss:%1\n" - "setnz %0\n" - : "=a"(Result) - : "m"(TrapFrame->SegCs), - [f] "i"(KGDT_R0_CODE) - ); - - /* If V86 flag was set */ - return Result; -} - -VOID -FORCEINLINE -KiUserSystemCall(IN PKTRAP_FRAME TrapFrame) -{ - /* - * Kernel call or user call? - * - * This decision is made in inlined assembly because we need to patch - * the relative offset of the user-mode jump to point to the SYSEXIT - * routine if the CPU supports it. The only way to guarantee that a - * relative jnz/jz instruction is generated is to force it with the - * inline assembler. - */ - asm volatile - ( - "test $1, %0\n" /* MODE_MASK */ - ".globl _KiSystemCallExitBranch\n_KiSystemCallExitBranch:\n" - "jnz _KiSystemCallExit\n" - : - : "r"(TrapFrame->SegCs) - ); -} - -VOID -FORCEINLINE -KiSetSaneSegments(IN PKTRAP_FRAME TrapFrame) -{ - ULONG Ds, Es; - - /* - * We really have to get a good DS/ES first before touching any data. - * - * These two reads will either go in a register (with optimizations ON) or - * a stack variable (which is on SS:ESP, guaranteed to be good/valid). - * - * Because the assembly is marked volatile, the order of instructions is - * as-is, otherwise the optimizer could simply get rid of our DS/ES. - * - */ - Ds = Ke386GetDs(); - Es = Ke386GetEs(); - Ke386SetDs(KGDT_R3_DATA | RPL_MASK); - Ke386SetEs(KGDT_R3_DATA | RPL_MASK); - TrapFrame->SegDs = Ds; - TrapFrame->SegEs = Es; -} - -// -// Generates an Exit Epilog Stub for the given name -// -#define KI_FUNCTION_CALL 0x1 -#define KI_EDITED_FRAME 0x2 -#define KI_DIRECT_EXIT 0x4 -#define KI_FAST_SYSTEM_CALL_EXIT 0x8 -#define KI_SYSTEM_CALL_EXIT 0x10 -#define KI_SYSTEM_CALL_JUMP 0x20 -#define KiTrapExitStub(x, y) VOID FORCEINLINE DECLSPEC_NORETURN x(IN PKTRAP_FRAME TrapFrame) { KiTrapExit(TrapFrame, y); UNREACHABLE; } -#define KiTrapExitStub2(x, y) VOID FORCEINLINE x(IN PKTRAP_FRAME TrapFrame) { KiTrapExit(TrapFrame, y); } - -// -// How volatiles will be restored -// -#define KI_EAX_NO_VOLATILES 0x0 -#define KI_EAX_ONLY 0x1 -#define KI_ALL_VOLATILES 0x2 - -// -// Exit mechanism to use -// -#define KI_EXIT_IRET 0x0 -#define KI_EXIT_SYSEXIT 0x1 -#define KI_EXIT_JMP 0x2 -#define KI_EXIT_RET 0x3 - -// -// Master Trap Epilog -// -VOID -FORCEINLINE -KiTrapExit(IN PKTRAP_FRAME TrapFrame, - IN ULONG Flags) -{ - ULONG FrameSize = FIELD_OFFSET(KTRAP_FRAME, Eip); - ULONG ExitMechanism = KI_EXIT_IRET, Volatiles = KI_ALL_VOLATILES, NonVolatiles = TRUE; - ULONG EcxField = FIELD_OFFSET(KTRAP_FRAME, Ecx), EdxField = FIELD_OFFSET(KTRAP_FRAME, Edx); - - /* System call exit needs a special label */ - if (Flags & KI_SYSTEM_CALL_EXIT) __asm__ __volatile__ - ( - ".globl _KiSystemCallExit\n_KiSystemCallExit:\n" - ); - - /* Start by making the trap frame equal to the stack */ - __asm__ __volatile__ - ( - "movl %0, %%esp\n" - : - : "r"(TrapFrame) - : "%esp" - ); - - /* Check what kind of trap frame this trap requires */ - if (Flags & KI_FUNCTION_CALL) - { - /* These calls have an EIP on the stack they need */ - ExitMechanism = KI_EXIT_RET; - Volatiles = FALSE; - } - else if (Flags & KI_EDITED_FRAME) - { - /* Edited frames store a new ESP in the error code field */ - FrameSize = FIELD_OFFSET(KTRAP_FRAME, ErrCode); - } - else if (Flags & KI_DIRECT_EXIT) - { - /* Exits directly without restoring anything, interrupt frame on stack */ - NonVolatiles = Volatiles = FALSE; - } - else if (Flags & KI_FAST_SYSTEM_CALL_EXIT) - { - /* We have a fake interrupt stack with a ring transition */ - FrameSize = FIELD_OFFSET(KTRAP_FRAME, V86Es); - ExitMechanism = KI_EXIT_SYSEXIT; - - /* SYSEXIT wants EIP in EDX and ESP in ECX */ - EcxField = FIELD_OFFSET(KTRAP_FRAME, HardwareEsp); - EdxField = FIELD_OFFSET(KTRAP_FRAME, Eip); - } - else if (Flags & KI_SYSTEM_CALL_EXIT) - { - /* Only restore EAX */ - NonVolatiles = KI_EAX_ONLY; - } - else if (Flags & KI_SYSTEM_CALL_JUMP) - { - /* We have a fake interrupt stack with no ring transition */ - FrameSize = FIELD_OFFSET(KTRAP_FRAME, HardwareEsp); - NonVolatiles = KI_EAX_ONLY; - ExitMechanism = KI_EXIT_JMP; - } - - /* Restore the non volatiles */ - if (NonVolatiles) __asm__ __volatile__ - ( - "movl %c[b](%%esp), %%ebx\n" - "movl %c[s](%%esp), %%esi\n" - "movl %c[i](%%esp), %%edi\n" - "movl %c[p](%%esp), %%ebp\n" - : - : [b] "i"(FIELD_OFFSET(KTRAP_FRAME, Ebx)), - [s] "i"(FIELD_OFFSET(KTRAP_FRAME, Esi)), - [i] "i"(FIELD_OFFSET(KTRAP_FRAME, Edi)), - [p] "i"(FIELD_OFFSET(KTRAP_FRAME, Ebp)) - : "%esp" - ); - - /* Restore EAX if volatiles must be restored */ - if (Volatiles) __asm__ __volatile__ - ( - "movl %c[a](%%esp), %%eax\n":: [a] "i"(FIELD_OFFSET(KTRAP_FRAME, Eax)) : "%esp" - ); - - /* Restore the other volatiles if needed */ - if (Volatiles == KI_ALL_VOLATILES) __asm__ __volatile__ - ( - "movl %c[c](%%esp), %%ecx\n" - "movl %c[d](%%esp), %%edx\n" - : - : [c] "i"(EcxField), - [d] "i"(EdxField) - : "%esp" - ); - - /* Ring 0 system calls jump back to EDX */ - if (Flags & KI_SYSTEM_CALL_JUMP) __asm__ __volatile__ - ( - "movl %c[d](%%esp), %%edx\n":: [d] "i"(FIELD_OFFSET(KTRAP_FRAME, Eip)) : "%esp" - ); - - /* Now destroy the trap frame on the stack */ - __asm__ __volatile__ ("addl $%c[e],%%esp\n":: [e] "i"(FrameSize) : "%esp"); - - /* Edited traps need to change to a new ESP */ - if (Flags & KI_EDITED_FRAME) __asm__ __volatile__ ("movl (%%esp), %%esp\n":::"%esp"); - - /* Check the exit mechanism and apply it */ - if (ExitMechanism == KI_EXIT_RET) __asm__ __volatile__("ret\n"::: "%esp"); - else if (ExitMechanism == KI_EXIT_IRET) __asm__ __volatile__("iret\n"::: "%esp"); - else if (ExitMechanism == KI_EXIT_JMP) __asm__ __volatile__("jmp *%%edx\n.globl _KiSystemCallExit2\n_KiSystemCallExit2:\n"::: "%esp"); - else if (ExitMechanism == KI_EXIT_SYSEXIT) __asm__ __volatile__("sti\nsysexit\n"::: "%esp"); -} - -// -// All the specific trap epilog stubs -// -KiTrapExitStub (KiTrapReturn, 0); -KiTrapExitStub (KiDirectTrapReturn, KI_DIRECT_EXIT); -KiTrapExitStub (KiCallReturn, KI_FUNCTION_CALL); -KiTrapExitStub (KiEditedTrapReturn, KI_EDITED_FRAME); -KiTrapExitStub2(KiSystemCallReturn, KI_SYSTEM_CALL_JUMP); -KiTrapExitStub (KiSystemCallSysExitReturn, KI_FAST_SYSTEM_CALL_EXIT); -KiTrapExitStub (KiSystemCallTrapReturn, KI_SYSTEM_CALL_EXIT); - // // Generic Exit Routine // +DECLSPEC_NORETURN VOID FASTCALL KiSystemCallReturn(IN PKTRAP_FRAME TrapFrame); +DECLSPEC_NORETURN VOID FASTCALL KiSystemCallSysExitReturn(IN PKTRAP_FRAME TrapFrame); +DECLSPEC_NORETURN VOID FASTCALL KiSystemCallTrapReturn(IN PKTRAP_FRAME TrapFrame); +DECLSPEC_NORETURN VOID FASTCALL KiEditedTrapReturn(IN PKTRAP_FRAME TrapFrame); +DECLSPEC_NORETURN VOID FASTCALL KiTrapReturn(IN PKTRAP_FRAME TrapFrame); +DECLSPEC_NORETURN VOID FASTCALL KiTrapReturnNoSegments(IN PKTRAP_FRAME TrapFrame); + +typedef VOID -FORCEINLINE -DECLSPEC_NORETURN -KiExitTrap(IN PKTRAP_FRAME TrapFrame, - IN UCHAR Skip) -{ - KTRAP_EXIT_SKIP_BITS SkipBits = { .Bits = Skip }; - PULONG ReturnStack; - - /* Debugging checks */ - KiExitTrapDebugChecks(TrapFrame, SkipBits); +(FASTCALL +*PFAST_SYSTEM_CALL_EXIT)(IN PKTRAP_FRAME TrapFrame); - /* Restore the SEH handler chain */ - KeGetPcr()->Tib.ExceptionList = TrapFrame->ExceptionList; - - /* Check if the previous mode must be restored */ - if (__builtin_expect(!SkipBits.SkipPreviousMode, 0)) /* More INTS than SYSCALLs */ - { - /* Restore it */ - KeGetCurrentThread()->PreviousMode = TrapFrame->PreviousPreviousMode; - } - - /* Check if there are active debug registers */ - if (__builtin_expect(TrapFrame->Dr7 & ~DR7_RESERVED_MASK, 0)) - { - /* Not handled yet */ - DbgPrint("Need Hardware Breakpoint Support!\n"); - DbgBreakPoint(); - while (TRUE); - } - - /* Check if this was a V8086 trap */ - if (__builtin_expect(TrapFrame->EFlags & EFLAGS_V86_MASK, 0)) KiTrapReturn(TrapFrame); - - /* Check if the trap frame was edited */ - if (__builtin_expect(!(TrapFrame->SegCs & FRAME_EDITED), 0)) - { - /* - * An edited trap frame happens when we need to modify CS and/or ESP but - * don't actually have a ring transition. This happens when a kernelmode - * caller wants to perform an NtContinue to another kernel address, such - * as in the case of SEH (basically, a longjmp), or to a user address. - * - * Therefore, the CPU never saved CS/ESP on the stack because we did not - * get a trap frame due to a ring transition (there was no interrupt). - * Even if we didn't want to restore CS to a new value, a problem occurs - * due to the fact a normal RET would not work if we restored ESP since - * RET would then try to read the result off the stack. - * - * The NT kernel solves this by adding 12 bytes of stack to the exiting - * trap frame, in which EFLAGS, CS, and EIP are stored, and then saving - * the ESP that's being requested into the ErrorCode field. It will then - * exit with an IRET. This fixes both issues, because it gives the stack - * some space where to hold the return address and then end up with the - * wanted stack, and it uses IRET which allows a new CS to be inputted. - * - */ - - /* Set CS that is requested */ - TrapFrame->SegCs = TrapFrame->TempSegCs; - - /* First make space on requested stack */ - ReturnStack = (PULONG)(TrapFrame->TempEsp - 12); - TrapFrame->ErrCode = (ULONG_PTR)ReturnStack; - - /* Now copy IRET frame */ - ReturnStack[0] = TrapFrame->Eip; - ReturnStack[1] = TrapFrame->SegCs; - ReturnStack[2] = TrapFrame->EFlags; - - /* Do special edited return */ - KiEditedTrapReturn(TrapFrame); - } - - /* Check if this is a user trap */ - if (__builtin_expect(KiUserTrap(TrapFrame), 1)) /* Ring 3 is where we spend time */ - { - /* Check if segments should be restored */ - if (!SkipBits.SkipSegments) - { - /* Restore segments */ - Ke386SetGs(TrapFrame->SegGs); - Ke386SetEs(TrapFrame->SegEs); - Ke386SetDs(TrapFrame->SegDs); - Ke386SetFs(TrapFrame->SegFs); - } - - /* Always restore FS since it goes from KPCR to TEB */ - Ke386SetFs(TrapFrame->SegFs); - } - - /* Check for system call -- a system call skips volatiles! */ - if (__builtin_expect(SkipBits.SkipVolatiles, 0)) /* More INTs than SYSCALLs */ - { - /* User or kernel call? */ - KiUserSystemCall(TrapFrame); - - /* Restore EFLags */ - __writeeflags(TrapFrame->EFlags); - - /* Call is kernel, so do a jump back since this wasn't a real INT */ - KiSystemCallReturn(TrapFrame); - - /* If we got here, this is SYSEXIT: are we stepping code? */ - if (!(TrapFrame->EFlags & EFLAGS_TF)) - { - /* Restore user FS */ - Ke386SetFs(KGDT_R3_TEB | RPL_MASK); - - /* Remove interrupt flag */ - TrapFrame->EFlags &= ~EFLAGS_INTERRUPT_MASK; - __writeeflags(TrapFrame->EFlags); - - /* Exit through SYSEXIT */ - KiSystemCallSysExitReturn(TrapFrame); - } - - /* Exit through IRETD, either due to debugging or due to lack of SYSEXIT */ - KiSystemCallTrapReturn(TrapFrame); - } - - /* Return from interrupt */ - KiTrapReturn(TrapFrame); -} +extern PFAST_SYSTEM_CALL_EXIT KiFastCallExitHandler; // // Virtual 8086 Mode Optimized Trap Exit // VOID FORCEINLINE +DECLSPEC_NORETURN KiExitV86Trap(IN PKTRAP_FRAME TrapFrame) { PKTHREAD Thread; @@ -603,6 +221,9 @@ KiExitV86Trap(IN PKTRAP_FRAME TrapFrame) Thread = KeGetCurrentThread(); while (TRUE) { + /* Return if this isn't V86 mode anymore */ + if (!(TrapFrame->EFlags & EFLAGS_V86_MASK)) KiEoiHelper(TrapFrame);; + /* Turn off the alerted state for kernel mode */ Thread->Alerted[KernelMode] = FALSE; @@ -619,9 +240,6 @@ KiExitV86Trap(IN PKTRAP_FRAME TrapFrame) /* Restore IRQL and disable interrupts once again */ KfLowerIrql(OldIrql); _disable(); - - /* Return if this isn't V86 mode anymore */ - if (__builtin_expect(TrapFrame->EFlags & EFLAGS_V86_MASK, 0)) return; } /* If we got here, we're still in a valid V8086 context, so quit it */ @@ -633,7 +251,7 @@ KiExitV86Trap(IN PKTRAP_FRAME TrapFrame) } /* Return from interrupt */ - KiTrapReturn(TrapFrame); + KiTrapReturnNoSegments(TrapFrame); } // @@ -643,17 +261,9 @@ VOID FORCEINLINE KiEnterV86Trap(IN PKTRAP_FRAME TrapFrame) { - /* Load correct registers */ - Ke386SetFs(KGDT_R0_PCR); - Ke386SetDs(KGDT_R3_DATA | RPL_MASK); - Ke386SetEs(KGDT_R3_DATA | RPL_MASK); - /* Save exception list */ - TrapFrame->ExceptionList = KeGetPcr()->Tib.ExceptionList; + TrapFrame->ExceptionList = KeGetPcr()->NtTib.ExceptionList; - /* Clear direction flag */ - Ke386ClearDirectionFlag(); - /* Save DR7 and check for debugging */ TrapFrame->Dr7 = __readdr(7); if (__builtin_expect(TrapFrame->Dr7 & ~DR7_RESERVED_MASK, 0)) @@ -670,40 +280,10 @@ VOID FORCEINLINE KiEnterInterruptTrap(IN PKTRAP_FRAME TrapFrame) { - /* Check for V86 mode, otherwise check for ring 3 code */ - if (__builtin_expect(KiIsV8086TrapSafe(TrapFrame), 0)) - { - /* Set correct segments */ - Ke386SetDs(KGDT_R3_DATA | RPL_MASK); - Ke386SetEs(KGDT_R3_DATA | RPL_MASK); - Ke386SetFs(KGDT_R0_PCR); - - /* Restore V8086 segments into Protected Mode segments */ - TrapFrame->SegFs = TrapFrame->V86Fs; - TrapFrame->SegGs = TrapFrame->V86Gs; - TrapFrame->SegDs = TrapFrame->V86Ds; - TrapFrame->SegEs = TrapFrame->V86Es; - } - else if (__builtin_expect(KiIsUserTrapSafe(TrapFrame), 1)) /* Ring 3 is more common */ - { - /* Switch to sane segments */ - KiSetSaneSegments(TrapFrame); - - /* Save FS/GS */ - TrapFrame->SegFs = Ke386GetFs(); - TrapFrame->SegGs = Ke386GetGs(); - - /* Set correct FS */ - Ke386SetFs(KGDT_R0_PCR); - } - /* Save exception list and terminate it */ - TrapFrame->ExceptionList = KeGetPcr()->Tib.ExceptionList; - KeGetPcr()->Tib.ExceptionList = EXCEPTION_CHAIN_END; + TrapFrame->ExceptionList = KeGetPcr()->NtTib.ExceptionList; + KeGetPcr()->NtTib.ExceptionList = EXCEPTION_CHAIN_END; - /* Clear direction flag */ - Ke386ClearDirectionFlag(); - /* Flush DR7 and check for debugging */ TrapFrame->Dr7 = 0; if (__builtin_expect(KeGetCurrentThread()->DispatcherHeader.DebugActive & 0xFF, 0)) @@ -723,29 +303,8 @@ VOID FORCEINLINE KiEnterTrap(IN PKTRAP_FRAME TrapFrame) { - /* Switch to sane segments */ - KiSetSaneSegments(TrapFrame); - - /* Now we can save the other segments and then switch to the correct FS */ - TrapFrame->SegFs = Ke386GetFs(); - TrapFrame->SegGs = Ke386GetGs(); - Ke386SetFs(KGDT_R0_PCR); - /* Save exception list */ - TrapFrame->ExceptionList = KeGetPcr()->Tib.ExceptionList; - - /* Check for V86 mode */ - if (__builtin_expect(TrapFrame->EFlags & EFLAGS_V86_MASK, 0)) - { - /* Restore V8086 segments into Protected Mode segments */ - TrapFrame->SegFs = TrapFrame->V86Fs; - TrapFrame->SegGs = TrapFrame->V86Gs; - TrapFrame->SegDs = TrapFrame->V86Ds; - TrapFrame->SegEs = TrapFrame->V86Es; - } - - /* Clear direction flag */ - Ke386ClearDirectionFlag(); + TrapFrame->ExceptionList = KeGetPcr()->NtTib.ExceptionList; /* Flush DR7 and check for debugging */ TrapFrame->Dr7 = 0; @@ -758,131 +317,3 @@ KiEnterTrap(IN PKTRAP_FRAME TrapFrame) /* Set debug header */ KiFillTrapFrameDebug(TrapFrame); } - -// -// Generates a Trap Prolog Stub for the given name -// -#define KI_PUSH_FAKE_ERROR_CODE 0x1 -#define KI_UNUSED 0x2 -#define KI_NONVOLATILES_ONLY 0x4 -#define KI_FAST_SYSTEM_CALL 0x8 -#define KI_SOFTWARE_TRAP 0x10 -#define KI_HARDWARE_INT 0x20 -#define KiTrap(x, y) VOID DECLSPEC_NORETURN x(VOID) { KiTrapStub(y, x##Handler); UNREACHABLE; } -#define KiTrampoline(x, y) VOID DECLSPEC_NOINLINE x(VOID) { KiTrapStub(y, x##Handler); } - -// -// Trap Prolog Stub -// -VOID -FORCEINLINE -KiTrapStub(IN ULONG Flags, - IN PVOID Handler) -{ - ULONG FrameSize; - - /* Is this a fast system call? They don't have a stack! */ - if (Flags & KI_FAST_SYSTEM_CALL) __asm__ __volatile__ - ( - "movl %%ss:%c[t], %%esp\n" - "movl %c[e](%%esp), %%esp\n" - : - : [e] "i"(FIELD_OFFSET(KTSS, Esp0)), - [t] "i"(&PCR->TSS) - : "%esp" - ); - - /* Check what kind of trap frame this trap requires */ - if (Flags & KI_SOFTWARE_TRAP) - { - /* Software traps need a complete non-ring transition trap frame */ - FrameSize = FIELD_OFFSET(KTRAP_FRAME, HardwareEsp); - } - else if (Flags & KI_FAST_SYSTEM_CALL) - { - /* SYSENTER requires us to build a complete ring transition trap frame */ - FrameSize = FIELD_OFFSET(KTRAP_FRAME, V86Es); - - /* And it only preserves nonvolatile registers */ - Flags |= KI_NONVOLATILES_ONLY; - } - else if (Flags & KI_PUSH_FAKE_ERROR_CODE) - { - /* If the trap doesn't have an error code, we'll make space for it */ - FrameSize = FIELD_OFFSET(KTRAP_FRAME, Eip); - } - else - { - /* The trap already has an error code, so just make space for the rest */ - FrameSize = FIELD_OFFSET(KTRAP_FRAME, ErrCode); - } - - /* Software traps need to get their EIP from the caller's frame */ - if (Flags & KI_SOFTWARE_TRAP) __asm__ __volatile__ ("popl %%eax\n":::"%esp"); - - /* Save nonvolatile registers */ - __asm__ __volatile__ - ( - /* EBX, ESI, EDI and EBP are saved */ - "movl %%ebp, %c[p](%%esp)\n" - "movl %%ebx, %c[b](%%esp)\n" - "movl %%esi, %c[s](%%esp)\n" - "movl %%edi, %c[i](%%esp)\n" - : - : [b] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Ebx)), - [s] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Esi)), - [i] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Edi)), - [p] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Ebp)) - : "%esp" - ); - - /* Does the caller want nonvolatiles only? */ - if (!(Flags & KI_NONVOLATILES_ONLY)) __asm__ __volatile__ - ( - /* Otherwise, save the volatiles as well */ - "movl %%eax, %c[a](%%esp)\n" - "movl %%ecx, %c[c](%%esp)\n" - "movl %%edx, %c[d](%%esp)\n" - : - : [a] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Eax)), - [c] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Ecx)), - [d] "i"(- FrameSize + FIELD_OFFSET(KTRAP_FRAME, Edx)) - : "%esp" - ); - - /* Now set parameter 1 (ECX) to point to the frame */ - __asm__ __volatile__ ("movl %%esp, %%ecx\n":::"%esp"); - - /* Now go ahead and make space for this frame */ - __asm__ __volatile__ ("subl $%c[e],%%esp\n":: [e] "i"(FrameSize) : "%esp"); - __asm__ __volatile__ ("subl $%c[e],%%ecx\n":: [e] "i"(FrameSize) : "%ecx"); - - /* - * For hardware interrupts, set parameter 2 (EDX) to hold KINTERRUPT. - * This code will be dynamically patched when an interrupt is registered! - */ - if (Flags & KI_HARDWARE_INT) __asm__ __volatile__ - ( - ".globl _KiInterruptTemplate2ndDispatch\n_KiInterruptTemplate2ndDispatch:\n" - "movl $0, %%edx\n" - ".globl _KiInterruptTemplateObject\n_KiInterruptTemplateObject:\n" - ::: "%edx" - ); - - /* Now jump to the C handler */ - if (Flags & KI_HARDWARE_INT)__asm__ __volatile__ - ( - /* - * For hardware interrupts, use an absolute JMP instead of a relative JMP - * since the position of this code is arbitrary in memory, and therefore - * the compiler-generated offset will not be correct. - */ - "jmp *%0\n" - ".globl _KiInterruptTemplateDispatch\n_KiInterruptTemplateDispatch:\n" - : - : "a"(Handler) - ); - else __asm__ __volatile__ ("jmp %c[x]\n":: [x] "i"(Handler)); -} - -#endif diff --git a/reactos/ntoskrnl/include/ntoskrnl.h b/reactos/ntoskrnl/include/ntoskrnl.h index 71f4f655551..f1052ed38df 100644 --- a/reactos/ntoskrnl/include/ntoskrnl.h +++ b/reactos/ntoskrnl/include/ntoskrnl.h @@ -1,5 +1,101 @@ -#include "precomp.h" +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Kernel + * FILE: ntoskrnl/include/ntoskrnl.h + * PURPOSE: Main Kernel Header + * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + */ + +/* INCLUDES ******************************************************************/ + +/* ARM Bringup Hack */ +#ifdef _M_ARM +#define DbgPrint DbgPrintEarly +#endif + +/* Version Data */ +#undef __MSVCRT__ +#include + +/* DDK/IFS/NDK Headers */ +#define _REALLY_GET_CALLERS_CALLER +#define SINGLE_GROUP_LEGACY_API +#include +#include +#include +#include +#include +#undef NTHALAPI +#define NTHALAPI __declspec(dllimport) +#include +#undef TEXT +#define TEXT(s) L##s +#include + +/* FIXME: Temporary until Winldr is used */ +#include + +/* C Headers */ +#include +#include +#include +#include +#include + +/* SEH support with PSEH */ +#include + +/* ReactOS Headers */ +#include +#include + +/* SetupLDR Support */ +#include + +/* KD Support */ +#define NOEXTAPI +#include +#include +#include +#ifndef _WINKD_ +#include +#endif + +/* PNP GUIDs */ +#include + +/* Internal Headers */ +#include "internal/ntoskrnl.h" +#include "config.h" -/* Headers that shouldn't be precompiled due to GCC bugs */ #include #include "internal/probe.h" +#include "resource.h" + +// +// Define the internal versions of external and public global data +// +#define IoFileObjectType _IoFileObjectType +#define PsThreadType _PsThreadType +#define PsProcessType _PsProcessType +#define ExEventObjectType _ExEventObjectType +#define ExSemaphoreObjectType _ExSemaphoreObjectType +#define KdDebuggerEnabled _KdDebuggerEnabled +#define KdDebuggerNotPresent _KdDebuggerNotPresent +#define NlsOemLeadByteInfo _NlsOemLeadByteInfo +extern PUSHORT _NlsOemLeadByteInfo; +#define FsRtlLegalAnsiCharacterArray _FsRtlLegalAnsiCharacterArray +#undef LEGAL_ANSI_CHARACTER_ARRAY +#undef NLS_MB_CODE_PAGE_TAG +#undef NLS_OEM_LEAD_BYTE_INFO +#define LEGAL_ANSI_CHARACTER_ARRAY FsRtlLegalAnsiCharacterArray +#define NLS_MB_CODE_PAGE_TAG NlsMbOemCodePageTag +#define NLS_OEM_LEAD_BYTE_INFO _NlsOemLeadByteInfo +#undef KD_DEBUGGER_ENABLED +#undef KD_DEBUGGER_NOT_PRESENT +#define KD_DEBUGGER_ENABLED KdDebuggerEnabled +#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent +#define HalDispatchTable _HalDispatchTable +#undef HALDISPATCH +#define HALDISPATCH (&HalDispatchTable) +#define ExRaiseStatus RtlRaiseStatus diff --git a/reactos/ntoskrnl/include/precomp.h b/reactos/ntoskrnl/include/precomp.h deleted file mode 100644 index 8974e9b526e..00000000000 --- a/reactos/ntoskrnl/include/precomp.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Kernel - * FILE: ntoskrnl/include/ntoskrnl.h - * PURPOSE: Main Kernel Header - * PROGRAMMER: Alex Ionescu (alex@relsoft.net) - */ - -/* INCLUDES ******************************************************************/ - -/* Version Data */ -#undef __MSVCRT__ -#include - -/* DDK/IFS/NDK Headers */ -#define _REALLY_GET_CALLERS_CALLER -#include -#include -#undef DECLSPEC_IMPORT -#define DECLSPEC_IMPORT -#include -#include -#include -#undef NTHALAPI -#define NTHALAPI __declspec(dllimport) -#include -#undef TEXT -#define TEXT(s) L##s -#include - -/* FIXME: Temporary until Winldr is used */ -#include - -/* C Headers */ -#include -#include -#include -#include -#include - -/* SEH support with PSEH */ -#include - -/* ReactOS Headers */ -#include -#include - -/* SetupLDR Support */ -#include - -/* KD Support */ -#define NOEXTAPI -#include -#include -#include -#ifndef _WINKD_ -#include -#endif - -/* PNP GUIDs */ -#include - -/* Internal Headers */ -#include "internal/ntoskrnl.h" -#include "config.h" - -// -// Define the internal versions of external and public global data -// -#define IoFileObjectType _IoFileObjectType -#define PsThreadType _PsThreadType -#define PsProcessType _PsProcessType -#define ExEventObjectType _ExEventObjectType -#define ExSemaphoreObjectType _ExSemaphoreObjectType -#define KdDebuggerEnabled _KdDebuggerEnabled -#define KdDebuggerNotPresent _KdDebuggerNotPresent -#define NlsOemLeadByteInfo _NlsOemLeadByteInfo -extern PUSHORT _NlsOemLeadByteInfo; -#define FsRtlLegalAnsiCharacterArray _FsRtlLegalAnsiCharacterArray -#undef LEGAL_ANSI_CHARACTER_ARRAY -#undef NLS_MB_CODE_PAGE_TAG -#undef NLS_OEM_LEAD_BYTE_INFO -#define LEGAL_ANSI_CHARACTER_ARRAY FsRtlLegalAnsiCharacterArray -#define NLS_MB_CODE_PAGE_TAG NlsMbOemCodePageTag -#define NLS_OEM_LEAD_BYTE_INFO _NlsOemLeadByteInfo -#undef KD_DEBUGGER_ENABLED -#undef KD_DEBUGGER_NOT_PRESENT -#define KD_DEBUGGER_ENABLED KdDebuggerEnabled -#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent -#define HalDispatchTable _HalDispatchTable -#undef HALDISPATCH -#define HALDISPATCH (&HalDispatchTable) -#define ExRaiseStatus RtlRaiseStatus diff --git a/reactos/ntoskrnl/include/resource.h b/reactos/ntoskrnl/include/resource.h new file mode 100644 index 00000000000..b9bdd541a11 --- /dev/null +++ b/reactos/ntoskrnl/include/resource.h @@ -0,0 +1,23 @@ +#pragma once + +#define IDB_BOOT_LOGO 1 +#define IDB_HIBERNATE_LOGO 2 +#define IDB_SHUTDOWN_LOGO 3 +#define IDB_LOGO 5 +#define IDB_LOGO_HEADER 6 +#define IDB_LOGO_BAND 7 + +#define IDB_BAR_SERVER 4 +#define IDB_BAR_PRO 8 +#define IDB_BAR_HOME 9 + +#define IDB_PROF_TEXT 10 +#define IDB_HOME_TEXT 11 +#define IDB_EMBEDDED_TEXT 12 +#define IDB_MCE_TEXT 18 + +#define IDB_SERVER_LOGO 13 +#define IDB_SERVER_HEADER 14 +#define IDB_SERVER_BAND 15 +#define IDB_STORAGE_SERVER 16 +#define IDB_CLUSTER_SERVER 17 diff --git a/reactos/ntoskrnl/io/iomgr/device.c b/reactos/ntoskrnl/io/iomgr/device.c index 482f7300fc9..7434970734f 100644 --- a/reactos/ntoskrnl/io/iomgr/device.c +++ b/reactos/ntoskrnl/io/iomgr/device.c @@ -17,9 +17,11 @@ /* GLOBALS ********************************************************************/ ULONG IopDeviceObjectNumber = 0; - LIST_ENTRY ShutdownListHead, LastChanceShutdownListHead; KSPIN_LOCK ShutdownListLock; +extern LIST_ENTRY IopDiskFsListHead; +extern LIST_ENTRY IopCdRomFsListHead; +extern LIST_ENTRY IopTapeFsListHead; /* PRIVATE FUNCTIONS **********************************************************/ @@ -95,7 +97,15 @@ IopAttachDeviceToDeviceStackSafe(IN PDEVICE_OBJECT SourceDevice, VOID NTAPI -IoShutdownRegisteredDevices(VOID) +IoShutdownPnpDevices(VOID) +{ + /* This routine is only used by Driver Verifier to validate shutdown */ + return; +} + +VOID +NTAPI +IoShutdownSystem(IN ULONG Phase) { PLIST_ENTRY ListEntry; PDEVICE_OBJECT DeviceObject; @@ -104,46 +114,108 @@ IoShutdownRegisteredDevices(VOID) PIRP Irp; KEVENT Event; NTSTATUS Status; - + /* Initialize an event to wait on */ KeInitializeEvent(&Event, NotificationEvent, FALSE); - - /* Get the first entry and start looping */ - ListEntry = ExInterlockedRemoveHeadList(&ShutdownListHead, - &ShutdownListLock); - while (ListEntry) + + /* What phase? */ + if (Phase == 0) { - /* Get the shutdown entry */ - ShutdownEntry = CONTAINING_RECORD(ListEntry, - SHUTDOWN_ENTRY, - ShutdownList); + /* Shutdown PnP */ + IoShutdownPnpDevices(); - /* Get the attached device */ - DeviceObject = IoGetAttachedDevice(ShutdownEntry->DeviceObject); - - /* Build the shutdown IRP and call the driver */ - Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN, - DeviceObject, - NULL, - 0, - NULL, - &Event, - &StatusBlock); - Status = IoCallDriver(DeviceObject, Irp); - if (Status == STATUS_PENDING) - { - /* Wait on the driver */ - KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); - } - - /* Free the shutdown entry and reset the event */ - ExFreePoolWithTag(ShutdownEntry, TAG_SHUTDOWN_ENTRY); - KeClearEvent(&Event); - - /* Go to the next entry */ + /* Loop first-chance shutdown notifications */ ListEntry = ExInterlockedRemoveHeadList(&ShutdownListHead, &ShutdownListLock); - } + while (ListEntry) + { + /* Get the shutdown entry */ + ShutdownEntry = CONTAINING_RECORD(ListEntry, + SHUTDOWN_ENTRY, + ShutdownList); + + /* Get the attached device */ + DeviceObject = IoGetAttachedDevice(ShutdownEntry->DeviceObject); + + /* Build the shutdown IRP and call the driver */ + Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN, + DeviceObject, + NULL, + 0, + NULL, + &Event, + &StatusBlock); + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + /* Wait on the driver */ + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + } + + /* Get rid of our reference to it */ + ObDereferenceObject(DeviceObject); + + /* Free the shutdown entry and reset the event */ + ExFreePoolWithTag(ShutdownEntry, TAG_SHUTDOWN_ENTRY); + KeClearEvent(&Event); + + /* Go to the next entry */ + ListEntry = ExInterlockedRemoveHeadList(&ShutdownListHead, + &ShutdownListLock); + } + } + else if (Phase == 1) + { + /* Shutdown disk file systems */ + IopShutdownBaseFileSystems(&IopDiskFsListHead); + + /* Shutdown cdrom file systems */ + IopShutdownBaseFileSystems(&IopCdRomFsListHead); + + /* Shutdown tape filesystems */ + IopShutdownBaseFileSystems(&IopTapeFsListHead); + + /* Loop last-chance shutdown notifications */ + ListEntry = ExInterlockedRemoveHeadList(&LastChanceShutdownListHead, + &ShutdownListLock); + while (ListEntry) + { + /* Get the shutdown entry */ + ShutdownEntry = CONTAINING_RECORD(ListEntry, + SHUTDOWN_ENTRY, + ShutdownList); + + /* Get the attached device */ + DeviceObject = IoGetAttachedDevice(ShutdownEntry->DeviceObject); + + /* Build the shutdown IRP and call the driver */ + Irp = IoBuildSynchronousFsdRequest(IRP_MJ_SHUTDOWN, + DeviceObject, + NULL, + 0, + NULL, + &Event, + &StatusBlock); + Status = IoCallDriver(DeviceObject, Irp); + if (Status == STATUS_PENDING) + { + /* Wait on the driver */ + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + } + + /* Get rid of our reference to it */ + ObDereferenceObject(DeviceObject); + + /* Free the shutdown entry and reset the event */ + ExFreePoolWithTag(ShutdownEntry, TAG_SHUTDOWN_ENTRY); + KeClearEvent(&Event); + + /* Go to the next entry */ + ListEntry = ExInterlockedRemoveHeadList(&LastChanceShutdownListHead, + &ShutdownListLock); + } + + } } NTSTATUS @@ -843,6 +915,9 @@ IoCreateDevice(IN PDRIVER_OBJECT DriverObject, /* Set the Type and Size. Question: why is Size 0 on Windows? */ DeviceObjectExtension->Type = IO_TYPE_DEVICE_OBJECT_EXTENSION; DeviceObjectExtension->Size = 0; + + /* Initialize with Power Manager */ + PoInitializeDeviceObject(DeviceObjectExtension); /* Link the Object and Extension */ DeviceObjectExtension->DeviceObject = CreatedDeviceObject; @@ -932,6 +1007,9 @@ IoCreateDevice(IN PDRIVER_OBJECT DriverObject, ASSERT((DriverObject->Flags & DRVO_UNLOAD_INVOKED) == 0); CreatedDeviceObject->DriverObject = DriverObject; IopEditDeviceList(DriverObject, CreatedDeviceObject, IopAdd); + + /* Link with the power manager */ + if (CreatedDeviceObject->Vpb) PoVolumeDevice(CreatedDeviceObject); /* Close the temporary handle and return to caller */ ObCloseHandle(TempHandle, KernelMode); @@ -1351,6 +1429,9 @@ IoRegisterLastChanceShutdownNotification(IN PDEVICE_OBJECT DeviceObject) /* Set the DO */ Entry->DeviceObject = DeviceObject; + + /* Reference it so it doesn't go away */ + ObReferenceObject(DeviceObject); /* Insert it into the list */ ExInterlockedInsertHeadList(&LastChanceShutdownListHead, @@ -1379,6 +1460,9 @@ IoRegisterShutdownNotification(PDEVICE_OBJECT DeviceObject) /* Set the DO */ Entry->DeviceObject = DeviceObject; + + /* Reference it so it doesn't go away */ + ObReferenceObject(DeviceObject); /* Insert it into the list */ ExInterlockedInsertHeadList(&ShutdownListHead, @@ -1420,6 +1504,9 @@ IoUnregisterShutdownNotification(PDEVICE_OBJECT DeviceObject) /* Free the entry */ ExFreePoolWithTag(ShutdownEntry, TAG_SHUTDOWN_ENTRY); + + /* Get rid of our reference to it */ + ObDereferenceObject(DeviceObject); } /* Go to the next entry */ @@ -1444,6 +1531,9 @@ IoUnregisterShutdownNotification(PDEVICE_OBJECT DeviceObject) /* Free the entry */ ExFreePoolWithTag(ShutdownEntry, TAG_SHUTDOWN_ENTRY); + + /* Get rid of our reference to it */ + ObDereferenceObject(DeviceObject); } /* Go to the next entry */ diff --git a/reactos/ntoskrnl/io/iomgr/driver.c b/reactos/ntoskrnl/io/iomgr/driver.c index 4dc022fb93f..ef1b78969fb 100644 --- a/reactos/ntoskrnl/io/iomgr/driver.c +++ b/reactos/ntoskrnl/io/iomgr/driver.c @@ -149,6 +149,39 @@ IopGetDriverObject( return STATUS_SUCCESS; } +/* + * RETURNS + * TRUE if String2 contains String1 as a suffix. + */ +BOOLEAN +NTAPI +IopSuffixUnicodeString( + IN PCUNICODE_STRING String1, + IN PCUNICODE_STRING String2) +{ + PWCHAR pc1; + PWCHAR pc2; + ULONG Length; + + if (String2->Length < String1->Length) + return FALSE; + + Length = String1->Length / 2; + pc1 = String1->Buffer; + pc2 = &String2->Buffer[String2->Length / sizeof(WCHAR) - Length]; + + if (pc1 && pc2) + { + while (Length--) + { + if( *pc1++ != *pc2++ ) + return FALSE; + } + return TRUE; + } + return FALSE; +} + /* * IopDisplayLoadingMessage * @@ -158,35 +191,19 @@ IopGetDriverObject( VOID FASTCALL INIT_FUNCTION -IopDisplayLoadingMessage(PVOID ServiceName, - BOOLEAN Unicode) +IopDisplayLoadingMessage(PUNICODE_STRING ServiceName) { CHAR TextBuffer[256]; - PCHAR Extra = ".sys"; + UNICODE_STRING DotSys = RTL_CONSTANT_STRING(L".SYS"); if (ExpInTextModeSetup) return; - if (Unicode) - { - if (wcsstr(_wcsupr(ServiceName), L".SYS")) Extra = ""; - sprintf(TextBuffer, - "%s%s%s\\%S%s\n", - KeLoaderBlock->ArcBootDeviceName, - KeLoaderBlock->NtBootPathName, - "System32\\Drivers", - (PWCHAR)ServiceName, - Extra); - } - else - { - if (strstr(_strupr(ServiceName), ".SYS")) Extra = ""; - sprintf(TextBuffer, - "%s%s%s\\%s%s\n", - KeLoaderBlock->ArcBootDeviceName, - KeLoaderBlock->NtBootPathName, - "System32\\Drivers", - (PCHAR)ServiceName, - Extra); - } + RtlUpcaseUnicodeString(ServiceName, ServiceName, FALSE); + snprintf(TextBuffer, sizeof(TextBuffer), + "%s%sSystem32\\Drivers\\%wZ%s\n", + KeLoaderBlock->ArcBootDeviceName, + KeLoaderBlock->NtBootPathName, + ServiceName, + IopSuffixUnicodeString(&DotSys, ServiceName) ? "" : ".SYS"); HalDisplayString(TextBuffer); } @@ -788,7 +805,8 @@ IopInitializeBuiltinDriver(IN PLDR_DATA_TABLE_ENTRY LdrEntry) /* * Display 'Loading XXX...' message */ - IopDisplayLoadingMessage(ModuleName->Buffer, TRUE); + IopDisplayLoadingMessage(ModuleName); + InbvIndicateProgress(); /* * Generate filename without path (not needed by freeldr) diff --git a/reactos/ntoskrnl/io/iomgr/drvrlist.c b/reactos/ntoskrnl/io/iomgr/drvrlist.c index 07068452fb0..e15aab2a2cd 100644 --- a/reactos/ntoskrnl/io/iomgr/drvrlist.c +++ b/reactos/ntoskrnl/io/iomgr/drvrlist.c @@ -48,8 +48,7 @@ extern BOOLEAN NoGuiBoot; VOID FASTCALL INIT_FUNCTION -IopDisplayLoadingMessage(PVOID ServiceName, - BOOLEAN Unicode); +IopDisplayLoadingMessage(PUNICODE_STRING ServiceName); /* PRIVATE FUNCTIONS **********************************************************/ @@ -415,8 +414,20 @@ static INIT_FUNCTION NTSTATUS IopLoadDriver(PSERVICE Service) { NTSTATUS Status = STATUS_UNSUCCESSFUL; + PUNICODE_STRING ImagePath = &Service->ImagePath; + PWCHAR ImageName; + UNICODE_STRING ImageNameU; + + ImageName = wcsrchr(ImagePath->Buffer, L'\\'); + if (!ImageName) + ImageName = ImagePath->Buffer; + else + ImageName++; + + RtlInitUnicodeString(&ImageNameU, ImageName); + + IopDisplayLoadingMessage(&ImageNameU); - IopDisplayLoadingMessage(Service->ServiceName.Buffer, TRUE); Status = ZwLoadDriver(&Service->RegistryPath); IopBootLog(&Service->ImagePath, NT_SUCCESS(Status) ? TRUE : FALSE); if (!NT_SUCCESS(Status)) @@ -507,6 +518,7 @@ IopInitializeSystemDrivers(VOID) { DPRINT(" Path: %wZ\n", &CurrentService->RegistryPath); Status = IopLoadDriver(CurrentService); + InbvIndicateProgress(); } } } @@ -538,7 +550,9 @@ IopInitializeSystemDrivers(VOID) { DPRINT(" Path: %wZ\n", &CurrentService->RegistryPath); Status = IopLoadDriver(CurrentService); + InbvIndicateProgress(); } + } } } diff --git a/reactos/ntoskrnl/io/iomgr/irp.c b/reactos/ntoskrnl/io/iomgr/irp.c index 76e0be071f2..598f53d4fe9 100644 --- a/reactos/ntoskrnl/io/iomgr/irp.c +++ b/reactos/ntoskrnl/io/iomgr/irp.c @@ -1217,13 +1217,15 @@ IofCompleteRequest(IN PIRP Irp, ErrorCode = PtrToUlong(LastStackPtr->Parameters.Others.Argument4); } - /* Get the Current Stack and skip it */ + /* Get the Current Stack */ StackPtr = IoGetCurrentIrpStackLocation(Irp); - IoSkipCurrentIrpStackLocation(Irp); /* Loop the Stacks and complete the IRPs */ do { + /* Skip current stack location */ + IoSkipCurrentIrpStackLocation(Irp); + /* Set Pending Returned */ Irp->PendingReturned = StackPtr->Control & SL_PENDING_RETURNED; @@ -1286,10 +1288,9 @@ IofCompleteRequest(IN PIRP Irp, IopClearStackLocation(StackPtr); } - /* Move to next stack location and pointer */ - IoSkipCurrentIrpStackLocation(Irp); + /* Move pointer to next stack location */ StackPtr++; - } while (Irp->CurrentLocation <= (Irp->StackCount + 1)); + } while (Irp->CurrentLocation <= Irp->StackCount); /* Check if the IRP is an associated IRP */ if (Irp->Flags & IRP_ASSOCIATED_IRP) diff --git a/reactos/ntoskrnl/io/iomgr/volume.c b/reactos/ntoskrnl/io/iomgr/volume.c index 3f019534e4b..606f8fd3b35 100644 --- a/reactos/ntoskrnl/io/iomgr/volume.c +++ b/reactos/ntoskrnl/io/iomgr/volume.c @@ -245,7 +245,7 @@ IopNotifyFileSystemChange(IN PDEVICE_OBJECT DeviceObject, VOID NTAPI -IoShutdownRegisteredFileSystems(VOID) +IopShutdownBaseFileSystems(IN PLIST_ENTRY ListHead) { PLIST_ENTRY ListEntry; PDEVICE_OBJECT DeviceObject; @@ -260,8 +260,8 @@ IoShutdownRegisteredFileSystems(VOID) KeInitializeEvent(&Event, NotificationEvent, FALSE); /* Get the first entry and start looping */ - ListEntry = IopDiskFsListHead.Flink; - while (ListEntry != &IopDiskFsListHead) + ListEntry = ListHead->Flink; + while (ListEntry != ListHead) { /* Get the device object */ DeviceObject = CONTAINING_RECORD(ListEntry, diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index 890fd60d12a..e6346378566 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -13,7 +13,7 @@ #define NDEBUG #include -//#define ENABLE_ACPI +#define ENABLE_ACPI /* GLOBALS *******************************************************************/ @@ -1893,7 +1893,7 @@ IopActionConfigureChildServices(PDEVICE_NODE DeviceNode, RtlInitUnicodeString(&ClassGUID, NULL); QueryTable[0].Name = L"Service"; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; QueryTable[0].EntryContext = Service; QueryTable[1].Name = L"ClassGUID"; diff --git a/reactos/ntoskrnl/kdbg/i386/dis-asm.h b/reactos/ntoskrnl/kdbg/i386/dis-asm.h index 4052910d451..9d16c79d8a1 100644 --- a/reactos/ntoskrnl/kdbg/i386/dis-asm.h +++ b/reactos/ntoskrnl/kdbg/i386/dis-asm.h @@ -23,8 +23,7 @@ interface, for making instruction-processing programs more independent of the instruction set being processed. */ -#ifndef DIS_ASM_H -#define DIS_ASM_H +#pragma once #ifdef __cplusplus extern "C" { @@ -326,5 +325,3 @@ extern int generic_symbol_at_address #ifdef __cplusplus } #endif - -#endif /* ! defined (DIS_ASM_H) */ diff --git a/reactos/ntoskrnl/kdbg/kdb.h b/reactos/ntoskrnl/kdbg/kdb.h index 78d610e78b9..b96ece13b34 100644 --- a/reactos/ntoskrnl/kdbg/kdb.h +++ b/reactos/ntoskrnl/kdbg/kdb.h @@ -1,5 +1,4 @@ -#ifndef NTOSKRNL_KDB_H -#define NTOSKRNL_KDB_H +#pragma once /* DEFINES *******************************************************************/ @@ -272,5 +271,3 @@ VOID KbdDisableMouse(); VOID KbdEnableMouse(); - -#endif /* NTOSKRNL_KDB_H */ \ No newline at end of file diff --git a/reactos/ntoskrnl/ke/arm/boot.s b/reactos/ntoskrnl/ke/arm/boot.s index d2188b62872..eff065cacbc 100644 --- a/reactos/ntoskrnl/ke/arm/boot.s +++ b/reactos/ntoskrnl/ke/arm/boot.s @@ -14,60 +14,29 @@ NESTED_ENTRY KiSystemStartup PROLOG_END KiSystemStartup - // - // Put us in FIQ mode - // - mrs r3, cpsr - orr r3, r1, #CPSR_FIQ_MODE - msr cpsr, r3 + /* Put us in FIQ mode, set IRQ stack */ + msr cpsr_c, #CPSR_FIQ_MODE + ldr sp, [a1, #LpbInterruptStack] - // - // Set FIQ stack and registers - // - ldr sp, [a2, #LpbInterruptStack] - mov r8, #0 - mov r9, #0 - mov r10, #0 - - // - // Put us in ABORT mode - // - mrs r3, cpsr - orr r3, r1, #CPSR_ABORT_MODE - msr cpsr, r3 - - // - // Set panic stack - // - ldr sp, [a2, #LpbPanicStack] - - // - // Put us in UND (Undefined) mode - // - mrs r3, cpsr - orr r3, r1, #CPSR_UND_MODE - msr cpsr, r3 - - // - // Set panic stack - // - ldr sp, [a2, #LpbPanicStack] - - // - // Put us into SVC (Supervisor) mode - // - mrs r3, cpsr - orr r3, r1, #CPSR_SVC_MODE - msr cpsr, r3 + /* Repeat for IRQ mode */ + msr cpsr_c, #CPSR_IRQ_MODE + ldr sp, [a1, #LpbInterruptStack] - // - // Switch to boot kernel stack - // - ldr sp, [a2, #LpbKernelStack] + /* Put us in ABORT mode and set the panic stack */ + msr cpsr_c, #CPSR_ABORT_MODE + ldr sp, [a1, #LpbPanicStack] - // - // Go to C code - // + /* Repeat for UND (Undefined) mode */ + msr cpsr_c, #CPSR_UND_MODE + ldr sp, [a1, #LpbPanicStack] + + /* Put us into SVC (Supervisor) mode and set the kernel stack */ + msr cpsr_c, #CPSR_SVC_MODE + ldr sp, [a1, #LpbKernelStack] + + /* Go to C code */ b KiInitializeSystem ENTRY_END KiSystemStartup + +/* EOF */ diff --git a/reactos/ntoskrnl/ke/arm/cpu.c b/reactos/ntoskrnl/ke/arm/cpu.c index a9154ceaad1..275df6c3854 100644 --- a/reactos/ntoskrnl/ke/arm/cpu.c +++ b/reactos/ntoskrnl/ke/arm/cpu.c @@ -24,7 +24,7 @@ ULONG KeProcessorArchitecture; ULONG KeProcessorLevel; ULONG KeProcessorRevision; ULONG KeFeatureBits; -ULONG KeLargestCacheLine = 32; // FIXME: It depends +ULONG KeLargestCacheLine = 64; // FIXME: It depends /* FUNCTIONS ******************************************************************/ @@ -38,83 +38,6 @@ KiFlushSingleTb(IN BOOLEAN Invalid, KeArmInvalidateTlbEntry(Virtual); } -VOID -KeFillFixedEntryTb(IN ARM_PTE Pte, - IN PVOID Virtual, - IN ULONG Index) -{ - ARM_LOCKDOWN_REGISTER LockdownRegister; - ULONG OldVictimCount; - volatile unsigned long Temp; - PARM_TRANSLATION_TABLE TranslationTable; - - // - // Fixed TB entries must be section entries - // - Virtual = (PVOID)((ULONG)Virtual & 0xFFF00000); - - // - // On ARM, we can't set the index ourselves, so make sure that we are not - // locking down more than 8 entries. - // - UNREFERENCED_PARAMETER(Index); - KeFixedTbEntries++; - ASSERT(KeFixedTbEntries <= 8); - - // - // Flush the address - // - KiFlushSingleTb(TRUE, Virtual); - - // - // Read lockdown register and set the preserve bit - // - LockdownRegister = KeArmLockdownRegisterGet(); - LockdownRegister.Preserve = TRUE; - OldVictimCount = LockdownRegister.Victim; - KeArmLockdownRegisterSet(LockdownRegister); - - // - // Map the PTE for this virtual address - // - TranslationTable = (PVOID)KeArmTranslationTableRegisterGet().AsUlong; - TranslationTable->Pte[(ULONG)Virtual >> PDE_SHIFT] = Pte; - - // - // Now force a miss - // - Temp = *(PULONG)Virtual; - - // - // Read lockdown register - // - LockdownRegister = KeArmLockdownRegisterGet(); - if (LockdownRegister.Victim == 0) - { - // - // This can only happen on QEMU or broken CPUs since there *has* - // to have been at least a miss since the system started. For example, - // QEMU doesn't support TLB lockdown. - // - // On these systems, we'll just keep the PTE mapped - // - } - else - { - // - // Clear the preserve bits - // - LockdownRegister.Preserve = FALSE; - ASSERT(LockdownRegister.Victim == OldVictimCount + 1); - KeArmLockdownRegisterSet(LockdownRegister); - - // - // Clear the PTE - // - TranslationTable->Pte[(ULONG)Virtual >> PDE_SHIFT].AsUlong = 0; - } -} - VOID KeFlushTb(VOID) { diff --git a/reactos/ntoskrnl/ke/arm/exp.c b/reactos/ntoskrnl/ke/arm/exp.c index 1a912631246..ddc94a30c70 100644 --- a/reactos/ntoskrnl/ke/arm/exp.c +++ b/reactos/ntoskrnl/ke/arm/exp.c @@ -176,67 +176,51 @@ KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, IN BOOLEAN FirstChance) { CONTEXT Context; - - // - // Increase number of Exception Dispatches - // + + /* Increase number of Exception Dispatches */ KeGetCurrentPrcb()->KeExceptionDispatchCount++; - - // - // Set the context flags - // + + /* Set the context flags */ Context.ContextFlags = CONTEXT_FULL; - // - // FIXME-V6: VFP Support - // - - // - // Get a Context - // + /* Check if User Mode or if the kernel debugger is enabled */ + if ((PreviousMode == UserMode) || (KeGetPcr()->KdVersionBlock)) + { + /* FIXME-V6: VFP Support */ + } + + /* Get a Context */ KeTrapFrameToContext(TrapFrame, ExceptionFrame, &Context); - - // - // Look at our exception code - // + + /* Look at our exception code */ switch (ExceptionRecord->ExceptionCode) { - // - // Breakpoint - // + /* Breakpoint */ case STATUS_BREAKPOINT: - - // - // We want the instruction right before the int 3 - // + + /* Decrement PC by four */ Context.Pc -= sizeof(ULONG); break; - - // - // Internal exception - // + + /* Internal exception */ case KI_EXCEPTION_ACCESS_VIOLATION: - - // - // Set correct code - // + + /* Set correct code */ ExceptionRecord->ExceptionCode = STATUS_ACCESS_VIOLATION; + if (PreviousMode == UserMode) + { + /* FIXME: Handle no execute */ + } break; } - - // - // Handle kernel-mode first, it's simpler - // + + /* Handle kernel-mode first, it's simpler */ if (PreviousMode == KernelMode) { - // - // Check if this is a first-chance exception - // + /* Check if this is a first-chance exception */ if (FirstChance == TRUE) { - // - // Break into the debugger for the first time - // + /* Break into the debugger for the first time */ if (KiDebugRoutine(TrapFrame, ExceptionFrame, ExceptionRecord, @@ -244,21 +228,15 @@ KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, PreviousMode, FALSE)) { - // - // Exception was handled - // + /* Exception was handled */ goto Handled; } - - // - // If the Debugger couldn't handle it, dispatch the exception - // + + /* If the Debugger couldn't handle it, dispatch the exception */ if (RtlDispatchException(ExceptionRecord, &Context)) goto Handled; } - - // - // This is a second-chance exception, only for the debugger - // + + /* This is a second-chance exception, only for the debugger */ if (KiDebugRoutine(TrapFrame, ExceptionFrame, ExceptionRecord, @@ -266,15 +244,11 @@ KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, PreviousMode, TRUE)) { - // - // Exception was handled - // + /* Exception was handled */ goto Handled; } - - // - // Third strike; you're out - // + + /* Third strike; you're out */ KeBugCheckEx(KMODE_EXCEPTION_NOT_HANDLED, ExceptionRecord->ExceptionCode, (ULONG_PTR)ExceptionRecord->ExceptionAddress, @@ -283,19 +257,27 @@ KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, } else { - // - // FIXME-USER: Do user-mode exception handling - // - ASSERT(FALSE); + /* FIXME: TODO */ + /* 3rd strike, kill the process */ + DPRINT1("Kill %.16s, ExceptionCode: %lx, ExceptionAddress: %lx\n", + PsGetCurrentProcess()->ImageFileName, + ExceptionRecord->ExceptionCode, + ExceptionRecord->ExceptionAddress); + + ZwTerminateProcess(NtCurrentProcess(), ExceptionRecord->ExceptionCode); + KeBugCheckEx(KMODE_EXCEPTION_NOT_HANDLED, + ExceptionRecord->ExceptionCode, + (ULONG_PTR)ExceptionRecord->ExceptionAddress, + (ULONG_PTR)TrapFrame, + 0); } - + Handled: - // - // Convert the context back into Trap/Exception Frames - // + /* Convert the context back into Trap/Exception Frames */ KeContextToTrapFrame(&Context, ExceptionFrame, TrapFrame, Context.ContextFlags, PreviousMode); + return; } diff --git a/reactos/ntoskrnl/ke/arm/kiinit.c b/reactos/ntoskrnl/ke/arm/kiinit.c index 9352350349f..4b532ca5ff1 100644 --- a/reactos/ntoskrnl/ke/arm/kiinit.c +++ b/reactos/ntoskrnl/ke/arm/kiinit.c @@ -28,9 +28,7 @@ VOID NTAPI KiInitMachineDependent(VOID) { - // - // There is nothing to do on ARM - // + /* There is nothing to do on ARM */ return; } @@ -43,169 +41,55 @@ KiInitializeKernel(IN PKPROCESS InitProcess, IN CCHAR Number, IN PLOADER_PARAMETER_BLOCK LoaderBlock) { + PKIPCR Pcr = (PKIPCR)KeGetPcr(); ULONG PageDirectory[2]; - PKPCR Pcr; ULONG i; - - // - // Initialize the platform - // - HalInitializeProcessor(Number, LoaderBlock); - // - // Save loader block - // - KeLoaderBlock = LoaderBlock; + /* Set the default NX policy (opt-in) */ + SharedUserData->NXSupportPolicy = NX_SUPPORT_POLICY_OPTIN; - // - // Setup KPRCB - // - Prcb->MajorVersion = 1; - Prcb->MinorVersion = 1; - Prcb->BuildType = 0; -#ifndef CONFIG_SMP - Prcb->BuildType |= PRCB_BUILD_UNIPROCESSOR; -#endif -#if DBG - Prcb->BuildType |= PRCB_BUILD_DEBUG; -#endif - Prcb->CurrentThread = InitThread; - Prcb->NextThread = NULL; - Prcb->IdleThread = InitThread; - Prcb->Number = Number; - Prcb->SetMember = 1 << Number; - Prcb->PcrPage = LoaderBlock->u.Arm.PcrPage; - - // - // Initialize spinlocks and DPC data - // + /* Initialize spinlocks and DPC data */ KiInitSpinLocks(Prcb, Number); - - // - // Set the PRCB in the processor block - // - KiProcessorBlock[(ULONG)Number] = Prcb; - Pcr = (PKPCR)KeGetPcr(); - - // - // Set processor information - // - KeProcessorArchitecture = PROCESSOR_ARCHITECTURE_ARM; - KeFeatureBits = 0; - KeProcessorLevel = (USHORT)(Pcr->ProcessorId >> 8); - KeProcessorRevision = (USHORT)(Pcr->ProcessorId & 0xFF); - - // - // Set stack pointers - // + + /* Set stack pointers */ Pcr->InitialStack = IdleStack; - Pcr->StackLimit = (PVOID)((ULONG_PTR)IdleStack - KERNEL_STACK_SIZE); - // - // Check if this is the Boot CPU - // + /* Check if this is the Boot CPU */ if (!Number) { - // - // Setup the unexpected interrupt - // + /* Setup the unexpected interrupt */ KxUnexpectedInterrupt.DispatchAddress = KiUnexpectedInterrupt; for (i = 0; i < 4; i++) { - // - // Copy the template code - // + /* Copy the template code */ KxUnexpectedInterrupt.DispatchCode[i] = ((PULONG)KiInterruptTemplate)[i]; } - // - // Set DMA coherency - // + /* Set DMA coherency */ KiDmaIoCoherency = 0; - // - // Sweep D-Cache - // + /* Sweep D-Cache */ HalSweepDcache(); - } - - // - // Set all interrupt routines to unexpected interrupts as well - // - for (i = 0; i < MAXIMUM_VECTOR; i++) - { - // - // Point to the same template - // - Pcr->InterruptRoutine[i] = (PVOID)&KxUnexpectedInterrupt.DispatchCode; - } - - // - // Setup profiling - // - Pcr->ProfileCount = 0; - Pcr->ProfileInterval = 0x200000; - Pcr->StallScaleFactor = 50; - - // - // Setup software interrupts - // - Pcr->InterruptRoutine[PASSIVE_LEVEL] = KiPassiveRelease; - Pcr->InterruptRoutine[APC_LEVEL] = KiApcInterrupt; - Pcr->InterruptRoutine[DISPATCH_LEVEL] = KiDispatchInterrupt; - Pcr->ReservedVectors = (1 << PASSIVE_LEVEL) | - (1 << APC_LEVEL) | - (1 << DISPATCH_LEVEL) | - (1 << IPI_LEVEL); + + /* Set boot-level flags */ + KeProcessorArchitecture = PROCESSOR_ARCHITECTURE_ARM; + KeFeatureBits = 0; + KeProcessorLevel = (USHORT)(Pcr->ProcessorId >> 8); + KeProcessorRevision = (USHORT)(Pcr->ProcessorId & 0xFF); - // - // Set IRQL and prcessor member/number - // - Pcr->CurrentIrql = APC_LEVEL; - Pcr->SetMember = 1 << Number; - Pcr->NotMember = -Pcr->SetMember; - Pcr->Number = Number; + /* Set the current MP Master KPRCB to the Boot PRCB */ + Prcb->MultiThreadSetMaster = Prcb; - // - // Remember our parent - // - InitThread->ApcState.Process = InitProcess; + /* Lower to APC_LEVEL */ + KeLowerIrql(APC_LEVEL); - // - // Setup the active processor numbers - // - KeActiveProcessors |= 1 << Number; - KeNumberProcessors = Number + 1; - - // - // Check if this is the boot CPU - // - if (!Number) - { - // - // Setup KD - // - KdInitSystem(0, LoaderBlock); - - // - // Check for break-in - // - if (KdPollBreakIn()) DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C); - - // - // Cleanup the rest of the processor block array - // - for (i = 1; i < MAXIMUM_PROCESSORS; i++) KiProcessorBlock[i] = NULL; - - // - // Initialize portable parts of the OS - // + /* Initialize portable parts of the OS */ KiInitSystem(); - // - // Initialize the Idle Process and the Process Listhead - // + /* Initialize the Idle Process and the Process Listhead */ InitializeListHead(&KiProcessListHead); + PageDirectory[0] = 0; + PageDirectory[1] = 0; KeInitializeProcess(InitProcess, 0, 0xFFFFFFFF, @@ -215,15 +99,11 @@ KiInitializeKernel(IN PKPROCESS InitProcess, } else { - // - // FIXME-V6: See if we want to support MP - // + /* FIXME-V6: See if we want to support MP */ DPRINT1("ARM MPCore not supported\n"); } - - // - // Setup the Idle Thread - // + + /* Setup the Idle Thread */ KeInitializeThread(InitProcess, InitThread, NULL, @@ -239,253 +119,310 @@ KiInitializeKernel(IN PKPROCESS InitProcess, InitThread->WaitIrql = DISPATCH_LEVEL; InitProcess->ActiveProcessors = 1 << Number; - // - // HACK for MmUpdatePageDir - // + /* HACK for MmUpdatePageDir */ ((PETHREAD)InitThread)->ThreadsProcess = (PEPROCESS)InitProcess; - // - // Initialize the Kernel Executive - // + /* Set up the thread-related fields in the PRCB */ + Prcb->CurrentThread = InitThread; + Prcb->NextThread = NULL; + Prcb->IdleThread = InitThread; + + /* Initialize the Kernel Executive */ ExpInitializeExecutive(Number, LoaderBlock); - - // - // Only do this on the boot CPU - // + + /* Only do this on the boot CPU */ if (!Number) { - // - // Calculate the time reciprocal - // + /* Calculate the time reciprocal */ KiTimeIncrementReciprocal = - KiComputeReciprocal(KeMaximumIncrement, - &KiTimeIncrementShiftCount); - - // - // Update DPC Values in case they got updated by the executive - // + KiComputeReciprocal(KeMaximumIncrement, + &KiTimeIncrementShiftCount); + + /* Update DPC Values in case they got updated by the executive */ Prcb->MaximumDpcQueueDepth = KiMaximumDpcQueueDepth; Prcb->MinimumDpcRate = KiMinimumDpcRate; Prcb->AdjustDpcThreshold = KiAdjustDpcThreshold; } - - // - // Raise to Dispatch - // + + /* Raise to Dispatch */ KfRaiseIrql(DISPATCH_LEVEL); - - // - // Set the Idle Priority to 0. This will jump into Phase 1 - // + + /* Set the Idle Priority to 0. This will jump into Phase 1 */ KeSetPriorityThread(InitThread, 0); - - // - // If there's no thread scheduled, put this CPU in the Idle summary - // + + /* If there's no thread scheduled, put this CPU in the Idle summary */ KiAcquirePrcbLock(Prcb); if (!Prcb->NextThread) KiIdleSummary |= 1 << Number; KiReleasePrcbLock(Prcb); - - // - // Raise back to HIGH_LEVEL - // + + /* Raise back to HIGH_LEVEL and clear the PRCB for the loader block */ KfRaiseIrql(HIGH_LEVEL); + LoaderBlock->Prcb = 0; } +C_ASSERT((PKIPCR)KeGetPcr() == (PKIPCR)0xFFDFF000); +C_ASSERT((FIELD_OFFSET(KIPCR, FirstLevelDcacheSize) & 4) == 0); +C_ASSERT(sizeof(KIPCR) <= PAGE_SIZE); + VOID -KiInitializeSystem(IN ULONG Magic, - IN PLOADER_PARAMETER_BLOCK LoaderBlock) +NTAPI +KiInitializePcr(IN ULONG ProcessorNumber, + IN PKIPCR Pcr, + IN PKTHREAD IdleThread, + IN PVOID PanicStack, + IN PVOID InterruptStack) { - ARM_PTE Pte; - PKPCR Pcr; - ARM_CONTROL_REGISTER ControlRegister; + ULONG i; + + /* Set the Current Thread */ + Pcr->PrcbData.CurrentThread = IdleThread; - // - // Detect ARM version (Architecture 6 is the ARMv5TE-J, go figure!) - // - KeIsArmV6 = KeArmIdCodeRegisterGet().Architecture == 7; - - // - // Set the number of TLB entries and ASIDs - // - KeNumberTbEntries = 64; - if (__ARMV6__) - { - // - // 256 ASIDs on v6/v7 - // - KeNumberProcessIds = 256; - } - else - { - // - // The TLB is VIVT on v4/v5 - // - KeNumberProcessIds = 0; - } - - // - // Flush the TLB - // - KeFlushTb(); - - // - // Build the KIPCR pte - // - Pte.L1.Section.Type = SectionPte; - Pte.L1.Section.Buffered = FALSE; - Pte.L1.Section.Cached = FALSE; - Pte.L1.Section.Reserved = 1; // ARM926EJ-S manual recommends setting to 1 - Pte.L1.Section.Domain = Domain0; - Pte.L1.Section.Access = SupervisorAccess; - Pte.L1.Section.BaseAddress = LoaderBlock->u.Arm.PcrPage; - Pte.L1.Section.Ignored = Pte.L1.Section.Ignored1 = 0; - - // - // Map it into kernel address space by locking it into the TLB - // - KeFillFixedEntryTb(Pte, (PVOID)KIPCR, PCR_ENTRY); + /* Set pointers to ourselves */ + Pcr->Self = (PKPCR)Pcr; + Pcr->Prcb = &Pcr->PrcbData; - // - // Now map the PCR into user address space as well (read-only) - // - Pte.L1.Section.Access = SharedAccess; - KeFillFixedEntryTb(Pte, (PVOID)USPCR, PCR_ENTRY + 1); - - // - // Now we should be able to use the PCR... - // - Pcr = (PKPCR)KeGetPcr(); - - // - // Set the cache policy (HACK) - // - Pcr->CachePolicy = 0; - Pcr->AlignedCachePolicy = 0; - - // - // Copy cache information from the loader block - // - Pcr->FirstLevelDcacheSize = LoaderBlock->u.Arm.FirstLevelDcacheSize; - Pcr->SecondLevelDcacheSize = LoaderBlock->u.Arm.SecondLevelDcacheSize; - Pcr->FirstLevelIcacheSize = LoaderBlock->u.Arm.FirstLevelIcacheSize; - Pcr->SecondLevelIcacheSize = LoaderBlock->u.Arm.SecondLevelIcacheSize; - Pcr->FirstLevelDcacheFillSize = LoaderBlock->u.Arm.FirstLevelDcacheFillSize; - Pcr->SecondLevelDcacheFillSize = LoaderBlock->u.Arm.SecondLevelDcacheFillSize; - Pcr->FirstLevelIcacheFillSize = LoaderBlock->u.Arm.FirstLevelIcacheFillSize; - Pcr->SecondLevelIcacheFillSize = LoaderBlock->u.Arm.SecondLevelIcacheFillSize; + /* Set the PCR Version */ + Pcr->MajorVersion = PCR_MAJOR_VERSION; + Pcr->MinorVersion = PCR_MINOR_VERSION; - // - // Set global d-cache fill and alignment values - // + /* Set the PCRB Version */ + Pcr->PrcbData.MajorVersion = 1; + Pcr->PrcbData.MinorVersion = 1; + + /* Set the Build Type */ + Pcr->PrcbData.BuildType = 0; +#ifndef CONFIG_SMP + Pcr->PrcbData.BuildType |= PRCB_BUILD_UNIPROCESSOR; +#endif +#if DBG + Pcr->PrcbData.BuildType |= PRCB_BUILD_DEBUG; +#endif + + /* Set the Processor Number and current Processor Mask */ + Pcr->PrcbData.Number = (UCHAR)ProcessorNumber; + Pcr->PrcbData.SetMember = 1 << ProcessorNumber; + + /* Set the PRCB for this Processor */ + KiProcessorBlock[ProcessorNumber] = Pcr->Prcb; + + /* Start us out at PASSIVE_LEVEL */ + Pcr->Irql = PASSIVE_LEVEL; + + /* Set the stacks */ + Pcr->PanicStack = PanicStack; + Pcr->InterruptStack = InterruptStack; + + /* Setup the processor set */ + Pcr->PrcbData.MultiThreadProcessorSet = Pcr->PrcbData.SetMember; + + /* Copy cache information from the loader block */ + Pcr->FirstLevelDcacheSize = KeLoaderBlock->u.Arm.FirstLevelDcacheSize; + Pcr->SecondLevelDcacheSize = KeLoaderBlock->u.Arm.SecondLevelDcacheSize; + Pcr->FirstLevelIcacheSize = KeLoaderBlock->u.Arm.FirstLevelIcacheSize; + Pcr->SecondLevelIcacheSize = KeLoaderBlock->u.Arm.SecondLevelIcacheSize; + Pcr->FirstLevelDcacheFillSize = KeLoaderBlock->u.Arm.FirstLevelDcacheFillSize; + Pcr->SecondLevelDcacheFillSize = KeLoaderBlock->u.Arm.SecondLevelDcacheFillSize; + Pcr->FirstLevelIcacheFillSize = KeLoaderBlock->u.Arm.FirstLevelIcacheFillSize; + Pcr->SecondLevelIcacheFillSize = KeLoaderBlock->u.Arm.SecondLevelIcacheFillSize; + + /* Set global d-cache fill and alignment values */ if (!Pcr->SecondLevelDcacheSize) { - // - // Use the first level - // + /* Use the first level */ Pcr->DcacheFillSize = Pcr->FirstLevelDcacheSize; } else { - // - // Use the second level - // + /* Use the second level */ Pcr->DcacheFillSize = Pcr->SecondLevelDcacheSize; } - // - // Set the alignment - // + /* Set the alignment */ Pcr->DcacheAlignment = Pcr->DcacheFillSize - 1; - // - // Set global i-cache fill and alignment values - // + /* Set global i-cache fill and alignment values */ if (!Pcr->SecondLevelIcacheSize) { - // - // Use the first level - // + /* Use the first level */ Pcr->IcacheFillSize = Pcr->FirstLevelIcacheSize; } else { - // - // Use the second level - // + /* Use the second level */ Pcr->IcacheFillSize = Pcr->SecondLevelIcacheSize; } - // - // Set the alignment - // + /* Set the alignment */ Pcr->IcacheAlignment = Pcr->IcacheFillSize - 1; - // - // Now sweep caches - // + /* Set processor information */ + Pcr->ProcessorId = KeArmIdCodeRegisterGet().AsUlong; + + /* Set all interrupt routines to unexpected interrupts as well */ + for (i = 0; i < MAXIMUM_VECTOR; i++) + { + /* Point to the same template */ + Pcr->InterruptRoutine[i] = (PVOID)&KxUnexpectedInterrupt.DispatchCode; + } + + /* Set default stall factor */ + Pcr->StallScaleFactor = 50; + + /* Setup software interrupts */ + Pcr->InterruptRoutine[PASSIVE_LEVEL] = KiPassiveRelease; + Pcr->InterruptRoutine[APC_LEVEL] = KiApcInterrupt; + Pcr->InterruptRoutine[DISPATCH_LEVEL] = KiDispatchInterrupt; + Pcr->ReservedVectors = (1 << PASSIVE_LEVEL) | + (1 << APC_LEVEL) | + (1 << DISPATCH_LEVEL) | + (1 << IPI_LEVEL); +} + +VOID +KiInitializeMachineType(VOID) +{ + /* Detect ARM version */ + KeIsArmV6 = KeArmIdCodeRegisterGet().Architecture >= 7; + + /* Set the number of TLB entries and ASIDs */ + KeNumberTbEntries = 64; + if (__ARMV6__) + { + /* 256 ASIDs on v6/v7 */ + KeNumberProcessIds = 256; + } + else + { + /* The TLB is VIVT on v4/v5 */ + KeNumberProcessIds = 0; + } +} + +VOID +KiInitializeSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + ULONG Cpu; + PKTHREAD InitialThread; + PKPROCESS InitialProcess; + ARM_CONTROL_REGISTER ControlRegister; + PKIPCR Pcr = (PKIPCR)KeGetPcr(); + PKTHREAD Thread; + + /* Flush the TLB */ + KeFlushTb(); + + /* Save the loader block and get the current CPU */ + KeLoaderBlock = LoaderBlock; + Cpu = KeNumberProcessors; + + /* Save the initial thread and process */ + InitialThread = (PKTHREAD)LoaderBlock->Thread; + InitialProcess = (PKPROCESS)LoaderBlock->Process; + + /* Clean the APC List Head */ + InitializeListHead(&InitialThread->ApcState.ApcListHead[KernelMode]); + + /* Initialize the machine type */ + KiInitializeMachineType(); + + /* Skip initial setup if this isn't the Boot CPU */ + if (Cpu) goto AppCpuInit; + + /* Initialize the PCR */ + RtlZeroMemory(Pcr, PAGE_SIZE); + KiInitializePcr(Cpu, + Pcr, + InitialThread, + (PVOID)LoaderBlock->u.Arm.PanicStack, + (PVOID)LoaderBlock->u.Arm.InterruptStack); + + /* Now sweep caches */ HalSweepIcache(); HalSweepDcache(); - // - // Set PCR version - // - Pcr->MinorVersion = PCR_MINOR_VERSION; - Pcr->MajorVersion = PCR_MAJOR_VERSION; + /* Set us as the current process */ + InitialThread->ApcState.Process = InitialProcess; - // - // Set boot PRCB - // - Pcr->Prcb = (PKPRCB)LoaderBlock->Prcb; +AppCpuInit: + /* Setup CPU-related fields */ + Pcr->Number = Cpu; + Pcr->SetMember = 1 << Cpu; + Pcr->SetMemberCopy = 1 << Cpu; + Pcr->PrcbData.SetMember = 1 << Cpu; - // - // Set the different stacks - // - Pcr->InitialStack = (PVOID)LoaderBlock->KernelStack; - Pcr->PanicStack = (PVOID)LoaderBlock->u.Arm.PanicStack; - Pcr->InterruptStack = (PVOID)LoaderBlock->u.Arm.InterruptStack; + /* Initialize the Processor with HAL */ + HalInitializeProcessor(Cpu, KeLoaderBlock); + + /* Set active processors */ + KeActiveProcessors |= Pcr->SetMember; + KeNumberProcessors++; + + /* Check if this is the boot CPU */ + if (!Cpu) + { + /* Initialize debugging system */ + KdInitSystem(0, KeLoaderBlock); + + /* Check for break-in */ + if (KdPollBreakIn()) DbgBreakPointWithStatus(DBG_STATUS_CONTROL_C); + } + + /* Raise to HIGH_LEVEL */ + KfRaiseIrql(HIGH_LEVEL); - // - // Set the current thread - // - Pcr->CurrentThread = (PKTHREAD)LoaderBlock->Thread; - - // - // Set the current IRQL to high - // - Pcr->CurrentIrql = HIGH_LEVEL; - - // - // Set processor information - // - Pcr->ProcessorId = KeArmIdCodeRegisterGet().AsUlong; - Pcr->SystemReserved[0] = KeArmControlRegisterGet().AsUlong; - - // - // Set the exception address to high - // + /* Set the exception address to high */ ControlRegister = KeArmControlRegisterGet(); ControlRegister.HighVectors = TRUE; KeArmControlRegisterSet(ControlRegister); - // - // Setup the exception vector table - // + /* Setup the exception vector table */ RtlCopyMemory((PVOID)0xFFFF0000, &KiArmVectorTable, 14 * sizeof(PVOID)); - // - // Initialize the rest of the kernel now - // + /* Initialize the rest of the kernel now */ KiInitializeKernel((PKPROCESS)LoaderBlock->Process, (PKTHREAD)LoaderBlock->Thread, (PVOID)LoaderBlock->KernelStack, - (PKPRCB)LoaderBlock->Prcb, + Pcr->Prcb, Pcr->Prcb->Number, - LoaderBlock); - - - // - // Jump to idle loop - // + KeLoaderBlock); + + /* Set the priority of this thread to 0 */ + Thread = KeGetCurrentThread(); + Thread->Priority = 0; + + /* Force interrupts enabled and lower IRQL back to DISPATCH_LEVEL */ + _enable(); + KfLowerIrql(DISPATCH_LEVEL); + + /* Set the right wait IRQL */ + Thread->WaitIrql = DISPATCH_LEVEL; + + /* Jump into the idle loop */ KiIdleLoop(); } + +ULONG +DbgPrintEarly(const char *fmt, ...) +{ + va_list args; + unsigned int i; + char Buffer[1024]; + PCHAR String = Buffer; + + va_start(args, fmt); + i = vsprintf(Buffer, fmt, args); + va_end(args); + + /* Output the message */ + while (*String != 0) + { + if (*String == '\n') + { + KdPortPutByteEx(NULL, '\r'); + } + KdPortPutByteEx(NULL, *String); + String++; + } + + return STATUS_SUCCESS; +} diff --git a/reactos/ntoskrnl/ke/arm/trapc.c b/reactos/ntoskrnl/ke/arm/trapc.c index 51b12f816e4..edfedf42820 100644 --- a/reactos/ntoskrnl/ke/arm/trapc.c +++ b/reactos/ntoskrnl/ke/arm/trapc.c @@ -25,6 +25,9 @@ KiIdleLoop(VOID) // // Loop forever... that's why this is an idle loop // + DPRINT1("[IDLE LOOP]\n"); + while (TRUE); + while (TRUE) { // @@ -117,10 +120,13 @@ BOOLEAN KiSwapContextInternal(IN PKTHREAD OldThread, IN PKTHREAD NewThread) { - PKPCR Pcr = (PKPCR)KeGetPcr(); + PKIPCR Pcr = (PKIPCR)KeGetPcr(); PKPRCB Prcb = Pcr->Prcb; PKPROCESS OldProcess, NewProcess; + DPRINT1("SWAP\n"); + while (TRUE); + // // Increase context switch count // @@ -163,7 +169,7 @@ KiSwapContextInternal(IN PKTHREAD OldThread, // Increase thread context switches // NewThread->ContextSwitches++; - +#if 0 // I don't buy this // // Set us as the current thread // NOTE: On RISC Platforms, there is both a KPCR CurrentThread, and a @@ -175,7 +181,7 @@ KiSwapContextInternal(IN PKTHREAD OldThread, // there as well. // Pcr->CurrentThread = NewThread; - +#endif // // DPCs shouldn't be active // @@ -221,7 +227,9 @@ KiApcInterrupt(VOID) KPROCESSOR_MODE PreviousMode; KEXCEPTION_FRAME ExceptionFrame; PKTRAP_FRAME TrapFrame = KeGetCurrentThread()->TrapFrame; - //DPRINT1("[APC]\n"); + + DPRINT1("[APC TRAP]\n"); + while (TRUE); // // Isolate previous mode @@ -257,14 +265,17 @@ KiApcInterrupt(VOID) VOID KiDispatchInterrupt(VOID) { - PKPCR Pcr; + PKIPCR Pcr; PKPRCB Prcb; PKTHREAD NewThread, OldThread; + DPRINT1("[DPC TRAP]\n"); + while (TRUE); + // // Get the PCR and disable interrupts // - Pcr = (PKPCR)KeGetPcr(); + Pcr = (PKIPCR)KeGetPcr(); Prcb = Pcr->Prcb; _disable(); @@ -339,14 +350,14 @@ KiInterruptHandler(IN PKTRAP_FRAME TrapFrame, { KIRQL OldIrql, Irql; ULONG InterruptCause, InterruptMask; - PKPCR Pcr; + PKIPCR Pcr; PKTRAP_FRAME OldTrapFrame; ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00); // // Increment interrupt count // - Pcr = (PKPCR)KeGetPcr(); + Pcr = (PKIPCR)KeGetPcr(); Pcr->Prcb->InterruptCount++; // @@ -359,7 +370,7 @@ KiInterruptHandler(IN PKTRAP_FRAME TrapFrame, // Get the interrupt source // InterruptCause = HalGetInterruptSource(); -// DPRINT1("[INT] (%x) @ %p %p\n", InterruptCause, TrapFrame->SvcLr, TrapFrame->Pc); + //DPRINT1("[INT] (%x) @ %p %p\n", InterruptCause, TrapFrame->SvcLr, TrapFrame->Pc); // // Get the new IRQL and Interrupt Mask @@ -421,6 +432,10 @@ KiPrefetchAbortHandler(IN PKTRAP_FRAME TrapFrame) ULONG DebugType, Parameter0; EXCEPTION_RECORD ExceptionRecord; + DPRINT1("[PREFETCH ABORT] (%x) @ %p/%p/%p\n", + KeArmInstructionFaultStatusRegisterGet(), Address, TrapFrame->SvcLr, TrapFrame->Pc); + while (TRUE); + // // What we *SHOULD* do is look at the instruction fault status register // and see if it's equal to 2 (debug trap). Unfortunately QEMU doesn't seem @@ -483,8 +498,6 @@ KiPrefetchAbortHandler(IN PKTRAP_FRAME TrapFrame) // // Unhandled // - DPRINT1("[PREFETCH ABORT] (%x) @ %p/%p/%p\n", - KeArmInstructionFaultStatusRegisterGet(), Address, TrapFrame->SvcLr, TrapFrame->Pc); UNIMPLEMENTED; ASSERT(FALSE); return STATUS_SUCCESS; @@ -497,6 +510,10 @@ KiDataAbortHandler(IN PKTRAP_FRAME TrapFrame) PVOID Address = (PVOID)KeArmFaultAddressRegisterGet(); ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00); + DPRINT1("[ABORT] (%x) @ %p/%p/%p\n", + KeArmFaultStatusRegisterGet(), Address, TrapFrame->SvcLr, TrapFrame->Pc); + while (TRUE); + // // Check if this is a page fault // @@ -512,8 +529,6 @@ KiDataAbortHandler(IN PKTRAP_FRAME TrapFrame) // // Unhandled // - DPRINT1("[ABORT] (%x) @ %p/%p/%p\n", - KeArmFaultStatusRegisterGet(), Address, TrapFrame->SvcLr, TrapFrame->Pc); UNIMPLEMENTED; ASSERT(FALSE); return STATUS_SUCCESS; @@ -527,6 +542,9 @@ KiSoftwareInterruptHandler(IN PKTRAP_FRAME TrapFrame) ULONG Instruction; ASSERT(TrapFrame->DbgArgMark == 0xBADB0D00); + DPRINT1("[SWI] @ %p/%p\n", TrapFrame->SvcLr, TrapFrame->Pc); + while (TRUE); + // // Get the current thread // diff --git a/reactos/ntoskrnl/ke/arm/usercall.c b/reactos/ntoskrnl/ke/arm/usercall.c index 1621983c1c7..3b6ceeaa6dc 100644 --- a/reactos/ntoskrnl/ke/arm/usercall.c +++ b/reactos/ntoskrnl/ke/arm/usercall.c @@ -226,7 +226,7 @@ KiSystemService(IN PKTHREAD Thread, // // Forcibly put us in a sane state // - KeGetPcr()->CurrentIrql = 0; + KeGetPcr()->Irql = 0; _disable(); // diff --git a/reactos/ntoskrnl/ke/eventobj.c b/reactos/ntoskrnl/ke/eventobj.c index 2f798a1b05c..b6457ce9507 100644 --- a/reactos/ntoskrnl/ke/eventobj.c +++ b/reactos/ntoskrnl/ke/eventobj.c @@ -32,7 +32,7 @@ KeClearEvent(IN PKEVENT Event) */ VOID NTAPI -KeInitializeEvent(IN PKEVENT Event, +KeInitializeEvent(OUT PKEVENT Event, IN EVENT_TYPE Type, IN BOOLEAN State) { diff --git a/reactos/ntoskrnl/ke/except.c b/reactos/ntoskrnl/ke/except.c index cc93dcd3a77..d02fa17d1c3 100644 --- a/reactos/ntoskrnl/ke/except.c +++ b/reactos/ntoskrnl/ke/except.c @@ -186,7 +186,7 @@ NtRaiseException(IN PEXCEPTION_RECORD ExceptionRecord, /* Set exception list */ #ifdef _M_IX86 - KeGetPcr()->Tib.ExceptionList = TrapFrame->ExceptionList; + KeGetPcr()->NtTib.ExceptionList = TrapFrame->ExceptionList; #endif /* Raise the exception */ diff --git a/reactos/ntoskrnl/ke/i386/cpu.c b/reactos/ntoskrnl/ke/i386/cpu.c index 46c2fc80c0f..02756657093 100644 --- a/reactos/ntoskrnl/ke/i386/cpu.c +++ b/reactos/ntoskrnl/ke/i386/cpu.c @@ -995,56 +995,6 @@ KiLoadFastSyscallMachineSpecificRegisters(IN ULONG_PTR Context) return 0; } -VOID -NTAPI -KiDisableFastSyscallReturn(VOID) -{ - /* Was it applied? */ - if (KiSystemCallExitAdjusted) - { - /* Restore the original value */ - KiSystemCallExitBranch[1] = KiSystemCallExitBranch[1] - KiSystemCallExitAdjusted; - - /* It's not adjusted anymore */ - KiSystemCallExitAdjusted = FALSE; - } -} - -VOID -NTAPI -KiEnableFastSyscallReturn(VOID) -{ - /* Check if the patch has already been done */ - if ((KiSystemCallExitAdjusted == KiSystemCallExitAdjust) && - (KiFastCallCopyDoneOnce)) - { - return; - } - - /* Make sure the offset is within the distance of a Jxx SHORT */ - if ((KiSystemCallExitBranch[1] - KiSystemCallExitAdjust) < 0x80) - { - /* Remove any existing code patch */ - KiDisableFastSyscallReturn(); - - /* We should have a JNZ there */ - ASSERT(KiSystemCallExitBranch[0] == 0x75); - - /* Do the patch */ - KiSystemCallExitAdjusted = KiSystemCallExitAdjust; - KiSystemCallExitBranch[1] -= KiSystemCallExitAdjusted; - - /* Remember that we've done it */ - KiFastCallCopyDoneOnce = TRUE; - } - else - { - /* This shouldn't happen unless we've messed the macros up */ - DPRINT1("Your compiled kernel is broken!\n"); - DbgBreakPoint(); - } -} - VOID NTAPI KiRestoreFastSyscallReturnState(VOID) @@ -1055,28 +1005,27 @@ KiRestoreFastSyscallReturnState(VOID) /* Check if it has been disabled */ if (!KiFastSystemCallDisable) { - /* KiSystemCallExit2 should come BEFORE KiSystemCallExit */ - ASSERT(KiSystemCallExit2 < KiSystemCallExit); - - /* It's enabled, so we'll have to do a code patch */ - KiSystemCallExitAdjust = KiSystemCallExit - KiSystemCallExit2; + /* Do an IPI to enable it */ + KeIpiGenericCall(KiLoadFastSyscallMachineSpecificRegisters, 0); + + /* It's enabled, so use the proper exit stub */ + KiFastCallExitHandler = KiSystemCallSysExitReturn; + DPRINT1("Support for SYSENTER detected.\n"); } else { /* Disable fast system call */ KeFeatureBits &= ~KF_FAST_SYSCALL; + KiFastCallExitHandler = KiSystemCallTrapReturn; + DPRINT1("Support for SYSENTER disabled.\n"); } } - - /* Now check if all CPUs support fast system call, and the registry allows it */ - if (KeFeatureBits & KF_FAST_SYSCALL) + else { - /* Do an IPI to enable it */ - KeIpiGenericCall(KiLoadFastSyscallMachineSpecificRegisters, 0); + /* Use the IRET handler */ + KiFastCallExitHandler = KiSystemCallTrapReturn; + DPRINT1("No support for SYSENTER detected.\n"); } - - /* Perform the code patch that is required */ - KiEnableFastSyscallReturn(); } ULONG_PTR diff --git a/reactos/ntoskrnl/ke/i386/irqobj.c b/reactos/ntoskrnl/ke/i386/irqobj.c index 58b66248c30..10170134d82 100644 --- a/reactos/ntoskrnl/ke/i386/irqobj.c +++ b/reactos/ntoskrnl/ke/i386/irqobj.c @@ -168,7 +168,7 @@ KiUnexpectedInterruptTailHandler(IN PKTRAP_FRAME TrapFrame) KeGetCurrentPrcb()->InterruptCount++; /* Start the interrupt */ - if (HalBeginSystemInterrupt(HIGH_LEVEL, TrapFrame->Eax, &OldIrql)) + if (HalBeginSystemInterrupt(HIGH_LEVEL, TrapFrame->ErrCode, &OldIrql)) { /* Warn user */ DPRINT1("\n\x7\x7!!! Unexpected Interrupt %02lx !!!\n"); @@ -233,7 +233,7 @@ KiChainedDispatch(IN PKTRAP_FRAME TrapFrame, KIRQL OldIrql; BOOLEAN Handled; PLIST_ENTRY NextEntry, ListHead; - + /* Increase interrupt count */ KeGetCurrentPrcb()->InterruptCount++; @@ -299,7 +299,7 @@ KiChainedDispatch(IN PKTRAP_FRAME TrapFrame, /* Now call the epilogue code */ KiExitInterrupt(TrapFrame, OldIrql, TRUE); } - } +} VOID FASTCALL @@ -313,8 +313,6 @@ KiInterruptTemplateHandler(IN PKTRAP_FRAME TrapFrame, ((PKI_INTERRUPT_DISPATCH*)Interrupt->DispatchAddress)(TrapFrame, Interrupt); } -KiTrap(KiInterruptTemplate, KI_PUSH_FAKE_ERROR_CODE | KI_HARDWARE_INT); -KiTrap(KiUnexpectedInterruptTail, KI_PUSH_FAKE_ERROR_CODE); /* PUBLIC FUNCTIONS **********************************************************/ diff --git a/reactos/ntoskrnl/ke/i386/patpge.c b/reactos/ntoskrnl/ke/i386/patpge.c index ea86e1c45b3..9b6ef4b67c6 100644 --- a/reactos/ntoskrnl/ke/i386/patpge.c +++ b/reactos/ntoskrnl/ke/i386/patpge.c @@ -12,10 +12,6 @@ #define NDEBUG #include -/* GLOBALS *******************************************************************/ - -ULONG Ke386GlobalPagesEnabled; - /* FUNCTIONS *****************************************************************/ ULONG_PTR @@ -46,8 +42,8 @@ Ki386EnableGlobalPage(IN volatile ULONG_PTR Context) __writecr3(Cr3); /* Now enable PGE */ - __writecr4(Cr4 | CR4_PGE); - Ke386GlobalPagesEnabled = TRUE; + DPRINT1("Global page support detected but not yet taken advantage of\n"); + //__writecr4(Cr4 | CR4_PGE); /* Restore interrupts */ _enable(); diff --git a/reactos/ntoskrnl/ke/i386/trap.s b/reactos/ntoskrnl/ke/i386/trap.s index 293cd6f8106..adfcd322dd9 100644 --- a/reactos/ntoskrnl/ke/i386/trap.s +++ b/reactos/ntoskrnl/ke/i386/trap.s @@ -3,19 +3,33 @@ * COPYRIGHT: See COPYING in the top level directory * PURPOSE: System Traps, Entrypoints and Exitpoints * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + * Timo Kreuzer (timo.kreuzer@reactos.org) * NOTE: See asmmacro.S for the shared entry/exit code. */ /* INCLUDES ******************************************************************/ -#include +#include +#include #include -.intel_syntax noprefix + +MACRO(GENERATE_IDT_STUB, Number) +idt _KiUnexpectedInterrupt&Number, INT_32_DPL0 +ENDM + +MACRO(GENERATE_INT_HANDLER, Number) +.func KiUnexpectedInterrupt&Number +_KiUnexpectedInterrupt&Number: + push PRIMARY_VECTOR_BASE + Number + jmp _KiEndUnexpectedRange@0 +.endfunc +ENDM /* GLOBALS *******************************************************************/ .data -.globl _KiIdt + +PUBLIC _KiIdt _KiIdt: /* This is the Software Interrupt Table that we handle in this file: */ idt _KiTrap00, INT_32_DPL0 /* INT 00: Divide Error (#DE) */ @@ -47,26 +61,97 @@ idt _KiRaiseAssertion, INT_32_DPL3 /* INT 2C: Debug Assertion Handler */ idt _KiDebugService, INT_32_DPL3 /* INT 2D: Debug Service Handler */ idt _KiSystemService, INT_32_DPL3 /* INT 2E: System Call Service Handler */ idt _KiTrap0F, INT_32_DPL0 /* INT 2F: RESERVED */ -GENERATE_IDT_STUBS /* INT 30-FF: UNEXPECTED INTERRUPTS */ +i = 0 +.rept 208 + GENERATE_IDT_STUB %i + i = i + 1 +.endr -.globl _KiIdtDescriptor +PUBLIC _KiIdtDescriptor _KiIdtDescriptor: .short 0 .short 0x7FF .long _KiIdt -.globl _KiUnexpectedEntrySize +PUBLIC _KiUnexpectedEntrySize _KiUnexpectedEntrySize: .long _KiUnexpectedInterrupt1 - _KiUnexpectedInterrupt0 +/******************************************************************************/ +.code32 .text -/* HARDWARE INTERRUPT HANDLERS ************************************************/ -.globl _KiStartUnexpectedRange@0 +TRAP_ENTRY KiTrap00, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap01, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap03, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap04, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap05, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap06, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap07, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap08, 0 +TRAP_ENTRY KiTrap09, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap0A, 0 +TRAP_ENTRY KiTrap0B, 0 +TRAP_ENTRY KiTrap0C, 0 +TRAP_ENTRY KiTrap0D, 0 +TRAP_ENTRY KiTrap0E, 0 +TRAP_ENTRY KiTrap0F, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap10, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap11, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiTrap13, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiGetTickCount, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiCallbackReturn, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiRaiseAssertion, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiDebugService, KI_PUSH_FAKE_ERROR_CODE +TRAP_ENTRY KiUnexpectedInterruptTail, 0 + +ALIGN 4 +EXTERN @KiInterruptTemplateHandler@8 +PUBLIC _KiInterruptTemplate +_KiInterruptTemplate: + KiEnterTrap KI_PUSH_FAKE_ERROR_CODE +PUBLIC _KiInterruptTemplate2ndDispatch +_KiInterruptTemplate2ndDispatch: + mov edx, 0 +PUBLIC _KiInterruptTemplateObject +_KiInterruptTemplateObject: + mov eax, offset @KiInterruptTemplateHandler@8 + jmp eax +PUBLIC _KiInterruptTemplateDispatch +_KiInterruptTemplateDispatch: + +EXTERN @KiSystemServiceHandler@8:PROC +PUBLIC _KiSystemService +_KiSystemService: + KiEnterTrap (KI_PUSH_FAKE_ERROR_CODE OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS) + KiCallHandler @KiSystemServiceHandler@8 + +EXTERN @KiFastCallEntryHandler@8:PROC +PUBLIC _KiFastCallEntry +_KiFastCallEntry: + KiEnterTrap (KI_FAST_SYSTEM_CALL OR KI_NONVOLATILES_ONLY OR KI_DONT_SAVE_SEGS) + KiCallHandler @KiFastCallEntryHandler@8 + +PUBLIC _KiStartUnexpectedRange@0 _KiStartUnexpectedRange@0: - -GENERATE_INT_HANDLERS - -.globl _KiEndUnexpectedRange@0 +i = 0 +.rept 208 + GENERATE_INT_HANDLER %i + i = i + 1 +.endr +PUBLIC _KiEndUnexpectedRange@0 _KiEndUnexpectedRange@0: jmp _KiUnexpectedInterruptTail + + +/* EXIT CODE *****************************************************************/ + +KiTrapExitStub KiSystemCallReturn, (KI_RESTORE_EAX OR KI_RESTORE_EFLAGS OR KI_EXIT_JMP) +KiTrapExitStub KiSystemCallSysExitReturn, (KI_RESTORE_EAX OR KI_RESTORE_FS OR KI_RESTORE_EFLAGS OR KI_EXIT_SYSCALL) +KiTrapExitStub KiSystemCallTrapReturn, (KI_RESTORE_EAX OR KI_RESTORE_FS OR KI_EXIT_IRET) + +KiTrapExitStub KiEditedTrapReturn, (KI_RESTORE_VOLATILES OR KI_RESTORE_EFLAGS OR KI_EDITED_FRAME OR KI_EXIT_RET) +KiTrapExitStub KiTrapReturn, (KI_RESTORE_VOLATILES OR KI_RESTORE_SEGMENTS OR KI_EXIT_IRET) +KiTrapExitStub KiTrapReturnNoSegments, (KI_RESTORE_VOLATILES OR KI_EXIT_IRET) + +END diff --git a/reactos/ntoskrnl/ke/i386/traphdlr.c b/reactos/ntoskrnl/ke/i386/traphdlr.c index a6d8052c893..f9a954ec298 100644 --- a/reactos/ntoskrnl/ke/i386/traphdlr.c +++ b/reactos/ntoskrnl/ke/i386/traphdlr.c @@ -45,6 +45,11 @@ UCHAR KiTrapIoTable[] = 0x6F, /* OUTS */ }; +PFAST_SYSTEM_CALL_EXIT KiFastCallExitHandler; + + +/* TRAP EXIT CODE *************************************************************/ + BOOLEAN FORCEINLINE KiVdmTrap(IN PKTRAP_FRAME TrapFrame) @@ -53,13 +58,27 @@ KiVdmTrap(IN PKTRAP_FRAME TrapFrame) return ((TrapFrame->EFlags & EFLAGS_V86_MASK) || ((KiUserTrap(TrapFrame)) && (PsGetCurrentProcess()->VdmObjects))); } - -/* TRAP EXIT CODE *************************************************************/ + +BOOLEAN +FORCEINLINE +KiV86Trap(IN PKTRAP_FRAME TrapFrame) +{ + /* Check if the V8086 flag is on */ + return ((TrapFrame->EFlags & EFLAGS_V86_MASK) != 0); +} + +BOOLEAN +FORCEINLINE +KiIsFrameEdited(IN PKTRAP_FRAME TrapFrame) +{ + /* An edited frame changes esp. It is marked by clearing the bits + defined by FRAME_EDITED in the SegCs field of the trap frame */ + return ((TrapFrame->SegCs & FRAME_EDITED) == 0); +} VOID -FASTCALL -DECLSPEC_NORETURN -KiEoiHelper(IN PKTRAP_FRAME TrapFrame) +FORCEINLINE +KiCommonExit(IN PKTRAP_FRAME TrapFrame, const ULONG Flags) { /* Disable interrupts until we return */ _disable(); @@ -67,8 +86,41 @@ KiEoiHelper(IN PKTRAP_FRAME TrapFrame) /* Check for APC delivery */ KiCheckForApcDelivery(TrapFrame); - /* Now exit the trap for real */ - KiExitTrap(TrapFrame, KTE_SKIP_PM_BIT); + /* Debugging checks */ + KiExitTrapDebugChecks(TrapFrame, Flags); + + /* Restore the SEH handler chain */ + KeGetPcr()->NtTib.ExceptionList = TrapFrame->ExceptionList; + + /* Check if there are active debug registers */ + if (__builtin_expect(TrapFrame->Dr7 & ~DR7_RESERVED_MASK, 0)) + { + /* Not handled yet */ + DbgPrint("Need Hardware Breakpoint Support!\n"); + DbgBreakPoint(); + while (TRUE); + } +} + +VOID +FASTCALL +DECLSPEC_NORETURN +KiEoiHelper(IN PKTRAP_FRAME TrapFrame) +{ + /* Common trap exit code */ + KiCommonExit(TrapFrame, 0); + + /* Check if this was a V8086 trap */ + if (TrapFrame->EFlags & EFLAGS_V86_MASK) KiTrapReturnNoSegments(TrapFrame); + + /* Check for user mode exit */ + if (TrapFrame->SegCs & MODE_MASK) KiTrapReturn(TrapFrame); + + /* Check for edited frame */ + if (KiIsFrameEdited(TrapFrame)) KiEditedTrapReturn(TrapFrame); + + /* Exit the trap to kernel mode */ + KiTrapReturnNoSegments(TrapFrame); } VOID @@ -77,17 +129,36 @@ DECLSPEC_NORETURN KiServiceExit(IN PKTRAP_FRAME TrapFrame, IN NTSTATUS Status) { - /* Disable interrupts until we return */ - _disable(); - - /* Check for APC delivery */ - KiCheckForApcDelivery(TrapFrame); + ASSERT((TrapFrame->EFlags & EFLAGS_V86_MASK) == 0); + ASSERT(!KiIsFrameEdited(TrapFrame)); /* Copy the status into EAX */ TrapFrame->Eax = Status; - /* Now exit the trap for real */ - KiExitTrap(TrapFrame, KTE_SKIP_SEG_BIT | KTE_SKIP_VOL_BIT); + /* Common trap exit code */ + KiCommonExit(TrapFrame, 0); + + /* Restore previous mode */ + KeGetCurrentThread()->PreviousMode = TrapFrame->PreviousPreviousMode; + + /* Check for user mode exit */ + if (TrapFrame->SegCs & MODE_MASK) + { + /* Check if we were single stepping */ + if (TrapFrame->EFlags & EFLAGS_TF) + { + /* Must use the IRET handler */ + KiSystemCallTrapReturn(TrapFrame); + } + else + { + /* We can use the sysexit handler */ + KiFastCallExitHandler(TrapFrame); + } + } + + /* Exit to kernel mode */ + KiSystemCallReturn(TrapFrame); } VOID @@ -95,16 +166,26 @@ FASTCALL DECLSPEC_NORETURN KiServiceExit2(IN PKTRAP_FRAME TrapFrame) { - /* Disable interrupts until we return */ - _disable(); + /* Common trap exit code */ + KiCommonExit(TrapFrame, 0); - /* Check for APC delivery */ - KiCheckForApcDelivery(TrapFrame); + /* Restore previous mode */ + KeGetCurrentThread()->PreviousMode = TrapFrame->PreviousPreviousMode; - /* Now exit the trap for real */ - KiExitTrap(TrapFrame, 0); + /* Check if this was a V8086 trap */ + if (TrapFrame->EFlags & EFLAGS_V86_MASK) KiTrapReturnNoSegments(TrapFrame); + + /* Check for user mode exit */ + if (TrapFrame->SegCs & MODE_MASK) KiTrapReturn(TrapFrame); + + /* Check for edited frame */ + if (KiIsFrameEdited(TrapFrame)) KiEditedTrapReturn(TrapFrame); + + /* Exit the trap to kernel mode */ + KiTrapReturnNoSegments(TrapFrame); } + /* TRAP HANDLERS **************************************************************/ VOID @@ -223,7 +304,7 @@ KiNpxHandler(IN PKTRAP_FRAME TrapFrame, DataOffset, TrapFrame); } - + /* Check for invalid operation */ if (Error & FSW_INVALID_OPERATION) { @@ -403,7 +484,7 @@ KiTrap02(VOID) TrapFrame.Esi = Tss->Esi; TrapFrame.Edi = Tss->Edi; TrapFrame.SegFs = Tss->Fs; - TrapFrame.ExceptionList = PCR->Tib.ExceptionList; + TrapFrame.ExceptionList = PCR->NtTib.ExceptionList; TrapFrame.PreviousPreviousMode = -1; TrapFrame.Eax = Tss->Eax; TrapFrame.Ecx = Tss->Ecx; @@ -540,7 +621,7 @@ KiTrap06Handler(IN PKTRAP_FRAME TrapFrame) KIRQL OldIrql; /* Check for V86 GPF */ - if (__builtin_expect(KiIsV8086TrapSafe(TrapFrame), 1)) + if (__builtin_expect(KiV86Trap(TrapFrame), 1)) { /* Enter V86 trap */ KiEnterV86Trap(TrapFrame); @@ -574,10 +655,7 @@ KiTrap06Handler(IN PKTRAP_FRAME TrapFrame) _disable(); /* Do a quick V86 exit if possible */ - if (__builtin_expect(TrapFrame->EFlags & EFLAGS_V86_MASK, 1)) KiExitV86Trap(TrapFrame); - - /* Exit trap the slow way */ - KiEoiHelper(TrapFrame); + KiExitV86Trap(TrapFrame); } /* Save trap frame */ @@ -800,7 +878,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame) KIRQL OldIrql; /* Check for V86 GPF */ - if (__builtin_expect(KiIsV8086TrapSafe(TrapFrame), 1)) + if (__builtin_expect(KiV86Trap(TrapFrame), 1)) { /* Enter V86 trap */ KiEnterV86Trap(TrapFrame); @@ -834,10 +912,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame) _disable(); /* Do a quick V86 exit if possible */ - if (__builtin_expect(TrapFrame->EFlags & EFLAGS_V86_MASK, 1)) KiExitV86Trap(TrapFrame); - - /* Exit trap the slow way */ - KiEoiHelper(TrapFrame); + KiExitV86Trap(TrapFrame); } /* Save trap frame */ @@ -845,7 +920,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame) /* Check for user-mode GPF */ if (KiUserTrap(TrapFrame)) - { + { /* Should not be VDM */ ASSERT(KiVdmTrap(TrapFrame) == FALSE); @@ -901,7 +976,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame) (((Instructions[i + 2] & 0x38) == 0x10) || // LLDT (Instructions[i + 2] == 0x18))) || // LTR ((Instructions[i + 1] == 0x01) && // LGDT or LIDT or LMSW - (((Instructions[i + 2] & 0x38) == 0x10) || // LLGT + (((Instructions[i + 2] & 0x38) == 0x10) || // LGDT (Instructions[i + 2] == 0x18) || // LIDT (Instructions[i + 2] == 0x30))) || // LMSW (Instructions[i + 1] == 0x08) || // INVD @@ -913,6 +988,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame) (Instructions[i + 1] == 0x24) || // MOV YYY, DR (Instructions[i + 1] == 0x30) || // WRMSR (Instructions[i + 1] == 0x33)) // RDPMC + // INVLPG, INVLPGA, SYSRET { /* These are all privileged */ Privileged = TRUE; @@ -985,7 +1061,7 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame) * a POP , which could cause an invalid segment if someone had messed * with the segment values. * - * Another case is a bogus SS, which would hit a GPF when doing the ired. + * Another case is a bogus SS, which would hit a GPF when doing the iret. * This could only be done through a buggy or malicious driver, or perhaps * the kernel debugger. * @@ -1059,9 +1135,14 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame) /* Fix it */ TrapFrame->SegEs = (KGDT_R3_DATA | RPL_MASK); } - - /* Do a direct trap exit: restore volatiles only */ - KiExitTrap(TrapFrame, KTE_SKIP_PM_BIT | KTE_SKIP_SEG_BIT); + else + { + /* Whatever it is, we can't handle it */ + KiSystemFatalException(EXCEPTION_GP_FAULT, TrapFrame); + } + + /* Return to where we came from */ + KiTrapReturn(TrapFrame); } VOID @@ -1369,55 +1450,89 @@ KiDebugServiceHandler(IN PKTRAP_FRAME TrapFrame) } VOID -FASTCALL +FORCEINLINE DECLSPEC_NORETURN -KiSystemCall(IN ULONG SystemCallNumber, +KiSystemCall(IN PKTRAP_FRAME TrapFrame, IN PVOID Arguments) { PKTHREAD Thread; - PKTRAP_FRAME TrapFrame; PKSERVICE_TABLE_DESCRIPTOR DescriptorTable; ULONG Id, Offset, StackBytes, Result; PVOID Handler; + ULONG SystemCallNumber = TrapFrame->Eax; - /* Loop because we might need to try this twice in case of a GUI call */ - while (TRUE) + /* Get the current thread */ + Thread = KeGetCurrentThread(); + + /* Set debug header */ + KiFillTrapFrameDebug(TrapFrame); + + /* Chain trap frames */ + TrapFrame->Edx = (ULONG_PTR)Thread->TrapFrame; + + /* No error code */ + TrapFrame->ErrCode = 0; + + /* Save previous mode */ + TrapFrame->PreviousPreviousMode = Thread->PreviousMode; + + /* Save the SEH chain and terminate it for now */ + TrapFrame->ExceptionList = KeGetPcr()->NtTib.ExceptionList; + KeGetPcr()->NtTib.ExceptionList = EXCEPTION_CHAIN_END; + + /* Clear DR7 and check for debugging */ + TrapFrame->Dr7 = 0; + if (__builtin_expect(Thread->DispatcherHeader.DebugActive & 0xFF, 0)) { - /* Decode the system call number */ - Offset = (SystemCallNumber >> SERVICE_TABLE_SHIFT) & SERVICE_TABLE_MASK; - Id = SystemCallNumber & SERVICE_NUMBER_MASK; + UNIMPLEMENTED; + while (TRUE); + } + + /* Set thread fields */ + Thread->TrapFrame = TrapFrame; + Thread->PreviousMode = KiUserTrap(TrapFrame); + + /* Enable interrupts */ + _enable(); + + /* Decode the system call number */ + Offset = (SystemCallNumber >> SERVICE_TABLE_SHIFT) & SERVICE_TABLE_MASK; + Id = SystemCallNumber & SERVICE_NUMBER_MASK; - /* Get current thread, trap frame, and descriptor table */ - Thread = KeGetCurrentThread(); - TrapFrame = Thread->TrapFrame; - DescriptorTable = (PVOID)((ULONG_PTR)Thread->ServiceTable + Offset); + /* Get descriptor table */ + DescriptorTable = (PVOID)((ULONG_PTR)Thread->ServiceTable + Offset); - /* Validate the system call number */ - if (__builtin_expect(Id > DescriptorTable->Limit, 0)) + /* Validate the system call number */ + if (__builtin_expect(Id >= DescriptorTable->Limit, 0)) + { + /* Check if this is a GUI call */ + if (!(Offset & SERVICE_TABLE_TEST)) { - /* Check if this is a GUI call */ - if (__builtin_expect(!(Offset & SERVICE_TABLE_TEST), 0)) - { - /* Fail the call */ - Result = STATUS_INVALID_SYSTEM_SERVICE; - goto ExitCall; - } - - /* Convert us to a GUI thread -- must wrap in ASM to get new EBP */ - Result = KiConvertToGuiThread(); - if (__builtin_expect(!NT_SUCCESS(Result), 0)) - { - /* Figure out how we should fail to the user */ - UNIMPLEMENTED; - while (TRUE); - } - - /* Try the call again */ - continue; + /* Fail the call */ + Result = STATUS_INVALID_SYSTEM_SERVICE; + goto ExitCall; } + + /* Convert us to a GUI thread -- must wrap in ASM to get new EBP */ + Result = KiConvertToGuiThread(); + if (!NT_SUCCESS(Result)) + { + /* Set the last error and fail */ + //SetLastWin32Error(RtlNtStatusToDosError(Result)); + goto ExitCall; + } + + /* Reload trap frame and descriptor table pointer from new stack */ + TrapFrame = *(volatile PVOID*)&Thread->TrapFrame; + DescriptorTable = (PVOID)(*(volatile ULONG_PTR*)&Thread->ServiceTable + Offset); - /* If we made it here, the call is good */ - break; + /* Validate the system call number again */ + if (Id >= DescriptorTable->Limit) + { + /* Fail the call */ + Result = STATUS_INVALID_SYSTEM_SERVICE; + goto ExitCall; + } } /* Check if this is a GUI call */ @@ -1460,145 +1575,37 @@ ExitCall: } VOID -FORCEINLINE +FASTCALL DECLSPEC_NORETURN -KiSystemCallHandler(IN PKTRAP_FRAME TrapFrame, - IN ULONG ServiceNumber, - IN PVOID Arguments, - IN PKTHREAD Thread, - IN KPROCESSOR_MODE PreviousMode, - IN KPROCESSOR_MODE PreviousPreviousMode, - IN USHORT SegFs) +KiSystemServiceHandler(IN PKTRAP_FRAME TrapFrame, + IN PVOID Arguments) { - /* No error code */ - TrapFrame->ErrCode = 0; - - /* Save previous mode and FS segment */ - TrapFrame->PreviousPreviousMode = PreviousPreviousMode; - TrapFrame->SegFs = SegFs; - - /* Save the SEH chain and terminate it for now */ - TrapFrame->ExceptionList = KeGetPcr()->Tib.ExceptionList; - KeGetPcr()->Tib.ExceptionList = EXCEPTION_CHAIN_END; - - /* Clear DR7 and check for debugging */ - TrapFrame->Dr7 = 0; - if (__builtin_expect(Thread->DispatcherHeader.DebugActive & 0xFF, 0)) - { - UNIMPLEMENTED; - while (TRUE); - } - - /* Set thread fields */ - Thread->TrapFrame = TrapFrame; - Thread->PreviousMode = PreviousMode; - - /* Set debug header */ - KiFillTrapFrameDebug(TrapFrame); - - /* Enable interrupts and make the call */ - _enable(); - KiSystemCall(ServiceNumber, Arguments); + /* Call the shared handler (inline) */ + KiSystemCall(TrapFrame, Arguments); } VOID -__attribute__((regparm(3))) +FASTCALL DECLSPEC_NORETURN -KiFastCallEntryHandler(IN ULONG ServiceNumber, - IN PVOID Arguments, - IN PKTRAP_FRAME TrapFrame) +KiFastCallEntryHandler(IN PKTRAP_FRAME TrapFrame, + IN PVOID Arguments) { - PKTHREAD Thread; - - /* Fixup segments */ - Ke386SetFs(KGDT_R0_PCR); - Ke386SetDs(KGDT_R3_DATA | RPL_MASK); - Ke386SetEs(KGDT_R3_DATA | RPL_MASK); - /* Set up a fake INT Stack and enable interrupts */ TrapFrame->HardwareSegSs = KGDT_R3_DATA | RPL_MASK; TrapFrame->HardwareEsp = (ULONG_PTR)Arguments; TrapFrame->EFlags = __readeflags() | EFLAGS_INTERRUPT_MASK; TrapFrame->SegCs = KGDT_R3_CODE | RPL_MASK; TrapFrame->Eip = SharedUserData->SystemCallReturn; + TrapFrame->SegFs = KGDT_R3_TEB | RPL_MASK; __writeeflags(0x2); - /* Get the current thread */ - Thread = KeGetCurrentThread(); - /* Arguments are actually 2 frames down (because of the double indirection) */ Arguments = (PVOID)(TrapFrame->HardwareEsp + 8); /* Call the shared handler (inline) */ - KiSystemCallHandler(TrapFrame, - ServiceNumber, - Arguments, - Thread, - UserMode, - Thread->PreviousMode, - KGDT_R3_TEB | RPL_MASK); + KiSystemCall(TrapFrame, Arguments); } -VOID -__attribute__((regparm(3))) -DECLSPEC_NORETURN -KiSystemServiceHandler(IN ULONG ServiceNumber, - IN PVOID Arguments, - IN PKTRAP_FRAME TrapFrame) -{ - USHORT SegFs; - PKTHREAD Thread; - - /* Save and fixup FS */ - SegFs = Ke386GetFs(); - Ke386SetFs(KGDT_R0_PCR); - - /* Get the current thread */ - Thread = KeGetCurrentThread(); - - /* Chain trap frames */ - TrapFrame->Edx = (ULONG_PTR)Thread->TrapFrame; - - /* Clear direction flag */ - Ke386ClearDirectionFlag(); - - /* Call the shared handler (inline) */ - KiSystemCallHandler(TrapFrame, - ServiceNumber, - Arguments, - Thread, - KiUserTrap(TrapFrame), - Thread->PreviousMode, - SegFs); -} - -/* CPU AND SOFTWARE TRAPS *****************************************************/ - -KiTrap(KiTrap00, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap01, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap03, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap04, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap05, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap06, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap07, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap08, 0); -KiTrap(KiTrap09, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap0A, 0); -KiTrap(KiTrap0B, 0); -KiTrap(KiTrap0C, 0); -KiTrap(KiTrap0D, 0); -KiTrap(KiTrap0E, 0); -KiTrap(KiTrap0F, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap10, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap11, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiTrap13, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiGetTickCount, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiCallbackReturn, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiRaiseAssertion, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiDebugService, KI_PUSH_FAKE_ERROR_CODE); -KiTrap(KiSystemService, KI_PUSH_FAKE_ERROR_CODE | KI_NONVOLATILES_ONLY); -KiTrap(KiFastCallEntry, KI_FAST_SYSTEM_CALL); - /* * @implemented */ diff --git a/reactos/ntoskrnl/ke/i386/usercall_asm.S b/reactos/ntoskrnl/ke/i386/usercall_asm.S index 017a736d1e3..2da726882eb 100644 --- a/reactos/ntoskrnl/ke/i386/usercall_asm.S +++ b/reactos/ntoskrnl/ke/i386/usercall_asm.S @@ -8,12 +8,15 @@ /* INCLUDES ******************************************************************/ -#include +#include +#include #include -.intel_syntax noprefix /* FUNCTIONS ****************************************************************/ +.code32 +.text + .globl _KiGetUserModeStackAddress@0 .func KiGetUserModeStackAddress@0 _KiGetUserModeStackAddress@0: diff --git a/reactos/ntoskrnl/ke/i386/v86vdm.c b/reactos/ntoskrnl/ke/i386/v86vdm.c index 1771e5874ad..2d1ff017f14 100644 --- a/reactos/ntoskrnl/ke/i386/v86vdm.c +++ b/reactos/ntoskrnl/ke/i386/v86vdm.c @@ -471,7 +471,7 @@ KiExitV86Mode(IN PKTRAP_FRAME TrapFrame) /* Restore TEB addresses */ Thread->Teb = V86Frame->ThreadTeb; - KeGetPcr()->Tib.Self = V86Frame->PcrTeb; + KeGetPcr()->NtTib.Self = V86Frame->PcrTeb; /* Setup real TEB descriptor */ GdtEntry = &((PKIPCR)KeGetPcr())->GDT[KGDT_R3_TEB / sizeof(KGDTENTRY)]; @@ -505,7 +505,7 @@ KiEnterV86Mode(IN PKV8086_STACK_FRAME StackFrame) /* Save TEB addresses */ V86Frame->ThreadTeb = Thread->Teb; - V86Frame->PcrTeb = KeGetPcr()->Tib.Self; + V86Frame->PcrTeb = KeGetPcr()->NtTib.Self; /* Save return EIP */ TrapFrame->Eip = (ULONG_PTR)Ki386BiosCallReturnAddress; @@ -533,7 +533,7 @@ KiEnterV86Mode(IN PKV8086_STACK_FRAME StackFrame) RtlCopyMemory(NpxFrame, V86Frame->ThreadStack, sizeof(FX_SAVE_AREA)); /* Clear exception list */ - KeGetPcr()->Tib.ExceptionList = EXCEPTION_CHAIN_END; + KeGetPcr()->NtTib.ExceptionList = EXCEPTION_CHAIN_END; /* Set new ESP0 */ KeGetPcr()->TSS->Esp0 = (ULONG_PTR)&TrapFrame->V86Es; @@ -543,7 +543,7 @@ KiEnterV86Mode(IN PKV8086_STACK_FRAME StackFrame) /* Set VDM TEB */ Thread->Teb = (PTEB)TRAMPOLINE_TEB; - KeGetPcr()->Tib.Self = (PVOID)TRAMPOLINE_TEB; + KeGetPcr()->NtTib.Self = (PVOID)TRAMPOLINE_TEB; /* Setup VDM TEB descriptor */ GdtEntry = &((PKIPCR)KeGetPcr())->GDT[KGDT_R3_TEB / sizeof(KGDTENTRY)]; diff --git a/reactos/ntoskrnl/ke/wait.c b/reactos/ntoskrnl/ke/wait.c index 74c960cf019..a4737b0b7fa 100644 --- a/reactos/ntoskrnl/ke/wait.c +++ b/reactos/ntoskrnl/ke/wait.c @@ -110,7 +110,7 @@ KiAcquireFastMutex(IN PFAST_MUTEX FastMutex) FastMutex->Contention++; /* Wait for the event */ - KeWaitForSingleObject(&FastMutex->Gate, + KeWaitForSingleObject(&FastMutex->Event, WrMutex, KernelMode, FALSE, diff --git a/reactos/ntoskrnl/mm/ARM3/hypermap.c b/reactos/ntoskrnl/mm/ARM3/hypermap.c index 79d16067363..5b06dc5f815 100644 --- a/reactos/ntoskrnl/mm/ARM3/hypermap.c +++ b/reactos/ntoskrnl/mm/ARM3/hypermap.c @@ -45,7 +45,7 @@ MiMapPageInHyperSpace(IN PEPROCESS Process, // // Build the PTE // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; TempPte.u.Hard.PageFrameNumber = Page; MI_MAKE_LOCAL_PAGE(&TempPte); // Hyperspace is local! @@ -156,7 +156,7 @@ MiMapPagesToZeroInHyperSpace(IN PFN_NUMBER *Pages, // Write the current PTE // PointerPte += (Offset + 1); - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; MI_MAKE_LOCAL_PAGE(&TempPte); // Hyperspace is local! do { diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index b446b09c649..250324ca65f 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -12,1540 +12,575 @@ #define NDEBUG #include -#line 15 "ARM³::INIT" +#line 15 "ARM³::INIT:X86" #define MODULE_INVOLVED_IN_ARM3 #include "../../ARM3/miarm.h" /* GLOBALS ********************************************************************/ -// -// These are all registry-configurable, but by default, the memory manager will -// figure out the most appropriate values. -// -ULONG MmMaximumNonPagedPoolPercent; -ULONG MmSizeOfNonPagedPoolInBytes; -ULONG MmMaximumNonPagedPoolInBytes; - -// -// These numbers describe the discrete equation components of the nonpaged -// pool sizing algorithm. -// -// They are described on http://support.microsoft.com/default.aspx/kb/126402/ja -// along with the algorithm that uses them, which is implemented later below. -// -ULONG MmMinimumNonPagedPoolSize = 256 * 1024; -ULONG MmMinAdditionNonPagedPoolPerMb = 32 * 1024; -ULONG MmDefaultMaximumNonPagedPool = 1024 * 1024; -ULONG MmMaxAdditionNonPagedPoolPerMb = 400 * 1024; - -// -// The memory layout (and especially variable names) of the NT kernel mode -// components can be a bit hard to twig, especially when it comes to the non -// paged area. -// -// There are really two components to the non-paged pool: -// -// - The initial nonpaged pool, sized dynamically up to a maximum. -// - The expansion nonpaged pool, sized dynamically up to a maximum. -// -// The initial nonpaged pool is physically continuous for performance, and -// immediately follows the PFN database, typically sharing the same PDE. It is -// a very small resource (32MB on a 1GB system), and capped at 128MB. -// -// Right now we call this the "ARM³ Nonpaged Pool" and it begins somewhere after -// the PFN database (which starts at 0xB0000000). -// -// The expansion nonpaged pool, on the other hand, can grow much bigger (400MB -// for a 1GB system). On ARM³ however, it is currently capped at 128MB. -// -// The address where the initial nonpaged pool starts is aptly named -// MmNonPagedPoolStart, and it describes a range of MmSizeOfNonPagedPoolInBytes -// bytes. -// -// Expansion nonpaged pool starts at an address described by the variable called -// MmNonPagedPoolExpansionStart, and it goes on for MmMaximumNonPagedPoolInBytes -// minus MmSizeOfNonPagedPoolInBytes bytes, always reaching MmNonPagedPoolEnd -// (because of the way it's calculated) at 0xFFBE0000. -// -// Initial nonpaged pool is allocated and mapped early-on during boot, but what -// about the expansion nonpaged pool? It is instead composed of special pages -// which belong to what are called System PTEs. These PTEs are the matter of a -// later discussion, but they are also considered part of the "nonpaged" OS, due -// to the fact that they are never paged out -- once an address is described by -// a System PTE, it is always valid, until the System PTE is torn down. -// -// System PTEs are actually composed of two "spaces", the system space proper, -// and the nonpaged pool expansion space. The latter, as we've already seen, -// begins at MmNonPagedPoolExpansionStart. Based on the number of System PTEs -// that the system will support, the remaining address space below this address -// is used to hold the system space PTEs. This address, in turn, is held in the -// variable named MmNonPagedSystemStart, which itself is never allowed to go -// below 0xEB000000 (thus creating an upper bound on the number of System PTEs). -// -// This means that 330MB are reserved for total nonpaged system VA, on top of -// whatever the initial nonpaged pool allocation is. -// -// The following URLs, valid as of April 23rd, 2008, support this evidence: -// -// http://www.cs.miami.edu/~burt/journal/NT/memory.html -// http://www.ditii.com/2007/09/28/windows-memory-management-x86-virtual-address-space/ -// -PVOID MmNonPagedSystemStart; -PVOID MmNonPagedPoolStart; -PVOID MmNonPagedPoolExpansionStart; -PVOID MmNonPagedPoolEnd = MI_NONPAGED_POOL_END; - -// -// This is where paged pool starts by default -// -PVOID MmPagedPoolStart = MI_PAGED_POOL_START; -PVOID MmPagedPoolEnd; - -// -// And this is its default size -// -ULONG MmSizeOfPagedPoolInBytes = MI_MIN_INIT_PAGED_POOLSIZE; -PFN_NUMBER MmSizeOfPagedPoolInPages = MI_MIN_INIT_PAGED_POOLSIZE / PAGE_SIZE; - -// -// Session space starts at 0xBFFFFFFF and grows downwards -// By default, it includes an 8MB image area where we map win32k and video card -// drivers, followed by a 4MB area containing the session's working set. This is -// then followed by a 20MB mapped view area and finally by the session's paged -// pool, by default 16MB. -// -// On a normal system, this results in session space occupying the region from -// 0xBD000000 to 0xC0000000 -// -// See miarm.h for the defines that determine the sizing of this region. On an -// NT system, some of these can be configured through the registry, but we don't -// support that yet. -// -PVOID MiSessionSpaceEnd; // 0xC0000000 -PVOID MiSessionImageEnd; // 0xC0000000 -PVOID MiSessionImageStart; // 0xBF800000 -PVOID MiSessionViewStart; // 0xBE000000 -PVOID MiSessionPoolEnd; // 0xBE000000 -PVOID MiSessionPoolStart; // 0xBD000000 -PVOID MmSessionBase; // 0xBD000000 -ULONG MmSessionSize; -ULONG MmSessionViewSize; -ULONG MmSessionPoolSize; -ULONG MmSessionImageSize; - -// -// The system view space, on the other hand, is where sections that are memory -// mapped into "system space" end up. -// -// By default, it is a 16MB region. -// -PVOID MiSystemViewStart; -ULONG MmSystemViewSize; - -// -// A copy of the system page directory (the page directory associated with the -// System process) is kept (double-mapped) by the manager in order to lazily -// map paged pool PDEs into external processes when they fault on a paged pool -// address. -// -PFN_NUMBER MmSystemPageDirectory; -PMMPTE MmSystemPagePtes; - -// -// The system cache starts right after hyperspace. The first few pages are for -// keeping track of the system working set list. -// -// This should be 0xC0C00000 -- the cache itself starts at 0xC1000000 -// -PMMWSL MmSystemCacheWorkingSetList = MI_SYSTEM_CACHE_WS_START; - -// -// Windows NT seems to choose between 7000, 11000 and 50000 -// On systems with more than 32MB, this number is then doubled, and further -// aligned up to a PDE boundary (4MB). -// -ULONG MmNumberOfSystemPtes; - -// -// This is how many pages the PFN database will take up -// In Windows, this includes the Quark Color Table, but not in ARM³ -// -ULONG MxPfnAllocation; - -// -// Unlike the old ReactOS Memory Manager, ARM³ (and Windows) does not keep track -// of pages that are not actually valid physical memory, such as ACPI reserved -// regions, BIOS address ranges, or holes in physical memory address space which -// could indicate device-mapped I/O memory. -// -// In fact, the lack of a PFN entry for a page usually indicates that this is -// I/O space instead. -// -// A bitmap, called the PFN bitmap, keeps track of all page frames by assigning -// a bit to each. If the bit is set, then the page is valid physical RAM. -// -RTL_BITMAP MiPfnBitMap; - -// -// This structure describes the different pieces of RAM-backed address space -// -PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock; - -// -// Before we have a PFN database, memory comes straight from our physical memory -// blocks, which is nice because it's guaranteed contiguous and also because once -// we take a page from here, the system doesn't see it anymore. -// However, once the fun is over, those pages must be re-integrated back into -// PFN society life, and that requires us keeping a copy of the original layout -// so that we can parse it later. -// -PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor; -MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor; - -// -// This is where we keep track of the most basic physical layout markers -// -ULONG MmNumberOfPhysicalPages, MmHighestPhysicalPage, MmLowestPhysicalPage = -1; - -// -// The total number of pages mapped by the boot loader, which include the kernel -// HAL, boot drivers, registry, NLS files and other loader data structures is -// kept track of here. This depends on "LoaderPagesSpanned" being correct when -// coming from the loader. -// -// This number is later aligned up to a PDE boundary. -// -ULONG MmBootImageSize; - -// -// These three variables keep track of the core separation of address space that -// exists between kernel mode and user mode. -// -ULONG MmUserProbeAddress; -PVOID MmHighestUserAddress; -PVOID MmSystemRangeStart; - - - -PVOID MmSystemCacheStart; -PVOID MmSystemCacheEnd; -MMSUPPORT MmSystemCacheWs; - -// -// This is where hyperspace ends (followed by the system cache working set) -// -PVOID MmHyperSpaceEnd; - -// -// Page coloring algorithm data -// -ULONG MmSecondaryColors; -ULONG MmSecondaryColorMask; - -// -// Actual (registry-configurable) size of a GUI thread's stack -// -ULONG MmLargeStackSize; +/* Template PTE and PDE for a kernel page */ +MMPTE ValidKernelPde = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1}; +MMPTE ValidKernelPte = {.u.Hard.Valid = 1, .u.Hard.Write = 1, .u.Hard.Dirty = 1, .u.Hard.Accessed = 1}; /* PRIVATE FUNCTIONS **********************************************************/ -// -// In Bavaria, this is probably a hate crime -// -VOID -FASTCALL -MiSyncARM3WithROS(IN PVOID AddressStart, - IN PVOID AddressEnd) -{ - // - // Puerile piece of junk-grade carbonized horseshit puss sold to the lowest bidder - // - ULONG Pde = ADDR_TO_PDE_OFFSET(AddressStart); - while (Pde <= ADDR_TO_PDE_OFFSET(AddressEnd)) - { - // - // This both odious and heinous - // - extern ULONG MmGlobalKernelPageDirectory[1024]; - MmGlobalKernelPageDirectory[Pde] = ((PULONG)PDE_BASE)[Pde]; - Pde++; - } -} - -PFN_NUMBER -NTAPI -MxGetNextPage(IN PFN_NUMBER PageCount) -{ - PFN_NUMBER Pfn; - - // - // Make sure we have enough pages - // - if (PageCount > MxFreeDescriptor->PageCount) - { - // - // Crash the system - // - KeBugCheckEx(INSTALL_MORE_MEMORY, - MmNumberOfPhysicalPages, - MxFreeDescriptor->PageCount, - MxOldFreeDescriptor.PageCount, - PageCount); - } - - // - // Use our lowest usable free pages - // - Pfn = MxFreeDescriptor->BasePage; - MxFreeDescriptor->BasePage += PageCount; - MxFreeDescriptor->PageCount -= PageCount; - return Pfn; -} - -PFN_NUMBER -NTAPI -MiPagesInLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock, - IN PBOOLEAN IncludeType) -{ - PLIST_ENTRY NextEntry; - PFN_NUMBER PageCount = 0; - PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; - - // - // Now loop through the descriptors - // - NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; - while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) - { - // - // Grab each one, and check if it's one we should include - // - MdBlock = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); - if ((MdBlock->MemoryType < LoaderMaximum) && - (IncludeType[MdBlock->MemoryType])) - { - // - // Add this to our running total - // - PageCount += MdBlock->PageCount; - } - - // - // Try the next descriptor - // - NextEntry = MdBlock->ListEntry.Flink; - } - - // - // Return the total - // - return PageCount; -} - -PPHYSICAL_MEMORY_DESCRIPTOR -NTAPI -MmInitializeMemoryLimits(IN PLOADER_PARAMETER_BLOCK LoaderBlock, - IN PBOOLEAN IncludeType) -{ - PLIST_ENTRY NextEntry; - ULONG Run = 0, InitialRuns = 0; - PFN_NUMBER NextPage = -1, PageCount = 0; - PPHYSICAL_MEMORY_DESCRIPTOR Buffer, NewBuffer; - PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; - - // - // Scan the memory descriptors - // - NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; - while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) - { - // - // For each one, increase the memory allocation estimate - // - InitialRuns++; - NextEntry = NextEntry->Flink; - } - - // - // Allocate the maximum we'll ever need - // - Buffer = ExAllocatePoolWithTag(NonPagedPool, - sizeof(PHYSICAL_MEMORY_DESCRIPTOR) + - sizeof(PHYSICAL_MEMORY_RUN) * - (InitialRuns - 1), - 'lMmM'); - if (!Buffer) return NULL; - - // - // For now that's how many runs we have - // - Buffer->NumberOfRuns = InitialRuns; - - // - // Now loop through the descriptors again - // - NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; - while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) - { - // - // Grab each one, and check if it's one we should include - // - MdBlock = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); - if ((MdBlock->MemoryType < LoaderMaximum) && - (IncludeType[MdBlock->MemoryType])) - { - // - // Add this to our running total - // - PageCount += MdBlock->PageCount; - - // - // Check if the next page is described by the next descriptor - // - if (MdBlock->BasePage == NextPage) - { - // - // Combine it into the same physical run - // - ASSERT(MdBlock->PageCount != 0); - Buffer->Run[Run - 1].PageCount += MdBlock->PageCount; - NextPage += MdBlock->PageCount; - } - else - { - // - // Otherwise just duplicate the descriptor's contents - // - Buffer->Run[Run].BasePage = MdBlock->BasePage; - Buffer->Run[Run].PageCount = MdBlock->PageCount; - NextPage = Buffer->Run[Run].BasePage + Buffer->Run[Run].PageCount; - - // - // And in this case, increase the number of runs - // - Run++; - } - } - - // - // Try the next descriptor - // - NextEntry = MdBlock->ListEntry.Flink; - } - - // - // We should not have been able to go past our initial estimate - // - ASSERT(Run <= Buffer->NumberOfRuns); - - // - // Our guess was probably exaggerated... - // - if (InitialRuns > Run) - { - // - // Allocate a more accurately sized buffer - // - NewBuffer = ExAllocatePoolWithTag(NonPagedPool, - sizeof(PHYSICAL_MEMORY_DESCRIPTOR) + - sizeof(PHYSICAL_MEMORY_RUN) * - (Run - 1), - 'lMmM'); - if (NewBuffer) - { - // - // Copy the old buffer into the new, then free it - // - RtlCopyMemory(NewBuffer->Run, - Buffer->Run, - sizeof(PHYSICAL_MEMORY_RUN) * Run); - ExFreePool(Buffer); - - // - // Now use the new buffer - // - Buffer = NewBuffer; - } - } - - // - // Write the final numbers, and return it - // - Buffer->NumberOfRuns = Run; - Buffer->NumberOfPages = PageCount; - return Buffer; -} - VOID NTAPI -MiBuildPagedPool(VOID) +MiComputeNonPagedPoolVa(IN ULONG FreePages) { - PMMPTE PointerPte, PointerPde; - MMPTE TempPte = HyperTemplatePte; - PFN_NUMBER PageFrameIndex; - KIRQL OldIrql; - ULONG Size, BitMapSize; + IN PFN_NUMBER PoolPages; - // - // Get the page frame number for the system page directory - // - PointerPte = MiAddressToPte(PDE_BASE); - MmSystemPageDirectory = PFN_FROM_PTE(PointerPte); - - // - // Allocate a system PTE which will hold a copy of the page directory - // - PointerPte = MiReserveSystemPtes(1, SystemPteSpace); - ASSERT(PointerPte); - MmSystemPagePtes = MiPteToAddress(PointerPte); - - // - // Make this system PTE point to the system page directory. - // It is now essentially double-mapped. This will be used later for lazy - // evaluation of PDEs accross process switches, similarly to how the Global - // page directory array in the old ReactOS Mm is used (but in a less hacky - // way). - // - TempPte = HyperTemplatePte; - TempPte.u.Hard.PageFrameNumber = MmSystemPageDirectory; - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte = TempPte; - - // - // Let's get back to paged pool work: size it up. - // By default, it should be twice as big as nonpaged pool. - // - MmSizeOfPagedPoolInBytes = 2 * MmMaximumNonPagedPoolInBytes; - if (MmSizeOfPagedPoolInBytes > ((ULONG_PTR)MmNonPagedSystemStart - - (ULONG_PTR)MmPagedPoolStart)) + /* Check if this is a machine with less than 256MB of RAM, and no overide */ + if ((MmNumberOfPhysicalPages <= MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING) && + !(MmSizeOfNonPagedPoolInBytes)) { - // - // On the other hand, we have limited VA space, so make sure that the VA - // for paged pool doesn't overflow into nonpaged pool VA. Otherwise, set - // whatever maximum is possible. - // - MmSizeOfPagedPoolInBytes = (ULONG_PTR)MmNonPagedSystemStart - - (ULONG_PTR)MmPagedPoolStart; + /* Force the non paged pool to be 2MB so we can reduce RAM usage */ + MmSizeOfNonPagedPoolInBytes = 2 * _1MB; + } + + /* Hyperspace ends here */ + MmHyperSpaceEnd = (PVOID)((ULONG_PTR)MmSystemCacheWorkingSetList - 1); + + /* Check if the user gave a ridicuously large nonpaged pool RAM size */ + if ((MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT) > (FreePages * 7 / 8)) + { + /* More than 7/8ths of RAM was dedicated to nonpaged pool, ignore! */ + MmSizeOfNonPagedPoolInBytes = 0; + } + + /* Check if no registry setting was set, or if the setting was too low */ + if (MmSizeOfNonPagedPoolInBytes < MmMinimumNonPagedPoolSize) + { + /* Start with the minimum (256 KB) and add 32 KB for each MB above 4 */ + MmSizeOfNonPagedPoolInBytes = MmMinimumNonPagedPoolSize; + MmSizeOfNonPagedPoolInBytes += (FreePages - 1024) / 256 * MmMinAdditionNonPagedPoolPerMb; + } + + /* Check if the registy setting or our dynamic calculation was too high */ + if (MmSizeOfNonPagedPoolInBytes > MI_MAX_INIT_NONPAGED_POOL_SIZE) + { + /* Set it to the maximum */ + MmSizeOfNonPagedPoolInBytes = MI_MAX_INIT_NONPAGED_POOL_SIZE; + } + + /* Check if a percentage cap was set through the registry */ + if (MmMaximumNonPagedPoolPercent) UNIMPLEMENTED; + + /* Page-align the nonpaged pool size */ + MmSizeOfNonPagedPoolInBytes &= ~(PAGE_SIZE - 1); + + /* Now, check if there was a registry size for the maximum size */ + if (!MmMaximumNonPagedPoolInBytes) + { + /* Start with the default (1MB) */ + MmMaximumNonPagedPoolInBytes = MmDefaultMaximumNonPagedPool; + + /* Add space for PFN database */ + MmMaximumNonPagedPoolInBytes += (ULONG) + PAGE_ALIGN((MmHighestPhysicalPage + 1) * sizeof(MMPFN)); + + /* Check if the machine has more than 512MB of free RAM */ + if (FreePages >= 0x1F000) + { + /* Add 200KB for each MB above 4 */ + MmMaximumNonPagedPoolInBytes += (FreePages - 1024) / 256 * + (MmMaxAdditionNonPagedPoolPerMb / 2); + if (MmMaximumNonPagedPoolInBytes < MI_MAX_NONPAGED_POOL_SIZE) + { + /* Make it at least 128MB since this machine has a lot of RAM */ + MmMaximumNonPagedPoolInBytes = MI_MAX_NONPAGED_POOL_SIZE; + } + } + else + { + /* Add 400KB for each MB above 4 */ + MmMaximumNonPagedPoolInBytes += (FreePages - 1024) / 256 * + MmMaxAdditionNonPagedPoolPerMb; + } + } + + /* Make sure there's at least 16 pages + the PFN available for expansion */ + PoolPages = MmSizeOfNonPagedPoolInBytes + (PAGE_SIZE * 16) + + ((ULONG)PAGE_ALIGN(MmHighestPhysicalPage + 1) * sizeof(MMPFN)); + if (MmMaximumNonPagedPoolInBytes < PoolPages) + { + /* The maximum should be at least high enough to cover all the above */ + MmMaximumNonPagedPoolInBytes = PoolPages; + } + + /* Systems with 2GB of kernel address space get double the size */ + PoolPages = MI_MAX_NONPAGED_POOL_SIZE * 2; + + /* On the other hand, make sure that PFN + nonpaged pool doesn't get too big */ + if (MmMaximumNonPagedPoolInBytes > PoolPages) + { + /* Trim it down to the maximum architectural limit (256MB) */ + MmMaximumNonPagedPoolInBytes = PoolPages; + } + + /* Check if this is a system with > 128MB of non paged pool */ + if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE) + { + /* Check if the initial size is less than the extra 128MB boost */ + if (MmSizeOfNonPagedPoolInBytes < (MmMaximumNonPagedPoolInBytes - + MI_MAX_NONPAGED_POOL_SIZE)) + { + /* FIXME: Should check if the initial pool can be expanded */ + + /* Assume no expansion possible, check ift he maximum is too large */ + if (MmMaximumNonPagedPoolInBytes > (MmSizeOfNonPagedPoolInBytes + + MI_MAX_NONPAGED_POOL_SIZE)) + { + /* Set it to the initial value plus the boost */ + MmMaximumNonPagedPoolInBytes = MmSizeOfNonPagedPoolInBytes + + MI_MAX_NONPAGED_POOL_SIZE; + } + } } - - // - // Get the size in pages and make sure paged pool is at least 32MB. - // - Size = MmSizeOfPagedPoolInBytes; - if (Size < MI_MIN_INIT_PAGED_POOLSIZE) Size = MI_MIN_INIT_PAGED_POOLSIZE; - Size = BYTES_TO_PAGES(Size); - - // - // Now check how many PTEs will be required for these many pages. - // - Size = (Size + (1024 - 1)) / 1024; - - // - // Recompute the page-aligned size of the paged pool, in bytes and pages. - // - MmSizeOfPagedPoolInBytes = Size * PAGE_SIZE * 1024; - MmSizeOfPagedPoolInPages = MmSizeOfPagedPoolInBytes >> PAGE_SHIFT; - - // - // Let's be really sure this doesn't overflow into nonpaged system VA - // - ASSERT((MmSizeOfPagedPoolInBytes + (ULONG_PTR)MmPagedPoolStart) <= - (ULONG_PTR)MmNonPagedSystemStart); - - // - // This is where paged pool ends - // - MmPagedPoolEnd = (PVOID)(((ULONG_PTR)MmPagedPoolStart + - MmSizeOfPagedPoolInBytes) - 1); - - // - // So now get the PDE for paged pool and zero it out - // - PointerPde = MiAddressToPde(MmPagedPoolStart); - RtlZeroMemory(PointerPde, - (1 + MiAddressToPde(MmPagedPoolEnd) - PointerPde) * sizeof(MMPTE)); - - // - // Next, get the first and last PTE - // - PointerPte = MiAddressToPte(MmPagedPoolStart); - MmPagedPoolInfo.FirstPteForPagedPool = PointerPte; - MmPagedPoolInfo.LastPteForPagedPool = MiAddressToPte(MmPagedPoolEnd); - - // - // Lock the PFN database - // - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - - // - // Allocate a page and map the first paged pool PDE - // - PageFrameIndex = MmAllocPage(MC_NPPOOL, 0); - TempPte.u.Hard.PageFrameNumber = PageFrameIndex; - ASSERT(PointerPde->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPde = TempPte; - - // - // Release the PFN database lock - // - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - - // - // We only have one PDE mapped for now... at fault time, additional PDEs - // will be allocated to handle paged pool growth. This is where they'll have - // to start. - // - MmPagedPoolInfo.NextPdeForPagedPoolExpansion = PointerPde + 1; - - // - // We keep track of each page via a bit, so check how big the bitmap will - // have to be (make sure to align our page count such that it fits nicely - // into a 4-byte aligned bitmap. - // - // We'll also allocate the bitmap header itself part of the same buffer. - // - Size = Size * 1024; - ASSERT(Size == MmSizeOfPagedPoolInPages); - BitMapSize = Size; - Size = sizeof(RTL_BITMAP) + (((Size + 31) / 32) * sizeof(ULONG)); - - // - // Allocate the allocation bitmap, which tells us which regions have not yet - // been mapped into memory - // - MmPagedPoolInfo.PagedPoolAllocationMap = ExAllocatePoolWithTag(NonPagedPool, - Size, - ' mM'); - ASSERT(MmPagedPoolInfo.PagedPoolAllocationMap); - - // - // Initialize it such that at first, only the first page's worth of PTEs is - // marked as allocated (incidentially, the first PDE we allocated earlier). - // - RtlInitializeBitMap(MmPagedPoolInfo.PagedPoolAllocationMap, - (PULONG)(MmPagedPoolInfo.PagedPoolAllocationMap + 1), - BitMapSize); - RtlSetAllBits(MmPagedPoolInfo.PagedPoolAllocationMap); - RtlClearBits(MmPagedPoolInfo.PagedPoolAllocationMap, 0, 1024); - - // - // We have a second bitmap, which keeps track of where allocations end. - // Given the allocation bitmap and a base address, we can therefore figure - // out which page is the last page of that allocation, and thus how big the - // entire allocation is. - // - MmPagedPoolInfo.EndOfPagedPoolBitmap = ExAllocatePoolWithTag(NonPagedPool, - Size, - ' mM'); - ASSERT(MmPagedPoolInfo.EndOfPagedPoolBitmap); - RtlInitializeBitMap(MmPagedPoolInfo.EndOfPagedPoolBitmap, - (PULONG)(MmPagedPoolInfo.EndOfPagedPoolBitmap + 1), - BitMapSize); - - // - // Since no allocations have been made yet, there are no bits set as the end - // - RtlClearAllBits(MmPagedPoolInfo.EndOfPagedPoolBitmap); - - // - // Initialize paged pool. - // - InitializePool(PagedPool, 0); - - // - // Initialize the paged pool mutex - // - KeInitializeGuardedMutex(&MmPagedPoolMutex); } NTSTATUS NTAPI -MmArmInitSystem(IN ULONG Phase, - IN PLOADER_PARAMETER_BLOCK LoaderBlock) +MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { PLIST_ENTRY NextEntry; PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; ULONG FreePages = 0; - PFN_NUMBER PageFrameIndex, PoolPages; + PFN_NUMBER PageFrameIndex; PMMPTE StartPde, EndPde, PointerPte, LastPte; - MMPTE TempPde = HyperTemplatePte, TempPte = HyperTemplatePte; + MMPTE TempPde, TempPte; PVOID NonPagedPoolExpansionVa; - ULONG OldCount, i, L2Associativity; - BOOLEAN IncludeType[LoaderMaximum]; - PVOID Bitmap; - PPHYSICAL_MEMORY_RUN Run; - PFN_NUMBER FreePage, FreePageCount, PagesLeft, BasePage, PageCount; + ULONG OldCount; + + /* Check for kernel stack size that's too big */ + if (MmLargeStackSize > (KERNEL_LARGE_STACK_SIZE / _1KB)) + { + /* Sanitize to default value */ + MmLargeStackSize = KERNEL_LARGE_STACK_SIZE; + } + else + { + /* Take the registry setting, and convert it into bytes */ + MmLargeStackSize *= _1KB; + + /* Now align it to a page boundary */ + MmLargeStackSize = PAGE_ROUND_UP(MmLargeStackSize); + + /* Sanity checks */ + ASSERT(MmLargeStackSize <= KERNEL_LARGE_STACK_SIZE); + ASSERT((MmLargeStackSize & (PAGE_SIZE - 1)) == 0); + + /* Make sure it's not too low */ + if (MmLargeStackSize < KERNEL_STACK_SIZE) MmLargeStackSize = KERNEL_STACK_SIZE; + } + + /* Check for global bit */ +#if 0 + if (KeFeatureBits & KF_GLOBAL_PAGE) + { + /* Set it on the template PTE and PDE */ + ValidKernelPte.u.Hard.Global = TRUE; + ValidKernelPde.u.Hard.Global = TRUE; + } +#endif + /* Now templates are ready */ + TempPte = ValidKernelPte; + TempPde = ValidKernelPde; + + // + // Set CR3 for the system process + // + PointerPte = MiAddressToPde(PTE_BASE); + PageFrameIndex = PFN_FROM_PTE(PointerPte) << PAGE_SHIFT; + PsGetCurrentProcess()->Pcb.DirectoryTableBase[0] = PageFrameIndex; // - // Instantiate memory that we don't consider RAM/usable - // We use the same exclusions that Windows does, in order to try to be - // compatible with WinLDR-style booting + // Blow away user-mode // - for (i = 0; i < LoaderMaximum; i++) IncludeType[i] = TRUE; - IncludeType[LoaderBad] = FALSE; - IncludeType[LoaderFirmwarePermanent] = FALSE; - IncludeType[LoaderSpecialMemory] = FALSE; - IncludeType[LoaderBBTMemory] = FALSE; - if (Phase == 0) + StartPde = MiAddressToPde(0); + EndPde = MiAddressToPde(KSEG0_BASE); + RtlZeroMemory(StartPde, (EndPde - StartPde) * sizeof(MMPTE)); + + // + // Loop the memory descriptors + // + NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) { // - // Define the basic user vs. kernel address space separation + // Get the memory block // - MmSystemRangeStart = (PVOID)KSEG0_BASE; - MmUserProbeAddress = (ULONG_PTR)MmSystemRangeStart - 0x10000; - MmHighestUserAddress = (PVOID)(MmUserProbeAddress - 1); + MdBlock = CONTAINING_RECORD(NextEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); // - // Get the size of the boot loader's image allocations and then round - // that region up to a PDE size, so that any PDEs we might create for - // whatever follows are separate from the PDEs that boot loader might've - // already created (and later, we can blow all that away if we want to). + // Skip invisible memory // - MmBootImageSize = KeLoaderBlock->Extension->LoaderPagesSpanned; - MmBootImageSize *= PAGE_SIZE; - MmBootImageSize = (MmBootImageSize + (4 * 1024 * 1024) - 1) & ~((4 * 1024 * 1024) - 1); - ASSERT((MmBootImageSize % (4 * 1024 * 1024)) == 0); - - // - // Set the size of session view, pool, and image - // - MmSessionSize = MI_SESSION_SIZE; - MmSessionViewSize = MI_SESSION_VIEW_SIZE; - MmSessionPoolSize = MI_SESSION_POOL_SIZE; - MmSessionImageSize = MI_SESSION_IMAGE_SIZE; - - // - // Set the size of system view - // - MmSystemViewSize = MI_SYSTEM_VIEW_SIZE; - - // - // This is where it all ends - // - MiSessionImageEnd = (PVOID)PTE_BASE; - - // - // This is where we will load Win32k.sys and the video driver - // - MiSessionImageStart = (PVOID)((ULONG_PTR)MiSessionImageEnd - - MmSessionImageSize); - - // - // So the view starts right below the session working set (itself below - // the image area) - // - MiSessionViewStart = (PVOID)((ULONG_PTR)MiSessionImageEnd - - MmSessionImageSize - - MI_SESSION_WORKING_SET_SIZE - - MmSessionViewSize); - - // - // Session pool follows - // - MiSessionPoolEnd = MiSessionViewStart; - MiSessionPoolStart = (PVOID)((ULONG_PTR)MiSessionPoolEnd - - MmSessionPoolSize); - - // - // And it all begins here - // - MmSessionBase = MiSessionPoolStart; - - // - // Sanity check that our math is correct - // - ASSERT((ULONG_PTR)MmSessionBase + MmSessionSize == PTE_BASE); - - // - // Session space ends wherever image session space ends - // - MiSessionSpaceEnd = MiSessionImageEnd; - - // - // System view space ends at session space, so now that we know where - // this is, we can compute the base address of system view space itself. - // - MiSystemViewStart = (PVOID)((ULONG_PTR)MmSessionBase - - MmSystemViewSize); - - // - // Count physical pages on the system - // - PageCount = MiPagesInLoaderBlock(LoaderBlock, IncludeType); - - // - // Check if this is a machine with less than 19MB of RAM - // - if (PageCount < MI_MIN_PAGES_FOR_SYSPTE_TUNING) + if ((MdBlock->MemoryType != LoaderFirmwarePermanent) && + (MdBlock->MemoryType != LoaderSpecialMemory) && + (MdBlock->MemoryType != LoaderHALCachedMemory) && + (MdBlock->MemoryType != LoaderBBTMemory)) { // - // Use the very minimum of system PTEs + // Check if BURNMEM was used // - MmNumberOfSystemPtes = 7000; - } - else - { - // - // Use the default, but check if we have more than 32MB of RAM - // - MmNumberOfSystemPtes = 11000; - if (PageCount > MI_MIN_PAGES_FOR_SYSPTE_BOOST) + if (MdBlock->MemoryType != LoaderBad) { // - // Double the amount of system PTEs + // Count this in the total of pages // - MmNumberOfSystemPtes <<= 1; + MmNumberOfPhysicalPages += MdBlock->PageCount; } - } - - DPRINT("System PTE count has been tuned to %d (%d bytes)\n", - MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE); - - // - // - // Start of Architecture Specific Initialization Code - // - // - - // - // The large kernel stack is cutomizable, but use default value for now - // - MmLargeStackSize = KERNEL_LARGE_STACK_SIZE; - - // - // Setup template - // - HyperTemplatePte.u.Long = 0; - HyperTemplatePte.u.Hard.Valid = 1; - HyperTemplatePte.u.Hard.Write = 1; - HyperTemplatePte.u.Hard.Dirty = 1; - HyperTemplatePte.u.Hard.Accessed = 1; - if (Ke386GlobalPagesEnabled) HyperTemplatePte.u.Hard.Global = 1; - - // - // Set CR3 for the system process - // - PointerPte = MiAddressToPde(PTE_BASE); - PageFrameIndex = PFN_FROM_PTE(PointerPte) << PAGE_SHIFT; - PsGetCurrentProcess()->Pcb.DirectoryTableBase[0] = PageFrameIndex; - - // - // Blow away user-mode - // - StartPde = MiAddressToPde(0); - EndPde = MiAddressToPde(KSEG0_BASE); - RtlZeroMemory(StartPde, (EndPde - StartPde) * sizeof(MMPTE)); - - // - // Loop the memory descriptors - // - NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; - while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) - { - // - // Get the memory block - // - MdBlock = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); // - // Skip invisible memory + // Check if this is the new lowest page // - if ((MdBlock->MemoryType != LoaderFirmwarePermanent) && - (MdBlock->MemoryType != LoaderSpecialMemory) && - (MdBlock->MemoryType != LoaderHALCachedMemory) && - (MdBlock->MemoryType != LoaderBBTMemory)) + if (MdBlock->BasePage < MmLowestPhysicalPage) { // - // Check if BURNMEM was used + // Update the lowest page // - if (MdBlock->MemoryType != LoaderBad) + MmLowestPhysicalPage = MdBlock->BasePage; + } + + // + // Check if this is the new highest page + // + PageFrameIndex = MdBlock->BasePage + MdBlock->PageCount; + if (PageFrameIndex > MmHighestPhysicalPage) + { + // + // Update the highest page + // + MmHighestPhysicalPage = PageFrameIndex - 1; + } + + // + // Check if this is free memory + // + if ((MdBlock->MemoryType == LoaderFree) || + (MdBlock->MemoryType == LoaderLoadedProgram) || + (MdBlock->MemoryType == LoaderFirmwareTemporary) || + (MdBlock->MemoryType == LoaderOsloaderStack)) + { + // + // Check if this is the largest memory descriptor + // + if (MdBlock->PageCount > FreePages) { // - // Count this in the total of pages + // For now, it is // - MmNumberOfPhysicalPages += MdBlock->PageCount; + MxFreeDescriptor = MdBlock; } // - // Check if this is the new lowest page + // More free pages // - if (MdBlock->BasePage < MmLowestPhysicalPage) - { - // - // Update the lowest page - // - MmLowestPhysicalPage = MdBlock->BasePage; - } - - // - // Check if this is the new highest page - // - PageFrameIndex = MdBlock->BasePage + MdBlock->PageCount; - if (PageFrameIndex > MmHighestPhysicalPage) - { - // - // Update the highest page - // - MmHighestPhysicalPage = PageFrameIndex - 1; - } - - // - // Check if this is free memory - // - if ((MdBlock->MemoryType == LoaderFree) || - (MdBlock->MemoryType == LoaderLoadedProgram) || - (MdBlock->MemoryType == LoaderFirmwareTemporary) || - (MdBlock->MemoryType == LoaderOsloaderStack)) - { - // - // Check if this is the largest memory descriptor - // - if (MdBlock->PageCount > FreePages) - { - // - // For now, it is - // - MxFreeDescriptor = MdBlock; - } - - // - // More free pages - // - FreePages += MdBlock->PageCount; - } + FreePages += MdBlock->PageCount; } - - // - // Keep going - // - NextEntry = MdBlock->ListEntry.Flink; } // - // Save original values of the free descriptor, since it'll be - // altered by early allocations + // Keep going // - MxOldFreeDescriptor = *MxFreeDescriptor; - - // - // Check if this is a machine with less than 256MB of RAM, and no overide - // - if ((MmNumberOfPhysicalPages <= MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING) && - !(MmSizeOfNonPagedPoolInBytes)) - { - // - // Force the non paged pool to be 2MB so we can reduce RAM usage - // - MmSizeOfNonPagedPoolInBytes = 2 * 1024 * 1024; - } - - // - // Hyperspace ends here - // - MmHyperSpaceEnd = (PVOID)((ULONG_PTR)MmSystemCacheWorkingSetList - 1); - - // - // Check if the user gave a ridicuously large nonpaged pool RAM size - // - if ((MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT) > - (MmNumberOfPhysicalPages * 7 / 8)) - { - // - // More than 7/8ths of RAM was dedicated to nonpaged pool, ignore! - // - MmSizeOfNonPagedPoolInBytes = 0; - } - - // - // Check if no registry setting was set, or if the setting was too low - // - if (MmSizeOfNonPagedPoolInBytes < MmMinimumNonPagedPoolSize) - { - // - // Start with the minimum (256 KB) and add 32 KB for each MB above 4 - // - MmSizeOfNonPagedPoolInBytes = MmMinimumNonPagedPoolSize; - MmSizeOfNonPagedPoolInBytes += (MmNumberOfPhysicalPages - 1024) / - 256 * MmMinAdditionNonPagedPoolPerMb; - } - - // - // Check if the registy setting or our dynamic calculation was too high - // - if (MmSizeOfNonPagedPoolInBytes > MI_MAX_INIT_NONPAGED_POOL_SIZE) - { - // - // Set it to the maximum - // - MmSizeOfNonPagedPoolInBytes = MI_MAX_INIT_NONPAGED_POOL_SIZE; - } - - // - // Check if a percentage cap was set through the registry - // - if (MmMaximumNonPagedPoolPercent) - { - // - // Don't feel like supporting this right now - // - UNIMPLEMENTED; - } - - // - // Page-align the nonpaged pool size - // - MmSizeOfNonPagedPoolInBytes &= ~(PAGE_SIZE - 1); - - // - // Now, check if there was a registry size for the maximum size - // - if (!MmMaximumNonPagedPoolInBytes) - { - // - // Start with the default (1MB) - // - MmMaximumNonPagedPoolInBytes = MmDefaultMaximumNonPagedPool; - - // - // Add space for PFN database - // - MmMaximumNonPagedPoolInBytes += (ULONG) - PAGE_ALIGN((MmHighestPhysicalPage + 1) * sizeof(MMPFN)); - - // - // Add 400KB for each MB above 4 - // - MmMaximumNonPagedPoolInBytes += (FreePages - 1024) / 256 * - MmMaxAdditionNonPagedPoolPerMb; - } - - // - // Make sure there's at least 16 pages + the PFN available for expansion - // - PoolPages = MmSizeOfNonPagedPoolInBytes + (PAGE_SIZE * 16) + - ((ULONG)PAGE_ALIGN(MmHighestPhysicalPage + 1) * - sizeof(MMPFN)); - if (MmMaximumNonPagedPoolInBytes < PoolPages) - { - // - // Set it to the minimum value for the maximum (yuck!) - // - MmMaximumNonPagedPoolInBytes = PoolPages; - } - - // - // Systems with 2GB of kernel address space get double the size - // - PoolPages = MI_MAX_NONPAGED_POOL_SIZE * 2; - - // - // Don't let the maximum go too high - // - if (MmMaximumNonPagedPoolInBytes > PoolPages) - { - // - // Set it to the upper limit - // - MmMaximumNonPagedPoolInBytes = PoolPages; - } - - // - // Check if this is a system with > 128MB of non paged pool - // - if (MmMaximumNonPagedPoolInBytes > MI_MAX_NONPAGED_POOL_SIZE) - { - // - // FIXME: Unsure about additional checks needed - // - DPRINT1("Untested path\n"); - } - - // - // Get L2 cache information - // - L2Associativity = KeGetPcr()->SecondLevelCacheAssociativity; - MmSecondaryColors = KeGetPcr()->SecondLevelCacheSize; - if (L2Associativity) MmSecondaryColors /= L2Associativity; - - // - // Compute final color mask and count - // - MmSecondaryColors >>= PAGE_SHIFT; - if (!MmSecondaryColors) MmSecondaryColors = 1; - MmSecondaryColorMask = MmSecondaryColors - 1; - - // - // Store it - // - KeGetCurrentPrcb()->SecondaryColorMask = MmSecondaryColorMask; - - // - // Calculate the number of bytes for the PFN database - // and then convert to pages - // - MxPfnAllocation = (MmHighestPhysicalPage + 1) * sizeof(MMPFN); - MxPfnAllocation >>= PAGE_SHIFT; - - // - // We have to add one to the count here, because in the process of - // shifting down to the page size, we actually ended up getting the - // lower aligned size (so say, 0x5FFFF bytes is now 0x5F pages). - // Later on, we'll shift this number back into bytes, which would cause - // us to end up with only 0x5F000 bytes -- when we actually want to have - // 0x60000 bytes. - // - MxPfnAllocation++; - - // - // Now calculate the nonpaged pool expansion VA region - // - MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - - MmMaximumNonPagedPoolInBytes + - MmSizeOfNonPagedPoolInBytes); - MmNonPagedPoolStart = (PVOID)PAGE_ALIGN(MmNonPagedPoolStart); - NonPagedPoolExpansionVa = MmNonPagedPoolStart; - DPRINT("NP Pool has been tuned to: %d bytes and %d bytes\n", - MmSizeOfNonPagedPoolInBytes, MmMaximumNonPagedPoolInBytes); - - // - // Now calculate the nonpaged system VA region, which includes the - // nonpaged pool expansion (above) and the system PTEs. Note that it is - // then aligned to a PDE boundary (4MB). - // - MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedPoolStart - - (MmNumberOfSystemPtes + 1) * PAGE_SIZE); - MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedSystemStart & - ~((4 * 1024 * 1024) - 1)); - - // - // Don't let it go below the minimum - // - if (MmNonPagedSystemStart < (PVOID)0xEB000000) - { - // - // This is a hard-coded limit in the Windows NT address space - // - MmNonPagedSystemStart = (PVOID)0xEB000000; - - // - // Reduce the amount of system PTEs to reach this point - // - MmNumberOfSystemPtes = ((ULONG_PTR)MmNonPagedPoolStart - - (ULONG_PTR)MmNonPagedSystemStart) >> - PAGE_SHIFT; - MmNumberOfSystemPtes--; - ASSERT(MmNumberOfSystemPtes > 1000); - } - - // - // Check if we are in a situation where the size of the paged pool - // is so large that it overflows into nonpaged pool - // - if (MmSizeOfPagedPoolInBytes > - ((ULONG_PTR)MmNonPagedSystemStart - (ULONG_PTR)MmPagedPoolStart)) - { - // - // We need some recalculations here - // - DPRINT1("Paged pool is too big!\n"); - } - - // - // Normally, the PFN database should start after the loader images. - // This is already the case in ReactOS, but for now we want to co-exist - // with the old memory manager, so we'll create a "Shadow PFN Database" - // instead, and arbitrarly start it at 0xB0000000. - // - MmPfnDatabase = (PVOID)0xB0000000; - ASSERT(((ULONG_PTR)MmPfnDatabase & ((4 * 1024 * 1024) - 1)) == 0); - - // - // Non paged pool comes after the PFN database - // - MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmPfnDatabase + - (MxPfnAllocation << PAGE_SHIFT)); - - // - // Now we actually need to get these many physical pages. Nonpaged pool - // is actually also physically contiguous (but not the expansion) - // - PageFrameIndex = MxGetNextPage(MxPfnAllocation + - (MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT)); - ASSERT(PageFrameIndex != 0); - DPRINT("PFN DB PA PFN begins at: %lx\n", PageFrameIndex); - DPRINT("NP PA PFN begins at: %lx\n", PageFrameIndex + MxPfnAllocation); - - // - // Now we need some pages to create the page tables for the NP system VA - // which includes system PTEs and expansion NP - // - StartPde = MiAddressToPde(MmNonPagedSystemStart); - EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); - while (StartPde <= EndPde) - { - // - // Sanity check - // - ASSERT(StartPde->u.Hard.Valid == 0); - - // - // Get a page - // - TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1); - ASSERT(TempPde.u.Hard.Valid == 1); - *StartPde = TempPde; - - // - // Zero out the page table - // - PointerPte = MiPteToAddress(StartPde); - RtlZeroMemory(PointerPte, PAGE_SIZE); - - // - // Next - // - StartPde++; - } - - // - // Now we need pages for the page tables which will map initial NP - // - StartPde = MiAddressToPde(MmPfnDatabase); - EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolStart + - MmSizeOfNonPagedPoolInBytes - 1)); - while (StartPde <= EndPde) - { - // - // Sanity check - // - ASSERT(StartPde->u.Hard.Valid == 0); - - // - // Get a page - // - TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1); - ASSERT(TempPde.u.Hard.Valid == 1); - *StartPde = TempPde; - - // - // Zero out the page table - // - PointerPte = MiPteToAddress(StartPde); - RtlZeroMemory(PointerPte, PAGE_SIZE); - - // - // Next - // - StartPde++; - } - - // - // Now remember where the expansion starts - // - MmNonPagedPoolExpansionStart = NonPagedPoolExpansionVa; - - // - // Last step is to actually map the nonpaged pool - // - PointerPte = MiAddressToPte(MmNonPagedPoolStart); - LastPte = MiAddressToPte((PVOID)((ULONG_PTR)MmNonPagedPoolStart + - MmSizeOfNonPagedPoolInBytes - 1)); - while (PointerPte <= LastPte) - { - // - // Use one of our contigous pages - // - TempPte.u.Hard.PageFrameNumber = PageFrameIndex++; - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte++ = TempPte; - } - - // - // Sanity check: make sure we have properly defined the system PTE space - // - ASSERT(MiAddressToPte(MmNonPagedSystemStart) < - MiAddressToPte(MmNonPagedPoolExpansionStart)); - - // - // Now go ahead and initialize the ARM³ nonpaged pool - // - MiInitializeArmPool(); - - // - // Get current page data, since we won't be using MxGetNextPage as it - // would corrupt our state - // - FreePage = MxFreeDescriptor->BasePage; - FreePageCount = MxFreeDescriptor->PageCount; - PagesLeft = 0; - - // - // Loop the memory descriptors - // - NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink; - while (NextEntry != &KeLoaderBlock->MemoryDescriptorListHead) - { - // - // Get the descriptor - // - MdBlock = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); - if ((MdBlock->MemoryType == LoaderFirmwarePermanent) || - (MdBlock->MemoryType == LoaderBBTMemory) || - (MdBlock->MemoryType == LoaderSpecialMemory)) - { - // - // These pages are not part of the PFN database - // - NextEntry = MdBlock->ListEntry.Flink; - continue; - } - - // - // Next, check if this is our special free descriptor we've found - // - if (MdBlock == MxFreeDescriptor) - { - // - // Use the real numbers instead - // - BasePage = MxOldFreeDescriptor.BasePage; - PageCount = MxOldFreeDescriptor.PageCount; - } - else - { - // - // Use the descriptor's numbers - // - BasePage = MdBlock->BasePage; - PageCount = MdBlock->PageCount; - } - - // - // Get the PTEs for this range - // - PointerPte = MiAddressToPte(&MmPfnDatabase[BasePage]); - LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[BasePage + PageCount]) - 1); - DPRINT("MD Type: %lx Base: %lx Count: %lx\n", MdBlock->MemoryType, BasePage, PageCount); - - // - // Loop them - // - while (PointerPte <= LastPte) - { - // - // We'll only touch PTEs that aren't already valid - // - if (PointerPte->u.Hard.Valid == 0) - { - // - // Use the next free page - // - TempPte.u.Hard.PageFrameNumber = FreePage; - ASSERT(FreePageCount != 0); - - // - // Consume free pages - // - FreePage++; - FreePageCount--; - if (!FreePageCount) - { - // - // Out of memory - // - KeBugCheckEx(INSTALL_MORE_MEMORY, - MmNumberOfPhysicalPages, - FreePageCount, - MxOldFreeDescriptor.PageCount, - 1); - } - - // - // Write out this PTE - // - PagesLeft++; - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte = TempPte; - - // - // Zero this page - // - RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); - } - - // - // Next! - // - PointerPte++; - } - - // - // Do the next address range - // - NextEntry = MdBlock->ListEntry.Flink; - } - - // - // Now update the free descriptors to consume the pages we used up during - // the PFN allocation loop - // - MxFreeDescriptor->BasePage = FreePage; - MxFreeDescriptor->PageCount = FreePageCount; + NextEntry = MdBlock->ListEntry.Flink; } - else if (Phase == 1) // IN BETWEEN, THE PFN DATABASE IS NOW CREATED + + // + // Save original values of the free descriptor, since it'll be + // altered by early allocations + // + MxOldFreeDescriptor = *MxFreeDescriptor; + + /* Compute non paged pool limits and size */ + MiComputeNonPagedPoolVa(FreePages); + + /* Compute color information (L2 cache-separated paging lists) */ + MiComputeColorInformation(); + + // + // Calculate the number of bytes for the PFN database, double it for ARM3, + // then add the color tables and convert to pages + // + MxPfnAllocation = (MmHighestPhysicalPage + 1) * sizeof(MMPFN); + MxPfnAllocation <<= 1; + MxPfnAllocation += (MmSecondaryColors * sizeof(MMCOLOR_TABLES) * 2); + MxPfnAllocation >>= PAGE_SHIFT; + + // + // We have to add one to the count here, because in the process of + // shifting down to the page size, we actually ended up getting the + // lower aligned size (so say, 0x5FFFF bytes is now 0x5F pages). + // Later on, we'll shift this number back into bytes, which would cause + // us to end up with only 0x5F000 bytes -- when we actually want to have + // 0x60000 bytes. + // + MxPfnAllocation++; + + // + // Now calculate the nonpaged pool expansion VA region + // + MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - + MmMaximumNonPagedPoolInBytes + + MmSizeOfNonPagedPoolInBytes); + MmNonPagedPoolStart = (PVOID)PAGE_ALIGN(MmNonPagedPoolStart); + NonPagedPoolExpansionVa = MmNonPagedPoolStart; + DPRINT("NP Pool has been tuned to: %d bytes and %d bytes\n", + MmSizeOfNonPagedPoolInBytes, MmMaximumNonPagedPoolInBytes); + + // + // Now calculate the nonpaged system VA region, which includes the + // nonpaged pool expansion (above) and the system PTEs. Note that it is + // then aligned to a PDE boundary (4MB). + // + MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedPoolStart - + (MmNumberOfSystemPtes + 1) * PAGE_SIZE); + MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedSystemStart & + ~((4 * 1024 * 1024) - 1)); + + // + // Don't let it go below the minimum + // + if (MmNonPagedSystemStart < (PVOID)0xEB000000) { // - // Reset the descriptor back so we can create the correct memory blocks + // This is a hard-coded limit in the Windows NT address space // - *MxFreeDescriptor = MxOldFreeDescriptor; + MmNonPagedSystemStart = (PVOID)0xEB000000; // - // Initialize the nonpaged pool + // Reduce the amount of system PTEs to reach this point // - InitializePool(NonPagedPool, 0); - - // - // We PDE-aligned the nonpaged system start VA, so haul some extra PTEs! - // - PointerPte = MiAddressToPte(MmNonPagedSystemStart); - OldCount = MmNumberOfSystemPtes; - MmNumberOfSystemPtes = MiAddressToPte(MmNonPagedPoolExpansionStart) - - PointerPte; + MmNumberOfSystemPtes = ((ULONG_PTR)MmNonPagedPoolStart - + (ULONG_PTR)MmNonPagedSystemStart) >> + PAGE_SHIFT; MmNumberOfSystemPtes--; - DPRINT("Final System PTE count: %d (%d bytes)\n", - MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE); - + ASSERT(MmNumberOfSystemPtes > 1000); + } + + // + // Check if we are in a situation where the size of the paged pool + // is so large that it overflows into nonpaged pool + // + if (MmSizeOfPagedPoolInBytes > + ((ULONG_PTR)MmNonPagedSystemStart - (ULONG_PTR)MmPagedPoolStart)) + { // - // Create the system PTE space + // We need some recalculations here // - MiInitializeSystemPtes(PointerPte, MmNumberOfSystemPtes, SystemPteSpace); - + DPRINT1("Paged pool is too big!\n"); + } + + // + // Normally, the PFN database should start after the loader images. + // This is already the case in ReactOS, but for now we want to co-exist + // with the old memory manager, so we'll create a "Shadow PFN Database" + // instead, and arbitrarly start it at 0xB0000000. + // + // We actually create two PFN databases, one for ReactOS starting here, + // and the next one used for ARM3, which starts right after. The MmPfnAllocation + // variable actually holds the size of both (the colored tables come after + // the ARM3 PFN database). + // + MmPfnDatabase[0] = (PVOID)0xB0000000; + MmPfnDatabase[1] = &MmPfnDatabase[0][MmHighestPhysicalPage]; + ASSERT(((ULONG_PTR)MmPfnDatabase[0] & ((4 * 1024 * 1024) - 1)) == 0); + + // + // Non paged pool comes after the PFN database + // + MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmPfnDatabase[0] + + (MxPfnAllocation << PAGE_SHIFT)); + + // + // Now we actually need to get these many physical pages. Nonpaged pool + // is actually also physically contiguous (but not the expansion) + // + PageFrameIndex = MxGetNextPage(MxPfnAllocation + + (MmSizeOfNonPagedPoolInBytes >> PAGE_SHIFT)); + ASSERT(PageFrameIndex != 0); + DPRINT("PFN DB PA PFN begins at: %lx\n", PageFrameIndex); + DPRINT("NP PA PFN begins at: %lx\n", PageFrameIndex + MxPfnAllocation); + + /* Convert nonpaged pool size from bytes to pages */ + MmMaximumNonPagedPoolInPages = MmMaximumNonPagedPoolInBytes >> PAGE_SHIFT; + + // + // Now we need some pages to create the page tables for the NP system VA + // which includes system PTEs and expansion NP + // + StartPde = MiAddressToPde(MmNonPagedSystemStart); + EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); + while (StartPde <= EndPde) + { // - // Get the PDE For hyperspace + // Sanity check // - StartPde = MiAddressToPde(HYPER_SPACE); - - // - // Allocate a page for it and create it - // - PageFrameIndex = MmAllocPage(MC_SYSTEM, 0); - TempPde.u.Hard.PageFrameNumber = PageFrameIndex; - TempPde.u.Hard.Global = FALSE; // Hyperspace is local! ASSERT(StartPde->u.Hard.Valid == 0); + + // + // Get a page + // + TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1); ASSERT(TempPde.u.Hard.Valid == 1); *StartPde = TempPde; // - // Zero out the page table now + // Zero out the page table // - PointerPte = MiAddressToPte(HYPER_SPACE); + PointerPte = MiPteToAddress(StartPde); RtlZeroMemory(PointerPte, PAGE_SIZE); // - // Setup the mapping PTEs + // Next // - MmFirstReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_START); - MmLastReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_END); - MmFirstReservedMappingPte->u.Hard.PageFrameNumber = MI_HYPERSPACE_PTES; + StartPde++; + } + // + // Now we need pages for the page tables which will map initial NP + // + StartPde = MiAddressToPde(MmPfnDatabase[0]); + EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolStart + + MmSizeOfNonPagedPoolInBytes - 1)); + while (StartPde <= EndPde) + { // - // Reserve system PTEs for zeroing PTEs and clear them + // Sanity check // - MiFirstReservedZeroingPte = MiReserveSystemPtes(MI_ZERO_PTES, - SystemPteSpace); - RtlZeroMemory(MiFirstReservedZeroingPte, MI_ZERO_PTES * sizeof(MMPTE)); + ASSERT(StartPde->u.Hard.Valid == 0); // - // Set the counter to maximum to boot with + // Get a page // - MiFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZERO_PTES - 1; + TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1); + ASSERT(TempPde.u.Hard.Valid == 1); + *StartPde = TempPde; // - // Sync us up with ReactOS Mm + // Zero out the page table // - MiSyncARM3WithROS(MmNonPagedSystemStart, (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); - MiSyncARM3WithROS(MmPfnDatabase, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); - MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1)); - - // - // Build the physical memory block - // - MmPhysicalMemoryBlock = MmInitializeMemoryLimits(LoaderBlock, - IncludeType); - - // - // Allocate enough buffer for the PFN bitmap - // Align it up to a 32-bit boundary - // - Bitmap = ExAllocatePoolWithTag(NonPagedPool, - (((MmHighestPhysicalPage + 1) + 31) / 32) * 4, - ' mM'); - if (!Bitmap) - { - // - // This is critical - // - KeBugCheckEx(INSTALL_MORE_MEMORY, - MmNumberOfPhysicalPages, - MmLowestPhysicalPage, - MmHighestPhysicalPage, - 0x101); - } + PointerPte = MiPteToAddress(StartPde); + RtlZeroMemory(PointerPte, PAGE_SIZE); // - // Initialize it and clear all the bits to begin with + // Next // - RtlInitializeBitMap(&MiPfnBitMap, - Bitmap, - MmHighestPhysicalPage + 1); - RtlClearAllBits(&MiPfnBitMap); - - // - // Loop physical memory runs - // - for (i = 0; i < MmPhysicalMemoryBlock->NumberOfRuns; i++) - { - // - // Get the run - // - Run = &MmPhysicalMemoryBlock->Run[i]; - DPRINT("PHYSICAL RAM [0x%08p to 0x%08p]\n", - Run->BasePage << PAGE_SHIFT, - (Run->BasePage + Run->PageCount) << PAGE_SHIFT); + StartPde++; + } - // - // Make sure it has pages inside it - // - if (Run->PageCount) - { - // - // Set the bits in the PFN bitmap - // - RtlSetBits(&MiPfnBitMap, Run->BasePage, Run->PageCount); - } - } - + // + // Now remember where the expansion starts + // + MmNonPagedPoolExpansionStart = NonPagedPoolExpansionVa; + + // + // Last step is to actually map the nonpaged pool + // + PointerPte = MiAddressToPte(MmNonPagedPoolStart); + LastPte = MiAddressToPte((PVOID)((ULONG_PTR)MmNonPagedPoolStart + + MmSizeOfNonPagedPoolInBytes - 1)); + while (PointerPte <= LastPte) + { // - // Size up paged pool and build the shadow system page directory + // Use one of our contigous pages // - MiBuildPagedPool(); + TempPte.u.Hard.PageFrameNumber = PageFrameIndex++; + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte++ = TempPte; } // - // Always return success for now + // Sanity check: make sure we have properly defined the system PTE space // + ASSERT(MiAddressToPte(MmNonPagedSystemStart) < + MiAddressToPte(MmNonPagedPoolExpansionStart)); + + /* Now go ahead and initialize the nonpaged pool */ + MiInitializeNonPagedPool(); + MiInitializeNonPagedPoolThresholds(); + + /* Map the PFN database pages */ + MiMapPfnDatabase(LoaderBlock); + + /* Initialize the color tables */ + MiInitializeColorTables(); + + /* Build the PFN Database */ + MiInitializePfnDatabase(LoaderBlock); + + /* Call back into shitMM to setup the ReactOS PFN database */ + MmInitializePageList(); + + // + // Reset the descriptor back so we can create the correct memory blocks + // + *MxFreeDescriptor = MxOldFreeDescriptor; + + // + // Initialize the nonpaged pool + // + InitializePool(NonPagedPool, 0); + + // + // We PDE-aligned the nonpaged system start VA, so haul some extra PTEs! + // + PointerPte = MiAddressToPte(MmNonPagedSystemStart); + OldCount = MmNumberOfSystemPtes; + MmNumberOfSystemPtes = MiAddressToPte(MmNonPagedPoolExpansionStart) - + PointerPte; + MmNumberOfSystemPtes--; + DPRINT("Final System PTE count: %d (%d bytes)\n", + MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE); + + // + // Create the system PTE space + // + MiInitializeSystemPtes(PointerPte, MmNumberOfSystemPtes, SystemPteSpace); + + // + // Get the PDE For hyperspace + // + StartPde = MiAddressToPde(HYPER_SPACE); + + // + // Allocate a page for it and create it + // + PageFrameIndex = MmAllocPage(MC_SYSTEM); + TempPde.u.Hard.PageFrameNumber = PageFrameIndex; + TempPde.u.Hard.Global = FALSE; // Hyperspace is local! + ASSERT(StartPde->u.Hard.Valid == 0); + ASSERT(TempPde.u.Hard.Valid == 1); + *StartPde = TempPde; + + // + // Zero out the page table now + // + PointerPte = MiAddressToPte(HYPER_SPACE); + RtlZeroMemory(PointerPte, PAGE_SIZE); + + // + // Setup the mapping PTEs + // + MmFirstReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_START); + MmLastReservedMappingPte = MiAddressToPte(MI_MAPPING_RANGE_END); + MmFirstReservedMappingPte->u.Hard.PageFrameNumber = MI_HYPERSPACE_PTES; + + // + // Reserve system PTEs for zeroing PTEs and clear them + // + MiFirstReservedZeroingPte = MiReserveSystemPtes(MI_ZERO_PTES, + SystemPteSpace); + RtlZeroMemory(MiFirstReservedZeroingPte, MI_ZERO_PTES * sizeof(MMPTE)); + + // + // Set the counter to maximum to boot with + // + MiFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZERO_PTES - 1; + return STATUS_SUCCESS; } diff --git a/reactos/ntoskrnl/mm/ARM3/iosup.c b/reactos/ntoskrnl/mm/ARM3/iosup.c index c4e6dd49cb6..b9f7eb641d9 100644 --- a/reactos/ntoskrnl/mm/ARM3/iosup.c +++ b/reactos/ntoskrnl/mm/ARM3/iosup.c @@ -120,7 +120,7 @@ MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress, // // Get the template and configure caching // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; switch (CacheAttribute) { case MiNonCached: diff --git a/reactos/ntoskrnl/mm/ARM3/mdlsup.c b/reactos/ntoskrnl/mm/ARM3/mdlsup.c index 995ff787e47..036e2c5107f 100644 --- a/reactos/ntoskrnl/mm/ARM3/mdlsup.c +++ b/reactos/ntoskrnl/mm/ARM3/mdlsup.c @@ -372,7 +372,7 @@ MmMapLockedPagesSpecifyCache(IN PMDL Mdl, // // Get the template // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; switch (CacheAttribute) { case MiNonCached: @@ -579,7 +579,8 @@ MmProbeAndLockPages(IN PMDL Mdl, PETHREAD Thread; PMMSUPPORT AddressSpace; NTSTATUS ProbeStatus; - PMMPTE PointerPte, PointerPde, LastPte; + PMMPTE PointerPte, LastPte; + PMMPDE PointerPde; PFN_NUMBER PageFrameIndex; BOOLEAN UsePfnLock; KIRQL OldIrql; @@ -952,7 +953,7 @@ MmProbeAndLockPages(IN PMDL Mdl, // Grab the PFN // PageFrameIndex = PFN_FROM_PTE(PointerPte); - if (PageFrameIndex < MmHighestPhysicalPage) + if (PageFrameIndex <= MmHighestPhysicalPage) { // // Get the PFN entry @@ -963,7 +964,6 @@ MmProbeAndLockPages(IN PMDL Mdl, // Now lock the page // MmReferencePage(PageFrameIndex); - MmLockPage(PageFrameIndex); } else { @@ -1121,7 +1121,6 @@ MmUnlockPages(IN PMDL Mdl) // // Unlock and dereference // - MmUnlockPage(*MdlPages); MmDereferencePage(*MdlPages); } } while (++MdlPages < LastPage); @@ -1215,7 +1214,6 @@ MmUnlockPages(IN PMDL Mdl) // // Unlock and dereference // - MmUnlockPage(*MdlPages); MmDereferencePage(*MdlPages); } while (++MdlPages < LastPage); diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 83937240b95..85137632e03 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -33,9 +33,38 @@ #define MI_NONPAGED_POOL_END (PVOID)0xFFBE0000 #define MI_DEBUG_MAPPING (PVOID)0xFFBFF000 +#define MI_MIN_SECONDARY_COLORS 8 +#define MI_SECONDARY_COLORS 64 +#define MI_MAX_SECONDARY_COLORS 1024 + #define MM_HIGHEST_VAD_ADDRESS \ (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE)) +/* Make the code cleaner with some definitions for size multiples */ +#define _1KB (1024) +#define _1MB (1000 * _1KB) + +/* Size of a PDE directory, and size of a page table */ +#define PDE_SIZE (PDE_COUNT * sizeof(MMPDE)) +#define PT_SIZE (PTE_COUNT * sizeof(MMPTE)) + +/* Architecture specific count of PDEs in a directory, and count of PTEs in a PT */ +#ifdef _M_IX86 +#define PD_COUNT 1 +#define PDE_COUNT 1024 +#define PTE_COUNT 1024 +#elif _M_ARM +#define PD_COUNT 1 +#define PDE_COUNT 4096 +#define PTE_COUNT 256 +#else +#error Define these please! +#endif + +// +// PFN List Sentinel +// +#define LIST_HEAD 0xFFFFFFFF // // FIXFIX: These should go in ex.h after the pool merge @@ -156,10 +185,21 @@ typedef struct _PHYSICAL_MEMORY_DESCRIPTOR PHYSICAL_MEMORY_RUN Run[1]; } PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR; +typedef struct _MMCOLOR_TABLES +{ + PFN_NUMBER Flink; + PVOID Blink; + PFN_NUMBER Count; +} MMCOLOR_TABLES, *PMMCOLOR_TABLES; + extern MMPTE HyperTemplatePte; +extern MMPTE ValidKernelPde; +extern MMPTE ValidKernelPte; extern ULONG_PTR MmSizeOfNonPagedPoolInBytes; extern ULONG_PTR MmMaximumNonPagedPoolInBytes; +extern PFN_NUMBER MmMaximumNonPagedPoolInPages; +extern PFN_NUMBER MmSizeOfPagedPoolInPages; extern PVOID MmNonPagedSystemStart; extern PVOID MmNonPagedPoolStart; extern PVOID MmNonPagedPoolExpansionStart; @@ -198,6 +238,36 @@ extern SIZE_T MmAllocatedNonPagedPool; extern ULONG_PTR MmSubsectionBase; extern ULONG MmSpecialPoolTag; extern PVOID MmHyperSpaceEnd; +extern PMMWSL MmSystemCacheWorkingSetList; +extern ULONG MmMinimumNonPagedPoolSize; +extern ULONG MmMinAdditionNonPagedPoolPerMb; +extern ULONG MmDefaultMaximumNonPagedPool; +extern ULONG MmMaxAdditionNonPagedPoolPerMb; +extern ULONG MmSecondaryColors; +extern ULONG MmSecondaryColorMask; +extern ULONG MmNumberOfSystemPtes; +extern ULONG MmMaximumNonPagedPoolPercent; +extern ULONG MmLargeStackSize; +extern PMMCOLOR_TABLES MmFreePagesByColor[FreePageList + 1]; +extern ULONG MmProductType; +extern MM_SYSTEMSIZE MmSystemSize; +extern PKEVENT MiLowMemoryEvent; +extern PKEVENT MiHighMemoryEvent; +extern PKEVENT MiLowPagedPoolEvent; +extern PKEVENT MiHighPagedPoolEvent; +extern PKEVENT MiLowNonPagedPoolEvent; +extern PKEVENT MiHighNonPagedPoolEvent; +extern PFN_NUMBER MmLowMemoryThreshold; +extern PFN_NUMBER MmHighMemoryThreshold; +extern PFN_NUMBER MiLowPagedPoolThreshold; +extern PFN_NUMBER MiHighPagedPoolThreshold; +extern PFN_NUMBER MiLowNonPagedPoolThreshold; +extern PFN_NUMBER MiHighNonPagedPoolThreshold; +extern PFN_NUMBER MmMinimumFreePages; +extern PFN_NUMBER MmPlentyFreePages; + +#define MI_PFN_TO_PFNENTRY(x) (&MmPfnDatabase[1][x]) +#define MI_PFNENTRY_TO_PFN(x) (x - MmPfnDatabase[1]) NTSTATUS NTAPI @@ -206,6 +276,69 @@ MmArmInitSystem( IN PLOADER_PARAMETER_BLOCK LoaderBlock ); +NTSTATUS +NTAPI +MiInitMachineDependent( + IN PLOADER_PARAMETER_BLOCK LoaderBlock +); + +VOID +NTAPI +MiComputeColorInformation( + VOID +); + +VOID +NTAPI +MiMapPfnDatabase( + IN PLOADER_PARAMETER_BLOCK LoaderBlock +); + +VOID +NTAPI +MiInitializeColorTables( + VOID +); + +VOID +NTAPI +MiInitializePfnDatabase( + IN PLOADER_PARAMETER_BLOCK LoaderBlock +); + +BOOLEAN +NTAPI +MiInitializeMemoryEvents( + VOID +); + +PFN_NUMBER +NTAPI +MxGetNextPage( + IN PFN_NUMBER PageCount +); + +PPHYSICAL_MEMORY_DESCRIPTOR +NTAPI +MmInitializeMemoryLimits( + IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PBOOLEAN IncludeType +); + +PFN_NUMBER +NTAPI +MiPagesInLoaderBlock( + IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PBOOLEAN IncludeType +); + +VOID +FASTCALL +MiSyncARM3WithROS( + IN PVOID AddressStart, + IN PVOID AddressEnd +); + NTSTATUS NTAPI MmArmAccessFault( @@ -217,7 +350,19 @@ MmArmAccessFault( VOID NTAPI -MiInitializeArmPool( +MiInitializeNonPagedPool( + VOID +); + +VOID +NTAPI +MiInitializeNonPagedPoolThresholds( + VOID +); + +VOID +NTAPI +MiInitializePoolEvents( VOID ); @@ -301,4 +446,36 @@ MiUnmapLockedPagesInUserSpace( IN PMDL Mdl ); +VOID +NTAPI +MiInsertInListTail( + IN PMMPFNLIST ListHead, + IN PMMPFN Entry +); + +VOID +NTAPI +MiInsertZeroListAtBack( + IN PFN_NUMBER PageIndex +); + +VOID +NTAPI +MiUnlinkFreeOrZeroedPage( + IN PMMPFN Entry +); + +PMMPFN +NTAPI +MiRemoveHeadList( + IN PMMPFNLIST ListHead +); + + +VOID +NTAPI +MiInsertPageInFreeList( + IN PFN_NUMBER PageFrameIndex +); + /* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c new file mode 100644 index 00000000000..89d082e4f95 --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -0,0 +1,1899 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/mminit.c + * PURPOSE: ARM Memory Manager Initialization + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARM³::INIT" +#define MODULE_INVOLVED_IN_ARM3 +#include "miarm.h" + +/* GLOBALS ********************************************************************/ + +// +// These are all registry-configurable, but by default, the memory manager will +// figure out the most appropriate values. +// +ULONG MmMaximumNonPagedPoolPercent; +ULONG MmSizeOfNonPagedPoolInBytes; +ULONG MmMaximumNonPagedPoolInBytes; + +/* Some of the same values, in pages */ +PFN_NUMBER MmMaximumNonPagedPoolInPages; + +// +// These numbers describe the discrete equation components of the nonpaged +// pool sizing algorithm. +// +// They are described on http://support.microsoft.com/default.aspx/kb/126402/ja +// along with the algorithm that uses them, which is implemented later below. +// +ULONG MmMinimumNonPagedPoolSize = 256 * 1024; +ULONG MmMinAdditionNonPagedPoolPerMb = 32 * 1024; +ULONG MmDefaultMaximumNonPagedPool = 1024 * 1024; +ULONG MmMaxAdditionNonPagedPoolPerMb = 400 * 1024; + +// +// The memory layout (and especially variable names) of the NT kernel mode +// components can be a bit hard to twig, especially when it comes to the non +// paged area. +// +// There are really two components to the non-paged pool: +// +// - The initial nonpaged pool, sized dynamically up to a maximum. +// - The expansion nonpaged pool, sized dynamically up to a maximum. +// +// The initial nonpaged pool is physically continuous for performance, and +// immediately follows the PFN database, typically sharing the same PDE. It is +// a very small resource (32MB on a 1GB system), and capped at 128MB. +// +// Right now we call this the "ARM³ Nonpaged Pool" and it begins somewhere after +// the PFN database (which starts at 0xB0000000). +// +// The expansion nonpaged pool, on the other hand, can grow much bigger (400MB +// for a 1GB system). On ARM³ however, it is currently capped at 128MB. +// +// The address where the initial nonpaged pool starts is aptly named +// MmNonPagedPoolStart, and it describes a range of MmSizeOfNonPagedPoolInBytes +// bytes. +// +// Expansion nonpaged pool starts at an address described by the variable called +// MmNonPagedPoolExpansionStart, and it goes on for MmMaximumNonPagedPoolInBytes +// minus MmSizeOfNonPagedPoolInBytes bytes, always reaching MmNonPagedPoolEnd +// (because of the way it's calculated) at 0xFFBE0000. +// +// Initial nonpaged pool is allocated and mapped early-on during boot, but what +// about the expansion nonpaged pool? It is instead composed of special pages +// which belong to what are called System PTEs. These PTEs are the matter of a +// later discussion, but they are also considered part of the "nonpaged" OS, due +// to the fact that they are never paged out -- once an address is described by +// a System PTE, it is always valid, until the System PTE is torn down. +// +// System PTEs are actually composed of two "spaces", the system space proper, +// and the nonpaged pool expansion space. The latter, as we've already seen, +// begins at MmNonPagedPoolExpansionStart. Based on the number of System PTEs +// that the system will support, the remaining address space below this address +// is used to hold the system space PTEs. This address, in turn, is held in the +// variable named MmNonPagedSystemStart, which itself is never allowed to go +// below 0xEB000000 (thus creating an upper bound on the number of System PTEs). +// +// This means that 330MB are reserved for total nonpaged system VA, on top of +// whatever the initial nonpaged pool allocation is. +// +// The following URLs, valid as of April 23rd, 2008, support this evidence: +// +// http://www.cs.miami.edu/~burt/journal/NT/memory.html +// http://www.ditii.com/2007/09/28/windows-memory-management-x86-virtual-address-space/ +// +PVOID MmNonPagedSystemStart; +PVOID MmNonPagedPoolStart; +PVOID MmNonPagedPoolExpansionStart; +PVOID MmNonPagedPoolEnd = MI_NONPAGED_POOL_END; + +// +// This is where paged pool starts by default +// +PVOID MmPagedPoolStart = MI_PAGED_POOL_START; +PVOID MmPagedPoolEnd; + +// +// And this is its default size +// +ULONG MmSizeOfPagedPoolInBytes = MI_MIN_INIT_PAGED_POOLSIZE; +PFN_NUMBER MmSizeOfPagedPoolInPages = MI_MIN_INIT_PAGED_POOLSIZE / PAGE_SIZE; + +// +// Session space starts at 0xBFFFFFFF and grows downwards +// By default, it includes an 8MB image area where we map win32k and video card +// drivers, followed by a 4MB area containing the session's working set. This is +// then followed by a 20MB mapped view area and finally by the session's paged +// pool, by default 16MB. +// +// On a normal system, this results in session space occupying the region from +// 0xBD000000 to 0xC0000000 +// +// See miarm.h for the defines that determine the sizing of this region. On an +// NT system, some of these can be configured through the registry, but we don't +// support that yet. +// +PVOID MiSessionSpaceEnd; // 0xC0000000 +PVOID MiSessionImageEnd; // 0xC0000000 +PVOID MiSessionImageStart; // 0xBF800000 +PVOID MiSessionViewStart; // 0xBE000000 +PVOID MiSessionPoolEnd; // 0xBE000000 +PVOID MiSessionPoolStart; // 0xBD000000 +PVOID MmSessionBase; // 0xBD000000 +ULONG MmSessionSize; +ULONG MmSessionViewSize; +ULONG MmSessionPoolSize; +ULONG MmSessionImageSize; + +// +// The system view space, on the other hand, is where sections that are memory +// mapped into "system space" end up. +// +// By default, it is a 16MB region. +// +PVOID MiSystemViewStart; +ULONG MmSystemViewSize; + +// +// A copy of the system page directory (the page directory associated with the +// System process) is kept (double-mapped) by the manager in order to lazily +// map paged pool PDEs into external processes when they fault on a paged pool +// address. +// +PFN_NUMBER MmSystemPageDirectory; +PMMPTE MmSystemPagePtes; + +// +// The system cache starts right after hyperspace. The first few pages are for +// keeping track of the system working set list. +// +// This should be 0xC0C00000 -- the cache itself starts at 0xC1000000 +// +PMMWSL MmSystemCacheWorkingSetList = MI_SYSTEM_CACHE_WS_START; + +// +// Windows NT seems to choose between 7000, 11000 and 50000 +// On systems with more than 32MB, this number is then doubled, and further +// aligned up to a PDE boundary (4MB). +// +ULONG MmNumberOfSystemPtes; + +// +// This is how many pages the PFN database will take up +// In Windows, this includes the Quark Color Table, but not in ARM³ +// +ULONG MxPfnAllocation; + +// +// Unlike the old ReactOS Memory Manager, ARM³ (and Windows) does not keep track +// of pages that are not actually valid physical memory, such as ACPI reserved +// regions, BIOS address ranges, or holes in physical memory address space which +// could indicate device-mapped I/O memory. +// +// In fact, the lack of a PFN entry for a page usually indicates that this is +// I/O space instead. +// +// A bitmap, called the PFN bitmap, keeps track of all page frames by assigning +// a bit to each. If the bit is set, then the page is valid physical RAM. +// +RTL_BITMAP MiPfnBitMap; + +// +// This structure describes the different pieces of RAM-backed address space +// +PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock; + +// +// This is where we keep track of the most basic physical layout markers +// +ULONG MmNumberOfPhysicalPages, MmHighestPhysicalPage, MmLowestPhysicalPage = -1; + +// +// The total number of pages mapped by the boot loader, which include the kernel +// HAL, boot drivers, registry, NLS files and other loader data structures is +// kept track of here. This depends on "LoaderPagesSpanned" being correct when +// coming from the loader. +// +// This number is later aligned up to a PDE boundary. +// +ULONG MmBootImageSize; + +// +// These three variables keep track of the core separation of address space that +// exists between kernel mode and user mode. +// +ULONG MmUserProbeAddress; +PVOID MmHighestUserAddress; +PVOID MmSystemRangeStart; + +PVOID MmSystemCacheStart; +PVOID MmSystemCacheEnd; +MMSUPPORT MmSystemCacheWs; + +// +// This is where hyperspace ends (followed by the system cache working set) +// +PVOID MmHyperSpaceEnd; + +// +// Page coloring algorithm data +// +ULONG MmSecondaryColors; +ULONG MmSecondaryColorMask; + +// +// Actual (registry-configurable) size of a GUI thread's stack +// +ULONG MmLargeStackSize = KERNEL_LARGE_STACK_SIZE; + +// +// Before we have a PFN database, memory comes straight from our physical memory +// blocks, which is nice because it's guaranteed contiguous and also because once +// we take a page from here, the system doesn't see it anymore. +// However, once the fun is over, those pages must be re-integrated back into +// PFN society life, and that requires us keeping a copy of the original layout +// so that we can parse it later. +// +PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor; +MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor; + +/* + * For each page's worth bytes of L2 cache in a given set/way line, the zero and + * free lists are organized in what is called a "color". + * + * This array points to the two lists, so it can be thought of as a multi-dimensional + * array of MmFreePagesByColor[2][MmSecondaryColors]. Since the number is dynamic, + * we describe the array in pointer form instead. + * + * On a final note, the color tables themselves are right after the PFN database. + */ +C_ASSERT(FreePageList == 1); +PMMCOLOR_TABLES MmFreePagesByColor[FreePageList + 1]; + +/* An event used in Phase 0 before the rest of the system is ready to go */ +KEVENT MiTempEvent; + +/* All the events used for memory threshold notifications */ +PKEVENT MiLowMemoryEvent; +PKEVENT MiHighMemoryEvent; +PKEVENT MiLowPagedPoolEvent; +PKEVENT MiHighPagedPoolEvent; +PKEVENT MiLowNonPagedPoolEvent; +PKEVENT MiHighNonPagedPoolEvent; + +/* The actual thresholds themselves, in page numbers */ +PFN_NUMBER MmLowMemoryThreshold; +PFN_NUMBER MmHighMemoryThreshold; +PFN_NUMBER MiLowPagedPoolThreshold; +PFN_NUMBER MiHighPagedPoolThreshold; +PFN_NUMBER MiLowNonPagedPoolThreshold; +PFN_NUMBER MiHighNonPagedPoolThreshold; + +/* + * This number determines how many free pages must exist, at minimum, until we + * start trimming working sets and flushing modified pages to obtain more free + * pages. + * + * This number changes if the system detects that this is a server product + */ +PFN_NUMBER MmMinimumFreePages = 26; + +/* + * This number indicates how many pages we consider to be a low limit of having + * "plenty" of free memory. + * + * It is doubled on systems that have more than 63MB of memory + */ +PFN_NUMBER MmPlentyFreePages = 400; + +/* These values store the type of system this is (small, med, large) and if server */ +ULONG MmProductType; +MM_SYSTEMSIZE MmSystemSize; + +/* PRIVATE FUNCTIONS **********************************************************/ + +// +// In Bavaria, this is probably a hate crime +// +VOID +FASTCALL +MiSyncARM3WithROS(IN PVOID AddressStart, + IN PVOID AddressEnd) +{ + // + // Puerile piece of junk-grade carbonized horseshit puss sold to the lowest bidder + // + ULONG Pde = ADDR_TO_PDE_OFFSET(AddressStart); + while (Pde <= ADDR_TO_PDE_OFFSET(AddressEnd)) + { + // + // This both odious and heinous + // + extern ULONG MmGlobalKernelPageDirectory[1024]; + MmGlobalKernelPageDirectory[Pde] = ((PULONG)PDE_BASE)[Pde]; + Pde++; + } +} + +PFN_NUMBER +NTAPI +MxGetNextPage(IN PFN_NUMBER PageCount) +{ + PFN_NUMBER Pfn; + + /* Make sure we have enough pages */ + if (PageCount > MxFreeDescriptor->PageCount) + { + /* Crash the system */ + KeBugCheckEx(INSTALL_MORE_MEMORY, + MmNumberOfPhysicalPages, + MxFreeDescriptor->PageCount, + MxOldFreeDescriptor.PageCount, + PageCount); + } + + /* Use our lowest usable free pages */ + Pfn = MxFreeDescriptor->BasePage; + MxFreeDescriptor->BasePage += PageCount; + MxFreeDescriptor->PageCount -= PageCount; + return Pfn; +} + +VOID +NTAPI +MiComputeColorInformation(VOID) +{ + ULONG L2Associativity; + + /* Check if no setting was provided already */ + if (!MmSecondaryColors) + { + /* Get L2 cache information */ + L2Associativity = KeGetPcr()->SecondLevelCacheAssociativity; + + /* The number of colors is the number of cache bytes by set/way */ + MmSecondaryColors = KeGetPcr()->SecondLevelCacheSize; + if (L2Associativity) MmSecondaryColors /= L2Associativity; + } + + /* Now convert cache bytes into pages */ + MmSecondaryColors >>= PAGE_SHIFT; + if (!MmSecondaryColors) + { + /* If there was no cache data from the KPCR, use the default colors */ + MmSecondaryColors = MI_SECONDARY_COLORS; + } + else + { + /* Otherwise, make sure there aren't too many colors */ + if (MmSecondaryColors > MI_MAX_SECONDARY_COLORS) + { + /* Set the maximum */ + MmSecondaryColors = MI_MAX_SECONDARY_COLORS; + } + + /* Make sure there aren't too little colors */ + if (MmSecondaryColors < MI_MIN_SECONDARY_COLORS) + { + /* Set the default */ + MmSecondaryColors = MI_SECONDARY_COLORS; + } + + /* Finally make sure the colors are a power of two */ + if (MmSecondaryColors & (MmSecondaryColors - 1)) + { + /* Set the default */ + MmSecondaryColors = MI_SECONDARY_COLORS; + } + } + + /* Compute the mask and store it */ + MmSecondaryColorMask = MmSecondaryColors - 1; + KeGetCurrentPrcb()->SecondaryColorMask = MmSecondaryColorMask; +} + +VOID +NTAPI +MiInitializeColorTables(VOID) +{ + ULONG i; + PMMPTE PointerPte, LastPte; + MMPTE TempPte = ValidKernelPte; + + /* The color table starts after the ARM3 PFN database */ + MmFreePagesByColor[0] = (PMMCOLOR_TABLES)&MmPfnDatabase[1][MmHighestPhysicalPage + 1]; + + /* Loop the PTEs. We have two color tables for each secondary color */ + PointerPte = MiAddressToPte(&MmFreePagesByColor[0][0]); + LastPte = MiAddressToPte((ULONG_PTR)MmFreePagesByColor[0] + + (2 * MmSecondaryColors * sizeof(MMCOLOR_TABLES)) + - 1); + while (PointerPte <= LastPte) + { + /* Check for valid PTE */ + if (PointerPte->u.Hard.Valid == 0) + { + /* Get a page and map it */ + TempPte.u.Hard.PageFrameNumber = MxGetNextPage(1); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte = TempPte; + + /* Zero out the page */ + RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); + } + + /* Next */ + PointerPte++; + } + + /* Now set the address of the next list, right after this one */ + MmFreePagesByColor[1] = &MmFreePagesByColor[0][MmSecondaryColors]; + + /* Now loop the lists to set them up */ + for (i = 0; i < MmSecondaryColors; i++) + { + /* Set both free and zero lists for each color */ + MmFreePagesByColor[ZeroedPageList][i].Flink = 0xFFFFFFFF; + MmFreePagesByColor[ZeroedPageList][i].Blink = (PVOID)0xFFFFFFFF; + MmFreePagesByColor[ZeroedPageList][i].Count = 0; + MmFreePagesByColor[FreePageList][i].Flink = 0xFFFFFFFF; + MmFreePagesByColor[FreePageList][i].Blink = (PVOID)0xFFFFFFFF; + MmFreePagesByColor[FreePageList][i].Count = 0; + } +} + +BOOLEAN +NTAPI +MiIsRegularMemory(IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PFN_NUMBER Pfn) +{ + PLIST_ENTRY NextEntry; + PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; + + /* Loop the memory descriptors */ + NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) + { + /* Get the memory descriptor */ + MdBlock = CONTAINING_RECORD(NextEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + + /* Check if this PFN could be part of the block */ + if (Pfn >= (MdBlock->BasePage)) + { + /* Check if it really is part of the block */ + if (Pfn < (MdBlock->BasePage + MdBlock->PageCount)) + { + /* Check if the block is actually memory we don't map */ + if ((MdBlock->MemoryType == LoaderFirmwarePermanent) || + (MdBlock->MemoryType == LoaderBBTMemory) || + (MdBlock->MemoryType == LoaderSpecialMemory)) + { + /* We don't need PFN database entries for this memory */ + break; + } + + /* This is memory we want to map */ + return TRUE; + } + } + else + { + /* Blocks are ordered, so if it's not here, it doesn't exist */ + break; + } + + /* Get to the next descriptor */ + NextEntry = MdBlock->ListEntry.Flink; + } + + /* Check if this PFN is actually from our free memory descriptor */ + if ((Pfn >= MxOldFreeDescriptor.BasePage) && + (Pfn < MxOldFreeDescriptor.BasePage + MxOldFreeDescriptor.PageCount)) + { + /* We use these pages for initial mappings, so we do want to count them */ + return TRUE; + } + + /* Otherwise this isn't memory that we describe or care about */ + return FALSE; +} + +VOID +NTAPI +MiMapPfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + ULONG FreePage, FreePageCount, PagesLeft, BasePage, PageCount; + PLIST_ENTRY NextEntry; + PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; + PMMPTE PointerPte, LastPte; + MMPTE TempPte = ValidKernelPte; + + /* Get current page data, since we won't be using MxGetNextPage as it would corrupt our state */ + FreePage = MxFreeDescriptor->BasePage; + FreePageCount = MxFreeDescriptor->PageCount; + PagesLeft = 0; + + /* Loop the memory descriptors */ + NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) + { + /* Get the descriptor */ + MdBlock = CONTAINING_RECORD(NextEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + if ((MdBlock->MemoryType == LoaderFirmwarePermanent) || + (MdBlock->MemoryType == LoaderBBTMemory) || + (MdBlock->MemoryType == LoaderSpecialMemory)) + { + /* These pages are not part of the PFN database */ + NextEntry = MdBlock->ListEntry.Flink; + continue; + } + + /* Next, check if this is our special free descriptor we've found */ + if (MdBlock == MxFreeDescriptor) + { + /* Use the real numbers instead */ + BasePage = MxOldFreeDescriptor.BasePage; + PageCount = MxOldFreeDescriptor.PageCount; + } + else + { + /* Use the descriptor's numbers */ + BasePage = MdBlock->BasePage; + PageCount = MdBlock->PageCount; + } + + /* Get the PTEs for this range */ + PointerPte = MiAddressToPte(&MmPfnDatabase[0][BasePage]); + LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[0][BasePage + PageCount]) - 1); + DPRINT("MD Type: %lx Base: %lx Count: %lx\n", MdBlock->MemoryType, BasePage, PageCount); + + /* Loop them */ + while (PointerPte <= LastPte) + { + /* We'll only touch PTEs that aren't already valid */ + if (PointerPte->u.Hard.Valid == 0) + { + /* Use the next free page */ + TempPte.u.Hard.PageFrameNumber = FreePage; + ASSERT(FreePageCount != 0); + + /* Consume free pages */ + FreePage++; + FreePageCount--; + if (!FreePageCount) + { + /* Out of memory */ + KeBugCheckEx(INSTALL_MORE_MEMORY, + MmNumberOfPhysicalPages, + FreePageCount, + MxOldFreeDescriptor.PageCount, + 1); + } + + /* Write out this PTE */ + PagesLeft++; + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte = TempPte; + + /* Zero this page */ + RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); + } + + /* Next! */ + PointerPte++; + } + + /* Get the PTEs for this range */ + PointerPte = MiAddressToPte(&MmPfnDatabase[1][BasePage]); + LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[1][BasePage + PageCount]) - 1); + DPRINT("MD Type: %lx Base: %lx Count: %lx\n", MdBlock->MemoryType, BasePage, PageCount); + + /* Loop them */ + while (PointerPte <= LastPte) + { + /* We'll only touch PTEs that aren't already valid */ + if (PointerPte->u.Hard.Valid == 0) + { + /* Use the next free page */ + TempPte.u.Hard.PageFrameNumber = FreePage; + ASSERT(FreePageCount != 0); + + /* Consume free pages */ + FreePage++; + FreePageCount--; + if (!FreePageCount) + { + /* Out of memory */ + KeBugCheckEx(INSTALL_MORE_MEMORY, + MmNumberOfPhysicalPages, + FreePageCount, + MxOldFreeDescriptor.PageCount, + 1); + } + + /* Write out this PTE */ + PagesLeft++; + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte = TempPte; + + /* Zero this page */ + RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); + } + + /* Next! */ + PointerPte++; + } + + /* Do the next address range */ + NextEntry = MdBlock->ListEntry.Flink; + } + + /* Now update the free descriptors to consume the pages we used up during the PFN allocation loop */ + MxFreeDescriptor->BasePage = FreePage; + MxFreeDescriptor->PageCount = FreePageCount; +} + +VOID +NTAPI +MiBuildPfnDatabaseFromPages(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + PMMPDE PointerPde; + PMMPTE PointerPte; + ULONG i, Count, j; + PFN_NUMBER PageFrameIndex, StartupPdIndex, PtePageIndex; + PMMPFN Pfn1, Pfn2; + ULONG_PTR BaseAddress = 0; + + /* PFN of the startup page directory */ + StartupPdIndex = PFN_FROM_PTE(MiAddressToPde(PDE_BASE)); + + /* Start with the first PDE and scan them all */ + PointerPde = MiAddressToPde(NULL); + Count = PD_COUNT * PDE_COUNT; + for (i = 0; i < Count; i++) + { + /* Check for valid PDE */ + if (PointerPde->u.Hard.Valid == 1) + { + /* Get the PFN from it */ + PageFrameIndex = PFN_FROM_PTE(PointerPde); + + /* Do we want a PFN entry for this page? */ + if (MiIsRegularMemory(LoaderBlock, PageFrameIndex)) + { + /* Yes we do, set it up */ + Pfn1 = MI_PFN_TO_PFNENTRY(PageFrameIndex); + Pfn1->u4.PteFrame = StartupPdIndex; + Pfn1->PteAddress = PointerPde; + Pfn1->u2.ShareCount++; + Pfn1->u3.e2.ReferenceCount = 1; + Pfn1->u3.e1.PageLocation = ActiveAndValid; + Pfn1->u3.e1.CacheAttribute = MiNonCached; + } + else + { + /* No PFN entry */ + Pfn1 = NULL; + } + + /* Now get the PTE and scan the pages */ + PointerPte = MiAddressToPte(BaseAddress); + for (j = 0; j < PTE_COUNT; j++) + { + /* Check for a valid PTE */ + if (PointerPte->u.Hard.Valid == 1) + { + /* Increase the shared count of the PFN entry for the PDE */ + ASSERT(Pfn1 != NULL); + Pfn1->u2.ShareCount++; + + /* Now check if the PTE is valid memory too */ + PtePageIndex = PFN_FROM_PTE(PointerPte); + if (MiIsRegularMemory(LoaderBlock, PtePageIndex)) + { + /* + * Only add pages above the end of system code or pages + * that are part of nonpaged pool + */ + if ((BaseAddress >= 0xA0000000) || + ((BaseAddress >= (ULONG_PTR)MmNonPagedPoolStart) && + (BaseAddress < (ULONG_PTR)MmNonPagedPoolStart + + MmSizeOfNonPagedPoolInBytes))) + { + /* Get the PFN entry and make sure it too is valid */ + Pfn2 = MI_PFN_TO_PFNENTRY(PtePageIndex); + if ((MmIsAddressValid(Pfn2)) && + (MmIsAddressValid(Pfn2 + 1))) + { + /* Setup the PFN entry */ + Pfn2->u4.PteFrame = PageFrameIndex; + Pfn2->PteAddress = PointerPte; + Pfn2->u2.ShareCount++; + Pfn2->u3.e2.ReferenceCount = 1; + Pfn2->u3.e1.PageLocation = ActiveAndValid; + Pfn2->u3.e1.CacheAttribute = MiNonCached; + } + } + } + } + + /* Next PTE */ + PointerPte++; + BaseAddress += PAGE_SIZE; + } + } + else + { + /* Next PDE mapped address */ + BaseAddress += PTE_COUNT * PAGE_SIZE; + } + + /* Next PTE */ + PointerPde++; + } +} + +VOID +NTAPI +MiBuildPfnDatabaseZeroPage(VOID) +{ + PMMPFN Pfn1; + PMMPDE PointerPde; + + /* Grab the lowest page and check if it has no real references */ + Pfn1 = MI_PFN_TO_PFNENTRY(MmLowestPhysicalPage); + if (!(MmLowestPhysicalPage) && !(Pfn1->u3.e2.ReferenceCount)) + { + /* Make it a bogus page to catch errors */ + PointerPde = MiAddressToPde(0xFFFFFFFF); + Pfn1->u4.PteFrame = PFN_FROM_PTE(PointerPde); + Pfn1->PteAddress = PointerPde; + Pfn1->u2.ShareCount++; + Pfn1->u3.e2.ReferenceCount = 0xFFF0; + Pfn1->u3.e1.PageLocation = ActiveAndValid; + Pfn1->u3.e1.CacheAttribute = MiNonCached; + } +} + +VOID +NTAPI +MiBuildPfnDatabaseFromLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + PLIST_ENTRY NextEntry; + PFN_NUMBER PageCount = 0; + PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; + PFN_NUMBER PageFrameIndex; + PMMPFN Pfn1; + PMMPTE PointerPte; + PMMPDE PointerPde; + + /* Now loop through the descriptors */ + NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) + { + /* Get the current descriptor */ + MdBlock = CONTAINING_RECORD(NextEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + + /* Read its data */ + PageCount = MdBlock->PageCount; + PageFrameIndex = MdBlock->BasePage; + + /* Don't allow memory above what the PFN database is mapping */ + if (PageFrameIndex > MmHighestPhysicalPage) + { + /* Since they are ordered, everything past here will be larger */ + break; + } + + /* On the other hand, the end page might be higher up... */ + if ((PageFrameIndex + PageCount) > (MmHighestPhysicalPage + 1)) + { + /* In which case we'll trim the descriptor to go as high as we can */ + PageCount = MmHighestPhysicalPage + 1 - PageFrameIndex; + MdBlock->PageCount = PageCount; + + /* But if there's nothing left to trim, we got too high, so quit */ + if (!PageCount) break; + } + + /* Now check the descriptor type */ + switch (MdBlock->MemoryType) + { + /* Check for bad RAM */ + case LoaderBad: + + DPRINT1("You have damaged RAM modules. Stopping boot\n"); + while (TRUE); + break; + + /* Check for free RAM */ + case LoaderFree: + case LoaderLoadedProgram: + case LoaderFirmwareTemporary: + case LoaderOsloaderStack: + + /* Get the last page of this descriptor. Note we loop backwards */ + PageFrameIndex += PageCount - 1; + Pfn1 = MI_PFN_TO_PFNENTRY(PageFrameIndex); + while (PageCount--) + { + /* If the page really has no references, mark it as free */ + if (!Pfn1->u3.e2.ReferenceCount) + { + Pfn1->u3.e1.CacheAttribute = MiNonCached; + //MiInsertPageInFreeList(PageFrameIndex); + } + + /* Go to the next page */ + Pfn1--; + PageFrameIndex--; + } + + /* Done with this block */ + break; + + /* Check for pages that are invisible to us */ + case LoaderFirmwarePermanent: + case LoaderSpecialMemory: + case LoaderBBTMemory: + + /* And skip them */ + break; + + default: + + /* Map these pages with the KSEG0 mapping that adds 0x80000000 */ + PointerPte = MiAddressToPte(KSEG0_BASE + (PageFrameIndex << PAGE_SHIFT)); + Pfn1 = MI_PFN_TO_PFNENTRY(PageFrameIndex); + while (PageCount--) + { + /* Check if the page is really unused */ + PointerPde = MiAddressToPde(KSEG0_BASE + (PageFrameIndex << PAGE_SHIFT)); + if (!Pfn1->u3.e2.ReferenceCount) + { + /* Mark it as being in-use */ + Pfn1->u4.PteFrame = PFN_FROM_PTE(PointerPde); + Pfn1->PteAddress = PointerPte; + Pfn1->u2.ShareCount++; + Pfn1->u3.e2.ReferenceCount = 1; + Pfn1->u3.e1.PageLocation = ActiveAndValid; + Pfn1->u3.e1.CacheAttribute = MiNonCached; + + /* Check for RAM disk page */ + if (MdBlock->MemoryType == LoaderXIPRom) + { + /* Make it a pseudo-I/O ROM mapping */ + Pfn1->u1.Flink = 0; + Pfn1->u2.ShareCount = 0; + Pfn1->u3.e2.ReferenceCount = 0; + Pfn1->u3.e1.PageLocation = 0; + Pfn1->u3.e1.Rom = 1; + Pfn1->u4.InPageError = 0; + Pfn1->u3.e1.PrototypePte = 1; + } + } + + /* Advance page structures */ + Pfn1++; + PageFrameIndex++; + PointerPte++; + } + break; + } + + /* Next descriptor entry */ + NextEntry = MdBlock->ListEntry.Flink; + } +} + +VOID +NTAPI +MiBuildPfnDatabaseSelf(VOID) +{ + PMMPTE PointerPte, LastPte; + PMMPFN Pfn1; + + /* Loop the PFN database page */ + PointerPte = MiAddressToPte(MI_PFN_TO_PFNENTRY(MmLowestPhysicalPage)); + LastPte = MiAddressToPte(MI_PFN_TO_PFNENTRY(MmHighestPhysicalPage)); + while (PointerPte <= LastPte) + { + /* Make sure the page is valid */ + if (PointerPte->u.Hard.Valid == 1) + { + /* Get the PFN entry and just mark it referenced */ + Pfn1 = MI_PFN_TO_PFNENTRY(PointerPte->u.Hard.PageFrameNumber); + Pfn1->u2.ShareCount = 1; + Pfn1->u3.e2.ReferenceCount = 1; + } + + /* Next */ + PointerPte++; + } +} + +VOID +NTAPI +MiInitializePfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + /* Scan memory and start setting up PFN entries */ + MiBuildPfnDatabaseFromPages(LoaderBlock); + + /* Add the zero page */ + MiBuildPfnDatabaseZeroPage(); + + /* Scan the loader block and build the rest of the PFN database */ + MiBuildPfnDatabaseFromLoaderBlock(LoaderBlock); + + /* Finally add the pages for the PFN database itself */ + MiBuildPfnDatabaseSelf(); +} + +VOID +NTAPI +MiAdjustWorkingSetManagerParameters(IN BOOLEAN Client) +{ + /* This function needs to do more work, for now, we tune page minimums */ + + /* Check for a system with around 64MB RAM or more */ + if (MmNumberOfPhysicalPages >= (63 * _1MB) / PAGE_SIZE) + { + /* Double the minimum amount of pages we consider for a "plenty free" scenario */ + MmPlentyFreePages *= 2; + } +} + +VOID +NTAPI +MiNotifyMemoryEvents(VOID) +{ + /* Are we in a low-memory situation? */ + if (MmAvailablePages < MmLowMemoryThreshold) + { + /* Clear high, set low */ + if (KeReadStateEvent(MiHighMemoryEvent)) KeClearEvent(MiHighMemoryEvent); + if (!KeReadStateEvent(MiLowMemoryEvent)) KeSetEvent(MiLowMemoryEvent, 0, FALSE); + } + else if (MmAvailablePages < MmHighMemoryThreshold) + { + /* We are in between, clear both */ + if (KeReadStateEvent(MiHighMemoryEvent)) KeClearEvent(MiHighMemoryEvent); + if (KeReadStateEvent(MiLowMemoryEvent)) KeClearEvent(MiLowMemoryEvent); + } + else + { + /* Clear low, set high */ + if (KeReadStateEvent(MiLowMemoryEvent)) KeClearEvent(MiLowMemoryEvent); + if (!KeReadStateEvent(MiHighMemoryEvent)) KeSetEvent(MiHighMemoryEvent, 0, FALSE); + } +} + +NTSTATUS +NTAPI +MiCreateMemoryEvent(IN PUNICODE_STRING Name, + OUT PKEVENT *Event) +{ + PACL Dacl; + HANDLE EventHandle; + ULONG DaclLength; + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + SECURITY_DESCRIPTOR SecurityDescriptor; + + /* Create the SD */ + Status = RtlCreateSecurityDescriptor(&SecurityDescriptor, + SECURITY_DESCRIPTOR_REVISION); + if (!NT_SUCCESS(Status)) return Status; + + /* One ACL with 3 ACEs, containing each one SID */ + DaclLength = sizeof(ACL) + + 3 * sizeof(ACCESS_ALLOWED_ACE) + + RtlLengthSid(SeLocalSystemSid) + + RtlLengthSid(SeAliasAdminsSid) + + RtlLengthSid(SeWorldSid); + + /* Allocate space for the DACL */ + Dacl = ExAllocatePoolWithTag(PagedPool, DaclLength, 'lcaD'); + if (!Dacl) return STATUS_INSUFFICIENT_RESOURCES; + + /* Setup the ACL inside it */ + Status = RtlCreateAcl(Dacl, DaclLength, ACL_REVISION); + if (!NT_SUCCESS(Status)) goto CleanUp; + + /* Add query rights for everyone */ + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + SYNCHRONIZE | EVENT_QUERY_STATE | READ_CONTROL, + SeWorldSid); + if (!NT_SUCCESS(Status)) goto CleanUp; + + /* Full rights for the admin */ + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + EVENT_ALL_ACCESS, + SeAliasAdminsSid); + if (!NT_SUCCESS(Status)) goto CleanUp; + + /* As well as full rights for the system */ + Status = RtlAddAccessAllowedAce(Dacl, + ACL_REVISION, + EVENT_ALL_ACCESS, + SeLocalSystemSid); + if (!NT_SUCCESS(Status)) goto CleanUp; + + /* Set this DACL inside the SD */ + Status = RtlSetDaclSecurityDescriptor(&SecurityDescriptor, + TRUE, + Dacl, + FALSE); + if (!NT_SUCCESS(Status)) goto CleanUp; + + /* Setup the event attributes, making sure it's a permanent one */ + InitializeObjectAttributes(&ObjectAttributes, + Name, + OBJ_KERNEL_HANDLE | OBJ_PERMANENT, + NULL, + &SecurityDescriptor); + + /* Create the event */ + Status = ZwCreateEvent(&EventHandle, + EVENT_ALL_ACCESS, + &ObjectAttributes, + NotificationEvent, + FALSE); +CleanUp: + /* Free the DACL */ + ExFreePool(Dacl); + + /* Check if this is the success path */ + if (NT_SUCCESS(Status)) + { + /* Add a reference to the object, then close the handle we had */ + Status = ObReferenceObjectByHandle(EventHandle, + EVENT_MODIFY_STATE, + ExEventObjectType, + KernelMode, + (PVOID*)Event, + NULL); + ZwClose (EventHandle); + } + + /* Return status */ + return Status; +} + +BOOLEAN +NTAPI +MiInitializeMemoryEvents(VOID) +{ + UNICODE_STRING LowString = RTL_CONSTANT_STRING(L"\\KernelObjects\\LowMemoryCondition"); + UNICODE_STRING HighString = RTL_CONSTANT_STRING(L"\\KernelObjects\\HighMemoryCondition"); + UNICODE_STRING LowPagedPoolString = RTL_CONSTANT_STRING(L"\\KernelObjects\\LowPagedPoolCondition"); + UNICODE_STRING HighPagedPoolString = RTL_CONSTANT_STRING(L"\\KernelObjects\\HighPagedPoolCondition"); + UNICODE_STRING LowNonPagedPoolString = RTL_CONSTANT_STRING(L"\\KernelObjects\\LowNonPagedPoolCondition"); + UNICODE_STRING HighNonPagedPoolString = RTL_CONSTANT_STRING(L"\\KernelObjects\\HighNonPagedPoolCondition"); + NTSTATUS Status; + + /* Check if we have a registry setting */ + if (MmLowMemoryThreshold) + { + /* Convert it to pages */ + MmLowMemoryThreshold *= (_1MB / PAGE_SIZE); + } + else + { + /* The low memory threshold is hit when we don't consider that we have "plenty" of free pages anymore */ + MmLowMemoryThreshold = MmPlentyFreePages; + + /* More than one GB of memory? */ + if (MmNumberOfPhysicalPages > 0x40000) + { + /* Start at 32MB, and add another 16MB for each GB */ + MmLowMemoryThreshold = (32 * _1MB) / PAGE_SIZE; + MmLowMemoryThreshold += ((MmNumberOfPhysicalPages - 0x40000) >> 7); + } + else if (MmNumberOfPhysicalPages > 0x8000) + { + /* For systems with > 128MB RAM, add another 4MB for each 128MB */ + MmLowMemoryThreshold += ((MmNumberOfPhysicalPages - 0x8000) >> 5); + } + + /* Don't let the minimum threshold go past 64MB */ + MmLowMemoryThreshold = min(MmLowMemoryThreshold, (64 * _1MB) / PAGE_SIZE); + } + + /* Check if we have a registry setting */ + if (MmHighMemoryThreshold) + { + /* Convert it into pages */ + MmHighMemoryThreshold *= (_1MB / PAGE_SIZE); + } + else + { + /* Otherwise, the default is three times the low memory threshold */ + MmHighMemoryThreshold = 3 * MmLowMemoryThreshold; + ASSERT(MmHighMemoryThreshold > MmLowMemoryThreshold); + } + + /* Make sure high threshold is actually higher than the low */ + MmHighMemoryThreshold = max(MmHighMemoryThreshold, MmLowMemoryThreshold); + + /* Create the memory events for all the thresholds */ + Status = MiCreateMemoryEvent(&LowString, &MiLowMemoryEvent); + if (!NT_SUCCESS(Status)) return FALSE; + Status = MiCreateMemoryEvent(&HighString, &MiHighMemoryEvent); + if (!NT_SUCCESS(Status)) return FALSE; + Status = MiCreateMemoryEvent(&LowPagedPoolString, &MiLowPagedPoolEvent); + if (!NT_SUCCESS(Status)) return FALSE; + Status = MiCreateMemoryEvent(&HighPagedPoolString, &MiHighPagedPoolEvent); + if (!NT_SUCCESS(Status)) return FALSE; + Status = MiCreateMemoryEvent(&LowNonPagedPoolString, &MiLowNonPagedPoolEvent); + if (!NT_SUCCESS(Status)) return FALSE; + Status = MiCreateMemoryEvent(&HighNonPagedPoolString, &MiHighNonPagedPoolEvent); + if (!NT_SUCCESS(Status)) return FALSE; + + /* Now setup the pool events */ + MiInitializePoolEvents(); + + /* Set the initial event state */ + MiNotifyMemoryEvents(); + return TRUE; +} + +VOID +NTAPI +MmDumpArmPfnDatabase(VOID) +{ + ULONG i; + PMMPFN Pfn1; + PCHAR Consumer = "Unknown"; + KIRQL OldIrql; + ULONG ActivePages = 0, FreePages = 0, OtherPages = 0; + + KeRaiseIrql(HIGH_LEVEL, &OldIrql); + + // + // Loop the PFN database + // + for (i = 0; i <= MmHighestPhysicalPage; i++) + { + Pfn1 = MI_PFN_TO_PFNENTRY(i); + if (!Pfn1) continue; + + // + // Get the page location + // + switch (Pfn1->u3.e1.PageLocation) + { + case ActiveAndValid: + + Consumer = "Active and Valid"; + ActivePages++; + break; + + case FreePageList: + + Consumer = "Free Page List"; + FreePages++; + break; + + default: + + Consumer = "Other (ASSERT!)"; + OtherPages++; + break; + } + + // + // Pretty-print the page + // + DbgPrint("0x%08p:\t%20s\t(%02d.%02d) [%08p-%08p])\n", + i << PAGE_SHIFT, + Consumer, + Pfn1->u3.e2.ReferenceCount, + Pfn1->u2.ShareCount, + Pfn1->PteAddress, + Pfn1->u4.PteFrame); + } + + DbgPrint("Active: %d pages\t[%d KB]\n", ActivePages, (ActivePages << PAGE_SHIFT) / 1024); + DbgPrint("Free: %d pages\t[%d KB]\n", FreePages, (FreePages << PAGE_SHIFT) / 1024); + DbgPrint("Other: %d pages\t[%d KB]\n", OtherPages, (OtherPages << PAGE_SHIFT) / 1024); + + KeLowerIrql(OldIrql); +} + +PFN_NUMBER +NTAPI +MiPagesInLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PBOOLEAN IncludeType) +{ + PLIST_ENTRY NextEntry; + PFN_NUMBER PageCount = 0; + PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; + + // + // Now loop through the descriptors + // + NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) + { + // + // Grab each one, and check if it's one we should include + // + MdBlock = CONTAINING_RECORD(NextEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + if ((MdBlock->MemoryType < LoaderMaximum) && + (IncludeType[MdBlock->MemoryType])) + { + // + // Add this to our running total + // + PageCount += MdBlock->PageCount; + } + + // + // Try the next descriptor + // + NextEntry = MdBlock->ListEntry.Flink; + } + + // + // Return the total + // + return PageCount; +} + +PPHYSICAL_MEMORY_DESCRIPTOR +NTAPI +MmInitializeMemoryLimits(IN PLOADER_PARAMETER_BLOCK LoaderBlock, + IN PBOOLEAN IncludeType) +{ + PLIST_ENTRY NextEntry; + ULONG Run = 0, InitialRuns = 0; + PFN_NUMBER NextPage = -1, PageCount = 0; + PPHYSICAL_MEMORY_DESCRIPTOR Buffer, NewBuffer; + PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; + + // + // Scan the memory descriptors + // + NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) + { + // + // For each one, increase the memory allocation estimate + // + InitialRuns++; + NextEntry = NextEntry->Flink; + } + + // + // Allocate the maximum we'll ever need + // + Buffer = ExAllocatePoolWithTag(NonPagedPool, + sizeof(PHYSICAL_MEMORY_DESCRIPTOR) + + sizeof(PHYSICAL_MEMORY_RUN) * + (InitialRuns - 1), + 'lMmM'); + if (!Buffer) return NULL; + + // + // For now that's how many runs we have + // + Buffer->NumberOfRuns = InitialRuns; + + // + // Now loop through the descriptors again + // + NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + while (NextEntry != &LoaderBlock->MemoryDescriptorListHead) + { + // + // Grab each one, and check if it's one we should include + // + MdBlock = CONTAINING_RECORD(NextEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + if ((MdBlock->MemoryType < LoaderMaximum) && + (IncludeType[MdBlock->MemoryType])) + { + // + // Add this to our running total + // + PageCount += MdBlock->PageCount; + + // + // Check if the next page is described by the next descriptor + // + if (MdBlock->BasePage == NextPage) + { + // + // Combine it into the same physical run + // + ASSERT(MdBlock->PageCount != 0); + Buffer->Run[Run - 1].PageCount += MdBlock->PageCount; + NextPage += MdBlock->PageCount; + } + else + { + // + // Otherwise just duplicate the descriptor's contents + // + Buffer->Run[Run].BasePage = MdBlock->BasePage; + Buffer->Run[Run].PageCount = MdBlock->PageCount; + NextPage = Buffer->Run[Run].BasePage + Buffer->Run[Run].PageCount; + + // + // And in this case, increase the number of runs + // + Run++; + } + } + + // + // Try the next descriptor + // + NextEntry = MdBlock->ListEntry.Flink; + } + + // + // We should not have been able to go past our initial estimate + // + ASSERT(Run <= Buffer->NumberOfRuns); + + // + // Our guess was probably exaggerated... + // + if (InitialRuns > Run) + { + // + // Allocate a more accurately sized buffer + // + NewBuffer = ExAllocatePoolWithTag(NonPagedPool, + sizeof(PHYSICAL_MEMORY_DESCRIPTOR) + + sizeof(PHYSICAL_MEMORY_RUN) * + (Run - 1), + 'lMmM'); + if (NewBuffer) + { + // + // Copy the old buffer into the new, then free it + // + RtlCopyMemory(NewBuffer->Run, + Buffer->Run, + sizeof(PHYSICAL_MEMORY_RUN) * Run); + ExFreePool(Buffer); + + // + // Now use the new buffer + // + Buffer = NewBuffer; + } + } + + // + // Write the final numbers, and return it + // + Buffer->NumberOfRuns = Run; + Buffer->NumberOfPages = PageCount; + return Buffer; +} + +VOID +NTAPI +MiBuildPagedPool(VOID) +{ + PMMPTE PointerPte, PointerPde; + MMPTE TempPte = ValidKernelPte; + PFN_NUMBER PageFrameIndex; + KIRQL OldIrql; + ULONG Size, BitMapSize; + + // + // Get the page frame number for the system page directory + // + PointerPte = MiAddressToPte(PDE_BASE); + MmSystemPageDirectory = PFN_FROM_PTE(PointerPte); + + // + // Allocate a system PTE which will hold a copy of the page directory + // + PointerPte = MiReserveSystemPtes(1, SystemPteSpace); + ASSERT(PointerPte); + MmSystemPagePtes = MiPteToAddress(PointerPte); + + // + // Make this system PTE point to the system page directory. + // It is now essentially double-mapped. This will be used later for lazy + // evaluation of PDEs accross process switches, similarly to how the Global + // page directory array in the old ReactOS Mm is used (but in a less hacky + // way). + // + TempPte = ValidKernelPte; + TempPte.u.Hard.PageFrameNumber = MmSystemPageDirectory; + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte = TempPte; + + // + // Let's get back to paged pool work: size it up. + // By default, it should be twice as big as nonpaged pool. + // + MmSizeOfPagedPoolInBytes = 2 * MmMaximumNonPagedPoolInBytes; + if (MmSizeOfPagedPoolInBytes > ((ULONG_PTR)MmNonPagedSystemStart - + (ULONG_PTR)MmPagedPoolStart)) + { + // + // On the other hand, we have limited VA space, so make sure that the VA + // for paged pool doesn't overflow into nonpaged pool VA. Otherwise, set + // whatever maximum is possible. + // + MmSizeOfPagedPoolInBytes = (ULONG_PTR)MmNonPagedSystemStart - + (ULONG_PTR)MmPagedPoolStart; + } + + // + // Get the size in pages and make sure paged pool is at least 32MB. + // + Size = MmSizeOfPagedPoolInBytes; + if (Size < MI_MIN_INIT_PAGED_POOLSIZE) Size = MI_MIN_INIT_PAGED_POOLSIZE; + Size = BYTES_TO_PAGES(Size); + + // + // Now check how many PTEs will be required for these many pages. + // + Size = (Size + (1024 - 1)) / 1024; + + // + // Recompute the page-aligned size of the paged pool, in bytes and pages. + // + MmSizeOfPagedPoolInBytes = Size * PAGE_SIZE * 1024; + MmSizeOfPagedPoolInPages = MmSizeOfPagedPoolInBytes >> PAGE_SHIFT; + + // + // Let's be really sure this doesn't overflow into nonpaged system VA + // + ASSERT((MmSizeOfPagedPoolInBytes + (ULONG_PTR)MmPagedPoolStart) <= + (ULONG_PTR)MmNonPagedSystemStart); + + // + // This is where paged pool ends + // + MmPagedPoolEnd = (PVOID)(((ULONG_PTR)MmPagedPoolStart + + MmSizeOfPagedPoolInBytes) - 1); + + // + // So now get the PDE for paged pool and zero it out + // + PointerPde = MiAddressToPde(MmPagedPoolStart); + RtlZeroMemory(PointerPde, + (1 + MiAddressToPde(MmPagedPoolEnd) - PointerPde) * sizeof(MMPTE)); + + // + // Next, get the first and last PTE + // + PointerPte = MiAddressToPte(MmPagedPoolStart); + MmPagedPoolInfo.FirstPteForPagedPool = PointerPte; + MmPagedPoolInfo.LastPteForPagedPool = MiAddressToPte(MmPagedPoolEnd); + + // + // Lock the PFN database + // + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + // + // Allocate a page and map the first paged pool PDE + // + PageFrameIndex = MmAllocPage(MC_NPPOOL); + TempPte.u.Hard.PageFrameNumber = PageFrameIndex; + ASSERT(PointerPde->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPde = TempPte; + + // + // Release the PFN database lock + // + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + + // + // We only have one PDE mapped for now... at fault time, additional PDEs + // will be allocated to handle paged pool growth. This is where they'll have + // to start. + // + MmPagedPoolInfo.NextPdeForPagedPoolExpansion = PointerPde + 1; + + // + // We keep track of each page via a bit, so check how big the bitmap will + // have to be (make sure to align our page count such that it fits nicely + // into a 4-byte aligned bitmap. + // + // We'll also allocate the bitmap header itself part of the same buffer. + // + Size = Size * 1024; + ASSERT(Size == MmSizeOfPagedPoolInPages); + BitMapSize = Size; + Size = sizeof(RTL_BITMAP) + (((Size + 31) / 32) * sizeof(ULONG)); + + // + // Allocate the allocation bitmap, which tells us which regions have not yet + // been mapped into memory + // + MmPagedPoolInfo.PagedPoolAllocationMap = ExAllocatePoolWithTag(NonPagedPool, + Size, + ' mM'); + ASSERT(MmPagedPoolInfo.PagedPoolAllocationMap); + + // + // Initialize it such that at first, only the first page's worth of PTEs is + // marked as allocated (incidentially, the first PDE we allocated earlier). + // + RtlInitializeBitMap(MmPagedPoolInfo.PagedPoolAllocationMap, + (PULONG)(MmPagedPoolInfo.PagedPoolAllocationMap + 1), + BitMapSize); + RtlSetAllBits(MmPagedPoolInfo.PagedPoolAllocationMap); + RtlClearBits(MmPagedPoolInfo.PagedPoolAllocationMap, 0, 1024); + + // + // We have a second bitmap, which keeps track of where allocations end. + // Given the allocation bitmap and a base address, we can therefore figure + // out which page is the last page of that allocation, and thus how big the + // entire allocation is. + // + MmPagedPoolInfo.EndOfPagedPoolBitmap = ExAllocatePoolWithTag(NonPagedPool, + Size, + ' mM'); + ASSERT(MmPagedPoolInfo.EndOfPagedPoolBitmap); + RtlInitializeBitMap(MmPagedPoolInfo.EndOfPagedPoolBitmap, + (PULONG)(MmPagedPoolInfo.EndOfPagedPoolBitmap + 1), + BitMapSize); + + // + // Since no allocations have been made yet, there are no bits set as the end + // + RtlClearAllBits(MmPagedPoolInfo.EndOfPagedPoolBitmap); + + // + // Initialize paged pool. + // + InitializePool(PagedPool, 0); + + /* Default low threshold of 30MB or one fifth of paged pool */ + MiLowPagedPoolThreshold = (30 * _1MB) >> PAGE_SHIFT; + MiLowPagedPoolThreshold = min(MiLowPagedPoolThreshold, Size / 5); + + /* Default high threshold of 60MB or 25% */ + MiHighPagedPoolThreshold = (60 * _1MB) >> PAGE_SHIFT; + MiHighPagedPoolThreshold = min(MiHighPagedPoolThreshold, (Size * 2) / 5); + ASSERT(MiLowPagedPoolThreshold < MiHighPagedPoolThreshold); +} + +NTSTATUS +NTAPI +MmArmInitSystem(IN ULONG Phase, + IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + ULONG i; + BOOLEAN IncludeType[LoaderMaximum]; + PVOID Bitmap; + PPHYSICAL_MEMORY_RUN Run; + PFN_NUMBER PageCount; + + // + // Instantiate memory that we don't consider RAM/usable + // We use the same exclusions that Windows does, in order to try to be + // compatible with WinLDR-style booting + // + for (i = 0; i < LoaderMaximum; i++) IncludeType[i] = TRUE; + IncludeType[LoaderBad] = FALSE; + IncludeType[LoaderFirmwarePermanent] = FALSE; + IncludeType[LoaderSpecialMemory] = FALSE; + IncludeType[LoaderBBTMemory] = FALSE; + if (Phase == 0) + { + /* Initialize the phase 0 temporary event */ + KeInitializeEvent(&MiTempEvent, NotificationEvent, FALSE); + + /* Set all the events to use the temporary event for now */ + MiLowMemoryEvent = &MiTempEvent; + MiHighMemoryEvent = &MiTempEvent; + MiLowPagedPoolEvent = &MiTempEvent; + MiHighPagedPoolEvent = &MiTempEvent; + MiLowNonPagedPoolEvent = &MiTempEvent; + MiHighNonPagedPoolEvent = &MiTempEvent; + + // + // Define the basic user vs. kernel address space separation + // + MmSystemRangeStart = (PVOID)KSEG0_BASE; + MmUserProbeAddress = (ULONG_PTR)MmSystemRangeStart - 0x10000; + MmHighestUserAddress = (PVOID)(MmUserProbeAddress - 1); + + // + // Get the size of the boot loader's image allocations and then round + // that region up to a PDE size, so that any PDEs we might create for + // whatever follows are separate from the PDEs that boot loader might've + // already created (and later, we can blow all that away if we want to). + // + MmBootImageSize = KeLoaderBlock->Extension->LoaderPagesSpanned; + MmBootImageSize *= PAGE_SIZE; + MmBootImageSize = (MmBootImageSize + (4 * 1024 * 1024) - 1) & ~((4 * 1024 * 1024) - 1); + ASSERT((MmBootImageSize % (4 * 1024 * 1024)) == 0); + + // + // Set the size of session view, pool, and image + // + MmSessionSize = MI_SESSION_SIZE; + MmSessionViewSize = MI_SESSION_VIEW_SIZE; + MmSessionPoolSize = MI_SESSION_POOL_SIZE; + MmSessionImageSize = MI_SESSION_IMAGE_SIZE; + + // + // Set the size of system view + // + MmSystemViewSize = MI_SYSTEM_VIEW_SIZE; + + // + // This is where it all ends + // + MiSessionImageEnd = (PVOID)PTE_BASE; + + // + // This is where we will load Win32k.sys and the video driver + // + MiSessionImageStart = (PVOID)((ULONG_PTR)MiSessionImageEnd - + MmSessionImageSize); + + // + // So the view starts right below the session working set (itself below + // the image area) + // + MiSessionViewStart = (PVOID)((ULONG_PTR)MiSessionImageEnd - + MmSessionImageSize - + MI_SESSION_WORKING_SET_SIZE - + MmSessionViewSize); + + // + // Session pool follows + // + MiSessionPoolEnd = MiSessionViewStart; + MiSessionPoolStart = (PVOID)((ULONG_PTR)MiSessionPoolEnd - + MmSessionPoolSize); + + // + // And it all begins here + // + MmSessionBase = MiSessionPoolStart; + + // + // Sanity check that our math is correct + // + ASSERT((ULONG_PTR)MmSessionBase + MmSessionSize == PTE_BASE); + + // + // Session space ends wherever image session space ends + // + MiSessionSpaceEnd = MiSessionImageEnd; + + // + // System view space ends at session space, so now that we know where + // this is, we can compute the base address of system view space itself. + // + MiSystemViewStart = (PVOID)((ULONG_PTR)MmSessionBase - + MmSystemViewSize); + + + /* Initialize the user mode image list */ + InitializeListHead(&MmLoadedUserImageList); + + /* Initialize the paged pool mutex */ + KeInitializeGuardedMutex(&MmPagedPoolMutex); + + /* Initialize the Loader Lock */ + KeInitializeMutant(&MmSystemLoadLock, FALSE); + + // + // Count physical pages on the system + // + PageCount = MiPagesInLoaderBlock(LoaderBlock, IncludeType); + + // + // Check if this is a machine with less than 19MB of RAM + // + if (PageCount < MI_MIN_PAGES_FOR_SYSPTE_TUNING) + { + // + // Use the very minimum of system PTEs + // + MmNumberOfSystemPtes = 7000; + } + else + { + // + // Use the default, but check if we have more than 32MB of RAM + // + MmNumberOfSystemPtes = 11000; + if (PageCount > MI_MIN_PAGES_FOR_SYSPTE_BOOST) + { + // + // Double the amount of system PTEs + // + MmNumberOfSystemPtes <<= 1; + } + } + + DPRINT("System PTE count has been tuned to %d (%d bytes)\n", + MmNumberOfSystemPtes, MmNumberOfSystemPtes * PAGE_SIZE); + + /* Initialize the platform-specific parts */ + MiInitMachineDependent(LoaderBlock); + + // + // Sync us up with ReactOS Mm + // + MiSyncARM3WithROS(MmNonPagedSystemStart, (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); + MiSyncARM3WithROS(MmPfnDatabase[0], (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); + MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1)); + + // + // Build the physical memory block + // + MmPhysicalMemoryBlock = MmInitializeMemoryLimits(LoaderBlock, + IncludeType); + + // + // Allocate enough buffer for the PFN bitmap + // Align it up to a 32-bit boundary + // + Bitmap = ExAllocatePoolWithTag(NonPagedPool, + (((MmHighestPhysicalPage + 1) + 31) / 32) * 4, + ' mM'); + if (!Bitmap) + { + // + // This is critical + // + KeBugCheckEx(INSTALL_MORE_MEMORY, + MmNumberOfPhysicalPages, + MmLowestPhysicalPage, + MmHighestPhysicalPage, + 0x101); + } + + // + // Initialize it and clear all the bits to begin with + // + RtlInitializeBitMap(&MiPfnBitMap, + Bitmap, + MmHighestPhysicalPage + 1); + RtlClearAllBits(&MiPfnBitMap); + + // + // Loop physical memory runs + // + for (i = 0; i < MmPhysicalMemoryBlock->NumberOfRuns; i++) + { + // + // Get the run + // + Run = &MmPhysicalMemoryBlock->Run[i]; + DPRINT("PHYSICAL RAM [0x%08p to 0x%08p]\n", + Run->BasePage << PAGE_SHIFT, + (Run->BasePage + Run->PageCount) << PAGE_SHIFT); + + // + // Make sure it has pages inside it + // + if (Run->PageCount) + { + // + // Set the bits in the PFN bitmap + // + RtlSetBits(&MiPfnBitMap, Run->BasePage, Run->PageCount); + } + } + + // + // Size up paged pool and build the shadow system page directory + // + MiBuildPagedPool(); + + /* Check how many pages the system has */ + if (MmNumberOfPhysicalPages <= (13 * _1MB)) + { + /* Set small system */ + MmSystemSize = MmSmallSystem; + } + else if (MmNumberOfPhysicalPages <= (19 * _1MB)) + { + /* Set small system */ + MmSystemSize = MmSmallSystem; + } + else + { + /* Set medium system */ + MmSystemSize = MmMediumSystem; + } + + /* Check for more than 32MB */ + if (MmNumberOfPhysicalPages >= ((32 * _1MB) / PAGE_SIZE)) + { + /* Check for product type being "Wi" for WinNT */ + if (MmProductType == '\0i\0W') + { + /* Then this is a large system */ + MmSystemSize = MmLargeSystem; + } + else + { + /* For servers, we need 64MB to consider this as being large */ + if (MmNumberOfPhysicalPages >= ((64 * _1MB) / PAGE_SIZE)) + { + /* Set it as large */ + MmSystemSize = MmLargeSystem; + } + } + } + + /* Now setup the shared user data fields */ + ASSERT(SharedUserData->NumberOfPhysicalPages == 0); + SharedUserData->NumberOfPhysicalPages = MmNumberOfPhysicalPages; + SharedUserData->LargePageMinimum = 0; + + /* Check for workstation (Wi for WinNT) */ + if (MmProductType == '\0i\0W') + { + /* Set Windows NT Workstation product type */ + SharedUserData->NtProductType = NtProductWinNt; + MmProductType = 0; + } + else + { + /* Check for LanMan server */ + if (MmProductType == '\0a\0L') + { + /* This is a domain controller */ + SharedUserData->NtProductType = NtProductLanManNt; + } + else + { + /* Otherwise it must be a normal server */ + SharedUserData->NtProductType = NtProductServer; + } + + /* Set the product type, and make the system more aggressive with low memory */ + MmProductType = 1; + MmMinimumFreePages = 81; + } + + /* Update working set tuning parameters */ + MiAdjustWorkingSetManagerParameters(!MmProductType); + } + + // + // Always return success for now + // + return STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/mmsup.c b/reactos/ntoskrnl/mm/ARM3/mmsup.c index ec7660cab66..45c9f0a6863 100644 --- a/reactos/ntoskrnl/mm/ARM3/mmsup.c +++ b/reactos/ntoskrnl/mm/ARM3/mmsup.c @@ -16,11 +16,6 @@ #define MODULE_INVOLVED_IN_ARM3 #include "../ARM3/miarm.h" -/* GLOBALS ********************************************************************/ - -BOOLEAN IsThisAnNtAsSystem = FALSE; -MM_SYSTEMSIZE MmSystemSize = MmSmallSystem; - /* PUBLIC FUNCTIONS ***********************************************************/ /* @@ -139,10 +134,8 @@ BOOLEAN NTAPI MmIsThisAnNtAsSystem(VOID) { - // - // Return if this is a server system - // - return IsThisAnNtAsSystem; + /* Return if this is a server system */ + return MmProductType; } /* @@ -152,9 +145,7 @@ MM_SYSTEMSIZE NTAPI MmQuerySystemSize(VOID) { - // - // Return the low, medium or high memory system type - // + /* Return the low, medium or high memory system type */ return MmSystemSize; } diff --git a/reactos/ntoskrnl/mm/ARM3/ncache.c b/reactos/ntoskrnl/mm/ARM3/ncache.c index 15701bed74b..f43d10afd51 100644 --- a/reactos/ntoskrnl/mm/ARM3/ncache.c +++ b/reactos/ntoskrnl/mm/ARM3/ncache.c @@ -108,7 +108,7 @@ MmAllocateNonCachedMemory(IN ULONG NumberOfBytes) // // Setup the template PTE // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; // // Now check what kind of caching we should use diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index 7fad6ea4584..768ed6dbc2b 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -24,7 +24,7 @@ NTSTATUS FASTCALL MiCheckPdeForPagedPool(IN PVOID Address) { - PMMPTE PointerPde; + PMMPDE PointerPde; NTSTATUS Status = STATUS_SUCCESS; // @@ -37,7 +37,7 @@ MiCheckPdeForPagedPool(IN PVOID Address) // Send a hint to the page fault handler that this is only a valid fault // if we already detected this was access within the page table range // - PointerPde = MiAddressToPte(Address); + PointerPde = (PMMPDE)MiAddressToPte(Address); Status = STATUS_WAIT_1; } else if (Address < MmSystemRangeStart) @@ -97,7 +97,7 @@ MiResolveDemandZeroFault(IN PVOID Address, // // Get a page // - PageFrameNumber = MmAllocPage(MC_PPOOL, 0); + PageFrameNumber = MmAllocPage(MC_PPOOL); DPRINT("New pool page: %lx\n", PageFrameNumber); // @@ -113,7 +113,7 @@ MiResolveDemandZeroFault(IN PVOID Address, // // Build the PTE // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; TempPte.u.Hard.PageFrameNumber = PageFrameNumber; *PointerPte = TempPte; ASSERT(PointerPte->u.Hard.Valid == 1); diff --git a/reactos/ntoskrnl/mm/ARM3/pfnlist.c b/reactos/ntoskrnl/mm/ARM3/pfnlist.c new file mode 100644 index 00000000000..58043400af6 --- /dev/null +++ b/reactos/ntoskrnl/mm/ARM3/pfnlist.c @@ -0,0 +1,382 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/ARM3/pfnlist.c + * PURPOSE: ARM Memory Manager PFN List Manipulation + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +#line 15 "ARM³::PFNLIST" +#define MODULE_INVOLVED_IN_ARM3 +#include "../ARM3/miarm.h" + +/* GLOBALS ********************************************************************/ + +MMPFNLIST MmZeroedPageListHead = {0, ZeroedPageList, LIST_HEAD, LIST_HEAD}; +MMPFNLIST MmFreePageListHead = {0, FreePageList, LIST_HEAD, LIST_HEAD}; +MMPFNLIST MmStandbyPageListHead = {0, StandbyPageList, LIST_HEAD, LIST_HEAD}; +MMPFNLIST MmModifiedPageListHead = {0, ModifiedPageList, LIST_HEAD, LIST_HEAD}; +MMPFNLIST MmModifiedNoWritePageListHead = {0, ModifiedNoWritePageList, LIST_HEAD, LIST_HEAD}; +MMPFNLIST MmBadPageListHead = {0, BadPageList, LIST_HEAD, LIST_HEAD}; +MMPFNLIST MmRomPageListHead = {0, StandbyPageList, LIST_HEAD, LIST_HEAD}; + +PMMPFNLIST MmPageLocationList[] = +{ + &MmZeroedPageListHead, + &MmFreePageListHead, + &MmStandbyPageListHead, + &MmModifiedPageListHead, + &MmModifiedNoWritePageListHead, + &MmBadPageListHead, + NULL, + NULL +}; +/* FUNCTIONS ******************************************************************/ + +VOID +NTAPI +MiInsertInListTail(IN PMMPFNLIST ListHead, + IN PMMPFN Entry) +{ + PFN_NUMBER OldBlink, EntryIndex = MiGetPfnEntryIndex(Entry); + + /* Get the back link */ + OldBlink = ListHead->Blink; + if (OldBlink != LIST_HEAD) + { + /* Set the back pointer to point to us now */ + MiGetPfnEntry(OldBlink)->u1.Flink = EntryIndex; + } + else + { + /* Set the list to point to us */ + ListHead->Flink = EntryIndex; + } + + /* Set the entry to point to the list head forwards, and the old page backwards */ + Entry->u1.Flink = LIST_HEAD; + Entry->u2.Blink = OldBlink; + + /* And now the head points back to us, since we are last */ + ListHead->Blink = EntryIndex; + ListHead->Total++; +} + +VOID +NTAPI +MiInsertZeroListAtBack(IN PFN_NUMBER EntryIndex) +{ + PFN_NUMBER OldBlink; + PMMPFNLIST ListHead; + PMMPFN Pfn1; +#if 0 + PMMPFN Blink; + ULONG Color; + PMMCOLOR_TABLES ColorHead; +#endif + + /* Make sure the PFN lock is held */ + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + + /* Get the descriptor */ + Pfn1 = MiGetPfnEntry(EntryIndex); + ASSERT(Pfn1->u3.e2.ReferenceCount == 0); + ASSERT(Pfn1->u4.MustBeCached == 0); + ASSERT(Pfn1->u3.e1.Rom == 0); + ASSERT(Pfn1->u3.e1.RemovalRequested == 0); + ASSERT(Pfn1->u4.InPageError == 0); + + /* Use the zero list */ + ListHead = &MmZeroedPageListHead; + ListHead->Total++; + + /* Get the back link */ + OldBlink = ListHead->Blink; + if (OldBlink != LIST_HEAD) + { + /* Set the back pointer to point to us now */ + MiGetPfnEntry(OldBlink)->u1.Flink = EntryIndex; + } + else + { + /* Set the list to point to us */ + ListHead->Flink = EntryIndex; + } + + /* Set the entry to point to the list head forwards, and the old page backwards */ + Pfn1->u1.Flink = LIST_HEAD; + Pfn1->u2.Blink = OldBlink; + + /* And now the head points back to us, since we are last */ + ListHead->Blink = EntryIndex; + + /* Update the page location */ + Pfn1->u3.e1.PageLocation = ZeroedPageList; + + /* FIXME: NOT YET Due to caller semantics: Update the available page count */ + //MmAvailablePages++; + + /* Check if we've reached the configured low memory threshold */ + if (MmAvailablePages == MmLowMemoryThreshold) + { + /* Clear the event, because now we're ABOVE the threshold */ + KeClearEvent(MiLowMemoryEvent); + } + else if (MmAvailablePages == MmHighMemoryThreshold) + { + /* Otherwise check if we reached the high threshold and signal the event */ + KeSetEvent(MiHighMemoryEvent, 0, FALSE); + } +#if 0 + /* Get the page color */ + Color = EntryIndex & MmSecondaryColorMask; + + /* Get the first page on the color list */ + ColorHead = &MmFreePagesByColor[ZeroedPageList][Color]; + if (ColorHead->Flink == LIST_HEAD) + { + /* The list is empty, so we are the first page */ + Pfn1->u4.PteFrame = -1; + ColorHead->Flink = EntryIndex; + } + else + { + /* Get the previous page */ + Blink = (PMMPFN)ColorHead->Blink; + + /* Make it link to us */ + Pfn1->u4.PteFrame = MiGetPfnEntryIndex(Blink); + Blink->OriginalPte.u.Long = EntryIndex; + } + + /* Now initialize our own list pointers */ + ColorHead->Blink = Pfn1; + Pfn1->OriginalPte.u.Long = LIST_HEAD; + + /* And increase the count in the colored list */ + ColorHead->Count++; +#endif +} + +VOID +NTAPI +MiUnlinkFreeOrZeroedPage(IN PMMPFN Entry) +{ + PFN_NUMBER OldFlink, OldBlink; + PMMPFNLIST ListHead; + MMLISTS ListName; + + /* Make sure the PFN lock is held */ + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + + /* Make sure the PFN entry isn't in-use */ + ASSERT(Entry->u3.e1.WriteInProgress == 0); + ASSERT(Entry->u3.e1.ReadInProgress == 0); + + /* Find the list for this entry, make sure it's the free or zero list */ + ListHead = MmPageLocationList[Entry->u3.e1.PageLocation]; + ListName = ListHead->ListName; + ASSERT(ListHead != NULL); + ASSERT(ListName <= FreePageList); + + /* Remove one count */ + ASSERT(ListHead->Total != 0); + ListHead->Total--; + + /* Get the forward and back pointers */ + OldFlink = Entry->u1.Flink; + OldBlink = Entry->u2.Blink; + + /* Check if the next entry is the list head */ + if (OldFlink != LIST_HEAD) + { + /* It is not, so set the backlink of the actual entry, to our backlink */ + MiGetPfnEntry(OldFlink)->u2.Blink = OldBlink; + } + else + { + /* Set the list head's backlink instead */ + ListHead->Blink = OldFlink; + } + + /* Check if the back entry is the list head */ + if (OldBlink != LIST_HEAD) + { + /* It is not, so set the backlink of the actual entry, to our backlink */ + MiGetPfnEntry(OldBlink)->u1.Flink = OldFlink; + } + else + { + /* Set the list head's backlink instead */ + ListHead->Flink = OldFlink; + } + + /* We are not on a list anymore */ + Entry->u1.Flink = Entry->u2.Blink = 0; + + /* FIXME: Deal with color list */ + + /* See if we hit any thresholds */ + if (MmAvailablePages == MmHighMemoryThreshold) + { + /* Clear the high memory event */ + KeClearEvent(MiHighMemoryEvent); + } + else if (MmAvailablePages == MmLowMemoryThreshold) + { + /* Signal the low memory event */ + KeSetEvent(MiLowMemoryEvent, 0, FALSE); + } + + /* One less page */ + if (--MmAvailablePages < MmMinimumFreePages) + { + /* FIXME: Should wake up the MPW and working set manager, if we had one */ + } +} + +PMMPFN +NTAPI +MiRemoveHeadList(IN PMMPFNLIST ListHead) +{ + PFN_NUMBER Entry, Flink; + PMMPFN Pfn1; + + /* Get the entry that's currently first on the list */ + Entry = ListHead->Flink; + Pfn1 = MiGetPfnEntry(Entry); + + /* Make the list point to the entry following the first one */ + Flink = Pfn1->u1.Flink; + ListHead->Flink = Flink; + + /* Check if the next entry is actually the list head */ + if (ListHead->Flink != LIST_HEAD) + { + /* It isn't, so therefore whoever is coming next points back to the head */ + MiGetPfnEntry(Flink)->u2.Blink = LIST_HEAD; + } + else + { + /* Then the list is empty, so the backlink should point back to us */ + ListHead->Blink = LIST_HEAD; + } + + /* We are not on a list anymore */ + Pfn1->u1.Flink = Pfn1->u2.Blink = 0; + ListHead->Total--; + + /* Return the head element */ + return Pfn1; +} + +VOID +NTAPI +MiInsertPageInFreeList(IN PFN_NUMBER PageFrameIndex) +{ + PMMPFNLIST ListHead; + PFN_NUMBER LastPage; + PMMPFN Pfn1, Blink; + ULONG Color; + PMMCOLOR_TABLES ColorHead; + + /* Make sure the page index is valid */ + ASSERT((PageFrameIndex != 0) && + (PageFrameIndex <= MmHighestPhysicalPage) && + (PageFrameIndex >= MmLowestPhysicalPage)); + + /* Get the PFN entry */ + Pfn1 = MI_PFN_TO_PFNENTRY(PageFrameIndex); + + /* Sanity checks that a right kind of page is being inserted here */ + ASSERT(Pfn1->u4.MustBeCached == 0); + ASSERT(Pfn1->u3.e1.Rom != 1); + ASSERT(Pfn1->u3.e1.RemovalRequested == 0); + ASSERT(Pfn1->u4.VerifierAllocation == 0); + ASSERT(Pfn1->u3.e2.ReferenceCount == 0); + + /* Get the free page list and increment its count */ + ListHead = &MmFreePageListHead; + ListHead->Total++; + + /* Get the last page on the list */ + LastPage = ListHead->Blink; + if (LastPage != LIST_HEAD) + { + /* Link us with the previous page, so we're at the end now */ + MI_PFN_TO_PFNENTRY(LastPage)->u1.Flink = PageFrameIndex; + } + else + { + /* The list is empty, so we are the first page */ + ListHead->Flink = PageFrameIndex; + } + + /* Now make the list head point back to us (since we go at the end) */ + ListHead->Blink = PageFrameIndex; + + /* And initialize our own list pointers */ + Pfn1->u1.Flink = LIST_HEAD; + Pfn1->u2.Blink = LastPage; + + /* Set the list name and default priority */ + Pfn1->u3.e1.PageLocation = FreePageList; + Pfn1->u4.Priority = 3; + + /* Clear some status fields */ + Pfn1->u4.InPageError = 0; + Pfn1->u4.AweAllocation = 0; + + /* Not yet until we switch to this */ + //MmAvailablePages++; + + /* Check if we've reached the configured low memory threshold */ + if (MmAvailablePages == MmLowMemoryThreshold) + { + /* Clear the event, because now we're ABOVE the threshold */ + KeClearEvent(MiLowMemoryEvent); + } + else if (MmAvailablePages == MmHighMemoryThreshold) + { + /* Otherwise check if we reached the high threshold and signal the event */ + KeSetEvent(MiHighMemoryEvent, 0, FALSE); + } + + /* Get the page color */ + Color = PageFrameIndex & MmSecondaryColorMask; + + /* Get the first page on the color list */ + ColorHead = &MmFreePagesByColor[FreePageList][Color]; + if (ColorHead->Flink == LIST_HEAD) + { + /* The list is empty, so we are the first page */ + Pfn1->u4.PteFrame = -1; + ColorHead->Flink = PageFrameIndex; + } + else + { + /* Get the previous page */ + Blink = (PMMPFN)ColorHead->Blink; + + /* Make it link to us */ + Pfn1->u4.PteFrame = MI_PFNENTRY_TO_PFN(Blink); + Blink->OriginalPte.u.Long = PageFrameIndex; + } + + /* Now initialize our own list pointers */ + ColorHead->Blink = Pfn1; + Pfn1->OriginalPte.u.Long = LIST_HEAD; + + /* And increase the count in the colored list */ + ColorHead->Count++; + + /* FIXME: Notify zero page thread if enough pages are on the free list now */ +} + +/* EOF */ diff --git a/reactos/ntoskrnl/mm/ARM3/pool.c b/reactos/ntoskrnl/mm/ARM3/pool.c index bfb75dfe3e7..bd2f826c6d2 100644 --- a/reactos/ntoskrnl/mm/ARM3/pool.c +++ b/reactos/ntoskrnl/mm/ARM3/pool.c @@ -31,7 +31,97 @@ ULONG MmSpecialPoolTag; VOID NTAPI -MiInitializeArmPool(VOID) +MiInitializeNonPagedPoolThresholds(VOID) +{ + PFN_NUMBER Size = MmMaximumNonPagedPoolInPages; + + /* Default low threshold of 8MB or one third of nonpaged pool */ + MiLowNonPagedPoolThreshold = (8 * _1MB) >> PAGE_SHIFT; + MiLowNonPagedPoolThreshold = min(MiLowNonPagedPoolThreshold, Size / 3); + + /* Default high threshold of 20MB or 50% */ + MiHighNonPagedPoolThreshold = (20 * _1MB) >> PAGE_SHIFT; + MiHighNonPagedPoolThreshold = min(MiHighNonPagedPoolThreshold, Size / 2); + ASSERT(MiLowNonPagedPoolThreshold < MiHighNonPagedPoolThreshold); +} + +VOID +NTAPI +MiInitializePoolEvents(VOID) +{ + KIRQL OldIrql; + PFN_NUMBER FreePoolInPages; + + /* Lock paged pool */ + KeAcquireGuardedMutex(&MmPagedPoolMutex); + + /* Total size of the paged pool minus the allocated size, is free */ + FreePoolInPages = MmSizeOfPagedPoolInPages - MmPagedPoolInfo.AllocatedPagedPool; + + /* Check the initial state high state */ + if (FreePoolInPages >= MiHighPagedPoolThreshold) + { + /* We have plenty of pool */ + KeSetEvent(MiHighPagedPoolEvent, 0, FALSE); + } + else + { + /* We don't */ + KeClearEvent(MiHighPagedPoolEvent); + } + + /* Check the initial low state */ + if (FreePoolInPages <= MiLowPagedPoolThreshold) + { + /* We're very low in free pool memory */ + KeSetEvent(MiLowPagedPoolEvent, 0, FALSE); + } + else + { + /* We're not */ + KeClearEvent(MiLowPagedPoolEvent); + } + + /* Release the paged pool lock */ + KeReleaseGuardedMutex(&MmPagedPoolMutex); + + /* Now it's time for the nonpaged pool lock */ + OldIrql = KeAcquireQueuedSpinLock(LockQueueMmNonPagedPoolLock); + + /* Free pages are the maximum minus what's been allocated */ + FreePoolInPages = MmMaximumNonPagedPoolInPages - MmAllocatedNonPagedPool; + + /* Check if we have plenty */ + if (FreePoolInPages >= MiHighNonPagedPoolThreshold) + { + /* We do, set the event */ + KeSetEvent(MiHighNonPagedPoolEvent, 0, FALSE); + } + else + { + /* We don't, clear the event */ + KeClearEvent(MiHighNonPagedPoolEvent); + } + + /* Check if we have very little */ + if (FreePoolInPages <= MiLowNonPagedPoolThreshold) + { + /* We do, set the event */ + KeSetEvent(MiLowNonPagedPoolEvent, 0, FALSE); + } + else + { + /* We don't, clear it */ + KeClearEvent(MiLowNonPagedPoolEvent); + } + + /* We're done, release the nonpaged pool lock */ + KeReleaseQueuedSpinLock(LockQueueMmNonPagedPoolLock, OldIrql); +} + +VOID +NTAPI +MiInitializeNonPagedPool(VOID) { ULONG i; PFN_NUMBER PoolPages; @@ -213,7 +303,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // // Get the template PTE we'll use to expand // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; // // Get the first PTE in expansion space @@ -236,7 +326,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // // Request a paged pool page and write the PFN for it // - PageFrameNumber = MmAllocPage(MC_PPOOL, 0); + PageFrameNumber = MmAllocPage(MC_PPOOL); TempPte.u.Hard.PageFrameNumber = PageFrameNumber; // @@ -493,13 +583,13 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // // Loop the pages // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; do { // // Allocate a page // - PageFrameNumber = MmAllocPage(MC_NPPOOL, 0); + PageFrameNumber = MmAllocPage(MC_NPPOOL); // // Get the PFN entry for it diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index c7ddc2b38de..24bd11a2586 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -134,7 +134,7 @@ MmCreateKernelStack(IN BOOLEAN GuiStack, // // Setup the template stack PTE // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; MI_MAKE_LOCAL_PAGE(&TempPte); MI_MAKE_DIRTY_PAGE(&TempPte); TempPte.u.Hard.PageFrameNumber = 0; @@ -158,7 +158,7 @@ MmCreateKernelStack(IN BOOLEAN GuiStack, // // Get a page // - PageFrameIndex = MmAllocPage(MC_NPPOOL, 0); + PageFrameIndex = MmAllocPage(MC_NPPOOL); TempPte.u.Hard.PageFrameNumber = PageFrameIndex; // @@ -234,7 +234,7 @@ MmGrowKernelStackEx(IN PVOID StackPointer, // // Setup the template stack PTE // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; MI_MAKE_LOCAL_PAGE(&TempPte); MI_MAKE_DIRTY_PAGE(&TempPte); TempPte.u.Hard.PageFrameNumber = 0; @@ -257,7 +257,7 @@ MmGrowKernelStackEx(IN PVOID StackPointer, // // Get a page // - PageFrameIndex = MmAllocPage(MC_NPPOOL, 0); + PageFrameIndex = MmAllocPage(MC_NPPOOL); TempPte.u.Hard.PageFrameNumber = PageFrameIndex; // diff --git a/reactos/ntoskrnl/mm/anonmem.c b/reactos/ntoskrnl/mm/anonmem.c index 0ffb2ee0ed7..56453521d3a 100644 --- a/reactos/ntoskrnl/mm/anonmem.c +++ b/reactos/ntoskrnl/mm/anonmem.c @@ -258,7 +258,6 @@ MmNotPresentFaultVirtualMemory(PMMSUPPORT AddressSpace, PMM_REGION Region; PMM_PAGEOP PageOp; PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace); - KIRQL OldIrql; /* * There is a window between taking the page fault and locking the @@ -267,12 +266,6 @@ MmNotPresentFaultVirtualMemory(PMMSUPPORT AddressSpace, */ if (MmIsPagePresent(NULL, Address)) { - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(MmGetPfnForProcess(NULL, Address)); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } return(STATUS_SUCCESS); } @@ -363,12 +356,6 @@ MmNotPresentFaultVirtualMemory(PMMSUPPORT AddressSpace, return(Status); } MmLockAddressSpace(AddressSpace); - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(MmGetPfnForProcess(NULL, Address)); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); MmReleasePageOp(PageOp); return(STATUS_SUCCESS); @@ -440,12 +427,6 @@ MmNotPresentFaultVirtualMemory(PMMSUPPORT AddressSpace, /* * Finish the operation */ - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } PageOp->Status = STATUS_SUCCESS; KeSetEvent(&PageOp->CompletionEvent, IO_NO_INCREMENT, FALSE); MmReleasePageOp(PageOp); diff --git a/reactos/ntoskrnl/mm/arm/page.c b/reactos/ntoskrnl/mm/arm/page.c new file mode 100644 index 00000000000..27761ec18b1 --- /dev/null +++ b/reactos/ntoskrnl/mm/arm/page.c @@ -0,0 +1,291 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/mm/arm/page.c + * PURPOSE: Old-school Page Management + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS ********************************************************************/ + +ULONG MmGlobalKernelPageDirectory[4096]; +MMPDE HyperTemplatePde; + +/* PRIVATE FUNCTIONS **********************************************************/ + +VOID +NTAPI +MiFlushTlb(IN PMMPTE PointerPte, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); +} + +BOOLEAN +NTAPI +MmCreateProcessAddressSpace(IN ULONG MinWs, + IN PEPROCESS Process, + IN PULONG DirectoryTableBase) +{ + UNIMPLEMENTED; + while (TRUE); + return FALSE; +} + +VOID +NTAPI +MmUpdatePageDir(IN PEPROCESS Process, + IN PVOID Address, + IN ULONG Size) +{ + /* Nothing to do */ + return; +} + +NTSTATUS +NTAPI +Mmi386ReleaseMmInfo(IN PEPROCESS Process) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +NTSTATUS +NTAPI +MmInitializeHandBuiltProcess(IN PEPROCESS Process, + IN PULONG DirectoryTableBase) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_SUCCESS; +} + +PULONG +NTAPI +MmGetPageDirectory(VOID) +{ + /* Return the TTB */ + return (PULONG)KeArmTranslationTableRegisterGet().AsUlong; +} + +VOID +NTAPI +MmDisableVirtualMapping(IN PEPROCESS Process, + IN PVOID Address, + OUT PBOOLEAN WasDirty, + OUT PPFN_TYPE Page) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +MmEnableVirtualMapping(IN PEPROCESS Process, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); +} + +NTSTATUS +NTAPI +MmCreateVirtualMappingUnsafe(IN PEPROCESS Process, + IN PVOID Address, + IN ULONG Protection, + IN PPFN_TYPE Pages, + IN ULONG PageCount) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +MmCreateVirtualMapping(IN PEPROCESS Process, + IN PVOID Address, + IN ULONG Protection, + IN PPFN_TYPE Pages, + IN ULONG PageCount) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_SUCCESS; +} + +VOID +NTAPI +MmRawDeleteVirtualMapping(IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +MmDeleteVirtualMapping(IN PEPROCESS Process, + IN PVOID Address, + IN BOOLEAN FreePage, + OUT PBOOLEAN WasDirty, + OUT PPFN_TYPE Page) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +MmDeletePageFileMapping(IN PEPROCESS Process, + IN PVOID Address, + IN SWAPENTRY *SwapEntry) +{ + UNIMPLEMENTED; + while (TRUE); +} + +NTSTATUS +NTAPI +MmCreatePageFileMapping(IN PEPROCESS Process, + IN PVOID Address, + IN SWAPENTRY SwapEntry) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +PFN_TYPE +NTAPI +MmGetPfnForProcess(IN PEPROCESS Process, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +BOOLEAN +NTAPI +MmIsDirtyPage(IN PEPROCESS Process, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); + return 0; +} + +VOID +NTAPI +MmSetCleanPage(IN PEPROCESS Process, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); +} + +VOID +NTAPI +MmSetDirtyPage(IN PEPROCESS Process, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); +} + +BOOLEAN +NTAPI +MmIsPagePresent(IN PEPROCESS Process, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); + return FALSE; +} + +BOOLEAN +NTAPI +MmIsPageSwapEntry(IN PEPROCESS Process, + IN PVOID Address) +{ + UNIMPLEMENTED; + while (TRUE); + return FALSE; +} + +ULONG +NTAPI +MmGetPageProtect(IN PEPROCESS Process, + IN PVOID Address) +{ + /* We don't enforce any protection on the pages -- they are all RWX */ + return PAGE_READWRITE; +} + +VOID +NTAPI +MmSetPageProtect(IN PEPROCESS Process, + IN PVOID Address, + IN ULONG Protection) +{ + /* We don't enforce any protection on the pages -- they are all RWX */ + return; +} + +VOID +NTAPI +MmInitGlobalKernelPageDirectory(VOID) +{ + ULONG i; + PULONG CurrentPageDirectory = (PULONG)PDE_BASE; + extern MMPTE HyperTemplatePte; + + /* Setup PTE template */ + HyperTemplatePte.u.Long = 0; + HyperTemplatePte.u.Hard.Valid = 1; + HyperTemplatePte.u.Hard.Access = 1; + + /* Setup PDE template */ + HyperTemplatePde.u.Long = 0; + HyperTemplatePde.u.Hard.Valid = 1; + + /* Loop the 2GB of address space which belong to the kernel */ + for (i = MiGetPdeOffset(MmSystemRangeStart); i < 2048; i++) + { + /* Check if we have an entry for this already */ + if ((i != MiGetPdeOffset(PTE_BASE)) && + (i != MiGetPdeOffset(HYPER_SPACE)) && + (!MmGlobalKernelPageDirectory[i]) && + (CurrentPageDirectory[i])) + { + /* We don't, link it in our global page directory */ + MmGlobalKernelPageDirectory[i] = CurrentPageDirectory[i]; + } + } +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @implemented + */ +PHYSICAL_ADDRESS +NTAPI +MmGetPhysicalAddress(IN PVOID Address) +{ + PHYSICAL_ADDRESS PhysicalAddress; + PhysicalAddress.QuadPart = 0; + + UNIMPLEMENTED; + while (TRUE); + + return PhysicalAddress; +} diff --git a/reactos/ntoskrnl/mm/balance.c b/reactos/ntoskrnl/mm/balance.c index 853af294b77..d786f768e3a 100644 --- a/reactos/ntoskrnl/mm/balance.c +++ b/reactos/ntoskrnl/mm/balance.c @@ -120,6 +120,7 @@ MmReleasePageMemoryConsumer(ULONG Consumer, PFN_NUMBER Page) if (IsListEmpty(&AllocationListHead) || MmAvailablePages < MiMinimumAvailablePages) { KeReleaseSpinLock(&AllocationListLock, OldIrql); + if(Consumer == MC_USER) MmRemoveLRUUserPage(Page); OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); MmDereferencePage(Page); KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); @@ -188,11 +189,6 @@ MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages) Target--; (*NrFreedPages)++; } - else if (Status == STATUS_PAGEFILE_QUOTA) - { - MmRemoveLRUUserPage(CurrentPage); - MmInsertLRULastUserPage(CurrentPage); - } CurrentPage = NextPage; } @@ -232,6 +228,8 @@ MiIsBalancerThread(VOID) PsGetCurrentThread() == MiBalancerThreadId.UniqueThread; } +VOID NTAPI MiSetConsumer(IN PFN_TYPE Pfn, IN ULONG Consumer); + NTSTATUS NTAPI MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, @@ -262,7 +260,7 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, if ((Consumer == MC_NPPOOL) || (Consumer == MC_SYSTEM) || MiIsBalancerThread()) { OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - Page = MmAllocPage(Consumer, 0); + Page = MmAllocPage(Consumer); KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); if (Page == 0) { @@ -316,8 +314,8 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, { KeBugCheck(NO_PAGES_AVAILABLE); } - /* Update the Consumer */ - MiGetPfnEntry(Page)->u3.e1.PageLocation = Consumer; + /* Update the Consumer and make the page active */ + MiSetConsumer(Page, Consumer); if(Consumer == MC_USER) MmInsertLRULastUserPage(Page); *AllocatedPage = Page; (void)InterlockedDecrementUL(&MiPagesRequired); @@ -328,7 +326,7 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, * Actually allocate the page. */ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - Page = MmAllocPage(Consumer, 0); + Page = MmAllocPage(Consumer); KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); if (Page == 0) { diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index 894fb232ecf..0221fc77721 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -21,21 +21,20 @@ #define MODULE_INVOLVED_IN_ARM3 #include "ARM3/miarm.h" -/* TYPES *******************************************************************/ - -#define MM_PHYSICAL_PAGE_FREE (0x1) -#define MM_PHYSICAL_PAGE_USED (0x2) - /* GLOBALS ****************************************************************/ // // // ReactOS to NT Physical Page Descriptor Entry Legacy Mapping Definitions // +// REACTOS NT +// +#define RmapListHead AweReferenceCount +#define PHYSICAL_PAGE MMPFN +#define PPHYSICAL_PAGE PMMPFN -typedef union -{ - MMPFN Pfn; +/* The first array contains ReactOS PFNs, the second contains ARM3 PFNs */ +PPHYSICAL_PAGE MmPfnDatabase[2]; struct { @@ -81,97 +80,94 @@ SIZE_T MmSharedCommit; SIZE_T MmDriverCommit; SIZE_T MmProcessCommit; SIZE_T MmPagedPoolCommit; -SIZE_T MmPeakCommitment; +SIZE_T MmPeakCommitment; SIZE_T MmtotalCommitLimitMaximum; -MMPFNLIST MmZeroedPageListHead; -MMPFNLIST MmFreePageListHead; -MMPFNLIST MmStandbyPageListHead; -MMPFNLIST MmModifiedPageListHead; -MMPFNLIST MmModifiedNoWritePageListHead; - -/* List of pages allocated to the MC_USER Consumer */ -static LIST_ENTRY UserPageListHead; -/* List of pages zeroed by the ZPW (MmZeroPageThreadMain) */ -static LIST_ENTRY FreeZeroedPageListHead; -/* List of free pages, filled by MmGetReferenceCountPage and - * and MmInitializePageList */ -static LIST_ENTRY FreeUnzeroedPageListHead; - static KEVENT ZeroPageThreadEvent; static BOOLEAN ZeroPageThreadShouldTerminate = FALSE; - -static ULONG UnzeroedPageCount = 0; +static RTL_BITMAP MiUserPfnBitMap; /* FUNCTIONS *************************************************************/ -PFN_NUMBER +VOID +NTAPI +MiInitializeUserPfnBitmap(VOID) +{ + PVOID Bitmap; + + /* Allocate enough buffer for the PFN bitmap and align it on 32-bits */ + Bitmap = ExAllocatePoolWithTag(NonPagedPool, + (((MmHighestPhysicalPage + 1) + 31) / 32) * 4, + ' mM'); + ASSERT(Bitmap); + + /* Initialize it and clear all the bits to begin with */ + RtlInitializeBitMap(&MiUserPfnBitMap, + Bitmap, + MmHighestPhysicalPage + 1); + RtlClearAllBits(&MiUserPfnBitMap); +} + +PFN_TYPE NTAPI MmGetLRUFirstUserPage(VOID) { - PLIST_ENTRY NextListEntry; - PHYSICAL_PAGE* PageDescriptor; - KIRQL oldIrql; - - oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - NextListEntry = UserPageListHead.Flink; - if (NextListEntry == &UserPageListHead) - { - KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - return 0; - } - PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry); - ASSERT_PFN(&PageDescriptor->Pfn); - KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - return PageDescriptor - MmPfnDatabase; + ULONG Position; + KIRQL OldIrql; + + /* Find the first user page */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + Position = RtlFindSetBits(&MiUserPfnBitMap, 1, 0); + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + if (Position == 0xFFFFFFFF) return 0; + + /* Return it */ + return Position; } VOID NTAPI MmInsertLRULastUserPage(PFN_NUMBER Pfn) { - KIRQL oldIrql; - PPHYSICAL_PAGE Page; + KIRQL OldIrql; - oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - Page = MiGetPfnEntry(Pfn); - ASSERT(Page); - ASSERT(Page->Flags.Type == MM_PHYSICAL_PAGE_USED); - ASSERT(Page->Flags.Consumer == MC_USER); - InsertTailList(&UserPageListHead, &Page->ListEntry); - KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); + /* Set the page as a user page */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + RtlSetBit(&MiUserPfnBitMap, Pfn); + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); } PFN_NUMBER NTAPI MmGetLRUNextUserPage(PFN_NUMBER PreviousPfn) { - PLIST_ENTRY NextListEntry; - PHYSICAL_PAGE* PageDescriptor; - KIRQL oldIrql; - PPHYSICAL_PAGE Page; - - oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - Page = MiGetPfnEntry(PreviousPfn); - ASSERT(Page); - ASSERT(Page->Flags.Type == MM_PHYSICAL_PAGE_USED); - ASSERT(Page->Flags.Consumer == MC_USER); - NextListEntry = (PLIST_ENTRY)Page->ListEntry.Flink; - if (NextListEntry == &UserPageListHead) - { - KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - return 0; - } - PageDescriptor = CONTAINING_RECORD(NextListEntry, PHYSICAL_PAGE, ListEntry); - KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - return PageDescriptor - MmPfnDatabase; + ULONG Position; + KIRQL OldIrql; + + /* Find the next user page */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + Position = RtlFindSetBits(&MiUserPfnBitMap, 1, PreviousPfn + 1); + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + if (Position == 0xFFFFFFFF) return 0; + + /* Return it */ + return Position; } VOID NTAPI MmRemoveLRUUserPage(PFN_NUMBER Page) { - RemoveEntryList(&MiGetPfnEntry(Page)->ListEntry); + /* Unset the page as a user page */ + RtlClearBit(&MiUserPfnBitMap, Page); +} + +BOOLEAN +NTAPI +MiIsPfnInUse(IN PMMPFN Pfn1) +{ + return ((Pfn1->u3.e1.PageLocation != FreePageList) && + (Pfn1->u3.e1.PageLocation != ZeroedPageList)); } PFN_NUMBER @@ -230,7 +226,7 @@ MiFindContiguousPages(IN PFN_NUMBER LowestPfn, // // If this PFN is in use, ignore it // - if (Pfn1->Flags.Type != MM_PHYSICAL_PAGE_FREE) continue; + if (MiIsPfnInUse(Pfn1)) continue; // // If we haven't chosen a start PFN yet and the caller specified an @@ -265,7 +261,7 @@ MiFindContiguousPages(IN PFN_NUMBER LowestPfn, // // Things might've changed for us. Is the page still free? // - if (Pfn1->Flags.Type != MM_PHYSICAL_PAGE_FREE) break; + if (MiIsPfnInUse(Pfn1)) break; // // So far so good. Is this the last confirmed valid page? @@ -283,36 +279,27 @@ MiFindContiguousPages(IN PFN_NUMBER LowestPfn, EndPfn = Pfn1 - SizeInPages + 1; do { - // - // If this was an unzeroed page, there are now less - // - if (Pfn1->Flags.Zero == 0) UnzeroedPageCount--; - - // - // One less free page - // - MmAvailablePages--; - // // This PFN is now a used page, set it up // - RemoveEntryList(&Pfn1->ListEntry); - Pfn1->Flags.Type = MM_PHYSICAL_PAGE_USED; - Pfn1->Flags.Consumer = MC_NPPOOL; - Pfn1->ReferenceCount = 1; - Pfn1->LockCount = 0; - Pfn1->SavedSwapEntry = 0; + MiUnlinkFreeOrZeroedPage(Pfn1); + Pfn1->u3.e2.ReferenceCount = 1; // // Check if it was already zeroed // - if (Pfn1->Flags.Zero == 0) + if (Pfn1->u3.e1.PageLocation != ZeroedPageList) { // // It wasn't, so zero it // MiZeroPage(MiGetPfnEntryIndex(Pfn1)); } + + // + // Mark it in use + // + Pfn1->u3.e1.PageLocation = ActiveAndValid; // // Check if this is the last PFN, otherwise go on @@ -324,8 +311,8 @@ MiFindContiguousPages(IN PFN_NUMBER LowestPfn, // // Mark the first and last PFN so we can find them later // - Pfn1->Flags.StartOfAllocation = 1; - (Pfn1 + SizeInPages - 1)->Flags.EndOfAllocation = 1; + Pfn1->u3.e1.StartOfAllocation = 1; + (Pfn1 + SizeInPages - 1)->u3.e1.EndOfAllocation = 1; // // Now it's safe to let go of the PFN lock @@ -384,7 +371,6 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, PFN_NUMBER PageCount, LowPage, HighPage, SkipPages, PagesFound = 0, Page; PPFN_NUMBER MdlPage, LastMdlPage; KIRQL OldIrql; - PLIST_ENTRY ListEntry; PPHYSICAL_PAGE Pfn1; INT LookForZeroedPages; ASSERT (KeGetCurrentIrql() <= APC_LEVEL); @@ -455,20 +441,19 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, // // Do we have zeroed pages? // - if (!IsListEmpty(&FreeZeroedPageListHead)) + if (MmZeroedPageListHead.Total) { // // Grab a zero page // - ListEntry = RemoveTailList(&FreeZeroedPageListHead); + Pfn1 = MiRemoveHeadList(&MmZeroedPageListHead); } - else if (!IsListEmpty(&FreeUnzeroedPageListHead)) + else if (MmFreePageListHead.Total) { // // Nope, grab an unzeroed page // - ListEntry = RemoveTailList(&FreeUnzeroedPageListHead); - UnzeroedPageCount--; + Pfn1 = MiRemoveHeadList(&MmFreePageListHead); } else { @@ -479,27 +464,18 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, break; } - // - // Get the PFN entry for this page - // - Pfn1 = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry); - // // Make sure it's really free // - ASSERT(Pfn1->Flags.Type == MM_PHYSICAL_PAGE_FREE); - ASSERT(Pfn1->ReferenceCount == 0); + ASSERT(MiIsPfnInUse(Pfn1) == FALSE); + ASSERT(Pfn1->u3.e2.ReferenceCount == 0); // // Allocate it and mark it // - Pfn1->Flags.Type = MM_PHYSICAL_PAGE_USED; - Pfn1->Flags.Consumer = MC_NPPOOL; - Pfn1->Flags.StartOfAllocation = 1; - Pfn1->Flags.EndOfAllocation = 1; - Pfn1->ReferenceCount = 1; - Pfn1->LockCount = 0; - Pfn1->SavedSwapEntry = 0; + Pfn1->u3.e1.StartOfAllocation = 1; + Pfn1->u3.e1.EndOfAllocation = 1; + Pfn1->u3.e2.ReferenceCount = 1; // // Decrease available pages @@ -534,30 +510,21 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, // // Make sure it's free and if this is our first pass, zeroed // - if (Pfn1->Flags.Type != MM_PHYSICAL_PAGE_FREE) continue; - if (Pfn1->Flags.Zero != LookForZeroedPages) continue; + if (MiIsPfnInUse(Pfn1)) continue; + if ((Pfn1->u3.e1.PageLocation == ZeroedPageList) != LookForZeroedPages) continue; // // Sanity checks // - ASSERT(Pfn1->ReferenceCount == 0); + ASSERT(Pfn1->u3.e2.ReferenceCount == 0); // // Now setup the page and mark it // - Pfn1->Flags.Type = MM_PHYSICAL_PAGE_USED; - Pfn1->Flags.Consumer = MC_NPPOOL; - Pfn1->ReferenceCount = 1; - Pfn1->Flags.StartOfAllocation = 1; - Pfn1->Flags.EndOfAllocation = 1; - Pfn1->LockCount = 0; - Pfn1->SavedSwapEntry = 0; - - // - // If this page was unzeroed, we've consumed such a page - // - if (!Pfn1->Flags.Zero) UnzeroedPageCount--; - + Pfn1->u3.e2.ReferenceCount = 1; + Pfn1->u3.e1.StartOfAllocation = 1; + Pfn1->u3.e1.EndOfAllocation = 1; + // // Decrease available pages // @@ -624,7 +591,8 @@ MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, // Pfn1 = MiGetPfnEntry(Page); ASSERT(Pfn1); - if (Pfn1->Flags.Zero == 0) MiZeroPage(Page); + if (Pfn1->u3.e1.PageLocation != ZeroedPageList) MiZeroPage(Page); + Pfn1->u3.e1.PageLocation = ActiveAndValid; } // @@ -641,7 +609,7 @@ MmDumpPfnDatabase(VOID) { ULONG i; PPHYSICAL_PAGE Pfn1; - PCHAR State = "????", Consumer = "Unknown"; + PCHAR State = "????", Type = "Unknown"; KIRQL OldIrql; ULONG Totals[5] = {0}, FreePages = 0; @@ -656,69 +624,33 @@ MmDumpPfnDatabase(VOID) if (!Pfn1) continue; // - // Get the consumer + // Get the type // - switch (Pfn1->Flags.Consumer) + if (MiIsPfnInUse(Pfn1)) { - case MC_NPPOOL: - - Consumer = "Nonpaged Pool"; - break; - - case MC_PPOOL: - - Consumer = "Paged Pool"; - break; - - case MC_CACHE: - - Consumer = "File System Cache"; - break; - - case MC_USER: - - Consumer = "Process Working Set"; - break; - - case MC_SYSTEM: - - Consumer = "System"; - break; + State = "Used"; + } + else + { + State = "Free"; + Type = "Free"; + FreePages++; + break; } - // - // Get the type - // - switch (Pfn1->Flags.Type) - { - case MM_PHYSICAL_PAGE_USED: - - State = "Used"; - Totals[Pfn1->Flags.Consumer]++; - break; - - case MM_PHYSICAL_PAGE_FREE: - - State = "Free"; - Consumer = "Free"; - FreePages++; - break; - } - // // Pretty-print the page // - DbgPrint("0x%08p:\t%04s\t%20s\t(%02d.%02d) [%08p])\n", + DbgPrint("0x%08p:\t%04s\t%20s\t(%02d) [%08p])\n", i << PAGE_SHIFT, State, - Consumer, - Pfn1->ReferenceCount, - Pfn1->LockCount, + Type, + Pfn1->u3.e2.ReferenceCount, Pfn1->RmapListHead); } DbgPrint("Nonpaged Pool: %d pages\t[%d KB]\n", Totals[MC_NPPOOL], (Totals[MC_NPPOOL] << PAGE_SHIFT) / 1024); - DbgPrint("Paged Pool: %d pages\t[%d KB]\n", Totals[MC_PPOOL], (Totals[MC_PPOOL] << PAGE_SHIFT) / 1024); + DbgPrint("Paged Pool: %d pages\t[%d KB]\n", Totals[MC_PPOOL], (Totals[MC_PPOOL] << PAGE_SHIFT) / 1024); DbgPrint("File System Cache: %d pages\t[%d KB]\n", Totals[MC_CACHE], (Totals[MC_CACHE] << PAGE_SHIFT) / 1024); DbgPrint("Process Working Set: %d pages\t[%d KB]\n", Totals[MC_USER], (Totals[MC_USER] << PAGE_SHIFT) / 1024); DbgPrint("System: %d pages\t[%d KB]\n", Totals[MC_SYSTEM], (Totals[MC_SYSTEM] << PAGE_SHIFT) / 1024); @@ -737,16 +669,10 @@ MmInitializePageList(VOID) PLIST_ENTRY NextEntry; ULONG NrSystemPages = 0; - /* Initialize the page lists */ - InitializeListHead(&UserPageListHead); - InitializeListHead(&FreeUnzeroedPageListHead); - InitializeListHead(&FreeZeroedPageListHead); - /* This is what a used page looks like */ RtlZeroMemory(&UsedPage, sizeof(UsedPage)); - UsedPage.Flags.Type = MM_PHYSICAL_PAGE_USED; - UsedPage.Flags.Consumer = MC_NPPOOL; - UsedPage.ReferenceCount = 1; + UsedPage.u3.e1.PageLocation = ActiveAndValid; + UsedPage.u3.e2.ReferenceCount = 1; /* Loop the memory descriptors */ for (NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink; @@ -778,10 +704,9 @@ MmInitializePageList(VOID) for (i = 0; i < Md->PageCount; i++) { /* Mark it as a free page */ - MmPfnDatabase[Md->BasePage + i].Flags.Type = MM_PHYSICAL_PAGE_FREE; - InsertTailList(&FreeUnzeroedPageListHead, - &MmPfnDatabase[Md->BasePage + i].ListEntry); - UnzeroedPageCount++; + MmPfnDatabase[0][Md->BasePage + i].u3.e1.PageLocation = FreePageList; + MiInsertInListTail(&MmFreePageListHead, + &MmPfnDatabase[0][Md->BasePage + i]); MmAvailablePages++; } } @@ -791,7 +716,7 @@ MmInitializePageList(VOID) for (i = 0; i < Md->PageCount; i++) { /* Everything else is used memory */ - MmPfnDatabase[Md->BasePage + i] = UsedPage; + MmPfnDatabase[0][Md->BasePage + i] = UsedPage; NrSystemPages++; } } @@ -800,11 +725,8 @@ MmInitializePageList(VOID) /* Finally handle the pages describing the PFN database themselves */ for (i = MxOldFreeDescriptor.BasePage; i < MxFreeDescriptor->BasePage; i++) { - /* Ensure this page was not added previously */ - ASSERT(MmPfnDatabase[i].Flags.Type == 0); - /* Mark it as used kernel memory */ - MmPfnDatabase[i] = UsedPage; + MmPfnDatabase[0][i] = UsedPage; NrSystemPages++; } @@ -845,7 +767,7 @@ MmSetSavedSwapEntryPage(PFN_NUMBER Pfn, SWAPENTRY SwapEntry) KIRQL oldIrql; oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MiGetPfnEntry(Pfn)->SavedSwapEntry = SwapEntry; + MiGetPfnEntry(Pfn)->u1.WsIndex = SwapEntry; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); } @@ -857,7 +779,7 @@ MmGetSavedSwapEntryPage(PFN_NUMBER Pfn) KIRQL oldIrql; oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - SwapEntry = MiGetPfnEntry(Pfn)->SavedSwapEntry; + SwapEntry = MiGetPfnEntry(Pfn)->u1.WsIndex; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); return(SwapEntry); @@ -878,13 +800,8 @@ MmReferencePage(PFN_NUMBER Pfn) Page = MiGetPfnEntry(Pfn); ASSERT(Page); - if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DPRINT1("Referencing non-used page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - Page->ReferenceCount++; + Page->u3.e2.ReferenceCount++; } ULONG @@ -900,13 +817,8 @@ MmGetReferenceCountPage(PFN_NUMBER Pfn) oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); Page = MiGetPfnEntry(Pfn); ASSERT(Page); - if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DPRINT1("Getting reference count for free page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - RCount = Page->ReferenceCount; + RCount = Page->u3.e2.ReferenceCount; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); return(RCount); @@ -916,10 +828,15 @@ BOOLEAN NTAPI MmIsPageInUse(PFN_NUMBER Pfn) { + return MiIsPfnInUse(MiGetPfnEntry(Pfn)); +} - DPRINT("MmIsPageInUse(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT); - - return (MiGetPfnEntry(Pfn)->Flags.Type == MM_PHYSICAL_PAGE_USED); +VOID +NTAPI +MiSetConsumer(IN PFN_TYPE Pfn, + IN ULONG Type) +{ + MiGetPfnEntry(Pfn)->u3.e1.PageLocation = ActiveAndValid; } VOID @@ -933,134 +850,33 @@ MmDereferencePage(PFN_NUMBER Pfn) Page = MiGetPfnEntry(Pfn); ASSERT(Page); - if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DPRINT1("Dereferencing free page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - if (Page->ReferenceCount == 0) - { - DPRINT1("Derefrencing page with reference count 0\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - - Page->ReferenceCount--; - if (Page->ReferenceCount == 0) + Page->u3.e2.ReferenceCount--; + if (Page->u3.e2.ReferenceCount == 0) { MmAvailablePages++; - if (Page->Flags.Consumer == MC_USER) RemoveEntryList(&Page->ListEntry); - if (Page->RmapListHead != (LONG_PTR)NULL) - { - DPRINT1("Freeing page with rmap entries.\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - if (Page->LockCount > 0) - { - DPRINT1("Freeing locked page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - if (Page->SavedSwapEntry != 0) - { - DPRINT1("Freeing page with swap entry.\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DPRINT1("Freeing page with flags %x\n", - Page->Flags.Type); - KeBugCheck(MEMORY_MANAGEMENT); - } - Page->Flags.Type = MM_PHYSICAL_PAGE_FREE; - Page->Flags.Consumer = MC_MAXIMUM; - InsertTailList(&FreeUnzeroedPageListHead, - &Page->ListEntry); - UnzeroedPageCount++; - if (UnzeroedPageCount > 8 && 0 == KeReadStateEvent(&ZeroPageThreadEvent)) + Page->u3.e1.PageLocation = FreePageList; + MiInsertInListTail(&MmFreePageListHead, Page); + if (MmFreePageListHead.Total > 8 && 0 == KeReadStateEvent(&ZeroPageThreadEvent)) { KeSetEvent(&ZeroPageThreadEvent, IO_NO_INCREMENT, FALSE); } } } -ULONG -NTAPI -MmGetLockCountPage(PFN_NUMBER Pfn) -{ - KIRQL oldIrql; - ULONG CurrentLockCount; - PPHYSICAL_PAGE Page; - - DPRINT("MmGetLockCountPage(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT); - - oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - - Page = MiGetPfnEntry(Pfn); - ASSERT(Page); - if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DPRINT1("Getting lock count for free page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - - CurrentLockCount = Page->LockCount; - KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - - return(CurrentLockCount); -} - -VOID -NTAPI -MmLockPage(PFN_NUMBER Pfn) -{ - PPHYSICAL_PAGE Page; - - DPRINT("MmLockPage(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT); - - Page = MiGetPfnEntry(Pfn); - ASSERT(Page); - if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DPRINT1("Locking free page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - - Page->LockCount++; -} - -VOID -NTAPI -MmUnlockPage(PFN_NUMBER Pfn) -{ - PPHYSICAL_PAGE Page; - - DPRINT("MmUnlockPage(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT); - - Page = MiGetPfnEntry(Pfn); - ASSERT(Page); - if (Page->Flags.Type != MM_PHYSICAL_PAGE_USED) - { - DPRINT1("Unlocking free page\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - - Page->LockCount--; -} - PFN_NUMBER NTAPI -MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry) +MmAllocPage(ULONG Type) { PFN_NUMBER PfnOffset; - PLIST_ENTRY ListEntry; PPHYSICAL_PAGE PageDescriptor; BOOLEAN NeedClear = FALSE; DPRINT("MmAllocPage()\n"); - if (IsListEmpty(&FreeZeroedPageListHead)) + if (MmZeroedPageListHead.Total == 0) { - if (IsListEmpty(&FreeUnzeroedPageListHead)) - { + if (MmFreePageListHead.Total == 0) + { /* Check if this allocation is for the PFN DB itself */ if (MmNumberOfPhysicalPages == 0) { @@ -1070,43 +886,26 @@ MmAllocPage(ULONG Consumer, SWAPENTRY SwapEntry) DPRINT1("MmAllocPage(): Out of memory\n"); return 0; } - ListEntry = RemoveTailList(&FreeUnzeroedPageListHead); - UnzeroedPageCount--; - - PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry); + PageDescriptor = MiRemoveHeadList(&MmFreePageListHead); NeedClear = TRUE; } else { - ListEntry = RemoveTailList(&FreeZeroedPageListHead); - - PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry); + PageDescriptor = MiRemoveHeadList(&MmZeroedPageListHead); } - if (PageDescriptor->Flags.Type != MM_PHYSICAL_PAGE_FREE) - { - DPRINT1("Got non-free page from freelist\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - if (PageDescriptor->ReferenceCount != 0) - { - DPRINT1("%d\n", PageDescriptor->ReferenceCount); - KeBugCheck(MEMORY_MANAGEMENT); - } - PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED; - PageDescriptor->Flags.Consumer = Consumer; - PageDescriptor->ReferenceCount = 1; - PageDescriptor->LockCount = 0; - PageDescriptor->SavedSwapEntry = SwapEntry; + PageDescriptor->u3.e2.ReferenceCount = 1; MmAvailablePages--; - PfnOffset = PageDescriptor - MmPfnDatabase; - if ((NeedClear) && (Consumer != MC_SYSTEM)) + PfnOffset = PageDescriptor - MmPfnDatabase[0]; + if ((NeedClear) && (Type != MC_SYSTEM)) { MiZeroPage(PfnOffset); } + + PageDescriptor->u3.e1.PageLocation = ActiveAndValid; return PfnOffset; } @@ -1135,7 +934,6 @@ MmZeroPageThreadMain(PVOID Ignored) { NTSTATUS Status; KIRQL oldIrql; - PLIST_ENTRY ListEntry; PPHYSICAL_PAGE PageDescriptor; PFN_NUMBER Pfn; ULONG Count; @@ -1154,11 +952,6 @@ MmZeroPageThreadMain(PVOID Ignored) KernelMode, FALSE, NULL); - if (!NT_SUCCESS(Status)) - { - DPRINT1("ZeroPageThread: Wait failed\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } if (ZeroPageThreadShouldTerminate) { @@ -1167,29 +960,24 @@ MmZeroPageThreadMain(PVOID Ignored) } Count = 0; oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - while (!IsListEmpty(&FreeUnzeroedPageListHead)) + while (MmFreePageListHead.Total) { - ListEntry = RemoveTailList(&FreeUnzeroedPageListHead); - UnzeroedPageCount--; - PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry); + PageDescriptor = MiRemoveHeadList(&MmFreePageListHead); /* We set the page to used, because MmCreateVirtualMapping failed with unused pages */ - PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED; KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - Pfn = PageDescriptor - MmPfnDatabase; + Pfn = PageDescriptor - MmPfnDatabase[0]; Status = MiZeroPage(Pfn); oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - PageDescriptor->Flags.Zero = 1; - PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_FREE; if (NT_SUCCESS(Status)) { - InsertHeadList(&FreeZeroedPageListHead, ListEntry); + MiInsertZeroListAtBack(Pfn); Count++; } else { - InsertHeadList(&FreeUnzeroedPageListHead, ListEntry); - UnzeroedPageCount++; + MiInsertInListTail(&MmFreePageListHead, PageDescriptor); + PageDescriptor->u3.e1.PageLocation = FreePageList; } } diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index d224dbd08a8..33927728d9c 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.c @@ -284,10 +284,6 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) KeBugCheck(MEMORY_MANAGEMENT); } Entry = PFN_TO_PTE(Pfn) | PA_PRESENT | PA_READWRITE; - if (Ke386GlobalPagesEnabled) - { - Entry |= PA_GLOBAL; - } if(0 != InterlockedCompareExchangePte(&MmGlobalKernelPageDirectory[PdeOffset], Entry, 0)) { MmReleasePageMemoryConsumer(MC_SYSTEM, Pfn); @@ -758,10 +754,6 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process, if (Address >= MmSystemRangeStart) { Attributes &= ~PA_USER; - if (Ke386GlobalPagesEnabled) - { - Attributes |= PA_GLOBAL; - } } else { @@ -907,10 +899,6 @@ MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect) if (Address >= MmSystemRangeStart) { Attributes &= ~PA_USER; - if (Ke386GlobalPagesEnabled) - { - Attributes |= PA_GLOBAL; - } } else { @@ -1000,8 +988,6 @@ MmUpdatePageDir(PEPROCESS Process, PVOID Address, ULONG Size) } } -extern MMPTE HyperTemplatePte; - VOID INIT_FUNCTION NTAPI @@ -1012,12 +998,6 @@ MmInitGlobalKernelPageDirectory(VOID) DPRINT("MmInitGlobalKernelPageDirectory()\n"); - // - // Setup template - // - HyperTemplatePte.u.Long = (PA_PRESENT | PA_READWRITE | PA_DIRTY | PA_ACCESSED); - if (Ke386GlobalPagesEnabled) HyperTemplatePte.u.Long |= PA_GLOBAL; - for (i = ADDR_TO_PDE_OFFSET(MmSystemRangeStart); i < 1024; i++) { if (i != ADDR_TO_PDE_OFFSET(PAGETABLE_MAP) && @@ -1025,11 +1005,6 @@ MmInitGlobalKernelPageDirectory(VOID) 0 == MmGlobalKernelPageDirectory[i] && 0 != CurrentPageDirectory[i]) { MmGlobalKernelPageDirectory[i] = CurrentPageDirectory[i]; - if (Ke386GlobalPagesEnabled) - { - MmGlobalKernelPageDirectory[i] |= PA_GLOBAL; - CurrentPageDirectory[i] |= PA_GLOBAL; - } } } } diff --git a/reactos/ntoskrnl/mm/mmdbg.c b/reactos/ntoskrnl/mm/mmdbg.c index a79bf4ac4e9..4b97eab0a9e 100644 --- a/reactos/ntoskrnl/mm/mmdbg.c +++ b/reactos/ntoskrnl/mm/mmdbg.c @@ -41,6 +41,7 @@ NTAPI MiDbgTranslatePhysicalAddress(IN ULONG64 PhysicalAddress, IN ULONG Flags) { + extern MMPTE ValidKernelPte; PFN_NUMBER Pfn; MMPTE TempPte; PVOID MappingBaseAddress; @@ -83,7 +84,7 @@ MiDbgTranslatePhysicalAddress(IN ULONG64 PhysicalAddress, // // // - TempPte = HyperTemplatePte; + TempPte = ValidKernelPte; // // Convert physical address to PFN diff --git a/reactos/ntoskrnl/mm/mmfault.c b/reactos/ntoskrnl/mm/mmfault.c index 871d5079b5f..d8675c8f388 100644 --- a/reactos/ntoskrnl/mm/mmfault.c +++ b/reactos/ntoskrnl/mm/mmfault.c @@ -305,7 +305,6 @@ MmCommitPagedPoolAddress(PVOID Address, BOOLEAN Locked) { NTSTATUS Status; PFN_NUMBER AllocatedPage; - KIRQL OldIrql; Status = MmRequestPageMemoryConsumer(MC_PPOOL, FALSE, &AllocatedPage); if (!NT_SUCCESS(Status)) @@ -320,11 +319,5 @@ MmCommitPagedPoolAddress(PVOID Address, BOOLEAN Locked) PAGE_READWRITE, &AllocatedPage, 1); - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(AllocatedPage); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } return(Status); } diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index bba32e44441..1dbcf427281 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -124,7 +124,7 @@ MiInitSystemMemoryAreas() // // Protect the PFN database // - BaseAddress = MmPfnDatabase; + BaseAddress = MmPfnDatabase[0]; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, @@ -308,8 +308,8 @@ MiDbgDumpAddressSpace(VOID) (ULONG_PTR)MmPagedPoolBase + MmPagedPoolSize, "Paged Pool"); DPRINT1(" 0x%p - 0x%p\t%s\n", - MmPfnDatabase, - (ULONG_PTR)MmPfnDatabase + (MxPfnAllocation << PAGE_SHIFT), + MmPfnDatabase[0], + (ULONG_PTR)MmPfnDatabase[0] + (MxPfnAllocation << PAGE_SHIFT), "PFN Database"); DPRINT1(" 0x%p - 0x%p\t%s\n", MmNonPagedPoolStart, @@ -365,14 +365,16 @@ MiDbgDumpMemoryDescriptors(VOID) DPRINT1("Total: %08lX (%d MB)\n", TotalPages, (TotalPages * PAGE_SIZE) / 1024 / 1024); } +VOID NTAPI MiInitializeUserPfnBitmap(VOID); + BOOLEAN NTAPI MmInitSystem(IN ULONG Phase, IN PLOADER_PARAMETER_BLOCK LoaderBlock) { - extern MMPTE HyperTemplatePte; + extern MMPTE ValidKernelPte; PMMPTE PointerPte; - MMPTE TempPte = HyperTemplatePte; + MMPTE TempPte = ValidKernelPte; PFN_NUMBER PageFrameNumber; if (Phase == 0) @@ -389,14 +391,6 @@ MmInitSystem(IN ULONG Phase, // Initialize ARM³ in phase 0 // MmArmInitSystem(0, KeLoaderBlock); - - /* Initialize the page list */ - MmInitializePageList(); - - // - // Initialize ARM³ in phase 1 - // - MmArmInitSystem(1, KeLoaderBlock); #if defined(_WINKD_) // @@ -423,27 +417,14 @@ MmInitSystem(IN ULONG Phase, #endif /* Initialize working sets */ + MiInitializeUserPfnBitmap(); MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory); - /* Initialize the user mode image list */ - InitializeListHead(&MmLoadedUserImageList); - - /* Initialize the Loader Lock */ - KeInitializeMutant(&MmSystemLoadLock, FALSE); - /* Reload boot drivers */ MiReloadBootLoadedDrivers(LoaderBlock); /* Initialize the loaded module list */ MiInitializeLoadedModuleList(LoaderBlock); - - /* Setup shared user data settings that NT does as well */ - ASSERT(SharedUserData->NumberOfPhysicalPages == 0); - SharedUserData->NumberOfPhysicalPages = MmNumberOfPhysicalPages; - SharedUserData->LargePageMinimum = 0; - - /* For now, we assume that we're always Server */ - SharedUserData->NtProductType = NtProductServer; } else if (Phase == 1) { @@ -477,6 +458,9 @@ MmInitSystem(IN ULONG Phase, TempPte.u.Hard.PageFrameNumber = PageFrameNumber; *MmSharedUserDataPte = TempPte; + /* Setup the memory threshold events */ + if (!MiInitializeMemoryEvents()) return FALSE; + /* * Unmap low memory */ diff --git a/reactos/ntoskrnl/mm/mpw.c b/reactos/ntoskrnl/mm/mpw.c index 76b021bf128..89fba8d6e1e 100644 --- a/reactos/ntoskrnl/mm/mpw.c +++ b/reactos/ntoskrnl/mm/mpw.c @@ -23,35 +23,6 @@ BOOLEAN MpwThreadShouldTerminate; /* FUNCTIONS *****************************************************************/ -NTSTATUS NTAPI -MmWriteDirtyPages(ULONG Target, PULONG Actual) -{ - PFN_NUMBER Page; - PFN_NUMBER NextPage; - NTSTATUS Status; - - Page = MmGetLRUFirstUserPage(); - while (Page != 0 && Target > 0) - { - /* - * FIXME: While the current page is write back it is possible - * that the next page is freed and not longer a user page. - */ - NextPage = MmGetLRUNextUserPage(Page); - if (MmIsDirtyPageRmap(Page)) - { - Status = MmWritePagePhysicalAddress(Page); - if (NT_SUCCESS(Status)) - { - Target--; - } - } - Page = NextPage; - } - *Actual = Target; - return(STATUS_SUCCESS); -} - NTSTATUS NTAPI MmMpwThreadMain(PVOID Ignored) { @@ -81,12 +52,6 @@ MmMpwThreadMain(PVOID Ignored) } PagesWritten = 0; -#if 0 - /* - * FIXME: MmWriteDirtyPages doesn't work correctly. - */ - MmWriteDirtyPages(128, &PagesWritten); -#endif CcRosFlushDirtyPages(128, &PagesWritten); } diff --git a/reactos/ntoskrnl/mm/rmap.c b/reactos/ntoskrnl/mm/rmap.c index 5568a60261b..d389ab4cef8 100644 --- a/reactos/ntoskrnl/mm/rmap.c +++ b/reactos/ntoskrnl/mm/rmap.c @@ -202,7 +202,7 @@ MmPageOutPhysicalAddress(PFN_NUMBER Page) ExAcquireFastMutex(&RmapListLock); entry = MmGetRmapListHeadPage(Page); - if (entry == NULL || MmGetLockCountPage(Page) != 0) + if (entry == NULL) { ExReleaseFastMutex(&RmapListLock); return(STATUS_UNSUCCESSFUL); diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 30bb9fcad5e..10ee3652505 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -793,7 +793,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, PMM_REGION Region; BOOLEAN HasSwapEntry; PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace); - KIRQL OldIrql; /* * There is a window between taking the page fault and locking the @@ -802,12 +801,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, */ if (MmIsPagePresent(Process, Address)) { - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(MmGetPfnForProcess(Process, Address)); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } return(STATUS_SUCCESS); } @@ -931,12 +924,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, } MmInsertRmap(Page, Process, (PVOID)PAddress); } - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } MmUnlockSectionSegment(Segment); PageOp->Status = STATUS_SUCCESS; MmspCompleteAndReleasePageOp(PageOp); @@ -1003,12 +990,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, /* * Finish the operation */ - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } PageOp->Status = STATUS_SUCCESS; MmspCompleteAndReleasePageOp(PageOp); DPRINT("Address 0x%.8X\n", Address); @@ -1036,16 +1017,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, KeBugCheck(MEMORY_MANAGEMENT); return(Status); } - /* - * Don't add an rmap entry since the page mapped could be for - * anything. - */ - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } /* * Cleanup and release locks @@ -1085,12 +1056,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, return(Status); } MmInsertRmap(Page, Process, (PVOID)PAddress); - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } /* * Cleanup and release locks @@ -1187,12 +1152,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, } MmInsertRmap(Page, Process, (PVOID)PAddress); - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } PageOp->Status = STATUS_SUCCESS; MmspCompleteAndReleasePageOp(PageOp); DPRINT("Address 0x%.8X\n", Address); @@ -1263,12 +1222,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, KeBugCheck(MEMORY_MANAGEMENT); } MmInsertRmap(Page, Process, (PVOID)PAddress); - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } PageOp->Status = STATUS_SUCCESS; MmspCompleteAndReleasePageOp(PageOp); DPRINT("Address 0x%.8X\n", Address); @@ -1297,12 +1250,6 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace, KeBugCheck(MEMORY_MANAGEMENT); } MmInsertRmap(Page, Process, (PVOID)PAddress); - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(Page); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } PageOp->Status = STATUS_SUCCESS; MmspCompleteAndReleasePageOp(PageOp); DPRINT("Address 0x%.8X\n", Address); @@ -1328,7 +1275,6 @@ MmAccessFaultSectionView(PMMSUPPORT AddressSpace, PMM_REGION Region; ULONG Entry; PEPROCESS Process = MmGetAddressSpaceOwner(AddressSpace); - KIRQL OldIrql; DPRINT("MmAccessFaultSectionView(%x, %x, %x, %x)\n", AddressSpace, MemoryArea, Address, Locked); @@ -1467,13 +1413,6 @@ MmAccessFaultSectionView(PMMSUPPORT AddressSpace, DPRINT1("Unable to create virtual mapping\n"); KeBugCheck(MEMORY_MANAGEMENT); } - if (Locked) - { - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - MmLockPage(NewPage); - MmUnlockPage(OldPage); - KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - } /* * Unshare the old page. @@ -4482,138 +4421,6 @@ NtExtendSection(IN HANDLE SectionHandle, return STATUS_NOT_IMPLEMENTED; } - -/********************************************************************** - * NAME INTERNAL - * MmAllocateSection@4 - * - * DESCRIPTION - * - * ARGUMENTS - * Length - * - * RETURN VALUE - * - * NOTE - * Code taken from ntoskrnl/mm/special.c. - * - * REVISIONS - */ -PVOID NTAPI -MmAllocateSection (IN ULONG Length, PVOID BaseAddress) -{ - PHYSICAL_ADDRESS LowAddress, HighAddress, SkipBytes; - PMDL Mdl; - PFN_COUNT PageCount; - PPFN_NUMBER MdlPages; - MMPTE TempPte, *PointerPte; - PMMPFN Pfn; - - /* Allocate an MDL */ - LowAddress.QuadPart = 0; - HighAddress.QuadPart = -1; - SkipBytes.QuadPart = 0; - Mdl = MiAllocatePagesForMdl(LowAddress, - HighAddress, - SkipBytes, - Length, - MiPlatformCacheAttributes[0][MmCached], - 0); // use MM_ALLOCATE_FULLY_REQUIRED - if (!Mdl) - { - /* Fail */ - return NULL; - } - - /* Check if we got all we need */ - if (Mdl->ByteCount < Length) - { - /* We didn't get enough */ - MmFreePagesFromMdl(Mdl); - ExFreePool(Mdl); - return NULL; - } - - /* Calculate how many pages we should have */ - PageCount = BYTES_TO_PAGES(Length); - - /* Reserve system PTEs */ - PointerPte = MiReserveSystemPtes(PageCount, SystemPteSpace); - if (!PointerPte) - { - /* Free the MDL and fail */ - MmFreePagesFromMdl(Mdl); - ExFreePool(Mdl); - return NULL; - } - - /* Safe the base address */ - BaseAddress = MiPteToAddress(PointerPte); - - /* Get a pointer to the page array */ - MdlPages = (PPFN_NUMBER)(Mdl + 1); - - /* Get the first page's PFN entry */ - Pfn = MI_PFN_ELEMENT(*MdlPages); - - /* Save the pointer to the MDL in the PFN entry */ - *(PMDL*)&Pfn->OriginalPte = Mdl; - - /* Setup template PTE */ - TempPte = HyperTemplatePte; - - /* Map the PTEs */ - do - { - /* Sanity checks */ - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(PointerPte->u.Soft.Transition == 0); - - /* Get the PFN */ - TempPte.u.Hard.PageFrameNumber = *MdlPages++; - - /* Write the PTE */ - *PointerPte++ = TempPte; - } while (--PageCount); - - /* Return the base address */ - return BaseAddress; -} - -VOID -NTAPI -MmFreeSection(PVOID BaseAddress) -{ - PMMPTE PointerPte; - PFN_NUMBER *MdlPages, PageFrameNumber, PageCount; - PMMPFN Pfn; - PMDL Mdl; - - /* Get a pointer to the first PTE */ - PointerPte = MiAddressToPte(BaseAddress); - - /* Get the page frame number of the first page */ - PageFrameNumber = PFN_FROM_PTE(PointerPte); - - /* Get the first pages's PFN entry */ - Pfn = MI_PFN_ELEMENT(PageFrameNumber); - - /* Get the MDL from the PFN */ - Mdl = *(PMDL*)&Pfn->OriginalPte; - *(PMDL*)&Pfn->OriginalPte = NULL; - - /* Get the page array and count from the MDL */ - MdlPages = (PPFN_NUMBER)(Mdl + 1); - PageCount = BYTES_TO_PAGES(Mdl->ByteCount); - - /* Release the system PTEs */ - MiReleaseSystemPtes(PointerPte, PageCount, SystemPteSpace); - - /* Free the pages and the MDL */ - MmFreePagesFromMdl(Mdl); - ExFreePool(Mdl); -} - /********************************************************************** * NAME EXPORTED * MmMapViewOfSection diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index 9b015de993e..5663f1ec5a4 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -4,14 +4,19 @@ * FILE: ntoskrnl/mm/sysldr.c * PURPOSE: Contains the Kernel Loader (SYSLDR) for loading PE files. * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) +* ReactOS Portable Systems Group */ -/* INCLUDES ******************************************************************/ +/* INCLUDES *******************************************************************/ #include #define NDEBUG #include +#line 16 "ARM³::LOADER" +#define MODULE_INVOLVED_IN_ARM3 +#include "./ARM3/miarm.h" + /* GCC's incompetence strikes again */ __inline VOID @@ -25,7 +30,7 @@ sprintf_nt(IN PCHAR Buffer, va_end(ap); } -/* GLOBALS *******************************************************************/ +/* GLOBALS ********************************************************************/ LIST_ENTRY PsLoadedModuleList; LIST_ENTRY MmLoadedUserImageList; @@ -39,7 +44,7 @@ PVOID MmLastUnloadedDrivers; PVOID MmTriageActionTaken; PVOID KernelVerifier; -/* FUNCTIONS *****************************************************************/ +/* FUNCTIONS ******************************************************************/ PVOID NTAPI @@ -68,25 +73,6 @@ MiCacheImageSymbols(IN PVOID BaseAddress) return DebugDirectory; } -VOID -NTAPI -MiFreeBootDriverMemory(PVOID BaseAddress, - ULONG Length) -{ - ULONG i; - - /* Loop each page */ - for (i = 0; i < PAGE_ROUND_UP(Length) / PAGE_SIZE; i++) - { - /* Free the page */ - MmDeleteVirtualMapping(NULL, - (PVOID)((ULONG_PTR)BaseAddress + i * PAGE_SIZE), - TRUE, - NULL, - NULL); - } -} - NTSTATUS NTAPI MiLoadImageSection(IN OUT PVOID *SectionPtr, @@ -103,8 +89,10 @@ MiLoadImageSection(IN OUT PVOID *SectionPtr, KAPC_STATE ApcState; LARGE_INTEGER SectionOffset = {{0, 0}}; BOOLEAN LoadSymbols = FALSE; - ULONG DriverSize; + PFN_NUMBER PteCount; + PMMPTE PointerPte, LastPte; PVOID DriverBase; + MMPTE TempPte; PAGED_CODE(); /* Detect session load */ @@ -117,7 +105,7 @@ MiLoadImageSection(IN OUT PVOID *SectionPtr, /* Not session load, shouldn't have an entry */ ASSERT(LdrEntry == NULL); - + /* Attach to the system process */ KeStackAttachProcess(&PsInitialSystemProcess->Pcb, &ApcState); @@ -159,16 +147,37 @@ MiLoadImageSection(IN OUT PVOID *SectionPtr, KeUnstackDetachProcess(&ApcState); return Status; } + + /* Reserve system PTEs needed */ + PteCount = ROUND_TO_PAGES(Section->ImageSection->ImageSize) >> PAGE_SHIFT; + PointerPte = MiReserveSystemPtes(PteCount, SystemPteSpace); + if (!PointerPte) return STATUS_INSUFFICIENT_RESOURCES; + + /* New driver base */ + LastPte = PointerPte + PteCount; + DriverBase = MiPteToAddress(PointerPte); - /* Get the driver size */ - DriverSize = Section->ImageSection->ImageSize; - - /* Allocate a virtual section for the module */ - DriverBase = MmAllocateSection(DriverSize, NULL); + /* The driver is here */ *ImageBase = DriverBase; + /* Loop the new driver PTEs */ + TempPte = ValidKernelPte; + while (PointerPte < LastPte) + { + /* Allocate a page */ + TempPte.u.Hard.PageFrameNumber = MmAllocPage(MC_NPPOOL); + + /* Write it */ + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte = TempPte; + + /* Move on */ + PointerPte++; + } + /* Copy the image */ - RtlCopyMemory(DriverBase, Base, DriverSize); + RtlCopyMemory(DriverBase, Base, PteCount << PAGE_SHIFT); /* Now unmap the view */ Status = MmUnmapViewOfSection(Process, Base); @@ -1210,6 +1219,10 @@ MiReloadBootLoadedDrivers(IN PLOADER_PARAMETER_BLOCK LoaderBlock) PIMAGE_DATA_DIRECTORY DataDirectory; PVOID DllBase, NewImageAddress; NTSTATUS Status; + PMMPTE PointerPte, StartPte, LastPte; + PFN_NUMBER PteCount; + PMMPFN Pfn1; + MMPTE TempPte, OldPte; /* Sanity check */ ASSERT(ExpInitializationPhase == 0); @@ -1265,28 +1278,69 @@ MiReloadBootLoadedDrivers(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Remember the original address */ DllBase = LdrEntry->DllBase; - - /* Allocate a virtual section for the module */ - NewImageAddress = MmAllocateSection(LdrEntry->SizeOfImage, NULL); - if (!NewImageAddress) + + /* Get the first PTE and the number of PTEs we'll need */ + PointerPte = StartPte = MiAddressToPte(LdrEntry->DllBase); + PteCount = ROUND_TO_PAGES(LdrEntry->SizeOfImage) >> PAGE_SHIFT; + LastPte = StartPte + PteCount; + + /* Loop the PTEs */ + while (PointerPte < LastPte) + { + /* Mark the page modified in the PFN database */ + ASSERT(PointerPte->u.Hard.Valid == 1); + Pfn1 = MiGetPfnEntry(PFN_FROM_PTE(PointerPte)); + ASSERT(Pfn1->u3.e1.Rom == 0); + Pfn1->u3.e1.Modified = TRUE; + + /* Next */ + PointerPte++; + } + + /* Now reserve system PTEs for the image */ + PointerPte = MiReserveSystemPtes(PteCount, SystemPteSpace); + if (!PointerPte) { /* Shouldn't happen */ DPRINT1("[Mm0]: Couldn't allocate driver section!\n"); while (TRUE); } + + /* This is the new virtual address for the module */ + LastPte = PointerPte + PteCount; + NewImageAddress = MiPteToAddress(PointerPte); DPRINT("[Mm0]: Copying from: %p to: %p\n", DllBase, NewImageAddress); - - /* Now copy the entire driver over */ - RtlCopyMemory(NewImageAddress, DllBase, LdrEntry->SizeOfImage); + + /* Loop the new driver PTEs */ + TempPte = ValidKernelPte; + while (PointerPte < LastPte) + { + /* Copy the old data */ + OldPte = *StartPte; + ASSERT(OldPte.u.Hard.Valid == 1); + + /* Set page number from the loader's memory */ + TempPte.u.Hard.PageFrameNumber = OldPte.u.Hard.PageFrameNumber; + + /* Write it */ + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte = TempPte; + + /* Move on */ + PointerPte++; + StartPte++; + } + + /* Update position */ + PointerPte -= PteCount; /* Sanity check */ ASSERT(*(PULONG)NewImageAddress == *(PULONG)DllBase); /* Set the image base to the address where the loader put it */ NtHeader->OptionalHeader.ImageBase = (ULONG_PTR)DllBase; - NtHeader = RtlImageNtHeader(NewImageAddress); - NtHeader->OptionalHeader.ImageBase = (ULONG_PTR)DllBase; /* Check if we had relocations */ if (ValidRelocs) @@ -1320,10 +1374,9 @@ MiReloadBootLoadedDrivers(IN PLOADER_PARAMETER_BLOCK LoaderBlock) LdrEntry->Flags |= LDRP_SYSTEM_MAPPED; LdrEntry->EntryPoint = (PVOID)((ULONG_PTR)NewImageAddress + NtHeader->OptionalHeader.AddressOfEntryPoint); - LdrEntry->SizeOfImage = LdrEntry->SizeOfImage; - - /* Free the old copy */ - MiFreeBootDriverMemory(DllBase, LdrEntry->SizeOfImage); + LdrEntry->SizeOfImage = PteCount << PAGE_SHIFT; + + /* FIXME: We'll need to fixup the PFN linkage when switching to ARM3 */ } } diff --git a/reactos/ntoskrnl/ntoskrnl-generic.rbuild b/reactos/ntoskrnl/ntoskrnl-generic.rbuild index c6878ac0c91..3b3583dd03a 100644 --- a/reactos/ntoskrnl/ntoskrnl-generic.rbuild +++ b/reactos/ntoskrnl/ntoskrnl-generic.rbuild @@ -7,6 +7,7 @@ + 0x05020400 @@ -31,7 +32,7 @@ wdmguid bugcodes - precomp.h + ntoskrnl.h @@ -409,7 +410,7 @@ - stubs.c + page.c @@ -442,9 +443,11 @@ hypermap.c iosup.c mdlsup.c + mminit.c mmsup.c ncache.c pagfault.c + pfnlist.c pool.c procsup.c syspte.c @@ -488,8 +491,10 @@ obwait.c + events.c power.c - events.c + poshtdwn.c + povolume.c diff --git a/reactos/ntoskrnl/ntoskrnl.pspec b/reactos/ntoskrnl/ntoskrnl.pspec index b21771a2e2c..7bdc16c4237 100644 --- a/reactos/ntoskrnl/ntoskrnl.pspec +++ b/reactos/ntoskrnl/ntoskrnl.pspec @@ -1414,7 +1414,7 @@ ;WmiStopTrace ;WmiTraceFastEvent @ cdecl WmiTraceMessage() -@ stdcall WmiTraceMessageVa(ptr long ptr long long) +@ stdcall WmiTraceMessageVa(double long ptr long long) ;WmiUpdateTrace ;XIPDispatch @ stdcall ZwAccessCheckAndAuditAlarm(ptr ptr ptr ptr ptr long ptr long ptr ptr ptr) diff --git a/reactos/ntoskrnl/ntoskrnl.rc b/reactos/ntoskrnl/ntoskrnl.rc index 4ede1c557de..090bff5e44d 100644 --- a/reactos/ntoskrnl/ntoskrnl.rc +++ b/reactos/ntoskrnl/ntoskrnl.rc @@ -23,21 +23,20 @@ #endif #define VER_LANGNEUTRAL #include "common.ver" +#include "resource.h" // // Bug Codes and Bitmaps // #include "bugcodes.rc" -1 BITMAP DISCARDABLE "ntoskrnl/inbv/logo/1.bmp" -2 BITMAP DISCARDABLE "ntoskrnl/inbv/logo/2.bmp" -3 BITMAP DISCARDABLE "ntoskrnl/inbv/logo/3.bmp" -4 BITMAP DISCARDABLE "ntoskrnl/inbv/logo/4.bmp" -5 BITMAP DISCARDABLE "ntoskrnl/inbv/logo/5.bmp" -6 BITMAP DISCARDABLE "ntoskrnl/inbv/logo/6.bmp" -7 BITMAP DISCARDABLE "ntoskrnl/inbv/logo/7.bmp" -8 BITMAP DISCARDABLE "ntoskrnl/inbv/logo/8.bmp" -13 BITMAP DISCARDABLE "ntoskrnl/inbv/logo/13.bmp" -14 BITMAP DISCARDABLE "ntoskrnl/inbv/logo/14.bmp" -15 BITMAP DISCARDABLE "ntoskrnl/inbv/logo/15.bmp" -16 BITMAP DISCARDABLE "ntoskrnl/inbv/logo/16.bmp" -17 BITMAP DISCARDABLE "ntoskrnl/inbv/logo/17.bmp" +IDB_BOOT_LOGO BITMAP DISCARDABLE "ntoskrnl/inbv/logo/1.bmp" +IDB_HIBERNATE_LOGO BITMAP DISCARDABLE "ntoskrnl/inbv/logo/2.bmp" +IDB_SHUTDOWN_LOGO BITMAP DISCARDABLE "ntoskrnl/inbv/logo/3.bmp" +IDB_BAR_SERVER BITMAP DISCARDABLE "ntoskrnl/inbv/logo/4.bmp" +IDB_LOGO BITMAP DISCARDABLE "ntoskrnl/inbv/logo/5.bmp" +IDB_LOGO_HEADER BITMAP DISCARDABLE "ntoskrnl/inbv/logo/6.bmp" +IDB_LOGO_BAND BITMAP DISCARDABLE "ntoskrnl/inbv/logo/7.bmp" +IDB_BAR_PRO BITMAP DISCARDABLE "ntoskrnl/inbv/logo/8.bmp" +IDB_SERVER_LOGO BITMAP DISCARDABLE "ntoskrnl/inbv/logo/5.bmp" +IDB_SERVER_HEADER BITMAP DISCARDABLE "ntoskrnl/inbv/logo/14.bmp" +IDB_SERVER_BAND BITMAP DISCARDABLE "ntoskrnl/inbv/logo/15.bmp" diff --git a/reactos/ntoskrnl/po/poshtdwn.c b/reactos/ntoskrnl/po/poshtdwn.c new file mode 100644 index 00000000000..dd5113e1bb3 --- /dev/null +++ b/reactos/ntoskrnl/po/poshtdwn.c @@ -0,0 +1,213 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/po/poshtdwn.c + * PURPOSE: Power Manager Shutdown Code + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS *******************************************************************/ + +ULONG PopShutdownPowerOffPolicy; + +/* PRIVATE FUNCTIONS *********************************************************/ + +VOID +NTAPI +PopShutdownHandler(VOID) +{ + PUCHAR Logo1, Logo2; + ULONG i; + + /* Stop all interrupts */ + KeRaiseIrqlToDpcLevel(); + _disable(); + + /* Do we have boot video */ + if (InbvIsBootDriverInstalled()) + { + /* Yes we do, cleanup for shutdown screen */ + if (!InbvCheckDisplayOwnership()) InbvAcquireDisplayOwnership(); + InbvResetDisplay(); + InbvSolidColorFill(0, 0, 639, 479, 0); + InbvEnableDisplayString(TRUE); + InbvSetScrollRegion(0, 0, 639, 479); + + /* Display shutdown logo and message */ + Logo1 = InbvGetResourceAddress(IDB_SHUTDOWN_LOGO); + Logo2 = InbvGetResourceAddress(IDB_LOGO); + if ((Logo1) && (Logo2)) + { + InbvBitBlt(Logo1, 215, 352); + InbvBitBlt(Logo2, 217, 111); + } + } + else + { + /* Do it in text-mode */ + for (i = 0; i < 25; i++) InbvDisplayString("\n"); + InbvDisplayString(" "); + InbvDisplayString("The system may be powered off now.\n"); + } + + /* Hang the system */ + for (;;) HalHaltSystem(); +} + +VOID +NTAPI +PopShutdownSystem(IN POWER_ACTION SystemAction) +{ + /* Note should notify caller of NtPowerInformation(PowerShutdownNotification) */ + + /* Unload symbols */ + DPRINT1("It's the final countdown...%lx\n", SystemAction); + DbgUnLoadImageSymbols(NULL, (PVOID)-1, 0); + + /* Run the thread on the boot processor */ + KeSetSystemAffinityThread(1); + + /* Now check what the caller wants */ + switch (SystemAction) + { + /* Reset */ + case PowerActionShutdownReset: + + /* Try platform driver first, then legacy */ + //PopInvokeSystemStateHandler(PowerStateShutdownReset, NULL); + HalReturnToFirmware(HalRebootRoutine); + break; + + case PowerActionShutdown: + + /* Check for group policy that says to use "it is now safe" screen */ + if (PopShutdownPowerOffPolicy) + { + /* FIXFIX: Switch to legacy shutdown handler */ + //PopPowerStateHandlers[PowerStateShutdownOff].Handler = PopShutdownHandler; + } + + case PowerActionShutdownOff: + + /* Call shutdown handler */ + //PopInvokeSystemStateHandler(PowerStateShutdownOff, NULL); + + /* ReactOS Hack */ + PopSetSystemPowerState(PowerSystemShutdown); + PopShutdownHandler(); + + /* If that didn't work, call the HAL */ + HalReturnToFirmware(HalPowerDownRoutine); + break; + + default: + break; + } + + /* Anything else should not happen */ + KeBugCheckEx(INTERNAL_POWER_ERROR, 5, 0, 0, 0); +} + +VOID +NTAPI +PopGracefulShutdown(IN PVOID Context) +{ + PEPROCESS Process = NULL; + + /* Loop every process */ + Process = PsGetNextProcess(Process); + while (Process) + { + /* Make sure this isn't the idle or initial process */ + if ((Process != PsInitialSystemProcess) && (Process != PsIdleProcess)) + { + /* Print it */ + DPRINT1("%15s is still RUNNING (%lx)\n", Process->ImageFileName, Process->UniqueProcessId); + } + + /* Get the next process */ + Process = PsGetNextProcess(Process); + } + + /* First, the HAL handles any "end of boot" special functionality */ + DPRINT1("HAL shutting down\n"); + HalEndOfBoot(); + + /* In this step, the I/O manager does first-chance shutdown notification */ + DPRINT1("I/O manager shutting down in phase 0\n"); + IoShutdownSystem(0); + + /* In this step, all workers are killed and hives are flushed */ + DPRINT1("Configuration Manager shutting down\n"); + CmShutdownSystem(); + + /* Note that modified pages should be written here (MiShutdownSystem) */ + + /* In this step, the I/O manager does last-chance shutdown notification */ + DPRINT1("I/O manager shutting down in phase 1\n"); + IoShutdownSystem(1); + CcWaitForCurrentLazyWriterActivity(); + + /* Note that here, we should broadcast the power IRP to devices */ + + /* In this step, the HAL disables any wake timers */ + DPRINT1("Disabling wake timers\n"); + HalSetWakeEnable(FALSE); + + /* And finally the power request is sent */ + DPRINT1("Taking the system down\n"); + PopShutdownSystem(PopAction.Action); +} + +VOID +NTAPI +PopReadShutdownPolicy(VOID) +{ + UNICODE_STRING KeyString; + OBJECT_ATTRIBUTES ObjectAttributes; + NTSTATUS Status; + HANDLE KeyHandle; + ULONG Length; + UCHAR Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG)]; + PKEY_VALUE_PARTIAL_INFORMATION Info = (PVOID)Buffer; + + /* Setup object attributes */ + RtlInitUnicodeString(&KeyString, + L"\\Registry\\Machine\\Software\\Policies\\Microsoft\\Windows NT"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyString, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + NULL, + NULL); + + /* Open the key */ + Status = ZwOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + /* Open the policy value and query it */ + RtlInitUnicodeString(&KeyString, L"DontPowerOffAfterShutdown"); + Status = ZwQueryValueKey(KeyHandle, + &KeyString, + KeyValuePartialInformation, + &Info, + sizeof(Info), + &Length); + if ((NT_SUCCESS(Status)) && (Info->Type == REG_DWORD)) + { + /* Read the policy */ + PopShutdownPowerOffPolicy = *Info->Data == 1; + } + + /* Close the key */ + ZwClose(KeyHandle); + } +} + +/* PUBLIC FUNCTIONS **********************************************************/ + diff --git a/reactos/ntoskrnl/po/povolume.c b/reactos/ntoskrnl/po/povolume.c new file mode 100644 index 00000000000..15aaebf7586 --- /dev/null +++ b/reactos/ntoskrnl/po/povolume.c @@ -0,0 +1,331 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: BSD - See COPYING.ARM in the top level directory + * FILE: ntoskrnl/po/povolume.c + * PURPOSE: Power Manager DOPE and Volume Management + * PROGRAMMERS: ReactOS Portable Systems Group + */ + +/* INCLUDES ******************************************************************/ + +#include +#define NDEBUG +#include + +/* GLOBALS *******************************************************************/ + +typedef struct _POP_FLUSH_VOLUME +{ + LIST_ENTRY List; + LONG Count; + KEVENT Wait; +} POP_FLUSH_VOLUME, *PPOP_FLUSH_VOLUME; + +ULONG PopFlushPolicy = 0; + +KGUARDED_MUTEX PopVolumeLock; +LIST_ENTRY PopVolumeDevices; +KSPIN_LOCK PopDopeGlobalLock; + +/* PRIVATE FUNCTIONS *********************************************************/ + +PDEVICE_OBJECT_POWER_EXTENSION +NTAPI +PopGetDope(IN PDEVICE_OBJECT DeviceObject) +{ + PEXTENDED_DEVOBJ_EXTENSION DeviceExtension; + PDEVICE_OBJECT_POWER_EXTENSION Dope; + KIRQL OldIrql; + PAGED_CODE(); + + /* If the device already has the dope, return it */ + DeviceExtension = IoGetDevObjExtension(DeviceObject); + if (DeviceExtension->Dope) goto Return; + + /* Allocate some dope for the device */ + Dope = ExAllocatePoolWithTag(NonPagedPool, + sizeof(DEVICE_OBJECT_POWER_EXTENSION), + 'Dope'); + if (!Dope) goto Return; + + /* Initialize the initial contents of the dope */ + RtlZeroMemory(Dope, sizeof(DEVICE_OBJECT_POWER_EXTENSION)); + Dope->DeviceObject = DeviceObject; + Dope->State = PowerDeviceUnspecified; + InitializeListHead(&Dope->IdleList); + + /* Make sure only one caller can assign dope to a device */ + KeAcquireSpinLock(&PopDopeGlobalLock, &OldIrql); + + /* Make sure the device still has no dope */ + if (!DeviceExtension->Dope) + { + /* Give the local dope to this device, and remember we won the race */ + DeviceExtension->Dope = (PVOID)Dope; + Dope = NULL; + } + + /* Allow other dope transactions now */ + KeReleaseSpinLock(&PopDopeGlobalLock, OldIrql); + + /* Check if someone other than us already assigned the dope, so free ours */ + if (Dope) ExFreePoolWithTag(Dope, 'Dope'); + + /* Return the dope to the caller */ +Return: + return (PDEVICE_OBJECT_POWER_EXTENSION)DeviceExtension->Dope; +} + +VOID +NTAPI +PoVolumeDevice(IN PDEVICE_OBJECT DeviceObject) +{ + PDEVICE_OBJECT_POWER_EXTENSION Dope; + PAGED_CODE(); + + /* Get dope from the device (if the device has no dope, it will receive some) */ + Dope = PopGetDope(DeviceObject); + if (Dope) + { + /* Make sure we can flush safely */ + KeAcquireGuardedMutex(&PopVolumeLock); + + /* Add this volume into the list of power-manager volumes */ + if (!Dope->Volume.Flink) InsertTailList(&PopVolumeDevices, &Dope->Volume); + + /* Allow flushes to go through */ + KeReleaseGuardedMutex(&PopVolumeLock); + } +} + +VOID +NTAPI +PopFlushVolumeWorker(IN PVOID Context) +{ + PPOP_FLUSH_VOLUME FlushContext = (PPOP_FLUSH_VOLUME)Context; + PDEVICE_OBJECT_POWER_EXTENSION Dope; + PLIST_ENTRY NextEntry; + NTSTATUS Status; + UCHAR Buffer[sizeof(OBJECT_NAME_INFORMATION) + 512]; + POBJECT_NAME_INFORMATION NameInfo = (PVOID)Buffer; + ULONG Length; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE VolumeHandle; + IO_STATUS_BLOCK IoStatusBlock; + + /* Acquire the flush lock since we're messing with the list */ + KeAcquireGuardedMutex(&PopVolumeLock); + + /* Loop the flush list */ + while (!IsListEmpty(&FlushContext->List)) + { + /* Grab the next (ie: current) entry and remove it */ + NextEntry = FlushContext->List.Flink; + RemoveEntryList(NextEntry); + + /* Add it back on the volume list */ + InsertTailList(&PopVolumeDevices, NextEntry); + + /* Done touching the volume list */ + KeReleaseGuardedMutex(&PopVolumeLock); + + /* Get the dope from the volume link */ + Dope = CONTAINING_RECORD(NextEntry, DEVICE_OBJECT_POWER_EXTENSION, Volume); + + /* Get the name */ + Status = ObQueryNameString(Dope->DeviceObject, + NameInfo, + sizeof(Buffer), + &Length); + if ((NT_SUCCESS(Status)) && (NameInfo->Name.Buffer)) + { + /* Open the volume */ + DPRINT1("Opening: %wZ\n", &NameInfo->Name); + InitializeObjectAttributes(&ObjectAttributes, + &NameInfo->Name, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + 0, + 0); + Status = ZwCreateFile(&VolumeHandle, + SYNCHRONIZE | FILE_READ_DATA | FILE_WRITE_DATA, + &ObjectAttributes, + &IoStatusBlock, + NULL, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_OPEN, + 0, + NULL, + 0); + if (NT_SUCCESS(Status)) + { + /* Flush it and close it */ + DPRINT1("Sending flush to: %lx\n", VolumeHandle); + ZwFlushBuffersFile(VolumeHandle, &IoStatusBlock); + ZwClose(VolumeHandle); + } + } + + /* Acquire the flush lock again since we'll touch the list */ + KeAcquireGuardedMutex(&PopVolumeLock); + } + + /* One more flush completed... if it was the last, signal the caller */ + if (!--FlushContext->Count) KeSetEvent(&FlushContext->Wait, IO_NO_INCREMENT, FALSE); + + /* Serialize with flushers */ + KeReleaseGuardedMutex(&PopVolumeLock); +} + +VOID +NTAPI +PopFlushVolumes(IN BOOLEAN ShuttingDown) +{ + POP_FLUSH_VOLUME FlushContext = {{0}}; + ULONG FlushPolicy; + UNICODE_STRING RegistryName = RTL_CONSTANT_STRING(L"\\Registry"); + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE RegistryHandle; + PLIST_ENTRY NextEntry; + PDEVICE_OBJECT_POWER_EXTENSION Dope; + ULONG VolumeCount = 0; + NTSTATUS Status; + HANDLE ThreadHandle; + ULONG ThreadCount; + + /* Setup the flush context */ + InitializeListHead(&FlushContext.List); + KeInitializeEvent(&FlushContext.Wait, NotificationEvent, FALSE); + + /* What to flush */ + FlushPolicy = ShuttingDown ? 1 | 2 : PopFlushPolicy; + if ((FlushPolicy & 1)) + { + /* Registry flush requested, so open it */ + DPRINT1("Opening registry\n"); + InitializeObjectAttributes(&ObjectAttributes, + &RegistryName, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, + NULL, + NULL); + Status = ZwOpenKey(&RegistryHandle, KEY_READ, &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + /* Flush the registry */ + DPRINT1("Flushing registry\n"); + ZwFlushKey(RegistryHandle); + ZwClose(RegistryHandle); + } + } + + /* Serialize with other flushes */ + KeAcquireGuardedMutex(&PopVolumeLock); + + /* Scan the volume list */ + NextEntry = PopVolumeDevices.Flink; + while (NextEntry != &PopVolumeDevices) + { + /* Get the dope from the link */ + Dope = CONTAINING_RECORD(NextEntry, DEVICE_OBJECT_POWER_EXTENSION, Volume); + + /* Grab the next entry now, since we'll be modifying the list */ + NextEntry = NextEntry->Flink; + + /* Make sure the object is mounted, writable, exists, and is not a floppy */ + if (!(Dope->DeviceObject->Vpb->Flags & VPB_MOUNTED) || + (Dope->DeviceObject->Characteristics & FILE_FLOPPY_DISKETTE) || + (Dope->DeviceObject->Characteristics & FILE_READ_ONLY_DEVICE) || + ((Dope->DeviceObject->Vpb->RealDevice) && + (Dope->DeviceObject->Vpb->RealDevice->Characteristics & FILE_FLOPPY_DISKETTE))) + { + /* Not flushable */ + continue; + } + + /* Remove it from the dope and add it to the flush context list */ + RemoveEntryList(&Dope->Volume); + InsertTailList(&FlushContext.List, &Dope->Volume); + + /* Next */ + VolumeCount++; + } + + /* Check if we should skip non-removable devices */ + if (!(FlushPolicy & 2)) + { + /* ReactOS only implements this routine for shutdown, which requires it */ + UNIMPLEMENTED; + while (TRUE); + } + + /* Check if there were no volumes at all */ + if (!VolumeCount) + { + /* Nothing to do */ + KeReleaseGuardedMutex(&PopVolumeLock); + return; + } + + /* Allocate up to 8 flusher threads */ + ThreadCount = min(VolumeCount, 8); + InitializeObjectAttributes(&ObjectAttributes, + NULL, + OBJ_KERNEL_HANDLE, + NULL, + NULL); + + /* We will ourselves become a flusher thread */ + FlushContext.Count = 1; + ThreadCount--; + + /* Look for any extra ones we might need */ + while (ThreadCount > 0) + { + /* Create a new one */ + ThreadCount--; + DPRINT1("Creating flush thread\n"); + Status = PsCreateSystemThread(&ThreadHandle, + THREAD_ALL_ACCESS, + &ObjectAttributes, + 0L, + NULL, + PopFlushVolumeWorker, + &FlushContext); + if (NT_SUCCESS(Status)) + { + /* One more created... */ + FlushContext.Count++; + ZwClose(ThreadHandle); + } + } + + /* Allow flushes to go through */ + KeReleaseGuardedMutex(&PopVolumeLock); + + /* Enter the flush work */ + DPRINT1("Local flush\n"); + PopFlushVolumeWorker(&FlushContext); + + /* Wait for all flushes to be over */ + DPRINT1("Waiting for flushes\n"); + KeWaitForSingleObject(&FlushContext.Wait, Executive, KernelMode, FALSE, NULL); + DPRINT1("Flushes have completed\n"); +} + +VOID +NTAPI +PoInitializeDeviceObject(IN OUT PDEVOBJ_EXTENSION DeviceObjectExtension) +{ + PEXTENDED_DEVOBJ_EXTENSION DeviceExtension = (PVOID)DeviceObjectExtension; + PAGED_CODE(); + + /* Initialize the power flags */ + DeviceExtension->PowerFlags = PowerSystemUnspecified & 0xF; + DeviceExtension->PowerFlags |= ((PowerDeviceUnspecified << 4) & 0xF0); + + /* The device object is not on drugs yet */ + DeviceExtension->Dope = NULL; +} + +/* PUBLIC FUNCTIONS **********************************************************/ + diff --git a/reactos/ntoskrnl/po/power.c b/reactos/ntoskrnl/po/power.c index f103898d2f5..eb163b63c71 100644 --- a/reactos/ntoskrnl/po/power.c +++ b/reactos/ntoskrnl/po/power.c @@ -24,6 +24,8 @@ typedef struct _REQUEST_POWER_ITEM PDEVICE_NODE PopSystemPowerDeviceNode = NULL; BOOLEAN PopAcpiPresent = FALSE; +POP_POWER_ACTION PopAction; +WORK_QUEUE_ITEM PopShutdownWorkItem; /* PRIVATE FUNCTIONS *********************************************************/ @@ -45,10 +47,11 @@ PopRequestPowerIrpCompletion(IN PDEVICE_OBJECT DeviceObject, RequestPowerItem->PowerState, RequestPowerItem->Context, &Irp->IoStatus); - - ExFreePool(&Irp->IoStatus); + ExFreePool(Context); + IoFreeIrp(Irp); + return STATUS_SUCCESS; } @@ -165,6 +168,13 @@ PoInitSystem(IN ULONG BootPhase) PopAcpiPresent = KeLoaderBlock->Extension->AcpiTable != NULL ? TRUE : FALSE; } + + /* Initialize volume support */ + InitializeListHead(&PopVolumeDevices); + KeInitializeGuardedMutex(&PopVolumeLock); + + /* Initialize support for dope */ + KeInitializeSpinLock(&PopDopeGlobalLock); return TRUE; } @@ -349,7 +359,6 @@ PoRequestPowerIrp(IN PDEVICE_OBJECT DeviceObject, PDEVICE_OBJECT TopDeviceObject; PIO_STACK_LOCATION Stack; PIRP Irp; - PIO_STATUS_BLOCK IoStatusBlock; PREQUEST_POWER_ITEM RequestPowerItem; NTSTATUS Status; @@ -361,27 +370,19 @@ PoRequestPowerIrp(IN PDEVICE_OBJECT DeviceObject, RequestPowerItem = ExAllocatePool(NonPagedPool, sizeof(REQUEST_POWER_ITEM)); if (!RequestPowerItem) return STATUS_INSUFFICIENT_RESOURCES; - IoStatusBlock = ExAllocatePool(NonPagedPool, sizeof(IO_STATUS_BLOCK)); - if (!IoStatusBlock) - { - ExFreePool(RequestPowerItem); - return STATUS_INSUFFICIENT_RESOURCES; - } /* Always call the top of the device stack */ TopDeviceObject = IoGetAttachedDeviceReference(DeviceObject); - Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP, - TopDeviceObject, - NULL, - 0, - NULL, - NULL, - IoStatusBlock); + Irp = IoBuildAsynchronousFsdRequest(IRP_MJ_POWER, + TopDeviceObject, + NULL, + 0, + NULL, + NULL); if (!Irp) { ExFreePool(RequestPowerItem); - ExFreePool(IoStatusBlock); return STATUS_INSUFFICIENT_RESOURCES; } @@ -395,7 +396,10 @@ PoRequestPowerIrp(IN PDEVICE_OBJECT DeviceObject, if (MinorFunction == IRP_MN_WAIT_WAKE) Stack->Parameters.WaitWake.PowerState = PowerState.SystemState; else - Stack->Parameters.WaitWake.PowerState = PowerState.DeviceState; + { + Stack->Parameters.Power.Type = DevicePowerState; + Stack->Parameters.Power.State = PowerState; + } RequestPowerItem->CompletionRoutine = CompletionFunction; RequestPowerItem->PowerState = PowerState; @@ -636,3 +640,138 @@ NtSetThreadExecutionState(IN EXECUTION_STATE esFlags, /* All is good */ return STATUS_SUCCESS; } + +NTSTATUS +NTAPI +NtSetSystemPowerState(IN POWER_ACTION SystemAction, + IN SYSTEM_POWER_STATE MinSystemState, + IN ULONG Flags) +{ + KPROCESSOR_MODE PreviousMode = KeGetPreviousMode(); + POP_POWER_ACTION Action = {0}; + NTSTATUS Status; + + /* Check for invalid parameter combinations */ + if ((MinSystemState >= PowerSystemMaximum) || + (MinSystemState <= PowerSystemUnspecified) || + (SystemAction > PowerActionWarmEject) || + (SystemAction < PowerActionReserved) || + (Flags & ~(POWER_ACTION_QUERY_ALLOWED | + POWER_ACTION_UI_ALLOWED | + POWER_ACTION_OVERRIDE_APPS | + POWER_ACTION_LIGHTEST_FIRST | + POWER_ACTION_LOCK_CONSOLE | + POWER_ACTION_DISABLE_WAKES | + POWER_ACTION_CRITICAL))) + { + DPRINT1("NtSetSystemPowerState: Bad parameters!\n"); + DPRINT1(" SystemAction: 0x%x\n", SystemAction); + DPRINT1(" MinSystemState: 0x%x\n", MinSystemState); + DPRINT1(" Flags: 0x%x\n", Flags); + return STATUS_INVALID_PARAMETER; + } + + /* Check for user caller */ + if (PreviousMode != KernelMode) + { + /* Check for shutdown permission */ + if (!SeSinglePrivilegeCheck(SeShutdownPrivilege, PreviousMode)) + { + /* Not granted */ + DPRINT1("ERROR: Privilege not held for shutdown\n"); + //return STATUS_PRIVILEGE_NOT_HELD; HACK! + } + + /* Do it as a kernel-mode caller for consistency with system state */ + return ZwSetSystemPowerState (SystemAction, MinSystemState, Flags); + } + + /* Read policy settings (partial shutdown vs. full shutdown) */ + if (SystemAction == PowerActionShutdown) PopReadShutdownPolicy(); + + /* Disable lazy flushing of registry */ + DPRINT1("Stopping lazy flush\n"); + CmSetLazyFlushState(FALSE); + + /* Setup the power action */ + Action.Action = SystemAction; + Action.Flags = Flags; + + /* Notify callbacks */ + DPRINT1("Notifying callbacks\n"); + ExNotifyCallback(PowerStateCallback, (PVOID)3, NULL); + + /* Swap in any worker thread stacks */ + DPRINT1("Swapping worker threads\n"); + ExSwapinWorkerThreads(FALSE); + + /* Make our action global */ + PopAction = Action; + + /* Start power loop */ + Status = STATUS_CANCELLED; + while (TRUE) + { + /* Break out if there's nothing to do */ + if (Action.Action == PowerActionNone) break; + + /* Check for first-pass or restart */ + if (Status == STATUS_CANCELLED) + { + /* Check for shutdown action */ + if ((PopAction.Action == PowerActionShutdown) || + (PopAction.Action == PowerActionShutdownReset) || + (PopAction.Action == PowerActionShutdownOff)) + { + /* Set the action */ + PopAction.Shutdown = TRUE; + } + + /* Now we are good to go */ + Status = STATUS_SUCCESS; + } + + /* Check if we're still in an invalid status */ + if (!NT_SUCCESS(Status)) break; + + /* Flush all volumes and the registry */ + DPRINT1("Flushing volumes\n"); + PopFlushVolumes(PopAction.Shutdown); + + /* Set IRP for drivers */ + PopAction.IrpMinor = IRP_MN_SET_POWER; + if (PopAction.Shutdown) + { + DPRINT1("Queueing shutdown thread\n"); + /* Check if we are running in the system context */ + if (PsGetCurrentProcess() != PsInitialSystemProcess) + { + /* We're not, so use a worker thread for shutdown */ + ExInitializeWorkItem(&PopShutdownWorkItem, + &PopGracefulShutdown, + NULL); + + ExQueueWorkItem(&PopShutdownWorkItem, CriticalWorkQueue); + + /* Spend us -- when we wake up, the system is good to go down */ + KeSuspendThread(KeGetCurrentThread()); + Status = STATUS_SYSTEM_SHUTDOWN; + goto Exit; + + } + else + { + /* Do the shutdown inline */ + PopGracefulShutdown(NULL); + } + } + + /* You should not have made it this far */ + ASSERT(FALSE && "System is still up and running?!"); + break; + } + +Exit: + /* We're done, return */ + return Status; +} diff --git a/reactos/ntoskrnl/ps/security.c b/reactos/ntoskrnl/ps/security.c index 27895d35057..ffb894c083b 100644 --- a/reactos/ntoskrnl/ps/security.c +++ b/reactos/ntoskrnl/ps/security.c @@ -206,7 +206,7 @@ PspAssignPrimaryToken(IN PEPROCESS Process, /* Dereference Tokens and Return */ if (NT_SUCCESS(Status)) ObDereferenceObject(OldToken); - if (AccessToken) ObDereferenceObject(NewToken); + if (!AccessToken) ObDereferenceObject(NewToken); return Status; } @@ -965,32 +965,32 @@ NtImpersonateThread(IN HANDLE ThreadHandle, /* Reference the thread */ Status = ObReferenceObjectByHandle(ThreadHandle, - THREAD_IMPERSONATE, + THREAD_DIRECT_IMPERSONATION, PsThreadType, PreviousMode, (PVOID*)&Thread, NULL); - if(NT_SUCCESS(Status)) + if (NT_SUCCESS(Status)) { /* Reference the impersonating thead */ Status = ObReferenceObjectByHandle(ThreadToImpersonateHandle, - THREAD_DIRECT_IMPERSONATION, + THREAD_IMPERSONATE, PsThreadType, PreviousMode, (PVOID*)&ThreadToImpersonate, NULL); - if(NT_SUCCESS(Status)) + if (NT_SUCCESS(Status)) { /* Create a client security context */ Status = SeCreateClientSecurity(ThreadToImpersonate, SecurityQualityOfService, 0, &ClientContext); - if(NT_SUCCESS(Status)) + if (NT_SUCCESS(Status)) { /* Do the impersonation */ SeImpersonateClient(&ClientContext, Thread); - if(ClientContext.ClientToken) + if (ClientContext.ClientToken) { /* Dereference the client token if we had one */ ObDereferenceObject(ClientContext.ClientToken); diff --git a/reactos/ntoskrnl/se/semgr.c b/reactos/ntoskrnl/se/semgr.c index fdee0973027..38b1274970c 100644 --- a/reactos/ntoskrnl/se/semgr.c +++ b/reactos/ntoskrnl/se/semgr.c @@ -279,6 +279,7 @@ SeDefaultObjectMethod(IN PVOID Object, return STATUS_SUCCESS; } +ULONG SidInTokenCalls = 0; static BOOLEAN SepSidInToken(PACCESS_TOKEN _Token, @@ -289,6 +290,9 @@ SepSidInToken(PACCESS_TOKEN _Token, PAGED_CODE(); + SidInTokenCalls++; + if (!(SidInTokenCalls % 10000)) DPRINT1("SidInToken Calls: %d\n", SidInTokenCalls); + if (Token->UserAndGroupCount == 0) { return FALSE; @@ -298,7 +302,7 @@ SepSidInToken(PACCESS_TOKEN _Token, { if (RtlEqualSid(Sid, Token->UserAndGroups[i].Sid)) { - if (Token->UserAndGroups[i].Attributes & SE_GROUP_ENABLED) + if ((i == 0)|| (Token->UserAndGroups[i].Attributes & SE_GROUP_ENABLED)) { return TRUE; } @@ -470,7 +474,16 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, SeUnlockSubjectContext(SubjectSecurityContext); } - *GrantedAccess = DesiredAccess; + if (DesiredAccess & MAXIMUM_ALLOWED) + { + *GrantedAccess = GenericMapping->GenericAll; + *GrantedAccess |= (DesiredAccess & ~MAXIMUM_ALLOWED); + } + else + { + *GrantedAccess = DesiredAccess | PreviouslyGrantedAccess; + } + *AccessStatus = STATUS_SUCCESS; return TRUE; } @@ -691,6 +704,27 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, return STATUS_SUCCESS; } + /* Protect probe in SEH */ + _SEH2_TRY + { + /* Probe all pointers */ + ProbeForRead(GenericMapping, sizeof(GENERIC_MAPPING), sizeof(ULONG)); + ProbeForRead(PrivilegeSetLength, sizeof(ULONG), sizeof(ULONG)); + ProbeForWrite(PrivilegeSet, *PrivilegeSetLength, sizeof(ULONG)); + ProbeForWrite(GrantedAccess, sizeof(ACCESS_MASK), sizeof(ULONG)); + ProbeForWrite(AccessStatus, sizeof(NTSTATUS), sizeof(ULONG)); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Return the exception code */ + _SEH2_YIELD(return _SEH2_GetExceptionCode()); + } + _SEH2_END; + + /* Check for unmapped access rights */ + if (DesiredAccess & (GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL)) + return STATUS_GENERIC_NOT_MAPPED; + /* Reference the token */ Status = ObReferenceObjectByHandle(TokenHandle, TOKEN_QUERY, @@ -709,7 +743,15 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, { DPRINT1("No impersonation token\n"); ObDereferenceObject(Token); - return STATUS_ACCESS_DENIED; + return STATUS_NO_IMPERSONATION_TOKEN; + } + + /* Check the impersonation level */ + if (Token->ImpersonationLevel < SecurityIdentification) + { + DPRINT1("Impersonation level < SecurityIdentification\n"); + ObDereferenceObject(Token); + return STATUS_BAD_IMPERSONATION_LEVEL; } /* Set up the subject context, and lock it */ diff --git a/reactos/ntoskrnl/se/token.c b/reactos/ntoskrnl/se/token.c index 38e5012c559..44481d6cf28 100644 --- a/reactos/ntoskrnl/se/token.c +++ b/reactos/ntoskrnl/se/token.c @@ -22,6 +22,9 @@ POBJECT_TYPE SepTokenObjectType = NULL; ERESOURCE SepTokenLock; +TOKEN_SOURCE SeSystemTokenSource = {"*SYSTEM*", {0}}; +LUID SeSystemAuthenticationId = SYSTEM_LUID; + static GENERIC_MAPPING SepTokenMapping = {TOKEN_READ, TOKEN_WRITE, TOKEN_EXECUTE, @@ -244,7 +247,7 @@ SepDuplicateToken(PTOKEN Token, (PVOID*)&AccessToken); if (!NT_SUCCESS(Status)) { - DPRINT1("ObCreateObject() failed (Status %lx)\n"); + DPRINT1("ObCreateObject() failed (Status %lx)\n", Status); return(Status); } @@ -510,34 +513,80 @@ SeAssignPrimaryToken(IN PEPROCESS Process, ObInitializeFastReference(&Process->Token, Token); } -PTOKEN + +NTSTATUS NTAPI -SepCreateSystemProcessToken(VOID) -{ - NTSTATUS Status; - ULONG uSize; - ULONG i; - ULONG uLocalSystemLength; - ULONG uWorldLength; - ULONG uAuthUserLength; - ULONG uAdminsLength; +SepCreateToken(OUT PHANDLE TokenHandle, + IN KPROCESSOR_MODE PreviousMode, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN TOKEN_TYPE TokenType, + IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, + IN PLUID AuthenticationId, + IN PLARGE_INTEGER ExpirationTime, + IN PSID_AND_ATTRIBUTES User, + IN ULONG GroupCount, + IN PSID_AND_ATTRIBUTES Groups, + IN ULONG GroupLength, + IN ULONG PrivilegeCount, + IN PLUID_AND_ATTRIBUTES Privileges, + IN PSID Owner, + IN PSID PrimaryGroup, + IN PACL DefaultDacl, + IN PTOKEN_SOURCE TokenSource, + IN BOOLEAN SystemToken) +{ PTOKEN AccessToken; - PVOID SidArea; + LUID TokenId; + LUID ModifiedId; + PVOID EndMem; + ULONG uLength; + ULONG i; + NTSTATUS Status; + ULONG TokenFlags = 0; - PAGED_CODE(); + /* Loop all groups */ + for (i = 0; i < GroupCount; i++) + { + /* Check for mandatory groups */ + if (Groups[i].Attributes & SE_GROUP_MANDATORY) + { + /* Force them to be enabled */ + Groups[i].Attributes |= (SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT); + } + + /* Check of the group is an admin group */ + if (RtlEqualSid(SeAliasAdminsSid, Groups[i].Sid)) + { + /* Remember this so we can optimize queries later */ + TokenFlags |= TOKEN_HAS_ADMIN_GROUP; + } + } - uLocalSystemLength = RtlLengthSid(SeLocalSystemSid); - uWorldLength = RtlLengthSid(SeWorldSid); - uAuthUserLength = RtlLengthSid(SeAuthenticatedUserSid); - uAdminsLength = RtlLengthSid(SeAliasAdminsSid); + /* Loop all privileges */ + for (i = 0; i < PrivilegeCount; i++) + { + /* For optimization, check for change notify and impersonate rights */ + if (((RtlEqualLuid(&Privileges[i].Luid, &SeChangeNotifyPrivilege)) && + (Privileges[i].Attributes & SE_PRIVILEGE_ENABLED))) + { + /* Remember token has traverse */ + TokenFlags |= TOKEN_HAS_TRAVERSE_PRIVILEGE; + } + } + + Status = ZwAllocateLocallyUniqueId(&TokenId); + if (!NT_SUCCESS(Status)) + return(Status); - /* - * Initialize the token - */ - Status = ObCreateObject(KernelMode, + Status = ZwAllocateLocallyUniqueId(&ModifiedId); + if (!NT_SUCCESS(Status)) + return(Status); + + Status = ObCreateObject(PreviousMode, SepTokenObjectType, - NULL, - KernelMode, + ObjectAttributes, + PreviousMode, NULL, sizeof(TOKEN), 0, @@ -545,180 +594,279 @@ SepCreateSystemProcessToken(VOID) (PVOID*)&AccessToken); if (!NT_SUCCESS(Status)) { - return NULL; + DPRINT1("ObCreateObject() failed (Status %lx)\n"); + return(Status); } /* Zero out the buffer */ RtlZeroMemory(AccessToken, sizeof(TOKEN)); - Status = ExpAllocateLocallyUniqueId(&AccessToken->TokenId); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(AccessToken); - return NULL; - } - - Status = ExpAllocateLocallyUniqueId(&AccessToken->ModifiedId); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(AccessToken); - return NULL; - } - - Status = ExpAllocateLocallyUniqueId(&AccessToken->AuthenticationId); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(AccessToken); - return NULL; - } - AccessToken->TokenLock = &SepTokenLock; - AccessToken->TokenType = TokenPrimary; - AccessToken->ImpersonationLevel = SecurityDelegation; - memcpy(AccessToken->TokenSource.SourceName, "SeMgr\0\0\0", 8); - AccessToken->ExpirationTime.QuadPart = -1; - AccessToken->UserAndGroupCount = 4; + RtlCopyLuid(&AccessToken->TokenSource.SourceIdentifier, + &TokenSource->SourceIdentifier); + memcpy(AccessToken->TokenSource.SourceName, + TokenSource->SourceName, + sizeof(TokenSource->SourceName)); - uSize = sizeof(SID_AND_ATTRIBUTES) * AccessToken->UserAndGroupCount; - uSize += uLocalSystemLength; - uSize += uWorldLength; - uSize += uAuthUserLength; - uSize += uAdminsLength; + RtlCopyLuid(&AccessToken->TokenId, &TokenId); + RtlCopyLuid(&AccessToken->AuthenticationId, AuthenticationId); + AccessToken->ExpirationTime = *ExpirationTime; + RtlCopyLuid(&AccessToken->ModifiedId, &ModifiedId); + + AccessToken->UserAndGroupCount = GroupCount + 1; + AccessToken->PrivilegeCount = PrivilegeCount; + + AccessToken->TokenFlags = TokenFlags; + AccessToken->TokenType = TokenType; + AccessToken->ImpersonationLevel = ImpersonationLevel; + + /* + * Normally we would just point these members into the variable information + * area; however, our ObCreateObject() call can't allocate a variable information + * area, so we allocate them seperately and provide a destroy function. + */ + + uLength = sizeof(SID_AND_ATTRIBUTES) * AccessToken->UserAndGroupCount; + uLength += RtlLengthSid(User); + for (i = 0; i < GroupCount; i++) + uLength += RtlLengthSid(Groups[i].Sid); AccessToken->UserAndGroups = (PSID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool, - uSize, + uLength, 'uKOT'); - SidArea = &AccessToken->UserAndGroups[AccessToken->UserAndGroupCount]; + EndMem = &AccessToken->UserAndGroups[AccessToken->UserAndGroupCount]; + + Status = RtlCopySidAndAttributesArray(1, + User, + uLength, + AccessToken->UserAndGroups, + EndMem, + &EndMem, + &uLength); + if (NT_SUCCESS(Status)) + { + Status = RtlCopySidAndAttributesArray(GroupCount, + Groups, + uLength, + &AccessToken->UserAndGroups[1], + EndMem, + &EndMem, + &uLength); + } + + if (NT_SUCCESS(Status)) + { + Status = SepFindPrimaryGroupAndDefaultOwner( + AccessToken, + PrimaryGroup, + Owner); + } + + if (NT_SUCCESS(Status)) + { + uLength = PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES); + AccessToken->Privileges = + (PLUID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool, + uLength, + 'pKOT'); + + if (PreviousMode != KernelMode) + { + _SEH2_TRY + { + RtlCopyMemory(AccessToken->Privileges, + Privileges, + PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES)); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + } + else + { + RtlCopyMemory(AccessToken->Privileges, + Privileges, + PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES)); + } + } + + if (NT_SUCCESS(Status)) + { + AccessToken->DefaultDacl = + (PACL) ExAllocatePoolWithTag(PagedPool, + DefaultDacl->AclSize, + 'kDOT'); + memcpy(AccessToken->DefaultDacl, + DefaultDacl, + DefaultDacl->AclSize); + } + + if (!SystemToken) + { + + Status = ObInsertObject ((PVOID)AccessToken, + NULL, + DesiredAccess, + 0, + NULL, + TokenHandle); + if (!NT_SUCCESS(Status)) + { + DPRINT1("ObInsertObject() failed (Status %lx)\n", Status); + } + } + else + { + /* Return pointer instead of handle */ + *TokenHandle = (HANDLE)AccessToken; + } + + return Status; +} + +PTOKEN +NTAPI +SepCreateSystemProcessToken(VOID) +{ + LUID_AND_ATTRIBUTES Privileges[25]; + ULONG GroupAttributes, OwnerAttributes; + SID_AND_ATTRIBUTES Groups[32]; + LARGE_INTEGER Expiration; + SID_AND_ATTRIBUTES UserSid; + ULONG GroupLength; + PSID PrimaryGroup; + OBJECT_ATTRIBUTES ObjectAttributes; + PSID Owner; + ULONG i; + PTOKEN Token; + NTSTATUS Status; + + /* Don't ever expire */ + Expiration.QuadPart = -1; + + /* All groups mandatory and enabled */ + GroupAttributes = SE_GROUP_ENABLED | SE_GROUP_MANDATORY | SE_GROUP_ENABLED_BY_DEFAULT; + OwnerAttributes = SE_GROUP_ENABLED | SE_GROUP_OWNER | SE_GROUP_ENABLED_BY_DEFAULT; + + /* User is system */ + UserSid.Sid = SeLocalSystemSid; + UserSid.Attributes = 0; + + /* Primary group is local system */ + PrimaryGroup = SeLocalSystemSid; + + /* Owner is admins */ + Owner = SeAliasAdminsSid; + + /* Groups are admins, world, and authenticated users */ + Groups[0].Sid = SeAliasAdminsSid; + Groups[0].Attributes = OwnerAttributes; + Groups[1].Sid = SeWorldSid; + Groups[1].Attributes = GroupAttributes; + Groups[2].Sid = SeAuthenticatedUserSid; + Groups[2].Attributes = OwnerAttributes; + GroupLength = sizeof(SID_AND_ATTRIBUTES) + + SeLengthSid(Groups[0].Sid) + + SeLengthSid(Groups[1].Sid) + + SeLengthSid(Groups[2].Sid); + ASSERT(GroupLength <= sizeof(Groups)); + + /* Setup the privileges */ i = 0; - AccessToken->UserAndGroups[i].Sid = (PSID) SidArea; - AccessToken->UserAndGroups[i++].Attributes = 0; - RtlCopySid(uLocalSystemLength, SidArea, SeLocalSystemSid); - SidArea = (char*)SidArea + uLocalSystemLength; + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED; + Privileges[i++].Luid = SeTcbPrivilege; - AccessToken->DefaultOwnerIndex = i; - AccessToken->UserAndGroups[i].Sid = (PSID) SidArea; - AccessToken->PrimaryGroup = (PSID) SidArea; - AccessToken->UserAndGroups[i++].Attributes = SE_GROUP_ENABLED|SE_GROUP_ENABLED_BY_DEFAULT; - Status = RtlCopySid(uAdminsLength, SidArea, SeAliasAdminsSid); - SidArea = (char*)SidArea + uAdminsLength; + Privileges[i].Attributes = 0; + Privileges[i++].Luid = SeCreateTokenPrivilege; - AccessToken->UserAndGroups[i].Sid = (PSID) SidArea; - AccessToken->UserAndGroups[i++].Attributes = SE_GROUP_ENABLED|SE_GROUP_ENABLED_BY_DEFAULT|SE_GROUP_MANDATORY; - RtlCopySid(uWorldLength, SidArea, SeWorldSid); - SidArea = (char*)SidArea + uWorldLength; + Privileges[i].Attributes = 0; + Privileges[i++].Luid = SeTakeOwnershipPrivilege; - AccessToken->UserAndGroups[i].Sid = (PSID) SidArea; - AccessToken->UserAndGroups[i++].Attributes = SE_GROUP_ENABLED|SE_GROUP_ENABLED_BY_DEFAULT|SE_GROUP_MANDATORY; - RtlCopySid(uAuthUserLength, SidArea, SeAuthenticatedUserSid); - SidArea = (char*)SidArea + uAuthUserLength; + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + Privileges[i++].Luid = SeCreatePagefilePrivilege; - AccessToken->PrivilegeCount = 20; + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + Privileges[i++].Luid = SeLockMemoryPrivilege; - uSize = AccessToken->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES); - AccessToken->Privileges = - (PLUID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool, - uSize, - 'pKOT'); + Privileges[i].Attributes = 0; + Privileges[i++].Luid = SeAssignPrimaryTokenPrivilege; - i = 0; - AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; - AccessToken->Privileges[i++].Luid = SeTcbPrivilege; + Privileges[i].Attributes = 0; + Privileges[i++].Luid = SeIncreaseQuotaPrivilege; - AccessToken->Privileges[i].Attributes = 0; - AccessToken->Privileges[i++].Luid = SeCreateTokenPrivilege; + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + Privileges[i++].Luid = SeIncreaseBasePriorityPrivilege; - AccessToken->Privileges[i].Attributes = 0; - AccessToken->Privileges[i++].Luid = SeTakeOwnershipPrivilege; + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + Privileges[i++].Luid = SeCreatePermanentPrivilege; - AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; - AccessToken->Privileges[i++].Luid = SeCreatePagefilePrivilege; + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + Privileges[i++].Luid = SeDebugPrivilege; - AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; - AccessToken->Privileges[i++].Luid = SeLockMemoryPrivilege; + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + Privileges[i++].Luid = SeAuditPrivilege; - AccessToken->Privileges[i].Attributes = 0; - AccessToken->Privileges[i++].Luid = SeAssignPrimaryTokenPrivilege; + Privileges[i].Attributes = 0; + Privileges[i++].Luid = SeSecurityPrivilege; - AccessToken->Privileges[i].Attributes = 0; - AccessToken->Privileges[i++].Luid = SeIncreaseQuotaPrivilege; + Privileges[i].Attributes = 0; + Privileges[i++].Luid = SeSystemEnvironmentPrivilege; - AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; - AccessToken->Privileges[i++].Luid = SeIncreaseBasePriorityPrivilege; + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + Privileges[i++].Luid = SeChangeNotifyPrivilege; - AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; - AccessToken->Privileges[i++].Luid = SeCreatePermanentPrivilege; + Privileges[i].Attributes = 0; + Privileges[i++].Luid = SeBackupPrivilege; - AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; - AccessToken->Privileges[i++].Luid = SeDebugPrivilege; + Privileges[i].Attributes = 0; + Privileges[i++].Luid = SeRestorePrivilege; - AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; - AccessToken->Privileges[i++].Luid = SeAuditPrivilege; + Privileges[i].Attributes = 0; + Privileges[i++].Luid = SeShutdownPrivilege; - AccessToken->Privileges[i].Attributes = 0; - AccessToken->Privileges[i++].Luid = SeSecurityPrivilege; + Privileges[i].Attributes = 0; + Privileges[i++].Luid = SeLoadDriverPrivilege; - AccessToken->Privileges[i].Attributes = 0; - AccessToken->Privileges[i++].Luid = SeSystemEnvironmentPrivilege; - - AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; - AccessToken->Privileges[i++].Luid = SeChangeNotifyPrivilege; - - AccessToken->Privileges[i].Attributes = 0; - AccessToken->Privileges[i++].Luid = SeBackupPrivilege; - - AccessToken->Privileges[i].Attributes = 0; - AccessToken->Privileges[i++].Luid = SeRestorePrivilege; - - AccessToken->Privileges[i].Attributes = 0; - AccessToken->Privileges[i++].Luid = SeShutdownPrivilege; - - AccessToken->Privileges[i].Attributes = 0; - AccessToken->Privileges[i++].Luid = SeLoadDriverPrivilege; - - AccessToken->Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; - AccessToken->Privileges[i++].Luid = SeProfileSingleProcessPrivilege; - - AccessToken->Privileges[i].Attributes = 0; - AccessToken->Privileges[i++].Luid = SeSystemtimePrivilege; -#if 0 - AccessToken->Privileges[i].Attributes = 0; - AccessToken->Privileges[i++].Luid = SeUndockPrivilege; - - AccessToken->Privileges[i].Attributes = 0; - AccessToken->Privileges[i++].Luid = SeManageVolumePrivilege; -#endif + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + Privileges[i++].Luid = SeProfileSingleProcessPrivilege; + Privileges[i].Attributes = 0; + Privileges[i++].Luid = SeSystemtimePrivilege; ASSERT(i == 20); - uSize = sizeof(ACL); - uSize += sizeof(ACE) + uLocalSystemLength; - uSize += sizeof(ACE) + uAdminsLength; - uSize = (uSize & (~3)) + 8; - AccessToken->DefaultDacl = - (PACL) ExAllocatePoolWithTag(PagedPool, - uSize, - 'kDOT'); - Status = RtlCreateAcl(AccessToken->DefaultDacl, uSize, ACL_REVISION); - if ( NT_SUCCESS(Status) ) - { - Status = RtlAddAccessAllowedAce(AccessToken->DefaultDacl, ACL_REVISION, GENERIC_ALL, SeLocalSystemSid); - } + /* Setup the object attributes */ + InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); + ASSERT(SeSystemDefaultDacl != NULL); - if ( NT_SUCCESS(Status) ) - { - Status = RtlAddAccessAllowedAce(AccessToken->DefaultDacl, ACL_REVISION, GENERIC_READ|GENERIC_WRITE|GENERIC_EXECUTE|READ_CONTROL, SeAliasAdminsSid); - } + /* Create the token */ + Status = SepCreateToken((PHANDLE)&Token, + KernelMode, + 0, + &ObjectAttributes, + TokenPrimary, + 0, + &SeSystemAuthenticationId, + &Expiration, + &UserSid, + 3, + Groups, + GroupLength, + 20, + Privileges, + Owner, + PrimaryGroup, + SeSystemDefaultDacl, + &SeSystemTokenSource, + TRUE); + ASSERT(Status == STATUS_SUCCESS); - if ( ! NT_SUCCESS(Status) ) - { - ObDereferenceObject(AccessToken); - return NULL; - } - - return AccessToken; + /* Return the token */ + return Token; } /* PUBLIC FUNCTIONS ***********************************************************/ @@ -1920,7 +2068,8 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle, return Status; } -NTSTATUS NTAPI +NTSTATUS +NTAPI NtCreateToken(OUT PHANDLE TokenHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, @@ -1936,12 +2085,6 @@ NtCreateToken(OUT PHANDLE TokenHandle, IN PTOKEN_SOURCE TokenSource) { HANDLE hToken; - PTOKEN AccessToken; - LUID TokenId; - LUID ModifiedId; - PVOID EndMem; - ULONG uLength; - ULONG i; KPROCESSOR_MODE PreviousMode; ULONG nTokenPrivileges = 0; LARGE_INTEGER LocalExpirationTime = {{0, 0}}; @@ -1996,148 +2139,25 @@ NtCreateToken(OUT PHANDLE TokenHandle, LocalExpirationTime = *ExpirationTime; } - Status = ZwAllocateLocallyUniqueId(&TokenId); - if (!NT_SUCCESS(Status)) - return(Status); - - Status = ZwAllocateLocallyUniqueId(&ModifiedId); - if (!NT_SUCCESS(Status)) - return(Status); - - Status = ObCreateObject(PreviousMode, - SepTokenObjectType, - ObjectAttributes, + Status = SepCreateToken(&hToken, PreviousMode, - NULL, - sizeof(TOKEN), - 0, - 0, - (PVOID*)&AccessToken); - if (!NT_SUCCESS(Status)) - { - DPRINT1("ObCreateObject() failed (Status %lx)\n"); - return(Status); - } - - /* Zero out the buffer */ - RtlZeroMemory(AccessToken, sizeof(TOKEN)); - - AccessToken->TokenLock = &SepTokenLock; - - RtlCopyLuid(&AccessToken->TokenSource.SourceIdentifier, - &TokenSource->SourceIdentifier); - memcpy(AccessToken->TokenSource.SourceName, - TokenSource->SourceName, - sizeof(TokenSource->SourceName)); - - RtlCopyLuid(&AccessToken->TokenId, &TokenId); - RtlCopyLuid(&AccessToken->AuthenticationId, AuthenticationId); - AccessToken->ExpirationTime = *ExpirationTime; - RtlCopyLuid(&AccessToken->ModifiedId, &ModifiedId); - - AccessToken->UserAndGroupCount = TokenGroups->GroupCount + 1; - AccessToken->PrivilegeCount = TokenPrivileges->PrivilegeCount; - - AccessToken->TokenType = TokenType; - AccessToken->ImpersonationLevel = ((PSECURITY_QUALITY_OF_SERVICE) - (ObjectAttributes->SecurityQualityOfService))->ImpersonationLevel; - - /* - * Normally we would just point these members into the variable information - * area; however, our ObCreateObject() call can't allocate a variable information - * area, so we allocate them seperately and provide a destroy function. - */ - - uLength = sizeof(SID_AND_ATTRIBUTES) * AccessToken->UserAndGroupCount; - uLength += RtlLengthSid(TokenUser->User.Sid); - for (i = 0; i < TokenGroups->GroupCount; i++) - uLength += RtlLengthSid(TokenGroups->Groups[i].Sid); - - AccessToken->UserAndGroups = - (PSID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool, - uLength, - 'uKOT'); - - EndMem = &AccessToken->UserAndGroups[AccessToken->UserAndGroupCount]; - - Status = RtlCopySidAndAttributesArray(1, - &TokenUser->User, - uLength, - AccessToken->UserAndGroups, - EndMem, - &EndMem, - &uLength); - if (NT_SUCCESS(Status)) - { - Status = RtlCopySidAndAttributesArray(TokenGroups->GroupCount, - TokenGroups->Groups, - uLength, - &AccessToken->UserAndGroups[1], - EndMem, - &EndMem, - &uLength); - } - - if (NT_SUCCESS(Status)) - { - Status = SepFindPrimaryGroupAndDefaultOwner( - AccessToken, - TokenPrimaryGroup->PrimaryGroup, - TokenOwner->Owner); - } - - if (NT_SUCCESS(Status)) - { - uLength = TokenPrivileges->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES); - AccessToken->Privileges = - (PLUID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool, - uLength, - 'pKOT'); - - if (PreviousMode != KernelMode) - { - _SEH2_TRY - { - RtlCopyMemory(AccessToken->Privileges, - TokenPrivileges->Privileges, - nTokenPrivileges * sizeof(LUID_AND_ATTRIBUTES)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - } - else - { - RtlCopyMemory(AccessToken->Privileges, - TokenPrivileges->Privileges, - nTokenPrivileges * sizeof(LUID_AND_ATTRIBUTES)); - } - } - - if (NT_SUCCESS(Status)) - { - AccessToken->DefaultDacl = - (PACL) ExAllocatePoolWithTag(PagedPool, - TokenDefaultDacl->DefaultDacl->AclSize, - 'kDOT'); - memcpy(AccessToken->DefaultDacl, - TokenDefaultDacl->DefaultDacl, - TokenDefaultDacl->DefaultDacl->AclSize); - } - - Status = ObInsertObject ((PVOID)AccessToken, - NULL, - DesiredAccess, - 0, - NULL, - &hToken); - if (!NT_SUCCESS(Status)) - { - DPRINT1("ObInsertObject() failed (Status %lx)\n", Status); - } - + DesiredAccess, + ObjectAttributes, + TokenType, + ((PSECURITY_QUALITY_OF_SERVICE)(ObjectAttributes->SecurityQualityOfService))->ImpersonationLevel, + AuthenticationId, + &LocalExpirationTime, + &TokenUser->User, + TokenGroups->GroupCount, + TokenGroups->Groups, + 0, // FIXME: Should capture + nTokenPrivileges, + TokenPrivileges->Privileges, + TokenOwner->Owner, + TokenPrimaryGroup->PrimaryGroup, + TokenDefaultDacl->DefaultDacl, + TokenSource, + FALSE); if (NT_SUCCESS(Status)) { _SEH2_TRY @@ -2165,9 +2185,9 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle, IN ULONG HandleAttributes, OUT PHANDLE TokenHandle) { - PETHREAD Thread; + PETHREAD Thread, NewThread; HANDLE hToken; - PTOKEN Token, NewToken, PrimaryToken; + PTOKEN Token, NewToken = NULL, PrimaryToken; BOOLEAN CopyOnOpen, EffectiveOnly; SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; SE_IMPERSONATION_STATE ImpersonationState; @@ -2215,12 +2235,11 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle, ObDereferenceObject(Thread); return STATUS_NO_TOKEN; } - - ObDereferenceObject(Thread); - + if (ImpersonationLevel == SecurityAnonymous) { - ObDereferenceObject(Token); + PsDereferenceImpersonationToken(Token); + ObDereferenceObject(Thread); return STATUS_CANT_OPEN_ANONYMOUS; } @@ -2236,58 +2255,41 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle, if (CopyOnOpen) { Status = ObReferenceObjectByHandle(ThreadHandle, THREAD_ALL_ACCESS, - PsThreadType, PreviousMode, - (PVOID*)&Thread, NULL); - if (!NT_SUCCESS(Status)) + PsThreadType, KernelMode, + (PVOID*)&NewThread, NULL); + if (NT_SUCCESS(Status)) { - ObDereferenceObject(Token); - if (OpenAsSelf) + PrimaryToken = PsReferencePrimaryToken(NewThread->ThreadsProcess); + + Status = SepCreateImpersonationTokenDacl(Token, PrimaryToken, &Dacl); + + ObFastDereferenceObject(&NewThread->ThreadsProcess->Token, PrimaryToken); + + if (NT_SUCCESS(Status)) { - PsRestoreImpersonation(PsGetCurrentThread(), &ImpersonationState); + if (Dacl) + { + RtlCreateSecurityDescriptor(&SecurityDescriptor, + SECURITY_DESCRIPTOR_REVISION); + RtlSetDaclSecurityDescriptor(&SecurityDescriptor, TRUE, Dacl, + FALSE); + } + + InitializeObjectAttributes(&ObjectAttributes, NULL, HandleAttributes, + NULL, Dacl ? &SecurityDescriptor : NULL); + + + Status = SepDuplicateToken(Token, &ObjectAttributes, EffectiveOnly, + TokenImpersonation, ImpersonationLevel, + KernelMode, &NewToken); + if (NT_SUCCESS(Status)) + { + ObReferenceObject(NewToken); + Status = ObInsertObject(NewToken, NULL, DesiredAccess, 0, NULL, + &hToken); + } } - return Status; } - - PrimaryToken = PsReferencePrimaryToken(Thread->ThreadsProcess); - Status = SepCreateImpersonationTokenDacl(Token, PrimaryToken, &Dacl); - ASSERT(FALSE); - ObDereferenceObject(PrimaryToken); - ObDereferenceObject(Thread); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(Token); - if (OpenAsSelf) - { - PsRestoreImpersonation(PsGetCurrentThread(), &ImpersonationState); - } - return Status; - } - - RtlCreateSecurityDescriptor(&SecurityDescriptor, - SECURITY_DESCRIPTOR_REVISION); - RtlSetDaclSecurityDescriptor(&SecurityDescriptor, TRUE, Dacl, - FALSE); - - InitializeObjectAttributes(&ObjectAttributes, NULL, HandleAttributes, - NULL, &SecurityDescriptor); - - Status = SepDuplicateToken(Token, &ObjectAttributes, EffectiveOnly, - TokenImpersonation, ImpersonationLevel, - KernelMode, &NewToken); - ExFreePool(Dacl); - if (!NT_SUCCESS(Status)) - { - ObDereferenceObject(Token); - if (OpenAsSelf) - { - PsRestoreImpersonation(PsGetCurrentThread(), &ImpersonationState); - } - return Status; - } - - Status = ObInsertObject(NewToken, NULL, DesiredAccess, 0, NULL, - &hToken); - } else { @@ -2296,13 +2298,24 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle, PreviousMode, &hToken); } - ObDereferenceObject(Token); + if (Dacl) ExFreePool(Dacl); if (OpenAsSelf) { PsRestoreImpersonation(PsGetCurrentThread(), &ImpersonationState); } + ObDereferenceObject(Token); + + if (NT_SUCCESS(Status) && CopyOnOpen) + { + PsImpersonateClient(Thread, NewToken, FALSE, EffectiveOnly, ImpersonationLevel); + } + + if (NewToken) ObDereferenceObject(NewToken); + + if (CopyOnOpen && NewThread) ObDereferenceObject(NewThread); + if(NT_SUCCESS(Status)) { _SEH2_TRY diff --git a/reactos/subsystems/csr/csrsrv/process.c b/reactos/subsystems/csr/csrsrv/process.c index c26a6c1d94e..1de2286b549 100644 --- a/reactos/subsystems/csr/csrsrv/process.c +++ b/reactos/subsystems/csr/csrsrv/process.c @@ -916,7 +916,7 @@ CsrGetProcessLuid(HANDLE hProcess OPTIONAL, /* Now query the information */ Status = NtQueryInformationToken(hToken, TokenStatistics, - &TokenStats, + TokenStats, Length, &Length); diff --git a/reactos/subsystems/csr/csrsrv/srv.h b/reactos/subsystems/csr/csrsrv/srv.h index 1ddfac2194d..8c55942630f 100644 --- a/reactos/subsystems/csr/csrsrv/srv.h +++ b/reactos/subsystems/csr/csrsrv/srv.h @@ -1,5 +1,4 @@ -#ifndef _CSRSRV_H -#define _CSRSRV_H +#pragma once /* PSDK/NDK Headers */ #define NTOS_MODE_USER @@ -364,5 +363,3 @@ CsrThreadRefcountZero(IN PCSR_THREAD CsrThread); NTSTATUS NTAPI CsrSetDirectorySecurity(IN HANDLE ObjectDirectory); - -#endif diff --git a/reactos/subsystems/csr/csrsrv/thread.c b/reactos/subsystems/csr/csrsrv/thread.c index ca7c632e8af..ad71435589c 100644 --- a/reactos/subsystems/csr/csrsrv/thread.c +++ b/reactos/subsystems/csr/csrsrv/thread.c @@ -157,7 +157,7 @@ CsrLocateThreadInProcess(IN PCSR_PROCESS CsrProcess OPTIONAL, NextEntry = ListHead->Flink; /* Start the Loop */ - while (NextEntry != NextEntry) + while (NextEntry != ListHead) { /* Get Thread Entry */ FoundThread = CONTAINING_RECORD(NextEntry, CSR_THREAD, Link); diff --git a/reactos/subsystems/win/basesrv/basesrv.h b/reactos/subsystems/win/basesrv/basesrv.h index 20b17d02a8a..fe5cdb98ba5 100644 --- a/reactos/subsystems/win/basesrv/basesrv.h +++ b/reactos/subsystems/win/basesrv/basesrv.h @@ -1,5 +1,4 @@ -#ifndef _BASESRV_H_INCLUDED_ -#define _BASESRV_H_INCLUDED_ +#pragma once /* PSDK/NDK Headers */ #include @@ -10,5 +9,3 @@ #include #include - -#endif /* ndef _BASESRV_H_INCLUDED_ */ diff --git a/reactos/subsystems/win/winsrv/winsrv.h b/reactos/subsystems/win/winsrv/winsrv.h index 7d475ecf1a9..53d9f8d5583 100644 --- a/reactos/subsystems/win/winsrv/winsrv.h +++ b/reactos/subsystems/win/winsrv/winsrv.h @@ -1,5 +1,4 @@ -#ifndef _WINSRV_H_INCLUDED_ -#define _WINSRV_H_INCLUDED_ +#pragma once /* PSDK/NDK Headers */ #include @@ -11,5 +10,3 @@ #include #include #include - -#endif /* ndef _WINSRV_H_INCLUDED_ */ diff --git a/reactos/subsystems/win32/csrss/api/handle.c b/reactos/subsystems/win32/csrss/csrsrv/api/handle.c similarity index 99% rename from reactos/subsystems/win32/csrss/api/handle.c rename to reactos/subsystems/win32/csrss/csrsrv/api/handle.c index 391896ed28f..eb6c12c0531 100644 --- a/reactos/subsystems/win32/csrss/api/handle.c +++ b/reactos/subsystems/win32/csrss/csrsrv/api/handle.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/csrss/api/process.c b/reactos/subsystems/win32/csrss/csrsrv/api/process.c similarity index 76% rename from reactos/subsystems/win32/csrss/api/process.c rename to reactos/subsystems/win32/csrss/csrsrv/api/process.c index 1537f655ba1..5fcac045c70 100644 --- a/reactos/subsystems/win32/csrss/api/process.c +++ b/reactos/subsystems/win32/csrss/csrsrv/api/process.c @@ -8,27 +8,37 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include #define LOCK RtlEnterCriticalSection(&ProcessDataLock) #define UNLOCK RtlLeaveCriticalSection(&ProcessDataLock) +#define CsrAcquireProcessLock() LOCK +#define CsrReleaseProcessLock() UNLOCK /* GLOBALS *******************************************************************/ static ULONG NrProcess; -static PCSRSS_PROCESS_DATA ProcessData[256]; +PCSRSS_PROCESS_DATA ProcessData[256]; RTL_CRITICAL_SECTION ProcessDataLock; +extern PCSRSS_PROCESS_DATA CsrRootProcess; +extern LIST_ENTRY CsrThreadHashTable[256]; /* FUNCTIONS *****************************************************************/ VOID WINAPI CsrInitProcessData(VOID) { + ULONG i; RtlZeroMemory (ProcessData, sizeof ProcessData); NrProcess = sizeof ProcessData / sizeof ProcessData[0]; RtlInitializeCriticalSection( &ProcessDataLock ); + + CsrRootProcess = CsrCreateProcessData(NtCurrentTeb()->ClientId.UniqueProcess); + + /* Initialize the Thread Hash List */ + for (i = 0; i < 256; i++) InitializeListHead(&CsrThreadHashTable[i]); } PCSRSS_PROCESS_DATA WINAPI CsrGetProcessData(HANDLE ProcessId) @@ -89,8 +99,7 @@ PCSRSS_PROCESS_DATA WINAPI CsrCreateProcessData(HANDLE ProcessId) /* using OpenProcess is not optimal due to HANDLE vs. DWORD PIDs... */ Status = NtOpenProcess(&pProcessData->Process, - PROCESS_DUP_HANDLE | PROCESS_VM_OPERATION | - PROCESS_VM_WRITE | PROCESS_CREATE_THREAD | SYNCHRONIZE, + PROCESS_ALL_ACCESS, &ObjectAttributes, &ClientId); if (!NT_SUCCESS(Status)) @@ -122,6 +131,9 @@ PCSRSS_PROCESS_DATA WINAPI CsrCreateProcessData(HANDLE ProcessId) pProcessData->ShutdownLevel = 0x280; pProcessData->ShutdownFlags = 0; } + + pProcessData->ThreadCount = 0; + InitializeListHead(&pProcessData->ThreadList); return pProcessData; } @@ -186,35 +198,6 @@ NTSTATUS WINAPI CsrFreeProcessData(HANDLE Pid) return STATUS_INVALID_PARAMETER; } -NTSTATUS WINAPI -CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc, PVOID Context) -{ - UINT Hash; - PCSRSS_PROCESS_DATA pProcessData; - NTSTATUS Status = STATUS_SUCCESS; - - LOCK; - - for (Hash = 0; Hash < (sizeof(ProcessData) / sizeof(*ProcessData)); Hash++) - { - pProcessData = ProcessData[Hash]; - while (NULL != pProcessData) - { - Status = EnumProc(pProcessData, Context); - if (STATUS_SUCCESS != Status) - { - UNLOCK; - return Status; - } - pProcessData = pProcessData->next; - } - } - - UNLOCK; - - return Status; -} - /********************************************************************** * CSRSS API *********************************************************************/ @@ -255,10 +238,93 @@ CSR_API(CsrCreateProcess) return(STATUS_SUCCESS); } +CSR_API(CsrSrvCreateThread) +{ + PCSR_THREAD CurrentThread; + HANDLE ThreadHandle; + NTSTATUS Status; + PCSRSS_PROCESS_DATA CsrProcess; + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + CurrentThread = NtCurrentTeb()->CsrClientThread; + CsrProcess = CurrentThread->Process; +// DPRINT1("Current thread: %p %p\n", CurrentThread, CsrProcess); +// DPRINT1("Request CID: %lx %lx %lx\n", +// CsrProcess->ProcessId, +// NtCurrentTeb()->ClientId.UniqueProcess, + // Request->Data.CreateThreadRequest.ClientId.UniqueProcess); + + if (CsrProcess->ProcessId != Request->Data.CreateThreadRequest.ClientId.UniqueProcess) + { + if (Request->Data.CreateThreadRequest.ClientId.UniqueProcess == NtCurrentTeb()->ClientId.UniqueProcess) + { + return STATUS_SUCCESS; + } + + Status = CsrLockProcessByClientId(Request->Data.CreateThreadRequest.ClientId.UniqueProcess, + &CsrProcess); + // DPRINT1("Found matching process: %p\n", CsrProcess); + if (!NT_SUCCESS(Status)) return Status; + } + +// DPRINT1("PIDs: %lx %lx\n", CurrentThread->Process->ProcessId, CsrProcess->ProcessId); +// DPRINT1("Thread handle is: %lx Process Handle is: %lx %lx\n", + // Request->Data.CreateThreadRequest.ThreadHandle, + // CurrentThread->Process->Process, + // CsrProcess->Process); + Status = NtDuplicateObject(CsrProcess->Process, + Request->Data.CreateThreadRequest.ThreadHandle, + NtCurrentProcess(), + &ThreadHandle, + 0, + 0, + DUPLICATE_SAME_ACCESS); + //DPRINT1("Duplicate status: %lx\n", Status); + if (!NT_SUCCESS(Status)) + { + Status = NtDuplicateObject(CurrentThread->Process->Process, + Request->Data.CreateThreadRequest.ThreadHandle, + NtCurrentProcess(), + &ThreadHandle, + 0, + 0, + DUPLICATE_SAME_ACCESS); + // DPRINT1("Duplicate status: %lx\n", Status); + } + + Status = STATUS_SUCCESS; // hack + if (NT_SUCCESS(Status)) + { + Status = CsrCreateThread(CsrProcess, + ThreadHandle, + &Request->Data.CreateThreadRequest.ClientId); + // DPRINT1("Create status: %lx\n", Status); + } + + if (CsrProcess != CurrentThread->Process) CsrReleaseProcessLock(); + + return Status; +} + CSR_API(CsrTerminateProcess) { + PLIST_ENTRY NextEntry; + PCSR_THREAD Thread; Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + NextEntry = ProcessData->ThreadList.Flink; + while (NextEntry != &ProcessData->ThreadList) + { + Thread = CONTAINING_RECORD(NextEntry, CSR_THREAD, Link); + NextEntry = NextEntry->Flink; + + CsrThreadRefcountZero(Thread); + + } + ProcessData->Terminated = TRUE; return STATUS_SUCCESS; diff --git a/reactos/subsystems/win32/csrss/api/user.c b/reactos/subsystems/win32/csrss/csrsrv/api/user.c similarity index 98% rename from reactos/subsystems/win32/csrss/api/user.c rename to reactos/subsystems/win32/csrss/csrsrv/api/user.c index d89e463cecc..de4e49f66e1 100644 --- a/reactos/subsystems/win32/csrss/api/user.c +++ b/reactos/subsystems/win32/csrss/csrsrv/api/user.c @@ -11,7 +11,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/reactos/subsystems/win32/csrss/api/wapi.c b/reactos/subsystems/win32/csrss/csrsrv/api/wapi.c similarity index 82% rename from reactos/subsystems/win32/csrss/api/wapi.c rename to reactos/subsystems/win32/csrss/csrsrv/api/wapi.c index 61ca693d6a8..88005c6fe7b 100644 --- a/reactos/subsystems/win32/csrss/api/wapi.c +++ b/reactos/subsystems/win32/csrss/csrsrv/api/wapi.c @@ -10,7 +10,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG @@ -126,6 +126,7 @@ CsrpHandleConnectionRequest (PPORT_MESSAGE Request, HANDLE ServerPort = NULL, ServerThread = NULL; PCSRSS_PROCESS_DATA ProcessData = NULL; REMOTE_PORT_VIEW LpcRead; + CLIENT_ID ClientId; LpcRead.Length = sizeof(LpcRead); ServerPort = NULL; @@ -169,19 +170,23 @@ CsrpHandleConnectionRequest (PPORT_MESSAGE Request, Status = RtlCreateUserThread(NtCurrentProcess(), NULL, - FALSE, + TRUE, 0, 0, 0, (PTHREAD_START_ROUTINE)ClientConnectionThread, ServerPort, & ServerThread, - NULL); + &ClientId); if (!NT_SUCCESS(Status)) { DPRINT1("CSR: Unable to create server thread\n"); return Status; } + + CsrAddStaticServerThread(ServerThread, &ClientId, 0); + + NtResumeThread(ServerThread, NULL); NtClose(ServerThread); @@ -190,6 +195,53 @@ CsrpHandleConnectionRequest (PPORT_MESSAGE Request, return Status; } +PCSR_THREAD +NTAPI +CsrConnectToUser(VOID) +{ + PTEB Teb = NtCurrentTeb(); + PCSR_THREAD CsrThread; +#if 0 + NTSTATUS Status; + ANSI_STRING DllName; + UNICODE_STRING TempName; + HANDLE hUser32; + STRING StartupName; + + /* Check if we didn't already find it */ + if (!CsrClientThreadSetup) + { + /* Get the DLL Handle for user32.dll */ + RtlInitAnsiString(&DllName, "user32"); + RtlAnsiStringToUnicodeString(&TempName, &DllName, TRUE); + Status = LdrGetDllHandle(NULL, + NULL, + &TempName, + &hUser32); + RtlFreeUnicodeString(&TempName); + + /* If we got teh handle, get the Client Thread Startup Entrypoint */ + if (NT_SUCCESS(Status)) + { + RtlInitAnsiString(&StartupName,"ClientThreadSetup"); + Status = LdrGetProcedureAddress(hUser32, + &StartupName, + 0, + (PVOID)&CsrClientThreadSetup); + } + } + + /* Connect to user32 */ + CsrClientThreadSetup(); +#endif + /* Save pointer to this thread in TEB */ + CsrThread = CsrLocateThreadInProcess(NULL, &Teb->ClientId); + if (CsrThread) Teb->CsrClientThread = CsrThread; + + /* Return it */ + return CsrThread; +} + VOID WINAPI ClientConnectionThread(HANDLE ServerPort) @@ -199,10 +251,20 @@ ClientConnectionThread(HANDLE ServerPort) PCSR_API_MESSAGE Request = (PCSR_API_MESSAGE)RawRequest; PCSR_API_MESSAGE Reply; PCSRSS_PROCESS_DATA ProcessData; + PCSR_THREAD ServerThread; DPRINT("CSR: %s called\n", __FUNCTION__); + + /* Connect to user32 */ + while (!CsrConnectToUser()) + { + /* Keep trying until we get a response */ + NtCurrentTeb()->Win32ClientInfo[0] = 0; + //NtDelayExecution(FALSE, &TimeOut); + } /* Reply must be NULL at the first call to NtReplyWaitReceivePort */ + ServerThread = NtCurrentTeb()->CsrClientThread; Reply = NULL; /* Loop and reply/wait for a new message */ @@ -271,7 +333,7 @@ ClientConnectionThread(HANDLE ServerPort) } if (ProcessData->Terminated) { - DPRINT1("Message %d: process %p already terminated\n", + DPRINT1("Message %d: process %d already terminated\n", Request->Type, Request->Header.ClientId.UniqueProcess); continue; } @@ -284,8 +346,17 @@ ClientConnectionThread(HANDLE ServerPort) } else { + PCSR_THREAD Thread; + PCSRSS_PROCESS_DATA Process = NULL; + + //DPRINT1("locate thread %lx/%lx\n", Request->Header.ClientId.UniqueProcess, Request->Header.ClientId.UniqueThread); + Thread = CsrLocateThreadByClientId(&Process, &Request->Header.ClientId); + //DPRINT1("Thread found: %p %p\n", Thread, Process); + /* Call the Handler */ + if (Thread) NtCurrentTeb()->CsrClientThread = Thread; CsrApiCallHandler(ProcessData, Request); + if (Thread) NtCurrentTeb()->CsrClientThread = ServerThread; } /* Send back the reply */ diff --git a/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rbuild b/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rbuild new file mode 100644 index 00000000000..3f002106bfe --- /dev/null +++ b/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rbuild @@ -0,0 +1,22 @@ + + + + + . + . + include + include/reactos/subsys + ntdll + pseh + smdll + + handle.c + process.c + user.c + wapi.c + + procsup.c + thredsup.c + init.c + srv.h + diff --git a/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rc b/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rc new file mode 100644 index 00000000000..658072d09b8 --- /dev/null +++ b/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rc @@ -0,0 +1,5 @@ +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS CSR Core Server\0" +#define REACTOS_STR_INTERNAL_NAME "csrsrv\0" +#define REACTOS_STR_ORIGINAL_FILENAME "csrsrv.dll\0" +#include diff --git a/reactos/subsystems/win32/csrss/csrsrv/csrsrv.spec b/reactos/subsystems/win32/csrss/csrsrv/csrsrv.spec new file mode 100644 index 00000000000..d3e7b64f40f --- /dev/null +++ b/reactos/subsystems/win32/csrss/csrsrv/csrsrv.spec @@ -0,0 +1,35 @@ +@ stdcall CsrAddStaticServerThread(ptr ptr long) +;@ stdcall CsrCallServerFromServer(ptr ptr) +;@ stdcall CsrConnectToUser() +;@ stdcall CsrCreateProcess(ptr ptr ptr ptr long ptr) +;@ stdcall CsrCreateRemoteThread(ptr ptr) +@ stdcall CsrCreateThread(ptr ptr ptr) +;@ stdcall CsrCreateWait(ptr ptr ptr ptr ptr ptr) +;@ stdcall CsrDebugProcess(ptr) +;@ stdcall CsrDebugProcessStop(ptr) +;@ stdcall CsrDereferenceProcess(ptr) +;@ stdcall CsrDereferenceThread(ptr) +;@ stdcall CsrDereferenceWait(ptr) +;@ stdcall CsrDestroyProcess(ptr long) +;@ stdcall CsrDestroyThread(ptr) +;@ stdcall CsrExecServerThread(ptr long) +@ stdcall CsrGetProcessLuid(ptr ptr) +@ stdcall CsrImpersonateClient(ptr) +@ stdcall CsrLockProcessByClientId(ptr ptr) +;@ stdcall CsrLockThreadByClientId(ptr ptr) +;@ stdcall CsrMoveSatisfiedWait(ptr ptr) +;@ stdcall CsrNotifyWait(ptr long ptr ptr) +;@ stdcall CsrPopulateDosDevices() +;@ stdcall CsrQueryApiPort() +;@ stdcall CsrReferenceThread(ptr) +@ stdcall CsrRevertToSelf() +@ stdcall CsrServerInitialization(long ptr) +;@ stdcall CsrSetBackgroundPriority(ptr) +;@ stdcall CsrSetCallingSpooler(long) +;@ stdcall CsrSetForegroundPriority(ptr) +;@ stdcall CsrShutdownProcesses(ptr long) +;@ stdcall CsrUnhandledExceptionFilter(ptr) +@ stdcall CsrUnlockProcess(ptr) +;@ stdcall CsrUnlockThread(ptr) +;@ stdcall CsrValidateMessageBuffer(ptr ptr long long) +;@ stdcall CsrValidateMessageString(ptr ptr) diff --git a/reactos/subsystems/win32/csrss/init.c b/reactos/subsystems/win32/csrss/csrsrv/init.c similarity index 80% rename from reactos/subsystems/win32/csrss/init.c rename to reactos/subsystems/win32/csrss/csrsrv/init.c index 4097118c738..51adb2cacca 100644 --- a/reactos/subsystems/win32/csrss/init.c +++ b/reactos/subsystems/win32/csrss/csrsrv/init.c @@ -1,47 +1,128 @@ -/* $Id$ - * - * reactos/subsys/csrss/init.c - * - * Initialize the CSRSS subsystem server process. - * - * ReactOS Operating System - * +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS CSR Sub System + * FILE: subsys/csr/csrsrv/init.c + * PURPOSE: CSR Server DLL Initialization + * PROGRAMMERS: ReactOS Portable Systems Group */ -/* INCLUDES ******************************************************************/ - -#include +/* INCLUDES *******************************************************************/ +#include "srv.h" #define NDEBUG #include -/* GLOBALS ******************************************************************/ +/* DATA ***********************************************************************/ HANDLE CsrHeap = (HANDLE) 0; - HANDLE CsrObjectDirectory = (HANDLE) 0; - UNICODE_STRING CsrDirectoryName; - extern HANDLE CsrssApiHeap; - static unsigned InitCompleteProcCount; static CSRPLUGIN_INIT_COMPLETE_PROC *InitCompleteProcs = NULL; - static unsigned HardErrorProcCount; static CSRPLUGIN_HARDERROR_PROC *HardErrorProcs = NULL; - HANDLE hSbApiPort = (HANDLE) 0; - HANDLE hBootstrapOk = (HANDLE) 0; - HANDLE hSmApiPort = (HANDLE) 0; - HANDLE hApiPort = (HANDLE) 0; -/********************************************************************** - * CsrpAddInitCompleteProc/1 - */ +/* PRIVATE FUNCTIONS **********************************************************/ + +ULONG +InitializeVideoAddressSpace(VOID) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING PhysMemName = RTL_CONSTANT_STRING(L"\\Device\\PhysicalMemory"); + NTSTATUS Status; + HANDLE PhysMemHandle; + PVOID BaseAddress; + LARGE_INTEGER Offset; + SIZE_T ViewSize; + CHAR IVTAndBda[1024+256]; + + /* Open the physical memory section */ + InitializeObjectAttributes(&ObjectAttributes, + &PhysMemName, + 0, + NULL, + NULL); + Status = ZwOpenSection(&PhysMemHandle, + SECTION_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Couldn't open \\Device\\PhysicalMemory\n"); + return 0; + } + + /* Map the BIOS and device registers into the address space */ + Offset.QuadPart = 0xa0000; + ViewSize = 0x100000 - 0xa0000; + BaseAddress = (PVOID)0xa0000; + Status = ZwMapViewOfSection(PhysMemHandle, + NtCurrentProcess(), + &BaseAddress, + 0, + ViewSize, + &Offset, + &ViewSize, + ViewUnmap, + 0, + PAGE_EXECUTE_READWRITE); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Couldn't map physical memory (%x)\n", Status); + ZwClose(PhysMemHandle); + return 0; + } + + /* Close physical memory section handle */ + ZwClose(PhysMemHandle); + + if (BaseAddress != (PVOID)0xa0000) + { + DPRINT1("Couldn't map physical memory at the right address (was %x)\n", + BaseAddress); + return 0; + } + + /* Allocate some low memory to use for the non-BIOS + * parts of the v86 mode address space + */ + BaseAddress = (PVOID)0x1; + ViewSize = 0xa0000 - 0x1000; + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + &BaseAddress, + 0, + &ViewSize, + MEM_COMMIT, + PAGE_EXECUTE_READWRITE); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to allocate virtual memory (Status %x)\n", Status); + return 0; + } + if (BaseAddress != (PVOID)0x0) + { + DPRINT1("Failed to allocate virtual memory at right address (was %x)\n", + BaseAddress); + return 0; + } + + /* Get the real mode IVT and BDA from the kernel */ + Status = NtVdmControl(VdmInitialize, IVTAndBda); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtVdmControl failed (status %x)\n", Status); + return 0; + } + + /* Return success */ + return 1; +} + + static NTSTATUS FASTCALL CsrpAddInitCompleteProc(CSRPLUGIN_INIT_COMPLETE_PROC Proc) { @@ -283,6 +364,7 @@ CsrpInitWin32Csr (int argc, char ** argv, char ** envp) CSRSS_API_DEFINITION NativeDefinitions[] = { CSRSS_DEFINE_API(CREATE_PROCESS, CsrCreateProcess), + CSRSS_DEFINE_API(CREATE_THREAD, CsrSrvCreateThread), CSRSS_DEFINE_API(TERMINATE_PROCESS, CsrTerminateProcess), CSRSS_DEFINE_API(CONNECT_PROCESS, CsrConnectProcess), CSRSS_DEFINE_API(REGISTER_SERVICES_PROCESS, CsrRegisterServicesProcess), @@ -305,6 +387,8 @@ CsrpCreateListenPort (IN LPWSTR Name, NTSTATUS Status = STATUS_SUCCESS; OBJECT_ATTRIBUTES PortAttributes; UNICODE_STRING PortName; + HANDLE ServerThread; + CLIENT_ID ClientId; DPRINT("CSR: %s called\n", __FUNCTION__); @@ -327,14 +411,22 @@ CsrpCreateListenPort (IN LPWSTR Name, } Status = RtlCreateUserThread(NtCurrentProcess(), NULL, - FALSE, + TRUE, 0, 0, 0, (PTHREAD_START_ROUTINE) ListenThread, *Port, - NULL, - NULL); + &ServerThread, + &ClientId); + + if (ListenThread == (PVOID)ClientConnectionThread) + { + CsrAddStaticServerThread(ServerThread, &ClientId, 0); + } + + NtResumeThread(ServerThread, NULL); + NtClose(ServerThread); return Status; } @@ -502,48 +594,6 @@ CsrpRegisterSubsystem (int argc, char ** argv, char ** envp) return Status; } -/********************************************************************** - * EnvpToUnicodeString/2 - */ -static ULONG FASTCALL -EnvpToUnicodeString (char ** envp, PUNICODE_STRING UnicodeEnv) -{ - ULONG CharCount = 0; - ULONG Index = 0; - ANSI_STRING AnsiEnv; - - UnicodeEnv->Buffer = NULL; - - for (Index=0; NULL != envp[Index]; Index++) - { - CharCount += strlen (envp[Index]); - ++ CharCount; - } - ++ CharCount; - - AnsiEnv.Buffer = RtlAllocateHeap (RtlGetProcessHeap(), 0, CharCount); - if (NULL != AnsiEnv.Buffer) - { - - PCHAR WritePos = AnsiEnv.Buffer; - - for (Index=0; NULL != envp[Index]; Index++) - { - strcpy (WritePos, envp[Index]); - WritePos += strlen (envp[Index]) + 1; - } - - /* FIXME: the last (double) nullterm should perhaps not be included in Length - * but only in MaximumLength. -Gunnar */ - AnsiEnv.Buffer [CharCount-1] = '\0'; - AnsiEnv.Length = CharCount; - AnsiEnv.MaximumLength = CharCount; - - RtlAnsiStringToUnicodeString (UnicodeEnv, & AnsiEnv, TRUE); - RtlFreeHeap (RtlGetProcessHeap(), 0, AnsiEnv.Buffer); - } - return CharCount; -} /********************************************************************** * CsrpLoadKernelModeDriver/3 */ @@ -554,26 +604,26 @@ CsrpLoadKernelModeDriver (int argc, char ** argv, char ** envp) WCHAR Data [MAX_PATH + 1]; ULONG DataLength = sizeof Data; ULONG DataType = 0; - UNICODE_STRING Environment; + //UNICODE_STRING Environment; - DPRINT("SM: %s called\n", __FUNCTION__); + DPRINT1("SM: %s called\n", __FUNCTION__); - EnvpToUnicodeString (envp, & Environment); + //EnvpToUnicodeString (envp, & Environment); Status = SmLookupSubsystem (L"Kmode", Data, & DataLength, & DataType, - Environment.Buffer); - RtlFreeUnicodeString (& Environment); + NULL); + //RtlFreeUnicodeString (& Environment); if((STATUS_SUCCESS == Status) && (DataLength > sizeof Data[0])) { WCHAR ImagePath [MAX_PATH + 1] = {0}; UNICODE_STRING ModuleName; - wcscpy (ImagePath, L"\\??\\"); - wcscat (ImagePath, Data); + wcscpy (ImagePath, L"\\SYSTEMROOT\\system32\\win32k.sys"); +// wcscat (ImagePath, Data); RtlInitUnicodeString (& ModuleName, ImagePath); Status = NtSetSystemInformation(/* FIXME: SystemLoadAndCallImage */ SystemExtendServiceTableInformation, @@ -581,7 +631,7 @@ CsrpLoadKernelModeDriver (int argc, char ** argv, char ** envp) sizeof ModuleName); if(!NT_SUCCESS(Status)) { - DPRINT("WIN: %s: loading Kmode failed (Status=0x%08lx)\n", + DPRINT1("WIN: %s: loading Kmode failed (Status=0x%08lx)\n", __FUNCTION__, Status); } } @@ -707,22 +757,12 @@ struct { {TRUE, CsrpRunWinlogon, "run WinLogon"}, }; -/********************************************************************** - * NAME - * CsrServerInitialization - * - * DESCRIPTION - * Initialize the Win32 environment subsystem server. - * - * RETURN VALUE - * TRUE: Initialization OK; otherwise FALSE. - */ -BOOL WINAPI -CsrServerInitialization ( - int argc, - char ** argv, - char ** envp - ) +/* PUBLIC FUNCTIONS ***********************************************************/ + +NTSTATUS +NTAPI +CsrServerInitialization(ULONG ArgumentCount, + PCHAR Arguments[]) { UINT i = 0; NTSTATUS Status = STATUS_SUCCESS; @@ -731,7 +771,7 @@ CsrServerInitialization ( for (i=0; i < (sizeof InitRoutine / sizeof InitRoutine[0]); i++) { - Status = InitRoutine[i].EntryPoint(argc,argv,envp); + Status = InitRoutine[i].EntryPoint(ArgumentCount,Arguments,NULL); if(!NT_SUCCESS(Status)) { DPRINT1("CSR: %s: failed to %s (Status=%08lx)\n", @@ -747,9 +787,23 @@ CsrServerInitialization ( if (CallInitComplete()) { Status = SmCompleteSession (hSmApiPort,hSbApiPort,hApiPort); - return TRUE; + return STATUS_SUCCESS; } - return FALSE; + + return STATUS_UNSUCCESSFUL; +} + +BOOL +NTAPI +DllMainCRTStartup(HANDLE hDll, + DWORD dwReason, + LPVOID lpReserved) +{ + /* We don't do much */ + UNREFERENCED_PARAMETER(hDll); + UNREFERENCED_PARAMETER(dwReason); + UNREFERENCED_PARAMETER(lpReserved); + return TRUE; } /* EOF */ diff --git a/reactos/subsystems/win32/csrss/csrsrv/procsup.c b/reactos/subsystems/win32/csrss/csrsrv/procsup.c new file mode 100644 index 00000000000..d139d9701d6 --- /dev/null +++ b/reactos/subsystems/win32/csrss/csrsrv/procsup.c @@ -0,0 +1,447 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS CSR Sub System + * FILE: subsys/csr/csrsrv/procsup.c + * PURPOSE: CSR Process Management + * PROGRAMMERS: ReactOS Portable Systems Group + * Alex Ionescu + */ + +/* INCLUDES *******************************************************************/ + +#include + +#define NDEBUG +#include + +#define LOCK RtlEnterCriticalSection(&ProcessDataLock) +#define UNLOCK RtlLeaveCriticalSection(&ProcessDataLock) +#define CsrHeap RtlGetProcessHeap() + +#define CsrAcquireProcessLock() LOCK +#define CsrReleaseProcessLock() UNLOCK + +/* GLOBALS ********************************************************************/ + +extern RTL_CRITICAL_SECTION ProcessDataLock; +extern PCSRSS_PROCESS_DATA ProcessData[256]; +PCSRSS_PROCESS_DATA CsrRootProcess; +LIST_ENTRY CsrThreadHashTable[256]; +SECURITY_QUALITY_OF_SERVICE CsrSecurityQos = +{ + sizeof(SECURITY_QUALITY_OF_SERVICE), + SecurityImpersonation, + SECURITY_STATIC_TRACKING, + FALSE +}; + +/* FUNCTIONS ******************************************************************/ + +VOID +NTAPI +CsrSetToNormalPriority(VOID) +{ + KPRIORITY BasePriority = (8 + 1) + 4; + + /* Set the Priority */ + NtSetInformationProcess(NtCurrentProcess(), + ProcessBasePriority, + &BasePriority, + sizeof(KPRIORITY)); +} + +VOID +NTAPI +CsrSetToShutdownPriority(VOID) +{ + KPRIORITY SetBasePriority = (8 + 1) + 6; + BOOLEAN Old; + + /* Get the shutdown privilege */ + if (NT_SUCCESS(RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, + TRUE, + FALSE, + &Old))) + { + /* Set the Priority */ + NtSetInformationProcess(NtCurrentProcess(), + ProcessBasePriority, + &SetBasePriority, + sizeof(KPRIORITY)); + } +} + +NTSTATUS +NTAPI +CsrGetProcessLuid(HANDLE hProcess OPTIONAL, + PLUID Luid) +{ + HANDLE hToken = NULL; + NTSTATUS Status; + ULONG Length; + PTOKEN_STATISTICS TokenStats; + + /* Check if we have a handle to a CSR Process */ + if (!hProcess) + { + /* We don't, so try opening the Thread's Token */ + Status = NtOpenThreadToken(NtCurrentThread(), + TOKEN_QUERY, + FALSE, + &hToken); + + /* Check for success */ + if (!NT_SUCCESS(Status)) + { + /* If we got some other failure, then return and quit */ + if (Status != STATUS_NO_TOKEN) return Status; + + /* We don't have a Thread Token, use a Process Token */ + hProcess = NtCurrentProcess(); + hToken = NULL; + } + } + + /* Check if we have a token by now */ + if (!hToken) + { + /* No token yet, so open the Process Token */ + Status = NtOpenProcessToken(hProcess, + TOKEN_QUERY, + &hToken); + if (!NT_SUCCESS(Status)) + { + /* Still no token, return the error */ + return Status; + } + } + + /* Now get the size we'll need for the Token Information */ + Status = NtQueryInformationToken(hToken, + TokenStatistics, + NULL, + 0, + &Length); + + /* Allocate memory for the Token Info */ + if (!(TokenStats = RtlAllocateHeap(CsrHeap, 0, Length))) + { + /* Fail and close the token */ + NtClose(hToken); + return STATUS_NO_MEMORY; + } + + /* Now query the information */ + Status = NtQueryInformationToken(hToken, + TokenStatistics, + TokenStats, + Length, + &Length); + + /* Close the handle */ + NtClose(hToken); + + /* Check for success */ + if (NT_SUCCESS(Status)) + { + /* Return the LUID */ + *Luid = TokenStats->AuthenticationId; + } + + /* Free the query information */ + RtlFreeHeap(CsrHeap, 0, TokenStats); + + /* Return the Status */ + return Status; +} + +BOOLEAN +NTAPI +CsrImpersonateClient(IN PCSR_THREAD CsrThread) +{ + NTSTATUS Status; + PCSR_THREAD CurrentThread = NtCurrentTeb()->CsrClientThread; + + /* Use the current thread if none given */ + if (!CsrThread) CsrThread = CurrentThread; + + /* Still no thread, something is wrong */ + if (!CsrThread) + { + /* Failure */ + return FALSE; + } + + /* Make the call */ + Status = NtImpersonateThread(NtCurrentThread(), + CsrThread->ThreadHandle, + &CsrSecurityQos); + + if (!NT_SUCCESS(Status)) + { + /* Failure */ + return FALSE; + } + + /* Increase the impersonation count for the current thread */ + if (CurrentThread) ++CurrentThread->ImpersonationCount; + + /* Return Success */ + return TRUE; +} + +BOOLEAN +NTAPI +CsrRevertToSelf(VOID) +{ + NTSTATUS Status; + PCSR_THREAD CurrentThread = NtCurrentTeb()->CsrClientThread; + HANDLE ImpersonationToken = NULL; + + /* Check if we have a Current Thread */ + if (CurrentThread) + { + /* Make sure impersonation is on */ + if (!CurrentThread->ImpersonationCount) + { + return FALSE; + } + else if (--CurrentThread->ImpersonationCount > 0) + { + /* Success; impersonation count decreased but still not zero */ + return TRUE; + } + } + + /* Impersonation has been totally removed, revert to ourselves */ + Status = NtSetInformationThread(NtCurrentThread(), + ThreadImpersonationToken, + &ImpersonationToken, + sizeof(HANDLE)); + + /* Return TRUE or FALSE */ + return NT_SUCCESS(Status); +} + +PCSRSS_PROCESS_DATA +NTAPI +FindProcessForShutdown(IN PLUID CallerLuid) +{ + ULONG Hash; + PCSRSS_PROCESS_DATA CsrProcess, ReturnCsrProcess = NULL; + NTSTATUS Status; + ULONG Level = 0; + LUID ProcessLuid; + LUID SystemLuid = SYSTEM_LUID; + BOOLEAN IsSystemLuid = FALSE, IsOurLuid = FALSE; + + for (Hash = 0; Hash < (sizeof(ProcessData) / sizeof(*ProcessData)); Hash++) + { + /* Get this process hash bucket */ + CsrProcess = ProcessData[Hash]; + while (CsrProcess) + { + /* Skip this process if it's already been processed*/ + if (CsrProcess->Flags & CsrProcessSkipShutdown) goto Next; + + /* Get the LUID of this Process */ + Status = CsrGetProcessLuid(CsrProcess->Process, &ProcessLuid); + + /* Check if we didn't get access to the LUID */ + if (Status == STATUS_ACCESS_DENIED) + { + /* FIXME:Check if we have any threads */ + } + + if (!NT_SUCCESS(Status)) + { + /* We didn't have access, so skip it */ + CsrProcess->Flags |= CsrProcessSkipShutdown; + goto Next; + } + + /* Check if this is the System LUID */ + if ((IsSystemLuid = RtlEqualLuid(&ProcessLuid, &SystemLuid))) + { + /* Mark this process */ + CsrProcess->ShutdownFlags |= CsrShutdownSystem; + } + else if (!(IsOurLuid = RtlEqualLuid(&ProcessLuid, CallerLuid))) + { + /* Our LUID doesn't match with the caller's */ + CsrProcess->ShutdownFlags |= CsrShutdownOther; + } + + /* Check if we're past the previous level */ + if (CsrProcess->ShutdownLevel > Level) + { + /* Update the level */ + Level = CsrProcess->ShutdownLevel; + + /* Set the final process */ + ReturnCsrProcess = CsrProcess; + } +Next: + /* Next process */ + CsrProcess = CsrProcess->next; + } + } + + /* Check if we found a process */ + if (ReturnCsrProcess) + { + /* Skip this one next time */ + ReturnCsrProcess->Flags |= CsrProcessSkipShutdown; + } + + return ReturnCsrProcess; +} + +/* This is really "CsrShutdownProcess", mostly */ +NTSTATUS +WINAPI +CsrEnumProcesses(IN CSRSS_ENUM_PROCESS_PROC EnumProc, + IN PVOID Context) +{ + PVOID* RealContext = (PVOID*)Context; + PLUID CallerLuid = RealContext[0]; + PCSRSS_PROCESS_DATA CsrProcess = NULL; + NTSTATUS Status = STATUS_UNSUCCESSFUL; + BOOLEAN FirstTry; + ULONG Result = 0; + ULONG Hash; + + /* Acquire process lock */ + CsrAcquireProcessLock(); + + /* Start the loop */ + for (Hash = 0; Hash < (sizeof(ProcessData) / sizeof(*ProcessData)); Hash++) + { + /* Get the Process */ + CsrProcess = ProcessData[Hash]; + while (CsrProcess) + { + /* Remove the skip flag, set shutdown flags to 0*/ + CsrProcess->Flags &= ~CsrProcessSkipShutdown; + CsrProcess->ShutdownFlags = 0; + + /* Move to the next */ + CsrProcess = CsrProcess->next; + } + } + + /* Set shudown Priority */ + CsrSetToShutdownPriority(); + + /* Loop all processes */ + //DPRINT1("Enumerating for LUID: %lx %lx\n", CallerLuid->HighPart, CallerLuid->LowPart); + + /* Start looping */ + while (TRUE) + { + /* Find the next process to shutdown */ + FirstTry = TRUE; + if (!(CsrProcess = FindProcessForShutdown(CallerLuid))) + { + /* Done, quit */ + CsrReleaseProcessLock(); + Status = STATUS_SUCCESS; + goto Quickie; + } + +LoopAgain: + /* Release the lock, make the callback, and acquire it back */ + //DPRINT1("Found process: %lx\n", CsrProcess->ProcessId); + CsrReleaseProcessLock(); + Result = (ULONG)EnumProc(CsrProcess, (PVOID)((ULONG_PTR)Context | FirstTry)); + CsrAcquireProcessLock(); + + /* Check the result */ + //DPRINT1("Result: %d\n", Result); + if (Result == CsrShutdownCsrProcess) + { + /* The callback unlocked the process */ + break; + } + else if (Result == CsrShutdownNonCsrProcess) + { + /* A non-CSR process, the callback didn't touch it */ + //continue; + } + else if (Result == CsrShutdownCancelled) + { + /* Shutdown was cancelled, unlock and exit */ + CsrReleaseProcessLock(); + Status = STATUS_CANCELLED; + goto Quickie; + } + + /* No matches during the first try, so loop again */ + if (FirstTry && Result == CsrShutdownNonCsrProcess) + { + FirstTry = FALSE; + goto LoopAgain; + } + } + +Quickie: + /* Return to normal priority */ + CsrSetToNormalPriority(); + return Status; +} + +NTSTATUS +NTAPI +CsrLockProcessByClientId(IN HANDLE Pid, + OUT PCSRSS_PROCESS_DATA *CsrProcess OPTIONAL) +{ + ULONG Hash; + PCSRSS_PROCESS_DATA CurrentProcess = NULL; + NTSTATUS Status = STATUS_UNSUCCESSFUL; + + /* Acquire the lock */ + CsrAcquireProcessLock(); + + /* Start the loop */ + for (Hash = 0; Hash < (sizeof(ProcessData) / sizeof(*ProcessData)); Hash++) + { + /* Get the Process */ + CurrentProcess = ProcessData[Hash]; + while (CurrentProcess) + { + /* Check for PID match */ + if (CurrentProcess->ProcessId == Pid) + { + /* Get out of here with success */ +// DPRINT1("Found %p for PID %lx\n", CurrentProcess, Pid); + Status = STATUS_SUCCESS; + goto Found; + } + + /* Move to the next */ + CurrentProcess = CurrentProcess->next; + } + } + + /* Nothing found, release the lock */ +Found: + if (!CurrentProcess) CsrReleaseProcessLock(); + + /* Return the status and process */ + if (CsrProcess) *CsrProcess = CurrentProcess; + return Status; +} + +NTSTATUS +NTAPI +CsrUnlockProcess(IN PCSRSS_PROCESS_DATA CsrProcess) +{ + /* Dereference the process */ + //CsrLockedDereferenceProcess(CsrProcess); + + /* Release the lock and return */ + CsrReleaseProcessLock(); + return STATUS_SUCCESS; +} + +/* EOF */ diff --git a/reactos/subsystems/win32/csrss/csrss.h b/reactos/subsystems/win32/csrss/csrsrv/srv.h similarity index 71% rename from reactos/subsystems/win32/csrss/csrss.h rename to reactos/subsystems/win32/csrss/csrsrv/srv.h index 447c2e03521..cc11b70603c 100644 --- a/reactos/subsystems/win32/csrss/csrss.h +++ b/reactos/subsystems/win32/csrss/csrsrv/srv.h @@ -1,14 +1,16 @@ /* PSDK/NDK Headers */ +#define NTOS_MODE_USER #include #define WIN32_NO_STATUS #include -#define NTOS_MODE_USER +#include #include -#include +/* CSR Header */ +//#include -/* Build Number */ -#include +/* PSEH for SEH Support */ +#include /* Subsystem Manager Header */ #include @@ -17,5 +19,3 @@ #include #include #include - -/* EOF */ diff --git a/reactos/subsystems/win32/csrss/csrsrv/thredsup.c b/reactos/subsystems/win32/csrss/csrsrv/thredsup.c new file mode 100644 index 00000000000..e893888773b --- /dev/null +++ b/reactos/subsystems/win32/csrss/csrsrv/thredsup.c @@ -0,0 +1,306 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS CSR Sub System + * FILE: subsys/csr/csrsrv/procsup.c + * PURPOSE: CSR Process Management + * PROGRAMMERS: ReactOS Portable Systems Group + * Alex Ionescu + */ + +/* INCLUDES *******************************************************************/ + +#include + +#define NDEBUG +#include + +#define LOCK RtlEnterCriticalSection(&ProcessDataLock) +#define UNLOCK RtlLeaveCriticalSection(&ProcessDataLock) +#define CsrHeap RtlGetProcessHeap() +#define CsrHashThread(t) \ + (HandleToUlong(t)&(256 - 1)) + +#define CsrAcquireProcessLock() LOCK +#define CsrReleaseProcessLock() UNLOCK + +/* GLOBALS ********************************************************************/ + +LIST_ENTRY CsrThreadHashTable[256]; +extern PCSRSS_PROCESS_DATA CsrRootProcess; +extern RTL_CRITICAL_SECTION ProcessDataLock; +extern PCSRSS_PROCESS_DATA ProcessData[256]; + +/* FUNCTIONS ******************************************************************/ + +PCSR_THREAD +NTAPI +CsrAllocateThread(IN PCSRSS_PROCESS_DATA CsrProcess) +{ + PCSR_THREAD CsrThread; + + /* Allocate the structure */ + CsrThread = RtlAllocateHeap(CsrHeap, HEAP_ZERO_MEMORY, sizeof(CSR_THREAD)); + if (!CsrThread) return(NULL); + + /* Reference the Thread and Process */ + CsrThread->ReferenceCount++; + // CsrProcess->ReferenceCount++; + + /* Set the Parent Process */ + CsrThread->Process = CsrProcess; + + /* Return Thread */ + return CsrThread; +} + +PCSR_THREAD +NTAPI +CsrLocateThreadByClientId(OUT PCSRSS_PROCESS_DATA *Process OPTIONAL, + IN PCLIENT_ID ClientId) +{ + ULONG i; + PLIST_ENTRY ListHead, NextEntry; + PCSR_THREAD FoundThread; + + /* Hash the Thread */ + i = CsrHashThread(ClientId->UniqueThread); + + /* Set the list pointers */ + ListHead = &CsrThreadHashTable[i]; + NextEntry = ListHead->Flink; + + /* Star the loop */ + while (NextEntry != ListHead) + { + /* Get the thread */ + FoundThread = CONTAINING_RECORD(NextEntry, CSR_THREAD, HashLinks); + + /* Compare the CID */ + if (FoundThread->ClientId.UniqueThread == ClientId->UniqueThread) + { + /* Match found, return the process */ + *Process = FoundThread->Process; + + /* Return thread too */ +// DPRINT1("Found: %p %p\n", FoundThread, FoundThread->Process); + return FoundThread; + } + + /* Next */ + NextEntry = NextEntry->Flink; + } + + /* Nothing found */ + return NULL; +} + +PCSR_THREAD +NTAPI +CsrLocateThreadInProcess(IN PCSRSS_PROCESS_DATA CsrProcess OPTIONAL, + IN PCLIENT_ID Cid) +{ + PLIST_ENTRY ListHead, NextEntry; + PCSR_THREAD FoundThread = NULL; + + /* Use the Root Process if none was specified */ + if (!CsrProcess) CsrProcess = CsrRootProcess; + + /* Save the List pointers */ +// DPRINT1("Searching in: %p %d\n", CsrProcess, CsrProcess->ThreadCount); + ListHead = &CsrProcess->ThreadList; + NextEntry = ListHead->Flink; + + /* Start the Loop */ + while (NextEntry != ListHead) + { + /* Get Thread Entry */ + FoundThread = CONTAINING_RECORD(NextEntry, CSR_THREAD, Link); + + /* Check for TID Match */ + if (FoundThread->ClientId.UniqueThread == Cid->UniqueThread) break; + + /* Next entry */ + NextEntry = NextEntry->Flink; + } + + /* Return what we found */ +// DPRINT1("Found: %p\n", FoundThread); + return FoundThread; +} + +VOID +NTAPI +CsrInsertThread(IN PCSRSS_PROCESS_DATA Process, + IN PCSR_THREAD Thread) +{ + ULONG i; + + /* Insert it into the Regular List */ + InsertTailList(&Process->ThreadList, &Thread->Link); + + /* Increase Thread Count */ + Process->ThreadCount++; + + /* Hash the Thread */ + i = CsrHashThread(Thread->ClientId.UniqueThread); +// DPRINT1("TID %lx HASH: %lx\n", Thread->ClientId.UniqueThread, i); + + /* Insert it there too */ + InsertHeadList(&CsrThreadHashTable[i], &Thread->HashLinks); +} + +VOID +NTAPI +CsrDeallocateThread(IN PCSR_THREAD CsrThread) +{ + /* Free the process object from the heap */ + RtlFreeHeap(CsrHeap, 0, CsrThread); +} + +VOID +NTAPI +CsrRemoveThread(IN PCSR_THREAD CsrThread) +{ + /* Remove it from the List */ + RemoveEntryList(&CsrThread->Link); + + /* Decreate the thread count of the process */ + CsrThread->Process->ThreadCount--; + + /* Remove it from the Hash List as well */ + if (CsrThread->HashLinks.Flink) RemoveEntryList(&CsrThread->HashLinks); + + /* Check if this is the last Thread */ + if (!CsrThread->Process->ThreadCount) + { + /* Check if it's not already been marked for deletion */ + if (!(CsrThread->Process->Flags & CsrProcessLastThreadTerminated)) + { + /* Let everyone know this process is about to lose the thread */ + //CsrThread->Process->Flags |= CsrProcessLastThreadTerminated; + + /* Reference the Process */ + //CsrLockedDereferenceProcess(CsrThread->Process); + } + } + + /* Mark the thread for deletion */ + CsrThread->Flags |= CsrThreadInTermination; +} + +VOID +NTAPI +CsrThreadRefcountZero(IN PCSR_THREAD CsrThread) +{ + /* Remove this thread */ + CsrRemoveThread(CsrThread); + + /* Release the Process Lock */ + //CsrReleaseProcessLock(); + + /* Close the NT Thread Handle */ + if (CsrThread->ThreadHandle) NtClose(CsrThread->ThreadHandle); + + /* De-allocate the CSR Thread Object */ + CsrDeallocateThread(CsrThread); + + /* Remove a reference from the process */ + //CsrDereferenceProcess(CsrProcess); +} + +NTSTATUS +NTAPI +CsrCreateThread(IN PCSRSS_PROCESS_DATA CsrProcess, + IN HANDLE hThread, + IN PCLIENT_ID ClientId) +{ + NTSTATUS Status; + PCSR_THREAD CsrThread; + //PCSRSS_PROCESS_DATA CurrentProcess; + PCSR_THREAD CurrentThread = NtCurrentTeb()->CsrClientThread; + CLIENT_ID CurrentCid; + KERNEL_USER_TIMES KernelTimes; + +// DPRINT1("CSRSRV: %s called\n", __FUNCTION__); + + /* Get the current thread and CID */ + CurrentCid = CurrentThread->ClientId; +// DPRINT1("CALLER PID/TID: %lx/%lx\n", CurrentCid.UniqueProcess, CurrentCid.UniqueThread); + + /* Acquire the Process Lock */ + CsrAcquireProcessLock(); +#if 0 + /* Get the current Process and make sure the Thread is valid with this CID */ + CurrentThread = CsrLocateThreadByClientId(&CurrentProcess, + &CurrentCid); + + /* Something is wrong if we get an empty thread back */ + if (!CurrentThread) + { + DPRINT1("CSRSRV:%s: invalid thread!\n", __FUNCTION__); + CsrReleaseProcessLock(); + return STATUS_THREAD_IS_TERMINATING; + } +#endif + /* Get the Thread Create Time */ + Status = NtQueryInformationThread(hThread, + ThreadTimes, + (PVOID)&KernelTimes, + sizeof(KernelTimes), + NULL); + + /* Allocate a CSR Thread Structure */ + if (!(CsrThread = CsrAllocateThread(CsrProcess))) + { + DPRINT1("CSRSRV:%s: out of memory!\n", __FUNCTION__); + CsrReleaseProcessLock(); + return STATUS_NO_MEMORY; + } + + /* Save the data we have */ + CsrThread->CreateTime = KernelTimes.CreateTime; + CsrThread->ClientId = *ClientId; + CsrThread->ThreadHandle = hThread; + CsrThread->Flags = 0; + + /* Insert the Thread into the Process */ + CsrInsertThread(CsrProcess, CsrThread); + + /* Release the lock and return */ + CsrReleaseProcessLock(); + return STATUS_SUCCESS; +} + +PCSR_THREAD +NTAPI +CsrAddStaticServerThread(IN HANDLE hThread, + IN PCLIENT_ID ClientId, + IN ULONG ThreadFlags) +{ + PCSR_THREAD CsrThread; + + /* Get the Lock */ + CsrAcquireProcessLock(); + + /* Allocate the Server Thread */ + if ((CsrThread = CsrAllocateThread(CsrRootProcess))) + { + /* Setup the Object */ +// DPRINT1("New CSR thread created: %lx PID/TID: %lx/%lx\n", CsrThread, ClientId->UniqueProcess, ClientId->UniqueThread); + CsrThread->ThreadHandle = hThread; + CsrThread->ClientId = *ClientId; + CsrThread->Flags = ThreadFlags; + + /* Insert it into the Thread List */ + InsertTailList(&CsrRootProcess->ThreadList, &CsrThread->Link); + + /* Increment the thread count */ + CsrRootProcess->ThreadCount++; + } + + /* Release the Process Lock and return */ + CsrReleaseProcessLock(); + return CsrThread; +} + +/* EOF */ diff --git a/reactos/subsystems/win32/csrss/csrss.c b/reactos/subsystems/win32/csrss/csrss.c index 07027c75f17..c5f574584fb 100644 --- a/reactos/subsystems/win32/csrss/csrss.c +++ b/reactos/subsystems/win32/csrss/csrss.c @@ -1,62 +1,70 @@ -/* $Id$ - * - * csrss.c - Client/Server Runtime subsystem - * - * ReactOS Operating System - * - * -------------------------------------------------------------------- - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * -------------------------------------------------------------------- +/* + * PROJECT: ReactOS Client Server Runtime SubSystem (CSRSS) + * LICENSE: BSD - See COPYING.ARM in root directory + * FILE: subsystems/win32/csrss/csrss.c + * PURPOSE: Main Executable Code + * PROGRAMMERS: Alex Ionescu + * ReactOS Portable Systems Group */ -#include +/* INCLUDES *******************************************************************/ +#define WIN32_NO_STATUS +#include +#include +#include #define NDEBUG #include -int _cdecl _main(int argc, - char *argv[], - char *envp[], - int DebugFlag) +/* FUNCTIONS ******************************************************************/ + +VOID +NTAPI +CsrpSetDefaultProcessHardErrorMode(VOID) { - NTSTATUS Status = STATUS_SUCCESS; + ULONG DefaultHardErrorMode = 0; - //PrintString("ReactOS Client/Server Run-Time (Build %s)\n", - //KERNEL_VERSION_BUILD_STR); + /* Disable hard errors */ + NtSetInformationProcess(NtCurrentProcess(), + ProcessDefaultHardErrorMode, + &DefaultHardErrorMode, + sizeof(DefaultHardErrorMode)); +} - /*================================================================== - * Initialize the Win32 environment subsystem server. - *================================================================*/ - if (CsrServerInitialization (argc, argv, envp) == TRUE) - { - /* - * Terminate the current thread only. - */ - Status = NtTerminateThread (NtCurrentThread(), 0); - } - else - { - DisplayString (L"CSR: CsrServerInitialization failed.\n"); - /* - * Tell the SM we failed. - */ - Status = NtTerminateProcess (NtCurrentProcess(), 0); - } - return (int) Status; +int +_cdecl +_main(int argc, + char *argv[], + char *envp[], + int DebugFlag) +{ + KPRIORITY BasePriority = (8 + 1) + 4; + NTSTATUS Status; + + /* Set the Priority */ + NtSetInformationProcess(NtCurrentProcess(), + ProcessBasePriority, + &BasePriority, + sizeof(KPRIORITY)); + + /* Initialize CSR through CSRSRV */ + Status = CsrServerInitialization(argc, argv); + if (!NT_SUCCESS(Status)) + { + /* Kill us */ + DPRINT1("CSRSS: CsrServerInitialization failed:% lx\n", Status); + NtTerminateProcess(NtCurrentProcess(), Status); + } + + /* Disable errors */ + CsrpSetDefaultProcessHardErrorMode(); + + /* If this is Session 0, make sure killing us bugchecks the system */ + if (!NtCurrentPeb()->SessionId) RtlSetProcessIsCritical(TRUE, NULL, FALSE); + + /* Kill this thread. CSRSRV keeps us going */ + NtTerminateThread (NtCurrentThread(), Status); + return 0; } /* EOF */ diff --git a/reactos/subsystems/win32/csrss/csrss.rbuild b/reactos/subsystems/win32/csrss/csrss.rbuild index f3c9df8c87d..438b2e6574a 100644 --- a/reactos/subsystems/win32/csrss/csrss.rbuild +++ b/reactos/subsystems/win32/csrss/csrss.rbuild @@ -9,21 +9,14 @@ -fms-extensions nt ntdll - smdll - - handle.c - process.c - user.c - wapi.c - - csrss.h + csrsrv csrss.c - init.c - print.c - video.c csrss.rc + + + diff --git a/reactos/subsystems/win32/csrss/include/api.h b/reactos/subsystems/win32/csrss/include/api.h index 6e87fba96d2..7fbf6db9e58 100644 --- a/reactos/subsystems/win32/csrss/include/api.h +++ b/reactos/subsystems/win32/csrss/include/api.h @@ -6,14 +6,44 @@ * PURPOSE: CSRSS API interface */ -#ifndef API_H_INCLUDED -#define API_H_INCLUDED +#pragma once #define NTOS_MODE_USER #include #include +typedef enum _CSR_THREAD_FLAGS +{ + CsrThreadAltertable = 0x1, + CsrThreadInTermination = 0x2, + CsrThreadTerminated = 0x4, + CsrThreadIsServerThread = 0x10 +} CSR_THREAD_FLAGS, *PCSR_THREAD_FLAGS; + +typedef enum _SHUTDOWN_RESULT +{ + CsrShutdownCsrProcess = 1, + CsrShutdownNonCsrProcess, + CsrShutdownCancelled +} SHUTDOWN_RESULT, *PSHUTDOWN_RESULT; + +typedef enum _CSR_SHUTDOWN_FLAGS +{ + CsrShutdownSystem = 4, + CsrShutdownOther = 8 +} CSR_SHUTDOWN_FLAGS, *PCSR_SHUTDOWN_FLAGS; + +typedef enum _CSR_PROCESS_FLAGS +{ + CsrProcessTerminating = 0x1, + CsrProcessSkipShutdown = 0x2, + CsrProcessCreateNewGroup = 0x100, + CsrProcessTerminated = 0x200, + CsrProcessLastThreadTerminated = 0x400, + CsrProcessIsConsoleApp = 0x800 +} CSR_PROCESS_FLAGS, *PCSR_PROCESS_FLAGS; + typedef struct Object_tt { LONG Type; @@ -60,8 +90,25 @@ typedef struct _CSRSS_PROCESS_DATA LIST_ENTRY ProcessEntry; PCONTROLDISPATCHER CtrlDispatcher; BOOL Terminated; + ULONG Flags; + ULONG ThreadCount; + LIST_ENTRY ThreadList; } CSRSS_PROCESS_DATA, *PCSRSS_PROCESS_DATA; +typedef struct _CSR_THREAD +{ + LARGE_INTEGER CreateTime; + LIST_ENTRY Link; + LIST_ENTRY HashLinks; + CLIENT_ID ClientId; + PCSRSS_PROCESS_DATA Process; + //struct _CSR_WAIT_BLOCK *WaitBlock; + HANDLE ThreadHandle; + ULONG Flags; + ULONG ReferenceCount; + ULONG ImpersonationCount; +} CSR_THREAD, *PCSR_THREAD; + typedef VOID (WINAPI *CSR_CLEANUP_OBJECT_PROC)(Object_t *Object); typedef struct tagCSRSS_OBJECT_DEFINITION @@ -101,6 +148,7 @@ extern HANDLE hBootstrapOk; CSR_API(CsrConnectProcess); CSR_API(CsrCreateProcess); CSR_API(CsrTerminateProcess); +CSR_API(CsrSrvCreateThread); /* print.c */ VOID WINAPI DisplayString(LPCWSTR lpwString); @@ -130,17 +178,26 @@ PCSRSS_PROCESS_DATA WINAPI CsrGetProcessData(HANDLE ProcessId); PCSRSS_PROCESS_DATA WINAPI CsrCreateProcessData(HANDLE ProcessId); NTSTATUS WINAPI CsrFreeProcessData( HANDLE Pid ); NTSTATUS WINAPI CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc, PVOID Context); +PCSR_THREAD NTAPI CsrAddStaticServerThread(IN HANDLE hThread, IN PCLIENT_ID ClientId, IN ULONG ThreadFlags); +PCSR_THREAD NTAPI CsrLocateThreadInProcess(IN PCSRSS_PROCESS_DATA CsrProcess OPTIONAL, IN PCLIENT_ID Cid); +PCSR_THREAD NTAPI CsrLocateThreadByClientId(OUT PCSRSS_PROCESS_DATA *Process OPTIONAL, IN PCLIENT_ID ClientId); +NTSTATUS NTAPI CsrLockProcessByClientId(IN HANDLE Pid, OUT PCSRSS_PROCESS_DATA *CsrProcess OPTIONAL); +NTSTATUS NTAPI CsrCreateThread(IN PCSRSS_PROCESS_DATA CsrProcess, IN HANDLE hThread, IN PCLIENT_ID ClientId); +NTSTATUS NTAPI CsrUnlockProcess(IN PCSRSS_PROCESS_DATA CsrProcess); /* api/handle.c */ NTSTATUS FASTCALL CsrRegisterObjectDefinitions(PCSRSS_OBJECT_DEFINITION NewDefinitions); NTSTATUS WINAPI CsrInsertObject( PCSRSS_PROCESS_DATA ProcessData, PHANDLE Handle, Object_t *Object, DWORD Access, BOOL Inheritable ); NTSTATUS WINAPI CsrDuplicateHandleTable(PCSRSS_PROCESS_DATA SourceProcessData, PCSRSS_PROCESS_DATA TargetProcessData); NTSTATUS WINAPI CsrGetObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Handle, Object_t **Object, DWORD Access ); -BOOL WINAPI CsrServerInitialization (int,char**,char**); +NTSTATUS NTAPI CsrServerInitialization(ULONG ArgumentCount, PCHAR Arguments[]); NTSTATUS WINAPI CsrReleaseObjectByPointer(Object_t *Object); NTSTATUS WINAPI CsrReleaseObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Object ); NTSTATUS WINAPI CsrVerifyObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Object ); +//hack +VOID NTAPI CsrThreadRefcountZero(IN PCSR_THREAD CsrThread); + CSR_API(CsrGetInputHandle); CSR_API(CsrGetOutputHandle); CSR_API(CsrCloseHandle); @@ -157,8 +214,4 @@ CSR_API(CsrSetShutdownParameters); CSR_API(CsrSetLogonNotifyWindow); CSR_API(CsrRegisterLogonProcess); - -#endif /* ndef API_H_INCLUDED */ - /* EOF */ - diff --git a/reactos/subsystems/win32/csrss/include/conio.h b/reactos/subsystems/win32/csrss/include/conio.h index fa6320f8e00..35d71863a15 100644 --- a/reactos/subsystems/win32/csrss/include/conio.h +++ b/reactos/subsystems/win32/csrss/include/conio.h @@ -6,8 +6,7 @@ * PURPOSE: CSRSS internal console I/O interface */ -#ifndef CONIO_H_INCLUDED -#define CONIO_H_INCLUDED +#pragma once #include "api.h" #include "win32csr.h" @@ -176,8 +175,4 @@ CSR_API(CsrGetAllConsoleAliasesLength); CSR_API(CsrGetConsoleAliasesExes); CSR_API(CsrGetConsoleAliasesExesLength); - -#endif /* CONIO_H_INCLUDED */ - /* EOF */ - diff --git a/reactos/subsystems/win32/csrss/include/csrplugin.h b/reactos/subsystems/win32/csrss/include/csrplugin.h index 90e158f6242..357b65bcd25 100644 --- a/reactos/subsystems/win32/csrss/include/csrplugin.h +++ b/reactos/subsystems/win32/csrss/include/csrplugin.h @@ -16,8 +16,7 @@ * subsystem. */ -#ifndef CSRPLUGIN_H_INCLUDED -#define CSRPLUGIN_H_INCLUDED +#pragma once #include #include "api.h" @@ -58,6 +57,4 @@ typedef BOOL (WINAPI *CSRPLUGIN_INITIALIZE_PROC)(PCSRSS_API_DEFINITION *ApiDefin PCSRSS_EXPORTED_FUNCS Exports, HANDLE CsrssApiHeap); -#endif /* CSRPLUGIN_H_INCLUDED */ - /* EOF */ diff --git a/reactos/subsystems/win32/csrss/include/desktopbg.h b/reactos/subsystems/win32/csrss/include/desktopbg.h index b06a16c95f3..737c2d12586 100644 --- a/reactos/subsystems/win32/csrss/include/desktopbg.h +++ b/reactos/subsystems/win32/csrss/include/desktopbg.h @@ -6,8 +6,7 @@ * PURPOSE: CSRSS internal desktop background window interface */ -#ifndef DESKTOPBG_H_INCLUDED -#define DESKTOPBG_H_INCLUDED +#pragma once #include "api.h" @@ -19,7 +18,4 @@ CSR_API(CsrRegisterSystemClasses); BOOL FASTCALL DtbgIsDesktopVisible(VOID); -#endif /* DESKTOPBG_H_INCLUDED */ - /* EOF */ - diff --git a/reactos/subsystems/win32/csrss/include/win32csr.h b/reactos/subsystems/win32/csrss/include/win32csr.h index dae70937ce3..6b7791f72f6 100644 --- a/reactos/subsystems/win32/csrss/include/win32csr.h +++ b/reactos/subsystems/win32/csrss/include/win32csr.h @@ -6,9 +6,7 @@ * PURPOSE: Interface to win32csr.dll */ - -#ifndef WIN32CSR_H_INCLUDED -#define WIN32CSR_H_INCLUDED +#pragma once #include #include @@ -38,6 +36,4 @@ NTSTATUS FASTCALL Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData, NTSTATUS FASTCALL Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc, PVOID Context); -#endif /* WIN32CSR_H_INCLUDED */ - /* EOF */ diff --git a/reactos/subsystems/win32/csrss/print.c b/reactos/subsystems/win32/csrss/print.c deleted file mode 100644 index 3e5949d073a..00000000000 --- a/reactos/subsystems/win32/csrss/print.c +++ /dev/null @@ -1,61 +0,0 @@ -/* $Id$ - * - * smss.c - Session Manager - * - * ReactOS Operating System - * - * -------------------------------------------------------------------- - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * -------------------------------------------------------------------- - * - * 19990529 (Emanuele Aliberti) - * Compiled successfully with egcs 1.1.2 - */ - -#include - -#define NDEBUG -#include - -VOID WINAPI DisplayString(LPCWSTR lpwString) -{ - UNICODE_STRING us; - - RtlInitUnicodeString (&us, lpwString); - ZwDisplayString (&us); -} - -VOID WINAPI PrintString (char* fmt, ...) -{ - char buffer[512]; - va_list ap; - UNICODE_STRING UnicodeString; - ANSI_STRING AnsiString; - - va_start(ap, fmt); - vsprintf(buffer, fmt, ap); - va_end(ap); - - RtlInitAnsiString (&AnsiString, buffer); - RtlAnsiStringToUnicodeString (&UnicodeString, - &AnsiString, - TRUE); - NtDisplayString(&UnicodeString); - RtlFreeUnicodeString (&UnicodeString); -} - -/* EOF */ diff --git a/reactos/subsystems/win32/csrss/video.c b/reactos/subsystems/win32/csrss/video.c deleted file mode 100644 index 8282c15bd7a..00000000000 --- a/reactos/subsystems/win32/csrss/video.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - * PROJECT: ReactOS Client/Server Runtime subsystem - * LICENSE: GPL v2 or later - See COPYING in the top level directory - * FILE: subsystems/win32/csrss/video.c - * PURPOSE: Video memory initialization. - * PROGRAMMERS: ReactOS Development Team - */ - -/* INCLUDES ******************************************************************/ - -#include - -#define NDEBUG -#include - -/* FUNCTIONS *****************************************************************/ - -ULONG -InitializeVideoAddressSpace(VOID) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING PhysMemName = RTL_CONSTANT_STRING(L"\\Device\\PhysicalMemory"); - NTSTATUS Status; - HANDLE PhysMemHandle; - PVOID BaseAddress; - LARGE_INTEGER Offset; - SIZE_T ViewSize; - CHAR IVTAndBda[1024+256]; - - /* Open the physical memory section */ - InitializeObjectAttributes(&ObjectAttributes, - &PhysMemName, - 0, - NULL, - NULL); - Status = ZwOpenSection(&PhysMemHandle, - SECTION_ALL_ACCESS, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Couldn't open \\Device\\PhysicalMemory\n"); - return 0; - } - - /* Map the BIOS and device registers into the address space */ - Offset.QuadPart = 0xa0000; - ViewSize = 0x100000 - 0xa0000; - BaseAddress = (PVOID)0xa0000; - Status = ZwMapViewOfSection(PhysMemHandle, - NtCurrentProcess(), - &BaseAddress, - 0, - ViewSize, - &Offset, - &ViewSize, - ViewUnmap, - 0, - PAGE_EXECUTE_READWRITE); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Couldn't map physical memory (%x)\n", Status); - ZwClose(PhysMemHandle); - return 0; - } - - /* Close physical memory section handle */ - ZwClose(PhysMemHandle); - - if (BaseAddress != (PVOID)0xa0000) - { - DPRINT1("Couldn't map physical memory at the right address (was %x)\n", - BaseAddress); - return 0; - } - - /* Allocate some low memory to use for the non-BIOS - * parts of the v86 mode address space - */ - BaseAddress = (PVOID)0x1; - ViewSize = 0xa0000 - 0x1000; - Status = ZwAllocateVirtualMemory(NtCurrentProcess(), - &BaseAddress, - 0, - &ViewSize, - MEM_COMMIT, - PAGE_EXECUTE_READWRITE); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to allocate virtual memory (Status %x)\n", Status); - return 0; - } - if (BaseAddress != (PVOID)0x0) - { - DPRINT1("Failed to allocate virtual memory at right address (was %x)\n", - BaseAddress); - return 0; - } - - /* Get the real mode IVT and BDA from the kernel */ - Status = NtVdmControl(VdmInitialize, IVTAndBda); - if (!NT_SUCCESS(Status)) - { - DPRINT1("NtVdmControl failed (status %x)\n", Status); - return 0; - } - - /* Return success */ - return 1; -} - -/* EOF */ diff --git a/reactos/subsystems/win32/csrss/win32csr/resource.h b/reactos/subsystems/win32/csrss/win32csr/resource.h index 9f4b485cb6f..eaadd2f2349 100644 --- a/reactos/subsystems/win32/csrss/win32csr/resource.h +++ b/reactos/subsystems/win32/csrss/win32csr/resource.h @@ -6,8 +6,7 @@ * PURPOSE: Resource #defines */ -#ifndef WIN32CSR_RESOURCE_H_INCLUDED -#define WIN32CSR_RESOURCE_H_INCLUDED +#pragma once #define IDD_END_NOW 10 #define IDD_NOT_RESPONDING 11 @@ -49,8 +48,4 @@ #define IDS_SCROLLUP 309 #define IDS_SCROLLDOWN 310 - - -#endif /* WIN32CSR_RESOURCE_H_INCLUDED */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/dib/dib.h b/reactos/subsystems/win32/win32k/dib/dib.h index 9bcf52d6f42..bae2199fe59 100644 --- a/reactos/subsystems/win32/win32k/dib/dib.h +++ b/reactos/subsystems/win32/win32k/dib/dib.h @@ -1,5 +1,4 @@ -#ifndef _W32K_DIB_DIB_H -#define _W32K_DIB_DIB_H +#pragma once #ifdef _M_IX86 #define memset4(dest, value, count) asm volatile("rep stosl" : : "D"(dest), "a"(value), "c"(count) : "memory"); @@ -148,6 +147,3 @@ ULONG DIB_DoRop(ULONG Rop, ULONG Dest, ULONG Source, ULONG Pattern); #define DIB_GetSourceIndex(SourceSurf,sx,sy) \ DibFunctionsForBitmapFormat[SourceSurf->iBitmapFormat]. \ DIB_GetPixel(SourceSurf, sx, sy) - -#endif /* _W32K_DIB_DIB_H */ - diff --git a/reactos/subsystems/win32/win32k/eng/surface.c b/reactos/subsystems/win32/win32k/eng/surface.c index 5dd61387e08..5a85d1ac1b6 100644 --- a/reactos/subsystems/win32/win32k/eng/surface.c +++ b/reactos/subsystems/win32/win32k/eng/surface.c @@ -445,25 +445,269 @@ IntCreateBitmap(IN SIZEL Size, return hbmp; } +/* Name gleaned from C++ symbol information for SURFMEM::bInitDIB */ +typedef struct _DEVBITMAPINFO +{ + ULONG Format; + ULONG Width; + ULONG Height; + ULONG Flags; + ULONG Size; +} DEVBITMAPINFO, *PDEVBITMAPINFO; + +SURFOBJ* +FASTCALL +SURFMEM_bCreateDib(IN PDEVBITMAPINFO BitmapInfo, + IN PVOID Bits) +{ + BOOLEAN Compressed = FALSE; + ULONG ScanLine = 0; // Compiler is dumb + ULONG Size; + SURFOBJ *pso; + PSURFACE psurf; + SIZEL LocalSize; + BOOLEAN AllocatedLocally = FALSE; + + /* + * First, check the format so we can get the aligned scanline width. + * RLE and the newer fancy-smanshy JPG/PNG support do NOT have scanlines + * since they are compressed surfaces! + */ + switch (BitmapInfo->Format) + { + case BMF_1BPP: + ScanLine = ((BitmapInfo->Width + 31) & ~31) >> 3; + break; + + case BMF_4BPP: + ScanLine = ((BitmapInfo->Width + 7) & ~7) >> 1; + break; + + case BMF_8BPP: + ScanLine = (BitmapInfo->Width + 3) & ~3; + break; + + case BMF_16BPP: + ScanLine = ((BitmapInfo->Width + 1) & ~1) << 1; + break; + + case BMF_24BPP: + ScanLine = ((BitmapInfo->Width * 3) + 3) & ~3; + break; + + case BMF_32BPP: + ScanLine = BitmapInfo->Width << 2; + break; + + case BMF_8RLE: + case BMF_4RLE: + case BMF_JPEG: + case BMF_PNG: + Compressed = TRUE; + break; + + default: + DPRINT1("Invalid bitmap format\n"); + return NULL; + } + + /* Does the device manage its own surface? */ + if (!Bits) + { + /* We need to allocate bits for the caller, figure out the size */ + if (Compressed) + { + /* Note: we should not be seeing this scenario from ENGDDI */ + ASSERT(FALSE); + Size = BitmapInfo->Size; + } + else + { + /* The height times the bytes for each scanline */ + Size = BitmapInfo->Height * ScanLine; + } + + if (Size) + { + /* Check for allocation flag */ + if (BitmapInfo->Flags & BMF_USERMEM) + { + /* Get the bits from user-mode memory */ + Bits = EngAllocUserMem(Size, 'mbuG'); + } + else + { + /* Get kernel bits (zeroed out if requested) */ + Bits = EngAllocMem((BitmapInfo->Flags & BMF_NOZEROINIT) ? 0 : FL_ZERO_MEMORY, + Size, + TAG_DIB); + } + AllocatedLocally = TRUE; + /* Bail out if that failed */ + if (!Bits) return NULL; + } + } + else + { + /* Should not have asked for user memory */ + ASSERT((BitmapInfo->Flags & BMF_USERMEM) == 0); + } + + /* Allocate the actual surface object structure */ + psurf = SURFACE_AllocSurfaceWithHandle(); + if (!psurf) + { + if(Bits && AllocatedLocally) + { + if(BitmapInfo->Flags & BMF_USERMEM) + EngFreeUserMem(Bits); + else + EngFreeMem(Bits); + } + return NULL; + } + + /* Lock down the surface */ + if (!SURFACE_InitBitsLock(psurf)) + { + /* Bail out if that failed */ + SURFACE_UnlockSurface(psurf); + SURFACE_FreeSurfaceByHandle(psurf->BaseObject.hHmgr); + return NULL; + } + + /* We should now have our surface object */ + pso = &psurf->SurfObj; + + /* Save format and flags */ + pso->iBitmapFormat = BitmapInfo->Format; + pso->fjBitmap = BitmapInfo->Flags & (BMF_TOPDOWN | BMF_UMPDMEM | BMF_USERMEM); + + /* Save size and type */ + LocalSize.cy = BitmapInfo->Height; + LocalSize.cx = BitmapInfo->Width; + pso->sizlBitmap = LocalSize; + pso->iType = STYPE_BITMAP; + + /* Device-managed surface, no flags or dimension */ + pso->dhsurf = 0; + pso->dhpdev = NULL; + pso->hdev = NULL; + psurf->flFlags = 0; + psurf->dimension.cx = 0; + psurf->dimension.cy = 0; + psurf->hSecure = NULL; + psurf->hDIBSection = NULL; + psurf->flHooks = 0; + + /* Set bits */ + pso->pvBits = Bits; + + /* Check for bitmap type */ + if (!Compressed) + { + /* Number of bits is based on the height times the scanline */ + pso->cjBits = BitmapInfo->Height * ScanLine; + if (BitmapInfo->Flags & BMF_TOPDOWN) + { + /* For topdown, the base address starts with the bits */ + pso->pvScan0 = pso->pvBits; + pso->lDelta = ScanLine; + } + else + { + /* Otherwise we start with the end and go up */ + pso->pvScan0 = (PVOID)((ULONG_PTR)pso->pvBits + pso->cjBits - ScanLine); + pso->lDelta = -ScanLine; + } + } + else + { + /* Compressed surfaces don't have scanlines! */ + pso->lDelta = 0; + pso->cjBits = BitmapInfo->Size; + + /* Check for JPG or PNG */ + if ((BitmapInfo->Format != BMF_JPEG) && (BitmapInfo->Format != BMF_PNG)) + { + /* Wherever the bit data is */ + pso->pvScan0 = pso->pvBits; + } + else + { + /* Fancy formats don't use a base address */ + pso->pvScan0 = NULL; + ASSERT(FALSE); // ENGDDI shouldn't be creating PNGs for drivers ;-) + } + } + + /* Finally set the handle and uniq */ + pso->hsurf = (HSURF)psurf->BaseObject.hHmgr; + pso->iUniq = 0; + + /* Unlock and return the surface */ + SURFACE_UnlockSurface(psurf); + return pso; +} + /* * @implemented */ -HBITMAP APIENTRY +HBITMAP +APIENTRY EngCreateBitmap(IN SIZEL Size, IN LONG Width, IN ULONG Format, IN ULONG Flags, IN PVOID Bits) { - HBITMAP hNewBitmap; + SURFOBJ* Surface; + DEVBITMAPINFO BitmapInfo; + + /* Capture the parameters */ + BitmapInfo.Format = Format; + BitmapInfo.Width = Size.cx; + BitmapInfo.Height = Size.cy; + BitmapInfo.Flags = Flags; - hNewBitmap = IntCreateBitmap(Size, Width, Format, Flags, Bits); - if ( !hNewBitmap ) - return 0; + /* + * If the display driver supports framebuffer access, use the scanline width + * to determine the actual width of the bitmap, and convert it to pels instead + * of bytes. + */ + if ((Bits) && (Width)) + { + switch (BitmapInfo.Format) + { + /* Do the conversion for each bit depth we support */ + case BMF_1BPP: + BitmapInfo.Width = Width * 8; + break; + case BMF_4BPP: + BitmapInfo.Width = Width * 2; + break; + case BMF_8BPP: + BitmapInfo.Width = Width; + break; + case BMF_16BPP: + BitmapInfo.Width = Width / 2; + break; + case BMF_24BPP: + BitmapInfo.Width = Width / 3; + break; + case BMF_32BPP: + BitmapInfo.Width = Width / 4; + break; + } + } + + /* Now create the surface */ + Surface = SURFMEM_bCreateDib(&BitmapInfo, Bits); + if (!Surface) return 0; - GDIOBJ_SetOwnership(hNewBitmap, NULL); - - return hNewBitmap; + /* Set public ownership and reutrn the handle */ + GDIOBJ_SetOwnership(Surface->hsurf, NULL); + return Surface->hsurf; } /* diff --git a/reactos/subsystems/win32/win32k/include/accelerator.h b/reactos/subsystems/win32/win32k/include/accelerator.h index d4ad5982876..f9aea474215 100644 --- a/reactos/subsystems/win32/win32k/include/accelerator.h +++ b/reactos/subsystems/win32/win32k/include/accelerator.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_ACCELERATOR_H -#define _WIN32K_ACCELERATOR_H +#pragma once #include #include @@ -19,5 +18,3 @@ NTSTATUS FASTCALL CleanupAcceleratorImpl(VOID); PACCELERATOR_TABLE FASTCALL UserGetAccelObject(HACCEL); - -#endif /* _WIN32K_ACCELERATOR_H */ diff --git a/reactos/subsystems/win32/win32k/include/bitmaps.h b/reactos/subsystems/win32/win32k/include/bitmaps.h index 2cfd7c49cdb..6a5e731c375 100644 --- a/reactos/subsystems/win32/win32k/include/bitmaps.h +++ b/reactos/subsystems/win32/win32k/include/bitmaps.h @@ -1,5 +1,4 @@ -#ifndef __WIN32K_BITMAPS_H -#define __WIN32K_BITMAPS_H +#pragma once #include "surface.h" @@ -11,5 +10,3 @@ HBITMAP FASTCALL IntCreateBitmap(IN SIZEL Size, IN LONG Width, IN ULONG Format, HBITMAP FASTCALL BITMAP_CopyBitmap (HBITMAP hBitmap); UINT FASTCALL BITMAP_GetRealBitsPixel(UINT nBitsPixel); INT FASTCALL BITMAP_GetWidthBytes (INT bmWidth, INT bpp); - -#endif diff --git a/reactos/subsystems/win32/win32k/include/brush.h b/reactos/subsystems/win32/win32k/include/brush.h index 2c114d04fb1..8c9a7a8b21f 100644 --- a/reactos/subsystems/win32/win32k/include/brush.h +++ b/reactos/subsystems/win32/win32k/include/brush.h @@ -1,5 +1,4 @@ -#ifndef __WIN32K_BRUSH_H -#define __WIN32K_BRUSH_H +#pragma once #include "gdiobj.h" @@ -133,5 +132,3 @@ PVOID FASTCALL AllocateObjectAttr(VOID); VOID FASTCALL FreeObjectAttr(PVOID); BOOL FASTCALL IntGdiSetBrushOwner(PBRUSH,DWORD); - -#endif diff --git a/reactos/subsystems/win32/win32k/include/callback.h b/reactos/subsystems/win32/win32k/include/callback.h index 61b80745552..0b978a67e49 100644 --- a/reactos/subsystems/win32/win32k/include/callback.h +++ b/reactos/subsystems/win32/win32k/include/callback.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_CALLBACK_H -#define _WIN32K_CALLBACK_H +#pragma once #include @@ -57,5 +56,3 @@ IntCbFreeMemory(PVOID Data); HMENU APIENTRY co_IntCallLoadMenu(HINSTANCE,PUNICODE_STRING); NTSTATUS APIENTRY co_IntClientThreadSetup(VOID); - -#endif /* _WIN32K_CALLBACK_H */ diff --git a/reactos/subsystems/win32/win32k/include/caret.h b/reactos/subsystems/win32/win32k/include/caret.h index dc6dae5dd81..8c7998c0c6f 100644 --- a/reactos/subsystems/win32/win32k/include/caret.h +++ b/reactos/subsystems/win32/win32k/include/caret.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_CARET_H -#define _WIN32K_CARET_H +#pragma once #include #include @@ -22,7 +21,4 @@ BOOL FASTCALL co_UserShowCaret(PWINDOW_OBJECT WindowObject); BOOL FASTCALL co_UserHideCaret(PWINDOW_OBJECT WindowObject); - -#endif /* _WIN32K_CARET_H */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/class.h b/reactos/subsystems/win32/win32k/include/class.h index 70b78763f82..ac36f6b32ce 100644 --- a/reactos/subsystems/win32/win32k/include/class.h +++ b/reactos/subsystems/win32/win32k/include/class.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_CLASS_H -#define _WIN32K_CLASS_H +#pragma once #include #include @@ -106,6 +105,4 @@ BOOL FASTCALL LookupFnIdToiCls(int, int * ); WNDPROC FASTCALL IntGetClassWndProc(PCLS, BOOL); ULONG_PTR FASTCALL UserGetCPD(PVOID,GETCPD,ULONG_PTR); -#endif /* _WIN32K_CLASS_H */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/cleanup.h b/reactos/subsystems/win32/win32k/include/cleanup.h index 46d6496e2ea..c5a55e536a7 100644 --- a/reactos/subsystems/win32/win32k/include/cleanup.h +++ b/reactos/subsystems/win32/win32k/include/cleanup.h @@ -1,5 +1,4 @@ -#ifndef _SUBSYS_WIN32K_INCLUDE_CLEANUP_H -#define _SUBSYS_WIN32K_INCLUDE_CLEANUP_H +#pragma once NTSTATUS FASTCALL InitCleanupImpl(VOID); @@ -16,5 +15,3 @@ IntUnicodeStringToNULLTerminated(PWSTR *Dest, PUNICODE_STRING Src); void FASTCALL IntFreeNULLTerminatedFromUnicodeString(PWSTR NullTerminated, PUNICODE_STRING UnicodeString); - -#endif /* ndef _SUBSYS_WIN32K_INCLUDE_CLEANUP_H */ diff --git a/reactos/subsystems/win32/win32k/include/clipboard.h b/reactos/subsystems/win32/win32k/include/clipboard.h index 95e961b6d9b..819ba98477b 100644 --- a/reactos/subsystems/win32/win32k/include/clipboard.h +++ b/reactos/subsystems/win32/win32k/include/clipboard.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_CLIPBOARD_H -#define _WIN32K_CLIPBOARD_H +#pragma once #include "window.h" #include @@ -50,5 +49,3 @@ UINT APIENTRY IntEnumClipboardFormats(UINT format); UINT FASTCALL IntEnumClipboardFormats(UINT format); */ - -#endif /* _WIN32K_CLIPBOARD_H */ diff --git a/reactos/subsystems/win32/win32k/include/cliprgn.h b/reactos/subsystems/win32/win32k/include/cliprgn.h index 1dfca64c189..aef5998d505 100644 --- a/reactos/subsystems/win32/win32k/include/cliprgn.h +++ b/reactos/subsystems/win32/win32k/include/cliprgn.h @@ -1,5 +1,4 @@ -#ifndef __WIN32K_CLIPRGN_H -#define __WIN32K_CLIPRGN_H +#pragma once #include #include @@ -10,5 +9,3 @@ INT FASTCALL IntGdiExtSelectClipRgn (PDC, PROSRGNDATA, int); INT FASTCALL GdiGetClipBox(HDC hDC, RECTL *rc); INT FASTCALL GdiSelectVisRgn(HDC hdc, HRGN hrgn); INT FASTCALL GdiExtSelectClipRgn (PDC dc, HRGN hrgn, int fnMode); - -#endif /* not __WIN32K_CLIPRGN_H */ diff --git a/reactos/subsystems/win32/win32k/include/color.h b/reactos/subsystems/win32/win32k/include/color.h index cb8c3108817..0972f2e8dd3 100644 --- a/reactos/subsystems/win32/win32k/include/color.h +++ b/reactos/subsystems/win32/win32k/include/color.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_COLOR_H -#define _WIN32K_COLOR_H +#pragma once #ifndef CLR_INVALID #define CLR_INVALID 0xffffffff @@ -40,5 +39,3 @@ INT APIENTRY COLOR_PaletteLookupPixel(PALETTEENTRY *palPalEntry, INT size, XLATE UINT FASTCALL IntGdiRealizePalette (HDC); HCOLORSPACE FASTCALL IntGdiCreateColorSpace(PLOGCOLORSPACEEXW); BOOL FASTCALL IntGdiDeleteColorSpace(HCOLORSPACE); - -#endif /* _WIN32K_COLOR_H */ diff --git a/reactos/subsystems/win32/win32k/include/coord.h b/reactos/subsystems/win32/win32k/include/coord.h index bec402026cb..c241b9eb9b6 100644 --- a/reactos/subsystems/win32/win32k/include/coord.h +++ b/reactos/subsystems/win32/win32k/include/coord.h @@ -1,5 +1,4 @@ -#ifndef __WIN32K_COORD_H -#define __WIN32K_COORD_H +#pragma once #include @@ -20,5 +19,3 @@ IntGdiModifyWorldTransform(PDC pDc, VOID FASTCALL IntMirrorWindowOrg(PDC); void FASTCALL IntFixIsotropicMapping(PDC dc); - -#endif diff --git a/reactos/subsystems/win32/win32k/include/csr.h b/reactos/subsystems/win32/win32k/include/csr.h index e3caa96cd0c..4f5dc8daf53 100644 --- a/reactos/subsystems/win32/win32k/include/csr.h +++ b/reactos/subsystems/win32/win32k/include/csr.h @@ -7,8 +7,7 @@ * PROGRAMER: Ge van Geldorp (ge@gse.nl) */ -#ifndef CSR_H_INCLUDED -#define CSR_H_INCLUDED +#pragma once extern PEPROCESS CsrProcess; @@ -19,6 +18,4 @@ NTSTATUS WINAPI CsrInsertObject(HANDLE ObjectHandle, ACCESS_MASK DesiredAccess, PHANDLE Handle); -#endif /* CSR_H_INCLUDED */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/cursoricon.h b/reactos/subsystems/win32/win32k/include/cursoricon.h index c2b66b15b23..280ab555601 100644 --- a/reactos/subsystems/win32/win32k/include/cursoricon.h +++ b/reactos/subsystems/win32/win32k/include/cursoricon.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_CURSORICON_H -#define _WIN32K_CURSORICON_H +#pragma once #define MAXCURICONHANDLES 4096 @@ -106,8 +105,4 @@ GreMovePointer( LONG x, LONG y); -#endif /* _WIN32K_CURSORICON_H */ - /* EOF */ - - diff --git a/reactos/subsystems/win32/win32k/include/dc.h b/reactos/subsystems/win32/win32k/include/dc.h index 80d66209e36..b616bdc0ba6 100644 --- a/reactos/subsystems/win32/win32k/include/dc.h +++ b/reactos/subsystems/win32/win32k/include/dc.h @@ -1,5 +1,4 @@ -#ifndef __WIN32K_DC_H -#define __WIN32K_DC_H +#pragma once typedef struct _DC *PDC; @@ -232,5 +231,3 @@ DC_vSelectPalette(PDC pdc, PPALETTE ppal) BOOL FASTCALL IntPrepareDriverIfNeeded(VOID); extern PDEVOBJ PrimarySurface; - -#endif /* not __WIN32K_DC_H */ diff --git a/reactos/subsystems/win32/win32k/include/dce.h b/reactos/subsystems/win32/win32k/include/dce.h index 6c0e58b17cf..de83e8a5c02 100644 --- a/reactos/subsystems/win32/win32k/include/dce.h +++ b/reactos/subsystems/win32/win32k/include/dce.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_DCE_H -#define _WIN32K_DCE_H +#pragma once /* Ported from WINE by Jason Filby */ @@ -48,6 +47,7 @@ typedef struct tagDCE #define DCX_DCPOWNED 0x00008000 #define DCX_NOCLIPCHILDREN 0x00080000 #define DCX_NORECOMPUTE 0x00100000 +#define DCX_INDESTROY 0x00400000 BOOL FASTCALL DCE_Cleanup(PDCE pDce); PDCE FASTCALL DceAllocDCE(PWINDOW_OBJECT Window, DCE_TYPE Type); @@ -63,5 +63,3 @@ void FASTCALL DceFreeClassDCE(HDC); HWND FASTCALL UserGethWnd(HDC,PWNDOBJ*); void FASTCALL DceFreeWindowDCE(PWINDOW_OBJECT); void FASTCALL DceFreeThreadDCE(PTHREADINFO); - -#endif /* _WIN32K_DCE_H */ diff --git a/reactos/subsystems/win32/win32k/include/desktop.h b/reactos/subsystems/win32/win32k/include/desktop.h index fe7a93fdd81..ecdd4209376 100644 --- a/reactos/subsystems/win32/win32k/include/desktop.h +++ b/reactos/subsystems/win32/win32k/include/desktop.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_DESKTOP_H -#define _WIN32K_DESKTOP_H +#pragma once #include "msgqueue.h" #include "window.h" @@ -252,6 +251,4 @@ DesktopHeapAddressToUser(PVOID lpMem) return NULL; } -#endif /* _WIN32K_DESKTOP_H */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/dib.h b/reactos/subsystems/win32/win32k/include/dib.h index 4ab6efe0bc3..479476d3850 100644 --- a/reactos/subsystems/win32/win32k/include/dib.h +++ b/reactos/subsystems/win32/win32k/include/dib.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_DIB_H -#define _WIN32K_DIB_H +#pragma once #include "dc.h" @@ -18,5 +17,3 @@ DIB_MapPaletteColors(PDC dc, CONST BITMAPINFO* lpbmi); HPALETTE FASTCALL BuildDIBPalette (CONST BITMAPINFO *bmi, PINT paletteType); - -#endif /* _WIN32K_DIB_H */ diff --git a/reactos/subsystems/win32/win32k/include/driver.h b/reactos/subsystems/win32/win32k/include/driver.h index 04cd33b986f..8e89f595b47 100644 --- a/reactos/subsystems/win32/win32k/include/driver.h +++ b/reactos/subsystems/win32/win32k/include/driver.h @@ -1,6 +1,4 @@ - -#ifndef __WIN32K_DRIVER_H -#define __WIN32K_DRIVER_H +#pragma once #include @@ -21,7 +19,3 @@ BOOL DRIVER_BuildDDIFunctions(PDRVENABLEDATA DED, BOOL DRIVER_UnregisterDriver(LPCWSTR Name); INT DRIVER_ReferenceDriver (LPCWSTR Name); INT DRIVER_UnreferenceDriver (LPCWSTR Name); - -#endif - - diff --git a/reactos/subsystems/win32/win32k/include/driverobj.h b/reactos/subsystems/win32/win32k/include/driverobj.h index 0799465484a..4056083528d 100644 --- a/reactos/subsystems/win32/win32k/include/driverobj.h +++ b/reactos/subsystems/win32/win32k/include/driverobj.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_DRIVEROBJ_H -#define _WIN32K_DRIVEROBJ_H +#pragma once #include "gdiobj.h" @@ -19,5 +18,3 @@ BOOL INTERNAL_CALL DRIVEROBJ_Cleanup(PVOID pObject); #define DRIVEROBJ_FreeObjectByHandle(hdo) GDIOBJ_FreeObjByHandle((HGDIOBJ)hdo, GDI_OBJECT_TYPE_DRIVEROBJ) #define DRIVEROBJ_LockObject(hdo) ((PEDRIVEROBJ)GDIOBJ_LockObj((HGDIOBJ)hdo, GDI_OBJECT_TYPE_DRIVEROBJ)) #define DRIVEROBJ_UnlockObject(pdo) GDIOBJ_UnlockObjByPtr((POBJ)pdo) - -#endif /* !_WIN32K_DRIVEROBJ_H */ diff --git a/reactos/subsystems/win32/win32k/include/eng.h b/reactos/subsystems/win32/win32k/include/eng.h index 45d61e98995..82e24631c79 100644 --- a/reactos/subsystems/win32/win32k/include/eng.h +++ b/reactos/subsystems/win32/win32k/include/eng.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_ENG_H -#define _WIN32K_ENG_H +#pragma once BOOL APIENTRY EngIntersectRect (PRECTL prcDst, PRECTL prcSrc1, PRECTL prcSrc2); VOID FASTCALL EngDeleteXlate (XLATEOBJ *XlateObj); @@ -22,5 +21,3 @@ IntEngWindowChanged( VOID FASTCALL IntGdiAcquireSemaphore ( HSEMAPHORE hsem ); VOID FASTCALL IntGdiReleaseSemaphore ( HSEMAPHORE hsem ); ULONGLONG APIENTRY EngGetTickCount(VOID); - -#endif /* _WIN32K_ENG_H */ diff --git a/reactos/subsystems/win32/win32k/include/engevent.h b/reactos/subsystems/win32/win32k/include/engevent.h index 98ffb54c302..a1249f05fe8 100644 --- a/reactos/subsystems/win32/win32k/include/engevent.h +++ b/reactos/subsystems/win32/win32k/include/engevent.h @@ -1,5 +1,4 @@ -#ifndef __WIN32K_ENGEVENT_H -#define __WIN32K_ENGEVENT_H +#pragma once #define ENG_EVENT_USERMAPPED 1 @@ -12,5 +11,3 @@ typedef struct _ENG_EVENT /* Private part */ KEVENT KEvent; } ENG_EVENT, *PENG_EVENT; - -#endif diff --git a/reactos/subsystems/win32/win32k/include/engobjects.h b/reactos/subsystems/win32/win32k/include/engobjects.h index 0da73d561ad..afb09204874 100644 --- a/reactos/subsystems/win32/win32k/include/engobjects.h +++ b/reactos/subsystems/win32/win32k/include/engobjects.h @@ -25,8 +25,8 @@ * REVISION HISTORY: * 21/8/1999: Created */ -#ifndef __ENG_OBJECTS_H -#define __ENG_OBJECTS_H + +#pragma once #include #include @@ -133,6 +133,3 @@ typedef struct _XFORMGDI { we can simply typecast the pointer */ #define ObjToGDI(ClipObj, Type) (Type##GDI *)(ClipObj) #define GDIToObj(ClipGDI, Type) (Type##OBJ *)(ClipGDI) - - -#endif //__ENG_OBJECTS_H diff --git a/reactos/subsystems/win32/win32k/include/error.h b/reactos/subsystems/win32/win32k/include/error.h index 6b923536257..92a1cbf92a8 100644 --- a/reactos/subsystems/win32/win32k/include/error.h +++ b/reactos/subsystems/win32/win32k/include/error.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_ERROR_H -#define _WIN32K_ERROR_H +#pragma once VOID FASTCALL SetLastNtError( @@ -12,6 +11,4 @@ SetLastWin32Error( NTSTATUS FASTCALL GetLastNtError(VOID); -#endif /* _WIN32K_ERROR_H */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/floatobj.h b/reactos/subsystems/win32/win32k/include/floatobj.h index ff9abf03d1f..0699263dad7 100644 --- a/reactos/subsystems/win32/win32k/include/floatobj.h +++ b/reactos/subsystems/win32/win32k/include/floatobj.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_FLOATOBJ_H_ -#define _WIN32K_FLOATOBJ_H_ +#pragma once #if defined(_X86_) @@ -71,5 +70,3 @@ _FLOATOBJ_Equal1(FLOATOBJ *pf) #define FLOATOBJ_Set1(fo) *(fo) = 1; #endif - -#endif /* not _WIN32K_FLOATOBJ_H_ */ diff --git a/reactos/subsystems/win32/win32k/include/focus.h b/reactos/subsystems/win32/win32k/include/focus.h index 03438bb3b16..859d1c75849 100644 --- a/reactos/subsystems/win32/win32k/include/focus.h +++ b/reactos/subsystems/win32/win32k/include/focus.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_FOCUS_H -#define _WIN32K_FOCUS_H +#pragma once /* * These functions take the window handles from current message queue. @@ -23,5 +22,3 @@ BOOL FASTCALL co_IntSetForegroundWindow(PWINDOW_OBJECT Window); HWND FASTCALL co_IntSetActiveWindow(PWINDOW_OBJECT Window); - -#endif /* _WIN32K_FOCUS_H */ diff --git a/reactos/subsystems/win32/win32k/include/gdifloat.h b/reactos/subsystems/win32/win32k/include/gdifloat.h index 2b53b8e7f76..5f789887784 100644 --- a/reactos/subsystems/win32/win32k/include/gdifloat.h +++ b/reactos/subsystems/win32/win32k/include/gdifloat.h @@ -1,6 +1,4 @@ -#ifndef __WIN32K_FLOAT_H -#define __WIN32K_FLOAT_H - +#pragma once #include #include @@ -108,7 +106,3 @@ static __inline void INTERNAL_LPTODP(DC *dc, LPPOINT point) MulDiv((tx), (pdcattr)->szlViewportExt.cx, (pdcattr)->szlWindowExt.cx) #define YLSTODS(pdcattr,ty) \ MulDiv((ty), (pdcattr)->szlViewportExt.cy, (pdcattr)->szlWindowExt.cy) - -#endif - - diff --git a/reactos/subsystems/win32/win32k/include/gdiobj.h b/reactos/subsystems/win32/win32k/include/gdiobj.h index 489e98e9278..50ed2e6163f 100644 --- a/reactos/subsystems/win32/win32k/include/gdiobj.h +++ b/reactos/subsystems/win32/win32k/include/gdiobj.h @@ -3,8 +3,7 @@ * */ -#ifndef __WIN32K_GDIOBJ_H -#define __WIN32K_GDIOBJ_H +#pragma once /* Public GDI Object/Handle definitions */ #include @@ -132,5 +131,3 @@ GDIOBJ_IncrementShareCount(POBJ Object) #endif INT FASTCALL GreGetObjectOwner(HGDIOBJ, GDIOBJTYPE); - -#endif diff --git a/reactos/subsystems/win32/win32k/include/guicheck.h b/reactos/subsystems/win32/win32k/include/guicheck.h index 3cdcd7b7000..5e1c5c9c385 100644 --- a/reactos/subsystems/win32/win32k/include/guicheck.h +++ b/reactos/subsystems/win32/win32k/include/guicheck.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_GUICHECK_H -#define _WIN32K_GUICHECK_H +#pragma once BOOL FASTCALL co_IntGraphicsCheck(BOOL Create); BOOL FASTCALL IntCreatePrimarySurface(VOID); @@ -7,6 +6,4 @@ VOID FASTCALL IntDestroyPrimarySurface(VOID); NTSTATUS FASTCALL InitGuiCheckImpl (VOID); -#endif /* _WIN32K_GUICHECK_H */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/hook.h b/reactos/subsystems/win32/win32k/include/hook.h index cd0e48318fe..d09304b4895 100644 --- a/reactos/subsystems/win32/win32k/include/hook.h +++ b/reactos/subsystems/win32/win32k/include/hook.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_HOOK_H -#define _WIN32K_HOOK_H +#pragma once #define HOOK_THREAD_REFERENCED (0x1) #define NB_HOOKS (WH_MAXHOOK-WH_MINHOOK+1) @@ -40,6 +39,4 @@ PHOOK FASTCALL IntGetHookObject(HHOOK); PHOOK FASTCALL IntGetNextHook(PHOOK Hook); LRESULT FASTCALL UserCallNextHookEx( PHOOK pHook, int Code, WPARAM wParam, LPARAM lParam, BOOL Ansi); -#endif /* _WIN32K_HOOK_H */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/hotkey.h b/reactos/subsystems/win32/win32k/include/hotkey.h index 25c79fc1ec4..1e1c6636c96 100644 --- a/reactos/subsystems/win32/win32k/include/hotkey.h +++ b/reactos/subsystems/win32/win32k/include/hotkey.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_HOTKEY_H -#define _WIN32K_HOTKEY_H +#pragma once #include #include @@ -33,6 +32,4 @@ UnregisterWindowHotKeys(PWINDOW_OBJECT Window); VOID FASTCALL UnregisterThreadHotKeys(struct _ETHREAD *Thread); -#endif /* _WIN32K_HOTKEY_H */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/input.h b/reactos/subsystems/win32/win32k/include/input.h index a47136e0d09..2a00fe20e9e 100644 --- a/reactos/subsystems/win32/win32k/include/input.h +++ b/reactos/subsystems/win32/win32k/include/input.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_INPUT_H -#define _WIN32K_INPUT_H +#pragma once #include @@ -49,5 +48,3 @@ BOOL FASTCALL IntConnectThreadInput(PTHREADINFO,PTHREADINFO*,PUSER_MESSAGE_QUEUE (TRUE) extern PTHREADINFO ptiRawInput; - -#endif /* _WIN32K_INPUT_H */ diff --git a/reactos/subsystems/win32/win32k/include/intddraw.h b/reactos/subsystems/win32/win32k/include/intddraw.h index b64a3a4dde7..934900353c8 100644 --- a/reactos/subsystems/win32/win32k/include/intddraw.h +++ b/reactos/subsystems/win32/win32k/include/intddraw.h @@ -1,5 +1,4 @@ -#ifndef _INT_W32k_DDRAW -#define _INT_W32k_DDRAW +#pragma once #include #include @@ -136,5 +135,3 @@ void dump_halinfo(DD_HALINFO *pHalInfo); DPRINT1("\n");\ if (flag != 0) \ DPRINT1("undoc value in %s flags value %08lx\n",text, (ULONG) dwflag); - -#endif /* _INT_W32k_DDRAW */ diff --git a/reactos/subsystems/win32/win32k/include/inteng.h b/reactos/subsystems/win32/win32k/include/inteng.h index 515c8785b21..dc0bc98a845 100644 --- a/reactos/subsystems/win32/win32k/include/inteng.h +++ b/reactos/subsystems/win32/win32k/include/inteng.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_INTENG_H -#define _WIN32K_INTENG_H +#pragma once typedef ULONG HCLIP; @@ -190,5 +189,3 @@ IntEngCopyBits(SURFOBJ *psoDest, XLATEOBJ *pxlo, RECTL *prclDest, POINTL *ptlSource); - -#endif /* _WIN32K_INTENG_H */ diff --git a/reactos/subsystems/win32/win32k/include/intgdi.h b/reactos/subsystems/win32/win32k/include/intgdi.h index d5e63c9b641..1b7a700c32f 100644 --- a/reactos/subsystems/win32/win32k/include/intgdi.h +++ b/reactos/subsystems/win32/win32k/include/intgdi.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_INTGDI_H -#define _WIN32K_INTGDI_H +#pragma once #include "region.h" @@ -261,6 +260,3 @@ GreStretchBltMask(IN HDC hdcDst, IN HDC hdcMask, IN INT xMask, IN INT yMask); - -#endif /* _WIN32K_INTGDI_H */ - diff --git a/reactos/subsystems/win32/win32k/include/menu.h b/reactos/subsystems/win32/win32k/include/menu.h index a89eb891950..94d7106baa3 100644 --- a/reactos/subsystems/win32/win32k/include/menu.h +++ b/reactos/subsystems/win32/win32k/include/menu.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_MENU_H -#define _WIN32K_MENU_H +#pragma once #define IS_ATOM(x) \ (((ULONG_PTR)(x) > 0x0) && ((ULONG_PTR)(x) < 0x10000)) @@ -24,7 +23,7 @@ typedef struct _MENU_ITEM UNICODE_STRING Text; HBITMAP hbmpItem; RECTL Rect; - UINT XTab; + UINT dxTab; } MENU_ITEM, *PMENU_ITEM; typedef struct _MENU_OBJECT @@ -110,5 +109,3 @@ InitMenuImpl(VOID); NTSTATUS FASTCALL CleanupMenuImpl(VOID); - -#endif /* _WIN32K_MENU_H */ diff --git a/reactos/subsystems/win32/win32k/include/misc.h b/reactos/subsystems/win32/win32k/include/misc.h index 6ec5f26348c..366c44b4b7c 100644 --- a/reactos/subsystems/win32/win32k/include/misc.h +++ b/reactos/subsystems/win32/win32k/include/misc.h @@ -1,5 +1,4 @@ -#ifndef __WIN32K_MISC_H -#define __WIN32K_MISC_H +#pragma once typedef struct INTENG_ENTER_LEAVE_TAG { @@ -47,5 +46,3 @@ RegWriteUserSetting( IN ULONG ulType, OUT PVOID pvData, IN ULONG cbDataSize); - -#endif /* __WIN32K_MISC_H */ diff --git a/reactos/subsystems/win32/win32k/include/mmcopy.h b/reactos/subsystems/win32/win32k/include/mmcopy.h index 862a092865f..ad67bb5f90c 100644 --- a/reactos/subsystems/win32/win32k/include/mmcopy.h +++ b/reactos/subsystems/win32/win32k/include/mmcopy.h @@ -1,5 +1,4 @@ -#ifndef NDK_MMCOPY_H -#define NDK_MMCOPY_H +#pragma once #include @@ -8,5 +7,3 @@ NTSTATUS _MmCopyToCaller( PVOID Target, PVOID Source, UINT Bytes ); #define MmCopyFromCaller(x,y,z) _MmCopyFromCaller((PCHAR)(x),(PCHAR)(y),(UINT)(z)) #define MmCopyToCaller(x,y,z) _MmCopyToCaller((PCHAR)(x),(PCHAR)(y),(UINT)(z)) - -#endif/*NDK_MMCOPY_H*/ diff --git a/reactos/subsystems/win32/win32k/include/monitor.h b/reactos/subsystems/win32/win32k/include/monitor.h index f0337dbba7d..6c4282885ca 100644 --- a/reactos/subsystems/win32/win32k/include/monitor.h +++ b/reactos/subsystems/win32/win32k/include/monitor.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_MONITOR_H -#define _WIN32K_MONITOR_H +#pragma once /* monitor object */ typedef struct _MONITOR @@ -41,6 +40,4 @@ NTSTATUS IntDetachMonitor(PDEVOBJ *pGdiDevice); PMONITOR FASTCALL UserGetMonitorObject(IN HMONITOR); PMONITOR FASTCALL IntGetPrimaryMonitor(VOID); -#endif /* _WIN32K_MONITOR_H */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/mouse.h b/reactos/subsystems/win32/win32k/include/mouse.h index b00903b2203..0e5f68b9626 100644 --- a/reactos/subsystems/win32/win32k/include/mouse.h +++ b/reactos/subsystems/win32/win32k/include/mouse.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_MOUSE_H -#define _WIN32K_MOUSE_H +#pragma once #include @@ -18,5 +17,3 @@ INT INTERNAL_CALL MouseSafetyOnDrawEnd(SURFOBJ *SurfObj); #ifndef MOUSEEVENTF_XUP #define MOUSEEVENTF_XUP (0x100) #endif - -#endif /* _WIN32K_MOUSE_H */ diff --git a/reactos/subsystems/win32/win32k/include/msgqueue.h b/reactos/subsystems/win32/win32k/include/msgqueue.h index 5094b7f1d67..5752481c9d4 100644 --- a/reactos/subsystems/win32/win32k/include/msgqueue.h +++ b/reactos/subsystems/win32/win32k/include/msgqueue.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_MSGQUEUE_H -#define _WIN32K_MSGQUEUE_H +#pragma once #include "hook.h" @@ -279,6 +278,4 @@ MsqCalculateMessageTime(IN PLARGE_INTEGER TickCount) return (LONG)(TickCount->QuadPart * (KeQueryTimeIncrement() / 10000)); } -#endif /* _WIN32K_MSGQUEUE_H */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/ntuser.h b/reactos/subsystems/win32/win32k/include/ntuser.h index d64e246056b..58a911d6f82 100644 --- a/reactos/subsystems/win32/win32k/include/ntuser.h +++ b/reactos/subsystems/win32/win32k/include/ntuser.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_NTUSER_H -#define _WIN32K_NTUSER_H +#pragma once #define DECLARE_RETURN(type) type _ret_ #define RETURN(value) { _ret_ = value; goto _cleanup_; } @@ -20,7 +19,4 @@ VOID FASTCALL UserLeave(VOID); BOOL FASTCALL UserIsEntered(VOID); BOOL FASTCALL UserIsEnteredExclusive(VOID); - -#endif /* _WIN32K_NTUSER_H */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/object.h b/reactos/subsystems/win32/win32k/include/object.h index 0ff67ce0c25..437611aa09d 100644 --- a/reactos/subsystems/win32/win32k/include/object.h +++ b/reactos/subsystems/win32/win32k/include/object.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_OBJECT_H -#define _WIN32K_OBJECT_H +#pragma once #include "gdiobj.h" #include "bitmaps.h" @@ -145,6 +144,4 @@ VOID FASTCALL CreateSysColorObjects (VOID); PPOINT FASTCALL GDI_Bezier (const POINT *Points, INT count, PINT nPtsOut); -#endif /* _WIN32K_OBJECT_H */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/paint.h b/reactos/subsystems/win32/win32k/include/paint.h index c45c83eb2a2..698321c2b75 100644 --- a/reactos/subsystems/win32/win32k/include/paint.h +++ b/reactos/subsystems/win32/win32k/include/paint.h @@ -1,9 +1,6 @@ -#ifndef _WIN32K_PAINT_H -#define _WIN32K_PAINT_H +#pragma once BOOL APIENTRY FillSolid (SURFOBJ* Surface, RECTL* Dimensions, ULONG iColor); BOOL APIENTRY FillPolygon ( DC* dc, SURFACE* pSurface, BRUSHOBJ* BrushObj, MIX RopMode, CONST PPOINT Points, INT Count, RECTL BoundRect ); BOOL FASTCALL IntFillPolygon(PDC dc, SURFACE *psurf, BRUSHOBJ *BrushObj, CONST PPOINT Points, int Count, RECTL DestRect, POINTL *BrushOrigin); - -#endif /* _WIN32K_PAINT_H */ diff --git a/reactos/subsystems/win32/win32k/include/painting.h b/reactos/subsystems/win32/win32k/include/painting.h index d75d24ebc34..ed7bea47f64 100644 --- a/reactos/subsystems/win32/win32k/include/painting.h +++ b/reactos/subsystems/win32/win32k/include/painting.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_PAINTING_H -#define _WIN32K_PAINTING_H +#pragma once #include #include @@ -14,5 +13,3 @@ IntGetPaintMessage(PWINDOW_OBJECT Window, UINT MsgFilterMin, UINT MsgFilterMax, MSG *Message, BOOL Remove); INT FASTCALL UserRealizePalette(HDC); INT FASTCALL co_UserGetUpdateRgn(PWINDOW_OBJECT, HRGN, BOOL); - -#endif /* _WIN32K_PAINTING_H */ diff --git a/reactos/subsystems/win32/win32k/include/palette.h b/reactos/subsystems/win32/win32k/include/palette.h index 102654573fe..43f59e6efca 100644 --- a/reactos/subsystems/win32/win32k/include/palette.h +++ b/reactos/subsystems/win32/win32k/include/palette.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_PALETTE_H -#define _WIN32K_PALETTE_H +#pragma once #include @@ -113,5 +112,3 @@ PALETTE_ulGetRGBColorFromIndex(PPALETTE ppal, ULONG ulIndex) ppal->IndexedColors[ulIndex].peGreen, ppal->IndexedColors[ulIndex].peBlue); } - -#endif /* not _WIN32K_PALETTE_H */ diff --git a/reactos/subsystems/win32/win32k/include/path.h b/reactos/subsystems/win32/win32k/include/path.h index 1aae479b282..b8c17786fa9 100644 --- a/reactos/subsystems/win32/win32k/include/path.h +++ b/reactos/subsystems/win32/win32k/include/path.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_PATH_H -#define _WIN32K_PATH_H +#pragma once /* DCPATH flPath */ #define DCPATH_ACTIVE 0x0001 @@ -71,5 +70,3 @@ BOOL FASTCALL PATH_ExtTextOut(PDC dc,INT x,INT y,UINT flags,const RECTL *lprc,LP VOID FASTCALL IntGdiCloseFigure(PPATH pPath); BOOL FASTCALL PATH_Delete(HPATH hPath); - -#endif /* _WIN32K_PATH_H */ diff --git a/reactos/subsystems/win32/win32k/include/pdevobj.h b/reactos/subsystems/win32/win32k/include/pdevobj.h index 94b3d56405b..4124509fbe5 100644 --- a/reactos/subsystems/win32/win32k/include/pdevobj.h +++ b/reactos/subsystems/win32/win32k/include/pdevobj.h @@ -1,5 +1,4 @@ -#ifndef __WIN32K_PDEVOBJ_H -#define __WIN32K_PDEVOBJ_H +#pragma once #include @@ -143,5 +142,3 @@ typedef struct _PDEVEDD } PDEVEDD, *PPDEVEDD; extern ULONG gdwDirectDrawContext; - -#endif /* !__WIN32K_PDEVOBJ_H */ diff --git a/reactos/subsystems/win32/win32k/include/pen.h b/reactos/subsystems/win32/win32k/include/pen.h index b6d85c5ba02..7ca623dab54 100644 --- a/reactos/subsystems/win32/win32k/include/pen.h +++ b/reactos/subsystems/win32/win32k/include/pen.h @@ -1,5 +1,4 @@ -#ifndef __WIN32K_PEN_H -#define __WIN32K_PEN_H +#pragma once #include "gdiobj.h" #include "brush.h" @@ -31,5 +30,3 @@ PBRUSH FASTCALL PEN_LockPen(HGDIOBJ); PBRUSH FASTCALL PEN_ShareLockPen(HGDIOBJ); INT APIENTRY PEN_GetObject(PBRUSH pPen, INT Count, PLOGPEN Buffer); - -#endif diff --git a/reactos/subsystems/win32/win32k/include/prop.h b/reactos/subsystems/win32/win32k/include/prop.h index 2d33df9971d..4eb86525f95 100644 --- a/reactos/subsystems/win32/win32k/include/prop.h +++ b/reactos/subsystems/win32/win32k/include/prop.h @@ -1,9 +1,5 @@ -#ifndef _WIN32K_PROP_H -#define _WIN32K_PROP_H +#pragma once PPROPERTY FASTCALL IntGetProp(PWINDOW_OBJECT,ATOM); BOOL FASTCALL IntRemoveProp(PWINDOW_OBJECT,ATOM); BOOL FASTCALL IntSetProp(PWINDOW_OBJECT, ATOM, HANDLE); - -#endif /* _WIN32K_PROP_H */ - diff --git a/reactos/subsystems/win32/win32k/include/rect.h b/reactos/subsystems/win32/win32k/include/rect.h index a0687243ab4..156dd55f120 100644 --- a/reactos/subsystems/win32/win32k/include/rect.h +++ b/reactos/subsystems/win32/win32k/include/rect.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_RECT_H -#define _WIN32K_RECT_H +#pragma once VOID FORCEINLINE @@ -57,6 +56,3 @@ RECTL_bIntersectRect(RECTL *prclDst, const RECTL *prcl1, const RECTL *prcl2); VOID FASTCALL RECTL_vMakeWellOrdered(RECTL *prcl); - - -#endif /* _WIN32K_RECT_H */ diff --git a/reactos/subsystems/win32/win32k/include/region.h b/reactos/subsystems/win32/win32k/include/region.h index a7583fbf36b..d29b1b04fdf 100644 --- a/reactos/subsystems/win32/win32k/include/region.h +++ b/reactos/subsystems/win32/win32k/include/region.h @@ -1,6 +1,4 @@ - -#ifndef __WIN32K_REGION_H -#define __WIN32K_REGION_H +#pragma once #include "gdiobj.h" @@ -59,5 +57,3 @@ PROSRGNDATA FASTCALL IntSysCreateRectpRgn(INT,INT,INT,INT); #define IntSysCreateRectpRgnIndirect(prc) \ IntSysCreateRectpRgn((prc)->left, (prc)->top, (prc)->right, (prc)->bottom) - -#endif /* not __WIN32K_REGION_H */ diff --git a/reactos/subsystems/win32/win32k/include/scroll.h b/reactos/subsystems/win32/win32k/include/scroll.h index 0fe21aef798..171a4eb8389 100644 --- a/reactos/subsystems/win32/win32k/include/scroll.h +++ b/reactos/subsystems/win32/win32k/include/scroll.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_SCROLL_H -#define _WIN32K_SCROLL_H +#pragma once typedef struct tagSBCALC { @@ -62,5 +61,3 @@ typedef struct _SBINFOEX BOOL FASTCALL co_IntCreateScrollBars(PWINDOW_OBJECT Window); BOOL FASTCALL IntDestroyScrollBars(PWINDOW_OBJECT Window); - -#endif /* _WIN32K_SCROLL_H */ diff --git a/reactos/subsystems/win32/win32k/include/surface.h b/reactos/subsystems/win32/win32k/include/surface.h index f9a407aec1c..57a5ec24f85 100644 --- a/reactos/subsystems/win32/win32k/include/surface.h +++ b/reactos/subsystems/win32/win32k/include/surface.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_SURFACE_H -#define _WIN32K_SURFACE_H +#pragma once #include "win32.h" #include "gdiobj.h" @@ -75,5 +74,3 @@ void INTERNAL_CALL SURFACE_CleanupBitsLock(SURFACE *pBMObj); INT FASTCALL BitsPerFormat (ULONG Format); ULONG FASTCALL BitmapFormat (WORD Bits, DWORD Compression); - -#endif /* _WIN32K_SURFACE_H */ diff --git a/reactos/subsystems/win32/win32k/include/sysparams.h b/reactos/subsystems/win32/win32k/include/sysparams.h index 6bc826f2887..2c51a40301a 100644 --- a/reactos/subsystems/win32/win32k/include/sysparams.h +++ b/reactos/subsystems/win32/win32k/include/sysparams.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_SYSPARAMS_H -#define _WIN32K_SYSPARAMS_H +#pragma once #include "cursoricon.h" @@ -178,5 +177,3 @@ typedef union _SPIBUFFER } SPIBUFFER; extern SPIVALUES gspv; - -#endif /* _WIN32K_SYSPARAMS_H */ diff --git a/reactos/subsystems/win32/win32k/include/tags.h b/reactos/subsystems/win32/win32k/include/tags.h index c460b2f42fc..64e8de62874 100644 --- a/reactos/subsystems/win32/win32k/include/tags.h +++ b/reactos/subsystems/win32/win32k/include/tags.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_TAGS_H -#define _WIN32K_TAGS_H +#pragma once #define TAG_STRING ' RTS' /* string */ #define TAG_RTLREGISTRY 'vrqR' /* RTL registry */ @@ -344,5 +343,3 @@ #define USERTAG_WOWTDB 'owsU' #define USERTAG_WOWPROCESSINFO 'pwsU' #define USERTAG_WOWTHREADINFO 'twsU' - -#endif /* _WIN32K_TAGS_H */ diff --git a/reactos/subsystems/win32/win32k/include/text.h b/reactos/subsystems/win32/win32k/include/text.h index 6ee10f39e6a..8c764848233 100644 --- a/reactos/subsystems/win32/win32k/include/text.h +++ b/reactos/subsystems/win32/win32k/include/text.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_TEXT_H -#define _WIN32K_TEXT_H +#pragma once #include @@ -129,5 +128,3 @@ BOOL FASTCALL GreGetTextExtentExW(HDC,LPWSTR,ULONG,ULONG,PULONG,PULONG,LPSIZE,FL #define IntUnLockFreeType \ ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(&FreeTypeLock) - -#endif /* _WIN32K_TEXT_H */ diff --git a/reactos/subsystems/win32/win32k/include/timer.h b/reactos/subsystems/win32/win32k/include/timer.h index a10cf6cb76f..73b2c36afae 100644 --- a/reactos/subsystems/win32/win32k/include/timer.h +++ b/reactos/subsystems/win32/win32k/include/timer.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_TIMER_H -#define _WIN32K_TIMER_H +#pragma once typedef struct _TIMER { @@ -37,5 +36,3 @@ UINT_PTR FASTCALL SetSystemTimer(PWINDOW_OBJECT,UINT_PTR,UINT,TIMERPROC); BOOL FASTCALL PostTimerMessages(PWINDOW_OBJECT); VOID FASTCALL ProcessTimers(VOID); VOID FASTCALL StartTheTimers(VOID); - -#endif /* _WIN32K_TIMER_H */ diff --git a/reactos/subsystems/win32/win32k/include/useratom.h b/reactos/subsystems/win32/win32k/include/useratom.h index 4abd0a874af..ada1e3fb2a3 100644 --- a/reactos/subsystems/win32/win32k/include/useratom.h +++ b/reactos/subsystems/win32/win32k/include/useratom.h @@ -1,10 +1,7 @@ -#ifndef _WIN32K_USERATOM_H -#define _WIN32K_USERATOM_H +#pragma once RTL_ATOM FASTCALL IntAddAtom(LPWSTR AtomName); ULONG FASTCALL IntGetAtomName(RTL_ATOM nAtom, LPWSTR lpBuffer, ULONG nSize); RTL_ATOM FASTCALL IntAddGlobalAtom(LPWSTR,BOOL); - -#endif /* _WIN32K_USERATOM_H */ diff --git a/reactos/subsystems/win32/win32k/include/userfuncs.h b/reactos/subsystems/win32/win32k/include/userfuncs.h index 5eed41eb8e0..7ad47e625bc 100644 --- a/reactos/subsystems/win32/win32k/include/userfuncs.h +++ b/reactos/subsystems/win32/win32k/include/userfuncs.h @@ -1,9 +1,4 @@ -#ifndef _WIN32K_USERFUNCS_H -#define _WIN32K_USERFUNCS_H - - - - +#pragma once PMENU_OBJECT FASTCALL UserGetMenuObject(HMENU hMenu); @@ -159,7 +154,4 @@ BOOL FASTCALL UserDestroyMenu(HMENU hMenu); DWORD FASTCALL co_UserShowScrollBar(PWINDOW_OBJECT Window, int wBar, DWORD bShow); - -#endif /* _WIN32K_USERFUNCS_H */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/vis.h b/reactos/subsystems/win32/win32k/include/vis.h index 50253f36dec..5fd4a5fb82b 100644 --- a/reactos/subsystems/win32/win32k/include/vis.h +++ b/reactos/subsystems/win32/win32k/include/vis.h @@ -8,8 +8,7 @@ * */ -#ifndef _WIN32K_VIS_H -#define _WIN32K_VIS_H +#pragma once #include @@ -20,7 +19,4 @@ VIS_ComputeVisibleRegion(PWINDOW_OBJECT Window, BOOLEAN ClientArea, VOID FASTCALL co_VIS_WindowLayoutChanged(PWINDOW_OBJECT Window, HRGN UncoveredRgn); -#endif /* ! defined(_WIN32K_VIS_H) */ - /* EOF */ - diff --git a/reactos/subsystems/win32/win32k/include/win32.h b/reactos/subsystems/win32/win32k/include/win32.h index ad7938389a1..5de6139e1d3 100644 --- a/reactos/subsystems/win32/win32k/include/win32.h +++ b/reactos/subsystems/win32/win32k/include/win32.h @@ -1,5 +1,4 @@ -#ifndef __INCLUDE_NAPI_WIN32_H -#define __INCLUDE_NAPI_WIN32_H +#pragma once /* W32PROCESS flags */ #define W32PF_CONSOLEAPPLICATION 0x00000001 @@ -174,5 +173,3 @@ typedef struct _PROCESSINFO struct _KBL* KeyboardLayout; // THREADINFO only W32HEAP_USER_MAPPING HeapMappings; } PROCESSINFO; - -#endif /* __INCLUDE_NAPI_WIN32_H */ diff --git a/reactos/subsystems/win32/win32k/include/win32k.h b/reactos/subsystems/win32/win32k/include/win32k.h index 4cd9e7b5720..ea3bd61497a 100644 --- a/reactos/subsystems/win32/win32k/include/win32k.h +++ b/reactos/subsystems/win32/win32k/include/win32k.h @@ -7,8 +7,8 @@ */ /* INCLUDES ******************************************************************/ -#ifndef __WIN32K_H -#define __WIN32K_H + +#pragma once #define INTERNAL_CALL APIENTRY /* Internal Win32k Headers */ @@ -79,5 +79,3 @@ #include #include #include - -#endif /* __WIN32K_H */ diff --git a/reactos/subsystems/win32/win32k/include/window.h b/reactos/subsystems/win32/win32k/include/window.h index 82c9e512f48..16098e456b1 100644 --- a/reactos/subsystems/win32/win32k/include/window.h +++ b/reactos/subsystems/win32/win32k/include/window.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_WINDOW_H -#define _WIN32K_WINDOW_H +#pragma once struct _PROPERTY; struct _WINDOW_OBJECT; @@ -159,6 +158,4 @@ VOID FASTCALL IntNotifyWinEvent(DWORD, PWND, LONG, LONG); PWND APIENTRY co_IntCreateWindowEx(DWORD,PUNICODE_STRING,PUNICODE_STRING,DWORD,LONG,LONG,LONG,LONG,HWND,HMENU,HINSTANCE,LPVOID,DWORD,BOOL); WNDPROC FASTCALL IntGetWindowProc(PWND,BOOL); -#endif /* _WIN32K_WINDOW_H */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/winpos.h b/reactos/subsystems/win32/win32k/include/winpos.h index 513d4d5a035..47f6b389cec 100644 --- a/reactos/subsystems/win32/win32k/include/winpos.h +++ b/reactos/subsystems/win32/win32k/include/winpos.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_WINPOS_H -#define _WIN32K_WINPOS_H +#pragma once /* Undocumented flags. */ #define SWP_NOCLIENTMOVE 0x0800 @@ -37,5 +36,3 @@ VOID FASTCALL co_WinPosActivateOtherWindow(PWINDOW_OBJECT Window); VOID FASTCALL WinPosInitInternalPos(PWINDOW_OBJECT WindowObject, POINT *pt, RECTL *RestoreRect); - -#endif /* _WIN32K_WINPOS_H */ diff --git a/reactos/subsystems/win32/win32k/include/winsta.h b/reactos/subsystems/win32/win32k/include/winsta.h index dfbe717530d..da944af3a46 100644 --- a/reactos/subsystems/win32/win32k/include/winsta.h +++ b/reactos/subsystems/win32/win32k/include/winsta.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_WINSTA_H -#define _WIN32K_WINSTA_H +#pragma once #include "window.h" #include "clipboard.h" @@ -104,6 +103,4 @@ IntGetFullWindowStationName( PWINSTATION_OBJECT FASTCALL IntGetWinStaObj(VOID); -#endif /* _WIN32K_WINSTA_H */ - /* EOF */ diff --git a/reactos/subsystems/win32/win32k/include/xformobj.h b/reactos/subsystems/win32/win32k/include/xformobj.h index 5daf643a69d..d9f05f7214e 100644 --- a/reactos/subsystems/win32/win32k/include/xformobj.h +++ b/reactos/subsystems/win32/win32k/include/xformobj.h @@ -1,5 +1,4 @@ -#ifndef _WIN32K_XFORMOBJ_H_ -#define _WIN32K_XFORMOBJ_H_ +#pragma once ULONG INTERNAL_CALL @@ -27,5 +26,3 @@ INTERNAL_CALL XFORMOBJ_Inverse( OUT XFORMOBJ *pxoDst, IN XFORMOBJ *pxoSrc); - -#endif /* not _WIN32K_XFORMOBJ_H_ */ diff --git a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c index 995897a8204..6c9532caae9 100644 --- a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c @@ -238,7 +238,7 @@ BOOL UserSetCursorPos( INT x, INT y) * User32 macro NtUserShowCursor */ int UserShowCursor(BOOL bShow) { - PSYSTEM_CURSORINFO CurInfo = IntGetSysCursorInfo();; + PSYSTEM_CURSORINFO CurInfo = IntGetSysCursorInfo(); HDC hdcScreen; if (!(hdcScreen = IntGetScreenDC())) diff --git a/reactos/subsystems/win32/win32k/ntuser/menu.c b/reactos/subsystems/win32/win32k/ntuser/menu.c index f030481a636..9bdbe026cf8 100644 --- a/reactos/subsystems/win32/win32k/ntuser/menu.c +++ b/reactos/subsystems/win32/win32k/ntuser/menu.c @@ -690,8 +690,8 @@ IntGetMenuItemInfo(PMENU_OBJECT Menu, /* UNUSED PARAM!! */ if (sizeof(ROSMENUITEMINFO) == lpmii->cbSize) { lpmii->Rect = MenuItem->Rect; - lpmii->XTab = MenuItem->XTab; - lpmii->Text = MenuItem->Text.Buffer; + lpmii->dxTab = MenuItem->dxTab; + lpmii->lpstr = MenuItem->Text.Buffer; // Use DesktopHeap! } return TRUE; @@ -842,8 +842,8 @@ IntSetMenuItemInfo(PMENU_OBJECT MenuObject, PMENU_ITEM MenuItem, PROSMENUITEMINF if (sizeof(ROSMENUITEMINFO) == lpmii->cbSize) { MenuItem->Rect = lpmii->Rect; - MenuItem->XTab = lpmii->XTab; - lpmii->Text = MenuItem->Text.Buffer; /* Send back new allocated string or zero */ + MenuItem->dxTab = lpmii->dxTab; + lpmii->lpstr = MenuItem->Text.Buffer; /* Use DesktopHeap! Send back new allocated string or zero */ } return TRUE; @@ -1002,8 +1002,8 @@ IntBuildMenuItemList(PMENU_OBJECT MenuObject, PVOID Buffer, ULONG nMax) mii.hbmpUnchecked = CurItem->hbmpUnchecked; mii.hSubMenu = CurItem->hSubMenu; mii.Rect = CurItem->Rect; - mii.XTab = CurItem->XTab; - mii.Text = CurItem->Text.Buffer; + mii.dxTab = CurItem->dxTab; + mii.lpstr = CurItem->Text.Buffer; // Use DesktopHeap! Status = MmCopyToCaller(Buf, &mii, sizeof(ROSMENUITEMINFO)); if (! NT_SUCCESS(Status)) diff --git a/reactos/subsystems/win32/win32k/ntuser/message.c b/reactos/subsystems/win32/win32k/ntuser/message.c index f3fc3bb00fc..1b244b0e038 100644 --- a/reactos/subsystems/win32/win32k/ntuser/message.c +++ b/reactos/subsystems/win32/win32k/ntuser/message.c @@ -1053,9 +1053,11 @@ co_IntWaitMessage( PWINDOW_OBJECT Window, while ( (STATUS_WAIT_0 <= Status && Status <= STATUS_WAIT_63) || STATUS_TIMEOUT == Status ); - SetLastNtError(Status); - - DPRINT1("Exit co_IntWaitMessage on error!\n"); + if (!NT_SUCCESS(Status)) + { + SetLastNtError(Status); + DPRINT1("Exit co_IntWaitMessage on error!\n"); + } return FALSE; } @@ -2626,7 +2628,7 @@ NtUserWaitForInputIdle( WaitExit: if (W32Process->InputIdleEvent) { - EngDeleteEvent((PEVENT)W32Process->InputIdleEvent); + EngFreeMem((PVOID)W32Process->InputIdleEvent); W32Process->InputIdleEvent = NULL; } ObDereferenceObject(Process); diff --git a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c index ec680a871c9..f9104fe5faa 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntstubs.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntstubs.c @@ -1029,16 +1029,28 @@ NtUserSetInformationProcess( return 0; } -DWORD +NTSTATUS APIENTRY -NtUserSetInformationThread( - DWORD dwUnknown1, - DWORD dwUnknown2, - DWORD dwUnknown3, - DWORD dwUnknown4) +NtUserSetInformationThread(IN HANDLE ThreadHandle, + IN USERTHREADINFOCLASS ThreadInformationClass, + IN PVOID ThreadInformation, + IN ULONG ThreadInformationLength) + { - UNIMPLEMENTED; - return 0; + if (ThreadInformationClass == UserThreadInitiateShutdown) + { + DPRINT1("Shutdown initiated\n"); + } + else if (ThreadInformationClass == UserThreadEndShutdown) + { + DPRINT1("Shutdown ended\n"); + } + else + { + UNIMPLEMENTED; + } + + return STATUS_SUCCESS; } DWORD diff --git a/reactos/subsystems/win32/win32k/ntuser/painting.c b/reactos/subsystems/win32/win32k/ntuser/painting.c index 86ed104c2e3..66977db106f 100644 --- a/reactos/subsystems/win32/win32k/ntuser/painting.c +++ b/reactos/subsystems/win32/win32k/ntuser/painting.c @@ -502,7 +502,10 @@ IntIsWindowDrawable(PWINDOW_OBJECT Window) for (WndObject = Window; WndObject != NULL; WndObject = WndObject->spwndParent) { Wnd = WndObject->Wnd; - if (!(Wnd->style & WS_VISIBLE) || + if ( Window->state & WINDOWSTATUS_DESTROYING || // state2 + Window->state & WINDOWSTATUS_DESTROYED || + !Wnd || + !(Wnd->style & WS_VISIBLE) || ((Wnd->style & WS_MINIMIZE) && (WndObject != Window))) { return FALSE; diff --git a/reactos/subsystems/win32/win32k/ntuser/simplecall.c b/reactos/subsystems/win32/win32k/ntuser/simplecall.c index 3522cd15e95..f0dcc3a755b 100644 --- a/reactos/subsystems/win32/win32k/ntuser/simplecall.c +++ b/reactos/subsystems/win32/win32k/ntuser/simplecall.c @@ -490,28 +490,17 @@ NtUserCallHwndLock( case HWNDLOCK_ROUTINE_DRAWMENUBAR: { - PMENU_OBJECT Menu; DPRINT("HWNDLOCK_ROUTINE_DRAWMENUBAR\n"); - Ret = FALSE; - if (!((Wnd->style & (WS_CHILD | WS_POPUP)) != WS_CHILD)) - break; - - if(!(Menu = UserGetMenuObject((HMENU)(DWORD_PTR) Wnd->IDMenu))) - break; - - Menu->MenuInfo.WndOwner = hWnd; - Menu->MenuInfo.Height = 0; - - co_WinPosSetWindowPos( Window, - HWND_DESKTOP, - 0,0,0,0, - SWP_NOSIZE| - SWP_NOMOVE| - SWP_NOZORDER| - SWP_NOACTIVATE| - SWP_FRAMECHANGED ); - Ret = TRUE; + if ((Wnd->style & (WS_CHILD | WS_POPUP)) != WS_CHILD) + co_WinPosSetWindowPos( Window, + HWND_DESKTOP, + 0,0,0,0, + SWP_NOSIZE| + SWP_NOMOVE| + SWP_NOZORDER| + SWP_NOACTIVATE| + SWP_FRAMECHANGED ); break; } diff --git a/reactos/subsystems/win32/win32k/ntuser/vis.c b/reactos/subsystems/win32/win32k/ntuser/vis.c index 04d2b238b53..f82ed555b72 100644 --- a/reactos/subsystems/win32/win32k/ntuser/vis.c +++ b/reactos/subsystems/win32/win32k/ntuser/vis.c @@ -92,7 +92,9 @@ VIS_ComputeVisibleRegion( (PreviousWnd == Wnd && ClipSiblings)) { CurrentSibling = CurrentWindow->spwndChild; - while (CurrentSibling != NULL && CurrentSibling != PreviousWindow) + while ( CurrentSibling != NULL && + CurrentSibling != PreviousWindow && + CurrentSibling->Wnd ) { CurrentSiblingWnd = CurrentSibling->Wnd; if ((CurrentSiblingWnd->style & WS_VISIBLE) && @@ -121,7 +123,7 @@ VIS_ComputeVisibleRegion( if (ClipChildren) { CurrentWindow = Window->spwndChild; - while (CurrentWindow) + while (CurrentWindow && CurrentWindow->Wnd) { CurrentWnd = CurrentWindow->Wnd; if ((CurrentWnd->style & WS_VISIBLE) && diff --git a/reactos/subsystems/win32/win32k/ntuser/windc.c b/reactos/subsystems/win32/win32k/ntuser/windc.c index 38ac3b486d1..0b5386597f9 100644 --- a/reactos/subsystems/win32/win32k/ntuser/windc.c +++ b/reactos/subsystems/win32/win32k/ntuser/windc.c @@ -181,7 +181,7 @@ DceDeleteClipRgn(DCE* Dce) } else if (Dce->hrgnClip != NULL) { - REGION_FreeRgnByHandle(Dce->hrgnClip); + GDIOBJ_FreeObjByHandle(Dce->hrgnClip, GDI_OBJECT_TYPE_REGION|GDI_OBJECT_TYPE_SILENT); } Dce->hrgnClip = NULL; @@ -193,7 +193,7 @@ DceDeleteClipRgn(DCE* Dce) static INT FASTCALL DceReleaseDC(DCE* dce, BOOL EndPaint) { - if (DCX_DCEBUSY != (dce->DCXFlags & (DCX_DCEEMPTY | DCX_DCEBUSY))) + if (DCX_DCEBUSY != (dce->DCXFlags & (DCX_INDESTROY | DCX_DCEEMPTY | DCX_DCEBUSY))) { return 0; } @@ -573,6 +573,12 @@ UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags) } else if (ClipRegion != NULL) { + if (Dce->hrgnClip != NULL) + { + DPRINT1("Should not be called!!\n"); + GDIOBJ_FreeObjByHandle(Dce->hrgnClip, GDI_OBJECT_TYPE_REGION|GDI_OBJECT_TYPE_SILENT); + Dce->hrgnClip = NULL; + } Dce->hrgnClip = ClipRegion; } @@ -621,6 +627,8 @@ DceFreeDCE(PDCE pdce, BOOLEAN Force) pLE = pdce->List.Flink; ret = CONTAINING_RECORD(pLE, DCE, List); + pdce->DCXFlags |= DCX_INDESTROY; + if (Force && !GDIOBJ_OwnedByCurrentProcess(pdce->hDC)) { DPRINT("Change ownership for DCE! -> %x\n" , pdce); @@ -638,9 +646,9 @@ DceFreeDCE(PDCE pdce, BOOLEAN Force) if (!Hit) IntGdiDeleteDC(pdce->hDC, TRUE); - if (pdce->hrgnClip && ! (pdce->DCXFlags & DCX_KEEPCLIPRGN)) + if (pdce->hrgnClip && !(pdce->DCXFlags & DCX_KEEPCLIPRGN)) { - REGION_FreeRgnByHandle(pdce->hrgnClip); + GDIOBJ_FreeObjByHandle(pdce->hrgnClip, GDI_OBJECT_TYPE_REGION|GDI_OBJECT_TYPE_SILENT); pdce->hrgnClip = NULL; } @@ -673,7 +681,7 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) if (DCECount <= 0) { - DPRINT1("No Entry!\n"); + DPRINT1("FreeWindowDCE No Entry! %d\n",DCECount); return; } @@ -681,8 +689,16 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) pDCE = CONTAINING_RECORD(pLE, DCE, List); do { - if (!pDCE) break; - if (IsListEmpty(&pDCE->List)) break; + if (!pDCE) + { + DPRINT1("FreeWindowDCE No DCE Pointer!\n"); + break; + } + if (IsListEmpty(&pDCE->List)) + { + DPRINT1("FreeWindowDCE List is Empty!!!!\n"); + break; + } if ( pDCE->hwndCurrent == Window->hSelf && !(pDCE->DCXFlags & DCX_DCEEMPTY) ) { @@ -700,7 +716,10 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) DPRINT("POWNED DCE going Cheap!! DCX_CACHE!! hDC-> %x \n", pDCE->hDC); if (!IntGdiSetDCOwnerEx( pDCE->hDC, GDI_OBJ_HMGR_NONE, FALSE)) - return; + { + DPRINT1("Fail Owner Switch hDC-> %x \n", pDCE->hDC); + break; + } /* Do not change owner so thread can clean up! */ } else if (Window->Wnd->pcls->style & CS_OWNDC) /* owned DCE*/ @@ -711,6 +730,7 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) } else { + DPRINT1("Not POWNED or CLASSDC hwndCurrent -> %x \n", pDCE->hwndCurrent); ASSERT(FALSE); } } @@ -825,7 +845,7 @@ DceResetActiveDCEs(PWINDOW_OBJECT Window) { if(!pDCE) break; if(pLE == &LEDce) break; - if (0 == (pDCE->DCXFlags & DCX_DCEEMPTY)) + if (0 == (pDCE->DCXFlags & (DCX_DCEEMPTY|DCX_INDESTROY))) { if (Window->hSelf == pDCE->hwndCurrent) { @@ -902,9 +922,12 @@ IntWindowFromDC(HDC hDc) Dce = CONTAINING_RECORD(pLE, DCE, List); do { - if(Dce->hDC == hDc) + if (Dce->hDC == hDc) { - Ret = Dce->hwndCurrent; + if (Dce->DCXFlags & DCX_INDESTROY) + Ret = NULL; + else + Ret = Dce->hwndCurrent; break; } pLE = Dce->List.Flink; diff --git a/reactos/subsystems/win32/win32k/ntuser/window.c b/reactos/subsystems/win32/win32k/ntuser/window.c index 299138710b7..4445fff8fed 100644 --- a/reactos/subsystems/win32/win32k/ntuser/window.c +++ b/reactos/subsystems/win32/win32k/ntuser/window.c @@ -2057,9 +2057,7 @@ AllocErr: } else if ( Wnd->pcls->style & CS_OWNDC) { /* Allocate a DCE for this window. */ - PDCE pDce = DceAllocDCE(Window, DCE_WINDOW_DC); - if (!Wnd->pcls->pdce) - Wnd->pcls->pdce = pDce; + DceAllocDCE(Window, DCE_WINDOW_DC); } Pos.x = x; diff --git a/reactos/subsystems/win32/win32k/objects/cliprgn.c b/reactos/subsystems/win32/win32k/objects/cliprgn.c index 9b7416c6dea..acfc99b9a3f 100644 --- a/reactos/subsystems/win32/win32k/objects/cliprgn.c +++ b/reactos/subsystems/win32/win32k/objects/cliprgn.c @@ -202,6 +202,7 @@ GdiGetClipBox(HDC hDC, PRECTL rc) return ERROR; } + /* FIXME! Rao and Vis only! */ if (dc->prgnAPI) // APIRGN { hRgn = ((PROSRGNDATA)dc->prgnAPI)->BaseObject.hHmgr; diff --git a/reactos/subsystems/win32/win32k/objects/device.c b/reactos/subsystems/win32/win32k/objects/device.c index 6dfe195ec0c..40a79562ede 100644 --- a/reactos/subsystems/win32/win32k/objects/device.c +++ b/reactos/subsystems/win32/win32k/objects/device.c @@ -59,12 +59,37 @@ GetRegistryPath(PUNICODE_STRING RegistryPath, ULONG DisplayNumber) return TRUE; } + +NTSTATUS +NTAPI +EnumDisplayQueryRoutine(IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext) +{ + if ((Context == NULL) && ((ValueType == REG_SZ) || (ValueType == REG_MULTI_SZ))) + { + *(PULONG)EntryContext = ValueLength; + } + else + { + DPRINT1("Value data: %S %d\n", ValueData, ValueLength); + RtlCopyMemory(Context, ValueData, ValueLength); + } + + return STATUS_SUCCESS; +} + static BOOL FASTCALL FindDriverFileNames(PUNICODE_STRING DriverFileNames, ULONG DisplayNumber) { RTL_QUERY_REGISTRY_TABLE QueryTable[2]; UNICODE_STRING RegistryPath; NTSTATUS Status; + PWCHAR DriverNames = NULL; + ULONG Length = 0; if (! GetRegistryPath(&RegistryPath, DisplayNumber)) { @@ -73,23 +98,40 @@ FindDriverFileNames(PUNICODE_STRING DriverFileNames, ULONG DisplayNumber) } RtlZeroMemory(QueryTable, sizeof(QueryTable)); - QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_DIRECT; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED | RTL_QUERY_REGISTRY_NOEXPAND; QueryTable[0].Name = L"InstalledDisplayDrivers"; - QueryTable[0].EntryContext = DriverFileNames; + QueryTable[0].EntryContext = &Length; + QueryTable[0].QueryRoutine = EnumDisplayQueryRoutine; Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, RegistryPath.Buffer, QueryTable, NULL, NULL); + // DPRINT1("Status: %lx\n", Status); + if (Length) + { + DriverNames = ExAllocatePool(PagedPool, Length); + // DPRINT1("Length allocated: %d\n", Length); + Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, + RegistryPath.Buffer, + QueryTable, + DriverNames, + NULL); + if (!NT_SUCCESS(Status)) DriverNames = NULL; + } + ExFreePoolWithTag(RegistryPath.Buffer, TAG_RTLREGISTRY); if (! NT_SUCCESS(Status)) { DPRINT1("No InstalledDisplayDrivers value in service entry found\n"); return FALSE; } - - DPRINT("DriverFileNames %S\n", DriverFileNames->Buffer); + + RtlInitUnicodeString(DriverFileNames, DriverNames); + DriverFileNames->Length = Length; + DriverFileNames->MaximumLength = Length; + //DPRINT1("DriverFileNames %wZ\n", DriverFileNames); return TRUE; } @@ -301,7 +343,7 @@ IntPrepareDriver(VOID) continue; } - DPRINT("Display driver %S loaded\n", CurrentName); + DPRINT1("Display driver %S loaded\n", CurrentName); ExFreePoolWithTag(DriverFileNames.Buffer, TAG_RTLREGISTRY); diff --git a/reactos/subsystems/win32/win32k/objects/freetype.c b/reactos/subsystems/win32/win32k/objects/freetype.c index bdda9c20cc6..fea0c101ee9 100644 --- a/reactos/subsystems/win32/win32k/objects/freetype.c +++ b/reactos/subsystems/win32/win32k/objects/freetype.c @@ -44,6 +44,7 @@ #include #include #include +#include #include #include @@ -81,7 +82,7 @@ typedef struct _FONT_CACHE_ENTRY LIST_ENTRY ListEntry; int GlyphIndex; FT_Face Face; - FT_Glyph Glyph; + FT_BitmapGlyph BitmapGlyph; int Height; } FONT_CACHE_ENTRY, *PFONT_CACHE_ENTRY; static LIST_ENTRY FontCacheListHead; @@ -1349,7 +1350,7 @@ ftGdiGetRasterizerCaps(LPRASTERIZER_STATUS lprs) } -FT_Glyph APIENTRY +FT_BitmapGlyph APIENTRY ftGdiGlyphCacheGet( FT_Face Face, INT GlyphIndex, @@ -1376,10 +1377,10 @@ ftGdiGlyphCacheGet( RemoveEntryList(CurrentEntry); InsertHeadList(&FontCacheListHead, CurrentEntry); - return FontEntry->Glyph; + return FontEntry->BitmapGlyph; } -FT_Glyph APIENTRY +FT_BitmapGlyph APIENTRY ftGdiGlyphCacheSet( FT_Face Face, INT GlyphIndex, @@ -1390,6 +1391,8 @@ ftGdiGlyphCacheSet( FT_Glyph GlyphCopy; INT error; PFONT_CACHE_ENTRY NewEntry; + FT_Bitmap AlignedBitmap; + FT_BitmapGlyph BitmapGlyph; error = FT_Get_Glyph(GlyphSlot, &GlyphCopy); if (error) @@ -1397,6 +1400,7 @@ ftGdiGlyphCacheSet( DPRINT1("Failure caching glyph.\n"); return NULL; }; + error = FT_Glyph_To_Bitmap(&GlyphCopy, RenderMode, 0, 1); if (error) { @@ -1412,22 +1416,34 @@ ftGdiGlyphCacheSet( return NULL; } + BitmapGlyph = (FT_BitmapGlyph)GlyphCopy; + FT_Bitmap_New(&AlignedBitmap); + if(FT_Bitmap_Convert(GlyphSlot->library, &BitmapGlyph->bitmap, &AlignedBitmap, 4)) + { + DPRINT1("Conversion failed\n"); + FT_Done_Glyph((FT_Glyph)BitmapGlyph); + return NULL; + } + + FT_Bitmap_Done(GlyphSlot->library, &BitmapGlyph->bitmap); + BitmapGlyph->bitmap = AlignedBitmap; + NewEntry->GlyphIndex = GlyphIndex; NewEntry->Face = Face; - NewEntry->Glyph = GlyphCopy; + NewEntry->BitmapGlyph = BitmapGlyph; NewEntry->Height = Height; InsertHeadList(&FontCacheListHead, &NewEntry->ListEntry); if (FontCacheNumEntries++ > MAX_FONT_CACHE) { NewEntry = (PFONT_CACHE_ENTRY)FontCacheListHead.Blink; - FT_Done_Glyph(NewEntry->Glyph); + FT_Done_Glyph((FT_Glyph)NewEntry->BitmapGlyph); RemoveTailList(&FontCacheListHead); ExFreePool(NewEntry); FontCacheNumEntries--; } - return GlyphCopy; + return BitmapGlyph; } @@ -2112,7 +2128,7 @@ TextIntGetTextExtentPoint(PDC dc, PFONTGDI FontGDI; FT_Face face; FT_GlyphSlot glyph; - FT_Glyph realglyph; + FT_BitmapGlyph realglyph; INT error, n, glyph_index, i, previous; ULONGLONG TotalWidth = 0; FT_CharMap charmap, found = NULL; @@ -2208,7 +2224,7 @@ TextIntGetTextExtentPoint(PDC dc, TotalWidth += delta.x; } - TotalWidth += realglyph->advance.x >> 10; + TotalWidth += realglyph->root.advance.x >> 10; if (((TotalWidth + 32) >> 6) <= MaxExtent && NULL != Fit) { @@ -3133,8 +3149,7 @@ GreExtTextOutW( int error, glyph_index, n, i; FT_Face face; FT_GlyphSlot glyph; - FT_Glyph realglyph; - FT_BitmapGlyph realglyph2; + FT_BitmapGlyph realglyph; LONGLONG TextLeft, RealXStart; ULONG TextTop, previous, BackgroundLeft; FT_Bool use_kerning; @@ -3400,7 +3415,7 @@ GreExtTextOutW( TextWidth += delta.x; } - TextWidth += realglyph->advance.x >> 10; + TextWidth += realglyph->root.advance.x >> 10; previous = glyph_index; TempText++; @@ -3475,26 +3490,12 @@ GreExtTextOutW( } DPRINT("TextLeft: %d\n", TextLeft); DPRINT("TextTop: %d\n", TextTop); - - if (realglyph->format == ft_glyph_format_outline) - { - DPRINT1("Should already be done\n"); -// error = FT_Render_Glyph(glyph, RenderMode); - error = FT_Glyph_To_Bitmap(&realglyph, RenderMode, 0, 0); - if (error) - { - DPRINT1("WARNING: Failed to render glyph!\n"); - goto fail2; - } - } - realglyph2 = (FT_BitmapGlyph)realglyph; - - DPRINT("Advance: %d\n", realglyph->advance.x); + DPRINT("Advance: %d\n", realglyph->root.advance.x); if (fuOptions & ETO_OPAQUE) { DestRect.left = BackgroundLeft; - DestRect.right = (TextLeft + (realglyph->advance.x >> 10) + 32) >> 6; + DestRect.right = (TextLeft + (realglyph->root.advance.x >> 10) + 32) >> 6; DestRect.top = TextTop + yoff - ((face->size->metrics.ascender + 32) >> 6); DestRect.bottom = TextTop + yoff + ((32 - face->size->metrics.descender) >> 6); IntEngBitBlt( @@ -3512,31 +3513,25 @@ GreExtTextOutW( BackgroundLeft = DestRect.right; } - DestRect.left = ((TextLeft + 32) >> 6) + realglyph2->left; - DestRect.right = DestRect.left + realglyph2->bitmap.width; - DestRect.top = TextTop + yoff - realglyph2->top; - DestRect.bottom = DestRect.top + realglyph2->bitmap.rows; + DestRect.left = ((TextLeft + 32) >> 6) + realglyph->left; + DestRect.right = DestRect.left + realglyph->bitmap.width; + DestRect.top = TextTop + yoff - realglyph->top; + DestRect.bottom = DestRect.top + realglyph->bitmap.rows; - bitSize.cx = realglyph2->bitmap.width; - bitSize.cy = realglyph2->bitmap.rows; - MaskRect.right = realglyph2->bitmap.width; - MaskRect.bottom = realglyph2->bitmap.rows; + bitSize.cx = realglyph->bitmap.width; + bitSize.cy = realglyph->bitmap.rows; + MaskRect.right = realglyph->bitmap.width; + MaskRect.bottom = realglyph->bitmap.rows; /* * We should create the bitmap out of the loop at the biggest possible * glyph size. Then use memset with 0 to clear it and sourcerect to * limit the work of the transbitblt. - * - * FIXME: DIB bitmaps should have an lDelta which is a multiple of 4. - * Here we pass in the pitch from the FreeType bitmap, which is not - * guaranteed to be a multiple of 4. If it's not, we should expand - * the FreeType bitmap to a temporary bitmap. */ - HSourceGlyph = EngCreateBitmap(bitSize, realglyph2->bitmap.pitch, - (realglyph2->bitmap.pixel_mode == ft_pixel_mode_grays) ? - BMF_8BPP : BMF_1BPP, BMF_TOPDOWN, - realglyph2->bitmap.buffer); + HSourceGlyph = EngCreateBitmap(bitSize, realglyph->bitmap.pitch, + BMF_8BPP, BMF_TOPDOWN, + realglyph->bitmap.buffer); if ( !HSourceGlyph ) { DPRINT1("WARNING: EngLockSurface() failed!\n"); @@ -3590,7 +3585,7 @@ GreExtTextOutW( if (NULL == Dx) { - TextLeft += realglyph->advance.x >> 10; + TextLeft += realglyph->root.advance.x >> 10; DPRINT("new TextLeft: %d\n", TextLeft); } else diff --git a/reactos/subsystems/win32/win32k/objects/gdibatch.c b/reactos/subsystems/win32/win32k/objects/gdibatch.c index 8cb32a7188e..bbc36ff6e6b 100644 --- a/reactos/subsystems/win32/win32k/objects/gdibatch.c +++ b/reactos/subsystems/win32/win32k/objects/gdibatch.c @@ -72,7 +72,7 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr) { pdcattr = dc->pdcattr; } - // The thread is approaching the end of sunset. + // FYI! The thread is approaching the end of sunset. switch(pHdr->Cmd) { case GdiBCPatBlt: // Highest pri first! @@ -101,8 +101,9 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr) TextIntRealizeFont((HFONT) pgO->hgdiobj, NULL); pdcattr->ulDirty_ &= ~(DIRTY_CHARSET); } - case GdiBCDelObj: case GdiBCDelRgn: + DPRINT("Delete Region Object!\n"); + case GdiBCDelObj: { PGDIBSOBJECT pgO = (PGDIBSOBJECT) pHdr; GreDeleteObject( pgO->hgdiobj ); @@ -138,6 +139,7 @@ NTSTATUS APIENTRY NtGdiFlushUserBatch(VOID) { + BOOL Hit; PTEB pTeb = NtCurrentTeb(); ULONG GdiBatchCount = pTeb->GdiBatchCount; @@ -146,8 +148,9 @@ NtGdiFlushUserBatch(VOID) HDC hDC = (HDC) pTeb->GdiTebBatch.HDC; /* If hDC is zero and the buffer fills up with delete objects we need - to run anyway. So, hard code to the system batch limit. */ - if ((hDC) || (GdiBatchCount >= GDI_BATCH_LIMIT)) + to run anyway. + */ + if (hDC || GdiBatchCount) { PCHAR pHdr = (PCHAR)&pTeb->GdiTebBatch.Buffer[0]; PDC pDC = NULL; @@ -158,8 +161,26 @@ NtGdiFlushUserBatch(VOID) } // No need to init anything, just go! - for (; GdiBatchCount > 0; GdiBatchCount--) - { + for (Hit = FALSE; GdiBatchCount > 0; GdiBatchCount--) + { /* + Looks like a hack, + feels like a hack, + you're right it's a hack, + due to the lack, + of kernel thread locking when it is in sunset! + */ + _SEH2_TRY + { + ((PGDIBATCHHDR)pHdr)->Cmd = ((PGDIBATCHHDR)pHdr)->Cmd; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Hit = TRUE; + } + _SEH2_END; + + if (Hit) break; + // Process Gdi Batch! pHdr += GdiFlushUserBatch(pDC, (PGDIBATCHHDR) pHdr); } diff --git a/reactos/subsystems/win32/win32k/objects/region.c b/reactos/subsystems/win32/win32k/objects/region.c index 083f6bd345c..3922016c338 100644 --- a/reactos/subsystems/win32/win32k/objects/region.c +++ b/reactos/subsystems/win32/win32k/objects/region.c @@ -3439,27 +3439,33 @@ NtGdiEqualRgn( return ERROR; } - if (rgn1->rdh.nCount != rgn2->rdh.nCount || - rgn1->rdh.nCount == 0 || - rgn1->rdh.rcBound.left != rgn2->rdh.rcBound.left || - rgn1->rdh.rcBound.right != rgn2->rdh.rcBound.right || - rgn1->rdh.rcBound.top != rgn2->rdh.rcBound.top || - rgn1->rdh.rcBound.bottom != rgn2->rdh.rcBound.bottom) - goto exit; + if ( rgn1->rdh.nCount != rgn2->rdh.nCount ) goto exit; + + if ( rgn1->rdh.nCount == 0 ) + { + bRet = TRUE; + goto exit; + } + + if ( rgn1->rdh.rcBound.left != rgn2->rdh.rcBound.left || + rgn1->rdh.rcBound.right != rgn2->rdh.rcBound.right || + rgn1->rdh.rcBound.top != rgn2->rdh.rcBound.top || + rgn1->rdh.rcBound.bottom != rgn2->rdh.rcBound.bottom ) + goto exit; tRect1 = rgn1->Buffer; tRect2 = rgn2->Buffer; if (!tRect1 || !tRect2) - goto exit; + goto exit; for (i=0; i < rgn1->rdh.nCount; i++) { - if (tRect1[i].left != tRect2[i].left || - tRect1[i].right != tRect2[i].right || - tRect1[i].top != tRect2[i].top || - tRect1[i].bottom != tRect2[i].bottom) - goto exit; + if ( tRect1[i].left != tRect2[i].left || + tRect1[i].right != tRect2[i].right || + tRect1[i].top != tRect2[i].top || + tRect1[i].bottom != tRect2[i].bottom ) + goto exit; } bRet = TRUE; diff --git a/reactos/tools/buildno/pch.h b/reactos/tools/buildno/pch.h index 16177f82a27..1ffb3dfd38f 100644 --- a/reactos/tools/buildno/pch.h +++ b/reactos/tools/buildno/pch.h @@ -1,7 +1,6 @@ // pre-compiled header stuff -#ifndef PCH_H -#define PCH_H +#pragma once #ifdef _MSC_VER #pragma warning ( disable : 4786 ) // identifier was truncated to '255' characters in the debug information @@ -43,5 +42,3 @@ inline char * strlwr(char *x) #define MAX_PATH PATH_MAX #define _MAX_PATH PATH_MAX #endif - -#endif//PCH_H diff --git a/reactos/tools/cabman/cabinet.h b/reactos/tools/cabman/cabinet.h index 418308492fd..f6175af5cc1 100755 --- a/reactos/tools/cabman/cabinet.h +++ b/reactos/tools/cabman/cabinet.h @@ -4,8 +4,8 @@ * FILE: tools/cabman/cabinet.h * PURPOSE: Cabinet definitions */ -#ifndef __CABINET_H -#define __CABINET_H + +#pragma once #if defined(WIN32) #include @@ -496,6 +496,4 @@ private: #endif /* CAB_READ_ONLY */ }; -#endif /* __CABINET_H */ - /* EOF */ diff --git a/reactos/tools/cabman/cabman.h b/reactos/tools/cabman/cabman.h index ed7be30a8bb..0c887cb0daf 100755 --- a/reactos/tools/cabman/cabman.h +++ b/reactos/tools/cabman/cabman.h @@ -4,8 +4,8 @@ * FILE: tools/cabman/cabman.h * PURPOSE: Cabinet manager header */ -#ifndef __CABMAN_H -#define __CABMAN_H + +#pragma once #include "cabinet.h" #include "dfp.h" @@ -41,6 +41,4 @@ private: char FileName[MAX_PATH]; }; -#endif /* __CABMAN_H */ - /* EOF */ diff --git a/reactos/tools/cabman/dfp.h b/reactos/tools/cabman/dfp.h index 4c94fd34f1e..bf50caac230 100755 --- a/reactos/tools/cabman/dfp.h +++ b/reactos/tools/cabman/dfp.h @@ -4,8 +4,8 @@ * FILE: tools/cabman/dfp.h * PURPOSE: Directive file parser header */ -#ifndef __DFP_H -#define __DFP_H + +#pragma once #include "cabinet.h" @@ -138,6 +138,4 @@ private: bool InfModeEnabled; }; -#endif /* __DFP_H */ - /* EOF */ diff --git a/reactos/tools/cabman/mszip.h b/reactos/tools/cabman/mszip.h index ebe83fccae7..da5c59f0a8e 100755 --- a/reactos/tools/cabman/mszip.h +++ b/reactos/tools/cabman/mszip.h @@ -4,8 +4,8 @@ * FILE: tools/cabman/mszip.h * PURPOSE: CAB codec for MSZIP compressed data */ -#ifndef __MSZIP_H -#define __MSZIP_H + +#pragma once #include "cabinet.h" #include @@ -36,6 +36,4 @@ private: z_stream ZStream; /* Zlib stream */ }; -#endif /* __MSZIP_H */ - /* EOF */ diff --git a/reactos/tools/cabman/raw.h b/reactos/tools/cabman/raw.h index 635712f3a9d..0b79efb7cd9 100755 --- a/reactos/tools/cabman/raw.h +++ b/reactos/tools/cabman/raw.h @@ -4,8 +4,8 @@ * FILE: tools/cabman/raw.h * PURPOSE: CAB codec for uncompressed data */ -#ifndef __RAW_H -#define __RAW_H + +#pragma once #include "cabinet.h" @@ -30,6 +30,4 @@ public: PULONG OutputLength); }; -#endif /* __RAW_H */ - /* EOF */ diff --git a/reactos/tools/geninc/geninc.rbuild b/reactos/tools/geninc/geninc.rbuild index f152a7be116..9d2be75348d 100644 --- a/reactos/tools/geninc/geninc.rbuild +++ b/reactos/tools/geninc/geninc.rbuild @@ -1,8 +1,10 @@ + geninc.c data.c + diff --git a/reactos/tools/hpp/hpp.c b/reactos/tools/hpp/hpp.c index ef751989419..1591e4881e6 100644 --- a/reactos/tools/hpp/hpp.c +++ b/reactos/tools/hpp/hpp.c @@ -12,6 +12,8 @@ #include #include +//#define DBG 1 + #if DBG #define trace printf #else @@ -70,24 +72,40 @@ LoadFile(const char* pszFileName, size_t* pFileSize) { FILE* file; void* pFileData = NULL; + int iFileSize; + + trace("Loading file..."); file = fopen(pszFileName, "rb"); - if (file != NULL) + if (!file) { - fseek(file, 0L, SEEK_END); - *pFileSize = ftell(file); - fseek(file, 0L, SEEK_SET); - pFileData = malloc(*pFileSize); - if (pFileData != NULL) - { - if (*pFileSize != fread(pFileData, 1, *pFileSize, file)) - { - free(pFileData); - pFileData = NULL; - } - } - fclose(file); + trace("Could not open file\n"); + return NULL; } + + fseek(file, 0L, SEEK_END); + iFileSize = ftell(file); + fseek(file, 0L, SEEK_SET); + *pFileSize = iFileSize; + trace("ok. Size is %d\n", iFileSize); + + pFileData = malloc(iFileSize + 1); + + if (pFileData != NULL) + { + if (iFileSize != fread(pFileData, 1, iFileSize, file)) + { + free(pFileData); + pFileData = NULL; + } + } + else + { + trace("Could not allocate memory for file\n"); + } + + fclose(file); + return pFileData; } @@ -452,6 +470,9 @@ ParseInputFile(const char *pszInFile, FILE *fileOut) /* Restore the global file name */ gpszCurFile = pszInFile; + + /* Restore the zeroed character */ + *p2 = ')'; if (ret == -1) { @@ -481,6 +502,8 @@ ParseInputFile(const char *pszInFile, FILE *fileOut) /* Free the file data */ free(pInputData); + trace("Done with file.\n\n"); + return 0; } @@ -494,7 +517,7 @@ main(int argc, char* argv[]) if (argc != 3) { - error("Usage: hc \n"); + error("Usage: hpp \n"); exit(1); } diff --git a/reactos/tools/log2lines/cache.c b/reactos/tools/log2lines/cache.c index fd5bcc2c303..d8faa8d9537 100644 --- a/reactos/tools/log2lines/cache.c +++ b/reactos/tools/log2lines/cache.c @@ -4,6 +4,7 @@ * * - Image directory caching */ + #include #include #include @@ -65,6 +66,14 @@ unpack_iso(char *dir, char *iso) return res; } +int +cleanable(char *path) +{ + if (strcmp(basename(path),DEF_OPT_DIR) == 0) + return 1; + return 0; +} + int check_directory(int force) { @@ -135,7 +144,10 @@ check_directory(int force) cache_name = malloc(MAX_PATH); tmp_name = malloc(MAX_PATH); strcpy(cache_name, opt_dir); - strcat(cache_name, PATH_STR CACHEFILE); + if (cleanable(opt_dir)) + strcat(cache_name, ALT_PATH_STR CACHEFILE); + else + strcat(cache_name, PATH_STR CACHEFILE); strcpy(tmp_name, cache_name); strcat(tmp_name, "~"); return 0; @@ -271,4 +283,4 @@ create_cache(int force, int skipImageBase) return 0; } - +/* EOF */ diff --git a/reactos/tools/log2lines/cache.h b/reactos/tools/log2lines/cache.h index b33e5f9b4b5..0acdd4c0f68 100644 --- a/reactos/tools/log2lines/cache.h +++ b/reactos/tools/log2lines/cache.h @@ -5,13 +5,11 @@ * - Image directory caching */ -#ifndef __L2L_CACHE_H__ -#define __L2L_CACHE_H__ +#pragma once int check_directory(int force); int read_cache(void); int create_cache(int force, int skipImageBase); - -#endif /* __L2L_CACHE_H__ */ +int cleanable(char *path); /* EOF */ diff --git a/reactos/tools/log2lines/compat.h b/reactos/tools/log2lines/compat.h index 76d87681ce0..1b364db725b 100644 --- a/reactos/tools/log2lines/compat.h +++ b/reactos/tools/log2lines/compat.h @@ -1,5 +1,4 @@ -#ifndef __L2L_COMPAT_H__ -#define __L2L_COMPAT_H__ +#pragma once #if defined (__DJGPP__) || defined (__WIN32__) @@ -35,7 +34,4 @@ #endif /* not defined (__DJGPP__) || defined (__WIN32__) */ - -#endif /* __L2L_COMPAT_H__ */ - /* EOF */ diff --git a/reactos/tools/log2lines/config.h b/reactos/tools/log2lines/config.h index c1a29d22f9c..d1c73898e94 100644 --- a/reactos/tools/log2lines/config.h +++ b/reactos/tools/log2lines/config.h @@ -1,5 +1,4 @@ -#ifndef __L2L_CONFIG_H__ -#define __L2L_CONFIG_H__ +#pragma once /* Assume if an offset > ABS_TRESHOLD, then it must be absolute */ #define ABS_TRESHOLD 0x00400000L @@ -27,9 +26,12 @@ "%s x -y -r %s" PATH_STR "reactos" PATH_STR "reactos.cab -o%s" \ PATH_STR "reactos" PATH_STR "reactos > " DEV_NULL +/* When we can't use a normal path, because it gets cleaned, + * fallback to name mangling: + */ +#define ALT_PATH_STR "#" + #define LINESIZE 1024 #define NAMESIZE 80 -#endif /* __L2L_CONFIG_H__ */ - /* EOF */ diff --git a/reactos/tools/log2lines/help.c b/reactos/tools/log2lines/help.c index 37e6bf400f8..c036d4857c7 100644 --- a/reactos/tools/log2lines/help.c +++ b/reactos/tools/log2lines/help.c @@ -4,6 +4,7 @@ * * - Help text and functions */ + #include #include "version.h" @@ -51,6 +52,9 @@ char *verboseUsage = " -l \n" " : Append copy to specified logFile.\n" " Default: no logFile\n\n" +" -L \n" +" : (Over)write copy to specified logFile.\n" +" Default: no logFile\n\n" " -m Prefix (mark) each translated line with '* '.\n\n" " -M Prefix (mark) each NOT translated line with '? '.\n" " ( Only for lines of the form: )\n\n" @@ -112,7 +116,7 @@ char *verboseUsage = " For a reliable result, these sources should be up to date with\n" " the tested revision (or try '-R check').\n" " Can be combined with -tTR.\n" -" Implies -U (For retrieving source info).\n\n" +" Implies -U (For retrieving source info) and -R check.\n\n" " -t Translate twice. The address itself and for (address-1).\n" " Show extra filename, func and linenumber between [..] if they differ\n" " So if only the linenumbers differ, then only show the extra\n" @@ -139,7 +143,10 @@ char *verboseUsage = " Options accepting a string as argument can be cleared by the value '" KDBG_ESC_OFF "'.\n" " Some ClI commands are read only or not (entirely) implemented.\n" " If no value is provided, the current one is printed.\n" -" There are only a few extra ClI commands or with different behaviour:\n" +" There are a few extra ClI commands or with different behaviour:\n" +" - `a ::\n" +" - Outputs absolute address e.g. for setting breakpoints.\n" +" - Do a 'mod' first to retrieve relocation info.\n" " - `h : shows this helptext (without exiting)\n" " - `q : quits log2lines\n" " - `R regscan : the output is printed immediately (do a 'bt' first)\n" @@ -233,7 +240,14 @@ char *verboseUsage = " | L2L- -l logfile is \"new.log\" (changed)\n" " kdb:> `l off\n" " | L2L- -l logfile is "" (changed)\n" -" kdb:>\n" +" kdb:>\n\n" +" Set a breakpoint with help of 'mod' and '`a':\n" +" \n" +" kdb:> mod (for kernel tracing usually only needed once)\n" +" -- mod output with reloc info\n" +" kdb:> `a msi.dll:2e35d\n" +" | L2L- Address: 0x00096ca0\n" +" kdb:> bpx 0x00096ca0\n\n" "\n"; void @@ -246,3 +260,5 @@ usage(int verbose) else fprintf(stderr, "Try log2lines -h\n"); } + +/* EOF */ diff --git a/reactos/tools/log2lines/help.h b/reactos/tools/log2lines/help.h index 5f2ab3893da..9f08f57897f 100644 --- a/reactos/tools/log2lines/help.h +++ b/reactos/tools/log2lines/help.h @@ -5,13 +5,10 @@ * - Help text and functions */ -#ifndef __L2L_HELP_H__ -#define __L2L_HELP_H__ +#pragma once extern char *verboseUsage; void usage(int verbose); -#endif /* __L2L_HELP_H__ */ - /* EOF */ diff --git a/reactos/tools/log2lines/image.c b/reactos/tools/log2lines/image.c index f94abcb59c8..bae302b8d51 100644 --- a/reactos/tools/log2lines/image.c +++ b/reactos/tools/log2lines/image.c @@ -4,11 +4,12 @@ * * - Image functions for symbol info */ -#include + #include #include #include +#include "compat.h" #include "util.h" #include "options.h" #include "log2lines.h" @@ -163,3 +164,5 @@ get_ImageBase(char *fname, size_t *ImageBase) fclose(fr); return 0; } + +/* EOF */ diff --git a/reactos/tools/log2lines/image.h b/reactos/tools/log2lines/image.h index acc6712e695..f9371e0c0eb 100644 --- a/reactos/tools/log2lines/image.h +++ b/reactos/tools/log2lines/image.h @@ -5,8 +5,7 @@ * - Image functions for symbol info */ -#ifndef __L2L_IMAGE_H__ -#define __L2L_IMAGE_H__ +#pragma once #include @@ -18,7 +17,4 @@ PIMAGE_SECTION_HEADER get_sectionheader(const void *FileData); int get_ImageBase(char *fname, size_t *ImageBase); - -#endif /* __L2L_IMAGE_H__ */ - /* EOF */ diff --git a/reactos/tools/log2lines/list.c b/reactos/tools/log2lines/list.c index 4491d079252..3fdd22b564d 100644 --- a/reactos/tools/log2lines/list.c +++ b/reactos/tools/log2lines/list.c @@ -9,6 +9,7 @@ #include #include +#include "config.h" #include "compat.h" #include "list.h" #include "util.h" @@ -162,6 +163,8 @@ cache_entry_create(char *Line) l2l_dbg(1, "ImageBase field missing\n"); return entry_delete(pentry); } + pentry->RelBase = INVALID_BASE; + pentry->Size = 0; return pentry; } @@ -212,3 +215,5 @@ sources_entry_create(PLIST list, char *path, char *prefix) return pentry; } + +/* EOF */ diff --git a/reactos/tools/log2lines/list.h b/reactos/tools/log2lines/list.h index e23fbc48cbe..fa426d4c0c0 100644 --- a/reactos/tools/log2lines/list.h +++ b/reactos/tools/log2lines/list.h @@ -1,5 +1,4 @@ -#ifndef __L2L_LIST_H__ -#define __L2L_LIST_H__ +#pragma once typedef struct entry_struct { @@ -7,14 +6,16 @@ typedef struct entry_struct char *name; char *path; size_t ImageBase; + size_t RelBase; + size_t Size; struct entry_struct *pnext; -} LIST_MEMBER,*PLIST_MEMBER; +} LIST_MEMBER, *PLIST_MEMBER; typedef struct list_struct { PLIST_MEMBER phead; PLIST_MEMBER ptail; -} LIST,*PLIST; +} LIST, *PLIST; PLIST_MEMBER entry_lookup(PLIST list, char *name); PLIST_MEMBER entry_delete(PLIST_MEMBER pentry); @@ -23,6 +24,4 @@ PLIST_MEMBER cache_entry_create(char *Line); PLIST_MEMBER sources_entry_create(PLIST list, char *path, char *prefix); void list_clear(PLIST list); -#endif /* __L2L_LIST_H__ */ - /* EOF */ diff --git a/reactos/tools/log2lines/log2lines.c b/reactos/tools/log2lines/log2lines.c index 1ad94f2fb0e..c00cfd378b5 100644 --- a/reactos/tools/log2lines/log2lines.c +++ b/reactos/tools/log2lines/log2lines.c @@ -19,10 +19,13 @@ #include "log2lines.h" #include "help.h" #include "cmd.h" +#include "match.h" -static FILE *stdIn = NULL; -static FILE *stdOut = NULL; +static FILE *dbgIn = NULL; +static FILE *dbgOut = NULL; +static FILE *conIn = NULL; +static FILE *conOut = NULL; static const char *kdbg_prompt = KDBG_PROMPT; static const char *kdbg_cont = KDBG_CONT; @@ -443,15 +446,18 @@ translate_files(FILE *inFile, FILE *outFile) { if (p == p_eos) { - //kdbg prompt, so already echoed char by char + // kdbg prompt, so already echoed char by char memset(Line, '\0', LINESIZE); translate_char(c, outFile); } else { - translate_line(outFile, Line, path, LineOut); - translate_char(c, outFile); - report(outFile); + if (match_line(outFile, Line)) + { + translate_line(outFile, Line, path, LineOut); + translate_char(c, outFile); + report(outFile); + } } } } @@ -562,8 +568,10 @@ main(int argc, const char **argv) int res = 0; int optCount = 0; - stdIn = stdin; - stdOut = stdout; + dbgIn = stdin; + conOut = stdout; + (void)conIn; + (void)dbgOut; memset(&cache, 0, sizeof(LIST)); memset(&sources, 0, sizeof(LIST)); @@ -596,7 +604,7 @@ main(int argc, const char **argv) read_cache(); l2l_dbg(4, "Cache read complete\n"); - if (set_LogFile(logFile)) + if (set_LogFile(&logFile)) return 2; l2l_dbg(4, "opt_logFile processed\n"); @@ -604,9 +612,9 @@ main(int argc, const char **argv) { l2l_dbg(3, "Command line: \"%s\"\n",opt_Pipe); - if (!(stdIn = POPEN(opt_Pipe, "r"))) + if (!(dbgIn = POPEN(opt_Pipe, "r"))) { - stdIn = stdin; //restore + dbgIn = stdin; //restore l2l_dbg(0, "Could not popen '%s' (%s)\n", opt_Pipe, strerror(errno)); free(opt_Pipe); opt_Pipe = NULL; } @@ -631,7 +639,7 @@ main(int argc, const char **argv) l2l_dbg(2, "translating %s %s\n", exefile, offset); translate_file(exefile, my_atoi(offset), Line); printf("%s\n", Line); - report(stdOut); + report(conOut); } else { @@ -649,14 +657,16 @@ main(int argc, const char **argv) } else { // translate logging from stdin - translate_files(stdIn, stdOut); + translate_files(dbgIn, conOut); } if (logFile) fclose(logFile); if (opt_Pipe) - PCLOSE(stdIn); + PCLOSE(dbgIn); return res; } + +/* EOF */ diff --git a/reactos/tools/log2lines/log2lines.h b/reactos/tools/log2lines/log2lines.h index 5d4059f2145..f7fd9ff8e87 100644 --- a/reactos/tools/log2lines/log2lines.h +++ b/reactos/tools/log2lines/log2lines.h @@ -1,5 +1,4 @@ -#ifndef __LOG2LINES_H__ -#define __LOG2LINES_H__ +#pragma once #include #include @@ -30,6 +29,4 @@ extern FILE *logFile; extern LINEINFO lastLine; extern LIST sources; -#endif /* __LOG2LINES_H__ */ - /* EOF */ diff --git a/reactos/tools/log2lines/log2lines.mak b/reactos/tools/log2lines/log2lines.mak index 358fd83d4e8..d19d6c09a9a 100644 --- a/reactos/tools/log2lines/log2lines.mak +++ b/reactos/tools/log2lines/log2lines.mak @@ -31,6 +31,7 @@ LOG2LINES_SOURCES = \ $(LOG2LINES_BASE_)stat.c \ $(LOG2LINES_BASE_)revision.c \ $(LOG2LINES_BASE_)cmd.c \ + $(LOG2LINES_BASE_)match.c \ $(LOG2LINES_BASE_)log2lines.c \ $(RSYM_BASE_)rsym_common.c @@ -88,6 +89,10 @@ $(LOG2LINES_INT_)cmd.o: $(LOG2LINES_BASE_)cmd.c | $(LOG2LINES_INT) $(ECHO_HOSTCC) ${host_gcc} $(LOG2LINES_HOST_CFLAGS) -c $< -o $@ +$(LOG2LINES_INT_)match.o: $(LOG2LINES_BASE_)match.c | $(LOG2LINES_INT) + $(ECHO_HOSTCC) + ${host_gcc} $(LOG2LINES_HOST_CFLAGS) -c $< -o $@ + .PHONY: log2lines_clean log2lines_clean: -@$(rm) $(LOG2LINES_TARGET) $(LOG2LINES_OBJECTS) 2>$(NUL) diff --git a/reactos/tools/log2lines/options.c b/reactos/tools/log2lines/options.c index 88d7f4b9e37..efa77e44d18 100644 --- a/reactos/tools/log2lines/options.c +++ b/reactos/tools/log2lines/options.c @@ -4,6 +4,7 @@ * * - Option init and parsing */ + #include #include #include @@ -16,7 +17,7 @@ #include "log2lines.h" #include "options.h" -char *optchars = "bcd:fFhl:mMP:rR:sS:tTuUvz:"; +char *optchars = "bcd:fFhl:L:mMP:rR:sS:tTuUvz:"; int opt_buffered = 0; // -b int opt_help = 0; // -h int opt_force = 0; // -f @@ -37,8 +38,10 @@ int opt_Twice = 0; // -T int opt_undo = 0; // -u int opt_redo = 0; // -U char *opt_Revision = NULL; // -R +int opt_Revision_check = 0; // -R check char opt_dir[MAX_PATH]; // -d -char opt_logFile[MAX_PATH]; // -l +char opt_logFile[MAX_PATH]; // -l|L +char *opt_mod = NULL; // -mod for opt_logFile char opt_7z[MAX_PATH]; // -z char opt_scanned[LINESIZE]; // all scanned options char opt_SourcesPath[LINESIZE]; //sources path @@ -48,6 +51,7 @@ int optionInit(int argc, const char **argv) int i; char *s; + opt_mod = "a"; strcpy(opt_dir, ""); strcpy(opt_logFile, ""); strcpy(opt_7z, CMD_7Z); @@ -70,6 +74,9 @@ int optionInit(int argc, const char **argv) case 'd': strcpy(opt_dir, argv[i+1]); break; + case 'L': + opt_mod = "w"; + //fall through case 'l': strcpy(opt_logFile, argv[i+1]); break; @@ -146,6 +153,8 @@ int optionParse(int argc, const char **argv) free(opt_Revision); opt_Revision = malloc(LINESIZE); sscanf(optarg, "%s", opt_Revision); + if (strcmp(opt_Revision, "check") == 0) + opt_Revision_check ++; break; case 's': opt_stats++; @@ -161,6 +170,7 @@ int optionParse(int argc, const char **argv) /* need to retranslate for source info: */ opt_undo++; opt_redo++; + opt_Revision_check ++; } break; case 't': @@ -208,3 +218,5 @@ int optionParse(int argc, const char **argv) return optCount; } + +/* EOF */ diff --git a/reactos/tools/log2lines/options.h b/reactos/tools/log2lines/options.h index 8051eaa9880..a3f2d75ba83 100644 --- a/reactos/tools/log2lines/options.h +++ b/reactos/tools/log2lines/options.h @@ -5,8 +5,7 @@ * - Option parsing */ -#ifndef __L2L_OPTIONS_H__ -#define __L2L_OPTIONS_H__ +#pragma once extern char *optchars; extern int opt_buffered; // -b @@ -29,8 +28,10 @@ extern int opt_Twice ; // -T extern int opt_undo ; // -u extern int opt_redo ; // -U extern char *opt_Revision; // -R +extern int opt_Revision_check; // -R check extern char opt_dir[]; // -d extern char opt_logFile[]; // -l +extern char *opt_mod; // mod for opt_logFile extern char opt_7z[]; // -z extern char opt_scanned[]; // all scanned options @@ -39,6 +40,4 @@ extern char opt_SourcesPath[]; //sources path int optionInit(int argc, const char **argv); int optionParse(int argc, const char **argv); -#endif /* __L2L_OPTIONS_H__ */ - /* EOF */ diff --git a/reactos/tools/log2lines/revision.c b/reactos/tools/log2lines/revision.c index 5a05bc66ef3..ae5fa17da37 100644 --- a/reactos/tools/log2lines/revision.c +++ b/reactos/tools/log2lines/revision.c @@ -29,7 +29,7 @@ log_rev_check(FILE *outFile, char *fileName, int showfile) if (revinfo.opt_verbose) log(outFile, "| R--- %s Last Changed Rev: %d\n", s, rev); - if (rev && opt_Revision) + if (rev && opt_Revision_check) { if (revinfo.rev < revinfo.buildrev) { @@ -128,9 +128,7 @@ getTBRevision(char *fileName) void reportRevision(FILE *outFile) { - if (!opt_Revision) - return; - if (strcmp(opt_Revision, "check") == 0) + if (opt_Revision_check) { if (lastLine.valid) logRevCheck(outFile); @@ -297,3 +295,5 @@ updateSvnlog(void) return res; } + +/* EOF */ diff --git a/reactos/tools/log2lines/revision.h b/reactos/tools/log2lines/revision.h index 7a43be9b77a..6da59ad03e3 100644 --- a/reactos/tools/log2lines/revision.h +++ b/reactos/tools/log2lines/revision.h @@ -5,8 +5,7 @@ * - SVN interface and revision analysis */ -#ifndef __L2L_REVISION_H__ -#define __L2L_REVISION_H__ +#pragma once #include @@ -25,6 +24,4 @@ unsigned long findRev(FILE *finx, int *rev); int regscan(FILE *outFile); int updateSvnlog(void); -#endif /* __L2L_REVISION_H__ */ - /* EOF */ diff --git a/reactos/tools/log2lines/stat.c b/reactos/tools/log2lines/stat.c index 6f8e5fe83c2..801f693bde2 100644 --- a/reactos/tools/log2lines/stat.c +++ b/reactos/tools/log2lines/stat.c @@ -42,3 +42,5 @@ stat_clear(PSUMM psumm) { memset(psumm, 0, sizeof(SUMM)); } + +/* EOF */ diff --git a/reactos/tools/log2lines/stat.h b/reactos/tools/log2lines/stat.h index 6aced4766cd..2b870285604 100644 --- a/reactos/tools/log2lines/stat.h +++ b/reactos/tools/log2lines/stat.h @@ -5,8 +5,7 @@ * - Statistics */ -#ifndef __L2L_STAT_H__ -#define __L2L_STAT_H__ +#pragma once #include @@ -27,6 +26,4 @@ typedef struct summ_struct void stat_print(FILE *outFile, PSUMM psumm); void stat_clear(PSUMM psumm); -#endif /* __L2L_STAT_H__ */ - /* EOF */ diff --git a/reactos/tools/log2lines/util.c b/reactos/tools/log2lines/util.c index 50887e3c456..19e6342934a 100644 --- a/reactos/tools/log2lines/util.c +++ b/reactos/tools/log2lines/util.c @@ -16,25 +16,25 @@ #include "options.h" int -set_LogFile(FILE *logFile) +set_LogFile(FILE **plogFile) { if (*opt_logFile) { - if (logFile) - fclose(logFile); - logFile = NULL; + if (*plogFile) + fclose(*plogFile); + *plogFile = NULL; if (strcmp(opt_logFile,"none") == 0) return 0; //just close - logFile = fopen(opt_logFile, "a"); - if (logFile) + *plogFile = fopen(opt_logFile, opt_mod ? opt_mod : "a"); + if (*plogFile) { // disable buffering so fflush is not needed if (!opt_buffered) { l2l_dbg(1, "Disabling log buffering on %s\n", opt_logFile); - setbuf(logFile, NULL); + setbuf(*plogFile, NULL); } else l2l_dbg(1, "Enabling log buffering on %s\n", opt_logFile); @@ -186,3 +186,5 @@ copy_file(char *src, char *dst) } return 0; } + +/* EOF */ diff --git a/reactos/tools/log2lines/util.h b/reactos/tools/log2lines/util.h index b4736f598f0..8df1181b4f7 100644 --- a/reactos/tools/log2lines/util.h +++ b/reactos/tools/log2lines/util.h @@ -5,12 +5,12 @@ * - Misc utils */ -#ifndef __L2L_UTIL_H__ -#define __L2L_UTIL_H__ +#pragma once #include #include "cmd.h" +#include "options.h" #define log(outFile, fmt, ...) \ { \ @@ -45,8 +45,6 @@ const char *getFmt(const char *a); long my_atoi(const char *a); int isOffset(const char *a); int copy_file(char *src, char *dst); -int set_LogFile(FILE *logFile); - -#endif /* __L2L_UTIL_H__ */ +int set_LogFile(FILE **plogFile); /* EOF */ diff --git a/reactos/tools/log2lines/version.h b/reactos/tools/log2lines/version.h index 9a42e4904a3..ad1e9299af0 100644 --- a/reactos/tools/log2lines/version.h +++ b/reactos/tools/log2lines/version.h @@ -5,11 +5,8 @@ * - Version */ -#ifndef __L2L_VERSION_H__ -#define __L2L_VERSION_H__ +#pragma once -#define LOG2LINES_VERSION "2.1" - -#endif /* __L2L_VERSION_H__ */ +#define LOG2LINES_VERSION "2.2" /* EOF */ diff --git a/reactos/tools/mkhive/binhive.h b/reactos/tools/mkhive/binhive.h index 709c93100dd..43becbf9abd 100644 --- a/reactos/tools/mkhive/binhive.h +++ b/reactos/tools/mkhive/binhive.h @@ -23,14 +23,11 @@ * PROGRAMMER: Herv Poussineau */ -#ifndef __BINHIVE_H__ -#define __BINHIVE_H__ +#pragma once BOOL ExportBinaryHive( IN PCSTR FileName, IN PCMHIVE Hive); -#endif /* __BINHIVE_H__ */ - /* EOF */ diff --git a/reactos/tools/mkhive/mkhive.h b/reactos/tools/mkhive/mkhive.h index b86687c95ee..becb9b31262 100644 --- a/reactos/tools/mkhive/mkhive.h +++ b/reactos/tools/mkhive/mkhive.h @@ -24,8 +24,7 @@ * Herv Poussineau */ -#ifndef __MKHIVE_H__ -#define __MKHIVE_H__ +#pragma once #include #include @@ -103,6 +102,4 @@ extern LIST_ENTRY CmiHiveListHead; #define GCC_PACKED __attribute__((packed)) #endif//_MSC_VER -#endif /* __MKHIVE_H__ */ - /* EOF */ diff --git a/reactos/tools/mkhive/reginf.h b/reactos/tools/mkhive/reginf.h index f807a65785c..f84f6ed464b 100644 --- a/reactos/tools/mkhive/reginf.h +++ b/reactos/tools/mkhive/reginf.h @@ -23,12 +23,9 @@ * PROGRAMMER: Herv Poussineau */ -#ifndef __REGINF_H__ -#define __REGINF_H__ +#pragma once BOOL ImportRegistryFile(PCHAR Filename); -#endif /* __REGINF_H__ */ - /* EOF */ diff --git a/reactos/tools/mkhive/registry.h b/reactos/tools/mkhive/registry.h index a810602a81f..696126bbc1e 100644 --- a/reactos/tools/mkhive/registry.h +++ b/reactos/tools/mkhive/registry.h @@ -4,8 +4,7 @@ * PURPOSE: Registry code */ -#ifndef __REGISTRY_H__ -#define __REGISTRY_H__ +#pragma once typedef struct _REG_VALUE { @@ -122,9 +121,4 @@ RegGetValueCount (HKEY Key); VOID RegInitializeRegistry(VOID); -#endif /* __REGISTRY_H__ */ - /* EOF */ - - - diff --git a/reactos/tools/rsym/dwarf2.h b/reactos/tools/rsym/dwarf2.h index ce9a993872f..f07054d6ebc 100644 --- a/reactos/tools/rsym/dwarf2.h +++ b/reactos/tools/rsym/dwarf2.h @@ -38,8 +38,7 @@ /* This file is shared between GCC and GDB, and should not contain prototypes. */ -#ifndef GCC_DWARF2_H -#define GCC_DWARF2_H +#pragma once //#include "list.h" @@ -838,7 +837,3 @@ typedef struct _CFSTATE } DW2CFSTATE, *PDW2CFSTATE; #define NextCIE(p) ((void*)((char*)p + p->Length + 4)) - - - -#endif /* dwarf2.h */ diff --git a/reactos/tools/rsym/rsym.h b/reactos/tools/rsym/rsym.h index cae80e7c69a..386b064b4a4 100644 --- a/reactos/tools/rsym/rsym.h +++ b/reactos/tools/rsym/rsym.h @@ -1,7 +1,6 @@ /* rsym.h */ -#ifndef RSYM_H -#define RSYM_H +#pragma once #define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x010b #define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x020b @@ -373,5 +372,3 @@ convert_path(const char* origpath); extern void* load_file ( const char* file_name, size_t* file_size ); - -#endif/*RSYM_H*/ diff --git a/reactos/tools/rsym/rsym64.h b/reactos/tools/rsym/rsym64.h index f4d371cc91c..cae44f545b4 100644 --- a/reactos/tools/rsym/rsym64.h +++ b/reactos/tools/rsym/rsym64.h @@ -1,6 +1,4 @@ - -#ifndef _RSYM64_H -#define _RSYM64_H +#pragma once //C_ASSERT(sizeof(ULONG) == 4); typedef unsigned char UBYTE; @@ -185,7 +183,3 @@ typedef struct ULONG cScopes; } FILE_INFO, *PFILE_INFO; - - - -#endif // !_RSYM64_H diff --git a/reactos/tools/ssprintf.h b/reactos/tools/ssprintf.h index 888e67894d5..6e105542be0 100644 --- a/reactos/tools/ssprintf.h +++ b/reactos/tools/ssprintf.h @@ -13,8 +13,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef SSPRINTF_H -#define SSPRINTF_H + +#pragma once #include #include @@ -38,5 +38,3 @@ std::wstring sswvprintf ( const wchar_t* fmt, va_list args ); #define sstprintf ssprintf #define sstvprintf ssvprintf #endif - -#endif diff --git a/reactos/tools/tools.rbuild b/reactos/tools/tools.rbuild index 715e7733851..2681dbfa154 100644 --- a/reactos/tools/tools.rbuild +++ b/reactos/tools/tools.rbuild @@ -7,6 +7,9 @@ + + + diff --git a/reactos/tools/widl/client.c b/reactos/tools/widl/client.c index b683a14b315..569a18b434d 100644 --- a/reactos/tools/widl/client.c +++ b/reactos/tools/widl/client.c @@ -126,8 +126,6 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) print_client( " struct __frame_%s%s *__frame )\n{\n", prefix_client, get_name(func) ); indent++; - /* FIXME: emit client finally code */ - if (has_full_pointer) write_full_pointer_free(client, indent, func); diff --git a/reactos/tools/widl/expr.c b/reactos/tools/widl/expr.c index b5283767288..bca7c5a3e91 100644 --- a/reactos/tools/widl/expr.c +++ b/reactos/tools/widl/expr.c @@ -87,7 +87,9 @@ expr_t *make_exprs(enum expr_type type, char *val) e->u.sval = val; e->is_const = FALSE; /* check for predefined constants */ - if (type == EXPR_IDENTIFIER) + switch (type) + { + case EXPR_IDENTIFIER: { var_t *c = find_const(val, 0); if (c) @@ -97,6 +99,21 @@ expr_t *make_exprs(enum expr_type type, char *val) e->is_const = TRUE; e->cval = c->eval->cval; } + break; + } + case EXPR_CHARCONST: + if (!val[0]) + error_loc("empty character constant\n"); + else if (val[1]) + error_loc("multi-character constants are endian dependent\n"); + else + { + e->is_const = TRUE; + e->cval = *val; + } + break; + default: + break; } return e; } @@ -457,6 +474,11 @@ static struct expression_type resolve_expression(const struct expr_loc *expr_loc result.is_temporary = TRUE; result.type = type_new_pointer(RPC_FC_UP, type_new_int(TYPE_BASIC_WCHAR, 0), NULL); break; + case EXPR_CHARCONST: + result.is_variable = FALSE; + result.is_temporary = TRUE; + result.type = type_new_int(TYPE_BASIC_CHAR, 0); + break; case EXPR_DOUBLE: result.is_variable = FALSE; result.is_temporary = TRUE; @@ -655,6 +677,9 @@ void write_expr(FILE *h, const expr_t *e, int brackets, case EXPR_WSTRLIT: fprintf(h, "L\"%s\"", e->u.sval); break; + case EXPR_CHARCONST: + fprintf(h, "'%s'", e->u.sval); + break; case EXPR_LOGNOT: fprintf(h, "!"); write_expr(h, e->ref, 1, toplevel, toplevel_prefix, cont_type, local_var_prefix); @@ -804,6 +829,7 @@ int compare_expr(const expr_t *a, const expr_t *b) case EXPR_IDENTIFIER: case EXPR_STRLIT: case EXPR_WSTRLIT: + case EXPR_CHARCONST: return strcmp(a->u.sval, b->u.sval); case EXPR_COND: ret = compare_expr(a->ref, b->ref); diff --git a/reactos/tools/widl/header.c b/reactos/tools/widl/header.c index e87a44e9077..5602b6da572 100644 --- a/reactos/tools/widl/header.c +++ b/reactos/tools/widl/header.c @@ -254,6 +254,7 @@ void write_type_left(FILE *h, type_t *t, int declonly) break; case TYPE_BASIC: if (type_basic_get_type(t) != TYPE_BASIC_INT32 && + type_basic_get_type(t) != TYPE_BASIC_INT64 && type_basic_get_type(t) != TYPE_BASIC_HYPER) { if (type_basic_get_sign(t) < 0) fprintf(h, "signed "); @@ -264,7 +265,6 @@ void write_type_left(FILE *h, type_t *t, int declonly) case TYPE_BASIC_INT8: fprintf(h, "small"); break; case TYPE_BASIC_INT16: fprintf(h, "short"); break; case TYPE_BASIC_INT: fprintf(h, "int"); break; - case TYPE_BASIC_INT64: fprintf(h, "__int64"); break; case TYPE_BASIC_INT3264: fprintf(h, "__int3264"); break; case TYPE_BASIC_BYTE: fprintf(h, "byte"); break; case TYPE_BASIC_CHAR: fprintf(h, "char"); break; @@ -279,6 +279,12 @@ void write_type_left(FILE *h, type_t *t, int declonly) else fprintf(h, "LONG"); break; + case TYPE_BASIC_INT64: + if (type_basic_get_sign(t) > 0) + fprintf(h, "UINT64"); + else + fprintf(h, "INT64"); + break; case TYPE_BASIC_HYPER: if (type_basic_get_sign(t) > 0) fprintf(h, "MIDL_uhyper"); @@ -685,10 +691,12 @@ int has_out_arg_or_return(const var_t *func) /********** INTERFACES **********/ -int is_object(const attr_list_t *list) +int is_object(const type_t *iface) { const attr_t *attr; - if (list) LIST_FOR_EACH_ENTRY( attr, list, const attr_t, entry ) + if (type_is_defined(iface) && type_iface_get_inherit(iface)) + return 1; + if (iface->attrs) LIST_FOR_EACH_ENTRY( attr, iface->attrs, const attr_t, entry ) if (attr->type == ATTR_OBJECT || attr->type == ATTR_ODL) return 1; return 0; } @@ -860,7 +868,7 @@ static void write_locals(FILE *fp, const type_t *iface, int body) = "/* WIDL-generated stub. You must provide an implementation for this. */"; const statement_t *stmt; - if (!is_object(iface->attrs)) + if (!is_object(iface)) return; STATEMENTS_FOR_EACH_FUNC(stmt, type_iface_get_stmts(iface)) { @@ -1174,7 +1182,7 @@ static void write_forward_decls(FILE *header, const statement_list_t *stmts) case STMT_TYPE: if (type_get_type(stmt->u.type) == TYPE_INTERFACE) { - if (is_object(stmt->u.type->attrs) || is_attr(stmt->u.type->attrs, ATTR_DISPINTERFACE)) + if (is_object(stmt->u.type) || is_attr(stmt->u.type->attrs, ATTR_DISPINTERFACE)) write_forward(header, stmt->u.type); } else if (type_get_type(stmt->u.type) == TYPE_COCLASS) @@ -1209,7 +1217,7 @@ static void write_header_stmts(FILE *header, const statement_list_t *stmts, cons if (type_get_type(stmt->u.type) == TYPE_INTERFACE) { type_t *iface = stmt->u.type; - if (is_attr(stmt->u.type->attrs, ATTR_DISPINTERFACE) || is_object(stmt->u.type->attrs)) + if (is_attr(stmt->u.type->attrs, ATTR_DISPINTERFACE) || is_object(stmt->u.type)) { write_com_interface_start(header, iface); write_header_stmts(header, type_iface_get_stmts(iface), stmt->u.type, TRUE); diff --git a/reactos/tools/widl/header.h b/reactos/tools/widl/header.h index d4b3b88f32e..7d6c5439d7b 100644 --- a/reactos/tools/widl/header.h +++ b/reactos/tools/widl/header.h @@ -38,7 +38,7 @@ extern void write_type_def_or_decl(FILE *h, type_t *t, int is_field, const char extern void write_type_decl(FILE *f, type_t *t, const char *name); extern void write_type_decl_left(FILE *f, type_t *t); extern int needs_space_after(type_t *t); -extern int is_object(const attr_list_t *list); +extern int is_object(const type_t *iface); extern int is_local(const attr_list_t *list); extern int need_stub(const type_t *iface); extern int need_proxy(const type_t *iface); diff --git a/reactos/tools/widl/parser.h b/reactos/tools/widl/parser.h index 71f08dc994a..1bcc3c182f2 100644 --- a/reactos/tools/widl/parser.h +++ b/reactos/tools/widl/parser.h @@ -45,4 +45,6 @@ void pop_import(void); int is_type(const char *name); +extern char *temp_name; + #endif diff --git a/reactos/tools/widl/parser.l b/reactos/tools/widl/parser.l index f509cb19eae..0d231fc7885 100644 --- a/reactos/tools/widl/parser.l +++ b/reactos/tools/widl/parser.l @@ -37,6 +37,7 @@ double [0-9]+\.[0-9]+([eE][+-]?[0-9]+)* %x WSTRQUOTE %x ATTR %x PP_LINE +%x SQUOTE %{ @@ -63,8 +64,6 @@ double [0-9]+\.[0-9]+([eE][+-]?[0-9]+)* #include "parser.tab.h" -extern char *temp_name; - static void addcchar(char c); static char *get_buffered_cstring(void); @@ -157,10 +156,17 @@ UUID *parse_uuid(const char *u) parser_lval.str = get_buffered_cstring(); return aWSTRING; } -\\\\ | +\' yy_push_state(SQUOTE); cbufidx = 0; +\' { + yy_pop_state(); + parser_lval.str = get_buffered_cstring(); + return aSQSTRING; + } +\\\\ | \\\" addcchar(yytext[1]); -\\. addcchar('\\'); addcchar(yytext[1]); -. addcchar(yytext[0]); +\\\' addcchar(yytext[1]); +\\. addcchar('\\'); addcchar(yytext[1]); +. addcchar(yytext[0]); \[ yy_push_state(ATTR); return '['; \] yy_pop_state(); return ']'; {cident} return attr_token(yytext); diff --git a/reactos/tools/widl/parser.tab.c b/reactos/tools/widl/parser.tab.c index 198575fba90..8ed813de4cb 100644 --- a/reactos/tools/widl/parser.tab.c +++ b/reactos/tools/widl/parser.tab.c @@ -268,150 +268,151 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s aDOUBLE = 262, aSTRING = 263, aWSTRING = 264, - aUUID = 265, - aEOF = 266, - SHL = 267, - SHR = 268, - MEMBERPTR = 269, - EQUALITY = 270, - INEQUALITY = 271, - GREATEREQUAL = 272, - LESSEQUAL = 273, - LOGICALOR = 274, - LOGICALAND = 275, - ELLIPSIS = 276, - tAGGREGATABLE = 277, - tALLOCATE = 278, - tANNOTATION = 279, - tAPPOBJECT = 280, - tASYNC = 281, - tASYNCUUID = 282, - tAUTOHANDLE = 283, - tBINDABLE = 284, - tBOOLEAN = 285, - tBROADCAST = 286, - tBYTE = 287, - tBYTECOUNT = 288, - tCALLAS = 289, - tCALLBACK = 290, - tCASE = 291, - tCDECL = 292, - tCHAR = 293, - tCOCLASS = 294, - tCODE = 295, - tCOMMSTATUS = 296, - tCONST = 297, - tCONTEXTHANDLE = 298, - tCONTEXTHANDLENOSERIALIZE = 299, - tCONTEXTHANDLESERIALIZE = 300, - tCONTROL = 301, - tCPPQUOTE = 302, - tDEFAULT = 303, - tDEFAULTCOLLELEM = 304, - tDEFAULTVALUE = 305, - tDEFAULTVTABLE = 306, - tDISPLAYBIND = 307, - tDISPINTERFACE = 308, - tDLLNAME = 309, - tDOUBLE = 310, - tDUAL = 311, - tENDPOINT = 312, - tENTRY = 313, - tENUM = 314, - tERRORSTATUST = 315, - tEXPLICITHANDLE = 316, - tEXTERN = 317, - tFALSE = 318, - tFASTCALL = 319, - tFLOAT = 320, - tHANDLE = 321, - tHANDLET = 322, - tHELPCONTEXT = 323, - tHELPFILE = 324, - tHELPSTRING = 325, - tHELPSTRINGCONTEXT = 326, - tHELPSTRINGDLL = 327, - tHIDDEN = 328, - tHYPER = 329, - tID = 330, - tIDEMPOTENT = 331, - tIIDIS = 332, - tIMMEDIATEBIND = 333, - tIMPLICITHANDLE = 334, - tIMPORT = 335, - tIMPORTLIB = 336, - tIN = 337, - tIN_LINE = 338, - tINLINE = 339, - tINPUTSYNC = 340, - tINT = 341, - tINT3264 = 342, - tINT64 = 343, - tINTERFACE = 344, - tLCID = 345, - tLENGTHIS = 346, - tLIBRARY = 347, - tLOCAL = 348, - tLONG = 349, - tMETHODS = 350, - tMODULE = 351, - tNONBROWSABLE = 352, - tNONCREATABLE = 353, - tNONEXTENSIBLE = 354, - tNULL = 355, - tOBJECT = 356, - tODL = 357, - tOLEAUTOMATION = 358, - tOPTIONAL = 359, - tOUT = 360, - tPASCAL = 361, - tPOINTERDEFAULT = 362, - tPROPERTIES = 363, - tPROPGET = 364, - tPROPPUT = 365, - tPROPPUTREF = 366, - tPTR = 367, - tPUBLIC = 368, - tRANGE = 369, - tREADONLY = 370, - tREF = 371, - tREGISTER = 372, - tREQUESTEDIT = 373, - tRESTRICTED = 374, - tRETVAL = 375, - tSAFEARRAY = 376, - tSHORT = 377, - tSIGNED = 378, - tSIZEIS = 379, - tSIZEOF = 380, - tSMALL = 381, - tSOURCE = 382, - tSTATIC = 383, - tSTDCALL = 384, - tSTRICTCONTEXTHANDLE = 385, - tSTRING = 386, - tSTRUCT = 387, - tSWITCH = 388, - tSWITCHIS = 389, - tSWITCHTYPE = 390, - tTRANSMITAS = 391, - tTRUE = 392, - tTYPEDEF = 393, - tUNION = 394, - tUNIQUE = 395, - tUNSIGNED = 396, - tUUID = 397, - tV1ENUM = 398, - tVARARG = 399, - tVERSION = 400, - tVOID = 401, - tWCHAR = 402, - tWIREMARSHAL = 403, - ADDRESSOF = 404, - NEG = 405, - POS = 406, - PPTR = 407, - CAST = 408 + aSQSTRING = 265, + aUUID = 266, + aEOF = 267, + SHL = 268, + SHR = 269, + MEMBERPTR = 270, + EQUALITY = 271, + INEQUALITY = 272, + GREATEREQUAL = 273, + LESSEQUAL = 274, + LOGICALOR = 275, + LOGICALAND = 276, + ELLIPSIS = 277, + tAGGREGATABLE = 278, + tALLOCATE = 279, + tANNOTATION = 280, + tAPPOBJECT = 281, + tASYNC = 282, + tASYNCUUID = 283, + tAUTOHANDLE = 284, + tBINDABLE = 285, + tBOOLEAN = 286, + tBROADCAST = 287, + tBYTE = 288, + tBYTECOUNT = 289, + tCALLAS = 290, + tCALLBACK = 291, + tCASE = 292, + tCDECL = 293, + tCHAR = 294, + tCOCLASS = 295, + tCODE = 296, + tCOMMSTATUS = 297, + tCONST = 298, + tCONTEXTHANDLE = 299, + tCONTEXTHANDLENOSERIALIZE = 300, + tCONTEXTHANDLESERIALIZE = 301, + tCONTROL = 302, + tCPPQUOTE = 303, + tDEFAULT = 304, + tDEFAULTCOLLELEM = 305, + tDEFAULTVALUE = 306, + tDEFAULTVTABLE = 307, + tDISPLAYBIND = 308, + tDISPINTERFACE = 309, + tDLLNAME = 310, + tDOUBLE = 311, + tDUAL = 312, + tENDPOINT = 313, + tENTRY = 314, + tENUM = 315, + tERRORSTATUST = 316, + tEXPLICITHANDLE = 317, + tEXTERN = 318, + tFALSE = 319, + tFASTCALL = 320, + tFLOAT = 321, + tHANDLE = 322, + tHANDLET = 323, + tHELPCONTEXT = 324, + tHELPFILE = 325, + tHELPSTRING = 326, + tHELPSTRINGCONTEXT = 327, + tHELPSTRINGDLL = 328, + tHIDDEN = 329, + tHYPER = 330, + tID = 331, + tIDEMPOTENT = 332, + tIIDIS = 333, + tIMMEDIATEBIND = 334, + tIMPLICITHANDLE = 335, + tIMPORT = 336, + tIMPORTLIB = 337, + tIN = 338, + tIN_LINE = 339, + tINLINE = 340, + tINPUTSYNC = 341, + tINT = 342, + tINT3264 = 343, + tINT64 = 344, + tINTERFACE = 345, + tLCID = 346, + tLENGTHIS = 347, + tLIBRARY = 348, + tLOCAL = 349, + tLONG = 350, + tMETHODS = 351, + tMODULE = 352, + tNONBROWSABLE = 353, + tNONCREATABLE = 354, + tNONEXTENSIBLE = 355, + tNULL = 356, + tOBJECT = 357, + tODL = 358, + tOLEAUTOMATION = 359, + tOPTIONAL = 360, + tOUT = 361, + tPASCAL = 362, + tPOINTERDEFAULT = 363, + tPROPERTIES = 364, + tPROPGET = 365, + tPROPPUT = 366, + tPROPPUTREF = 367, + tPTR = 368, + tPUBLIC = 369, + tRANGE = 370, + tREADONLY = 371, + tREF = 372, + tREGISTER = 373, + tREQUESTEDIT = 374, + tRESTRICTED = 375, + tRETVAL = 376, + tSAFEARRAY = 377, + tSHORT = 378, + tSIGNED = 379, + tSIZEIS = 380, + tSIZEOF = 381, + tSMALL = 382, + tSOURCE = 383, + tSTATIC = 384, + tSTDCALL = 385, + tSTRICTCONTEXTHANDLE = 386, + tSTRING = 387, + tSTRUCT = 388, + tSWITCH = 389, + tSWITCHIS = 390, + tSWITCHTYPE = 391, + tTRANSMITAS = 392, + tTRUE = 393, + tTYPEDEF = 394, + tUNION = 395, + tUNIQUE = 396, + tUNSIGNED = 397, + tUUID = 398, + tV1ENUM = 399, + tVARARG = 400, + tVERSION = 401, + tVOID = 402, + tWCHAR = 403, + tWIREMARSHAL = 404, + ADDRESSOF = 405, + NEG = 406, + POS = 407, + PPTR = 408, + CAST = 409 }; #endif @@ -454,7 +455,7 @@ typedef union YYSTYPE /* Line 214 of yacc.c */ -#line 458 "parser.tab.c" +#line 459 "parser.tab.c" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -466,7 +467,7 @@ typedef union YYSTYPE /* Line 264 of yacc.c */ -#line 470 "parser.tab.c" +#line 471 "parser.tab.c" #ifdef short # undef short @@ -681,20 +682,20 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 2392 +#define YYLAST 2343 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 178 +#define YYNTOKENS 179 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 99 /* YYNRULES -- Number of rules. */ -#define YYNRULES 344 +#define YYNRULES 345 /* YYNRULES -- Number of states. */ -#define YYNSTATES 606 +#define YYNSTATES 607 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 -#define YYMAXUTOK 408 +#define YYMAXUTOK 409 #define YYTRANSLATE(YYX) \ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) @@ -705,16 +706,16 @@ static const yytype_uint8 yytranslate[] = 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 162, 2, 2, 2, 161, 154, 2, - 173, 174, 159, 158, 149, 157, 169, 160, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 151, 172, - 155, 177, 156, 150, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 163, 2, 2, 2, 162, 155, 2, + 174, 175, 160, 159, 150, 158, 170, 161, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 152, 173, + 156, 178, 157, 151, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 170, 2, 171, 153, 2, 2, 2, 2, 2, + 2, 171, 2, 172, 154, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 175, 152, 176, 163, 2, 2, 2, + 2, 2, 2, 176, 153, 177, 164, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -742,7 +743,7 @@ static const yytype_uint8 yytranslate[] = 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 164, 165, 166, 167, 168 + 145, 146, 147, 148, 149, 165, 166, 167, 168, 169 }; #if YYDEBUG @@ -766,135 +767,135 @@ static const yytype_uint16 yyprhs[] = 388, 393, 398, 400, 402, 404, 406, 408, 410, 412, 413, 416, 421, 425, 426, 429, 431, 433, 437, 441, 443, 449, 451, 455, 456, 458, 460, 462, 464, 466, - 468, 470, 472, 474, 476, 482, 486, 490, 494, 498, - 502, 506, 510, 514, 518, 522, 526, 530, 534, 538, - 542, 546, 550, 554, 557, 560, 563, 566, 569, 572, - 576, 580, 586, 592, 597, 601, 603, 607, 609, 611, - 612, 615, 620, 624, 627, 630, 631, 634, 637, 639, - 643, 647, 651, 654, 655, 657, 658, 660, 662, 664, - 666, 668, 670, 672, 675, 678, 680, 682, 684, 686, - 688, 690, 691, 693, 695, 698, 700, 703, 706, 708, - 710, 712, 715, 718, 721, 727, 728, 731, 734, 737, - 740, 743, 746, 750, 753, 757, 763, 769, 770, 773, - 776, 779, 782, 789, 798, 801, 804, 807, 810, 813, - 816, 822, 824, 826, 828, 830, 832, 833, 836, 839, - 843, 844, 846, 849, 852, 855, 859, 862, 864, 866, - 870, 873, 878, 882, 885, 887, 891, 894, 895, 897, - 901, 904, 906, 910, 915, 919, 922, 924, 928, 931, - 932, 934, 936, 940, 943, 945, 949, 954, 956, 960, - 961, 964, 967, 969, 973, 975, 979, 981, 983, 985, - 991, 993, 995, 997, 999, 1002, 1004, 1007, 1009, 1012, - 1017, 1022, 1028, 1039, 1041 + 468, 470, 472, 474, 476, 478, 484, 488, 492, 496, + 500, 504, 508, 512, 516, 520, 524, 528, 532, 536, + 540, 544, 548, 552, 556, 559, 562, 565, 568, 571, + 574, 578, 582, 588, 594, 599, 603, 605, 609, 611, + 613, 614, 617, 622, 626, 629, 632, 633, 636, 639, + 641, 645, 649, 653, 656, 657, 659, 660, 662, 664, + 666, 668, 670, 672, 674, 677, 680, 682, 684, 686, + 688, 690, 692, 693, 695, 697, 700, 702, 705, 708, + 710, 712, 714, 717, 720, 723, 729, 730, 733, 736, + 739, 742, 745, 748, 752, 755, 759, 765, 771, 772, + 775, 778, 781, 784, 791, 800, 803, 806, 809, 812, + 815, 818, 824, 826, 828, 830, 832, 834, 835, 838, + 841, 845, 846, 848, 851, 854, 857, 861, 864, 866, + 868, 872, 875, 880, 884, 887, 889, 893, 896, 897, + 899, 903, 906, 908, 912, 917, 921, 924, 926, 930, + 933, 934, 936, 938, 942, 945, 947, 951, 956, 958, + 962, 963, 966, 969, 971, 975, 977, 981, 983, 985, + 987, 993, 995, 997, 999, 1001, 1004, 1006, 1009, 1011, + 1014, 1019, 1024, 1030, 1041, 1043 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ static const yytype_int16 yyrhs[] = { - 179, 0, -1, 180, -1, -1, 180, 245, -1, 180, - 244, -1, 180, 231, 172, -1, 180, 233, -1, 180, - 248, -1, 180, 192, -1, 180, 184, -1, -1, 181, - 245, -1, 181, 244, -1, 181, 231, 172, -1, 181, - 233, -1, 181, 248, -1, 181, 184, -1, 181, 189, - -1, 181, 192, -1, -1, 182, 184, -1, -1, 172, - -1, 186, -1, 185, 172, -1, 224, 172, -1, 188, - -1, 274, 172, -1, 210, -1, 272, -1, 275, -1, - 199, 210, -1, 199, 272, -1, 199, 275, -1, 47, - 173, 8, 174, -1, 80, 8, 172, -1, 187, 181, - 11, -1, 81, 173, 8, 174, 183, -1, 92, 3, - -1, 199, 190, 175, -1, 191, 181, 176, 183, -1, - -1, 195, -1, 196, -1, 194, 149, 196, -1, 194, - -1, 194, 149, 21, -1, 199, 253, 264, -1, 253, - 264, -1, 170, 212, 171, -1, 170, 159, 171, -1, - -1, 199, -1, 170, 200, 171, -1, 202, -1, 200, - 149, 202, -1, 200, 171, 170, 202, -1, 8, -1, - 201, 149, 8, -1, -1, 22, -1, 24, 173, 8, - 174, -1, 25, -1, 26, -1, 28, -1, 29, -1, - 31, -1, 34, 173, 227, 174, -1, 36, 173, 214, - 174, -1, 43, -1, 44, -1, 45, -1, 46, -1, - 48, -1, 49, -1, 50, 173, 216, 174, -1, 51, - -1, 52, -1, 54, 173, 8, 174, -1, 56, -1, - 57, 173, 201, 174, -1, 58, 173, 216, 174, -1, - 61, -1, 66, -1, 68, 173, 215, 174, -1, 69, - 173, 8, 174, -1, 70, 173, 8, 174, -1, 71, - 173, 215, 174, -1, 72, 173, 8, 174, -1, 73, - -1, 75, 173, 215, 174, -1, 76, -1, 77, 173, - 213, 174, -1, 78, -1, 79, 173, 67, 3, 174, - -1, 82, -1, 85, -1, 91, 173, 211, 174, -1, - 90, 173, 215, 174, -1, 90, -1, 93, -1, 97, - -1, 98, -1, 99, -1, 101, -1, 102, -1, 103, - -1, 104, -1, 105, -1, 107, 173, 271, 174, -1, - 109, -1, 110, -1, 111, -1, 113, -1, 114, 173, - 215, 149, 215, 174, -1, 115, -1, 118, -1, 119, - -1, 120, -1, 124, 173, 211, 174, -1, 127, -1, - 130, -1, 131, -1, 134, 173, 213, 174, -1, 135, - 173, 273, 174, -1, 136, 173, 273, 174, -1, 142, - 173, 203, 174, -1, 143, -1, 144, -1, 145, 173, - 276, 174, -1, 148, 173, 273, 174, -1, 271, -1, - 10, -1, 8, -1, 37, -1, 64, -1, 106, -1, - 129, -1, -1, 205, 206, -1, 36, 215, 151, 221, - -1, 48, 151, 221, -1, -1, 208, 149, -1, 208, - -1, 209, -1, 208, 149, 209, -1, 227, 177, 215, - -1, 227, -1, 59, 226, 175, 207, 176, -1, 212, - -1, 211, 149, 212, -1, -1, 213, -1, 5, -1, - 6, -1, 7, -1, 63, -1, 100, -1, 137, -1, - 8, -1, 9, -1, 3, -1, 213, 150, 213, 151, - 213, -1, 213, 19, 213, -1, 213, 20, 213, -1, - 213, 152, 213, -1, 213, 153, 213, -1, 213, 154, - 213, -1, 213, 15, 213, -1, 213, 16, 213, -1, - 213, 156, 213, -1, 213, 155, 213, -1, 213, 17, - 213, -1, 213, 18, 213, -1, 213, 12, 213, -1, - 213, 13, 213, -1, 213, 158, 213, -1, 213, 157, - 213, -1, 213, 161, 213, -1, 213, 159, 213, -1, - 213, 160, 213, -1, 162, 213, -1, 163, 213, -1, - 158, 213, -1, 157, 213, -1, 154, 213, -1, 159, - 213, -1, 213, 14, 3, -1, 213, 169, 3, -1, - 173, 253, 260, 174, 213, -1, 125, 173, 253, 260, - 174, -1, 213, 170, 213, 171, -1, 173, 213, 174, - -1, 215, -1, 214, 149, 215, -1, 213, -1, 213, - -1, -1, 217, 218, -1, 198, 253, 269, 172, -1, - 198, 275, 172, -1, 222, 172, -1, 199, 172, -1, - -1, 220, 219, -1, 222, 172, -1, 172, -1, 198, - 253, 256, -1, 198, 253, 256, -1, 199, 253, 270, - -1, 253, 270, -1, -1, 227, -1, -1, 3, -1, - 4, -1, 3, -1, 4, -1, 32, -1, 147, -1, - 230, -1, 123, 230, -1, 141, 230, -1, 141, -1, - 65, -1, 55, -1, 30, -1, 60, -1, 67, -1, - -1, 86, -1, 86, -1, 122, 229, -1, 126, -1, - 94, 229, -1, 74, 229, -1, 88, -1, 38, -1, - 87, -1, 39, 3, -1, 39, 4, -1, 199, 231, - -1, 232, 175, 234, 176, 183, -1, -1, 234, 235, - -1, 198, 245, -1, 53, 3, -1, 53, 4, -1, - 199, 236, -1, 108, 151, -1, 238, 222, 172, -1, - 95, 151, -1, 239, 223, 172, -1, 237, 175, 238, - 239, 176, -1, 237, 175, 242, 172, 176, -1, -1, - 151, 4, -1, 89, 3, -1, 89, 4, -1, 199, - 242, -1, 243, 241, 175, 182, 176, 183, -1, 243, - 151, 3, 175, 188, 182, 176, 183, -1, 240, 183, - -1, 242, 172, -1, 236, 172, -1, 96, 3, -1, - 96, 4, -1, 199, 246, -1, 247, 175, 182, 176, - 183, -1, 62, -1, 128, -1, 117, -1, 84, -1, - 42, -1, -1, 252, 251, -1, 273, 254, -1, 255, - 273, 254, -1, -1, 255, -1, 251, 254, -1, 250, - 254, -1, 249, 254, -1, 159, 252, 256, -1, 204, - 256, -1, 257, -1, 227, -1, 173, 256, 174, -1, - 257, 197, -1, 257, 173, 193, 174, -1, 159, 252, - 260, -1, 204, 260, -1, 261, -1, 159, 252, 264, - -1, 204, 264, -1, -1, 258, -1, 173, 259, 174, - -1, 261, 197, -1, 197, -1, 173, 193, 174, -1, - 261, 173, 193, 174, -1, 159, 252, 264, -1, 204, - 264, -1, 265, -1, 159, 252, 264, -1, 204, 264, - -1, -1, 262, -1, 227, -1, 173, 263, 174, -1, - 265, 197, -1, 197, -1, 173, 193, 174, -1, 265, - 173, 193, 174, -1, 256, -1, 266, 149, 256, -1, - -1, 151, 216, -1, 262, 267, -1, 268, -1, 269, - 149, 268, -1, 256, -1, 256, 177, 216, -1, 116, - -1, 140, -1, 112, -1, 132, 226, 175, 217, 176, - -1, 146, -1, 4, -1, 228, -1, 210, -1, 59, - 3, -1, 272, -1, 132, 3, -1, 275, -1, 139, - 3, -1, 121, 173, 273, 174, -1, 138, 198, 253, - 266, -1, 139, 226, 175, 220, 176, -1, 139, 226, - 133, 173, 222, 174, 225, 175, 205, 176, -1, 5, - -1, 5, 169, 5, -1 + 180, 0, -1, 181, -1, -1, 181, 246, -1, 181, + 245, -1, 181, 232, 173, -1, 181, 234, -1, 181, + 249, -1, 181, 193, -1, 181, 185, -1, -1, 182, + 246, -1, 182, 245, -1, 182, 232, 173, -1, 182, + 234, -1, 182, 249, -1, 182, 185, -1, 182, 190, + -1, 182, 193, -1, -1, 183, 185, -1, -1, 173, + -1, 187, -1, 186, 173, -1, 225, 173, -1, 189, + -1, 275, 173, -1, 211, -1, 273, -1, 276, -1, + 200, 211, -1, 200, 273, -1, 200, 276, -1, 48, + 174, 8, 175, -1, 81, 8, 173, -1, 188, 182, + 12, -1, 82, 174, 8, 175, 184, -1, 93, 3, + -1, 200, 191, 176, -1, 192, 182, 177, 184, -1, + -1, 196, -1, 197, -1, 195, 150, 197, -1, 195, + -1, 195, 150, 22, -1, 200, 254, 265, -1, 254, + 265, -1, 171, 213, 172, -1, 171, 160, 172, -1, + -1, 200, -1, 171, 201, 172, -1, 203, -1, 201, + 150, 203, -1, 201, 172, 171, 203, -1, 8, -1, + 202, 150, 8, -1, -1, 23, -1, 25, 174, 8, + 175, -1, 26, -1, 27, -1, 29, -1, 30, -1, + 32, -1, 35, 174, 228, 175, -1, 37, 174, 215, + 175, -1, 44, -1, 45, -1, 46, -1, 47, -1, + 49, -1, 50, -1, 51, 174, 217, 175, -1, 52, + -1, 53, -1, 55, 174, 8, 175, -1, 57, -1, + 58, 174, 202, 175, -1, 59, 174, 217, 175, -1, + 62, -1, 67, -1, 69, 174, 216, 175, -1, 70, + 174, 8, 175, -1, 71, 174, 8, 175, -1, 72, + 174, 216, 175, -1, 73, 174, 8, 175, -1, 74, + -1, 76, 174, 216, 175, -1, 77, -1, 78, 174, + 214, 175, -1, 79, -1, 80, 174, 68, 3, 175, + -1, 83, -1, 86, -1, 92, 174, 212, 175, -1, + 91, 174, 216, 175, -1, 91, -1, 94, -1, 98, + -1, 99, -1, 100, -1, 102, -1, 103, -1, 104, + -1, 105, -1, 106, -1, 108, 174, 272, 175, -1, + 110, -1, 111, -1, 112, -1, 114, -1, 115, 174, + 216, 150, 216, 175, -1, 116, -1, 119, -1, 120, + -1, 121, -1, 125, 174, 212, 175, -1, 128, -1, + 131, -1, 132, -1, 135, 174, 214, 175, -1, 136, + 174, 274, 175, -1, 137, 174, 274, 175, -1, 143, + 174, 204, 175, -1, 144, -1, 145, -1, 146, 174, + 277, 175, -1, 149, 174, 274, 175, -1, 272, -1, + 11, -1, 8, -1, 38, -1, 65, -1, 107, -1, + 130, -1, -1, 206, 207, -1, 37, 216, 152, 222, + -1, 49, 152, 222, -1, -1, 209, 150, -1, 209, + -1, 210, -1, 209, 150, 210, -1, 228, 178, 216, + -1, 228, -1, 60, 227, 176, 208, 177, -1, 213, + -1, 212, 150, 213, -1, -1, 214, -1, 5, -1, + 6, -1, 7, -1, 64, -1, 101, -1, 138, -1, + 8, -1, 9, -1, 10, -1, 3, -1, 214, 151, + 214, 152, 214, -1, 214, 20, 214, -1, 214, 21, + 214, -1, 214, 153, 214, -1, 214, 154, 214, -1, + 214, 155, 214, -1, 214, 16, 214, -1, 214, 17, + 214, -1, 214, 157, 214, -1, 214, 156, 214, -1, + 214, 18, 214, -1, 214, 19, 214, -1, 214, 13, + 214, -1, 214, 14, 214, -1, 214, 159, 214, -1, + 214, 158, 214, -1, 214, 162, 214, -1, 214, 160, + 214, -1, 214, 161, 214, -1, 163, 214, -1, 164, + 214, -1, 159, 214, -1, 158, 214, -1, 155, 214, + -1, 160, 214, -1, 214, 15, 3, -1, 214, 170, + 3, -1, 174, 254, 261, 175, 214, -1, 126, 174, + 254, 261, 175, -1, 214, 171, 214, 172, -1, 174, + 214, 175, -1, 216, -1, 215, 150, 216, -1, 214, + -1, 214, -1, -1, 218, 219, -1, 199, 254, 270, + 173, -1, 199, 276, 173, -1, 223, 173, -1, 200, + 173, -1, -1, 221, 220, -1, 223, 173, -1, 173, + -1, 199, 254, 257, -1, 199, 254, 257, -1, 200, + 254, 271, -1, 254, 271, -1, -1, 228, -1, -1, + 3, -1, 4, -1, 3, -1, 4, -1, 33, -1, + 148, -1, 231, -1, 124, 231, -1, 142, 231, -1, + 142, -1, 66, -1, 56, -1, 31, -1, 61, -1, + 68, -1, -1, 87, -1, 87, -1, 123, 230, -1, + 127, -1, 95, 230, -1, 75, 230, -1, 89, -1, + 39, -1, 88, -1, 40, 3, -1, 40, 4, -1, + 200, 232, -1, 233, 176, 235, 177, 184, -1, -1, + 235, 236, -1, 199, 246, -1, 54, 3, -1, 54, + 4, -1, 200, 237, -1, 109, 152, -1, 239, 223, + 173, -1, 96, 152, -1, 240, 224, 173, -1, 238, + 176, 239, 240, 177, -1, 238, 176, 243, 173, 177, + -1, -1, 152, 4, -1, 90, 3, -1, 90, 4, + -1, 200, 243, -1, 244, 242, 176, 183, 177, 184, + -1, 244, 152, 3, 176, 189, 183, 177, 184, -1, + 241, 184, -1, 243, 173, -1, 237, 173, -1, 97, + 3, -1, 97, 4, -1, 200, 247, -1, 248, 176, + 183, 177, 184, -1, 63, -1, 129, -1, 118, -1, + 85, -1, 43, -1, -1, 253, 252, -1, 274, 255, + -1, 256, 274, 255, -1, -1, 256, -1, 252, 255, + -1, 251, 255, -1, 250, 255, -1, 160, 253, 257, + -1, 205, 257, -1, 258, -1, 228, -1, 174, 257, + 175, -1, 258, 198, -1, 258, 174, 194, 175, -1, + 160, 253, 261, -1, 205, 261, -1, 262, -1, 160, + 253, 265, -1, 205, 265, -1, -1, 259, -1, 174, + 260, 175, -1, 262, 198, -1, 198, -1, 174, 194, + 175, -1, 262, 174, 194, 175, -1, 160, 253, 265, + -1, 205, 265, -1, 266, -1, 160, 253, 265, -1, + 205, 265, -1, -1, 263, -1, 228, -1, 174, 264, + 175, -1, 266, 198, -1, 198, -1, 174, 194, 175, + -1, 266, 174, 194, 175, -1, 257, -1, 267, 150, + 257, -1, -1, 152, 217, -1, 263, 268, -1, 269, + -1, 270, 150, 269, -1, 257, -1, 257, 178, 217, + -1, 117, -1, 141, -1, 113, -1, 133, 227, 176, + 218, 177, -1, 147, -1, 4, -1, 229, -1, 211, + -1, 60, 3, -1, 273, -1, 133, 3, -1, 276, + -1, 140, 3, -1, 122, 174, 274, 175, -1, 139, + 199, 254, 267, -1, 140, 227, 176, 221, 177, -1, + 140, 227, 134, 174, 223, 175, 226, 176, 206, 177, + -1, 5, -1, 5, 170, 5, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ @@ -919,22 +920,22 @@ static const yytype_uint16 yyrline[] = 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, - 662, 663, 665, 667, 668, 671, 672, 675, 681, 687, - 688, 691, 696, 703, 704, 707, 708, 712, 713, 716, - 723, 732, 736, 741, 742, 745, 746, 747, 750, 752, - 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, - 765, 768, 769, 772, 773, 774, 775, 776, 777, 778, - 779, 782, 783, 791, 797, 801, 802, 806, 809, 810, - 813, 823, 824, 827, 828, 831, 837, 843, 844, 847, - 848, 851, 862, 869, 875, 879, 880, 883, 884, 887, - 892, 899, 900, 901, 905, 909, 912, 913, 916, 917, - 921, 922, 926, 927, 928, 932, 934, 935, 939, 940, - 941, 942, 950, 952, 953, 958, 960, 964, 965, 970, - 971, 972, 973, 978, 987, 989, 990, 995, 997, 1001, - 1002, 1009, 1010, 1011, 1012, 1013, 1018, 1026, 1027, 1030, - 1031, 1034, 1041, 1042, 1047, 1048, 1052, 1053, 1054, 1057, - 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, - 1072, 1078, 1080, 1086, 1087 + 662, 663, 664, 666, 668, 669, 672, 673, 676, 682, + 688, 689, 692, 697, 704, 705, 708, 709, 713, 714, + 717, 724, 733, 737, 742, 743, 746, 747, 748, 751, + 753, 756, 757, 758, 759, 760, 761, 762, 763, 764, + 765, 766, 769, 770, 773, 774, 775, 776, 777, 778, + 779, 780, 783, 784, 792, 798, 802, 803, 807, 810, + 811, 814, 824, 825, 828, 829, 832, 838, 844, 845, + 848, 849, 852, 863, 870, 876, 880, 881, 884, 885, + 888, 893, 900, 901, 902, 906, 910, 913, 914, 917, + 918, 922, 923, 927, 928, 929, 933, 935, 936, 940, + 941, 942, 943, 951, 953, 954, 959, 961, 965, 966, + 971, 972, 973, 974, 979, 988, 990, 991, 996, 998, + 1002, 1003, 1010, 1011, 1012, 1013, 1014, 1019, 1027, 1028, + 1031, 1032, 1035, 1042, 1043, 1048, 1049, 1053, 1054, 1055, + 1058, 1061, 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, + 1070, 1073, 1079, 1081, 1087, 1088 }; #endif @@ -944,13 +945,13 @@ static const yytype_uint16 yyrline[] = static const char *const yytname[] = { "$end", "error", "$undefined", "aIDENTIFIER", "aKNOWNTYPE", "aNUM", - "aHEXNUM", "aDOUBLE", "aSTRING", "aWSTRING", "aUUID", "aEOF", "SHL", - "SHR", "MEMBERPTR", "EQUALITY", "INEQUALITY", "GREATEREQUAL", - "LESSEQUAL", "LOGICALOR", "LOGICALAND", "ELLIPSIS", "tAGGREGATABLE", - "tALLOCATE", "tANNOTATION", "tAPPOBJECT", "tASYNC", "tASYNCUUID", - "tAUTOHANDLE", "tBINDABLE", "tBOOLEAN", "tBROADCAST", "tBYTE", - "tBYTECOUNT", "tCALLAS", "tCALLBACK", "tCASE", "tCDECL", "tCHAR", - "tCOCLASS", "tCODE", "tCOMMSTATUS", "tCONST", "tCONTEXTHANDLE", + "aHEXNUM", "aDOUBLE", "aSTRING", "aWSTRING", "aSQSTRING", "aUUID", + "aEOF", "SHL", "SHR", "MEMBERPTR", "EQUALITY", "INEQUALITY", + "GREATEREQUAL", "LESSEQUAL", "LOGICALOR", "LOGICALAND", "ELLIPSIS", + "tAGGREGATABLE", "tALLOCATE", "tANNOTATION", "tAPPOBJECT", "tASYNC", + "tASYNCUUID", "tAUTOHANDLE", "tBINDABLE", "tBOOLEAN", "tBROADCAST", + "tBYTE", "tBYTECOUNT", "tCALLAS", "tCALLBACK", "tCASE", "tCDECL", + "tCHAR", "tCOCLASS", "tCODE", "tCOMMSTATUS", "tCONST", "tCONTEXTHANDLE", "tCONTEXTHANDLENOSERIALIZE", "tCONTEXTHANDLESERIALIZE", "tCONTROL", "tCPPQUOTE", "tDEFAULT", "tDEFAULTCOLLELEM", "tDEFAULTVALUE", "tDEFAULTVTABLE", "tDISPLAYBIND", "tDISPINTERFACE", "tDLLNAME", @@ -1019,51 +1020,51 @@ static const yytype_uint16 yytoknum[] = 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, - 395, 396, 397, 398, 399, 400, 401, 402, 403, 44, - 63, 58, 124, 94, 38, 60, 62, 45, 43, 42, - 47, 37, 33, 126, 404, 405, 406, 407, 408, 46, - 91, 93, 59, 40, 41, 123, 125, 61 + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 44, 63, 58, 124, 94, 38, 60, 62, 45, 43, + 42, 47, 37, 33, 126, 405, 406, 407, 408, 409, + 46, 91, 93, 59, 40, 41, 123, 125, 61 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ static const yytype_uint16 yyr1[] = { - 0, 178, 179, 180, 180, 180, 180, 180, 180, 180, - 180, 181, 181, 181, 181, 181, 181, 181, 181, 181, - 182, 182, 183, 183, 184, 184, 184, 184, 184, 185, - 185, 185, 185, 185, 185, 186, 187, 188, 189, 190, - 191, 192, 193, 193, 194, 194, 195, 195, 196, 196, - 197, 197, 198, 198, 199, 200, 200, 200, 201, 201, - 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, - 202, 202, 202, 203, 203, 204, 204, 204, 204, 205, - 205, 206, 206, 207, 207, 207, 208, 208, 209, 209, - 210, 211, 211, 212, 212, 213, 213, 213, 213, 213, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 213, 213, 213, 213, 213, 214, 214, 215, 216, 217, - 217, 218, 218, 219, 219, 220, 220, 221, 221, 222, - 223, 224, 224, 225, 225, 226, 226, 226, 227, 227, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, - 228, 229, 229, 230, 230, 230, 230, 230, 230, 230, - 230, 231, 231, 232, 233, 234, 234, 235, 236, 236, - 237, 238, 238, 239, 239, 240, 240, 241, 241, 242, - 242, 243, 244, 244, 244, 245, 245, 246, 246, 247, - 248, 249, 249, 249, 250, 251, 252, 252, 253, 253, - 254, 254, 255, 255, 255, 256, 256, 256, 257, 257, - 257, 257, 258, 258, 258, 259, 259, 260, 260, 261, - 261, 261, 261, 261, 262, 262, 262, 263, 263, 264, - 264, 265, 265, 265, 265, 265, 265, 266, 266, 267, - 267, 268, 269, 269, 270, 270, 271, 271, 271, 272, - 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, - 274, 275, 275, 276, 276 + 0, 179, 180, 181, 181, 181, 181, 181, 181, 181, + 181, 182, 182, 182, 182, 182, 182, 182, 182, 182, + 183, 183, 184, 184, 185, 185, 185, 185, 185, 186, + 186, 186, 186, 186, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 194, 195, 195, 196, 196, 197, 197, + 198, 198, 199, 199, 200, 201, 201, 201, 202, 202, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 204, 204, 205, 205, 205, 205, 206, + 206, 207, 207, 208, 208, 208, 209, 209, 210, 210, + 211, 212, 212, 213, 213, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 215, 215, 216, 217, + 218, 218, 219, 219, 220, 220, 221, 221, 222, 222, + 223, 224, 225, 225, 226, 226, 227, 227, 227, 228, + 228, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 229, 229, 230, 230, 231, 231, 231, 231, 231, 231, + 231, 231, 232, 232, 233, 234, 235, 235, 236, 237, + 237, 238, 239, 239, 240, 240, 241, 241, 242, 242, + 243, 243, 244, 245, 245, 245, 246, 246, 247, 247, + 248, 249, 250, 250, 250, 251, 252, 253, 253, 254, + 254, 255, 255, 256, 256, 256, 257, 257, 257, 258, + 258, 258, 258, 259, 259, 259, 260, 260, 261, 261, + 262, 262, 262, 262, 262, 263, 263, 263, 264, 264, + 265, 265, 266, 266, 266, 266, 266, 266, 267, 267, + 268, 268, 269, 270, 270, 271, 271, 272, 272, 272, + 273, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 275, 276, 276, 277, 277 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -1085,25 +1086,25 @@ static const yytype_uint8 yyr2[] = 4, 4, 1, 1, 1, 1, 1, 1, 1, 0, 2, 4, 3, 0, 2, 1, 1, 3, 3, 1, 5, 1, 3, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 5, 3, 3, 3, 3, 3, + 1, 1, 1, 1, 1, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 2, 2, 2, 2, 3, - 3, 5, 5, 4, 3, 1, 3, 1, 1, 0, - 2, 4, 3, 2, 2, 0, 2, 2, 1, 3, - 3, 3, 2, 0, 1, 0, 1, 1, 1, 1, - 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, - 1, 0, 1, 1, 2, 1, 2, 2, 1, 1, - 1, 2, 2, 2, 5, 0, 2, 2, 2, 2, - 2, 2, 3, 2, 3, 5, 5, 0, 2, 2, - 2, 2, 6, 8, 2, 2, 2, 2, 2, 2, - 5, 1, 1, 1, 1, 1, 0, 2, 2, 3, - 0, 1, 2, 2, 2, 3, 2, 1, 1, 3, - 2, 4, 3, 2, 1, 3, 2, 0, 1, 3, - 2, 1, 3, 4, 3, 2, 1, 3, 2, 0, - 1, 1, 3, 2, 1, 3, 4, 1, 3, 0, - 2, 2, 1, 3, 1, 3, 1, 1, 1, 5, - 1, 1, 1, 1, 2, 1, 2, 1, 2, 4, - 4, 5, 10, 1, 3 + 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, + 3, 3, 5, 5, 4, 3, 1, 3, 1, 1, + 0, 2, 4, 3, 2, 2, 0, 2, 2, 1, + 3, 3, 3, 2, 0, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 2, 1, 2, 2, 1, + 1, 1, 2, 2, 2, 5, 0, 2, 2, 2, + 2, 2, 2, 3, 2, 3, 5, 5, 0, 2, + 2, 2, 2, 6, 8, 2, 2, 2, 2, 2, + 2, 5, 1, 1, 1, 1, 1, 0, 2, 2, + 3, 0, 1, 2, 2, 2, 3, 2, 1, 1, + 3, 2, 4, 3, 2, 1, 3, 2, 0, 1, + 3, 2, 1, 3, 4, 3, 2, 1, 3, 2, + 0, 1, 1, 3, 2, 1, 3, 4, 1, 3, + 0, 2, 2, 1, 3, 1, 3, 1, 1, 1, + 5, 1, 1, 1, 1, 2, 1, 2, 1, 2, + 4, 4, 5, 10, 1, 3 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -1111,725 +1112,715 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint16 yydefact[] = { - 3, 0, 2, 1, 331, 228, 220, 239, 0, 275, - 0, 0, 227, 215, 229, 271, 226, 230, 231, 0, - 274, 233, 240, 238, 0, 231, 273, 0, 231, 0, - 235, 272, 215, 52, 215, 225, 330, 221, 60, 10, - 0, 24, 11, 27, 11, 9, 0, 333, 0, 332, - 222, 0, 0, 7, 0, 0, 22, 0, 257, 5, - 4, 0, 8, 280, 280, 280, 0, 0, 335, 280, - 0, 337, 241, 242, 0, 248, 249, 334, 217, 0, - 232, 237, 0, 259, 260, 236, 0, 234, 223, 336, - 0, 0, 53, 338, 0, 224, 61, 0, 63, 64, + 3, 0, 2, 1, 332, 229, 221, 240, 0, 276, + 0, 0, 228, 216, 230, 272, 227, 231, 232, 0, + 275, 234, 241, 239, 0, 232, 274, 0, 232, 0, + 236, 273, 216, 52, 216, 226, 331, 222, 60, 10, + 0, 24, 11, 27, 11, 9, 0, 334, 0, 333, + 223, 0, 0, 7, 0, 0, 22, 0, 258, 5, + 4, 0, 8, 281, 281, 281, 0, 0, 336, 281, + 0, 338, 242, 243, 0, 249, 250, 335, 218, 0, + 233, 238, 0, 260, 261, 237, 0, 235, 224, 337, + 0, 0, 53, 339, 0, 225, 61, 0, 63, 64, 65, 66, 67, 0, 0, 70, 71, 72, 73, 74, 75, 0, 77, 78, 0, 80, 0, 0, 83, 84, 0, 0, 0, 0, 0, 90, 0, 92, 0, 94, 0, 96, 97, 100, 0, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 0, 111, 112, 113, 328, 114, - 0, 116, 326, 117, 118, 119, 0, 121, 122, 123, - 0, 0, 0, 327, 0, 128, 129, 0, 0, 0, - 55, 132, 25, 0, 0, 0, 0, 0, 333, 243, - 250, 261, 269, 0, 335, 337, 26, 6, 245, 266, - 0, 23, 264, 265, 0, 0, 20, 284, 281, 283, - 282, 218, 219, 135, 136, 137, 138, 276, 0, 0, - 288, 324, 287, 212, 333, 335, 280, 337, 278, 28, - 0, 143, 36, 0, 199, 0, 0, 205, 0, 0, + 106, 107, 108, 109, 0, 111, 112, 113, 329, 114, + 0, 116, 327, 117, 118, 119, 0, 121, 122, 123, + 0, 0, 0, 328, 0, 128, 129, 0, 0, 0, + 55, 132, 25, 0, 0, 0, 0, 0, 334, 244, + 251, 262, 270, 0, 336, 338, 26, 6, 246, 267, + 0, 23, 265, 266, 0, 0, 20, 285, 282, 284, + 283, 219, 220, 135, 136, 137, 138, 277, 0, 0, + 289, 325, 288, 213, 334, 336, 281, 338, 279, 28, + 0, 143, 36, 0, 200, 0, 0, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 0, 0, 153, 0, 0, 0, 0, 0, 0, 60, 54, 37, 0, 17, 18, - 19, 0, 15, 13, 12, 16, 22, 39, 267, 268, - 40, 211, 52, 0, 52, 0, 0, 258, 20, 0, - 0, 0, 286, 0, 153, 42, 290, 279, 35, 0, - 145, 146, 149, 339, 52, 317, 340, 52, 52, 0, - 0, 163, 155, 156, 157, 161, 162, 158, 159, 0, - 160, 0, 0, 0, 0, 0, 0, 0, 197, 0, - 195, 198, 0, 0, 58, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 151, 154, 0, - 0, 0, 0, 0, 0, 134, 133, 0, 343, 0, - 0, 56, 60, 0, 14, 41, 22, 0, 246, 251, - 0, 0, 0, 52, 0, 0, 0, 22, 21, 0, - 277, 285, 289, 325, 0, 0, 0, 46, 43, 44, - 0, 309, 150, 144, 0, 329, 0, 200, 0, 0, - 341, 53, 206, 0, 62, 68, 0, 187, 186, 185, - 188, 183, 184, 0, 297, 0, 0, 0, 0, 0, + 19, 0, 15, 13, 12, 16, 22, 39, 268, 269, + 40, 212, 52, 0, 52, 0, 0, 259, 20, 0, + 0, 0, 287, 0, 153, 42, 291, 280, 35, 0, + 145, 146, 149, 340, 52, 318, 341, 52, 52, 0, + 0, 164, 155, 156, 157, 161, 162, 163, 158, 159, + 0, 160, 0, 0, 0, 0, 0, 0, 0, 198, + 0, 196, 199, 0, 0, 58, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 151, 154, + 0, 0, 0, 0, 0, 0, 134, 133, 0, 344, + 0, 0, 56, 60, 0, 14, 41, 22, 0, 247, + 252, 0, 0, 0, 52, 0, 0, 0, 22, 21, + 0, 278, 286, 290, 326, 0, 0, 0, 46, 43, + 44, 0, 310, 150, 144, 0, 330, 0, 201, 0, + 0, 342, 53, 207, 0, 62, 68, 0, 188, 187, + 186, 189, 184, 185, 0, 298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 69, 76, - 79, 0, 81, 82, 85, 86, 87, 88, 89, 91, - 93, 0, 99, 153, 98, 110, 0, 120, 124, 125, - 126, 127, 0, 130, 131, 57, 0, 244, 247, 253, - 0, 252, 255, 0, 0, 256, 20, 22, 270, 51, - 50, 291, 0, 309, 276, 42, 314, 309, 311, 310, - 49, 306, 147, 148, 0, 337, 318, 213, 204, 203, - 297, 194, 276, 42, 301, 297, 298, 0, 294, 176, - 177, 189, 170, 171, 174, 175, 165, 166, 0, 167, - 168, 169, 173, 172, 179, 178, 181, 182, 180, 190, - 0, 196, 59, 95, 152, 0, 344, 22, 209, 0, - 254, 0, 262, 47, 45, 48, 309, 276, 0, 309, - 0, 305, 42, 313, 319, 322, 0, 202, 0, 214, - 0, 297, 276, 0, 309, 0, 293, 0, 42, 300, - 0, 193, 115, 38, 210, 22, 304, 309, 315, 308, - 312, 0, 0, 321, 0, 201, 139, 192, 292, 309, - 302, 296, 299, 191, 0, 164, 263, 307, 316, 320, - 323, 0, 295, 303, 0, 0, 342, 140, 0, 52, - 52, 208, 142, 0, 141, 207 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, + 76, 79, 0, 81, 82, 85, 86, 87, 88, 89, + 91, 93, 0, 99, 153, 98, 110, 0, 120, 124, + 125, 126, 127, 0, 130, 131, 57, 0, 245, 248, + 254, 0, 253, 256, 0, 0, 257, 20, 22, 271, + 51, 50, 292, 0, 310, 277, 42, 315, 310, 312, + 311, 49, 307, 147, 148, 0, 338, 319, 214, 205, + 204, 298, 195, 277, 42, 302, 298, 299, 0, 295, + 177, 178, 190, 171, 172, 175, 176, 166, 167, 0, + 168, 169, 170, 174, 173, 180, 179, 182, 183, 181, + 191, 0, 197, 59, 95, 152, 0, 345, 22, 210, + 0, 255, 0, 263, 47, 45, 48, 310, 277, 0, + 310, 0, 306, 42, 314, 320, 323, 0, 203, 0, + 215, 0, 298, 277, 0, 310, 0, 294, 0, 42, + 301, 0, 194, 115, 38, 211, 22, 305, 310, 316, + 309, 313, 0, 0, 322, 0, 202, 139, 193, 293, + 310, 303, 297, 300, 192, 0, 165, 264, 308, 317, + 321, 324, 0, 296, 304, 0, 0, 343, 140, 0, + 52, 52, 209, 142, 0, 141, 208 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 1, 2, 173, 279, 192, 368, 40, 41, 42, - 43, 259, 177, 44, 260, 376, 377, 378, 379, 476, - 361, 92, 169, 325, 170, 347, 477, 591, 597, 289, - 290, 291, 214, 336, 337, 318, 319, 320, 322, 294, - 387, 392, 298, 602, 603, 464, 48, 548, 79, 478, - 49, 81, 50, 261, 52, 262, 272, 358, 54, 55, - 274, 363, 56, 195, 57, 58, 263, 264, 182, 61, + -1, 1, 2, 173, 279, 192, 369, 40, 41, 42, + 43, 259, 177, 44, 260, 377, 378, 379, 380, 477, + 362, 92, 169, 326, 170, 348, 478, 592, 598, 289, + 290, 291, 214, 337, 338, 319, 320, 321, 323, 294, + 388, 393, 298, 603, 604, 465, 48, 549, 79, 479, + 49, 81, 50, 261, 52, 262, 272, 359, 54, 55, + 274, 364, 56, 195, 57, 58, 263, 264, 182, 61, 265, 63, 64, 65, 280, 66, 197, 67, 211, 212, - 496, 555, 497, 498, 479, 540, 480, 481, 296, 573, - 545, 546, 213, 171, 215, 69, 70, 217, 349 + 497, 556, 498, 499, 480, 541, 481, 482, 296, 574, + 546, 547, 213, 171, 215, 69, 70, 217, 350 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -472 +#define YYPACT_NINF -459 static const yytype_int16 yypact[] = { - -472, 38, 1206, -472, -472, -472, -472, -472, 75, -472, - -86, 228, -472, 238, -472, -472, -472, -472, 28, 101, - -472, -472, -472, -472, 265, 28, -472, -23, 28, 408, - -472, -472, 271, -3, 287, 408, -472, -472, 2244, -472, - 25, -472, -472, -472, -472, -472, 1982, 34, 47, -472, - -472, 52, 54, -472, 73, 61, 106, 110, 62, -472, - -472, 97, -472, 31, 31, 31, 114, 2135, 123, 31, - 133, 135, -472, -472, 218, -472, -472, 126, -472, 142, - -472, -472, 146, -472, -472, -472, 2135, -472, -472, 126, - 148, 2060, -472, -99, -89, -472, -472, 151, -472, -472, - -472, -472, -472, 153, 154, -472, -472, -472, -472, -472, - -472, 156, -472, -472, 157, -472, 159, 160, -472, -472, - 161, 162, 163, 165, 167, -472, 169, -472, 173, -472, - 174, -472, -472, 185, 187, -472, -472, -472, -472, -472, - -472, -472, -472, -472, 192, -472, -472, -472, -472, -472, - 194, -472, -472, -472, -472, -472, 201, -472, -472, -472, - 210, 212, 214, -472, 215, -472, -472, 216, 219, -79, - -472, -472, -472, 1111, 425, 334, 290, 224, 230, -472, - -472, -472, -472, 114, 233, 235, -472, -472, -472, -472, - 24, -472, -472, -472, 296, 225, -472, -472, -472, -472, - -472, -472, -472, -472, -472, -472, -472, -472, 114, 114, - -472, 229, -26, -472, -472, -472, 31, -472, -472, -472, - 236, 312, -472, 237, -472, 114, 242, -472, 400, 312, - 967, 967, 401, 409, 967, 967, 410, 411, 967, 413, - 967, 967, 349, 967, 967, -21, 967, 967, 967, 2135, - 2135, 129, 418, 2135, 2244, 254, -472, 260, -472, -472, - -472, 263, -472, -472, -472, -472, 106, -472, -472, -472, - -472, -472, -145, 285, -65, 266, 264, -472, -472, 520, - 64, 268, -472, 967, 974, 1552, -472, -472, -472, 269, - 292, -472, 272, -472, -54, -472, 294, -3, -36, 270, - 274, -472, -472, -472, -472, -472, -472, -472, -472, 277, - -472, 967, 967, 967, 967, 967, 967, 805, 1801, -125, - -472, 1801, 279, 280, -472, -110, 282, 284, 286, 288, - 291, 295, 297, 1557, 448, 300, -109, -472, 1801, 301, - 310, -72, 1615, 302, 303, -472, -472, 305, 299, 307, - 309, -472, 2244, 453, -472, -472, 106, 1, -472, -472, - 335, 2060, 321, -34, 322, 417, 615, 106, -472, 2060, - -472, -472, -472, -472, 895, 329, 330, 354, -472, -472, - 2060, 57, -472, 312, 967, -472, 2060, -472, 114, 333, - -472, 336, -472, 338, -472, -472, 2060, 18, 18, 18, - 18, 18, 18, 1638, 267, 967, 967, 512, 967, 967, - 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, - 967, 967, 967, 967, 967, 513, 967, 967, -472, -472, - -472, 510, -472, -472, -472, -472, -472, -472, -472, -472, - -472, 346, -472, 967, -472, -472, 967, -472, -472, -472, - -472, -472, 516, -472, -472, -472, 348, -472, -472, -472, - 114, -472, -472, 2060, 351, -472, -472, 106, -472, -472, - -472, -472, 1474, 57, -472, 1318, -472, 57, -472, -472, - -472, 41, -472, -472, 57, 353, -472, 312, -472, -472, - 267, -472, -472, 1396, -472, 267, -472, 352, 48, 193, - 193, -472, 221, 221, 152, 152, 1688, 1765, 1742, 1819, - 1838, 1870, 152, 152, 234, 234, 18, 18, 18, -472, - 1720, -472, -472, -472, -472, 358, -472, 106, -472, 114, - -472, 710, -472, -472, -472, -472, 32, -472, 361, 57, - 362, -472, 1552, -472, 376, -472, -45, -472, 363, -472, - 365, 255, -472, 367, 57, 369, -472, 967, 1552, -472, - 967, -472, -472, -472, -472, 106, -472, 32, -472, -472, - -472, 370, 967, -472, 57, -472, -472, -472, -472, 32, - -472, -472, -472, 18, 371, 1801, -472, -472, -472, -472, - -472, 23, -472, -472, 967, 377, -472, -472, 398, 20, - 20, -472, -472, 382, -472, -472 + -459, 58, 1214, -459, -459, -459, -459, -459, 161, -459, + -102, 256, -459, 264, -459, -459, -459, -459, -1, 88, + -459, -459, -459, -459, 289, -1, -459, -67, -1, 484, + -459, -459, 295, -19, 297, 484, -459, -459, 2194, -459, + -16, -459, -459, -459, -459, -459, 2007, 5, 13, -459, + -459, 39, 25, -459, 46, 72, 54, 89, 117, -459, + -459, 98, -459, -14, -14, -14, 287, 992, 103, -14, + 109, 113, -459, -459, 276, -459, -459, 112, -459, 119, + -459, -459, 129, -459, -459, -459, 992, -459, -459, 112, + 128, 2085, -459, -103, -101, -459, -459, 134, -459, -459, + -459, -459, -459, 140, 144, -459, -459, -459, -459, -459, + -459, 146, -459, -459, 149, -459, 153, 154, -459, -459, + 163, 164, 168, 171, 174, -459, 175, -459, 177, -459, + 182, -459, -459, 184, 185, -459, -459, -459, -459, -459, + -459, -459, -459, -459, 186, -459, -459, -459, -459, -459, + 192, -459, -459, -459, -459, -459, 194, -459, -459, -459, + 200, 201, 204, -459, 205, -459, -459, 207, 208, -93, + -459, -459, -459, 1119, 500, 359, 303, 209, 210, -459, + -459, -459, -459, 287, 211, 216, -459, -459, -459, -459, + 33, -459, -459, -459, 307, 212, -459, -459, -459, -459, + -459, -459, -459, -459, -459, -459, -459, -459, 287, 287, + -459, 213, -87, -459, -459, -459, -14, -459, -459, -459, + 218, 309, -459, 220, -459, 287, 223, -459, 391, 309, + 944, 944, 392, 398, 944, 944, 399, 400, 944, 402, + 944, 944, 344, 944, 944, -72, 944, 944, 944, 992, + 992, 111, 410, 992, 2194, 245, -459, 244, -459, -459, + -459, 246, -459, -459, -459, -459, 54, -459, -459, -459, + -459, -459, -50, 268, -32, 248, 247, -459, -459, 595, + 40, 253, -459, 944, 983, 1577, -459, -459, -459, 255, + 272, -459, 252, -459, -18, -459, 284, -19, -8, 260, + 262, -459, -459, -459, -459, -459, -459, -459, -459, -459, + 266, -459, 944, 944, 944, 944, 944, 944, 880, 1826, + -80, -459, 1826, 263, 267, -459, -69, 269, 270, 271, + 273, 274, 280, 281, 1582, 438, 285, -62, -459, 1826, + 291, 293, -24, 1640, 294, 298, -459, -459, 300, 302, + 301, 304, -459, 2194, 443, -459, -459, 54, 7, -459, + -459, 316, 2085, 305, 14, 306, 389, 690, 54, -459, + 2085, -459, -459, -459, -459, 326, 308, 313, 327, -459, + -459, 2085, 90, -459, 309, 944, -459, 2085, -459, 287, + 318, -459, 321, -459, 322, -459, -459, 2085, 11, 11, + 11, 11, 11, 11, 1663, 279, 944, 944, 479, 944, + 944, 944, 944, 944, 944, 944, 944, 944, 944, 944, + 944, 944, 944, 944, 944, 944, 488, 944, 944, -459, + -459, -459, 489, -459, -459, -459, -459, -459, -459, -459, + -459, -459, 324, -459, 944, -459, -459, 944, -459, -459, + -459, -459, -459, 491, -459, -459, -459, 330, -459, -459, + -459, 287, -459, -459, 2085, 328, -459, -459, 54, -459, + -459, -459, -459, 1499, 90, -459, 1326, -459, 90, -459, + -459, -459, 16, -459, -459, 90, 329, -459, 309, -459, + -459, 279, -459, -459, 1404, -459, 279, -459, 331, 31, + 243, 243, -459, 444, 444, 95, 95, 1713, 1790, 1767, + 1844, 1863, 1895, 95, 95, 193, 193, 11, 11, 11, + -459, 1745, -459, -459, -459, -459, 332, -459, 54, -459, + 287, -459, 785, -459, -459, -459, -459, 145, -459, 333, + 90, 334, -459, 1577, -459, 358, -459, -74, -459, 335, + -459, 337, 47, -459, 338, 90, 339, -459, 944, 1577, + -459, 944, -459, -459, -459, -459, 54, -459, 145, -459, + -459, -459, 340, 944, -459, 90, -459, -459, -459, -459, + 145, -459, -459, -459, 11, 341, 1826, -459, -459, -459, + -459, -459, -9, -459, -459, 944, 365, -459, -459, 366, + 51, 51, -459, -459, 347, -459, -459 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -472, -472, -472, 511, -271, -257, 10, -472, -472, -472, - 195, -472, -472, -472, 557, -409, -472, -472, 89, -192, - -6, -2, -472, -472, -244, -472, -63, -472, -472, -472, - -472, 182, 2, 323, -261, -159, -472, -224, -228, -472, - -472, -472, -472, -32, -167, -472, -472, -472, 164, -40, - -472, 200, 100, 51, -472, 567, -472, -472, 527, -472, - -472, -472, -472, -472, -13, -472, 572, -1, -472, -472, - 574, -472, -472, -265, -411, -41, -7, -22, -180, -472, - -472, -472, -439, -472, -471, -472, -456, -472, -472, -472, - 3, -472, 395, 339, 6, -49, -472, 0, -472 + -459, -459, -459, 477, -258, -257, 19, -459, -459, -459, + 156, -459, -459, -459, 522, -429, -459, -459, 52, -202, + -21, -2, -459, -459, -229, -459, -65, -459, -459, -459, + -459, 142, 2, 282, -260, -181, -459, -224, -227, -459, + -459, -459, -459, -73, -206, -459, -459, -459, 215, -63, + -459, 188, 121, 28, -459, 525, -459, -459, 490, -459, + -459, -459, -459, -459, -23, -459, 533, 3, -459, -459, + 535, -459, -459, -265, -413, -40, -10, -27, -191, -459, + -459, -459, -414, -459, -458, -459, -439, -459, -459, -459, + -33, -459, 361, 310, 6, -54, -459, 0, -459 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -217 +#define YYTABLE_NINF -218 static const yytype_int16 yytable[] = { - 46, 60, 71, 209, 47, 183, 326, 366, 68, 355, - 351, 327, 39, 544, 330, 370, 332, 535, 216, 335, - 286, 541, 340, 375, 427, 38, 210, 91, 281, 282, - 360, 356, 407, 181, -216, 201, 202, 223, 3, 431, - 443, 198, 198, 198, 226, 295, 185, 198, 178, 428, - 225, 550, 184, 51, 11, 373, 556, 199, 200, 594, - 201, 202, 218, 536, 432, 444, 538, 201, 202, 203, - 254, 595, 321, 9, 9, 321, -216, 443, 72, 73, - 566, 551, 333, 569, 553, 338, 227, 74, 338, 342, - 24, 148, 255, 15, 203, 152, 204, 179, 581, 457, - 371, 203, 447, 544, 574, 38, 9, 362, 455, 82, - 468, 587, 578, 24, 80, 20, 38, 201, 202, 163, - 209, 204, 385, 592, 321, 338, 567, 575, 204, 88, - 389, 393, 273, 571, 38, 95, 38, 345, 205, 346, - 390, 579, 462, 210, 284, 209, 209, 285, 26, 584, - 86, 203, 397, 398, 399, 400, 401, 402, 403, 31, - 483, 206, 209, 205, 405, 406, 407, 38, 210, 210, - 205, 46, 46, 71, 71, 47, 47, 275, 204, 68, - 68, 292, 524, 258, 258, 210, 206, 425, 426, 300, - 38, 474, 601, 206, 198, 531, 90, 172, 94, 596, - 343, 344, 284, 521, 350, 475, -29, 407, 486, 287, - 532, 284, 494, 194, 542, 400, 474, 209, 284, 186, - 205, 558, 525, 207, 187, 85, 220, 284, 87, 188, - 475, 75, 76, 405, 406, 407, 190, 208, 410, 411, - 210, 77, 78, 206, 381, 189, 499, 500, 407, 502, - 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, - 513, 514, 515, 516, 517, 518, 357, 520, 83, 84, - 563, 370, 196, 207, 89, 78, 404, 369, 191, 71, - 528, 47, 193, 380, 338, 68, 370, 208, 386, 543, - 93, 78, 203, 268, 269, -30, 391, 9, 494, 276, - 277, -216, 370, 494, 203, 219, 559, -31, 586, 420, - 421, 422, 423, 424, 370, 201, 202, 221, 222, 204, - 460, 425, 426, 224, 228, 209, 229, 230, 183, 231, - 232, 204, 233, 234, 235, 236, 237, 267, 238, 473, - 239, 495, 240, 292, 589, 484, 241, 242, 210, 564, - 420, 421, 422, 423, 424, 490, 458, 463, 243, 494, - 244, 205, 425, 426, 369, 245, 71, 246, 47, 185, - 598, 178, 68, 205, 247, 184, 418, 419, 420, 421, - 422, 423, 424, 248, 206, 249, 485, 250, 251, 252, - 425, 426, 253, 422, 423, 424, 206, 209, 583, 270, - 278, 585, -32, 425, 426, -33, 283, -34, 299, 323, - 288, 293, 539, 321, 492, 297, 334, 324, 328, 329, - 210, 331, 529, 348, 352, 284, 492, 495, 493, 4, - 554, 381, 495, 353, 381, 354, 359, 284, 364, 365, - 493, 383, 372, 388, 394, 382, 7, 549, 395, 384, - 396, 441, 381, 429, 430, 5, 433, 6, 434, 446, - 435, 456, 436, 7, 8, 437, 209, 9, 452, 438, - 380, 439, 10, 380, 442, 445, 449, 450, 11, 451, - 12, 453, 18, 454, 13, 14, 459, 15, 495, 210, - 16, 380, 17, 461, 21, 22, 23, 19, 465, 18, - 470, 381, 25, 472, 471, 19, 257, 487, 488, 20, - 489, 21, 22, 23, 24, 501, 519, 381, 522, 25, - 523, 526, 527, 530, 4, 547, 557, 572, 599, 369, - 28, 71, 562, 47, 30, 568, 570, 68, 576, 577, - 380, 580, 26, 582, 588, 593, 27, 28, 29, 600, - 5, 30, 6, 31, 605, 174, 380, 32, 7, 45, - 466, 534, 9, 33, 34, 482, 35, 10, 604, 53, - 341, 36, 37, 180, 59, 12, 62, 590, 271, 13, - 14, 0, 15, 0, 339, 16, 0, 17, 0, 0, - 0, 0, 0, 0, 18, 38, 0, 0, 0, 0, - 19, 266, 0, 0, 20, 0, 21, 22, 23, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, - 0, 27, 28, 29, 0, 5, 30, 6, 31, 0, - 0, 0, 32, 7, 0, 0, 0, 9, 33, 34, - 0, 35, 10, 0, 0, 0, 36, 37, 0, 0, - 12, 0, 0, 0, 13, 14, 0, 15, 0, 0, - 16, 0, 17, 0, 0, 0, 0, 0, 0, 18, - 38, 0, 0, 0, 0, 19, 367, 0, 0, 20, - 0, 21, 22, 23, 0, 0, 0, 0, 0, 25, - 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26, 0, 0, 0, 27, 28, 29, 0, - 5, 30, 6, 31, 0, 0, 0, 32, 7, 0, - 0, 0, 9, 33, 34, 0, 35, 10, 0, 0, - 0, 36, 37, 0, 0, 12, 0, 0, 0, 13, - 14, 0, 15, 0, 0, 16, 0, 17, 0, 0, - 0, 0, 0, 0, 18, 38, 0, 0, 0, 0, - 19, 467, 0, 0, 20, 0, 21, 22, 23, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 301, 4, - 302, 303, 304, 305, 306, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, - 0, 27, 28, 29, 0, 5, 30, 6, 31, 0, - 0, 0, 32, 7, 0, 0, 0, 9, 33, 34, - 0, 35, 0, 0, 0, 0, 36, 37, 0, 0, - 12, 0, 0, 0, 13, 14, 0, 15, 307, 0, - 16, 0, 17, 0, 0, 0, 0, 0, 0, 18, - 38, 0, 0, 0, 0, 0, 565, 0, 0, 20, - 0, 21, 22, 23, 0, 0, 0, 0, 301, 25, - 302, 303, 304, 305, 306, 308, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 26, 0, 0, 0, 27, 28, 29, 0, - 309, 30, 0, 31, 0, 0, 0, 32, 0, 0, - 0, 0, 310, 0, 34, 0, 35, 0, 0, 0, - 0, 36, 37, 0, 0, 0, 0, 0, 307, 311, - 0, 0, 312, 313, 314, 0, 0, 315, 316, 0, - 301, 0, 302, 303, 304, 305, 306, 301, 317, 302, - 303, 304, 305, 306, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 308, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 307, 0, 310, 0, 0, 0, 0, 307, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 311, - 0, 0, 312, 313, 314, 0, 0, 315, 316, 0, - 0, 0, 0, 0, 0, 0, 469, 308, 317, 0, - 0, 0, 0, 0, 308, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 309, 0, 0, 0, 0, 0, 0, 309, - 0, 0, 0, 0, 310, 0, 0, 0, 0, 0, - 0, 310, 0, 0, 0, 4, 0, 0, 0, 0, - 0, 311, 256, 0, 312, 313, 314, 0, 311, 315, - 316, 312, 313, 374, 0, 0, 315, 316, 0, 0, - 317, 5, 0, 6, 0, 0, 0, 317, 0, 7, - 8, 0, 0, 9, 0, 0, 0, 0, 10, 0, - 0, 0, 0, 0, 11, 0, 12, 0, 0, 0, + 46, 209, 71, 210, 47, 60, 183, 327, 68, 356, + 286, 328, 91, 216, 331, 371, 333, 281, 282, 336, + 367, 39, 341, 181, 376, 352, 408, 545, 595, 9, + 51, -217, 223, 226, 295, 536, 198, 198, 198, 542, + 596, 148, 198, 201, 202, 152, 185, 539, 178, 15, + 322, 225, 184, 322, 199, 200, 374, 254, 3, 218, + 334, 11, 537, 339, 361, 554, 339, 343, 363, 163, + 428, 20, 74, -217, 179, 227, 575, 551, 203, 255, + 552, 432, 557, 9, 284, 203, 80, 285, 444, 372, + 9, 390, 394, 201, 202, 429, 82, 24, 567, 576, + 458, 570, 322, 339, 26, 204, 433, 86, 406, 407, + 408, 469, 204, 445, 572, 31, 582, 545, 209, 346, + 210, 38, 347, 24, 456, 568, 444, 357, 203, 588, + 585, 398, 399, 400, 401, 402, 403, 404, 579, 38, + 580, 593, 273, 209, 209, 210, 210, 205, 201, 202, + 88, 448, 38, 38, 205, 204, 95, 172, 292, 386, + 209, 484, 210, 38, 72, 73, 300, 275, 597, 391, + 206, 46, 46, 71, 71, 47, 47, 206, -29, 68, + 68, 426, 427, 203, 525, 38, 186, 284, 9, 198, + 543, 463, 258, 258, 401, 344, 345, 205, 487, 351, + 207, 188, 284, 495, 522, 559, 287, 493, 408, 532, + 204, 533, 187, 85, 208, 209, 87, 210, 284, 189, + 206, 494, 38, 526, 602, 500, 501, 191, 503, 504, + 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, + 515, 516, 517, 518, 519, 382, 521, 90, 190, 94, + 475, 358, 205, 421, 422, 423, 424, 425, 408, 75, + 76, 284, 193, 339, 476, 426, 427, 77, 78, 194, + 529, 564, 371, 387, 196, 206, -30, 370, 405, 71, + 544, 47, 219, 381, 220, 68, -31, 371, -217, 495, + 201, 202, 83, 84, 495, 221, 392, 560, 89, 78, + 93, 78, 222, 371, 224, 475, 268, 269, 228, 587, + 276, 277, 201, 202, 229, 371, 284, 203, 230, 476, + 231, 292, 461, 232, 209, 203, 210, 233, 234, 301, + 183, 302, 303, 304, 305, 306, 307, 235, 236, 565, + 496, 474, 237, 464, 204, 238, 590, 485, 239, 240, + 495, 241, 204, 423, 424, 425, 242, 491, 243, 244, + 245, 459, 267, 426, 427, 370, 246, 71, 247, 47, + 185, 599, 178, 68, 248, 249, 184, 584, 250, 251, + 586, 252, 253, -32, -33, 270, 205, 486, 278, -34, + 308, 283, 322, 288, 205, 293, 209, 297, 210, 299, + 324, 421, 422, 423, 424, 425, 325, 329, 330, 206, + 332, 540, 335, 426, 427, 349, 353, 206, 354, 355, + 360, 365, 384, 366, 530, 550, 496, 309, 373, 555, + 385, 496, 383, 382, 389, 395, 382, 396, 430, 493, + 397, 442, 431, 447, 434, 435, 436, 207, 437, 438, + 284, 457, 310, 494, 382, 439, 440, 406, 407, 408, + 443, 208, 411, 412, 311, 209, 446, 210, 460, 450, + 19, 381, 453, 451, 381, 452, 454, 473, 462, 455, + 471, 312, 502, 466, 313, 314, 315, 496, 472, 316, + 317, 520, 381, 488, 489, 490, 527, 523, 470, 524, + 318, 531, 548, 382, 4, 528, 558, 563, 569, 571, + 573, 577, 578, 581, 583, 589, 594, 600, 601, 382, + 606, 174, 467, 7, 45, 535, 483, 53, 605, 342, + 370, 5, 71, 6, 47, 59, 180, 62, 68, 7, + 8, 381, 591, 9, 271, 0, 0, 0, 10, 0, + 0, 0, 0, 0, 11, 340, 12, 381, 0, 18, 13, 14, 0, 15, 0, 0, 16, 0, 17, 0, - 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, + 0, 21, 22, 23, 0, 18, 0, 0, 0, 25, 0, 19, 257, 0, 0, 20, 0, 21, 22, 23, - 24, 0, 0, 0, 0, 25, 0, 0, 0, 0, - 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, + 24, 0, 0, 0, 0, 25, 0, 0, 0, 4, + 419, 420, 421, 422, 423, 424, 425, 28, 0, 0, + 0, 30, 0, 0, 426, 427, 0, 0, 26, 0, 0, 0, 27, 28, 29, 0, 5, 30, 6, 31, - 0, 0, 0, 32, 7, 8, 0, 0, 9, 33, - 34, 0, 35, 10, 0, 0, 0, 36, 37, 11, + 0, 0, 0, 32, 7, 0, 0, 0, 9, 33, + 34, 0, 35, 10, 0, 0, 0, 36, 37, 0, 0, 12, 0, 0, 0, 13, 14, 0, 15, 0, 0, 16, 0, 17, 0, 0, 0, 0, 0, 0, - 18, 38, 0, 0, 0, 0, 19, 0, 0, 0, - 20, 0, 21, 22, 23, 24, 0, 0, 0, 0, + 18, 38, 0, 0, 0, 0, 19, 266, 0, 0, + 20, 0, 21, 22, 23, 0, 0, 0, 0, 0, + 25, 0, 0, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 26, 0, 0, 0, 27, 28, 29, + 0, 5, 30, 6, 31, 0, 0, 0, 32, 7, + 0, 0, 0, 9, 33, 34, 0, 35, 10, 0, + 0, 0, 36, 37, 0, 0, 12, 0, 0, 0, + 13, 14, 0, 15, 0, 0, 16, 0, 17, 0, + 0, 0, 0, 0, 0, 18, 38, 0, 0, 0, + 0, 19, 368, 0, 0, 20, 0, 21, 22, 23, + 0, 0, 0, 0, 0, 25, 0, 0, 0, 4, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, + 0, 0, 27, 28, 29, 0, 5, 30, 6, 31, + 0, 0, 0, 32, 7, 0, 0, 0, 9, 33, + 34, 0, 35, 10, 0, 0, 0, 36, 37, 0, + 0, 12, 0, 0, 0, 13, 14, 0, 15, 0, + 0, 16, 0, 17, 0, 0, 0, 0, 0, 0, + 18, 38, 0, 0, 0, 0, 19, 468, 0, 0, + 20, 0, 21, 22, 23, 0, 0, 0, 0, 0, + 25, 0, 0, 301, 4, 302, 303, 304, 305, 306, + 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 26, 0, 0, 0, 27, 28, 29, + 0, 5, 30, 6, 31, 0, 0, 0, 32, 7, + 0, 0, 0, 9, 33, 34, 0, 35, 0, 0, + 0, 0, 36, 37, 0, 0, 12, 0, 0, 0, + 13, 14, 0, 15, 308, 0, 16, 301, 17, 302, + 303, 304, 305, 306, 307, 18, 38, 0, 0, 0, + 0, 0, 566, 0, 0, 20, 0, 21, 22, 23, + 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, + 0, 309, 0, 0, 0, 0, 301, 0, 302, 303, + 304, 305, 306, 307, 0, 0, 4, 0, 26, 0, + 0, 0, 27, 28, 29, 0, 310, 30, 308, 31, + 0, 0, 0, 32, 0, 0, 0, 0, 311, 0, + 34, 0, 35, 5, 0, 6, 0, 36, 37, 0, + 0, 7, 0, 0, 0, 312, 0, 0, 313, 314, + 315, 0, 0, 316, 317, 309, 0, 308, 12, 0, + 0, 0, 13, 14, 318, 0, 0, 0, 16, 0, + 17, 0, 0, 0, 0, 0, 0, 18, 0, 0, + 310, 0, 0, 0, 0, 0, 0, 0, 0, 21, + 22, 23, 311, 0, 309, 0, 0, 25, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 312, + 0, 0, 313, 314, 315, 0, 0, 316, 317, 310, + 0, 0, 0, 0, 27, 28, 29, 0, 318, 30, + 0, 311, 0, 4, 0, 32, 0, 0, 0, 0, + 0, 256, 34, 0, 35, 0, 0, 0, 312, 36, + 37, 313, 314, 375, 0, 0, 316, 317, 0, 0, + 5, 0, 6, 0, 0, 0, 0, 318, 7, 8, + 0, 0, 9, 0, 0, 0, 0, 10, 0, 0, + 0, 0, 0, 11, 0, 12, 0, 0, 0, 13, + 14, 0, 15, 0, 0, 16, 0, 17, 0, 0, + 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, + 19, 257, 0, 0, 20, 0, 21, 22, 23, 24, + 0, 0, 0, 0, 25, 0, 0, 0, 4, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, + 0, 27, 28, 29, 0, 5, 30, 6, 31, 0, + 0, 0, 32, 7, 8, 0, 0, 9, 33, 34, + 0, 35, 10, 0, 0, 0, 36, 37, 11, 0, + 12, 0, 0, 0, 13, 14, 0, 15, 0, 0, + 16, 0, 17, 0, 0, 0, 0, 0, 0, 18, + 38, 0, 0, 0, 0, 19, 0, 0, 0, 20, + 0, 21, 22, 23, 24, 0, 0, 0, 0, 25, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 26, 0, 0, 0, 27, 28, 29, 0, + 0, 30, 0, 31, 0, 0, 0, 32, 0, 0, + 0, 0, 0, 33, 34, 0, 35, 5, 0, 6, + 0, 36, 37, 0, 203, 7, 0, 0, 0, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 0, 38, 13, 14, 0, 15, + 0, 204, 16, 0, 17, 0, 0, 0, 0, 0, + 0, 18, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 20, 0, 21, 22, 23, 0, 0, 0, 0, + 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 205, 0, 5, 0, 6, 0, 0, + 0, 0, 203, 7, 26, 0, 0, 9, 27, 28, + 29, 0, 0, 30, 0, 31, 206, 0, 0, 32, + 12, 0, 0, 0, 13, 14, 34, 15, 35, 204, + 16, 0, 17, 36, 37, 0, 0, 0, 0, 18, + 0, 0, 0, 0, 0, 0, 538, 0, 0, 20, + 0, 21, 22, 23, 0, 0, 0, 38, 0, 25, + 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 205, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 534, 26, 0, 0, 0, 27, 28, 29, 0, + 5, 30, 6, 31, 206, 0, 0, 32, 7, 0, + 0, 0, 9, 0, 34, 0, 35, 0, 0, 0, + 0, 36, 37, 0, 0, 12, 0, 0, 0, 13, + 14, 0, 15, 0, 553, 16, 0, 17, 0, 0, + 0, 0, 0, 0, 18, 38, 0, 0, 0, 0, + 0, 4, 0, 0, 20, 0, 21, 22, 23, 0, + 0, 0, 0, 0, 25, 406, 407, 408, 409, 410, + 411, 412, 413, 414, 0, 0, 0, 0, 5, 0, + 6, 0, 0, 0, 0, 0, 7, 26, 0, 0, + 9, 27, 28, 29, 0, 0, 30, 0, 31, 0, + 0, 0, 32, 12, 0, 0, 0, 13, 14, 34, + 15, 35, 0, 16, 0, 17, 36, 37, 0, 0, + 0, 0, 18, 406, 407, 408, 409, 410, 411, 412, + 413, 414, 20, 0, 21, 22, 23, 0, 0, 0, + 38, 0, 25, 0, 0, 0, 406, 407, 408, 409, + 410, 411, 412, 413, 414, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 26, 0, 0, 0, 27, + 28, 29, 0, 0, 30, 0, 31, 0, 0, 0, + 32, 0, 0, 0, 0, 0, 0, 34, 0, 35, + 0, 0, 0, 0, 36, 37, 406, 407, 408, 409, + 410, 411, 412, 415, 414, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 0, 0, 0, 38, 0, + 0, 0, 426, 427, 0, 0, 0, 441, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 406, 407, 408, 409, 410, 411, 412, 413, 414, 0, + 0, 415, 0, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 406, 407, 408, 409, 410, 411, 412, + 426, 427, 0, 0, 415, 449, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 0, 0, + 0, 0, 0, 426, 427, 0, 0, 0, 492, 406, + 407, 408, 409, 410, 411, 412, 413, 414, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 406, 407, 408, + 409, 410, 411, 412, 0, 0, 416, 417, 418, 419, + 420, 421, 422, 423, 424, 425, 406, 407, 408, 409, + 410, 411, 412, 426, 427, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 415, 0, 416, 417, + 418, 419, 420, 421, 422, 423, 424, 425, 406, 407, + 408, 409, 410, 411, 412, 426, 427, 562, 415, 561, + 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, + 0, 0, 0, 0, 0, 0, 0, 426, 427, 0, + 0, 0, 0, 416, 417, 418, 419, 420, 421, 422, + 423, 424, 425, 0, 0, 0, 0, 0, 0, 0, + 426, 427, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 415, 0, 416, + 417, 418, 419, 420, 421, 422, 423, 424, 425, 0, + 0, 0, 0, 0, 0, 0, 426, 427, 417, 418, + 419, 420, 421, 422, 423, 424, 425, 0, 0, 0, + 0, 4, 0, 0, 426, 427, 0, 0, 418, 419, + 420, 421, 422, 423, 424, 425, 0, 0, 0, 0, + 0, 0, 0, 426, 427, 0, 0, 0, 5, 0, + 6, 0, 0, 0, 0, 0, 7, 8, 0, 0, + 9, 419, 420, 421, 422, 423, 424, 425, 0, 0, + 0, 11, 0, 12, 0, 426, 427, 13, 14, 0, + 15, 0, 0, 16, 0, 17, 0, 0, 0, 0, + 0, 0, 18, 0, 0, 0, 0, 0, 0, 4, + 0, 0, 20, 0, 21, 22, 23, 24, 0, 0, + 175, 0, 25, 0, 176, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 0, 6, 0, + 0, 0, 0, 0, 7, 26, 0, 0, 9, 27, + 28, 29, 0, 0, 30, 0, 31, 0, 0, 0, + 32, 12, 0, 0, 0, 13, 14, 34, 15, 35, + 0, 16, 0, 17, 36, 37, 0, 0, 0, 0, + 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 20, 0, 21, 22, 23, 0, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 26, 0, 0, 0, 27, 28, 29, - 0, 0, 30, 0, 31, 0, 0, 0, 32, 0, - 0, 0, 0, 0, 33, 34, 0, 35, 5, 0, - 6, 0, 36, 37, 0, 203, 7, 0, 0, 0, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 12, 0, 0, 38, 13, 14, 0, - 15, 0, 204, 16, 0, 17, 0, 0, 0, 0, - 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, - 4, 0, 20, 0, 21, 22, 23, 0, 0, 0, - 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 205, 0, 5, 0, 6, 0, - 0, 0, 0, 203, 7, 26, 0, 0, 9, 27, - 28, 29, 0, 0, 30, 0, 31, 206, 0, 0, - 32, 12, 0, 0, 0, 13, 14, 34, 15, 35, - 204, 16, 0, 17, 36, 37, 0, 0, 0, 0, - 18, 0, 0, 0, 0, 0, 0, 537, 4, 0, - 20, 0, 21, 22, 23, 0, 0, 0, 38, 0, - 25, 0, 0, 0, 0, 533, 0, 0, 0, 0, - 0, 0, 205, 0, 5, 0, 6, 0, 0, 0, - 0, 0, 7, 26, 0, 0, 9, 27, 28, 29, - 0, 0, 30, 0, 31, 206, 0, 0, 32, 12, - 0, 0, 0, 13, 14, 34, 15, 35, 0, 16, - 0, 17, 36, 37, 0, 0, 0, 0, 18, 0, - 0, 0, 0, 0, 0, 552, 4, 0, 20, 0, - 21, 22, 23, 0, 0, 0, 38, 0, 25, 405, - 406, 407, 408, 409, 410, 411, 412, 413, 0, 0, - 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, - 7, 26, 0, 0, 9, 27, 28, 29, 0, 0, - 30, 0, 31, 0, 0, 0, 32, 12, 0, 0, - 0, 13, 14, 34, 15, 35, 0, 16, 0, 17, - 36, 37, 0, 0, 0, 0, 18, 405, 406, 407, - 408, 409, 410, 411, 412, 413, 20, 0, 21, 22, - 23, 0, 0, 0, 38, 0, 25, 0, 0, 0, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, - 0, 0, 0, 27, 28, 29, 0, 0, 30, 0, - 31, 0, 0, 0, 32, 0, 0, 0, 0, 0, - 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, - 405, 406, 407, 408, 409, 410, 411, 414, 413, 415, - 416, 417, 418, 419, 420, 421, 422, 423, 424, 0, - 0, 0, 38, 0, 0, 0, 425, 426, 0, 0, - 0, 440, 405, 406, 407, 408, 409, 410, 411, 412, - 413, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 405, 406, 407, 408, 409, 410, - 411, 412, 413, 0, 0, 414, 0, 415, 416, 417, - 418, 419, 420, 421, 422, 423, 424, 405, 406, 407, - 408, 409, 410, 411, 425, 426, 0, 0, 414, 448, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, - 0, 0, 0, 0, 0, 0, 0, 425, 426, 0, - 0, 0, 491, 405, 406, 407, 408, 409, 410, 411, - 412, 413, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 405, 406, 407, 408, 409, 410, 411, 0, 0, - 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, - 405, 406, 407, 408, 409, 410, 411, 425, 426, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 414, 0, 415, 416, 417, 418, 419, 420, 421, 422, - 423, 424, 405, 406, 407, 408, 409, 410, 411, 425, - 426, 561, 414, 560, 415, 416, 417, 418, 419, 420, - 421, 422, 423, 424, 0, 0, 0, 0, 0, 0, - 0, 425, 426, 0, 0, 0, 0, 415, 416, 417, - 418, 419, 420, 421, 422, 423, 424, 0, 0, 0, - 0, 0, 0, 0, 425, 426, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 414, 0, 415, 416, 417, 418, 419, 420, 421, - 422, 423, 424, 0, 0, 0, 0, 0, 0, 0, - 425, 426, 416, 417, 418, 419, 420, 421, 422, 423, - 424, 0, 0, 0, 0, 0, 4, 0, 425, 426, - 0, 0, 417, 418, 419, 420, 421, 422, 423, 424, - 0, 0, 0, 0, 0, 0, 0, 425, 426, 0, - 0, 0, 5, 0, 6, 0, 0, 0, 0, 0, - 7, 8, 0, 0, 9, 418, 419, 420, 421, 422, - 423, 424, 0, 0, 0, 11, 0, 12, 0, 425, - 426, 13, 14, 0, 15, 0, 0, 16, 0, 17, - 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, - 0, 0, 0, 0, 4, 0, 20, 0, 21, 22, - 23, 24, 0, 0, 175, 0, 25, 0, 176, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 6, 0, 0, 0, 0, 0, 7, 26, - 0, 0, 9, 27, 28, 29, 0, 0, 30, 0, - 31, 0, 0, 0, 32, 12, 0, 0, 0, 13, - 14, 34, 15, 35, 0, 16, 0, 17, 36, 37, - 0, 0, 0, 0, 18, 0, 0, 0, 0, 4, - 0, 0, 0, 0, 20, 0, 21, 22, 23, 0, - 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 5, 0, 6, 0, 0, - 0, 0, 0, 7, 0, 0, 0, 26, 0, 0, - 0, 27, 28, 29, 0, 0, 30, 0, 31, 0, - 12, 0, 32, 0, 13, 14, 0, 0, 0, 34, - 16, 35, 17, 0, 0, 0, 36, 37, 0, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 21, 22, 23, 0, 0, 0, 0, 0, 25, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 27, 28, 29, 0, - 0, 30, 0, 0, 0, 0, 96, 32, 97, 98, - 99, 0, 100, 101, 34, 102, 35, 0, 103, 0, - 104, 36, 37, 0, 0, 0, 0, 105, 106, 107, - 108, 0, 109, 110, 111, 112, 113, 0, 114, 0, - 115, 116, 117, 0, 0, 118, 0, 0, 0, 0, - 119, 0, 120, 121, 122, 123, 124, 125, 0, 126, - 127, 128, 129, 130, 0, 0, 131, 0, 0, 132, - 0, 0, 0, 0, 133, 134, 0, 135, 0, 0, - 0, 136, 137, 138, 0, 139, 140, 141, 142, 143, - 0, 144, 0, 145, 146, 147, 148, 149, 150, 151, - 152, 0, 153, 154, 155, 0, 0, 0, 156, 0, - 0, 157, 0, 0, 158, 159, 0, 0, 160, 161, - 162, 0, 0, 0, 163, 0, 164, 165, 166, 167, - 0, 0, 168 + 0, 0, 0, 26, 0, 0, 0, 27, 28, 29, + 0, 0, 30, 0, 31, 0, 0, 96, 32, 97, + 98, 99, 0, 100, 101, 34, 102, 35, 0, 103, + 0, 104, 36, 37, 0, 0, 0, 0, 105, 106, + 107, 108, 0, 109, 110, 111, 112, 113, 0, 114, + 0, 115, 116, 117, 0, 0, 118, 0, 0, 0, + 0, 119, 0, 120, 121, 122, 123, 124, 125, 0, + 126, 127, 128, 129, 130, 0, 0, 131, 0, 0, + 132, 0, 0, 0, 0, 133, 134, 0, 135, 0, + 0, 0, 136, 137, 138, 0, 139, 140, 141, 142, + 143, 0, 144, 0, 145, 146, 147, 148, 149, 150, + 151, 152, 0, 153, 154, 155, 0, 0, 0, 156, + 0, 0, 157, 0, 0, 158, 159, 0, 0, 160, + 161, 162, 0, 0, 0, 163, 0, 164, 165, 166, + 167, 0, 0, 168 }; static const yytype_int16 yycheck[] = { - 2, 2, 2, 66, 2, 46, 234, 278, 2, 266, - 254, 235, 2, 484, 238, 280, 240, 473, 67, 243, - 212, 477, 246, 284, 149, 170, 66, 33, 208, 209, - 95, 176, 14, 46, 133, 3, 4, 86, 0, 149, - 149, 63, 64, 65, 133, 225, 46, 69, 46, 174, - 91, 490, 46, 2, 53, 283, 495, 64, 65, 36, - 3, 4, 69, 474, 174, 174, 475, 3, 4, 37, - 149, 48, 231, 42, 42, 234, 175, 149, 3, 4, - 536, 492, 241, 539, 493, 244, 175, 173, 247, 248, - 89, 112, 171, 62, 37, 116, 64, 46, 554, 356, - 280, 37, 174, 574, 149, 170, 42, 274, 352, 8, - 367, 567, 551, 89, 86, 84, 170, 3, 4, 140, - 183, 64, 176, 579, 283, 284, 537, 172, 64, 29, - 297, 298, 108, 542, 170, 35, 170, 8, 106, 10, - 176, 552, 176, 183, 170, 208, 209, 173, 117, 558, - 173, 37, 311, 312, 313, 314, 315, 316, 317, 128, - 384, 129, 225, 106, 12, 13, 14, 170, 208, 209, - 106, 173, 174, 173, 174, 173, 174, 190, 64, 173, - 174, 221, 443, 173, 174, 225, 129, 169, 170, 229, - 170, 159, 172, 129, 216, 466, 32, 172, 34, 176, - 249, 250, 170, 427, 253, 173, 172, 14, 388, 216, - 467, 170, 404, 151, 173, 374, 159, 280, 170, 172, - 106, 173, 446, 159, 172, 25, 8, 170, 28, 175, - 173, 3, 4, 12, 13, 14, 175, 173, 17, 18, - 280, 3, 4, 129, 285, 172, 405, 406, 14, 408, - 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, - 419, 420, 421, 422, 423, 424, 272, 426, 3, 4, - 527, 536, 175, 159, 3, 4, 317, 279, 172, 279, - 460, 279, 172, 285, 443, 279, 551, 173, 294, 481, - 3, 4, 37, 3, 4, 172, 298, 42, 490, 3, - 4, 175, 567, 495, 37, 172, 498, 172, 565, 157, - 158, 159, 160, 161, 579, 3, 4, 175, 172, 64, - 361, 169, 170, 175, 173, 388, 173, 173, 369, 173, - 173, 64, 173, 173, 173, 173, 173, 3, 173, 380, - 173, 404, 173, 383, 572, 386, 173, 173, 388, 529, - 157, 158, 159, 160, 161, 396, 357, 363, 173, 551, - 173, 106, 169, 170, 366, 173, 366, 173, 366, 369, - 594, 369, 366, 106, 173, 369, 155, 156, 157, 158, - 159, 160, 161, 173, 129, 173, 386, 173, 173, 173, - 169, 170, 173, 159, 160, 161, 129, 460, 557, 175, - 175, 560, 172, 169, 170, 172, 177, 172, 8, 8, - 174, 174, 475, 572, 159, 173, 67, 8, 8, 8, - 460, 8, 463, 5, 170, 170, 159, 490, 173, 4, - 493, 472, 495, 173, 475, 172, 151, 170, 172, 175, - 173, 149, 174, 149, 174, 176, 38, 487, 174, 177, - 173, 3, 493, 174, 174, 30, 174, 32, 174, 149, - 174, 8, 174, 38, 39, 174, 529, 42, 169, 174, - 472, 174, 47, 475, 174, 174, 174, 174, 53, 174, - 55, 174, 74, 174, 59, 60, 151, 62, 551, 529, - 65, 493, 67, 172, 86, 87, 88, 80, 176, 74, - 171, 542, 94, 149, 174, 80, 81, 174, 172, 84, - 172, 86, 87, 88, 89, 3, 3, 558, 8, 94, - 174, 5, 174, 172, 4, 172, 174, 151, 151, 531, - 122, 531, 174, 531, 126, 174, 174, 531, 175, 174, - 542, 174, 117, 174, 174, 174, 121, 122, 123, 151, - 30, 126, 32, 128, 172, 44, 558, 132, 38, 2, - 365, 472, 42, 138, 139, 383, 141, 47, 600, 2, - 247, 146, 147, 46, 2, 55, 2, 574, 183, 59, - 60, -1, 62, -1, 245, 65, -1, 67, -1, -1, - -1, -1, -1, -1, 74, 170, -1, -1, -1, -1, - 80, 176, -1, -1, 84, -1, 86, 87, 88, -1, - -1, -1, -1, -1, 94, -1, -1, -1, -1, 4, + 2, 66, 2, 66, 2, 2, 46, 234, 2, 266, + 212, 235, 33, 67, 238, 280, 240, 208, 209, 243, + 278, 2, 246, 46, 284, 254, 15, 485, 37, 43, + 2, 134, 86, 134, 225, 474, 63, 64, 65, 478, + 49, 113, 69, 3, 4, 117, 46, 476, 46, 63, + 231, 91, 46, 234, 64, 65, 283, 150, 0, 69, + 241, 54, 475, 244, 96, 494, 247, 248, 274, 141, + 150, 85, 174, 176, 46, 176, 150, 491, 38, 172, + 493, 150, 496, 43, 171, 38, 87, 174, 150, 280, + 43, 297, 298, 3, 4, 175, 8, 90, 537, 173, + 357, 540, 283, 284, 118, 65, 175, 174, 13, 14, + 15, 368, 65, 175, 543, 129, 555, 575, 183, 8, + 183, 171, 11, 90, 353, 538, 150, 177, 38, 568, + 559, 312, 313, 314, 315, 316, 317, 318, 552, 171, + 553, 580, 109, 208, 209, 208, 209, 107, 3, 4, + 29, 175, 171, 171, 107, 65, 35, 173, 221, 177, + 225, 385, 225, 171, 3, 4, 229, 190, 177, 177, + 130, 173, 174, 173, 174, 173, 174, 130, 173, 173, + 174, 170, 171, 38, 444, 171, 173, 171, 43, 216, + 174, 177, 173, 174, 375, 249, 250, 107, 389, 253, + 160, 176, 171, 405, 428, 174, 216, 160, 15, 467, + 65, 468, 173, 25, 174, 280, 28, 280, 171, 173, + 130, 174, 171, 447, 173, 406, 407, 173, 409, 410, + 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, + 421, 422, 423, 424, 425, 285, 427, 32, 176, 34, + 160, 272, 107, 158, 159, 160, 161, 162, 15, 3, + 4, 171, 173, 444, 174, 170, 171, 3, 4, 152, + 461, 528, 537, 294, 176, 130, 173, 279, 318, 279, + 482, 279, 173, 285, 8, 279, 173, 552, 176, 491, + 3, 4, 3, 4, 496, 176, 298, 499, 3, 4, + 3, 4, 173, 568, 176, 160, 3, 4, 174, 566, + 3, 4, 3, 4, 174, 580, 171, 38, 174, 174, + 174, 384, 362, 174, 389, 38, 389, 174, 174, 3, + 370, 5, 6, 7, 8, 9, 10, 174, 174, 530, + 405, 381, 174, 364, 65, 174, 573, 387, 174, 174, + 552, 174, 65, 160, 161, 162, 174, 397, 174, 174, + 174, 358, 3, 170, 171, 367, 174, 367, 174, 367, + 370, 595, 370, 367, 174, 174, 370, 558, 174, 174, + 561, 174, 174, 173, 173, 176, 107, 387, 176, 173, + 64, 178, 573, 175, 107, 175, 461, 174, 461, 8, + 8, 158, 159, 160, 161, 162, 8, 8, 8, 130, + 8, 476, 68, 170, 171, 5, 171, 130, 174, 173, + 152, 173, 150, 176, 464, 488, 491, 101, 175, 494, + 178, 496, 177, 473, 150, 175, 476, 175, 175, 160, + 174, 3, 175, 150, 175, 175, 175, 160, 175, 175, + 171, 8, 126, 174, 494, 175, 175, 13, 14, 15, + 175, 174, 18, 19, 138, 530, 175, 530, 152, 175, + 81, 473, 170, 175, 476, 175, 175, 150, 173, 175, + 172, 155, 3, 177, 158, 159, 160, 552, 175, 163, + 164, 3, 494, 175, 173, 173, 5, 8, 172, 175, + 174, 173, 173, 543, 4, 175, 175, 175, 175, 175, + 152, 176, 175, 175, 175, 175, 175, 152, 152, 559, + 173, 44, 366, 39, 2, 473, 384, 2, 601, 247, + 532, 31, 532, 33, 532, 2, 46, 2, 532, 39, + 40, 543, 575, 43, 183, -1, -1, -1, 48, -1, + -1, -1, -1, -1, 54, 245, 56, 559, -1, 75, + 60, 61, -1, 63, -1, -1, 66, -1, 68, -1, + -1, 87, 88, 89, -1, 75, -1, -1, -1, 95, + -1, 81, 82, -1, -1, 85, -1, 87, 88, 89, + 90, -1, -1, -1, -1, 95, -1, -1, -1, 4, + 156, 157, 158, 159, 160, 161, 162, 123, -1, -1, + -1, 127, -1, -1, 170, 171, -1, -1, 118, -1, + -1, -1, 122, 123, 124, -1, 31, 127, 33, 129, + -1, -1, -1, 133, 39, -1, -1, -1, 43, 139, + 140, -1, 142, 48, -1, -1, -1, 147, 148, -1, + -1, 56, -1, -1, -1, 60, 61, -1, 63, -1, + -1, 66, -1, 68, -1, -1, -1, -1, -1, -1, + 75, 171, -1, -1, -1, -1, 81, 177, -1, -1, + 85, -1, 87, 88, 89, -1, -1, -1, -1, -1, + 95, -1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 117, -1, -1, - -1, 121, 122, 123, -1, 30, 126, 32, 128, -1, - -1, -1, 132, 38, -1, -1, -1, 42, 138, 139, - -1, 141, 47, -1, -1, -1, 146, 147, -1, -1, - 55, -1, -1, -1, 59, 60, -1, 62, -1, -1, - 65, -1, 67, -1, -1, -1, -1, -1, -1, 74, - 170, -1, -1, -1, -1, 80, 176, -1, -1, 84, - -1, 86, 87, 88, -1, -1, -1, -1, -1, 94, - -1, -1, -1, -1, 4, -1, -1, -1, -1, -1, + -1, -1, -1, 118, -1, -1, -1, 122, 123, 124, + -1, 31, 127, 33, 129, -1, -1, -1, 133, 39, + -1, -1, -1, 43, 139, 140, -1, 142, 48, -1, + -1, -1, 147, 148, -1, -1, 56, -1, -1, -1, + 60, 61, -1, 63, -1, -1, 66, -1, 68, -1, + -1, -1, -1, -1, -1, 75, 171, -1, -1, -1, + -1, 81, 177, -1, -1, 85, -1, 87, 88, 89, + -1, -1, -1, -1, -1, 95, -1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 117, -1, -1, -1, 121, 122, 123, -1, - 30, 126, 32, 128, -1, -1, -1, 132, 38, -1, - -1, -1, 42, 138, 139, -1, 141, 47, -1, -1, - -1, 146, 147, -1, -1, 55, -1, -1, -1, 59, - 60, -1, 62, -1, -1, 65, -1, 67, -1, -1, - -1, -1, -1, -1, 74, 170, -1, -1, -1, -1, - 80, 176, -1, -1, 84, -1, 86, 87, 88, -1, - -1, -1, -1, -1, 94, -1, -1, -1, 3, 4, - 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 117, -1, -1, - -1, 121, 122, 123, -1, 30, 126, 32, 128, -1, - -1, -1, 132, 38, -1, -1, -1, 42, 138, 139, - -1, 141, -1, -1, -1, -1, 146, 147, -1, -1, - 55, -1, -1, -1, 59, 60, -1, 62, 63, -1, - 65, -1, 67, -1, -1, -1, -1, -1, -1, 74, - 170, -1, -1, -1, -1, -1, 176, -1, -1, 84, - -1, 86, 87, 88, -1, -1, -1, -1, 3, 94, - 5, 6, 7, 8, 9, 100, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 118, -1, + -1, -1, 122, 123, 124, -1, 31, 127, 33, 129, + -1, -1, -1, 133, 39, -1, -1, -1, 43, 139, + 140, -1, 142, 48, -1, -1, -1, 147, 148, -1, + -1, 56, -1, -1, -1, 60, 61, -1, 63, -1, + -1, 66, -1, 68, -1, -1, -1, -1, -1, -1, + 75, 171, -1, -1, -1, -1, 81, 177, -1, -1, + 85, -1, 87, 88, 89, -1, -1, -1, -1, -1, + 95, -1, -1, 3, 4, 5, 6, 7, 8, 9, + 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 118, -1, -1, -1, 122, 123, 124, + -1, 31, 127, 33, 129, -1, -1, -1, 133, 39, + -1, -1, -1, 43, 139, 140, -1, 142, -1, -1, + -1, -1, 147, 148, -1, -1, 56, -1, -1, -1, + 60, 61, -1, 63, 64, -1, 66, 3, 68, 5, + 6, 7, 8, 9, 10, 75, 171, -1, -1, -1, + -1, -1, 177, -1, -1, 85, -1, 87, 88, 89, + -1, -1, -1, -1, -1, 95, -1, -1, -1, -1, + -1, 101, -1, -1, -1, -1, 3, -1, 5, 6, + 7, 8, 9, 10, -1, -1, 4, -1, 118, -1, + -1, -1, 122, 123, 124, -1, 126, 127, 64, 129, + -1, -1, -1, 133, -1, -1, -1, -1, 138, -1, + 140, -1, 142, 31, -1, 33, -1, 147, 148, -1, + -1, 39, -1, -1, -1, 155, -1, -1, 158, 159, + 160, -1, -1, 163, 164, 101, -1, 64, 56, -1, + -1, -1, 60, 61, 174, -1, -1, -1, 66, -1, + 68, -1, -1, -1, -1, -1, -1, 75, -1, -1, + 126, -1, -1, -1, -1, -1, -1, -1, -1, 87, + 88, 89, 138, -1, 101, -1, -1, 95, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 155, + -1, -1, 158, 159, 160, -1, -1, 163, 164, 126, + -1, -1, -1, -1, 122, 123, 124, -1, 174, 127, + -1, 138, -1, 4, -1, 133, -1, -1, -1, -1, + -1, 12, 140, -1, 142, -1, -1, -1, 155, 147, + 148, 158, 159, 160, -1, -1, 163, 164, -1, -1, + 31, -1, 33, -1, -1, -1, -1, 174, 39, 40, + -1, -1, 43, -1, -1, -1, -1, 48, -1, -1, + -1, -1, -1, 54, -1, 56, -1, -1, -1, 60, + 61, -1, 63, -1, -1, 66, -1, 68, -1, -1, + -1, -1, -1, -1, 75, -1, -1, -1, -1, -1, + 81, 82, -1, -1, 85, -1, 87, 88, 89, 90, + -1, -1, -1, -1, 95, -1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 117, -1, -1, -1, 121, 122, 123, -1, - 125, 126, -1, 128, -1, -1, -1, 132, -1, -1, - -1, -1, 137, -1, 139, -1, 141, -1, -1, -1, - -1, 146, 147, -1, -1, -1, -1, -1, 63, 154, - -1, -1, 157, 158, 159, -1, -1, 162, 163, -1, - 3, -1, 5, 6, 7, 8, 9, 3, 173, 5, - 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 100, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 118, -1, -1, + -1, 122, 123, 124, -1, 31, 127, 33, 129, -1, + -1, -1, 133, 39, 40, -1, -1, 43, 139, 140, + -1, 142, 48, -1, -1, -1, 147, 148, 54, -1, + 56, -1, -1, -1, 60, 61, -1, 63, -1, -1, + 66, -1, 68, -1, -1, -1, -1, -1, -1, 75, + 171, -1, -1, -1, -1, 81, -1, -1, -1, 85, + -1, 87, 88, 89, 90, -1, -1, -1, -1, 95, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 63, -1, 137, -1, -1, -1, -1, 63, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 154, - -1, -1, 157, 158, 159, -1, -1, 162, 163, -1, - -1, -1, -1, -1, -1, -1, 171, 100, 173, -1, - -1, -1, -1, -1, 100, -1, -1, -1, -1, -1, + 4, -1, 118, -1, -1, -1, 122, 123, 124, -1, + -1, 127, -1, 129, -1, -1, -1, 133, -1, -1, + -1, -1, -1, 139, 140, -1, 142, 31, -1, 33, + -1, 147, 148, -1, 38, 39, -1, -1, -1, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 125, -1, -1, -1, -1, -1, -1, 125, - -1, -1, -1, -1, 137, -1, -1, -1, -1, -1, - -1, 137, -1, -1, -1, 4, -1, -1, -1, -1, - -1, 154, 11, -1, 157, 158, 159, -1, 154, 162, - 163, 157, 158, 159, -1, -1, 162, 163, -1, -1, - 173, 30, -1, 32, -1, -1, -1, 173, -1, 38, - 39, -1, -1, 42, -1, -1, -1, -1, 47, -1, - -1, -1, -1, -1, 53, -1, 55, -1, -1, -1, - 59, 60, -1, 62, -1, -1, 65, -1, 67, -1, - -1, -1, -1, -1, -1, 74, -1, -1, -1, -1, - -1, 80, 81, -1, -1, 84, -1, 86, 87, 88, - 89, -1, -1, -1, -1, 94, -1, -1, -1, -1, - 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 117, -1, - -1, -1, 121, 122, 123, -1, 30, 126, 32, 128, - -1, -1, -1, 132, 38, 39, -1, -1, 42, 138, - 139, -1, 141, 47, -1, -1, -1, 146, 147, 53, - -1, 55, -1, -1, -1, 59, 60, -1, 62, -1, - -1, 65, -1, 67, -1, -1, -1, -1, -1, -1, - 74, 170, -1, -1, -1, -1, 80, -1, -1, -1, - 84, -1, 86, 87, 88, 89, -1, -1, -1, -1, - 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 56, -1, -1, 171, 60, 61, -1, 63, + -1, 65, 66, -1, 68, -1, -1, -1, -1, -1, + -1, 75, -1, -1, -1, -1, -1, -1, 4, -1, + -1, 85, -1, 87, 88, 89, -1, -1, -1, -1, + -1, 95, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 107, -1, 31, -1, 33, -1, -1, + -1, -1, 38, 39, 118, -1, -1, 43, 122, 123, + 124, -1, -1, 127, -1, 129, 130, -1, -1, 133, + 56, -1, -1, -1, 60, 61, 140, 63, 142, 65, + 66, -1, 68, 147, 148, -1, -1, -1, -1, 75, + -1, -1, -1, -1, -1, -1, 160, -1, -1, 85, + -1, 87, 88, 89, -1, -1, -1, 171, -1, 95, + -1, -1, -1, 4, -1, -1, -1, -1, -1, -1, + -1, 107, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 22, 118, -1, -1, -1, 122, 123, 124, -1, + 31, 127, 33, 129, 130, -1, -1, 133, 39, -1, + -1, -1, 43, -1, 140, -1, 142, -1, -1, -1, + -1, 147, 148, -1, -1, 56, -1, -1, -1, 60, + 61, -1, 63, -1, 160, 66, -1, 68, -1, -1, + -1, -1, -1, -1, 75, 171, -1, -1, -1, -1, + -1, 4, -1, -1, 85, -1, 87, 88, 89, -1, + -1, -1, -1, -1, 95, 13, 14, 15, 16, 17, + 18, 19, 20, 21, -1, -1, -1, -1, 31, -1, + 33, -1, -1, -1, -1, -1, 39, 118, -1, -1, + 43, 122, 123, 124, -1, -1, 127, -1, 129, -1, + -1, -1, 133, 56, -1, -1, -1, 60, 61, 140, + 63, 142, -1, 66, -1, 68, 147, 148, -1, -1, + -1, -1, 75, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 85, -1, 87, 88, 89, -1, -1, -1, + 171, -1, 95, -1, -1, -1, 13, 14, 15, 16, + 17, 18, 19, 20, 21, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 118, -1, -1, -1, 122, + 123, 124, -1, -1, 127, -1, 129, -1, -1, -1, + 133, -1, -1, -1, -1, -1, -1, 140, -1, 142, + -1, -1, -1, -1, 147, 148, 13, 14, 15, 16, + 17, 18, 19, 151, 21, 153, 154, 155, 156, 157, + 158, 159, 160, 161, 162, -1, -1, -1, 171, -1, + -1, -1, 170, 171, -1, -1, -1, 175, 13, 14, + 15, 16, 17, 18, 19, 20, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 4, 117, -1, -1, -1, 121, 122, 123, - -1, -1, 126, -1, 128, -1, -1, -1, 132, -1, - -1, -1, -1, -1, 138, 139, -1, 141, 30, -1, - 32, -1, 146, 147, -1, 37, 38, -1, -1, -1, - 42, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 55, -1, -1, 170, 59, 60, -1, - 62, -1, 64, 65, -1, 67, -1, -1, -1, -1, - -1, -1, 74, -1, -1, -1, -1, -1, -1, -1, - 4, -1, 84, -1, 86, 87, 88, -1, -1, -1, - -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 106, -1, 30, -1, 32, -1, - -1, -1, -1, 37, 38, 117, -1, -1, 42, 121, - 122, 123, -1, -1, 126, -1, 128, 129, -1, -1, - 132, 55, -1, -1, -1, 59, 60, 139, 62, 141, - 64, 65, -1, 67, 146, 147, -1, -1, -1, -1, - 74, -1, -1, -1, -1, -1, -1, 159, 4, -1, - 84, -1, 86, 87, 88, -1, -1, -1, 170, -1, - 94, -1, -1, -1, -1, 21, -1, -1, -1, -1, - -1, -1, 106, -1, 30, -1, 32, -1, -1, -1, - -1, -1, 38, 117, -1, -1, 42, 121, 122, 123, - -1, -1, 126, -1, 128, 129, -1, -1, 132, 55, - -1, -1, -1, 59, 60, 139, 62, 141, -1, 65, - -1, 67, 146, 147, -1, -1, -1, -1, 74, -1, - -1, -1, -1, -1, -1, 159, 4, -1, 84, -1, - 86, 87, 88, -1, -1, -1, 170, -1, 94, 12, - 13, 14, 15, 16, 17, 18, 19, 20, -1, -1, - -1, -1, 30, -1, 32, -1, -1, -1, -1, -1, - 38, 117, -1, -1, 42, 121, 122, 123, -1, -1, - 126, -1, 128, -1, -1, -1, 132, 55, -1, -1, - -1, 59, 60, 139, 62, 141, -1, 65, -1, 67, - 146, 147, -1, -1, -1, -1, 74, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 84, -1, 86, 87, - 88, -1, -1, -1, 170, -1, 94, -1, -1, -1, - 12, 13, 14, 15, 16, 17, 18, 19, 20, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 117, - -1, -1, -1, 121, 122, 123, -1, -1, 126, -1, - 128, -1, -1, -1, 132, -1, -1, -1, -1, -1, - -1, 139, -1, 141, -1, -1, -1, -1, 146, 147, - 12, 13, 14, 15, 16, 17, 18, 150, 20, 152, - 153, 154, 155, 156, 157, 158, 159, 160, 161, -1, - -1, -1, 170, -1, -1, -1, 169, 170, -1, -1, - -1, 174, 12, 13, 14, 15, 16, 17, 18, 19, - 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 12, 13, 14, 15, 16, 17, - 18, 19, 20, -1, -1, 150, -1, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, 12, 13, 14, - 15, 16, 17, 18, 169, 170, -1, -1, 150, 174, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - -1, -1, -1, -1, -1, -1, -1, 169, 170, -1, - -1, -1, 174, 12, 13, 14, 15, 16, 17, 18, - 19, 20, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 12, 13, 14, 15, 16, 17, 18, -1, -1, - 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, - 12, 13, 14, 15, 16, 17, 18, 169, 170, -1, + 13, 14, 15, 16, 17, 18, 19, 20, 21, -1, + -1, 151, -1, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 13, 14, 15, 16, 17, 18, 19, + 170, 171, -1, -1, 151, 175, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, -1, -1, -1, -1, + -1, -1, -1, 170, 171, -1, -1, -1, 175, 13, + 14, 15, 16, 17, 18, 19, 20, 21, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 13, 14, 15, + 16, 17, 18, 19, -1, -1, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 13, 14, 15, 16, + 17, 18, 19, 170, 171, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 151, -1, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 13, 14, + 15, 16, 17, 18, 19, 170, 171, 172, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + -1, -1, -1, -1, -1, -1, -1, 170, 171, -1, + -1, -1, -1, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, -1, -1, -1, -1, -1, -1, -1, + 170, 171, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 151, -1, 153, + 154, 155, 156, 157, 158, 159, 160, 161, 162, -1, + -1, -1, -1, -1, -1, -1, 170, 171, 154, 155, + 156, 157, 158, 159, 160, 161, 162, -1, -1, -1, + -1, 4, -1, -1, 170, 171, -1, -1, 155, 156, + 157, 158, 159, 160, 161, 162, -1, -1, -1, -1, + -1, -1, -1, 170, 171, -1, -1, -1, 31, -1, + 33, -1, -1, -1, -1, -1, 39, 40, -1, -1, + 43, 156, 157, 158, 159, 160, 161, 162, -1, -1, + -1, 54, -1, 56, -1, 170, 171, 60, 61, -1, + 63, -1, -1, 66, -1, 68, -1, -1, -1, -1, + -1, -1, 75, -1, -1, -1, -1, -1, -1, 4, + -1, -1, 85, -1, 87, 88, 89, 90, -1, -1, + 93, -1, 95, -1, 97, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 31, -1, 33, -1, + -1, -1, -1, -1, 39, 118, -1, -1, 43, 122, + 123, 124, -1, -1, 127, -1, 129, -1, -1, -1, + 133, 56, -1, -1, -1, 60, 61, 140, 63, 142, + -1, 66, -1, 68, 147, 148, -1, -1, -1, -1, + 75, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 85, -1, 87, 88, 89, -1, -1, -1, -1, -1, + 95, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 150, -1, 152, 153, 154, 155, 156, 157, 158, 159, - 160, 161, 12, 13, 14, 15, 16, 17, 18, 169, - 170, 171, 150, 151, 152, 153, 154, 155, 156, 157, - 158, 159, 160, 161, -1, -1, -1, -1, -1, -1, - -1, 169, 170, -1, -1, -1, -1, 152, 153, 154, - 155, 156, 157, 158, 159, 160, 161, -1, -1, -1, - -1, -1, -1, -1, 169, 170, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 150, -1, 152, 153, 154, 155, 156, 157, 158, - 159, 160, 161, -1, -1, -1, -1, -1, -1, -1, - 169, 170, 153, 154, 155, 156, 157, 158, 159, 160, - 161, -1, -1, -1, -1, -1, 4, -1, 169, 170, - -1, -1, 154, 155, 156, 157, 158, 159, 160, 161, - -1, -1, -1, -1, -1, -1, -1, 169, 170, -1, - -1, -1, 30, -1, 32, -1, -1, -1, -1, -1, - 38, 39, -1, -1, 42, 155, 156, 157, 158, 159, - 160, 161, -1, -1, -1, 53, -1, 55, -1, 169, - 170, 59, 60, -1, 62, -1, -1, 65, -1, 67, - -1, -1, -1, -1, -1, -1, 74, -1, -1, -1, - -1, -1, -1, -1, 4, -1, 84, -1, 86, 87, - 88, 89, -1, -1, 92, -1, 94, -1, 96, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 30, -1, 32, -1, -1, -1, -1, -1, 38, 117, - -1, -1, 42, 121, 122, 123, -1, -1, 126, -1, - 128, -1, -1, -1, 132, 55, -1, -1, -1, 59, - 60, 139, 62, 141, -1, 65, -1, 67, 146, 147, - -1, -1, -1, -1, 74, -1, -1, -1, -1, 4, - -1, -1, -1, -1, 84, -1, 86, 87, 88, -1, - -1, -1, -1, -1, 94, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 30, -1, 32, -1, -1, - -1, -1, -1, 38, -1, -1, -1, 117, -1, -1, - -1, 121, 122, 123, -1, -1, 126, -1, 128, -1, - 55, -1, 132, -1, 59, 60, -1, -1, -1, 139, - 65, 141, 67, -1, -1, -1, 146, 147, -1, 74, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 86, 87, 88, -1, -1, -1, -1, -1, 94, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 121, 122, 123, -1, - -1, 126, -1, -1, -1, -1, 22, 132, 24, 25, - 26, -1, 28, 29, 139, 31, 141, -1, 34, -1, - 36, 146, 147, -1, -1, -1, -1, 43, 44, 45, - 46, -1, 48, 49, 50, 51, 52, -1, 54, -1, - 56, 57, 58, -1, -1, 61, -1, -1, -1, -1, - 66, -1, 68, 69, 70, 71, 72, 73, -1, 75, - 76, 77, 78, 79, -1, -1, 82, -1, -1, 85, - -1, -1, -1, -1, 90, 91, -1, 93, -1, -1, - -1, 97, 98, 99, -1, 101, 102, 103, 104, 105, - -1, 107, -1, 109, 110, 111, 112, 113, 114, 115, - 116, -1, 118, 119, 120, -1, -1, -1, 124, -1, - -1, 127, -1, -1, 130, 131, -1, -1, 134, 135, - 136, -1, -1, -1, 140, -1, 142, 143, 144, 145, - -1, -1, 148 + -1, -1, -1, 118, -1, -1, -1, 122, 123, 124, + -1, -1, 127, -1, 129, -1, -1, 23, 133, 25, + 26, 27, -1, 29, 30, 140, 32, 142, -1, 35, + -1, 37, 147, 148, -1, -1, -1, -1, 44, 45, + 46, 47, -1, 49, 50, 51, 52, 53, -1, 55, + -1, 57, 58, 59, -1, -1, 62, -1, -1, -1, + -1, 67, -1, 69, 70, 71, 72, 73, 74, -1, + 76, 77, 78, 79, 80, -1, -1, 83, -1, -1, + 86, -1, -1, -1, -1, 91, 92, -1, 94, -1, + -1, -1, 98, 99, 100, -1, 102, 103, 104, 105, + 106, -1, 108, -1, 110, 111, 112, 113, 114, 115, + 116, 117, -1, 119, 120, 121, -1, -1, -1, 125, + -1, -1, 128, -1, -1, 131, 132, -1, -1, 135, + 136, 137, -1, -1, -1, 141, -1, 143, 144, 145, + 146, -1, -1, 149 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ static const yytype_uint16 yystos[] = { - 0, 179, 180, 0, 4, 30, 32, 38, 39, 42, - 47, 53, 55, 59, 60, 62, 65, 67, 74, 80, - 84, 86, 87, 88, 89, 94, 117, 121, 122, 123, - 126, 128, 132, 138, 139, 141, 146, 147, 170, 184, - 185, 186, 187, 188, 191, 192, 199, 210, 224, 228, - 230, 231, 232, 233, 236, 237, 240, 242, 243, 244, - 245, 247, 248, 249, 250, 251, 253, 255, 272, 273, - 274, 275, 3, 4, 173, 3, 4, 3, 4, 226, - 86, 229, 8, 3, 4, 229, 173, 229, 230, 3, - 226, 198, 199, 3, 226, 230, 22, 24, 25, 26, - 28, 29, 31, 34, 36, 43, 44, 45, 46, 48, - 49, 50, 51, 52, 54, 56, 57, 58, 61, 66, - 68, 69, 70, 71, 72, 73, 75, 76, 77, 78, - 79, 82, 85, 90, 91, 93, 97, 98, 99, 101, - 102, 103, 104, 105, 107, 109, 110, 111, 112, 113, - 114, 115, 116, 118, 119, 120, 124, 127, 130, 131, - 134, 135, 136, 140, 142, 143, 144, 145, 148, 200, - 202, 271, 172, 181, 181, 92, 96, 190, 210, 231, - 236, 242, 246, 253, 272, 275, 172, 172, 175, 172, - 175, 172, 183, 172, 151, 241, 175, 254, 255, 254, - 254, 3, 4, 37, 64, 106, 129, 159, 173, 204, - 227, 256, 257, 270, 210, 272, 273, 275, 254, 172, - 8, 175, 172, 273, 175, 253, 133, 175, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 149, 171, 11, 81, 184, 189, - 192, 231, 233, 244, 245, 248, 176, 3, 3, 4, - 175, 270, 234, 108, 238, 242, 3, 4, 175, 182, - 252, 256, 256, 177, 170, 173, 197, 254, 174, 207, - 208, 209, 227, 174, 217, 256, 266, 173, 220, 8, - 227, 3, 5, 6, 7, 8, 9, 63, 100, 125, - 137, 154, 157, 158, 159, 162, 163, 173, 213, 214, - 215, 213, 216, 8, 8, 201, 216, 215, 8, 8, - 215, 8, 215, 213, 67, 215, 211, 212, 213, 271, - 215, 211, 213, 273, 273, 8, 10, 203, 5, 276, - 273, 202, 170, 173, 172, 183, 176, 198, 235, 151, - 95, 198, 222, 239, 172, 175, 182, 176, 184, 199, - 251, 256, 174, 216, 159, 212, 193, 194, 195, 196, - 199, 253, 176, 149, 177, 176, 198, 218, 149, 222, - 176, 199, 219, 222, 174, 174, 173, 213, 213, 213, - 213, 213, 213, 213, 253, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 150, 152, 153, 154, 155, 156, - 157, 158, 159, 160, 161, 169, 170, 149, 174, 174, - 174, 149, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 3, 174, 149, 174, 174, 149, 174, 174, 174, - 174, 174, 169, 174, 174, 202, 8, 183, 245, 151, - 253, 172, 176, 198, 223, 176, 188, 176, 183, 171, - 171, 174, 149, 253, 159, 173, 197, 204, 227, 262, - 264, 265, 209, 215, 253, 275, 256, 174, 172, 172, - 253, 174, 159, 173, 197, 204, 258, 260, 261, 213, - 213, 3, 213, 213, 213, 213, 213, 213, 213, 213, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 3, - 213, 215, 8, 174, 212, 215, 5, 174, 256, 253, - 172, 182, 183, 21, 196, 264, 252, 159, 193, 204, - 263, 264, 173, 197, 262, 268, 269, 172, 225, 227, - 260, 252, 159, 193, 204, 259, 260, 174, 173, 197, - 151, 171, 174, 183, 256, 176, 264, 252, 174, 264, - 174, 193, 151, 267, 149, 172, 175, 174, 260, 252, - 174, 264, 174, 213, 193, 213, 183, 264, 174, 216, - 268, 205, 264, 174, 36, 48, 176, 206, 215, 151, - 151, 172, 221, 222, 221, 172 + 0, 180, 181, 0, 4, 31, 33, 39, 40, 43, + 48, 54, 56, 60, 61, 63, 66, 68, 75, 81, + 85, 87, 88, 89, 90, 95, 118, 122, 123, 124, + 127, 129, 133, 139, 140, 142, 147, 148, 171, 185, + 186, 187, 188, 189, 192, 193, 200, 211, 225, 229, + 231, 232, 233, 234, 237, 238, 241, 243, 244, 245, + 246, 248, 249, 250, 251, 252, 254, 256, 273, 274, + 275, 276, 3, 4, 174, 3, 4, 3, 4, 227, + 87, 230, 8, 3, 4, 230, 174, 230, 231, 3, + 227, 199, 200, 3, 227, 231, 23, 25, 26, 27, + 29, 30, 32, 35, 37, 44, 45, 46, 47, 49, + 50, 51, 52, 53, 55, 57, 58, 59, 62, 67, + 69, 70, 71, 72, 73, 74, 76, 77, 78, 79, + 80, 83, 86, 91, 92, 94, 98, 99, 100, 102, + 103, 104, 105, 106, 108, 110, 111, 112, 113, 114, + 115, 116, 117, 119, 120, 121, 125, 128, 131, 132, + 135, 136, 137, 141, 143, 144, 145, 146, 149, 201, + 203, 272, 173, 182, 182, 93, 97, 191, 211, 232, + 237, 243, 247, 254, 273, 276, 173, 173, 176, 173, + 176, 173, 184, 173, 152, 242, 176, 255, 256, 255, + 255, 3, 4, 38, 65, 107, 130, 160, 174, 205, + 228, 257, 258, 271, 211, 273, 274, 276, 255, 173, + 8, 176, 173, 274, 176, 254, 134, 176, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, + 174, 174, 174, 174, 150, 172, 12, 82, 185, 190, + 193, 232, 234, 245, 246, 249, 177, 3, 3, 4, + 176, 271, 235, 109, 239, 243, 3, 4, 176, 183, + 253, 257, 257, 178, 171, 174, 198, 255, 175, 208, + 209, 210, 228, 175, 218, 257, 267, 174, 221, 8, + 228, 3, 5, 6, 7, 8, 9, 10, 64, 101, + 126, 138, 155, 158, 159, 160, 163, 164, 174, 214, + 215, 216, 214, 217, 8, 8, 202, 217, 216, 8, + 8, 216, 8, 216, 214, 68, 216, 212, 213, 214, + 272, 216, 212, 214, 274, 274, 8, 11, 204, 5, + 277, 274, 203, 171, 174, 173, 184, 177, 199, 236, + 152, 96, 199, 223, 240, 173, 176, 183, 177, 185, + 200, 252, 257, 175, 217, 160, 213, 194, 195, 196, + 197, 200, 254, 177, 150, 178, 177, 199, 219, 150, + 223, 177, 200, 220, 223, 175, 175, 174, 214, 214, + 214, 214, 214, 214, 214, 254, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 151, 153, 154, 155, 156, + 157, 158, 159, 160, 161, 162, 170, 171, 150, 175, + 175, 175, 150, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 3, 175, 150, 175, 175, 150, 175, 175, + 175, 175, 175, 170, 175, 175, 203, 8, 184, 246, + 152, 254, 173, 177, 199, 224, 177, 189, 177, 184, + 172, 172, 175, 150, 254, 160, 174, 198, 205, 228, + 263, 265, 266, 210, 216, 254, 276, 257, 175, 173, + 173, 254, 175, 160, 174, 198, 205, 259, 261, 262, + 214, 214, 3, 214, 214, 214, 214, 214, 214, 214, + 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, + 3, 214, 216, 8, 175, 213, 216, 5, 175, 257, + 254, 173, 183, 184, 22, 197, 265, 253, 160, 194, + 205, 264, 265, 174, 198, 263, 269, 270, 173, 226, + 228, 261, 253, 160, 194, 205, 260, 261, 175, 174, + 198, 152, 172, 175, 184, 257, 177, 265, 253, 175, + 265, 175, 194, 152, 268, 150, 173, 176, 175, 261, + 253, 175, 265, 175, 214, 194, 214, 184, 265, 175, + 217, 269, 206, 265, 175, 37, 49, 177, 207, 216, + 152, 152, 173, 222, 223, 222, 173 }; #define yyerrok (yyerrstatus = 0) @@ -3755,350 +3746,357 @@ yyreduce: /* Line 1455 of yacc.c */ #line 635 "parser.y" - { (yyval.expr) = make_exprs(EXPR_IDENTIFIER, (yyvsp[(1) - (1)].str)); ;} + { (yyval.expr) = make_exprs(EXPR_CHARCONST, (yyvsp[(1) - (1)].str)); ;} break; case 164: /* Line 1455 of yacc.c */ #line 636 "parser.y" - { (yyval.expr) = make_expr3(EXPR_COND, (yyvsp[(1) - (5)].expr), (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].expr)); ;} + { (yyval.expr) = make_exprs(EXPR_IDENTIFIER, (yyvsp[(1) - (1)].str)); ;} break; case 165: /* Line 1455 of yacc.c */ #line 637 "parser.y" - { (yyval.expr) = make_expr2(EXPR_LOGOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr3(EXPR_COND, (yyvsp[(1) - (5)].expr), (yyvsp[(3) - (5)].expr), (yyvsp[(5) - (5)].expr)); ;} break; case 166: /* Line 1455 of yacc.c */ #line 638 "parser.y" - { (yyval.expr) = make_expr2(EXPR_LOGAND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_LOGOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 167: /* Line 1455 of yacc.c */ #line 639 "parser.y" - { (yyval.expr) = make_expr2(EXPR_OR , (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_LOGAND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 168: /* Line 1455 of yacc.c */ #line 640 "parser.y" - { (yyval.expr) = make_expr2(EXPR_XOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_OR , (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 169: /* Line 1455 of yacc.c */ #line 641 "parser.y" - { (yyval.expr) = make_expr2(EXPR_AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_XOR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 170: /* Line 1455 of yacc.c */ #line 642 "parser.y" - { (yyval.expr) = make_expr2(EXPR_EQUALITY, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 171: /* Line 1455 of yacc.c */ #line 643 "parser.y" - { (yyval.expr) = make_expr2(EXPR_INEQUALITY, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_EQUALITY, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 172: /* Line 1455 of yacc.c */ #line 644 "parser.y" - { (yyval.expr) = make_expr2(EXPR_GTR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_INEQUALITY, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 173: /* Line 1455 of yacc.c */ #line 645 "parser.y" - { (yyval.expr) = make_expr2(EXPR_LESS, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_GTR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 174: /* Line 1455 of yacc.c */ #line 646 "parser.y" - { (yyval.expr) = make_expr2(EXPR_GTREQL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_LESS, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 175: /* Line 1455 of yacc.c */ #line 647 "parser.y" - { (yyval.expr) = make_expr2(EXPR_LESSEQL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_GTREQL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 176: /* Line 1455 of yacc.c */ #line 648 "parser.y" - { (yyval.expr) = make_expr2(EXPR_SHL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_LESSEQL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 177: /* Line 1455 of yacc.c */ #line 649 "parser.y" - { (yyval.expr) = make_expr2(EXPR_SHR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_SHL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 178: /* Line 1455 of yacc.c */ #line 650 "parser.y" - { (yyval.expr) = make_expr2(EXPR_ADD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_SHR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 179: /* Line 1455 of yacc.c */ #line 651 "parser.y" - { (yyval.expr) = make_expr2(EXPR_SUB, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_ADD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 180: /* Line 1455 of yacc.c */ #line 652 "parser.y" - { (yyval.expr) = make_expr2(EXPR_MOD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_SUB, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 181: /* Line 1455 of yacc.c */ #line 653 "parser.y" - { (yyval.expr) = make_expr2(EXPR_MUL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_MOD, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 182: /* Line 1455 of yacc.c */ #line 654 "parser.y" - { (yyval.expr) = make_expr2(EXPR_DIV, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_MUL, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 183: /* Line 1455 of yacc.c */ #line 655 "parser.y" - { (yyval.expr) = make_expr1(EXPR_LOGNOT, (yyvsp[(2) - (2)].expr)); ;} + { (yyval.expr) = make_expr2(EXPR_DIV, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); ;} break; case 184: /* Line 1455 of yacc.c */ #line 656 "parser.y" - { (yyval.expr) = make_expr1(EXPR_NOT, (yyvsp[(2) - (2)].expr)); ;} + { (yyval.expr) = make_expr1(EXPR_LOGNOT, (yyvsp[(2) - (2)].expr)); ;} break; case 185: /* Line 1455 of yacc.c */ #line 657 "parser.y" - { (yyval.expr) = make_expr1(EXPR_POS, (yyvsp[(2) - (2)].expr)); ;} + { (yyval.expr) = make_expr1(EXPR_NOT, (yyvsp[(2) - (2)].expr)); ;} break; case 186: /* Line 1455 of yacc.c */ #line 658 "parser.y" - { (yyval.expr) = make_expr1(EXPR_NEG, (yyvsp[(2) - (2)].expr)); ;} + { (yyval.expr) = make_expr1(EXPR_POS, (yyvsp[(2) - (2)].expr)); ;} break; case 187: /* Line 1455 of yacc.c */ #line 659 "parser.y" - { (yyval.expr) = make_expr1(EXPR_ADDRESSOF, (yyvsp[(2) - (2)].expr)); ;} + { (yyval.expr) = make_expr1(EXPR_NEG, (yyvsp[(2) - (2)].expr)); ;} break; case 188: /* Line 1455 of yacc.c */ #line 660 "parser.y" - { (yyval.expr) = make_expr1(EXPR_PPTR, (yyvsp[(2) - (2)].expr)); ;} + { (yyval.expr) = make_expr1(EXPR_ADDRESSOF, (yyvsp[(2) - (2)].expr)); ;} break; case 189: /* Line 1455 of yacc.c */ #line 661 "parser.y" - { (yyval.expr) = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, (yyvsp[(1) - (3)].expr)), make_exprs(EXPR_IDENTIFIER, (yyvsp[(3) - (3)].str))); ;} + { (yyval.expr) = make_expr1(EXPR_PPTR, (yyvsp[(2) - (2)].expr)); ;} break; case 190: /* Line 1455 of yacc.c */ #line 662 "parser.y" - { (yyval.expr) = make_expr2(EXPR_MEMBER, (yyvsp[(1) - (3)].expr), make_exprs(EXPR_IDENTIFIER, (yyvsp[(3) - (3)].str))); ;} + { (yyval.expr) = make_expr2(EXPR_MEMBER, make_expr1(EXPR_PPTR, (yyvsp[(1) - (3)].expr)), make_exprs(EXPR_IDENTIFIER, (yyvsp[(3) - (3)].str))); ;} break; case 191: /* Line 1455 of yacc.c */ -#line 664 "parser.y" - { (yyval.expr) = make_exprt(EXPR_CAST, declare_var(NULL, (yyvsp[(2) - (5)].declspec), (yyvsp[(3) - (5)].declarator), 0), (yyvsp[(5) - (5)].expr)); free((yyvsp[(2) - (5)].declspec)); free((yyvsp[(3) - (5)].declarator)); ;} +#line 663 "parser.y" + { (yyval.expr) = make_expr2(EXPR_MEMBER, (yyvsp[(1) - (3)].expr), make_exprs(EXPR_IDENTIFIER, (yyvsp[(3) - (3)].str))); ;} break; case 192: /* Line 1455 of yacc.c */ -#line 666 "parser.y" - { (yyval.expr) = make_exprt(EXPR_SIZEOF, declare_var(NULL, (yyvsp[(3) - (5)].declspec), (yyvsp[(4) - (5)].declarator), 0), NULL); free((yyvsp[(3) - (5)].declspec)); free((yyvsp[(4) - (5)].declarator)); ;} +#line 665 "parser.y" + { (yyval.expr) = make_exprt(EXPR_CAST, declare_var(NULL, (yyvsp[(2) - (5)].declspec), (yyvsp[(3) - (5)].declarator), 0), (yyvsp[(5) - (5)].expr)); free((yyvsp[(2) - (5)].declspec)); free((yyvsp[(3) - (5)].declarator)); ;} break; case 193: /* Line 1455 of yacc.c */ #line 667 "parser.y" - { (yyval.expr) = make_expr2(EXPR_ARRAY, (yyvsp[(1) - (4)].expr), (yyvsp[(3) - (4)].expr)); ;} + { (yyval.expr) = make_exprt(EXPR_SIZEOF, declare_var(NULL, (yyvsp[(3) - (5)].declspec), (yyvsp[(4) - (5)].declarator), 0), NULL); free((yyvsp[(3) - (5)].declspec)); free((yyvsp[(4) - (5)].declarator)); ;} break; case 194: /* Line 1455 of yacc.c */ #line 668 "parser.y" - { (yyval.expr) = (yyvsp[(2) - (3)].expr); ;} + { (yyval.expr) = make_expr2(EXPR_ARRAY, (yyvsp[(1) - (4)].expr), (yyvsp[(3) - (4)].expr)); ;} break; case 195: /* Line 1455 of yacc.c */ -#line 671 "parser.y" - { (yyval.expr_list) = append_expr( NULL, (yyvsp[(1) - (1)].expr) ); ;} +#line 669 "parser.y" + { (yyval.expr) = (yyvsp[(2) - (3)].expr); ;} break; case 196: /* Line 1455 of yacc.c */ #line 672 "parser.y" - { (yyval.expr_list) = append_expr( (yyvsp[(1) - (3)].expr_list), (yyvsp[(3) - (3)].expr) ); ;} + { (yyval.expr_list) = append_expr( NULL, (yyvsp[(1) - (1)].expr) ); ;} break; case 197: /* Line 1455 of yacc.c */ -#line 675 "parser.y" +#line 673 "parser.y" + { (yyval.expr_list) = append_expr( (yyvsp[(1) - (3)].expr_list), (yyvsp[(3) - (3)].expr) ); ;} + break; + + case 198: + +/* Line 1455 of yacc.c */ +#line 676 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); if (!(yyval.expr)->is_const) error_loc("expression is not an integer constant\n"); ;} break; - case 198: + case 199: /* Line 1455 of yacc.c */ -#line 681 "parser.y" +#line 682 "parser.y" { (yyval.expr) = (yyvsp[(1) - (1)].expr); if (!(yyval.expr)->is_const && (yyval.expr)->type != EXPR_STRLIT && (yyval.expr)->type != EXPR_WSTRLIT) error_loc("expression is not constant\n"); ;} break; - case 199: - -/* Line 1455 of yacc.c */ -#line 687 "parser.y" - { (yyval.var_list) = NULL; ;} - break; - case 200: /* Line 1455 of yacc.c */ #line 688 "parser.y" - { (yyval.var_list) = append_var_list((yyvsp[(1) - (2)].var_list), (yyvsp[(2) - (2)].var_list)); ;} + { (yyval.var_list) = NULL; ;} break; case 201: /* Line 1455 of yacc.c */ -#line 692 "parser.y" +#line 689 "parser.y" + { (yyval.var_list) = append_var_list((yyvsp[(1) - (2)].var_list), (yyvsp[(2) - (2)].var_list)); ;} + break; + + case 202: + +/* Line 1455 of yacc.c */ +#line 693 "parser.y" { const char *first = LIST_ENTRY(list_head((yyvsp[(3) - (4)].declarator_list)), declarator_t, entry)->var->name; check_field_attrs(first, (yyvsp[(1) - (4)].attr_list)); (yyval.var_list) = set_var_types((yyvsp[(1) - (4)].attr_list), (yyvsp[(2) - (4)].declspec), (yyvsp[(3) - (4)].declarator_list)); ;} break; - case 202: + case 203: /* Line 1455 of yacc.c */ -#line 696 "parser.y" +#line 697 "parser.y" { var_t *v = make_var(NULL); v->type = (yyvsp[(2) - (3)].type); v->attrs = (yyvsp[(1) - (3)].attr_list); (yyval.var_list) = append_var(NULL, v); ;} break; - case 203: - -/* Line 1455 of yacc.c */ -#line 703 "parser.y" - { (yyval.var) = (yyvsp[(1) - (2)].var); ;} - break; - case 204: /* Line 1455 of yacc.c */ #line 704 "parser.y" - { (yyval.var) = make_var(NULL); (yyval.var)->attrs = (yyvsp[(1) - (2)].attr_list); ;} + { (yyval.var) = (yyvsp[(1) - (2)].var); ;} break; case 205: /* Line 1455 of yacc.c */ -#line 707 "parser.y" - { (yyval.var_list) = NULL; ;} +#line 705 "parser.y" + { (yyval.var) = make_var(NULL); (yyval.var)->attrs = (yyvsp[(1) - (2)].attr_list); ;} break; case 206: /* Line 1455 of yacc.c */ #line 708 "parser.y" - { (yyval.var_list) = append_var( (yyvsp[(1) - (2)].var_list), (yyvsp[(2) - (2)].var) ); ;} + { (yyval.var_list) = NULL; ;} break; case 207: /* Line 1455 of yacc.c */ -#line 712 "parser.y" - { (yyval.var) = (yyvsp[(1) - (2)].var); ;} +#line 709 "parser.y" + { (yyval.var_list) = append_var( (yyvsp[(1) - (2)].var_list), (yyvsp[(2) - (2)].var) ); ;} break; case 208: /* Line 1455 of yacc.c */ #line 713 "parser.y" - { (yyval.var) = NULL; ;} + { (yyval.var) = (yyvsp[(1) - (2)].var); ;} break; case 209: /* Line 1455 of yacc.c */ -#line 716 "parser.y" +#line 714 "parser.y" + { (yyval.var) = NULL; ;} + break; + + case 210: + +/* Line 1455 of yacc.c */ +#line 717 "parser.y" { (yyval.var) = declare_var(check_field_attrs((yyvsp[(3) - (3)].declarator)->var->name, (yyvsp[(1) - (3)].attr_list)), (yyvsp[(2) - (3)].declspec), (yyvsp[(3) - (3)].declarator), FALSE); free((yyvsp[(3) - (3)].declarator)); ;} break; - case 210: + case 211: /* Line 1455 of yacc.c */ -#line 723 "parser.y" +#line 724 "parser.y" { var_t *v; v = declare_var(check_function_attrs((yyvsp[(3) - (3)].declarator)->var->name, (yyvsp[(1) - (3)].attr_list)), (yyvsp[(2) - (3)].declspec), (yyvsp[(3) - (3)].declarator), FALSE); @@ -4107,43 +4105,36 @@ yyreduce: ;} break; - case 211: - -/* Line 1455 of yacc.c */ -#line 733 "parser.y" - { (yyval.var) = declare_var((yyvsp[(1) - (3)].attr_list), (yyvsp[(2) - (3)].declspec), (yyvsp[(3) - (3)].declarator), FALSE); - free((yyvsp[(3) - (3)].declarator)); - ;} - break; - case 212: /* Line 1455 of yacc.c */ -#line 736 "parser.y" - { (yyval.var) = declare_var(NULL, (yyvsp[(1) - (2)].declspec), (yyvsp[(2) - (2)].declarator), FALSE); - free((yyvsp[(2) - (2)].declarator)); +#line 734 "parser.y" + { (yyval.var) = declare_var((yyvsp[(1) - (3)].attr_list), (yyvsp[(2) - (3)].declspec), (yyvsp[(3) - (3)].declarator), FALSE); + free((yyvsp[(3) - (3)].declarator)); ;} break; case 213: /* Line 1455 of yacc.c */ -#line 741 "parser.y" - { (yyval.var) = NULL; ;} +#line 737 "parser.y" + { (yyval.var) = declare_var(NULL, (yyvsp[(1) - (2)].declspec), (yyvsp[(2) - (2)].declarator), FALSE); + free((yyvsp[(2) - (2)].declarator)); + ;} break; - case 215: + case 214: /* Line 1455 of yacc.c */ -#line 745 "parser.y" - { (yyval.str) = NULL; ;} +#line 742 "parser.y" + { (yyval.var) = NULL; ;} break; case 216: /* Line 1455 of yacc.c */ #line 746 "parser.y" - { (yyval.str) = (yyvsp[(1) - (1)].str); ;} + { (yyval.str) = NULL; ;} break; case 217: @@ -4156,22 +4147,22 @@ yyreduce: case 218: /* Line 1455 of yacc.c */ -#line 750 "parser.y" - { (yyval.var) = make_var((yyvsp[(1) - (1)].str)); ;} +#line 748 "parser.y" + { (yyval.str) = (yyvsp[(1) - (1)].str); ;} break; case 219: /* Line 1455 of yacc.c */ -#line 752 "parser.y" +#line 751 "parser.y" { (yyval.var) = make_var((yyvsp[(1) - (1)].str)); ;} break; case 220: /* Line 1455 of yacc.c */ -#line 755 "parser.y" - { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;} +#line 753 "parser.y" + { (yyval.var) = make_var((yyvsp[(1) - (1)].str)); ;} break; case 221: @@ -4181,32 +4172,32 @@ yyreduce: { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;} break; - case 223: + case 222: /* Line 1455 of yacc.c */ -#line 758 "parser.y" - { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[(2) - (2)].type)), -1); ;} +#line 757 "parser.y" + { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;} break; case 224: /* Line 1455 of yacc.c */ #line 759 "parser.y" - { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[(2) - (2)].type)), 1); ;} + { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[(2) - (2)].type)), -1); ;} break; case 225: /* Line 1455 of yacc.c */ #line 760 "parser.y" - { (yyval.type) = type_new_int(TYPE_BASIC_INT, 1); ;} + { (yyval.type) = type_new_int(type_basic_get_type((yyvsp[(2) - (2)].type)), 1); ;} break; case 226: /* Line 1455 of yacc.c */ #line 761 "parser.y" - { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;} + { (yyval.type) = type_new_int(TYPE_BASIC_INT, 1); ;} break; case 227: @@ -4237,73 +4228,80 @@ yyreduce: { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;} break; - case 233: + case 231: /* Line 1455 of yacc.c */ -#line 772 "parser.y" - { (yyval.type) = type_new_int(TYPE_BASIC_INT, 0); ;} +#line 766 "parser.y" + { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;} break; case 234: /* Line 1455 of yacc.c */ #line 773 "parser.y" - { (yyval.type) = type_new_int(TYPE_BASIC_INT16, 0); ;} + { (yyval.type) = type_new_int(TYPE_BASIC_INT, 0); ;} break; case 235: /* Line 1455 of yacc.c */ #line 774 "parser.y" - { (yyval.type) = type_new_int(TYPE_BASIC_INT8, 0); ;} + { (yyval.type) = type_new_int(TYPE_BASIC_INT16, 0); ;} break; case 236: /* Line 1455 of yacc.c */ #line 775 "parser.y" - { (yyval.type) = type_new_int(TYPE_BASIC_INT32, 0); ;} + { (yyval.type) = type_new_int(TYPE_BASIC_INT8, 0); ;} break; case 237: /* Line 1455 of yacc.c */ #line 776 "parser.y" - { (yyval.type) = type_new_int(TYPE_BASIC_HYPER, 0); ;} + { (yyval.type) = type_new_int(TYPE_BASIC_INT32, 0); ;} break; case 238: /* Line 1455 of yacc.c */ #line 777 "parser.y" - { (yyval.type) = type_new_int(TYPE_BASIC_INT64, 0); ;} + { (yyval.type) = type_new_int(TYPE_BASIC_HYPER, 0); ;} break; case 239: /* Line 1455 of yacc.c */ #line 778 "parser.y" - { (yyval.type) = type_new_int(TYPE_BASIC_CHAR, 0); ;} + { (yyval.type) = type_new_int(TYPE_BASIC_INT64, 0); ;} break; case 240: /* Line 1455 of yacc.c */ #line 779 "parser.y" - { (yyval.type) = type_new_int(TYPE_BASIC_INT3264, 0); ;} + { (yyval.type) = type_new_int(TYPE_BASIC_CHAR, 0); ;} break; case 241: /* Line 1455 of yacc.c */ -#line 782 "parser.y" - { (yyval.type) = type_new_coclass((yyvsp[(2) - (2)].str)); ;} +#line 780 "parser.y" + { (yyval.type) = type_new_int(TYPE_BASIC_INT3264, 0); ;} break; case 242: /* Line 1455 of yacc.c */ #line 783 "parser.y" + { (yyval.type) = type_new_coclass((yyvsp[(2) - (2)].str)); ;} + break; + + case 243: + +/* Line 1455 of yacc.c */ +#line 784 "parser.y" { (yyval.type) = find_type((yyvsp[(2) - (2)].str), 0); if (type_get_type_detect_alias((yyval.type)) != TYPE_COCLASS) error_loc("%s was not declared a coclass at %s:%d\n", @@ -4312,49 +4310,42 @@ yyreduce: ;} break; - case 243: + case 244: /* Line 1455 of yacc.c */ -#line 791 "parser.y" +#line 792 "parser.y" { (yyval.type) = (yyvsp[(2) - (2)].type); check_def((yyval.type)); (yyval.type)->attrs = check_coclass_attrs((yyvsp[(2) - (2)].type)->name, (yyvsp[(1) - (2)].attr_list)); ;} break; - case 244: - -/* Line 1455 of yacc.c */ -#line 798 "parser.y" - { (yyval.type) = type_coclass_define((yyvsp[(1) - (5)].type), (yyvsp[(3) - (5)].ifref_list)); ;} - break; - case 245: /* Line 1455 of yacc.c */ -#line 801 "parser.y" - { (yyval.ifref_list) = NULL; ;} +#line 799 "parser.y" + { (yyval.type) = type_coclass_define((yyvsp[(1) - (5)].type), (yyvsp[(3) - (5)].ifref_list)); ;} break; case 246: /* Line 1455 of yacc.c */ #line 802 "parser.y" - { (yyval.ifref_list) = append_ifref( (yyvsp[(1) - (2)].ifref_list), (yyvsp[(2) - (2)].ifref) ); ;} + { (yyval.ifref_list) = NULL; ;} break; case 247: /* Line 1455 of yacc.c */ -#line 806 "parser.y" - { (yyval.ifref) = make_ifref((yyvsp[(2) - (2)].type)); (yyval.ifref)->attrs = (yyvsp[(1) - (2)].attr_list); ;} +#line 803 "parser.y" + { (yyval.ifref_list) = append_ifref( (yyvsp[(1) - (2)].ifref_list), (yyvsp[(2) - (2)].ifref) ); ;} break; case 248: /* Line 1455 of yacc.c */ -#line 809 "parser.y" - { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[(2) - (2)].str), 0); ;} +#line 807 "parser.y" + { (yyval.ifref) = make_ifref((yyvsp[(2) - (2)].type)); (yyval.ifref)->attrs = (yyvsp[(1) - (2)].attr_list); ;} break; case 249: @@ -4367,7 +4358,14 @@ yyreduce: case 250: /* Line 1455 of yacc.c */ -#line 813 "parser.y" +#line 811 "parser.y" + { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[(2) - (2)].str), 0); ;} + break; + + case 251: + +/* Line 1455 of yacc.c */ +#line 814 "parser.y" { attr_t *attrs; is_object_interface = TRUE; (yyval.type) = (yyvsp[(2) - (2)].type); @@ -4378,71 +4376,64 @@ yyreduce: ;} break; - case 251: - -/* Line 1455 of yacc.c */ -#line 823 "parser.y" - { (yyval.var_list) = NULL; ;} - break; - case 252: /* Line 1455 of yacc.c */ #line 824 "parser.y" - { (yyval.var_list) = append_var( (yyvsp[(1) - (3)].var_list), (yyvsp[(2) - (3)].var) ); ;} + { (yyval.var_list) = NULL; ;} break; case 253: /* Line 1455 of yacc.c */ -#line 827 "parser.y" - { (yyval.stmt_list) = NULL; ;} +#line 825 "parser.y" + { (yyval.var_list) = append_var( (yyvsp[(1) - (3)].var_list), (yyvsp[(2) - (3)].var) ); ;} break; case 254: /* Line 1455 of yacc.c */ #line 828 "parser.y" - { (yyval.stmt_list) = append_func( (yyvsp[(1) - (3)].stmt_list), (yyvsp[(2) - (3)].func) ); ;} + { (yyval.stmt_list) = NULL; ;} break; case 255: /* Line 1455 of yacc.c */ -#line 834 "parser.y" - { (yyval.type) = (yyvsp[(1) - (5)].type); - type_dispinterface_define((yyval.type), (yyvsp[(3) - (5)].var_list), (yyvsp[(4) - (5)].stmt_list)); - ;} +#line 829 "parser.y" + { (yyval.stmt_list) = append_func( (yyvsp[(1) - (3)].stmt_list), (yyvsp[(2) - (3)].func) ); ;} break; case 256: /* Line 1455 of yacc.c */ -#line 838 "parser.y" +#line 835 "parser.y" { (yyval.type) = (yyvsp[(1) - (5)].type); - type_dispinterface_define_from_iface((yyval.type), (yyvsp[(3) - (5)].type)); + type_dispinterface_define((yyval.type), (yyvsp[(3) - (5)].var_list), (yyvsp[(4) - (5)].stmt_list)); ;} break; case 257: /* Line 1455 of yacc.c */ -#line 843 "parser.y" - { (yyval.type) = NULL; ;} +#line 839 "parser.y" + { (yyval.type) = (yyvsp[(1) - (5)].type); + type_dispinterface_define_from_iface((yyval.type), (yyvsp[(3) - (5)].type)); + ;} break; case 258: /* Line 1455 of yacc.c */ #line 844 "parser.y" - { (yyval.type) = find_type_or_error2((yyvsp[(2) - (2)].str), 0); ;} + { (yyval.type) = NULL; ;} break; case 259: /* Line 1455 of yacc.c */ -#line 847 "parser.y" - { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[(2) - (2)].str), 0); ;} +#line 845 "parser.y" + { (yyval.type) = find_type_or_error2((yyvsp[(2) - (2)].str), 0); is_object_interface = 1; ;} break; case 260: @@ -4455,49 +4446,49 @@ yyreduce: case 261: /* Line 1455 of yacc.c */ -#line 851 "parser.y" - { (yyval.ifinfo).interface = (yyvsp[(2) - (2)].type); - (yyval.ifinfo).old_pointer_default = pointer_default; - if (is_attr((yyvsp[(1) - (2)].attr_list), ATTR_POINTERDEFAULT)) - pointer_default = get_attrv((yyvsp[(1) - (2)].attr_list), ATTR_POINTERDEFAULT); - is_object_interface = is_object((yyvsp[(1) - (2)].attr_list)); - check_def((yyvsp[(2) - (2)].type)); - (yyvsp[(2) - (2)].type)->attrs = check_iface_attrs((yyvsp[(2) - (2)].type)->name, (yyvsp[(1) - (2)].attr_list)); - (yyvsp[(2) - (2)].type)->defined = TRUE; - ;} +#line 849 "parser.y" + { (yyval.type) = get_type(TYPE_INTERFACE, (yyvsp[(2) - (2)].str), 0); ;} break; case 262: /* Line 1455 of yacc.c */ -#line 863 "parser.y" - { (yyval.type) = (yyvsp[(1) - (6)].ifinfo).interface; - type_interface_define((yyval.type), (yyvsp[(2) - (6)].type), (yyvsp[(4) - (6)].stmt_list)); - pointer_default = (yyvsp[(1) - (6)].ifinfo).old_pointer_default; +#line 852 "parser.y" + { (yyval.ifinfo).interface = (yyvsp[(2) - (2)].type); + (yyval.ifinfo).old_pointer_default = pointer_default; + if (is_attr((yyvsp[(1) - (2)].attr_list), ATTR_POINTERDEFAULT)) + pointer_default = get_attrv((yyvsp[(1) - (2)].attr_list), ATTR_POINTERDEFAULT); + check_def((yyvsp[(2) - (2)].type)); + (yyvsp[(2) - (2)].type)->attrs = check_iface_attrs((yyvsp[(2) - (2)].type)->name, (yyvsp[(1) - (2)].attr_list)); + is_object_interface = is_object((yyvsp[(2) - (2)].type)); + (yyvsp[(2) - (2)].type)->defined = TRUE; ;} break; case 263: /* Line 1455 of yacc.c */ -#line 871 "parser.y" - { (yyval.type) = (yyvsp[(1) - (8)].ifinfo).interface; - type_interface_define((yyval.type), find_type_or_error2((yyvsp[(3) - (8)].str), 0), (yyvsp[(6) - (8)].stmt_list)); - pointer_default = (yyvsp[(1) - (8)].ifinfo).old_pointer_default; +#line 864 "parser.y" + { (yyval.type) = (yyvsp[(1) - (6)].ifinfo).interface; + type_interface_define((yyval.type), (yyvsp[(2) - (6)].type), (yyvsp[(4) - (6)].stmt_list)); + pointer_default = (yyvsp[(1) - (6)].ifinfo).old_pointer_default; ;} break; case 264: /* Line 1455 of yacc.c */ -#line 875 "parser.y" - { (yyval.type) = (yyvsp[(1) - (2)].type); ;} +#line 872 "parser.y" + { (yyval.type) = (yyvsp[(1) - (8)].ifinfo).interface; + type_interface_define((yyval.type), find_type_or_error2((yyvsp[(3) - (8)].str), 0), (yyvsp[(6) - (8)].stmt_list)); + pointer_default = (yyvsp[(1) - (8)].ifinfo).old_pointer_default; + ;} break; case 265: /* Line 1455 of yacc.c */ -#line 879 "parser.y" +#line 876 "parser.y" { (yyval.type) = (yyvsp[(1) - (2)].type); ;} break; @@ -4511,8 +4502,8 @@ yyreduce: case 267: /* Line 1455 of yacc.c */ -#line 883 "parser.y" - { (yyval.type) = type_new_module((yyvsp[(2) - (2)].str)); ;} +#line 881 "parser.y" + { (yyval.type) = (yyvsp[(1) - (2)].type); ;} break; case 268: @@ -4525,96 +4516,96 @@ yyreduce: case 269: /* Line 1455 of yacc.c */ -#line 887 "parser.y" - { (yyval.type) = (yyvsp[(2) - (2)].type); - (yyval.type)->attrs = check_module_attrs((yyvsp[(2) - (2)].type)->name, (yyvsp[(1) - (2)].attr_list)); - ;} +#line 885 "parser.y" + { (yyval.type) = type_new_module((yyvsp[(2) - (2)].str)); ;} break; case 270: /* Line 1455 of yacc.c */ -#line 893 "parser.y" - { (yyval.type) = (yyvsp[(1) - (5)].type); - type_module_define((yyval.type), (yyvsp[(3) - (5)].stmt_list)); +#line 888 "parser.y" + { (yyval.type) = (yyvsp[(2) - (2)].type); + (yyval.type)->attrs = check_module_attrs((yyvsp[(2) - (2)].type)->name, (yyvsp[(1) - (2)].attr_list)); ;} break; case 271: /* Line 1455 of yacc.c */ -#line 899 "parser.y" - { (yyval.stgclass) = STG_EXTERN; ;} +#line 894 "parser.y" + { (yyval.type) = (yyvsp[(1) - (5)].type); + type_module_define((yyval.type), (yyvsp[(3) - (5)].stmt_list)); + ;} break; case 272: /* Line 1455 of yacc.c */ #line 900 "parser.y" - { (yyval.stgclass) = STG_STATIC; ;} + { (yyval.stgclass) = STG_EXTERN; ;} break; case 273: /* Line 1455 of yacc.c */ #line 901 "parser.y" - { (yyval.stgclass) = STG_REGISTER; ;} + { (yyval.stgclass) = STG_STATIC; ;} break; case 274: /* Line 1455 of yacc.c */ -#line 905 "parser.y" - { (yyval.attr) = make_attr(ATTR_INLINE); ;} +#line 902 "parser.y" + { (yyval.stgclass) = STG_REGISTER; ;} break; case 275: /* Line 1455 of yacc.c */ -#line 909 "parser.y" - { (yyval.attr) = make_attr(ATTR_CONST); ;} +#line 906 "parser.y" + { (yyval.attr) = make_attr(ATTR_INLINE); ;} break; case 276: /* Line 1455 of yacc.c */ -#line 912 "parser.y" - { (yyval.attr_list) = NULL; ;} +#line 910 "parser.y" + { (yyval.attr) = make_attr(ATTR_CONST); ;} break; case 277: /* Line 1455 of yacc.c */ #line 913 "parser.y" - { (yyval.attr_list) = append_attr((yyvsp[(1) - (2)].attr_list), (yyvsp[(2) - (2)].attr)); ;} + { (yyval.attr_list) = NULL; ;} break; case 278: /* Line 1455 of yacc.c */ -#line 916 "parser.y" - { (yyval.declspec) = make_decl_spec((yyvsp[(1) - (2)].type), (yyvsp[(2) - (2)].declspec), NULL, NULL, STG_NONE); ;} +#line 914 "parser.y" + { (yyval.attr_list) = append_attr((yyvsp[(1) - (2)].attr_list), (yyvsp[(2) - (2)].attr)); ;} break; case 279: /* Line 1455 of yacc.c */ -#line 918 "parser.y" - { (yyval.declspec) = make_decl_spec((yyvsp[(2) - (3)].type), (yyvsp[(1) - (3)].declspec), (yyvsp[(3) - (3)].declspec), NULL, STG_NONE); ;} +#line 917 "parser.y" + { (yyval.declspec) = make_decl_spec((yyvsp[(1) - (2)].type), (yyvsp[(2) - (2)].declspec), NULL, NULL, STG_NONE); ;} break; case 280: /* Line 1455 of yacc.c */ -#line 921 "parser.y" - { (yyval.declspec) = NULL; ;} +#line 919 "parser.y" + { (yyval.declspec) = make_decl_spec((yyvsp[(2) - (3)].type), (yyvsp[(1) - (3)].declspec), (yyvsp[(3) - (3)].declspec), NULL, STG_NONE); ;} break; - case 282: + case 281: /* Line 1455 of yacc.c */ -#line 926 "parser.y" - { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[(2) - (2)].declspec), NULL, (yyvsp[(1) - (2)].attr), STG_NONE); ;} +#line 922 "parser.y" + { (yyval.declspec) = NULL; ;} break; case 283: @@ -4628,126 +4619,123 @@ yyreduce: /* Line 1455 of yacc.c */ #line 928 "parser.y" - { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[(2) - (2)].declspec), NULL, NULL, (yyvsp[(1) - (2)].stgclass)); ;} + { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[(2) - (2)].declspec), NULL, (yyvsp[(1) - (2)].attr), STG_NONE); ;} break; case 285: /* Line 1455 of yacc.c */ -#line 933 "parser.y" - { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;} +#line 929 "parser.y" + { (yyval.declspec) = make_decl_spec(NULL, (yyvsp[(2) - (2)].declspec), NULL, NULL, (yyvsp[(1) - (2)].stgclass)); ;} break; case 286: /* Line 1455 of yacc.c */ #line 934 "parser.y" - { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;} + { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;} break; - case 288: + case 287: /* Line 1455 of yacc.c */ -#line 939 "parser.y" - { (yyval.declarator) = make_declarator((yyvsp[(1) - (1)].var)); ;} +#line 935 "parser.y" + { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;} break; case 289: /* Line 1455 of yacc.c */ #line 940 "parser.y" - { (yyval.declarator) = (yyvsp[(2) - (3)].declarator); ;} + { (yyval.declarator) = make_declarator((yyvsp[(1) - (1)].var)); ;} break; case 290: /* Line 1455 of yacc.c */ #line 941 "parser.y" - { (yyval.declarator) = (yyvsp[(1) - (2)].declarator); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(2) - (2)].expr)); ;} + { (yyval.declarator) = (yyvsp[(2) - (3)].declarator); ;} break; case 291: /* Line 1455 of yacc.c */ #line 942 "parser.y" - { (yyval.declarator) = (yyvsp[(1) - (4)].declarator); - (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, type_new_function((yyvsp[(3) - (4)].var_list))); - (yyval.declarator)->type = NULL; - ;} + { (yyval.declarator) = (yyvsp[(1) - (2)].declarator); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(2) - (2)].expr)); ;} break; case 292: /* Line 1455 of yacc.c */ -#line 951 "parser.y" - { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;} +#line 943 "parser.y" + { (yyval.declarator) = (yyvsp[(1) - (4)].declarator); + (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, type_new_function((yyvsp[(3) - (4)].var_list))); + (yyval.declarator)->type = NULL; + ;} break; case 293: /* Line 1455 of yacc.c */ #line 952 "parser.y" - { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;} + { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;} break; - case 295: + case 294: /* Line 1455 of yacc.c */ -#line 959 "parser.y" - { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;} +#line 953 "parser.y" + { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;} break; case 296: /* Line 1455 of yacc.c */ #line 960 "parser.y" - { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;} + { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;} break; case 297: /* Line 1455 of yacc.c */ -#line 964 "parser.y" - { (yyval.declarator) = make_declarator(NULL); ;} +#line 961 "parser.y" + { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;} break; - case 299: + case 298: /* Line 1455 of yacc.c */ -#line 970 "parser.y" - { (yyval.declarator) = (yyvsp[(2) - (3)].declarator); ;} +#line 965 "parser.y" + { (yyval.declarator) = make_declarator(NULL); ;} break; case 300: /* Line 1455 of yacc.c */ #line 971 "parser.y" - { (yyval.declarator) = (yyvsp[(1) - (2)].declarator); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(2) - (2)].expr)); ;} + { (yyval.declarator) = (yyvsp[(2) - (3)].declarator); ;} break; case 301: /* Line 1455 of yacc.c */ #line 972 "parser.y" - { (yyval.declarator) = make_declarator(NULL); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(1) - (1)].expr)); ;} + { (yyval.declarator) = (yyvsp[(1) - (2)].declarator); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(2) - (2)].expr)); ;} break; case 302: /* Line 1455 of yacc.c */ -#line 974 "parser.y" - { (yyval.declarator) = make_declarator(NULL); - (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, type_new_function((yyvsp[(2) - (3)].var_list))); - (yyval.declarator)->type = NULL; - ;} +#line 973 "parser.y" + { (yyval.declarator) = make_declarator(NULL); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(1) - (1)].expr)); ;} break; case 303: /* Line 1455 of yacc.c */ -#line 979 "parser.y" - { (yyval.declarator) = (yyvsp[(1) - (4)].declarator); - (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, type_new_function((yyvsp[(3) - (4)].var_list))); +#line 975 "parser.y" + { (yyval.declarator) = make_declarator(NULL); + (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, type_new_function((yyvsp[(2) - (3)].var_list))); (yyval.declarator)->type = NULL; ;} break; @@ -4755,82 +4743,82 @@ yyreduce: case 304: /* Line 1455 of yacc.c */ -#line 988 "parser.y" - { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;} +#line 980 "parser.y" + { (yyval.declarator) = (yyvsp[(1) - (4)].declarator); + (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, type_new_function((yyvsp[(3) - (4)].var_list))); + (yyval.declarator)->type = NULL; + ;} break; case 305: /* Line 1455 of yacc.c */ #line 989 "parser.y" - { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;} + { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;} break; - case 307: + case 306: /* Line 1455 of yacc.c */ -#line 996 "parser.y" - { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;} +#line 990 "parser.y" + { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;} break; case 308: /* Line 1455 of yacc.c */ #line 997 "parser.y" - { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;} + { (yyval.declarator) = (yyvsp[(3) - (3)].declarator); (yyval.declarator)->type = append_ptrchain_type((yyval.declarator)->type, type_new_pointer(pointer_default, NULL, (yyvsp[(2) - (3)].attr_list))); ;} break; case 309: /* Line 1455 of yacc.c */ -#line 1001 "parser.y" - { (yyval.declarator) = make_declarator(NULL); ;} +#line 998 "parser.y" + { (yyval.declarator) = (yyvsp[(2) - (2)].declarator); (yyval.declarator)->type->attrs = append_attr((yyval.declarator)->type->attrs, make_attrp(ATTR_CALLCONV, (yyvsp[(1) - (2)].str))); ;} break; - case 311: + case 310: /* Line 1455 of yacc.c */ -#line 1009 "parser.y" - { (yyval.declarator) = make_declarator((yyvsp[(1) - (1)].var)); ;} +#line 1002 "parser.y" + { (yyval.declarator) = make_declarator(NULL); ;} break; case 312: /* Line 1455 of yacc.c */ #line 1010 "parser.y" - { (yyval.declarator) = (yyvsp[(2) - (3)].declarator); ;} + { (yyval.declarator) = make_declarator((yyvsp[(1) - (1)].var)); ;} break; case 313: /* Line 1455 of yacc.c */ #line 1011 "parser.y" - { (yyval.declarator) = (yyvsp[(1) - (2)].declarator); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(2) - (2)].expr)); ;} + { (yyval.declarator) = (yyvsp[(2) - (3)].declarator); ;} break; case 314: /* Line 1455 of yacc.c */ #line 1012 "parser.y" - { (yyval.declarator) = make_declarator(NULL); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(1) - (1)].expr)); ;} + { (yyval.declarator) = (yyvsp[(1) - (2)].declarator); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(2) - (2)].expr)); ;} break; case 315: /* Line 1455 of yacc.c */ -#line 1014 "parser.y" - { (yyval.declarator) = make_declarator(NULL); - (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, type_new_function((yyvsp[(2) - (3)].var_list))); - (yyval.declarator)->type = NULL; - ;} +#line 1013 "parser.y" + { (yyval.declarator) = make_declarator(NULL); (yyval.declarator)->array = append_array((yyval.declarator)->array, (yyvsp[(1) - (1)].expr)); ;} break; case 316: /* Line 1455 of yacc.c */ -#line 1019 "parser.y" - { (yyval.declarator) = (yyvsp[(1) - (4)].declarator); - (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, type_new_function((yyvsp[(3) - (4)].var_list))); +#line 1015 "parser.y" + { (yyval.declarator) = make_declarator(NULL); + (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, type_new_function((yyvsp[(2) - (3)].var_list))); (yyval.declarator)->type = NULL; ;} break; @@ -4838,116 +4826,119 @@ yyreduce: case 317: /* Line 1455 of yacc.c */ -#line 1026 "parser.y" - { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[(1) - (1)].declarator) ); ;} +#line 1020 "parser.y" + { (yyval.declarator) = (yyvsp[(1) - (4)].declarator); + (yyval.declarator)->func_type = append_ptrchain_type((yyval.declarator)->type, type_new_function((yyvsp[(3) - (4)].var_list))); + (yyval.declarator)->type = NULL; + ;} break; case 318: /* Line 1455 of yacc.c */ #line 1027 "parser.y" - { (yyval.declarator_list) = append_declarator( (yyvsp[(1) - (3)].declarator_list), (yyvsp[(3) - (3)].declarator) ); ;} + { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[(1) - (1)].declarator) ); ;} break; case 319: /* Line 1455 of yacc.c */ -#line 1030 "parser.y" - { (yyval.expr) = NULL; ;} +#line 1028 "parser.y" + { (yyval.declarator_list) = append_declarator( (yyvsp[(1) - (3)].declarator_list), (yyvsp[(3) - (3)].declarator) ); ;} break; case 320: /* Line 1455 of yacc.c */ #line 1031 "parser.y" - { (yyval.expr) = (yyvsp[(2) - (2)].expr); ;} + { (yyval.expr) = NULL; ;} break; case 321: /* Line 1455 of yacc.c */ -#line 1034 "parser.y" - { (yyval.declarator) = (yyvsp[(1) - (2)].declarator); (yyval.declarator)->bits = (yyvsp[(2) - (2)].expr); - if (!(yyval.declarator)->bits && !(yyval.declarator)->var->name) - error_loc("unnamed fields are not allowed"); - ;} +#line 1032 "parser.y" + { (yyval.expr) = (yyvsp[(2) - (2)].expr); ;} break; case 322: /* Line 1455 of yacc.c */ -#line 1041 "parser.y" - { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[(1) - (1)].declarator) ); ;} +#line 1035 "parser.y" + { (yyval.declarator) = (yyvsp[(1) - (2)].declarator); (yyval.declarator)->bits = (yyvsp[(2) - (2)].expr); + if (!(yyval.declarator)->bits && !(yyval.declarator)->var->name) + error_loc("unnamed fields are not allowed\n"); + ;} break; case 323: /* Line 1455 of yacc.c */ -#line 1043 "parser.y" - { (yyval.declarator_list) = append_declarator( (yyvsp[(1) - (3)].declarator_list), (yyvsp[(3) - (3)].declarator) ); ;} +#line 1042 "parser.y" + { (yyval.declarator_list) = append_declarator( NULL, (yyvsp[(1) - (1)].declarator) ); ;} break; case 324: /* Line 1455 of yacc.c */ -#line 1047 "parser.y" - { (yyval.declarator) = (yyvsp[(1) - (1)].declarator); ;} +#line 1044 "parser.y" + { (yyval.declarator_list) = append_declarator( (yyvsp[(1) - (3)].declarator_list), (yyvsp[(3) - (3)].declarator) ); ;} break; case 325: /* Line 1455 of yacc.c */ #line 1048 "parser.y" - { (yyval.declarator) = (yyvsp[(1) - (3)].declarator); (yyvsp[(1) - (3)].declarator)->var->eval = (yyvsp[(3) - (3)].expr); ;} + { (yyval.declarator) = (yyvsp[(1) - (1)].declarator); ;} break; case 326: /* Line 1455 of yacc.c */ -#line 1052 "parser.y" - { (yyval.num) = RPC_FC_RP; ;} +#line 1049 "parser.y" + { (yyval.declarator) = (yyvsp[(1) - (3)].declarator); (yyvsp[(1) - (3)].declarator)->var->eval = (yyvsp[(3) - (3)].expr); ;} break; case 327: /* Line 1455 of yacc.c */ #line 1053 "parser.y" - { (yyval.num) = RPC_FC_UP; ;} + { (yyval.num) = RPC_FC_RP; ;} break; case 328: /* Line 1455 of yacc.c */ #line 1054 "parser.y" - { (yyval.num) = RPC_FC_FP; ;} + { (yyval.num) = RPC_FC_UP; ;} break; case 329: /* Line 1455 of yacc.c */ -#line 1057 "parser.y" - { (yyval.type) = type_new_struct((yyvsp[(2) - (5)].str), TRUE, (yyvsp[(4) - (5)].var_list)); ;} +#line 1055 "parser.y" + { (yyval.num) = RPC_FC_FP; ;} break; case 330: /* Line 1455 of yacc.c */ -#line 1060 "parser.y" - { (yyval.type) = type_new_void(); ;} +#line 1058 "parser.y" + { (yyval.type) = type_new_struct((yyvsp[(2) - (5)].str), TRUE, (yyvsp[(4) - (5)].var_list)); ;} break; case 331: /* Line 1455 of yacc.c */ #line 1061 "parser.y" - { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;} + { (yyval.type) = type_new_void(); ;} break; case 332: /* Line 1455 of yacc.c */ #line 1062 "parser.y" - { (yyval.type) = (yyvsp[(1) - (1)].type); ;} + { (yyval.type) = find_type_or_error((yyvsp[(1) - (1)].str), 0); ;} break; case 333: @@ -4961,85 +4952,92 @@ yyreduce: /* Line 1455 of yacc.c */ #line 1064 "parser.y" - { (yyval.type) = type_new_enum((yyvsp[(2) - (2)].str), FALSE, NULL); ;} + { (yyval.type) = (yyvsp[(1) - (1)].type); ;} break; case 335: /* Line 1455 of yacc.c */ #line 1065 "parser.y" - { (yyval.type) = (yyvsp[(1) - (1)].type); ;} + { (yyval.type) = type_new_enum((yyvsp[(2) - (2)].str), FALSE, NULL); ;} break; case 336: /* Line 1455 of yacc.c */ #line 1066 "parser.y" - { (yyval.type) = type_new_struct((yyvsp[(2) - (2)].str), FALSE, NULL); ;} + { (yyval.type) = (yyvsp[(1) - (1)].type); ;} break; case 337: /* Line 1455 of yacc.c */ #line 1067 "parser.y" - { (yyval.type) = (yyvsp[(1) - (1)].type); ;} + { (yyval.type) = type_new_struct((yyvsp[(2) - (2)].str), FALSE, NULL); ;} break; case 338: /* Line 1455 of yacc.c */ #line 1068 "parser.y" - { (yyval.type) = type_new_nonencapsulated_union((yyvsp[(2) - (2)].str), FALSE, NULL); ;} + { (yyval.type) = (yyvsp[(1) - (1)].type); ;} break; case 339: /* Line 1455 of yacc.c */ #line 1069 "parser.y" - { (yyval.type) = make_safearray((yyvsp[(3) - (4)].type)); ;} + { (yyval.type) = type_new_nonencapsulated_union((yyvsp[(2) - (2)].str), FALSE, NULL); ;} break; case 340: /* Line 1455 of yacc.c */ -#line 1073 "parser.y" - { reg_typedefs((yyvsp[(3) - (4)].declspec), (yyvsp[(4) - (4)].declarator_list), check_typedef_attrs((yyvsp[(2) - (4)].attr_list))); - (yyval.statement) = make_statement_typedef((yyvsp[(4) - (4)].declarator_list)); - ;} +#line 1070 "parser.y" + { (yyval.type) = make_safearray((yyvsp[(3) - (4)].type)); ;} break; case 341: /* Line 1455 of yacc.c */ -#line 1079 "parser.y" - { (yyval.type) = type_new_nonencapsulated_union((yyvsp[(2) - (5)].str), TRUE, (yyvsp[(4) - (5)].var_list)); ;} +#line 1074 "parser.y" + { reg_typedefs((yyvsp[(3) - (4)].declspec), (yyvsp[(4) - (4)].declarator_list), check_typedef_attrs((yyvsp[(2) - (4)].attr_list))); + (yyval.statement) = make_statement_typedef((yyvsp[(4) - (4)].declarator_list)); + ;} break; case 342: /* Line 1455 of yacc.c */ -#line 1082 "parser.y" - { (yyval.type) = type_new_encapsulated_union((yyvsp[(2) - (10)].str), (yyvsp[(5) - (10)].var), (yyvsp[(7) - (10)].var), (yyvsp[(9) - (10)].var_list)); ;} +#line 1080 "parser.y" + { (yyval.type) = type_new_nonencapsulated_union((yyvsp[(2) - (5)].str), TRUE, (yyvsp[(4) - (5)].var_list)); ;} break; case 343: /* Line 1455 of yacc.c */ -#line 1086 "parser.y" - { (yyval.num) = MAKEVERSION((yyvsp[(1) - (1)].num), 0); ;} +#line 1083 "parser.y" + { (yyval.type) = type_new_encapsulated_union((yyvsp[(2) - (10)].str), (yyvsp[(5) - (10)].var), (yyvsp[(7) - (10)].var), (yyvsp[(9) - (10)].var_list)); ;} break; case 344: /* Line 1455 of yacc.c */ #line 1087 "parser.y" + { (yyval.num) = MAKEVERSION((yyvsp[(1) - (1)].num), 0); ;} + break; + + case 345: + +/* Line 1455 of yacc.c */ +#line 1088 "parser.y" { (yyval.num) = MAKEVERSION((yyvsp[(1) - (3)].num), (yyvsp[(3) - (3)].num)); ;} break; /* Line 1455 of yacc.c */ -#line 5043 "parser.tab.c" +#line 5041 "parser.tab.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -5251,7 +5249,7 @@ yyreturn: /* Line 1675 of yacc.c */ -#line 1090 "parser.y" +#line 1091 "parser.y" static void decl_builtin_basic(const char *name, enum type_basic_type type) @@ -6425,7 +6423,6 @@ static int is_allowed_conf_type(const type_t *type) case TYPE_BASIC_HYPER: case TYPE_BASIC_BYTE: case TYPE_BASIC_WCHAR: - case TYPE_BASIC_ERROR_STATUS_T: return TRUE; default: return FALSE; @@ -6512,6 +6509,7 @@ static void check_field_common(const type_t *container_type, default: /* should be no other container types */ assert(0); + return; } if (is_attr(arg->attrs, ATTR_LENGTHIS) && diff --git a/reactos/tools/widl/parser.tab.h b/reactos/tools/widl/parser.tab.h index 73f6993dbcc..1266e128b4a 100644 --- a/reactos/tools/widl/parser.tab.h +++ b/reactos/tools/widl/parser.tab.h @@ -46,150 +46,151 @@ aDOUBLE = 262, aSTRING = 263, aWSTRING = 264, - aUUID = 265, - aEOF = 266, - SHL = 267, - SHR = 268, - MEMBERPTR = 269, - EQUALITY = 270, - INEQUALITY = 271, - GREATEREQUAL = 272, - LESSEQUAL = 273, - LOGICALOR = 274, - LOGICALAND = 275, - ELLIPSIS = 276, - tAGGREGATABLE = 277, - tALLOCATE = 278, - tANNOTATION = 279, - tAPPOBJECT = 280, - tASYNC = 281, - tASYNCUUID = 282, - tAUTOHANDLE = 283, - tBINDABLE = 284, - tBOOLEAN = 285, - tBROADCAST = 286, - tBYTE = 287, - tBYTECOUNT = 288, - tCALLAS = 289, - tCALLBACK = 290, - tCASE = 291, - tCDECL = 292, - tCHAR = 293, - tCOCLASS = 294, - tCODE = 295, - tCOMMSTATUS = 296, - tCONST = 297, - tCONTEXTHANDLE = 298, - tCONTEXTHANDLENOSERIALIZE = 299, - tCONTEXTHANDLESERIALIZE = 300, - tCONTROL = 301, - tCPPQUOTE = 302, - tDEFAULT = 303, - tDEFAULTCOLLELEM = 304, - tDEFAULTVALUE = 305, - tDEFAULTVTABLE = 306, - tDISPLAYBIND = 307, - tDISPINTERFACE = 308, - tDLLNAME = 309, - tDOUBLE = 310, - tDUAL = 311, - tENDPOINT = 312, - tENTRY = 313, - tENUM = 314, - tERRORSTATUST = 315, - tEXPLICITHANDLE = 316, - tEXTERN = 317, - tFALSE = 318, - tFASTCALL = 319, - tFLOAT = 320, - tHANDLE = 321, - tHANDLET = 322, - tHELPCONTEXT = 323, - tHELPFILE = 324, - tHELPSTRING = 325, - tHELPSTRINGCONTEXT = 326, - tHELPSTRINGDLL = 327, - tHIDDEN = 328, - tHYPER = 329, - tID = 330, - tIDEMPOTENT = 331, - tIIDIS = 332, - tIMMEDIATEBIND = 333, - tIMPLICITHANDLE = 334, - tIMPORT = 335, - tIMPORTLIB = 336, - tIN = 337, - tIN_LINE = 338, - tINLINE = 339, - tINPUTSYNC = 340, - tINT = 341, - tINT3264 = 342, - tINT64 = 343, - tINTERFACE = 344, - tLCID = 345, - tLENGTHIS = 346, - tLIBRARY = 347, - tLOCAL = 348, - tLONG = 349, - tMETHODS = 350, - tMODULE = 351, - tNONBROWSABLE = 352, - tNONCREATABLE = 353, - tNONEXTENSIBLE = 354, - tNULL = 355, - tOBJECT = 356, - tODL = 357, - tOLEAUTOMATION = 358, - tOPTIONAL = 359, - tOUT = 360, - tPASCAL = 361, - tPOINTERDEFAULT = 362, - tPROPERTIES = 363, - tPROPGET = 364, - tPROPPUT = 365, - tPROPPUTREF = 366, - tPTR = 367, - tPUBLIC = 368, - tRANGE = 369, - tREADONLY = 370, - tREF = 371, - tREGISTER = 372, - tREQUESTEDIT = 373, - tRESTRICTED = 374, - tRETVAL = 375, - tSAFEARRAY = 376, - tSHORT = 377, - tSIGNED = 378, - tSIZEIS = 379, - tSIZEOF = 380, - tSMALL = 381, - tSOURCE = 382, - tSTATIC = 383, - tSTDCALL = 384, - tSTRICTCONTEXTHANDLE = 385, - tSTRING = 386, - tSTRUCT = 387, - tSWITCH = 388, - tSWITCHIS = 389, - tSWITCHTYPE = 390, - tTRANSMITAS = 391, - tTRUE = 392, - tTYPEDEF = 393, - tUNION = 394, - tUNIQUE = 395, - tUNSIGNED = 396, - tUUID = 397, - tV1ENUM = 398, - tVARARG = 399, - tVERSION = 400, - tVOID = 401, - tWCHAR = 402, - tWIREMARSHAL = 403, - ADDRESSOF = 404, - NEG = 405, - POS = 406, - PPTR = 407, - CAST = 408 + aSQSTRING = 265, + aUUID = 266, + aEOF = 267, + SHL = 268, + SHR = 269, + MEMBERPTR = 270, + EQUALITY = 271, + INEQUALITY = 272, + GREATEREQUAL = 273, + LESSEQUAL = 274, + LOGICALOR = 275, + LOGICALAND = 276, + ELLIPSIS = 277, + tAGGREGATABLE = 278, + tALLOCATE = 279, + tANNOTATION = 280, + tAPPOBJECT = 281, + tASYNC = 282, + tASYNCUUID = 283, + tAUTOHANDLE = 284, + tBINDABLE = 285, + tBOOLEAN = 286, + tBROADCAST = 287, + tBYTE = 288, + tBYTECOUNT = 289, + tCALLAS = 290, + tCALLBACK = 291, + tCASE = 292, + tCDECL = 293, + tCHAR = 294, + tCOCLASS = 295, + tCODE = 296, + tCOMMSTATUS = 297, + tCONST = 298, + tCONTEXTHANDLE = 299, + tCONTEXTHANDLENOSERIALIZE = 300, + tCONTEXTHANDLESERIALIZE = 301, + tCONTROL = 302, + tCPPQUOTE = 303, + tDEFAULT = 304, + tDEFAULTCOLLELEM = 305, + tDEFAULTVALUE = 306, + tDEFAULTVTABLE = 307, + tDISPLAYBIND = 308, + tDISPINTERFACE = 309, + tDLLNAME = 310, + tDOUBLE = 311, + tDUAL = 312, + tENDPOINT = 313, + tENTRY = 314, + tENUM = 315, + tERRORSTATUST = 316, + tEXPLICITHANDLE = 317, + tEXTERN = 318, + tFALSE = 319, + tFASTCALL = 320, + tFLOAT = 321, + tHANDLE = 322, + tHANDLET = 323, + tHELPCONTEXT = 324, + tHELPFILE = 325, + tHELPSTRING = 326, + tHELPSTRINGCONTEXT = 327, + tHELPSTRINGDLL = 328, + tHIDDEN = 329, + tHYPER = 330, + tID = 331, + tIDEMPOTENT = 332, + tIIDIS = 333, + tIMMEDIATEBIND = 334, + tIMPLICITHANDLE = 335, + tIMPORT = 336, + tIMPORTLIB = 337, + tIN = 338, + tIN_LINE = 339, + tINLINE = 340, + tINPUTSYNC = 341, + tINT = 342, + tINT3264 = 343, + tINT64 = 344, + tINTERFACE = 345, + tLCID = 346, + tLENGTHIS = 347, + tLIBRARY = 348, + tLOCAL = 349, + tLONG = 350, + tMETHODS = 351, + tMODULE = 352, + tNONBROWSABLE = 353, + tNONCREATABLE = 354, + tNONEXTENSIBLE = 355, + tNULL = 356, + tOBJECT = 357, + tODL = 358, + tOLEAUTOMATION = 359, + tOPTIONAL = 360, + tOUT = 361, + tPASCAL = 362, + tPOINTERDEFAULT = 363, + tPROPERTIES = 364, + tPROPGET = 365, + tPROPPUT = 366, + tPROPPUTREF = 367, + tPTR = 368, + tPUBLIC = 369, + tRANGE = 370, + tREADONLY = 371, + tREF = 372, + tREGISTER = 373, + tREQUESTEDIT = 374, + tRESTRICTED = 375, + tRETVAL = 376, + tSAFEARRAY = 377, + tSHORT = 378, + tSIGNED = 379, + tSIZEIS = 380, + tSIZEOF = 381, + tSMALL = 382, + tSOURCE = 383, + tSTATIC = 384, + tSTDCALL = 385, + tSTRICTCONTEXTHANDLE = 386, + tSTRING = 387, + tSTRUCT = 388, + tSWITCH = 389, + tSWITCHIS = 390, + tSWITCHTYPE = 391, + tTRANSMITAS = 392, + tTRUE = 393, + tTYPEDEF = 394, + tUNION = 395, + tUNIQUE = 396, + tUNSIGNED = 397, + tUUID = 398, + tV1ENUM = 399, + tVARARG = 400, + tVERSION = 401, + tVOID = 402, + tWCHAR = 403, + tWIREMARSHAL = 404, + ADDRESSOF = 405, + NEG = 406, + POS = 407, + PPTR = 408, + CAST = 409 }; #endif @@ -232,7 +233,7 @@ typedef union YYSTYPE /* Line 1676 of yacc.c */ -#line 236 "parser.tab.h" +#line 237 "parser.tab.h" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ diff --git a/reactos/tools/widl/parser.y b/reactos/tools/widl/parser.y index de44ab5626f..8a23a828026 100644 --- a/reactos/tools/widl/parser.y +++ b/reactos/tools/widl/parser.y @@ -186,7 +186,7 @@ static statement_list_t *append_statement(statement_list_t *list, statement_t *s %token aKNOWNTYPE %token aNUM aHEXNUM %token aDOUBLE -%token aSTRING aWSTRING +%token aSTRING aWSTRING aSQSTRING %token aUUID %token aEOF %token SHL SHR @@ -632,6 +632,7 @@ expr: aNUM { $$ = make_exprl(EXPR_NUM, $1); } | tTRUE { $$ = make_exprl(EXPR_TRUEFALSE, 1); } | aSTRING { $$ = make_exprs(EXPR_STRLIT, $1); } | aWSTRING { $$ = make_exprs(EXPR_WSTRLIT, $1); } + | aSQSTRING { $$ = make_exprs(EXPR_CHARCONST, $1); } | aIDENTIFIER { $$ = make_exprs(EXPR_IDENTIFIER, $1); } | expr '?' expr ':' expr { $$ = make_expr3(EXPR_COND, $1, $3, $5); } | expr LOGICALOR expr { $$ = make_expr2(EXPR_LOGOR, $1, $3); } @@ -841,7 +842,7 @@ dispinterfacedef: dispinterfacehdr '{' ; inherit: { $$ = NULL; } - | ':' aKNOWNTYPE { $$ = find_type_or_error2($2, 0); } + | ':' aKNOWNTYPE { $$ = find_type_or_error2($2, 0); is_object_interface = 1; } ; interface: tINTERFACE aIDENTIFIER { $$ = get_type(TYPE_INTERFACE, $2, 0); } @@ -852,9 +853,9 @@ interfacehdr: attributes interface { $$.interface = $2; $$.old_pointer_default = pointer_default; if (is_attr($1, ATTR_POINTERDEFAULT)) pointer_default = get_attrv($1, ATTR_POINTERDEFAULT); - is_object_interface = is_object($1); check_def($2); $2->attrs = check_iface_attrs($2->name, $1); + is_object_interface = is_object($2); $2->defined = TRUE; } ; @@ -1033,7 +1034,7 @@ m_bitfield: { $$ = NULL; } struct_declarator: any_declarator m_bitfield { $$ = $1; $$->bits = $2; if (!$$->bits && !$$->var->name) - error_loc("unnamed fields are not allowed"); + error_loc("unnamed fields are not allowed\n"); } ; @@ -2260,7 +2261,6 @@ static int is_allowed_conf_type(const type_t *type) case TYPE_BASIC_HYPER: case TYPE_BASIC_BYTE: case TYPE_BASIC_WCHAR: - case TYPE_BASIC_ERROR_STATUS_T: return TRUE; default: return FALSE; @@ -2347,6 +2347,7 @@ static void check_field_common(const type_t *container_type, default: /* should be no other container types */ assert(0); + return; } if (is_attr(arg->attrs, ATTR_LENGTHIS) && diff --git a/reactos/tools/widl/parser.yy.c b/reactos/tools/widl/parser.yy.c index 9cb425c8573..2bf33f614bc 100644 --- a/reactos/tools/widl/parser.yy.c +++ b/reactos/tools/widl/parser.yy.c @@ -301,26 +301,26 @@ static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; -#define YY_NUM_RULES 33 -#define YY_END_OF_BUFFER 34 -static yyconst short int yy_accept[142] = +#define YY_NUM_RULES 36 +#define YY_END_OF_BUFFER 37 +static yyconst short int yy_accept[148] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, - 34, 32, 21, 20, 32, 3, 32, 32, 32, 16, - 16, 32, 32, 32, 19, 19, 19, 11, 32, 21, - 1, 10, 33, 4, 10, 6, 16, 16, 13, 13, - 13, 12, 2, 26, 30, 24, 0, 0, 16, 16, - 16, 0, 22, 28, 25, 27, 23, 19, 5, 19, - 29, 0, 1, 1, 9, 8, 7, 16, 0, 13, - 13, 2, 31, 17, 16, 16, 15, 19, 16, 0, - 13, 0, 15, 15, 19, 16, 0, 13, 0, 17, - 15, 15, 19, 16, 0, 13, 19, 16, 0, 13, + 0, 0, 37, 35, 24, 23, 35, 3, 35, 7, + 35, 35, 19, 19, 35, 35, 35, 22, 22, 22, + 14, 35, 24, 1, 13, 36, 4, 13, 6, 19, + 19, 16, 16, 16, 15, 2, 8, 13, 29, 33, + 27, 0, 0, 19, 19, 19, 0, 25, 31, 28, + 30, 26, 22, 5, 22, 32, 0, 1, 1, 12, + 10, 9, 19, 0, 16, 16, 2, 11, 34, 20, + 19, 19, 18, 22, 19, 0, 16, 0, 18, 18, + 22, 19, 0, 16, 0, 20, 18, 18, 22, 19, - 19, 16, 0, 13, 19, 16, 0, 13, 19, 0, - 16, 0, 18, 0, 0, 0, 0, 0, 0, 0, + 0, 16, 22, 19, 0, 16, 22, 19, 0, 16, + 22, 19, 0, 16, 22, 0, 19, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, - 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 0 } ; static yyconst int yy_ec[256] = @@ -328,17 +328,17 @@ static yyconst int yy_ec[256] = 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 4, 5, 6, 1, 1, 7, 1, 8, - 1, 1, 9, 1, 10, 11, 1, 12, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 1, 1, 14, - 15, 16, 1, 1, 17, 18, 18, 18, 19, 20, - 21, 21, 21, 21, 21, 22, 21, 21, 21, 21, - 21, 23, 24, 21, 25, 21, 21, 26, 27, 21, - 28, 29, 30, 1, 21, 1, 18, 18, 18, 18, + 1, 2, 4, 5, 6, 1, 1, 7, 8, 9, + 1, 1, 10, 1, 11, 12, 1, 13, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 1, 1, 15, + 16, 17, 1, 1, 18, 19, 19, 19, 20, 21, + 22, 22, 22, 22, 22, 23, 22, 22, 22, 22, + 22, 24, 25, 22, 26, 22, 22, 27, 28, 22, + 29, 30, 31, 1, 22, 1, 19, 19, 19, 19, - 31, 18, 21, 21, 21, 21, 21, 32, 21, 21, - 21, 21, 21, 21, 21, 21, 33, 21, 21, 34, - 21, 21, 1, 35, 1, 1, 1, 1, 1, 1, + 32, 19, 22, 22, 22, 22, 22, 33, 22, 22, + 22, 22, 22, 22, 22, 22, 34, 22, 22, 35, + 22, 22, 1, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -355,182 +355,182 @@ static yyconst int yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst int yy_meta[36] = +static yyconst int yy_meta[37] = { 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 3, 1, 1, 1, 3, 3, 3, 3, - 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, - 3, 4, 4, 4, 1 + 1, 1, 3, 3, 1, 1, 1, 3, 3, 3, + 3, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 3, 4, 4, 4, 1 } ; -static yyconst short int yy_base[178] = +static yyconst short int yy_base[184] = { 0, - 0, 34, 34, 38, 39, 42, 71, 44, 270, 269, - 271, 491, 491, 491, 255, 491, 258, 248, 252, 96, - 22, 37, 242, 38, 0, 251, 238, 491, 219, 53, - 251, 491, 491, 491, 33, 491, 119, 23, 142, 165, - 246, 491, 0, 491, 491, 491, 239, 48, 0, 33, - 88, 0, 491, 491, 491, 491, 491, 0, 491, 228, - 491, 63, 241, 240, 491, 491, 491, 185, 0, 207, - 0, 0, 491, 104, 491, 491, 124, 222, 227, 0, - 249, 102, 94, 102, 220, 269, 0, 291, 113, 168, - 491, 491, 213, 311, 0, 333, 212, 353, 0, 375, + 0, 35, 35, 39, 40, 43, 61, 45, 262, 261, + 46, 47, 263, 481, 481, 481, 246, 481, 254, 481, + 243, 243, 85, 25, 41, 238, 42, 0, 248, 229, + 481, 210, 60, 243, 481, 481, 481, 34, 481, 108, + 26, 131, 154, 239, 481, 0, 481, 60, 481, 481, + 481, 231, 58, 0, 75, 77, 0, 481, 481, 481, + 481, 481, 0, 481, 220, 481, 61, 238, 236, 481, + 481, 481, 174, 0, 196, 0, 0, 481, 481, 93, + 481, 481, 113, 213, 216, 0, 238, 166, 89, 81, + 214, 258, 0, 280, 89, 169, 481, 481, 207, 300, - 217, 395, 0, 417, 206, 439, 222, 221, 62, 0, - 220, 140, 491, 0, 0, 0, 219, 0, 0, 0, - 0, 218, 0, 0, 0, 0, 213, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 491, - 491, 472, 476, 478, 482, 486, 219, 218, 212, 211, - 210, 209, 208, 206, 205, 203, 198, 197, 192, 191, - 190, 189, 188, 187, 186, 185, 183, 176, 169, 168, - 167, 155, 144, 140, 137, 130, 110 + 0, 322, 203, 342, 0, 364, 208, 384, 0, 406, + 197, 428, 213, 212, 115, 0, 211, 128, 481, 0, + 0, 0, 210, 0, 0, 0, 0, 209, 0, 0, + 0, 0, 208, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 481, 481, 462, 466, 468, + 472, 476, 215, 210, 209, 208, 202, 201, 200, 199, + 196, 195, 193, 188, 187, 182, 181, 178, 175, 168, + 167, 166, 159, 158, 157, 145, 135, 130, 129, 113, + 102, 88, 75 } ; -static yyconst short int yy_def[178] = +static yyconst short int yy_def[184] = { 0, - 141, 1, 142, 142, 142, 142, 141, 7, 143, 143, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 20, 141, 141, 141, 144, 144, 144, 141, 141, 141, - 141, 141, 141, 141, 145, 141, 141, 37, 141, 39, - 40, 141, 146, 141, 141, 141, 141, 141, 21, 141, - 141, 147, 141, 141, 141, 141, 141, 144, 141, 144, - 141, 141, 141, 141, 141, 141, 141, 141, 148, 40, - 40, 146, 141, 141, 141, 141, 147, 144, 141, 149, - 40, 141, 141, 141, 144, 141, 150, 40, 141, 141, - 141, 141, 144, 141, 151, 40, 144, 141, 152, 40, + 147, 1, 148, 148, 148, 148, 1, 7, 149, 149, + 148, 148, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 23, 147, 147, 147, 150, 150, 150, + 147, 147, 147, 147, 147, 147, 147, 151, 147, 147, + 40, 147, 42, 43, 147, 152, 147, 151, 147, 147, + 147, 147, 147, 24, 147, 147, 153, 147, 147, 147, + 147, 147, 150, 147, 150, 147, 147, 147, 147, 147, + 147, 147, 147, 154, 43, 43, 152, 147, 147, 147, + 147, 147, 153, 150, 147, 155, 43, 147, 147, 147, + 150, 147, 156, 43, 147, 147, 147, 147, 150, 147, - 144, 141, 153, 40, 144, 141, 141, 40, 144, 154, - 106, 141, 141, 155, 156, 157, 141, 158, 159, 160, - 161, 141, 162, 163, 164, 165, 141, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, 177, 141, - 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141 + 157, 43, 150, 147, 158, 43, 150, 147, 159, 43, + 150, 147, 147, 43, 150, 160, 112, 147, 147, 161, + 162, 163, 147, 164, 165, 166, 167, 147, 168, 169, + 170, 171, 147, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 147, 0, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147 } ; -static yyconst short int yy_nxt[527] = +static yyconst short int yy_nxt[518] = { 0, - 12, 13, 14, 15, 16, 12, 17, 12, 12, 18, - 19, 20, 21, 22, 23, 24, 25, 25, 25, 25, - 25, 26, 25, 27, 25, 25, 25, 28, 12, 12, - 25, 25, 25, 25, 29, 30, 33, 66, 34, 31, - 33, 33, 34, 36, 33, 30, 36, 141, 141, 31, - 53, 54, 56, 57, 62, 141, 141, 75, 63, 74, - 74, 67, 35, 112, 62, 75, 35, 35, 63, 113, - 35, 12, 13, 14, 15, 16, 12, 17, 12, 12, - 18, 19, 37, 38, 22, 23, 24, 39, 39, 39, - 39, 40, 41, 40, 40, 40, 40, 40, 28, 12, + 14, 15, 16, 17, 18, 14, 19, 20, 14, 14, + 21, 22, 23, 24, 25, 26, 27, 28, 28, 28, + 28, 28, 29, 28, 30, 28, 28, 28, 31, 14, + 14, 28, 28, 28, 28, 32, 33, 36, 71, 37, + 34, 36, 36, 37, 39, 36, 33, 39, 36, 36, + 34, 147, 147, 47, 47, 58, 59, 61, 62, 147, + 147, 67, 67, 72, 38, 68, 68, 78, 38, 38, + 80, 80, 38, 40, 41, 48, 48, 146, 42, 42, + 42, 42, 43, 44, 43, 43, 43, 43, 43, 72, + 145, 45, 42, 43, 43, 43, 53, 54, 54, 82, - 42, 39, 40, 40, 40, 29, 48, 49, 49, 76, - 89, 89, 140, 90, 90, 74, 74, 50, 91, 76, - 51, 52, 82, 92, 90, 90, 91, 50, 51, 52, - 68, 68, 139, 92, 82, 69, 69, 69, 69, 138, - 50, 112, 137, 51, 52, 83, 136, 113, 84, 69, - 50, 51, 52, 70, 70, 83, 84, 135, 70, 70, - 70, 70, 71, 71, 71, 71, 71, 71, 71, 134, - 133, 132, 70, 71, 71, 71, 71, 71, 131, 90, - 90, 71, 71, 71, 71, 130, 82, 129, 127, 126, - 125, 124, 122, 121, 120, 71, 79, 79, 82, 119, + 81, 96, 96, 98, 144, 80, 80, 55, 81, 82, + 56, 57, 88, 98, 97, 143, 118, 55, 56, 57, + 73, 73, 97, 119, 88, 74, 74, 74, 74, 118, + 55, 142, 141, 56, 57, 89, 119, 140, 90, 74, + 55, 56, 57, 75, 75, 89, 90, 139, 75, 75, + 75, 75, 76, 76, 76, 76, 76, 76, 76, 138, + 137, 136, 75, 76, 76, 76, 76, 76, 135, 133, + 132, 76, 76, 76, 76, 95, 95, 131, 96, 96, + 130, 96, 96, 128, 127, 76, 85, 85, 88, 126, + 125, 86, 86, 86, 86, 123, 55, 122, 121, 56, - 117, 80, 80, 80, 80, 116, 50, 115, 114, 51, - 107, 103, 99, 95, 87, 80, 50, 51, 81, 81, - 80, 77, 128, 81, 81, 81, 81, 123, 118, 141, - 110, 110, 109, 105, 101, 97, 93, 81, 86, 86, - 85, 64, 64, 87, 87, 87, 87, 78, 50, 73, - 59, 51, 64, 61, 60, 59, 55, 87, 50, 51, - 88, 88, 47, 46, 45, 88, 88, 88, 88, 44, - 141, 33, 33, 141, 141, 141, 141, 141, 141, 88, - 94, 94, 141, 141, 141, 95, 95, 95, 95, 141, - 50, 141, 141, 51, 141, 141, 141, 141, 141, 95, + 88, 120, 113, 109, 105, 86, 55, 56, 87, 87, + 101, 93, 86, 87, 87, 87, 87, 83, 134, 129, + 124, 147, 116, 116, 115, 111, 107, 87, 92, 92, + 103, 99, 91, 93, 93, 93, 93, 69, 55, 69, + 84, 56, 79, 64, 69, 66, 65, 93, 55, 56, + 94, 94, 64, 60, 52, 94, 94, 94, 94, 51, + 50, 49, 147, 36, 36, 147, 147, 147, 147, 94, + 100, 100, 147, 147, 147, 101, 101, 101, 101, 147, + 55, 147, 147, 56, 147, 147, 147, 147, 147, 101, + 55, 56, 102, 102, 147, 147, 147, 102, 102, 102, - 50, 51, 96, 96, 141, 141, 141, 96, 96, 96, - 96, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 96, 98, 98, 141, 141, 141, 99, 99, 99, - 99, 141, 50, 141, 141, 51, 141, 141, 141, 141, - 141, 99, 50, 51, 100, 100, 141, 141, 141, 100, - 100, 100, 100, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 100, 102, 102, 141, 141, 141, 103, - 103, 103, 103, 141, 50, 141, 141, 51, 141, 141, - 141, 141, 141, 103, 50, 51, 104, 104, 141, 141, - 141, 104, 104, 104, 104, 141, 141, 141, 141, 141, + 102, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 102, 104, 104, 147, 147, 147, 105, 105, 105, + 105, 147, 55, 147, 147, 56, 147, 147, 147, 147, + 147, 105, 55, 56, 106, 106, 147, 147, 147, 106, + 106, 106, 106, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 106, 108, 108, 147, 147, 147, 109, + 109, 109, 109, 147, 55, 147, 147, 56, 147, 147, + 147, 147, 147, 109, 55, 56, 110, 110, 147, 147, + 147, 110, 110, 110, 110, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 110, 112, 112, 147, 147, - 141, 141, 141, 141, 141, 104, 106, 106, 141, 141, - 141, 107, 107, 107, 107, 141, 50, 141, 141, 51, - 141, 141, 141, 141, 141, 107, 50, 51, 108, 108, - 141, 141, 141, 108, 108, 108, 108, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 108, 110, 141, - 111, 111, 141, 141, 141, 141, 141, 141, 141, 141, - 50, 141, 141, 51, 141, 141, 141, 141, 141, 141, - 50, 51, 32, 32, 32, 32, 43, 43, 43, 43, - 58, 58, 65, 141, 65, 65, 72, 141, 72, 72, - 11, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 147, 113, 113, 113, 113, 147, 55, 147, 147, 56, + 147, 147, 147, 147, 147, 113, 55, 56, 114, 114, + 147, 147, 147, 114, 114, 114, 114, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 114, 116, 147, + 117, 117, 147, 147, 147, 147, 147, 147, 147, 147, + 55, 147, 147, 56, 147, 147, 147, 147, 147, 147, + 55, 56, 35, 35, 35, 35, 46, 46, 46, 46, + 63, 63, 70, 147, 70, 70, 77, 147, 77, 77, + 13, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141 + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147 } ; -static yyconst short int yy_chk[527] = +static yyconst short int yy_chk[518] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 3, 35, 3, 2, - 4, 5, 4, 5, 6, 8, 6, 21, 38, 8, - 22, 22, 24, 24, 30, 21, 38, 50, 30, 48, - 48, 35, 3, 109, 62, 50, 4, 5, 62, 109, - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 1, 1, 1, 1, 1, 1, 2, 3, 38, 3, + 2, 4, 5, 4, 5, 6, 8, 6, 11, 12, + 8, 24, 41, 11, 12, 25, 25, 27, 27, 24, + 41, 33, 67, 38, 3, 33, 67, 48, 4, 5, + 53, 53, 6, 7, 7, 11, 12, 183, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 48, + 182, 7, 7, 7, 7, 7, 23, 23, 23, 56, - 7, 7, 7, 7, 7, 7, 20, 20, 20, 51, - 82, 82, 177, 82, 82, 74, 74, 20, 83, 51, - 20, 20, 74, 84, 89, 89, 83, 20, 20, 20, - 37, 37, 176, 84, 74, 37, 37, 37, 37, 175, - 37, 112, 174, 37, 37, 77, 173, 112, 77, 37, - 37, 37, 37, 39, 39, 77, 77, 172, 39, 39, - 39, 39, 39, 39, 39, 39, 39, 39, 39, 171, - 170, 169, 39, 39, 39, 39, 40, 40, 168, 90, - 90, 40, 40, 40, 40, 167, 90, 166, 165, 164, - 163, 162, 161, 160, 159, 40, 68, 68, 90, 158, + 55, 95, 95, 90, 181, 80, 80, 23, 55, 56, + 23, 23, 80, 90, 89, 180, 115, 23, 23, 23, + 40, 40, 89, 115, 80, 40, 40, 40, 40, 118, + 40, 179, 178, 40, 40, 83, 118, 177, 83, 40, + 40, 40, 40, 42, 42, 83, 83, 176, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 175, + 174, 173, 42, 42, 42, 42, 43, 43, 172, 171, + 170, 43, 43, 43, 43, 88, 88, 169, 88, 88, + 168, 96, 96, 167, 166, 43, 73, 73, 96, 165, + 164, 73, 73, 73, 73, 163, 73, 162, 161, 73, - 157, 68, 68, 68, 68, 156, 68, 155, 154, 68, - 153, 152, 151, 150, 149, 68, 68, 68, 70, 70, - 148, 147, 127, 70, 70, 70, 70, 122, 117, 111, - 108, 107, 105, 101, 97, 93, 85, 70, 79, 79, - 78, 64, 63, 79, 79, 79, 79, 60, 79, 47, - 41, 79, 31, 29, 27, 26, 23, 79, 79, 79, - 81, 81, 19, 18, 17, 81, 81, 81, 81, 15, - 11, 10, 9, 0, 0, 0, 0, 0, 0, 81, - 86, 86, 0, 0, 0, 86, 86, 86, 86, 0, - 86, 0, 0, 86, 0, 0, 0, 0, 0, 86, + 96, 160, 159, 158, 157, 73, 73, 73, 75, 75, + 156, 155, 154, 75, 75, 75, 75, 153, 133, 128, + 123, 117, 114, 113, 111, 107, 103, 75, 85, 85, + 99, 91, 84, 85, 85, 85, 85, 69, 85, 68, + 65, 85, 52, 44, 34, 32, 30, 85, 85, 85, + 87, 87, 29, 26, 22, 87, 87, 87, 87, 21, + 19, 17, 13, 10, 9, 0, 0, 0, 0, 87, + 92, 92, 0, 0, 0, 92, 92, 92, 92, 0, + 92, 0, 0, 92, 0, 0, 0, 0, 0, 92, + 92, 92, 94, 94, 0, 0, 0, 94, 94, 94, - 86, 86, 88, 88, 0, 0, 0, 88, 88, 88, - 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 88, 94, 94, 0, 0, 0, 94, 94, 94, - 94, 0, 94, 0, 0, 94, 0, 0, 0, 0, - 0, 94, 94, 94, 96, 96, 0, 0, 0, 96, - 96, 96, 96, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 96, 98, 98, 0, 0, 0, 98, - 98, 98, 98, 0, 98, 0, 0, 98, 0, 0, - 0, 0, 0, 98, 98, 98, 100, 100, 0, 0, - 0, 100, 100, 100, 100, 0, 0, 0, 0, 0, + 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 94, 100, 100, 0, 0, 0, 100, 100, 100, + 100, 0, 100, 0, 0, 100, 0, 0, 0, 0, + 0, 100, 100, 100, 102, 102, 0, 0, 0, 102, + 102, 102, 102, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 102, 104, 104, 0, 0, 0, 104, + 104, 104, 104, 0, 104, 0, 0, 104, 0, 0, + 0, 0, 0, 104, 104, 104, 106, 106, 0, 0, + 0, 106, 106, 106, 106, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 106, 108, 108, 0, 0, - 0, 0, 0, 0, 0, 100, 102, 102, 0, 0, - 0, 102, 102, 102, 102, 0, 102, 0, 0, 102, - 0, 0, 0, 0, 0, 102, 102, 102, 104, 104, - 0, 0, 0, 104, 104, 104, 104, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 104, 106, 0, - 106, 106, 0, 0, 0, 0, 0, 0, 0, 0, - 106, 0, 0, 106, 0, 0, 0, 0, 0, 0, - 106, 106, 142, 142, 142, 142, 143, 143, 143, 143, - 144, 144, 145, 0, 145, 145, 146, 0, 146, 146, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, + 0, 108, 108, 108, 108, 0, 108, 0, 0, 108, + 0, 0, 0, 0, 0, 108, 108, 108, 110, 110, + 0, 0, 0, 110, 110, 110, 110, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 110, 112, 0, + 112, 112, 0, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 0, 112, 0, 0, 0, 0, 0, 0, + 112, 112, 148, 148, 148, 148, 149, 149, 149, 149, + 150, 150, 151, 0, 151, 151, 152, 0, 152, 152, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141 + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147 } ; static yy_state_type yy_last_accepting_state; @@ -578,7 +578,9 @@ char *yytext; #define PP_LINE 4 -#line 42 "parser.l" +#define SQUOTE 5 + +#line 43 "parser.l" #include "config.h" @@ -603,8 +605,6 @@ char *yytext; #include "parser.tab.h" -extern char *temp_name; - static void addcchar(char c); static char *get_buffered_cstring(void); @@ -816,7 +816,7 @@ YY_DECL register char *yy_cp, *yy_bp; register int yy_act; -#line 127 "parser.l" +#line 126 "parser.l" #line 822 "parser.yy.c" @@ -870,13 +870,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 142 ) + if ( yy_current_state >= 148 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 491 ); + while ( yy_base[yy_current_state] != 481 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -904,12 +904,12 @@ do_action: /* This label is used only to access EOF actions. */ case 1: YY_RULE_SETUP -#line 128 "parser.l" +#line 127 "parser.l" yy_push_state(PP_LINE); YY_BREAK case 2: YY_RULE_SETUP -#line 129 "parser.l" +#line 128 "parser.l" { int lineno; char *cptr, *fname; @@ -932,12 +932,12 @@ YY_RULE_SETUP YY_BREAK case 3: YY_RULE_SETUP -#line 148 "parser.l" +#line 147 "parser.l" yy_push_state(QUOTE); cbufidx = 0; YY_BREAK case 4: YY_RULE_SETUP -#line 149 "parser.l" +#line 148 "parser.l" { yy_pop_state(); parser_lval.str = get_buffered_cstring(); @@ -946,12 +946,12 @@ YY_RULE_SETUP YY_BREAK case 5: YY_RULE_SETUP -#line 154 "parser.l" +#line 153 "parser.l" yy_push_state(WSTRQUOTE); YY_BREAK case 6: YY_RULE_SETUP -#line 155 "parser.l" +#line 154 "parser.l" { yy_pop_state(); parser_lval.str = get_buffered_cstring(); @@ -959,145 +959,164 @@ YY_RULE_SETUP } YY_BREAK case 7: -#line 161 "parser.l" +YY_RULE_SETUP +#line 159 "parser.l" +yy_push_state(SQUOTE); cbufidx = 0; + YY_BREAK case 8: YY_RULE_SETUP -#line 161 "parser.l" -addcchar(yytext[1]); +#line 160 "parser.l" +{ + yy_pop_state(); + parser_lval.str = get_buffered_cstring(); + return aSQSTRING; + } YY_BREAK case 9: -YY_RULE_SETUP -#line 162 "parser.l" -addcchar('\\'); addcchar(yytext[1]); - YY_BREAK +#line 166 "parser.l" case 10: YY_RULE_SETUP -#line 163 "parser.l" -addcchar(yytext[0]); +#line 166 "parser.l" +addcchar(yytext[1]); YY_BREAK case 11: YY_RULE_SETUP -#line 164 "parser.l" -yy_push_state(ATTR); return '['; +#line 167 "parser.l" +addcchar(yytext[1]); YY_BREAK case 12: YY_RULE_SETUP -#line 165 "parser.l" -yy_pop_state(); return ']'; +#line 168 "parser.l" +addcchar('\\'); addcchar(yytext[1]); YY_BREAK case 13: YY_RULE_SETUP -#line 166 "parser.l" -return attr_token(yytext); +#line 169 "parser.l" +addcchar(yytext[0]); YY_BREAK case 14: YY_RULE_SETUP -#line 167 "parser.l" +#line 170 "parser.l" +yy_push_state(ATTR); return '['; + YY_BREAK +case 15: +YY_RULE_SETUP +#line 171 "parser.l" +yy_pop_state(); return ']'; + YY_BREAK +case 16: +YY_RULE_SETUP +#line 172 "parser.l" +return attr_token(yytext); + YY_BREAK +case 17: +YY_RULE_SETUP +#line 173 "parser.l" { parser_lval.uuid = parse_uuid(yytext); return aUUID; } YY_BREAK -case 15: +case 18: YY_RULE_SETUP -#line 171 "parser.l" +#line 177 "parser.l" { parser_lval.num = xstrtoul(yytext, NULL, 0); return aHEXNUM; } YY_BREAK -case 16: +case 19: YY_RULE_SETUP -#line 175 "parser.l" +#line 181 "parser.l" { parser_lval.num = xstrtoul(yytext, NULL, 0); return aNUM; } YY_BREAK -case 17: +case 20: YY_RULE_SETUP -#line 179 "parser.l" +#line 185 "parser.l" { parser_lval.dbl = strtod(yytext, NULL); return aDOUBLE; } YY_BREAK -case 18: +case 21: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ YY_RULE_SETUP -#line 183 "parser.l" +#line 189 "parser.l" return tSAFEARRAY; - YY_BREAK -case 19: -YY_RULE_SETUP -#line 184 "parser.l" -return kw_token(yytext); - YY_BREAK -case 20: -YY_RULE_SETUP -#line 185 "parser.l" -line_number++; - YY_BREAK -case 21: -YY_RULE_SETUP -#line 186 "parser.l" - YY_BREAK case 22: YY_RULE_SETUP -#line 187 "parser.l" -return SHL; +#line 190 "parser.l" +return kw_token(yytext); YY_BREAK case 23: YY_RULE_SETUP -#line 188 "parser.l" -return SHR; +#line 191 "parser.l" +line_number++; YY_BREAK case 24: YY_RULE_SETUP -#line 189 "parser.l" -return MEMBERPTR; +#line 192 "parser.l" + YY_BREAK case 25: YY_RULE_SETUP -#line 190 "parser.l" -return EQUALITY; +#line 193 "parser.l" +return SHL; YY_BREAK case 26: YY_RULE_SETUP -#line 191 "parser.l" -return INEQUALITY; +#line 194 "parser.l" +return SHR; YY_BREAK case 27: YY_RULE_SETUP -#line 192 "parser.l" -return GREATEREQUAL; +#line 195 "parser.l" +return MEMBERPTR; YY_BREAK case 28: YY_RULE_SETUP -#line 193 "parser.l" -return LESSEQUAL; +#line 196 "parser.l" +return EQUALITY; YY_BREAK case 29: YY_RULE_SETUP -#line 194 "parser.l" -return LOGICALOR; +#line 197 "parser.l" +return INEQUALITY; YY_BREAK case 30: YY_RULE_SETUP -#line 195 "parser.l" -return LOGICALAND; +#line 198 "parser.l" +return GREATEREQUAL; YY_BREAK case 31: YY_RULE_SETUP -#line 196 "parser.l" -return ELLIPSIS; +#line 199 "parser.l" +return LESSEQUAL; YY_BREAK case 32: YY_RULE_SETUP -#line 197 "parser.l" +#line 200 "parser.l" +return LOGICALOR; + YY_BREAK +case 33: +YY_RULE_SETUP +#line 201 "parser.l" +return LOGICALAND; + YY_BREAK +case 34: +YY_RULE_SETUP +#line 202 "parser.l" +return ELLIPSIS; + YY_BREAK +case 35: +YY_RULE_SETUP +#line 203 "parser.l" return yytext[0]; YY_BREAK case YY_STATE_EOF(INITIAL): @@ -1105,19 +1124,20 @@ case YY_STATE_EOF(QUOTE): case YY_STATE_EOF(WSTRQUOTE): case YY_STATE_EOF(ATTR): case YY_STATE_EOF(PP_LINE): -#line 198 "parser.l" +case YY_STATE_EOF(SQUOTE): +#line 204 "parser.l" { if (import_stack_ptr) return aEOF; else yyterminate(); } YY_BREAK -case 33: +case 36: YY_RULE_SETUP -#line 203 "parser.l" +#line 209 "parser.l" ECHO; YY_BREAK -#line 1121 "parser.yy.c" +#line 1141 "parser.yy.c" case YY_END_OF_BUFFER: { @@ -1408,7 +1428,7 @@ static yy_state_type yy_get_previous_state() while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 142 ) + if ( yy_current_state >= 148 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; @@ -1443,11 +1463,11 @@ yy_state_type yy_current_state; while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 142 ) + if ( yy_current_state >= 148 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 141); + yy_is_jam = (yy_current_state == 147); return yy_is_jam ? 0 : yy_current_state; } @@ -2003,7 +2023,7 @@ int main() return 0; } #endif -#line 203 "parser.l" +#line 209 "parser.l" #ifndef parser_wrap diff --git a/reactos/tools/widl/proxy.c b/reactos/tools/widl/proxy.c index cc753bbfcf2..30feca8dbe5 100644 --- a/reactos/tools/widl/proxy.c +++ b/reactos/tools/widl/proxy.c @@ -698,12 +698,12 @@ static int does_any_iface(const statement_list_t *stmts, type_pred_t pred) int need_proxy(const type_t *iface) { - return is_object(iface->attrs) && !is_local(iface->attrs); + return is_object(iface) && !is_local(iface->attrs); } int need_stub(const type_t *iface) { - return !is_object(iface->attrs) && !is_local(iface->attrs); + return !is_object(iface) && !is_local(iface->attrs); } int need_proxy_file(const statement_list_t *stmts) @@ -754,7 +754,7 @@ static void build_iface_list( const statement_list_t *stmts, type_t **ifaces[], type_t *iface = stmt->u.type; if (type_iface_get_inherit(iface) && need_proxy(iface)) { - *ifaces = xrealloc( *ifaces, (*count + 1) * sizeof(*ifaces) ); + *ifaces = xrealloc( *ifaces, (*count + 1) * sizeof(**ifaces) ); (*ifaces)[(*count)++] = iface; } } diff --git a/reactos/tools/widl/typegen.c b/reactos/tools/widl/typegen.c index fdb2379a070..ca0faf1b737 100644 --- a/reactos/tools/widl/typegen.c +++ b/reactos/tools/widl/typegen.c @@ -59,6 +59,14 @@ struct expr_eval_routine const expr_t *expr; }; +enum type_context +{ + TYPE_CONTEXT_TOPLEVELPARAM, + TYPE_CONTEXT_PARAM, + TYPE_CONTEXT_CONTAINER, + TYPE_CONTEXT_CONTAINER_NO_POINTERS, +}; + static unsigned int field_memsize(const type_t *type, unsigned int *offset); static unsigned int fields_memsize(const var_list_t *fields, unsigned int *align); static unsigned int write_struct_tfs(FILE *file, type_t *type, const char *name, unsigned int *tfsoff); @@ -69,7 +77,7 @@ static unsigned int write_string_tfs(FILE *file, const attr_list_t *attrs, type_t *type, int toplevel_param, const char *name, unsigned int *typestring_offset); -const char *string_of_type(unsigned char type) +static const char *string_of_type(unsigned char type) { switch (type) { @@ -133,7 +141,7 @@ static void *get_aliaschain_attrp(const type_t *type, enum attr_type attr) return get_attrp(t->attrs, attr); else if (type_is_alias(t)) t = type_alias_get_aliasee(t); - else return 0; + else return NULL; } } @@ -202,6 +210,30 @@ static unsigned char get_enum_fc(const type_t *type) return RPC_FC_ENUM16; } +static type_t *get_user_type(const type_t *t, const char **pname) +{ + for (;;) + { + type_t *ut = get_attrp(t->attrs, ATTR_WIREMARSHAL); + if (ut) + { + if (pname) + *pname = t->name; + return ut; + } + + if (type_is_alias(t)) + t = type_alias_get_aliasee(t); + else + return NULL; + } +} + +static int is_user_type(const type_t *t) +{ + return get_user_type(t, NULL) != NULL; +} + enum typegen_type typegen_detect_type(const type_t *type, const attr_list_t *attrs, unsigned int flags) { if (is_user_type(type)) @@ -252,6 +284,29 @@ enum typegen_type typegen_detect_type(const type_t *type, const attr_list_t *att return TGT_INVALID; } +static int get_padding(const var_list_t *fields) +{ + unsigned short offset = 0; + unsigned int salign = 1; + const var_t *f; + + if (!fields) + return 0; + + LIST_FOR_EACH_ENTRY(f, fields, const var_t, entry) + { + type_t *ft = f->type; + unsigned int align = 0; + unsigned int size = type_memsize(ft, &align); + align = clamp_align(align); + if (align > salign) salign = align; + offset = ROUND_SIZE(offset, align); + offset += size; + } + + return ROUNDING(offset, salign); +} + unsigned char get_struct_fc(const type_t *type) { int has_pointer = 0; @@ -391,7 +446,7 @@ unsigned char get_struct_fc(const type_t *type) return RPC_FC_STRUCT; } -unsigned char get_array_fc(const type_t *type) +static unsigned char get_array_fc(const type_t *type) { unsigned char fc; const expr_t *size_is; @@ -472,22 +527,6 @@ unsigned char get_array_fc(const type_t *type) return fc; } -int is_struct(unsigned char type) -{ - switch (type) - { - case RPC_FC_STRUCT: - case RPC_FC_PSTRUCT: - case RPC_FC_CSTRUCT: - case RPC_FC_CPSTRUCT: - case RPC_FC_CVSTRUCT: - case RPC_FC_BOGUS_STRUCT: - return 1; - default: - return 0; - } -} - static int is_non_complex_struct(const type_t *type) { return (type_get_type(type) == TYPE_STRUCT && @@ -626,30 +665,6 @@ static void guard_rec(type_t *type) type->typestring_offset = 1; } -static type_t *get_user_type(const type_t *t, const char **pname) -{ - for (;;) - { - type_t *ut = get_attrp(t->attrs, ATTR_WIREMARSHAL); - if (ut) - { - if (pname) - *pname = t->name; - return ut; - } - - if (type_is_alias(t)) - t = type_alias_get_aliasee(t); - else - return 0; - } -} - -int is_user_type(const type_t *t) -{ - return get_user_type(t, NULL) != NULL; -} - static int is_embedded_complex(const type_t *type) { switch (typegen_detect_type(type, NULL, TDT_ALL_TYPES)) @@ -1075,6 +1090,13 @@ static unsigned int write_conf_or_var_desc(FILE *file, const type_t *structure, else param_type = RPC_FC_SHORT; } + else if (type_get_type(correlation_variable) == TYPE_POINTER) + { + if (pointer_size == 8) + param_type = RPC_FC_HYPER; + else + param_type = RPC_FC_LONG; + } else { error("write_conf_or_var_desc: non-arithmetic type used as correlation variable %s\n", @@ -1096,8 +1118,10 @@ static unsigned int write_conf_or_var_desc(FILE *file, const type_t *structure, LIST_FOR_EACH_ENTRY(eval, &expr_eval_routines, struct expr_eval_routine, entry) { - if (!strcmp (eval->structure->name, structure->name) - && !compare_expr (eval->expr, expr)) + if (eval->structure == structure || + (eval->structure->name && structure->name && + !strcmp(eval->structure->name, structure->name) && + !compare_expr(eval->expr, expr))) { found = 1; break; @@ -1177,29 +1201,6 @@ static unsigned int union_memsize(const var_list_t *fields, unsigned int *pmaxa) return maxs; } -int get_padding(const var_list_t *fields) -{ - unsigned short offset = 0; - unsigned int salign = 1; - const var_t *f; - - if (!fields) - return 0; - - LIST_FOR_EACH_ENTRY(f, fields, const var_t, entry) - { - type_t *ft = f->type; - unsigned int align = 0; - unsigned int size = type_memsize(ft, &align); - align = clamp_align(align); - if (align > salign) salign = align; - offset = ROUND_SIZE(offset, align); - offset += size; - } - - return ROUNDING(offset, salign); -} - unsigned int type_memsize(const type_t *t, unsigned int *align) { unsigned int size = 0; @@ -1355,7 +1356,7 @@ static unsigned int write_nonsimple_pointer(FILE *file, const attr_list_t *attrs if (out_attr && !in_attr && pointer_type == RPC_FC_RP) flags |= RPC_FC_P_ONSTACK; - if (is_ptr(type) && !last_ptr(type)) + if (is_ptr(type) && is_declptr(type_pointer_get_ref(type))) flags |= RPC_FC_P_DEREF; print_file(file, 2, "0x%x, 0x%x,\t\t/* %s", @@ -1382,6 +1383,9 @@ static unsigned int write_simple_pointer(FILE *file, const attr_list_t *attrs, c unsigned char fc; unsigned char pointer_fc; const type_t *ref; + int in_attr = is_attr(attrs, ATTR_IN); + int out_attr = is_attr(attrs, ATTR_OUT); + unsigned char flags = RPC_FC_P_SIMPLEPOINTER; /* for historical reasons, write_simple_pointer also handled string types, * but no longer does. catch bad uses of the function with this check */ @@ -1396,8 +1400,12 @@ static unsigned int write_simple_pointer(FILE *file, const attr_list_t *attrs, c else fc = get_basic_fc(ref); - print_file(file, 2, "0x%02x, 0x%x,\t/* %s [simple_pointer] */\n", - pointer_fc, RPC_FC_P_SIMPLEPOINTER, string_of_type(pointer_fc)); + if (out_attr && !in_attr) + flags |= RPC_FC_P_ONSTACK; + + print_file(file, 2, "0x%02x, 0x%x,\t/* %s %s[simple_pointer] */\n", + pointer_fc, flags, string_of_type(pointer_fc), + flags & RPC_FC_P_ONSTACK ? "[allocated_on_stack] " : ""); print_file(file, 2, "0x%02x,\t/* %s */\n", fc, string_of_type(fc)); print_file(file, 2, "0x5c,\t/* FC_PAD */\n"); return 4; @@ -1411,7 +1419,8 @@ static void print_start_tfs_comment(FILE *file, type_t *t, unsigned int tfsoff) } static unsigned int write_pointer_tfs(FILE *file, const attr_list_t *attrs, - type_t *type, int toplevel_param, + type_t *type, unsigned int ref_offset, + int toplevel_param, unsigned int *typestring_offset) { unsigned int offset = *typestring_offset; @@ -1420,15 +1429,21 @@ static unsigned int write_pointer_tfs(FILE *file, const attr_list_t *attrs, print_start_tfs_comment(file, type, offset); update_tfsoff(type, offset, file); - if (ref->typestring_offset) - write_nonsimple_pointer(file, attrs, type, - toplevel_param, - type_pointer_get_ref(type)->typestring_offset, - typestring_offset); - else if (type_get_type(ref) == TYPE_BASIC || - type_get_type(ref) == TYPE_ENUM) + switch (typegen_detect_type(ref, attrs, TDT_ALL_TYPES)) + { + case TGT_BASIC: + case TGT_ENUM: *typestring_offset += write_simple_pointer(file, attrs, type, toplevel_param); + break; + default: + if (ref_offset) + write_nonsimple_pointer(file, attrs, type, + toplevel_param, + ref_offset, + typestring_offset); + break; + } return offset; } @@ -1540,8 +1555,10 @@ static void write_member_type(FILE *file, const type_t *cont, reloff = absoff - (*tfsoff + 2); print_file(file, 2, "0x4c,\t/* FC_EMBEDDED_COMPLEX */\n"); - /* FIXME: actually compute necessary padding */ - print_file(file, 2, "0x0,\t/* FIXME: padding */\n"); + /* padding is represented using FC_STRUCTPAD* types, so presumably + * this is left over in the format for historical purposes in MIDL + * or rpcrt4. */ + print_file(file, 2, "0x0,\n"); print_file(file, 2, "NdrFcShort(0x%hx),\t/* Offset= %hd (%u) */\n", reloff, reloff, absoff); *tfsoff += 4; @@ -1636,8 +1653,11 @@ static int write_pointer_description_offsets( { unsigned int memsize; - /* pointer instance */ - /* FIXME: sometimes from end of structure, sometimes from beginning */ + /* pointer instance + * + * note that MSDN states that for pointer layouts in structures, + * this is a negative offset from the end of the structure, but + * this statement is incorrect. all offsets are positive */ print_file(file, 2, "NdrFcShort(0x%hx),\t/* Memory offset = %d */\n", *offset_in_memory, *offset_in_memory); print_file(file, 2, "NdrFcShort(0x%hx),\t/* Buffer offset = %d */\n", *offset_in_buffer, *offset_in_buffer); @@ -2139,7 +2159,6 @@ static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t unsigned int size; unsigned int start_offset; unsigned char fc; - int has_pointer; int pointer_type = get_attrv(attrs, ATTR_POINTERTYPE); unsigned int baseoff = !type_array_is_decl_as_ptr(type) && current_structure @@ -2149,10 +2168,7 @@ static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t if (!pointer_type) pointer_type = RPC_FC_RP; - if (write_embedded_types(file, attrs, type_array_get_element(type), name, FALSE, typestring_offset)) - has_pointer = TRUE; - else - has_pointer = type_has_pointers(type_array_get_element(type)); + write_embedded_types(file, attrs, type_array_get_element(type), name, FALSE, typestring_offset); align = 0; size = type_memsize((is_conformant_array(type) ? type_array_get_element(type) : type), &align); @@ -2210,7 +2226,8 @@ static unsigned int write_array_tfs(FILE *file, const attr_list_t *attrs, type_t += write_conf_or_var_desc(file, current_structure, baseoff, type, length_is); - if (has_pointer && (type_array_is_decl_as_ptr(type) || !current_structure)) + if (type_has_pointers(type_array_get_element(type)) && + (type_array_is_decl_as_ptr(type) || !current_structure)) { print_file(file, 2, "0x%x, /* FC_PP */\n", RPC_FC_PP); print_file(file, 2, "0x%x, /* FC_PAD */\n", RPC_FC_PAD); @@ -2330,7 +2347,6 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type, const var_t *array; unsigned int start_offset; unsigned int array_offset; - int has_pointers = 0; unsigned int align = 0; unsigned int corroff; var_t *f; @@ -2346,9 +2362,7 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type, name, USHRT_MAX, total_size - USHRT_MAX); if (fields) LIST_FOR_EACH_ENTRY(f, fields, var_t, entry) - has_pointers |= write_embedded_types(file, f->attrs, f->type, f->name, - FALSE, tfsoff); - if (!has_pointers) has_pointers = type_has_pointers(type); + write_embedded_types(file, f->attrs, f->type, f->name, FALSE, tfsoff); array = find_array_or_string_in_struct(type); if (array && !processed(array->type)) @@ -2396,7 +2410,7 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type, } else if ((fc == RPC_FC_PSTRUCT) || (fc == RPC_FC_CPSTRUCT) || - (fc == RPC_FC_CVSTRUCT && has_pointers)) + (fc == RPC_FC_CVSTRUCT && type_has_pointers(type))) { print_file(file, 2, "0x%x, /* FC_PP */\n", RPC_FC_PP); print_file(file, 2, "0x%x, /* FC_PAD */\n", RPC_FC_PAD); @@ -2417,25 +2431,33 @@ static unsigned int write_struct_tfs(FILE *file, type_t *type, if (fields) LIST_FOR_EACH_ENTRY(f, fields, const var_t, entry) { type_t *ft = f->type; - if (is_ptr(ft)) + switch (typegen_detect_type(ft, f->attrs, TDT_IGNORE_STRINGS)) { + case TGT_POINTER: if (is_string_type(f->attrs, ft)) write_string_tfs(file, f->attrs, ft, FALSE, f->name, tfsoff); else - write_pointer_tfs(file, f->attrs, ft, FALSE, tfsoff); - } - else if (type_get_type(ft) == TYPE_ARRAY && type_array_is_decl_as_ptr(ft)) - { - unsigned int offset; + write_pointer_tfs(file, f->attrs, ft, + type_pointer_get_ref(ft)->typestring_offset, + FALSE, tfsoff); + break; + case TGT_ARRAY: + if (type_array_is_decl_as_ptr(ft)) + { + unsigned int offset; - print_file(file, 0, "/* %d */\n", *tfsoff); + print_file(file, 0, "/* %d */\n", *tfsoff); - offset = ft->typestring_offset; - /* skip over the pointer that is written for strings, since a - * pointer has to be written in-place here */ - if (is_string_type(f->attrs, ft)) - offset += 4; - write_nonsimple_pointer(file, f->attrs, ft, FALSE, offset, tfsoff); + offset = ft->typestring_offset; + /* skip over the pointer that is written for strings, since a + * pointer has to be written in-place here */ + if (is_string_type(f->attrs, ft)) + offset += 4; + write_nonsimple_pointer(file, f->attrs, ft, FALSE, offset, tfsoff); + } + break; + default: + break; } } if (type->ptrdesc == *tfsoff) @@ -2639,12 +2661,14 @@ static unsigned int write_ip_tfs(FILE *file, const attr_list_t *attrs, type_t *t unsigned int start_offset = *typeformat_offset; expr_t *iid = get_attrp(attrs, ATTR_IIDIS); + print_start_tfs_comment(file, type, start_offset); + if (iid) { print_file(file, 2, "0x2f, /* FC_IP */\n"); print_file(file, 2, "0x5c, /* FC_PAD */\n"); *typeformat_offset - += write_conf_or_var_desc(file, NULL, 0, type, iid) + 2; + += write_conf_or_var_desc(file, current_structure, 0, type, iid) + 2; } else { @@ -2655,7 +2679,6 @@ static unsigned int write_ip_tfs(FILE *file, const attr_list_t *attrs, type_t *t error("%s: interface %s missing UUID\n", __FUNCTION__, base->name); update_tfsoff(type, start_offset, file); - print_start_tfs_comment(file, type, start_offset); print_file(file, 2, "0x2f,\t/* FC_IP */\n"); print_file(file, 2, "0x5a,\t/* FC_CONSTANT_IID */\n"); print_file(file, 2, "NdrFcLong(0x%08x),\n", uuid->Data1); @@ -2672,8 +2695,9 @@ static unsigned int write_ip_tfs(FILE *file, const attr_list_t *attrs, type_t *t return start_offset; } -static unsigned int write_contexthandle_tfs(FILE *file, const type_t *type, - const var_t *var, +static unsigned int write_contexthandle_tfs(FILE *file, + const attr_list_t *attrs, + const type_t *type, unsigned int *typeformat_offset) { unsigned int start_offset = *typeformat_offset; @@ -2684,13 +2708,13 @@ static unsigned int write_contexthandle_tfs(FILE *file, const type_t *type, if (is_ptr(type)) flags |= 0x80; - if (is_attr(var->attrs, ATTR_IN)) + if (is_attr(attrs, ATTR_IN)) { flags |= 0x40; - if (!is_attr(var->attrs, ATTR_OUT)) + if (!is_attr(attrs, ATTR_OUT)) flags |= NDR_CONTEXT_HANDLE_CANNOT_BE_NULL; } - if (is_attr(var->attrs, ATTR_OUT)) + if (is_attr(attrs, ATTR_OUT)) flags |= 0x20; WRITE_FCTYPE(file, FC_BIND_CONTEXT, *typeformat_offset); @@ -2747,46 +2771,60 @@ static unsigned int write_range_tfs(FILE *file, const attr_list_t *attrs, return start_offset; } -static unsigned int write_typeformatstring_var(FILE *file, int indent, const var_t *func, - type_t *type, const var_t *var, - int toplevel_param, - unsigned int *typeformat_offset) +static unsigned int write_type_tfs(FILE *file, int indent, + const attr_list_t *attrs, type_t *type, + const char *name, + enum type_context context, + unsigned int *typeformat_offset) { unsigned int offset; - switch (typegen_detect_type(type, var->attrs, TDT_ALL_TYPES)) + switch (typegen_detect_type(type, attrs, TDT_ALL_TYPES)) { case TGT_CTXT_HANDLE: case TGT_CTXT_HANDLE_POINTER: - return write_contexthandle_tfs(file, type, var, typeformat_offset); + return write_contexthandle_tfs(file, attrs, type, typeformat_offset); case TGT_USER_TYPE: write_user_tfs(file, type, typeformat_offset); return type->typestring_offset; case TGT_STRING: - return write_string_tfs(file, var->attrs, type, toplevel_param, var->name, typeformat_offset); + return write_string_tfs(file, attrs, type, + context == TYPE_CONTEXT_TOPLEVELPARAM, + name, typeformat_offset); case TGT_ARRAY: { - int ptr_type; unsigned int off; - off = write_array_tfs(file, var->attrs, type, var->name, typeformat_offset); - ptr_type = get_pointer_fc(type, var->attrs, toplevel_param); - if (ptr_type != RPC_FC_RP) + /* conformant and pointer arrays are handled specially */ + if ((context != TYPE_CONTEXT_CONTAINER && + context != TYPE_CONTEXT_CONTAINER_NO_POINTERS) || + !is_conformant_array(type) || type_array_is_decl_as_ptr(type)) + off = write_array_tfs(file, attrs, type, name, typeformat_offset); + else + off = 0; + if (context != TYPE_CONTEXT_CONTAINER && + context != TYPE_CONTEXT_CONTAINER_NO_POINTERS) { - unsigned int absoff = type->typestring_offset; - short reloff = absoff - (*typeformat_offset + 2); - off = *typeformat_offset; - print_file(file, 0, "/* %d */\n", off); - print_file(file, 2, "0x%x, 0x0,\t/* %s */\n", ptr_type, - string_of_type(ptr_type)); - print_file(file, 2, "NdrFcShort(0x%hx),\t/* Offset= %hd (%u) */\n", - reloff, reloff, absoff); - *typeformat_offset += 4; + int ptr_type; + ptr_type = get_pointer_fc(type, attrs, + context == TYPE_CONTEXT_TOPLEVELPARAM); + if (ptr_type != RPC_FC_RP) + { + unsigned int absoff = type->typestring_offset; + short reloff = absoff - (*typeformat_offset + 2); + off = *typeformat_offset; + print_file(file, 0, "/* %d */\n", off); + print_file(file, 2, "0x%x, 0x0,\t/* %s */\n", ptr_type, + string_of_type(ptr_type)); + print_file(file, 2, "NdrFcShort(0x%hx),\t/* Offset= %hd (%u) */\n", + reloff, reloff, absoff); + *typeformat_offset += 4; + } } return off; } case TGT_STRUCT: if (processed(type)) return type->typestring_offset; - return write_struct_tfs(file, type, var->name, typeformat_offset); + return write_struct_tfs(file, type, name, typeformat_offset); case TGT_UNION: if (processed(type)) return type->typestring_offset; return write_union_tfs(file, type, typeformat_offset); @@ -2796,131 +2834,46 @@ static unsigned int write_typeformatstring_var(FILE *file, int indent, const var return 0; case TGT_RANGE: { - expr_list_t *range_list = get_attrp(var->attrs, ATTR_RANGE); + expr_list_t *range_list = get_attrp(attrs, ATTR_RANGE); if (!range_list) range_list = get_aliaschain_attrp(type, ATTR_RANGE); - return write_range_tfs(file, var->attrs, type, range_list, typeformat_offset); + return write_range_tfs(file, attrs, type, range_list, typeformat_offset); } case TGT_IFACE_POINTER: - return write_ip_tfs(file, var->attrs, type, typeformat_offset); + return write_ip_tfs(file, attrs, type, typeformat_offset); case TGT_POINTER: - if (last_ptr(type)) + if (processed(type_pointer_get_ref(type))) + offset = type_pointer_get_ref(type)->typestring_offset; + else { - size_t start_offset = *typeformat_offset; - int in_attr = is_attr(var->attrs, ATTR_IN); - int out_attr = is_attr(var->attrs, ATTR_OUT); - const type_t *ref = type_pointer_get_ref(type); - - switch (typegen_detect_type(ref, NULL, TDT_ALL_TYPES)) - { - /* special case for pointers to base types */ - case TGT_BASIC: - case TGT_ENUM: - { - unsigned char fc; - - if (type_get_type(ref) == TYPE_ENUM) - fc = get_enum_fc(ref); - else - fc = get_basic_fc(ref); - - print_file(file, indent, "0x%x, 0x%x, /* %s %s[simple_pointer] */\n", - get_pointer_fc(type, var->attrs, toplevel_param), - (!in_attr && out_attr) ? 0x0C : 0x08, - string_of_type(get_pointer_fc(type, var->attrs, toplevel_param)), - (!in_attr && out_attr) ? "[allocated_on_stack] " : ""); - print_file(file, indent, "0x%02x, /* %s */\n", - fc, string_of_type(fc)); - print_file(file, indent, "0x5c, /* FC_PAD */\n"); - *typeformat_offset += 4; - return start_offset; - } - default: - break; - } + enum type_context ref_context; + if (context == TYPE_CONTEXT_TOPLEVELPARAM) + ref_context = TYPE_CONTEXT_PARAM; + else if (context == TYPE_CONTEXT_CONTAINER_NO_POINTERS) + ref_context = TYPE_CONTEXT_CONTAINER; + else + ref_context = context; + offset = write_type_tfs( + file, indent, attrs, type_pointer_get_ref(type), name, + ref_context, typeformat_offset); } - - offset = write_typeformatstring_var(file, indent, func, - type_pointer_get_ref(type), var, - FALSE, typeformat_offset); - if (file) - fprintf(file, "/* %2u */\n", *typeformat_offset); - return write_nonsimple_pointer(file, var->attrs, type, - toplevel_param, - offset, typeformat_offset); + if (context == TYPE_CONTEXT_CONTAINER_NO_POINTERS) + return 0; + else + return write_pointer_tfs(file, attrs, type, offset, + context == TYPE_CONTEXT_TOPLEVELPARAM, + typeformat_offset); case TGT_INVALID: break; } - error("invalid type %s for var %s\n", type->name, var->name); + error("invalid type %s for var %s\n", type->name, name); return 0; } static int write_embedded_types(FILE *file, const attr_list_t *attrs, type_t *type, const char *name, int write_ptr, unsigned int *tfsoff) { - int retmask = 0; - - switch (typegen_detect_type(type, attrs, TDT_ALL_TYPES)) - { - case TGT_USER_TYPE: - write_user_tfs(file, type, tfsoff); - break; - case TGT_STRING: - write_string_tfs(file, attrs, type, FALSE, name, tfsoff); - break; - case TGT_IFACE_POINTER: - write_ip_tfs(file, attrs, type, tfsoff); - break; - case TGT_POINTER: - { - type_t *ref = type_pointer_get_ref(type); - - if (!processed(ref) && type_get_type(ref) != TYPE_BASIC) - retmask |= write_embedded_types(file, NULL, ref, name, TRUE, tfsoff); - - if (write_ptr) - write_pointer_tfs(file, attrs, type, FALSE, tfsoff); - - retmask |= 1; - break; - } - case TGT_ARRAY: - /* conformant arrays and strings are handled specially */ - if (!is_conformant_array(type) || type_array_is_decl_as_ptr(type) ) - { - write_array_tfs(file, attrs, type, name, tfsoff); - if (is_conformant_array(type)) - retmask |= 1; - } - break; - case TGT_STRUCT: - if (!processed(type)) - write_struct_tfs(file, type, name, tfsoff); - break; - case TGT_UNION: - if (!processed(type)) - write_union_tfs(file, type, tfsoff); - break; - case TGT_ENUM: - case TGT_BASIC: - /* nothing to do */ - break; - case TGT_RANGE: - { - expr_list_t *range_list = get_attrp(attrs, ATTR_RANGE); - if (!range_list) - range_list = get_aliaschain_attrp(type, ATTR_RANGE); - write_range_tfs(file, attrs, type, range_list, tfsoff); - break; - } - case TGT_CTXT_HANDLE: - case TGT_CTXT_HANDLE_POINTER: - case TGT_INVALID: - error("invalid type %s for var %s\n", type->name, name); - break; - } - - return retmask; + return write_type_tfs(file, 2, attrs, type, name, write_ptr ? TYPE_CONTEXT_CONTAINER : TYPE_CONTEXT_CONTAINER_NO_POINTERS, tfsoff); } static unsigned int process_tfs_stmts(FILE *file, const statement_list_t *stmts, @@ -2954,13 +2907,12 @@ static unsigned int process_tfs_stmts(FILE *file, const statement_list_t *stmts, if (!is_void(type_function_get_rettype(func->type))) { - var_t v = *func; - v.type = type_function_get_rettype(func->type); update_tfsoff(type_function_get_rettype(func->type), - write_typeformatstring_var( - file, 2, NULL, + write_type_tfs( + file, 2, func->attrs, type_function_get_rettype(func->type), - &v, FALSE, typeformat_offset), + func->name, TYPE_CONTEXT_PARAM, + typeformat_offset), file); } @@ -2969,9 +2921,10 @@ static unsigned int process_tfs_stmts(FILE *file, const statement_list_t *stmts, LIST_FOR_EACH_ENTRY( var, type_get_function_args(func->type), const var_t, entry ) update_tfsoff( var->type, - write_typeformatstring_var( - file, 2, func, var->type, var, - TRUE, typeformat_offset), + write_type_tfs( + file, 2, var->attrs, var->type, var->name, + TYPE_CONTEXT_TOPLEVELPARAM, + typeformat_offset), file); } } @@ -3298,7 +3251,7 @@ void print_phase_basetype(FILE *file, int indent, const char *local_var_prefix, size = 0; } - if (phase == PHASE_MARSHAL) + if (phase == PHASE_MARSHAL && alignment > 1) print_file(file, indent, "MIDL_memset(__frame->_StubMsg.Buffer, 0, (0x%x - (ULONG_PTR)__frame->_StubMsg.Buffer) & 0x%x);\n", alignment, alignment - 1); print_file(file, indent, "__frame->_StubMsg.Buffer = (unsigned char *)(((ULONG_PTR)__frame->_StubMsg.Buffer + %u) & ~0x%x);\n", alignment - 1, alignment - 1); @@ -3371,15 +3324,10 @@ static void write_parameter_conf_or_var_exprs(FILE *file, int indent, const char /* get fundamental type for the argument */ for (;;) { - if (is_attr(type->attrs, ATTR_WIREMARSHAL)) - break; - else if (is_attr(type->attrs, ATTR_CONTEXTHANDLE)) - break; - else if (type_is_alias(type)) - type = type_alias_get_aliasee(type); - else if (is_array(type)) + switch (typegen_detect_type(type, var->attrs, TDT_IGNORE_STRINGS|TDT_IGNORE_RANGES)) { - if (is_conformance_needed_for_phase(phase) && is_array(type)) + case TGT_ARRAY: + if (is_conformance_needed_for_phase(phase)) { if (type_array_has_conformance(type)) { @@ -3396,18 +3344,16 @@ static void write_parameter_conf_or_var_exprs(FILE *file, int indent, const char } } break; - } - else if (type_get_type(type) == TYPE_UNION) - { - if (is_conformance_needed_for_phase(phase)) + case TGT_UNION: + if (type_get_type(type) == TYPE_UNION && + is_conformance_needed_for_phase(phase)) { print_file(file, indent, "__frame->_StubMsg.MaxCount = (ULONG_PTR)"); write_expr(file, get_attrp(var->attrs, ATTR_SWITCHIS), 1, 1, NULL, NULL, local_var_prefix); fprintf(file, ";\n\n"); } break; - } - else if (type_get_type(type) == TYPE_INTERFACE || is_void(type)) + case TGT_IFACE_POINTER: { expr_t *iid; @@ -3419,10 +3365,21 @@ static void write_parameter_conf_or_var_exprs(FILE *file, int indent, const char } break; } - else if (is_ptr(type)) + case TGT_POINTER: type = type_pointer_get_ref(type); - else + continue; + case TGT_INVALID: + case TGT_USER_TYPE: + case TGT_CTXT_HANDLE: + case TGT_CTXT_HANDLE_POINTER: + case TGT_STRING: + case TGT_BASIC: + case TGT_ENUM: + case TGT_STRUCT: + case TGT_RANGE: break; + } + break; } } @@ -3547,7 +3504,7 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const case TGT_ARRAY: { unsigned char tc = get_array_fc(type); - const char *array_type = "FixedArray"; + const char *array_type = NULL; /* We already have the size_is expression since it's at the top level, but do checks for multidimensional conformant @@ -3556,19 +3513,25 @@ static void write_remoting_arg(FILE *file, int indent, const var_t *func, const the return value. */ get_size_is_expr(type, var->name); - if (tc == RPC_FC_SMVARRAY || tc == RPC_FC_LGVARRAY) + switch (tc) { + case RPC_FC_SMFARRAY: + case RPC_FC_LGFARRAY: + array_type = "FixedArray"; + break; + case RPC_FC_SMVARRAY: + case RPC_FC_LGVARRAY: array_type = "VaryingArray"; - } - else if (tc == RPC_FC_CARRAY) - { + break; + case RPC_FC_CARRAY: array_type = "ConformantArray"; - } - else if (tc == RPC_FC_CVARRAY || tc == RPC_FC_BOGUS_ARRAY) - { - array_type = (tc == RPC_FC_BOGUS_ARRAY - ? "ComplexArray" - : "ConformantVaryingArray"); + break; + case RPC_FC_CVARRAY: + array_type = "ConformantVaryingArray"; + break; + case RPC_FC_BOGUS_ARRAY: + array_type = "ComplexArray"; + break; } if (pointer_type != RPC_FC_RP) array_type = "Pointer"; @@ -4011,8 +3974,11 @@ int write_expr_eval_routines(FILE *file, const char *iface) print_file(file, 0, "static void __RPC_USER %s_%sExprEval_%04u(PMIDL_STUB_MESSAGE pStubMsg)\n", iface, name, callback_offset); print_file(file, 0, "{\n"); - print_file (file, 1, "%s *%s = (%s *)(pStubMsg->StackTop - %u);\n", - name, var_name, name, eval->baseoff); + print_file(file, 1, "%s", ""); + write_type_left(file, (type_t *)eval->structure, TRUE); + fprintf(file, " *%s = (", var_name); + write_type_left(file, (type_t *)eval->structure, TRUE); + fprintf(file, " *)(pStubMsg->StackTop - %u);\n", eval->baseoff); print_file(file, 1, "pStubMsg->Offset = 0;\n"); /* FIXME */ print_file(file, 1, "pStubMsg->MaxCount = (ULONG_PTR)"); write_expr(file, eval->expr, 1, 1, var_name_expr, eval->structure, ""); diff --git a/reactos/tools/widl/typegen.h b/reactos/tools/widl/typegen.h index 2b2e65dacfc..242b40d4e43 100644 --- a/reactos/tools/widl/typegen.h +++ b/reactos/tools/widl/typegen.h @@ -84,8 +84,6 @@ unsigned int type_memsize(const type_t *t, unsigned int *align); int decl_indirect(const type_t *t); void write_parameters_init(FILE *file, int indent, const var_t *func, const char *local_var_prefix); void print(FILE *file, int indent, const char *format, va_list ap); -int get_padding(const var_list_t *fields); -int is_user_type(const type_t *t); expr_t *get_size_is_expr(const type_t *t, const char *name); int is_full_pointer_function(const var_t *func); void write_full_pointer_init(FILE *file, int indent, const var_t *func, int is_server); diff --git a/reactos/tools/widl/widl.c b/reactos/tools/widl/widl.c index c1c3832df2c..8c76c24e08e 100644 --- a/reactos/tools/widl/widl.c +++ b/reactos/tools/widl/widl.c @@ -100,7 +100,7 @@ int parser_debug, yy_flex_debug; int pedantic = 0; int do_everything = 1; -int preprocess_only = 0; +static int preprocess_only = 0; int do_header = 0; int do_typelib = 0; int do_proxies = 0; @@ -108,7 +108,7 @@ int do_client = 0; int do_server = 0; int do_idfile = 0; int do_dlldata = 0; -int no_preprocess = 0; +static int no_preprocess = 0; int old_names = 0; int do_win32 = 1; int do_win64 = 1; @@ -127,16 +127,15 @@ char *client_name; char *client_token; char *server_name; char *server_token; -char *idfile_name; -char *idfile_token; +static char *idfile_name; +static char *idfile_token; char *temp_name; const char *prefix_client = ""; const char *prefix_server = ""; int line_number = 1; -FILE *header; -FILE *idfile; +static FILE *idfile; size_t pointer_size = 0; syskind_t typelib_kind = sizeof(void*) == 8 ? SYS_WIN64 : SYS_WIN32; @@ -160,18 +159,18 @@ enum { static const char short_options[] = "b:cC:d:D:EhH:I:m:NpP:sS:tT:uU:VW"; static const struct option long_options[] = { - { "dlldata", 1, 0, DLLDATA_OPTION }, - { "dlldata-only", 0, 0, DLLDATA_ONLY_OPTION }, - { "local-stubs", 1, 0, LOCAL_STUBS_OPTION }, - { "oldnames", 0, 0, OLDNAMES_OPTION }, - { "prefix-all", 1, 0, PREFIX_ALL_OPTION }, - { "prefix-client", 1, 0, PREFIX_CLIENT_OPTION }, - { "prefix-server", 1, 0, PREFIX_SERVER_OPTION }, - { "win32", 0, 0, WIN32_OPTION }, - { "win64", 0, 0, WIN64_OPTION }, - { "win32-align", 1, 0, WIN32_ALIGN_OPTION }, - { "win64-align", 1, 0, WIN64_ALIGN_OPTION }, - { 0, 0, 0, 0 } + { "dlldata", 1, NULL, DLLDATA_OPTION }, + { "dlldata-only", 0, NULL, DLLDATA_ONLY_OPTION }, + { "local-stubs", 1, NULL, LOCAL_STUBS_OPTION }, + { "oldnames", 0, NULL, OLDNAMES_OPTION }, + { "prefix-all", 1, NULL, PREFIX_ALL_OPTION }, + { "prefix-client", 1, NULL, PREFIX_CLIENT_OPTION }, + { "prefix-server", 1, NULL, PREFIX_SERVER_OPTION }, + { "win32", 0, NULL, WIN32_OPTION }, + { "win64", 0, NULL, WIN64_OPTION }, + { "win32-align", 1, NULL, WIN32_ALIGN_OPTION }, + { "win64-align", 1, NULL, WIN64_ALIGN_OPTION }, + { NULL, 0, NULL, 0 } }; static void rm_tempfile(void); @@ -431,7 +430,7 @@ static void write_id_data_stmts(const statement_list_t *stmts) if (type_get_type(type) == TYPE_INTERFACE) { const UUID *uuid; - if (!is_object(type->attrs) && !is_attr(type->attrs, ATTR_DISPINTERFACE)) + if (!is_object(type) && !is_attr(type->attrs, ATTR_DISPINTERFACE)) continue; uuid = get_attrp(type->attrs, ATTR_UUID); write_guid(idfile, is_attr(type->attrs, ATTR_DISPINTERFACE) ? "DIID" : "IID", @@ -648,8 +647,8 @@ int main(int argc,char *argv[]) if(debuglevel) { - setbuf(stdout,0); - setbuf(stderr,0); + setbuf(stdout, NULL); + setbuf(stderr, NULL); } parser_debug = debuglevel & DEBUGLEVEL_TRACE ? 1 : 0; diff --git a/reactos/tools/widl/widltypes.h b/reactos/tools/widl/widltypes.h index f0afce4e6a5..6874d2ad31a 100644 --- a/reactos/tools/widl/widltypes.h +++ b/reactos/tools/widl/widltypes.h @@ -44,15 +44,10 @@ typedef GUID UUID; #endif #define FALSE 0 -#define RPC_FC_MODULE 0xfc -#define RPC_FC_COCLASS 0xfd -#define RPC_FC_FUNCTION 0xfe - typedef struct _loc_info_t loc_info_t; typedef struct _attr_t attr_t; typedef struct _expr_t expr_t; typedef struct _type_t type_t; -typedef struct _typeref_t typeref_t; typedef struct _var_t var_t; typedef struct _declarator_t declarator_t; typedef struct _func_t func_t; @@ -195,6 +190,7 @@ enum expr_type EXPR_POS, EXPR_STRLIT, EXPR_WSTRLIT, + EXPR_CHARCONST, }; enum type_kind @@ -528,8 +524,6 @@ int is_ptr(const type_t *t); int is_array(const type_t *t); int is_var_ptr(const var_t *v); int cant_be_null(const var_t *v); -int is_struct(unsigned char tc); -int is_union(unsigned char tc); #define tsENUM 1 #define tsSTRUCT 2 diff --git a/reactos/tools/winebuild/ros_diff.patch b/reactos/tools/winebuild/ros_diff.patch index 07d9b13d156..7247ac10299 100644 --- a/reactos/tools/winebuild/ros_diff.patch +++ b/reactos/tools/winebuild/ros_diff.patch @@ -282,7 +282,7 @@ Index: spec32.c if (!kill_at && target_cpu == CPU_x86) output( "@%d", at_param ); if (odp->flags & FLAG_FORWARD) { -@@ -825,6 +883,51 @@ +@@ -825,6 +883,50 @@ } break; } @@ -296,7 +296,6 @@ Index: spec32.c + if (odp->flags & FLAG_FORWARD) + { + output( "=" ); -+ if (!kill_at) output( "@" ); + output( "%s", odp->link_name ); + } + else if (strcmp(name, odp->link_name)) /* try to reduce output */ diff --git a/reactos/tools/winebuild/spec32.c b/reactos/tools/winebuild/spec32.c index 4c8c2554df5..f00ad120937 100644 --- a/reactos/tools/winebuild/spec32.c +++ b/reactos/tools/winebuild/spec32.c @@ -893,7 +893,6 @@ void BuildDef32File( DLLSPEC *spec ) if (odp->flags & FLAG_FORWARD) { output( "=" ); - if (!kill_at) output( "@" ); output( "%s", odp->link_name ); } else if (strcmp(name, odp->link_name)) /* try to reduce output */ diff --git a/reactos/tools/xml.h b/reactos/tools/xml.h index 5bd8ffade8b..03d11724c89 100644 --- a/reactos/tools/xml.h +++ b/reactos/tools/xml.h @@ -15,8 +15,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef XML_H -#define XML_H + +#pragma once #include #include @@ -240,5 +240,3 @@ std::vector vectorize(const std::string &str); void vectappend(std::vector &strvec, char ch); void vectappend(std::vector &strvec, const char *charstr); void vectappend(std::vector &strvec, const std::string &str); - -#endif // XML_H