ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

midimap.c
Go to the documentation of this file.
00001 /* -*- tab-width: 8; c-basic-offset: 4 -*- */
00002 /*
00003  * Wine MIDI mapper driver
00004  *
00005  * Copyright    1999, 2000, 2001 Eric Pouech
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2.1 of the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public
00018  * License along with this library; if not, write to the Free Software
00019  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00020  *
00021  * TODO:
00022  *  notification has to be implemented
00023  *  IDF file loading
00024  */
00025 
00026 #include <stdarg.h>
00027 #include <string.h>
00028 #include <stdlib.h>
00029 #include <ctype.h>
00030 #include "windef.h"
00031 #include "winbase.h"
00032 #include "wingdi.h"
00033 #include "winuser.h"
00034 #include "mmddk.h"
00035 #include "winreg.h"
00036 #include "wine/unicode.h"
00037 #include "wine/debug.h"
00038 
00039 /*
00040  * Here's how Windows stores the midiOut mapping information.
00041  *
00042  * Full form (in HKU) is:
00043  *
00044  * [Software\\Microsoft\\Windows\\CurrentVersion\\Multimedia\\MIDIMap] 988836060
00045  * "AutoScheme"=dword:00000000
00046  * "ConfigureCount"=dword:00000004
00047  * "CurrentInstrument"="Wine OSS midi"
00048  * "CurrentScheme"="epp"
00049  * "DriverList"=""
00050  * "UseScheme"=dword:00000000
00051  *
00052  * AutoScheme:      ?
00053  * CurrentInstrument:   name of midiOut device to use when UseScheme is 0. Wine uses an extension
00054  *          of the form #n to link to n'th midiOut device of the system
00055  * CurrentScheme:   when UseScheme is non null, it's the scheme to use (see below)
00056  * DriverList:      ?
00057  * UseScheme:       trigger for simple/complex mapping
00058  *
00059  * A scheme is defined (in HKLM) as:
00060  *
00061  * [System\\CurrentControlSet\\Control\\MediaProperties\\PrivateProperties\\Midi\\Schemes\<nameScheme>]
00062  * <nameScheme>:    one key for each defined scheme (system wide)
00063  * under each one of these <nameScheme> keys, there's:
00064  * [...\<nameScheme>\<idxDevice>]
00065  * "Channels"="<bitMask>"
00066  * (the default value of this key also refers to the name of the device).
00067  *
00068  * this defines, for each midiOut device (identified by its index in <idxDevice>), which
00069  * channels have to be mapped onto it. The <bitMask> defines the channels (from 0 to 15)
00070  * will be mapped (mapping occurs for channel <ch> if bit <ch> is set in <bitMask>
00071  *
00072  * Further mapping information can also be defined in:
00073  * [System\\CurrentControlSet\\Control\\MediaProperties\\PrivateProperties\\Midi\\Ports\<nameDevice>\\Instruments\<idx>]
00074  * "Definition"="<.idf file>"
00075  * "FriendlyName"="#for .idx file#"
00076  * "Port"="<idxPort>"
00077  *
00078  * This last part isn't implemented (.idf file support).
00079  */
00080 
00081 WINE_DEFAULT_DEBUG_CHANNEL(msacm);
00082 
00083 typedef struct tagMIDIOUTPORT
00084 {
00085     WCHAR       name[MAXPNAMELEN];
00086     int         loaded;
00087     HMIDIOUT        hMidi;
00088     unsigned short  uDevID;
00089     LPBYTE      lpbPatch;
00090     unsigned int    aChn[16];
00091 } MIDIOUTPORT;
00092 
00093 typedef struct tagMIDIMAPDATA
00094 {
00095     struct tagMIDIMAPDATA*  self;
00096     MIDIOUTPORT*    ChannelMap[16];
00097 } MIDIMAPDATA;
00098 
00099 static  MIDIOUTPORT*    midiOutPorts;
00100 static  unsigned    numMidiOutPorts;
00101 
00102 static  BOOL    MIDIMAP_IsBadData(MIDIMAPDATA* mm)
00103 {
00104     if (!IsBadReadPtr(mm, sizeof(MIDIMAPDATA)) && mm->self == mm)
00105     return FALSE;
00106     TRACE("Bad midimap data (%p)\n", mm);
00107     return TRUE;
00108 }
00109 
00110 static BOOL MIDIMAP_FindPort(const WCHAR* name, unsigned* dev)
00111 {
00112     for (*dev = 0; *dev < numMidiOutPorts; (*dev)++)
00113     {
00114     TRACE("%s\n", wine_dbgstr_w(midiOutPorts[*dev].name));
00115     if (strcmpW(midiOutPorts[*dev].name, name) == 0)
00116         return TRUE;
00117     }
00118     /* try the form #nnn */
00119     if (*name == '#' && isdigit(name[1]))
00120     {
00121         const WCHAR*  ptr = name + 1;
00122         *dev = 0;
00123         do
00124         {
00125             *dev = *dev * 10 + *ptr - '0';
00126         } while (isdigit(*++ptr));
00127     if (*dev < numMidiOutPorts)
00128         return TRUE;
00129     }
00130     return FALSE;
00131 }
00132 
00133 static BOOL MIDIMAP_LoadSettingsDefault(MIDIMAPDATA* mom, const WCHAR* port)
00134 {
00135     unsigned i, dev = 0;
00136 
00137     if (port != NULL && !MIDIMAP_FindPort(port, &dev))
00138     {
00139     ERR("Registry glitch: couldn't find midi out (%s)\n", wine_dbgstr_w(port));
00140     dev = 0;
00141     }
00142 
00143     /* this is necessary when no midi out ports are present */
00144     if (dev >= numMidiOutPorts)
00145     return FALSE;
00146     /* sets default */
00147     for (i = 0; i < 16; i++) mom->ChannelMap[i] = &midiOutPorts[dev];
00148 
00149     return TRUE;
00150 }
00151 
00152 static BOOL MIDIMAP_LoadSettingsScheme(MIDIMAPDATA* mom, const WCHAR* scheme)
00153 {
00154     HKEY    hSchemesKey, hKey, hPortKey;
00155     unsigned    i, idx, dev;
00156     WCHAR       buffer[256], port[256];
00157     DWORD   type, size, mask;
00158 
00159     for (i = 0; i < 16; i++)    mom->ChannelMap[i] = NULL;
00160 
00161     if (RegOpenKeyA(HKEY_LOCAL_MACHINE,
00162             "System\\CurrentControlSet\\Control\\MediaProperties\\PrivateProperties\\Midi\\Schemes",
00163             &hSchemesKey))
00164     {
00165     return FALSE;
00166     }
00167     if (RegOpenKeyW(hSchemesKey, scheme, &hKey))
00168     {
00169     RegCloseKey(hSchemesKey);
00170     return FALSE;
00171     }
00172 
00173     for (idx = 0; !RegEnumKeyW(hKey, idx, buffer, sizeof(buffer)); idx++)
00174     {
00175     if (RegOpenKeyW(hKey, buffer, &hPortKey)) continue;
00176 
00177     size = sizeof(port);
00178     if (RegQueryValueExW(hPortKey, NULL, 0, &type, (void*)port, &size)) continue;
00179 
00180     if (!MIDIMAP_FindPort(port, &dev)) continue;
00181 
00182     size = sizeof(mask);
00183     if (RegQueryValueExA(hPortKey, "Channels", 0, &type, (void*)&mask, &size))
00184         continue;
00185 
00186     for (i = 0; i < 16; i++)
00187     {
00188         if (mask & (1 << i))
00189         {
00190         if (mom->ChannelMap[i])
00191             ERR("Quirks in registry, channel %u is mapped twice\n", i);
00192         mom->ChannelMap[i] = &midiOutPorts[dev];
00193         }
00194     }
00195     }
00196 
00197     RegCloseKey(hSchemesKey);
00198     RegCloseKey(hKey);
00199 
00200     return TRUE;
00201 }
00202 
00203 static BOOL MIDIMAP_LoadSettings(MIDIMAPDATA* mom)
00204 {
00205     HKEY    hKey;
00206     BOOL    ret;
00207 
00208     if (RegOpenKeyA(HKEY_CURRENT_USER,
00209             "Software\\Microsoft\\Windows\\CurrentVersion\\Multimedia\\MIDIMap", &hKey))
00210     {
00211     ret = MIDIMAP_LoadSettingsDefault(mom, NULL);
00212     }
00213     else
00214     {
00215     DWORD   type, size, out;
00216     WCHAR   buffer[256];
00217 
00218     ret = 2;
00219     size = sizeof(out);
00220     if (!RegQueryValueExA(hKey, "UseScheme", 0, &type, (void*)&out, &size) && out)
00221     {
00222             static const WCHAR cs[] = {'C','u','r','r','e','n','t','S','c','h','e','m','e',0};
00223         size = sizeof(buffer);
00224         if (!RegQueryValueExW(hKey, cs, 0, &type, (void*)buffer, &size))
00225         {
00226         if (!(ret = MIDIMAP_LoadSettingsScheme(mom, buffer)))
00227             ret = MIDIMAP_LoadSettingsDefault(mom, NULL);
00228         }
00229         else
00230         {
00231         ERR("Wrong registry: UseScheme is active, but no CurrentScheme found\n");
00232         }
00233     }
00234     if (ret == 2)
00235     {
00236             static const WCHAR ci[] = {'C','u','r','r','e','n','t','I','n','s','t','r','u','m','e','n','t',0};
00237         size = sizeof(buffer);
00238         if (!RegQueryValueExW(hKey, ci, 0, &type, (void*)buffer, &size) && *buffer)
00239         {
00240         ret = MIDIMAP_LoadSettingsDefault(mom, buffer);
00241         }
00242         else
00243         {
00244         ret = MIDIMAP_LoadSettingsDefault(mom, NULL);
00245         }
00246     }
00247     }
00248     RegCloseKey(hKey);
00249 
00250     if (ret && TRACE_ON(msacm))
00251     {
00252     unsigned    i;
00253 
00254     for (i = 0; i < 16; i++)
00255     {
00256         TRACE("chnMap[%2d] => %d\n",
00257           i, mom->ChannelMap[i] ? mom->ChannelMap[i]->uDevID : -1);
00258     }
00259     }
00260     return ret;
00261 }
00262 
00263 static  DWORD   modOpen(DWORD_PTR *lpdwUser, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
00264 {
00265     MIDIMAPDATA*    mom = HeapAlloc(GetProcessHeap(), 0, sizeof(MIDIMAPDATA));
00266 
00267     TRACE("(%p %p %08lx)\n", lpdwUser, lpDesc, dwFlags);
00268 
00269     if (!mom) return MMSYSERR_NOMEM;
00270 
00271     if (MIDIMAP_LoadSettings(mom))
00272     {
00273     *lpdwUser = (DWORD_PTR)mom;
00274     mom->self = mom;
00275 
00276     return MMSYSERR_NOERROR;
00277     }
00278     HeapFree(GetProcessHeap(), 0, mom);
00279     return MIDIERR_INVALIDSETUP;
00280 }
00281 
00282 static  DWORD   modClose(MIDIMAPDATA* mom)
00283 {
00284     UINT    i;
00285     DWORD   ret = MMSYSERR_NOERROR;
00286 
00287     if (MIDIMAP_IsBadData(mom))     return MMSYSERR_ERROR;
00288 
00289     for (i = 0; i < 16; i++)
00290     {
00291     DWORD   t;
00292     if (mom->ChannelMap[i] && mom->ChannelMap[i]->loaded > 0)
00293     {
00294         t = midiOutClose(mom->ChannelMap[i]->hMidi);
00295         if (t == MMSYSERR_NOERROR)
00296         {
00297         mom->ChannelMap[i]->loaded = 0;
00298         mom->ChannelMap[i]->hMidi = 0;
00299         }
00300         else if (ret == MMSYSERR_NOERROR)
00301         ret = t;
00302     }
00303     }
00304     if (ret == MMSYSERR_NOERROR)
00305     HeapFree(GetProcessHeap(), 0, mom);
00306     return ret;
00307 }
00308 
00309 static  DWORD   modLongData(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD_PTR dwParam2)
00310 {
00311     WORD    chn;
00312     DWORD   ret = MMSYSERR_NOERROR;
00313     MIDIHDR mh;
00314 
00315     if (MIDIMAP_IsBadData(mom))
00316     return MMSYSERR_ERROR;
00317 
00318     mh = *lpMidiHdr;
00319     for (chn = 0; chn < 16; chn++)
00320     {
00321     if (mom->ChannelMap[chn] && mom->ChannelMap[chn]->loaded > 0)
00322     {
00323         mh.dwFlags = 0;
00324         midiOutPrepareHeader(mom->ChannelMap[chn]->hMidi, &mh, sizeof(mh));
00325         ret = midiOutLongMsg(mom->ChannelMap[chn]->hMidi, &mh, sizeof(mh));
00326         midiOutUnprepareHeader(mom->ChannelMap[chn]->hMidi, &mh, sizeof(mh));
00327         if (ret != MMSYSERR_NOERROR) break;
00328     }
00329     }
00330     return ret;
00331 }
00332 
00333 static  DWORD   modData(MIDIMAPDATA* mom, DWORD_PTR dwParam)
00334 {
00335     BYTE    lb = LOBYTE(LOWORD(dwParam));
00336     WORD    chn = lb & 0x0F;
00337     DWORD   ret = MMSYSERR_NOERROR;
00338 
00339     if (MIDIMAP_IsBadData(mom))
00340     return MMSYSERR_ERROR;
00341 
00342     if (!mom->ChannelMap[chn]) return MMSYSERR_NOERROR;
00343 
00344     switch (lb & 0xF0)
00345     {
00346     case 0x80:
00347     case 0x90:
00348     case 0xA0:
00349     case 0xB0:
00350     case 0xC0:
00351     case 0xD0:
00352     case 0xE0:
00353     if (mom->ChannelMap[chn]->loaded == 0)
00354     {
00355         if (midiOutOpen(&mom->ChannelMap[chn]->hMidi, mom->ChannelMap[chn]->uDevID,
00356                 0L, 0L, CALLBACK_NULL) == MMSYSERR_NOERROR)
00357         mom->ChannelMap[chn]->loaded = 1;
00358         else
00359         mom->ChannelMap[chn]->loaded = -1;
00360         /* FIXME: should load here the IDF midi data... and allow channel and
00361          * patch mappings
00362          */
00363     }
00364     if (mom->ChannelMap[chn]->loaded > 0)
00365     {
00366         /* change channel */
00367         dwParam &= ~0x0F;
00368         dwParam |= mom->ChannelMap[chn]->aChn[chn];
00369 
00370         if ((LOBYTE(LOWORD(dwParam)) & 0xF0) == 0xC0 /* program change */ &&
00371         mom->ChannelMap[chn]->lpbPatch)
00372         {
00373         BYTE patch = HIBYTE(LOWORD(dwParam));
00374 
00375         /* change patch */
00376         dwParam &= ~0x0000FF00;
00377         dwParam |= mom->ChannelMap[chn]->lpbPatch[patch];
00378         }
00379         ret = midiOutShortMsg(mom->ChannelMap[chn]->hMidi, dwParam);
00380     }
00381     break;
00382     case 0xF0:
00383     for (chn = 0; chn < 16; chn++)
00384     {
00385         if (mom->ChannelMap[chn]->loaded > 0)
00386         ret = midiOutShortMsg(mom->ChannelMap[chn]->hMidi, dwParam);
00387     }
00388     break;
00389     default:
00390     FIXME("ooch %lu\n", dwParam);
00391     }
00392 
00393     return ret;
00394 }
00395 
00396 static  DWORD   modPrepare(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD_PTR dwParam2)
00397 {
00398     if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR;
00399     if (lpMidiHdr->dwFlags & (MHDR_ISSTRM|MHDR_PREPARED))
00400     return MMSYSERR_INVALPARAM;
00401 
00402     lpMidiHdr->dwFlags |= MHDR_PREPARED;
00403     return MMSYSERR_NOERROR;
00404 }
00405 
00406 static  DWORD   modUnprepare(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD_PTR dwParam2)
00407 {
00408     if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR;
00409     if ((lpMidiHdr->dwFlags & MHDR_ISSTRM) || !(lpMidiHdr->dwFlags & MHDR_PREPARED))
00410     return MMSYSERR_INVALPARAM;
00411 
00412     lpMidiHdr->dwFlags &= ~MHDR_PREPARED;
00413     return MMSYSERR_NOERROR;
00414 }
00415 
00416 static  DWORD   modGetDevCaps(UINT wDevID, MIDIMAPDATA* mom, LPMIDIOUTCAPSW lpMidiCaps, DWORD_PTR size)
00417 {
00418     static const WCHAR name[] = {'W','i','n','e',' ','m','i','d','i',' ','m','a','p','p','e','r',0};
00419     lpMidiCaps->wMid = 0x00FF;
00420     lpMidiCaps->wPid = 0x0001;
00421     lpMidiCaps->vDriverVersion = 0x0100;
00422     lstrcpyW(lpMidiCaps->szPname, name);
00423     lpMidiCaps->wTechnology = MOD_MAPPER;
00424     lpMidiCaps->wVoices = 0;
00425     lpMidiCaps->wNotes = 0;
00426     lpMidiCaps->wChannelMask = 0xFFFF;
00427     lpMidiCaps->dwSupport = 0L;
00428 
00429     return MMSYSERR_NOERROR;
00430 }
00431 
00432 static  DWORD   modReset(MIDIMAPDATA* mom)
00433 {
00434     WORD    chn;
00435     DWORD   ret = MMSYSERR_NOERROR;
00436 
00437     if (MIDIMAP_IsBadData(mom))
00438     return MMSYSERR_ERROR;
00439 
00440     for (chn = 0; chn < 16; chn++)
00441     {
00442     if (mom->ChannelMap[chn] && mom->ChannelMap[chn]->loaded > 0)
00443     {
00444         ret = midiOutReset(mom->ChannelMap[chn]->hMidi);
00445         if (ret != MMSYSERR_NOERROR) break;
00446     }
00447     }
00448     return ret;
00449 }
00450 
00451 /**************************************************************************
00452  *              modMessage (MIDIMAP.@)
00453  */
00454 DWORD WINAPI MIDIMAP_modMessage(UINT wDevID, UINT wMsg, DWORD_PTR dwUser,
00455                 DWORD_PTR dwParam1, DWORD_PTR dwParam2)
00456 {
00457     TRACE("(%u, %04X, %08lX, %08lX, %08lX);\n",
00458       wDevID, wMsg, dwUser, dwParam1, dwParam2);
00459 
00460     switch (wMsg)
00461     {
00462     case DRVM_INIT:
00463     case DRVM_EXIT:
00464     case DRVM_ENABLE:
00465     case DRVM_DISABLE:
00466     /* FIXME: Pretend this is supported */
00467     return 0;
00468 
00469     case MODM_OPEN:     return modOpen      ((LPDWORD)dwUser,      (LPMIDIOPENDESC)dwParam1,dwParam2);
00470     case MODM_CLOSE:        return modClose     ((MIDIMAPDATA*)dwUser);
00471 
00472     case MODM_DATA:     return modData      ((MIDIMAPDATA*)dwUser, dwParam1);
00473     case MODM_LONGDATA:     return modLongData      ((MIDIMAPDATA*)dwUser, (LPMIDIHDR)dwParam1,     dwParam2);
00474     case MODM_PREPARE:      return modPrepare   ((MIDIMAPDATA*)dwUser, (LPMIDIHDR)dwParam1,     dwParam2);
00475     case MODM_UNPREPARE:    return modUnprepare ((MIDIMAPDATA*)dwUser, (LPMIDIHDR)dwParam1,     dwParam2);
00476     case MODM_RESET:        return modReset     ((MIDIMAPDATA*)dwUser);
00477 
00478     case MODM_GETDEVCAPS:   return modGetDevCaps    (wDevID, (MIDIMAPDATA*)dwUser, (LPMIDIOUTCAPSW)dwParam1,dwParam2);
00479     case MODM_GETNUMDEVS:   return 1;
00480     case MODM_GETVOLUME:    return MMSYSERR_NOTSUPPORTED;
00481     case MODM_SETVOLUME:    return MMSYSERR_NOTSUPPORTED;
00482     default:
00483     FIXME("unknown message %d!\n", wMsg);
00484     }
00485     return MMSYSERR_NOTSUPPORTED;
00486 }
00487 
00488 /*======================================================================*
00489  *                  Driver part                                         *
00490  *======================================================================*/
00491 
00492 /**************************************************************************
00493  *              MIDIMAP_drvOpen         [internal]
00494  */
00495 static  LRESULT MIDIMAP_drvOpen(LPSTR str)
00496 {
00497     MIDIOUTCAPSW    moc;
00498     unsigned        dev, i;
00499 
00500     if (midiOutPorts)
00501     return 0;
00502 
00503     numMidiOutPorts = midiOutGetNumDevs();
00504     midiOutPorts = HeapAlloc(GetProcessHeap(), 0,
00505                  numMidiOutPorts * sizeof(MIDIOUTPORT));
00506     for (dev = 0; dev < numMidiOutPorts; dev++)
00507     {
00508     if (midiOutGetDevCapsW(dev, &moc, sizeof(moc)) == 0L)
00509     {
00510         strcpyW(midiOutPorts[dev].name, moc.szPname);
00511         midiOutPorts[dev].loaded = 0;
00512         midiOutPorts[dev].hMidi = 0;
00513         midiOutPorts[dev].uDevID = dev;
00514         midiOutPorts[dev].lpbPatch = NULL;
00515         for (i = 0; i < 16; i++)
00516         midiOutPorts[dev].aChn[i] = i;
00517     }
00518     else
00519     {
00520         midiOutPorts[dev].loaded = -1;
00521     }
00522     }
00523 
00524     return 1;
00525 }
00526 
00527 /**************************************************************************
00528  *              MIDIMAP_drvClose        [internal]
00529  */
00530 static  LRESULT MIDIMAP_drvClose(DWORD_PTR dwDevID)
00531 {
00532     if (midiOutPorts)
00533     {
00534     HeapFree(GetProcessHeap(), 0, midiOutPorts);
00535     midiOutPorts = NULL;
00536     return 1;
00537     }
00538     return 0;
00539 }
00540 
00541 /**************************************************************************
00542  *              DriverProc (MIDIMAP.@)
00543  */
00544 LRESULT CALLBACK    MIDIMAP_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg,
00545                    LPARAM dwParam1, LPARAM dwParam2)
00546 {
00547 /* EPP     TRACE("(%08lX, %04X, %08lX, %08lX, %08lX)\n",  */
00548 /* EPP    dwDevID, hDriv, wMsg, dwParam1, dwParam2); */
00549 
00550     switch (wMsg)
00551     {
00552     case DRV_LOAD:      return 1;
00553     case DRV_FREE:      return 1;
00554     case DRV_OPEN:      return MIDIMAP_drvOpen((LPSTR)dwParam1);
00555     case DRV_CLOSE:     return MIDIMAP_drvClose(dwDevID);
00556     case DRV_ENABLE:        return 1;
00557     case DRV_DISABLE:       return 1;
00558     case DRV_QUERYCONFIGURE:    return 1;
00559     case DRV_CONFIGURE:     MessageBoxA(0, "MIDIMAP MultiMedia Driver !", "OSS Driver", MB_OK); return 1;
00560     case DRV_INSTALL:       return DRVCNF_RESTART;
00561     case DRV_REMOVE:        return DRVCNF_RESTART;
00562     default:
00563     return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
00564     }
00565 }

Generated on Sun May 27 2012 04:26:58 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.