Problem with CyberKnex Programmer program and direct LPT1 port access

Terry Barnaby terry1 at beam.ltd.uk
Sat Apr 9 02:56:48 CDT 2005


Rob Shearman wrote:
> Terry Barnaby wrote:
> 
>> Rob Shearman wrote:
>>
>>> Terry Barnaby wrote:
>>>
>>>> Hi,
>>>>
>>>> I am trying to get the K'nex CyberKnex Programmer Windows program
>>>> working under wine on Fedora 3. It appears to be generally working but
>>>> this program needs direct access to the LPT1 parallel port to drive an
>>>> external "flash key" programmer.
>>>>
>>>> I have tried setting the "Windows" parameter to "winxp" and setting
>>>> "export WINEDEBUG=+io,+int,+vxd;". This still does not
>>>> work I get the error messages:
>>>>
>>>> fixme:setupapi:SetupDiClassGuidsFromNameExA
>>>> trace:vxd:DeviceIoControl 
>>>> (0xffffffff,222074,0x7e8e00b4,4,(nil),0,0x72c9f57c,(nil))
>>>>
>>>>
>>>> I understand, from reading mailing lists and looking at the program, 
>>>> that the
>>>> program is using a DLL which has the capability of loading an 
>>>> embedded VXD
>>>> driver to access the LPT1 port.
>>>>
>>>> Some questions:
>>>> 1. Should this VXD driver loaded when the window system is set to 
>>>> "winxp" ?
>>>
>>>
>>>
>>>
>>>
>>> No. NT doesn't support VXDs, just like we don't (although we fake a 
>>> few).
>>>
>>>> 2. Is there any way I can get this program to communicate with the 
>>>> LPT1 port ?
>>>
>>>
>>>
>>>
>>>
>>> Possibly. I'd look at working at which IOCTL and see if you can 
>>> handle it either by translating it into a Linux ioctl (preferable) or 
>>> by faking the information returned to satisfy the program. It doesn't 
>>> look as though the setupapi call is important as the program seems to 
>>> carry on without it.
>>>
>>> Rob
>>
>>
>>
>> Hi Rob,
>>
>> Thanks for the feedback.
>> I am new to wine development, could you give me a little extra pointers ?
> 
> 
> 
> Sure. I would start with looking at DEVELOPER-HINTS in the wine source.
> 
>>
>> 1. What should the "setupapi" call do, should it load a standard NT 
>> driver, how
>>     would the program expect to access the LPT1 port under NT ?
> 
> 
> 
> Typically, programs use setupapi to enumerate devices to find one that 
> matches their needs. The functions are documented on MSDN. Here is a 
> link to the one called by your program:
> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/install/hh/install/di-rtns_6b309545-3832-4802-9668-21a107f3c651.xml.asp 
> 
> 
>> 2. I assume the 
>> vxd:DeviceIoControl(0xffffffff,222074,0x7e8e00b4,4,(nil),0,0x72c9f57c,(nil)) 
>>
>>     is an effective Windows IOCTL ?
> 
> 
> 
> Yes.
> 
>> 3. Is the first parameter to vxd:DeviceIoControl() a device handle, -1 
>> indicating some
>>     device opening routine actually failed ?
> 
> 
> 
> Good point, yes. This could be because of the setupapi stub.
> 
>> 4. Are you stating that I can change the wine code that handles the 
>> vxd:DeviceIoControl()
>>     to "do the right thing" ?
> 
> 
> 
> Yes. It might be cleaner to put the code in ntdll rather than kernel32, 
> but we can cross that bridge when we come to it.
> 
> Rob

Hi Rob,

I hope you don't mind me asking a few more questions ?
I have now donloaded the wine CVS and built it and started adding debug
printf's.

I have "windows=winxp" in my config.
It appears that my program, in the "setupapi", calls 
SetupDiClassGuidsFromNameExA with the name "Ports". So I presume
this is trying to get a handle for the "Ports" driver which looks
like it is not implemented. I note it trys to get some info on a 
ControlClass key from the registry. This fails.
Some questions:

1. How well does wine generally work when "windows=winxp" ? I presume
	wine has been more fully developed for the case where
  	"windows=win98" ? Should I try and stick with win98 and
	implement a driverx.vxd or use winxp and implement a "Ports"
	driver within ntdll ?
2. I have setup my registry and C: drive using winetools. For winxp
	operation, is there a different way of setting up the registry
	and drivec ?
3. I note that the device NtDeviceIoControlFile ioctl interface in
	ntdll only supports CDROM devices. Also there does not seem
	to be a way of dynamically attaching devices. Should I just
	hard code a "Ports" driver in ntdll ?

Cheers


Terry



More information about the wine-devel mailing list