summaryrefslogtreecommitdiff
path: root/pyparallel/src/win32/_pyparallel.c
blob: 7f906c5e55693f8345bc3cd7e665a8baae777a43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// 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 <cliechti@gmx.net>
// this is distributed under a free software license, see license.txt

#include <Python.h>
#include <windows.h>
#include <conio.h>
#include "loaddrv.h"

#define DRIVERNAME      "giveio.sys"
#define SERVICENAME     "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) {
    int dwStatus;
    //~ char buf[256];
    OSVERSIONINFO vi;
    
    /* Create the module and add the functions */
    PyObject *m = 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("\\\\.\\giveio", GENERIC_READ, 0, NULL,
                        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (h == INVALID_HANDLE_VALUE) {
            //failed, try to load sys file fom disk
            dwStatus = LoadDriverInit();        //init loaddriver module
            //~ printf("init %d\n", dwStatus);
            //driver not running, try to start it
            //~ dwStatus = getcwd(buf, sizeof buf);
            //~ snprintf(buf, sizeof buf, "%s\\%s", buf, SERVICENAME);
            //~ printf("path %d %s %s\n", dwStatus, buf, SERVICENAME);
            //~ dwStatus = DriverInstall(buf, SERVICENAME);
            //install the driver. this returns an error if already installed
            //but who cares?
            dwStatus = DriverInstall(DRIVERNAME, SERVICENAME);
            dwStatus = DriverStart(SERVICENAME);//now start the driver
            LoadDriverCleanup();                //close loaddriver module
            //retry to open the file
            h = CreateFile("\\\\.\\giveio", 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
    }
}