// Parallel port extension for Win32 // "inp" and "outp" are used to access the parallelport hardware // needs giveio.sys driver on NT/2k/XP // // (C) 2002 Chris Liechti // this is distributed under a free software license, see license.txt #include #include #include #define DRIVERNAME "\\\\.\\giveio" /* module-functions */ static PyObject* py_outp(PyObject *self, PyObject *args) { int port, value; if(!PyArg_ParseTuple(args, "ii", &port, &value)) return 0; _outp(port, value); Py_INCREF(Py_None); return Py_None; } static PyObject* py_inp(PyObject *self, PyObject *args) { int port, value; if(!PyArg_ParseTuple(args, "i", &port)) return 0; value = _inp(port); return Py_BuildValue("i", value); } static PyMethodDef pypar_methods[] = { {"outp", py_outp, METH_VARARGS}, {"inp", py_inp, METH_VARARGS}, {0, 0} }; /* module entry-point (module-initialization) function */ void init_pyparallel(void) { OSVERSIONINFO vi; /* Create the module and add the functions */ Py_InitModule("_pyparallel", pypar_methods); //detect OS, on NT,2k,XP the driver needs to be loaded vi.dwOSVersionInfoSize = sizeof(vi); GetVersionEx(&vi); if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT) { HANDLE h; //try to open driver h = CreateFile(DRIVERNAME, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (h == INVALID_HANDLE_VALUE) { //if it fails again, then we have a problem... -> exception PyErr_Format(PyExc_ImportError, "Couldn't access giveio device"); } //close again immediately. //the process is now tagged to have the rights it needs, //the giveio driver remembers that if (h != NULL) CloseHandle(h); //close the driver's file } }